瀏覽代碼

Merge branch 'saas' of http://git.dayaedu.com/yonge/mec into saas_zouxuan_07_11

zouxuan 3 年之前
父節點
當前提交
02a4bf62ac
共有 39 個文件被更改,包括 2639 次插入1879 次删除
  1. 29 26
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/web/controller/UserController.java
  2. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ActivityUserMapperDao.java
  3. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupDao.java
  4. 8 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentStudentCourseDetailDao.java
  5. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentExtracurricularExercisesSituationDao.java
  6. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseScheduleEndDto.java
  7. 88 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ExportStudentSubCourse.java
  8. 86 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentServeDto.java
  9. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentSubTotalCourseTimesDto.java
  10. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseSchedule.java
  11. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentRegistration.java
  12. 4 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExportEnum.java
  13. 4 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExportTypeEnum.java
  14. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentStatisticsQueryInfo.java
  15. 47 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentSubTotalCourseTimesQueryInfo.java
  16. 7 4
      mec-biz/src/main/java/com/ym/mec/biz/service/ActivityUserMapperService.java
  17. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupService.java
  18. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ExportService.java
  19. 3 1
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentManageService.java
  20. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ActivityUserMapperServiceImpl.java
  21. 147 147
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  22. 251 190
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java
  23. 526 526
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderDetailServiceImpl.java
  24. 131 108
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java
  25. 21 0
      mec-biz/src/main/resources/config/mybatis/ActivityUserMapperMapper.xml
  26. 16 3
      mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml
  27. 8 3
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  28. 131 55
      mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentStudentCourseDetailMapper.xml
  29. 989 792
      mec-biz/src/main/resources/config/mybatis/StudentExtracurricularExercisesSituationMapper.xml
  30. 12 5
      mec-biz/src/main/resources/config/mybatis/StudentStatisticsMapper.xml
  31. 1 0
      mec-student/src/main/java/com/ym/mec/student/config/ResourceServerConfig.java
  32. 6 1
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/CourseReviewController.java
  33. 6 0
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/ExtracurricularExercisesController.java
  34. 3 2
      mec-web/src/main/java/com/ym/mec/web/controller/ClassGroupController.java
  35. 0 2
      mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleController.java
  36. 1 1
      mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java
  37. 10 2
      mec-web/src/main/java/com/ym/mec/web/controller/StudentManageController.java
  38. 24 1
      mec-web/src/main/resources/columnMapper.ini
  39. 9 1
      mec-web/src/main/resources/exportColumnMapper.ini

+ 29 - 26
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/web/controller/UserController.java

@@ -1,47 +1,38 @@
 package com.ym.mec.auth.web.controller;
 
-import com.ym.mec.auth.service.TenantInfoService;
-import com.ym.mec.common.page.QueryInfo;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
-
-import java.util.Date;
-
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.http.MediaType;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.service.SysRoleService;
 import com.ym.mec.auth.service.SysUserRoleService;
 import com.ym.mec.auth.service.SysUserService;
+import com.ym.mec.auth.service.TenantInfoService;
 import com.ym.mec.auth.web.controller.queryInfo.SysUserQueryInfo;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.entity.ImResult;
 import com.ym.mec.common.entity.ImUserModel;
 import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.security.AuthUser;
 import com.ym.mec.common.security.SecurityConstants;
 import com.ym.mec.common.security.SecurityUtils;
 import com.ym.mec.common.service.IdGeneratorService;
 import com.ym.mec.im.ImFeignService;
-import com.ym.mec.thirdparty.eseal.ESealPlugin;
 import com.ym.mec.thirdparty.user.realname.RealnameAuthenticationPluginContext;
 import com.ym.mec.thirdparty.user.realname.provider.LinkfaceRealnameAuthenticationPlugin;
 import com.ym.mec.util.date.DateUtil;
-import com.ym.mec.web.WebFeignService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.MediaType;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
 
 @RestController()
 @RequestMapping("user")
@@ -59,8 +50,6 @@ public class UserController extends BaseController {
 	@Autowired
 	private IdGeneratorService smsCodeService;
 	@Autowired
-	private WebFeignService webFeignService;
-	@Autowired
 	private TenantInfoService tenantInfoService;
 	@Value("${message.debugMode}")
 	private boolean debugMode;
@@ -364,4 +353,18 @@ public class UserController extends BaseController {
     public Object queryClientByPhone(String phone) {
         return succeed(sysUserService.queryClientByPhone(phone));
     }
+
+	@ApiOperation(value = "用户注销")
+	@PostMapping(value = "/destroy")
+	public Object destroy() {
+		AuthUser user = SecurityUtils.getUser();
+		if (user != null) {
+			SysUser sysUser = sysUserService.get(user.getUserId());
+			sysUser.setPhone("Z" + sysUser.getPhone());
+			sysUser.setUpdateTime(new Date());
+			sysUserService.update(sysUser);
+			return succeed();
+		}
+		return failed("请登录");
+	}
 }

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ActivityUserMapperDao.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.biz.dal.dto.ActivityStudentDto;
+import com.ym.mec.biz.dal.dto.ExportStudentSubCourse;
 import com.ym.mec.biz.dal.entity.ActivityUserMapper;
 import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
@@ -109,4 +110,6 @@ public interface ActivityUserMapperDao extends BaseDAO<Integer, ActivityUserMapp
     //获取学员未排课资格
     Integer getStudentNoMapperInfo(@Param("userId") Integer userId,
                                   @Param("activityId") Integer activityId);
+
+    List<ExportStudentSubCourse> exportStudentSubCourse(@Param("organId") String organId,@Param("tenantId") Integer tenantId);
 }

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupDao.java

@@ -645,7 +645,7 @@ public interface ClassGroupDao extends BaseDAO<Integer, ClassGroup> {
      * @param type
      * @return
      */
-    List<ClassGroupTeachersDto> findClassGroupByType(@Param("musicGroupId") String musicGroupId, @Param("type") ClassGroupTypeEnum type);
+    List<ClassGroupTeachersDto> findClassGroupByType(@Param("musicGroupId") String musicGroupId, @Param("type") ClassGroupTypeEnum type,@Param("hasCourse") Boolean hasCourse);
 
     /**
      * @param groupIds:  乐团或vip课编号

+ 8 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentStudentCourseDetailDao.java

@@ -102,10 +102,15 @@ public interface MusicGroupPaymentStudentCourseDetailDao extends BaseDAO<Long, M
      */
     List<StudentSubTotalCourseTimesDto> queryStudentSubTotalCourseTimes(@Param("musicGroupId") String musicGroupId);
 
+    Integer countStudentSubTotalCourseTimes(Map<String, Object> params);
+
+    List<StudentSubTotalCourseTimesDto> pageStudentSubTotalCourseTimes(Map<String, Object> params);
+
     List<MusicGroupPaymentStudentCourseDetail> findByCalenderAndUserId(@Param("calenderId") Long calenderId, @Param("userId") Integer userId);
 
     /**
      * 更新学员实际缴费金额
+     *
      * @param courseType
      * @param musicGroupPaymentCalenderIds
      * @param courseCurrentPrice
@@ -115,16 +120,16 @@ public interface MusicGroupPaymentStudentCourseDetailDao extends BaseDAO<Long, M
                             @Param("courseCurrentPrice") BigDecimal courseCurrentPrice);
 
     /**
-     * @description: 校验学员排课时长是否一致
      * @param musicGroupId
      * @param courseTypes
      * @param studentIds
      * @return void
+     * @description: 校验学员排课时长是否一致
      * @author zx
      * @date 2022/3/3 19:04
      */
     Integer checkCourseTimes(@Param("musicGroupId") String musicGroupId,
-                          @Param("courseTypes") List<CourseSchedule.CourseScheduleType> courseTypes,
-                          @Param("studentIds") List<Integer> studentIds);
+                             @Param("courseTypes") List<CourseSchedule.CourseScheduleType> courseTypes,
+                             @Param("studentIds") List<Integer> studentIds);
 
 }

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentExtracurricularExercisesSituationDao.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.biz.dal.dto.StudentExercisesSituationDto;
+import com.ym.mec.biz.dal.dto.StudentServeDto;
 import com.ym.mec.biz.dal.dto.TeacherExercisesServiceDto;
 import com.ym.mec.biz.dal.dto.TeacherServeDto;
 import com.ym.mec.biz.dal.entity.IndexBaseMonthData;
@@ -150,8 +151,16 @@ public interface StudentExtracurricularExercisesSituationDao extends BaseDAO<Lon
                                                                          @Param("courseId") Long courseId);
 
     List<TeacherServeDto> queryTeacherServeInfo(Map<String, Object> params);
+
     int countTeacherServeInfo(Map<String, Object> params);
 
+    /**
+     * 查询学生指标
+     * @param params
+     * @return
+     */
+    List<StudentServeDto> queryStudentServeInfo(@Param("params") Map<String, Object> params);
+
     List<StudentExtracurricularExercisesSituation> findTeacherServeWithDate(@Param("monday") String monday,
                                                                             @Param("sunday") String sunday,
                                                                             @Param("teacherIds") List<Integer> teacherIds,
@@ -190,4 +199,7 @@ public interface StudentExtracurricularExercisesSituationDao extends BaseDAO<Lon
                                                                    @Param("serveType") String serveType,
                                                                    @Param("month") Date month,
                                                                    @Param("userId") Integer userId);
+
+
+
 }

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseScheduleEndDto.java

@@ -5,6 +5,7 @@ import com.ym.mec.biz.dal.entity.PracticeGroup;
 import com.ym.mec.biz.dal.enums.SignInStatusEnum;
 import com.ym.mec.biz.dal.enums.SignOutStatusEnum;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
+import io.swagger.annotations.ApiModelProperty;
 
 import java.util.Date;
 
@@ -57,6 +58,9 @@ public class CourseScheduleEndDto extends CourseSchedule {
     /** 合作单位 */
     private String cooperationOrgan;
 
+    @ApiModelProperty(value = "被合并的课程ids,多个,分割")
+    private String mergedCourseIds;
+
     public Date getGenerateTime() {
         return generateTime;
     }
@@ -224,4 +228,12 @@ public class CourseScheduleEndDto extends CourseSchedule {
     public void setCooperationOrgan(String cooperationOrgan) {
         this.cooperationOrgan = cooperationOrgan;
     }
+
+    public String getMergedCourseIds() {
+        return mergedCourseIds;
+    }
+
+    public void setMergedCourseIds(String mergedCourseIds) {
+        this.mergedCourseIds = mergedCourseIds;
+    }
 }

+ 88 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ExportStudentSubCourse.java

@@ -0,0 +1,88 @@
+package com.ym.mec.biz.dal.dto;
+
+public class ExportStudentSubCourse {
+    /**
+     * 用户id
+     */
+    private Integer userId;
+    /**
+     * 用户名称
+     */
+    private String username;
+    /**
+     * 分部名称
+     */
+    private String organizationName;
+    /**
+     * 活动id
+     */
+    private Integer activityId;
+    /**
+     * 活动名称
+     */
+    private String activityName;
+    /**
+     * 剩余排课资格
+     */
+    private Integer subCourseNum;
+    /**
+     * 剩余赠送排课资格
+     */
+    private Integer subGiveCourseNum;
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public Integer getActivityId() {
+        return activityId;
+    }
+
+    public void setActivityId(Integer activityId) {
+        this.activityId = activityId;
+    }
+
+    public String getOrganizationName() {
+        return organizationName;
+    }
+
+    public void setOrganizationName(String organizationName) {
+        this.organizationName = organizationName;
+    }
+
+    public String getActivityName() {
+        return activityName;
+    }
+
+    public void setActivityName(String activityName) {
+        this.activityName = activityName;
+    }
+
+    public Integer getSubCourseNum() {
+        return subCourseNum;
+    }
+
+    public void setSubCourseNum(Integer subCourseNum) {
+        this.subCourseNum = subCourseNum;
+    }
+
+    public Integer getSubGiveCourseNum() {
+        return subGiveCourseNum;
+    }
+
+    public void setSubGiveCourseNum(Integer subGiveCourseNum) {
+        this.subGiveCourseNum = subGiveCourseNum;
+    }
+}

+ 86 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentServeDto.java

@@ -4,6 +4,8 @@ import com.ym.mec.biz.dal.entity.Student;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.TeachModeEnum;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.Date;
 
 /**
@@ -18,6 +20,22 @@ public class StudentServeDto extends Student {
 
     private Date courseStartTime;
 
+    private String musicGroupName;
+
+    private String servePeriod;
+
+    private String serveNum;
+
+    private Integer actualExercisesNum;
+
+    private Integer exercisesReplyNum;
+
+    private Integer exercisesMessageNum;
+
+    private BigDecimal signRate;
+
+    private BigDecimal passRate;
+
     public GroupType getGroupType() {
         return groupType;
     }
@@ -41,4 +59,72 @@ public class StudentServeDto extends Student {
     public void setCourseStartTime(Date courseStartTime) {
         this.courseStartTime = courseStartTime;
     }
+
+    public String getMusicGroupName() {
+        return musicGroupName;
+    }
+
+    public void setMusicGroupName(String musicGroupName) {
+        this.musicGroupName = musicGroupName;
+    }
+
+    public String getServePeriod() {
+        return servePeriod;
+    }
+
+    public void setServePeriod(String servePeriod) {
+        this.servePeriod = servePeriod;
+    }
+
+    public String getServeNum() {
+        return serveNum;
+    }
+
+    public void setServeNum(String serveNum) {
+        this.serveNum = serveNum;
+    }
+
+    public Integer getActualExercisesNum() {
+        return actualExercisesNum;
+    }
+
+    public void setActualExercisesNum(Integer actualExercisesNum) {
+        this.actualExercisesNum = actualExercisesNum;
+    }
+
+    public Integer getExercisesReplyNum() {
+        return exercisesReplyNum;
+    }
+
+    public void setExercisesReplyNum(Integer exercisesReplyNum) {
+        this.exercisesReplyNum = exercisesReplyNum;
+    }
+
+    public Integer getExercisesMessageNum() {
+        return exercisesMessageNum;
+    }
+
+    public void setExercisesMessageNum(Integer exercisesMessageNum) {
+        this.exercisesMessageNum = exercisesMessageNum;
+    }
+
+    public BigDecimal getSignRate() {
+        return signRate;
+    }
+
+    public void setSignRate(BigDecimal signRate) {
+        if (null != signRate) {
+            this.signRate = signRate.setScale(2, RoundingMode.HALF_UP);
+        }
+    }
+
+    public BigDecimal getPassRate() {
+        return passRate;
+    }
+
+    public void setPassRate(BigDecimal passRate) {
+        if (null != passRate) {
+            this.passRate = passRate.setScale(2, RoundingMode.HALF_UP);
+        }
+    }
 }

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentSubTotalCourseTimesDto.java

@@ -11,6 +11,8 @@ public class StudentSubTotalCourseTimesDto{
 
     private String classGroupId;
 
+    private String courseType;
+
     private List<MapDto> MapDtos;
 
     public String getClassGroupId() {
@@ -52,4 +54,12 @@ public class StudentSubTotalCourseTimesDto{
     public void setMapDtos(List<MapDto> mapDtos) {
         MapDtos = mapDtos;
     }
+
+    public String getCourseType() {
+        return courseType;
+    }
+
+    public void setCourseType(String courseType) {
+        this.courseType = courseType;
+    }
 }

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseSchedule.java

@@ -67,6 +67,7 @@ public class CourseSchedule  extends BaseEntity{
 	/**  */
 	private Long id;
 
+	@ApiModelProperty(value = "合并|被合并课程编号(未合并为空,合并后主记录为自己,被合并课程记录合并课程id)")
 	private Long newCourseId;
 
 	private GroupType groupType;

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentRegistration.java

@@ -91,7 +91,7 @@ public class StudentRegistration extends BaseEntity {
     @ApiModelProperty(value = "生日", required = false)
     private Date birthdate;
 
-    @ApiModelProperty(value = "缴费状态(1-已缴费 0-未交费)", required = false)
+    @ApiModelProperty(value = "缴费状态(2-已缴费 1-开启缴费 0-未交费)", required = false)
     private PaymentStatusEnum paymentStatus;
 
     @ApiModelProperty(value = "用户所在乐团状态)",required = false)

+ 4 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExportEnum.java

@@ -70,11 +70,13 @@ public enum ExportEnum implements BaseEnum<String, ExportEnum> {
     MUSIC_ENLIGHTENMENT_QUESTIONNAIRES("MUSIC_ENLIGHTENMENT_QUESTIONNAIRES", "启蒙课问卷导出"),
     STUDENT_INSTRUMENT("STUDENT_INSTRUMENT", "乐保导出"),
     EXPORT_BILL("EXPORT_BILL", "对账单导出"),
-//    QUESTIONNAIRE_USER_RESULT("QUESTIONNAIRE_USER_RESULT", "问卷调查导出"),
     STUDENT_VIP_COURSE_INFO("STUDENT_VIP_COURSE_INFO", "VIP课学员课程信息导出"),
     STUDENT_MUSIC_THEORY_COURSE_INFO("STUDENT_MUSIC_THEORY_COURSE_INFO", "乐理课学员课程信息导出"),
     VIP_STUDENT_COURSE_MANAGE("VIP_STUDENT_COURSE_MANAGE", "vip学员课程管理"),
-    EXERCISES_SITUATION("EXERCISES_SITUATION", "服务指标导出");
+    EXERCISES_SITUATION("EXERCISES_SITUATION", "服务指标导出"),
+    EXPORT_STUDENT_SUBCOURSE("EXPORT_STUDENT_SUBCOURSE", "活动资格导出"),
+    EXPORT_STUDENT_SERVE_INFO("EXPORT_STUDENT_SERVE_INFO", "乐团学生服务指标导出"),
+    ;
 
     private String code;
 

+ 4 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExportTypeEnum.java

@@ -13,7 +13,10 @@ public enum ExportTypeEnum implements BaseEnum<Integer, ExportTypeEnum> {
 	STUDENT_SMALL_CLASS_STATISTICS(7, "学员小课数据统计"),
 	ORDER_LIST_SUM(8, "订单汇总"),
 	MUSIC_GROUP_COURSE_LIST(9, "乐团课表详情导出"),
-	MUSIC_GROUP_DATA_EXPORT(10, "乐团数据导出");
+	MUSIC_GROUP_DATA_EXPORT(10, "乐团数据导出"),
+	EXPORT_STUDENT_SUBCOURSE(11, "活动资格导出"),
+	EXPORT_STUDENT_SERVE_INFO(12, "乐团学生服务指标导出");
+	;
 
 	private Integer code;
 

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentStatisticsQueryInfo.java

@@ -57,6 +57,12 @@ public class StudentStatisticsQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "第一次课截止时间(年月日)",required = false)
     private String firstCourseEndTime;
 
+    @ApiModelProperty(value = "最近一次回访开始时间(年月日)",required = false)
+    private String lastVisitStartTime;
+
+    @ApiModelProperty(value = "最近一次回访截止时间(年月日)",required = false)
+    private String lastVisitEndTime;
+
     @ApiModelProperty(value = "分部编号列表",required = false)
     private String organId;
 
@@ -188,6 +194,22 @@ public class StudentStatisticsQueryInfo extends QueryInfo {
         this.firstCourseStartTime = firstCourseStartTime;
     }
 
+    public String getLastVisitStartTime() {
+        return lastVisitStartTime;
+    }
+
+    public void setLastVisitStartTime(String lastVisitStartTime) {
+        this.lastVisitStartTime = lastVisitStartTime;
+    }
+
+    public String getLastVisitEndTime() {
+        return lastVisitEndTime;
+    }
+
+    public void setLastVisitEndTime(String lastVisitEndTime) {
+        this.lastVisitEndTime = lastVisitEndTime;
+    }
+
     public String getFirstCourseEndTime() {
         return firstCourseEndTime;
     }

+ 47 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentSubTotalCourseTimesQueryInfo.java

@@ -0,0 +1,47 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
+
+public class StudentSubTotalCourseTimesQueryInfo extends QueryInfo {
+    @ApiModelProperty(value = "乐团id")
+    private String musicGroupId;
+    @ApiModelProperty(value = "是否存在剩余时长")
+    private Boolean hastimer;
+    @ApiModelProperty(value = "班级类型")
+    private String courseType;
+    @ApiModelProperty(value = "班级id")
+    private String classGroupId;
+
+    public String getMusicGroupId() {
+        return musicGroupId;
+    }
+
+    public void setMusicGroupId(String musicGroupId) {
+        this.musicGroupId = musicGroupId;
+    }
+
+    public Boolean getHastimer() {
+        return hastimer;
+    }
+
+    public void setHastimer(Boolean hastimer) {
+        this.hastimer = hastimer;
+    }
+
+    public String getCourseType() {
+        return courseType;
+    }
+
+    public void setCourseType(String courseType) {
+        this.courseType = courseType;
+    }
+
+    public String getClassGroupId() {
+        return classGroupId;
+    }
+
+    public void setClassGroupId(String classGroupId) {
+        this.classGroupId = classGroupId;
+    }
+}

+ 7 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/ActivityUserMapperService.java

@@ -1,9 +1,6 @@
 package com.ym.mec.biz.service;
 
-import com.ym.mec.biz.dal.dto.ActivityQueryDto;
-import com.ym.mec.biz.dal.dto.ActivityStudentAdjustDto;
-import com.ym.mec.biz.dal.dto.ActivityStudentDto;
-import com.ym.mec.biz.dal.dto.ActivityUserMapperAddDto;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.ActivityUserMapper;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrderDetail;
@@ -121,4 +118,10 @@ public interface ActivityUserMapperService extends BaseService<Integer, Activity
     Map<String,Object> getStudentNoMapperInfo();
 
     Integer getStudentNoCourseNum(Integer userId, Integer activityId);
+
+    /**
+     * 报表中心-活动资格导出
+     * @return
+     */
+    List<ExportStudentSubCourse> exportStudentSubCourse(String organId, Integer tenantId);
 }

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupService.java

@@ -380,7 +380,7 @@ public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
      * @param type
      * @return
      */
-    List<ClassGroupTeachersDto> getClassGroupAndTeacherByType(String musicGroupId, ClassGroupTypeEnum type);
+    List<ClassGroupTeachersDto> getClassGroupAndTeacherByType(String musicGroupId, ClassGroupTypeEnum type,Boolean hasCourse);
 
     /**
      * 根据乐团id,班级类型获取班级和老师

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ExportService.java

@@ -266,6 +266,9 @@ public interface ExportService {
     //vip学员课程管理
     HttpResponseResult exportVipStudentCourseManage(Map<String, Object> info, List<String> headColumns) throws Exception;
 
+    //导出活动资格
+    HttpResponseResult exportStudentSubCourse(Map<String, Object> info, List<String> headColumns);
+
     //学员小课记录导出
     HttpResponseResult exportStudentMusicTheoryCourseInfo(Map<String, Object> info, List<String> headColumns);
 

+ 3 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/StudentManageService.java

@@ -203,11 +203,12 @@ public interface StudentManageService {
      */
     PageInfo<StudentNoStartCoursesDto> queryStudentNoStartCourse(StudentQueryInfo queryInfo);
 
+    Integer countStudentSubTotalCourseTimes(StudentSubTotalCourseTimesQueryInfo queryInfo);
     /**
      * 乐团管理--乐团详情--学员列表--获取学员可排课时长
      * @return
      */
-    List<StudentSubTotalCourseTimesDto> queryStudentSubTotalCourseTimes(String musicGroupId);
+    PageInfo<StudentSubTotalCourseTimesDto> queryStudentSubTotalCourseTimes(StudentSubTotalCourseTimesQueryInfo queryInfo);
 
     PageInfo<StudentErrorLeaveDto> queryStudentErrorLeaveList(StudentErrorLeaveQueryInfo queryInfo);
 
@@ -220,4 +221,5 @@ public interface StudentManageService {
     void updateChildrenDayStudent(ActivityCourseDetailDto activityCourseDetailDto);
 
     PageInfo<Student> queryStudent(StudentActivityQueryInfo queryInfo);
+
 }

+ 5 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ActivityUserMapperServiceImpl.java

@@ -299,4 +299,9 @@ public class ActivityUserMapperServiceImpl extends BaseServiceImpl<Integer, Acti
 	public Integer getStudentNoCourseNum(Integer userId, Integer activityId) {
 		return activityUserMapperDao.getStudentNoMapperInfo(userId, activityId);
 	}
+
+	@Override
+	public List<ExportStudentSubCourse> exportStudentSubCourse(String organId, Integer tenantId) {
+		return activityUserMapperDao.exportStudentSubCourse(organId,tenantId);
+	}
 }

+ 147 - 147
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java

@@ -206,7 +206,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         }
         List<ClassGroupTeacherMapper> teacherMappers = classGroup.getTeacherMapperList();
         Set<Integer> collect = teacherMappers.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
-        if(teacherMappers.size() != collect.size()){
+        if (teacherMappers.size() != collect.size()) {
             throw new BizException("主教与助教存在冲突");
         }
 
@@ -282,16 +282,16 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         } else {
             MusicGroup musicGroup = musicGroupDao.get(classGroup.getMusicGroupId());
             Map<Integer, String> userRoleMap = new HashMap<>();
-            if(musicGroup.getEducationalTeacherId() != null){
+            if (musicGroup.getEducationalTeacherId() != null) {
                 userRoleMap.put(musicGroup.getEducationalTeacherId(), "乐团主管");
             }
-            if(musicGroup.getTeamTeacherId() != null){
+            if (musicGroup.getTeamTeacherId() != null) {
                 userRoleMap.put(musicGroup.getTeamTeacherId(), "运营主管");
             }
-            if(musicGroup.getDirectorUserId() != null){
+            if (musicGroup.getDirectorUserId() != null) {
                 userRoleMap.put(musicGroup.getDirectorUserId(), "乐队指导");
             }
-            if(musicGroup.getTransactionTeacherId() != null){
+            if (musicGroup.getTransactionTeacherId() != null) {
                 userRoleMap.put(musicGroup.getTransactionTeacherId(), "衔接老师");
             }
             if (teacherIdList != null && teacherIdList.size() > 0) {
@@ -545,8 +545,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
                 if (highClassGroup.getHoliday()) {
                     Integer tenantId = TenantContextHolder.getTenantId();
-                    String holidaySetting = sysTenantConfigService.getTenantConfigValue(SysConfigService.HOLIDAY_SETTING,tenantId);
-                    if(StringUtils.isNotBlank(holidaySetting)){
+                    String holidaySetting = sysTenantConfigService.getTenantConfigValue(SysConfigService.HOLIDAY_SETTING, tenantId);
+                    if (StringUtils.isNotBlank(holidaySetting)) {
                         holidayDays = new HashSet<>(JSON.parseArray(holidaySetting, String.class));
                     }
                 }
@@ -629,7 +629,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 param.put("musicGroupId", e.getMusicGroupId());
                 e.setAttendanceNum(teacherPersonalAttendancesCount);
                 Long aLong = hasRestClassMap.get(Integer.parseInt(e.getClassGroupIds()));
-                if(aLong != null){
+                if (aLong != null) {
                     e.setHasRestClass(aLong.intValue());
                 }
             });
@@ -1206,7 +1206,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         Map<CourseScheduleType, BigDecimal> originUnitPriceMap = new HashMap<CourseSchedule.CourseScheduleType, BigDecimal>();
         Map<CourseScheduleType, BigDecimal> totalCurrentPriceMap = new HashMap<CourseSchedule.CourseScheduleType, BigDecimal>();
         Map<CourseScheduleType, BigDecimal> totalOriginPriceMap = new HashMap<CourseSchedule.CourseScheduleType, BigDecimal>();
-        if(musicGroupPaymentCalenderCourseSettingsList != null){
+        if (musicGroupPaymentCalenderCourseSettingsList != null) {
             for (MusicGroupPaymentCalenderCourseSettings musicGroupPaymentCalenderCourseSettings : musicGroupPaymentCalenderCourseSettingsList) {
                 unitPriceMap.put(
                         musicGroupPaymentCalenderCourseSettings.getCourseType(),
@@ -1244,9 +1244,9 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             List<CourseScheduleStudentPayment> courseScheduleStudentPayments = new ArrayList<CourseScheduleStudentPayment>();
             List<CourseScheduleStudentPayment> totalCourseScheduleStudentPayments = new ArrayList<CourseScheduleStudentPayment>();
 
-            if(HIGH_ONLINE.equals(classGroup.getType())){
+            if (HIGH_ONLINE.equals(classGroup.getType())) {
                 Integer studentNum = classGroupStudentMapperDao.countClassGroupStudentNum(classGroup.getId());
-                if(Objects.nonNull(studentNum)&&studentNum>=6){
+                if (Objects.nonNull(studentNum) && studentNum >= 6) {
                     throw new BizException("线上基础技能班班级最大人数为6人");
                 }
             }
@@ -1256,11 +1256,11 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
             // 2、插入关联关系
             ClassGroupStudentMapper classGroupStudent = classGroupStudentMapperDao.findClassGroupStudent(classGroup.getId(), studentId);
-            if(Objects.nonNull(classGroupStudent)){
+            if (Objects.nonNull(classGroupStudent)) {
                 classGroupStudent.setStatus(ClassGroupStudentStatusEnum.NORMAL);
                 classGroupStudent.setUpdateTime(date);
                 classGroupStudentMapperDao.update(classGroupStudent);
-            }else {
+            } else {
                 ClassGroupStudentMapper classGroupStudentMapper = new ClassGroupStudentMapper();
                 classGroupStudentMapper.setMusicGroupId(classGroup.getMusicGroupId());
                 classGroupStudentMapper.setClassGroupId(classGroup.getId());
@@ -1276,8 +1276,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             Map<Integer, List<CourseSchedule>> memberCourseSchedule = courseScheduleList.stream().collect(Collectors.groupingBy(CourseSchedule::getMemberFlag));
             for (Integer integer : memberCourseSchedule.keySet()) {
                 List<CourseSchedule> courseSchedules = memberCourseSchedule.get(integer);
-                if(courseSchedules != null && courseSchedules.size() > 0){
-                    if(integer == 0){
+                if (courseSchedules != null && courseSchedules.size() > 0) {
+                    if (integer == 0) {
                         for (CourseSchedule courseSchedule : courseSchedules) {
                             if (existCourseIds.contains(courseSchedule.getId())) {
                                 throw new BizException("该学员已在此班级{}课程中", courseSchedule.getId());
@@ -1329,7 +1329,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                             List<CourseScheduleType> list = new ArrayList<CourseSchedule.CourseScheduleType>();
                             for (CourseScheduleStudentPayment courseScheduleStudentPayment : courseScheduleStudentPayments) {
                                 courseType = courseScheduleStudentPayment.getCourseSchedule().getType();
-                                if(totalCurrentPriceMap.get(courseType) == null){
+                                if (totalCurrentPriceMap.get(courseType) == null) {
                                     throw new BizException("该缴费项目有新增课时:请重新编辑");
                                 }
                                 if (!list.contains(courseType)) {
@@ -1344,7 +1344,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                                 }
                             }
                         }
-                    }else {
+                    } else {
                         for (CourseSchedule courseSchedule : courseSchedules) {
                             if (existCourseIds.contains(courseSchedule.getId())) {
                                 throw new BizException("该学员已在此班级{}课程中", courseSchedule.getId());
@@ -1367,18 +1367,18 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                     }
                 }
             }
-            if(totalCourseScheduleStudentPayments.size() > 0 || courseScheduleStudentPayments.size() > 0){
+            if (totalCourseScheduleStudentPayments.size() > 0 || courseScheduleStudentPayments.size() > 0) {
                 totalCourseScheduleStudentPayments.addAll(courseScheduleStudentPayments);
                 courseScheduleStudentPaymentService.batchInsert(totalCourseScheduleStudentPayments);
                 studentService.updateStudentServiceTag(studentId, null, YesOrNoEnum.YES.getCode());
             }
 
-            if(!CollectionUtils.isEmpty(courseScheduleList)){
+            if (!CollectionUtils.isEmpty(courseScheduleList)) {
                 allNotStartCourses.addAll(courseScheduleList);
             }
 
             List<ClassGroupTeacherMapper> classGroupTeachers = classGroupTeacherMapperService.getClassGroupTeachers(classGroup.getId());
-            if(!CollectionUtils.isEmpty(classGroupTeachers)){
+            if (!CollectionUtils.isEmpty(classGroupTeachers)) {
                 ctm.put(classGroup.getId(), classGroupTeachers);
             }
 
@@ -1396,7 +1396,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             for (CourseScheduleTeacherSalary oldCourseSalary : oldCourseSalaries) {
                 oldCourseSalary.setId(null);
                 //课酬调整后不能更新课酬
-                if(!oldCourseSalary.getEnableChangeSalary()){
+                if (!oldCourseSalary.getEnableChangeSalary()) {
                     continue;
                 }
                 courseScheduleTeacherSalaryService.createMusicGroupCourseTeacherSalary(null, idCourseMap.get(oldCourseSalary.getCourseScheduleId()), oldCourseSalary);
@@ -1431,7 +1431,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         //删除班级未开始课程
         List<CourseSchedule> courseScheduleList = courseScheduleService.findNoStartCoursesByClassGroupId(classGroupId);
         if (courseScheduleList.size() > 0) {
-            if(courseScheduleDao.queryPreCourseListByClassGroupId(classGroupId).size() > 0){
+            if (courseScheduleDao.queryPreCourseListByClassGroupId(classGroupId).size() > 0) {
                 throw new BizException("操作失败:该班级存在预排课程");
             }
             List<Long> courseScheduleIds = courseScheduleList.stream().map(courseSchedule -> courseSchedule.getId()).collect(Collectors.toList());
@@ -1457,7 +1457,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         //删除班级未开始课程
         List<CourseSchedule> courseScheduleList = courseScheduleService.findNoStartCoursesByClassGroupId(classGroupId);
         if (courseScheduleList.size() > 0) {
-            if(courseScheduleDao.queryPreCourseListByClassGroupId(classGroupId).size() > 0){
+            if (courseScheduleDao.queryPreCourseListByClassGroupId(classGroupId).size() > 0) {
                 throw new BizException("操作失败:该班级存在预排课程");
             }
             List<Long> courseScheduleIds = courseScheduleList.stream().map(courseSchedule -> courseSchedule.getId()).collect(Collectors.toList());
@@ -1692,8 +1692,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
         TeacherClassHeadInfo teacherClassHeadInfo = new TeacherClassHeadInfo();
         //获取班级的线上、线下课数量
-        int onlineCourseNum = classGroupDao.countCourseNum(classGroupId,"ONLINE");
-        int offlineCourseNum = classGroupDao.countCourseNum(classGroupId,"OFFLINE");
+        int onlineCourseNum = classGroupDao.countCourseNum(classGroupId, "ONLINE");
+        int offlineCourseNum = classGroupDao.countCourseNum(classGroupId, "OFFLINE");
 
         if (onlineCourseNum > 0 && offlineCourseNum <= 0) {
             teacherClassHeadInfo.setTeachMode("1");
@@ -1707,7 +1707,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         teacherClassHeadInfo.setStudentNum(classGroupStudentMapperDao.countClassGroupStudentNum(classGroup.getId()));
         teacherClassHeadInfo.setCurrentClassTimes(courseScheduleDao.countCurrentTimes(classGroup.getId(), new Date()));
         teacherClassHeadInfo.setTotalClassTimes(courseScheduleDao.countClassGroupCourses(classGroup.getId()));
-        teacherClassHeadInfo.setSurplusClassTimes(teacherClassHeadInfo.getTotalClassTimes()-teacherClassHeadInfo.getCurrentClassTimes());
+        teacherClassHeadInfo.setSurplusClassTimes(teacherClassHeadInfo.getTotalClassTimes() - teacherClassHeadInfo.getCurrentClassTimes());
         if (subjectNames != null && !subjectNames.isEmpty()) {
             teacherClassHeadInfo.setSubjectNames(subjectNames);
         }
@@ -1784,12 +1784,12 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 Set<Long> collect = truantStudent.stream().map(e -> e.getStudentId()).collect(Collectors.toSet());
                 Map<Integer, String> paymentStatusMap = MapUtil.convertIntegerMap(musicGroupPaymentCalenderDao.queryUserCoursePaymentStatus(collect, schedule.getMusicGroupId()));
 
-                Map<Integer, Long> quitMap = MapUtil.convertIntegerMap(musicGroupQuitDao.queryQuitMapByStudentId(collect,schedule.getMusicGroupId()));
+                Map<Integer, Long> quitMap = MapUtil.convertIntegerMap(musicGroupQuitDao.queryQuitMapByStudentId(collect, schedule.getMusicGroupId()));
                 //学员是否有待审核的退团申请
                 truantStudent.forEach(studentAttendanceViewDto -> {
                     studentAttendanceViewDto.setPaymentStatus(paymentStatusMap.get(studentAttendanceViewDto.getStudentId().intValue()));
                     Long aLong = quitMap.get(studentAttendanceViewDto.getStudentId().intValue());
-                    studentAttendanceViewDto.setQuitFlag(aLong==null?0:aLong.intValue());
+                    studentAttendanceViewDto.setQuitFlag(aLong == null ? 0 : aLong.intValue());
                 });
             }
             List<StudentAttendanceViewDto> tempIds = truantStudent.stream()
@@ -1802,12 +1802,12 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 List<Map<Integer, Long>> studentSubjectIdMaps = subjectDao.findStudentSubjectIdMaps(tempIds);
                 Map<Integer, Long> studentSubjectIdMap = MapUtil.convertIntegerMap(studentSubjectIdMaps);
                 truantStudent.forEach(studentAttendanceViewDto -> {
-                   if(Objects.nonNull(studentAttendanceViewDto.getBeMerged())&&studentAttendanceViewDto.getBeMerged()){
-                       studentAttendanceViewDto.setSubjectName("被合并学员");
-                   }else{
-                       studentAttendanceViewDto.setSubjectName(studentSubjectNameMap.get(studentAttendanceViewDto.getStudentId().intValue()));
-                       studentAttendanceViewDto.setSubjectId(studentSubjectIdMap.get(studentAttendanceViewDto.getStudentId().intValue()));
-                   }
+                    if (Objects.nonNull(studentAttendanceViewDto.getBeMerged()) && studentAttendanceViewDto.getBeMerged()) {
+                        studentAttendanceViewDto.setSubjectName("被合并学员");
+                    } else {
+                        studentAttendanceViewDto.setSubjectName(studentSubjectNameMap.get(studentAttendanceViewDto.getStudentId().intValue()));
+                        studentAttendanceViewDto.setSubjectId(studentSubjectIdMap.get(studentAttendanceViewDto.getStudentId().intValue()));
+                    }
                 });
             } else if (schedule.getGroupType() != MUSIC) {
                 ClassGroup classGroup = classGroupDao.get(schedule.getClassGroupId());
@@ -1998,8 +1998,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
             if (classGroup4MixDto.getHoliday()) {
                 Integer tenantId = TenantContextHolder.getTenantId();
-                String holidaySetting = sysTenantConfigService.getTenantConfigValue(SysConfigService.HOLIDAY_SETTING,tenantId);
-                if(StringUtils.isNotBlank(holidaySetting)){
+                String holidaySetting = sysTenantConfigService.getTenantConfigValue(SysConfigService.HOLIDAY_SETTING, tenantId);
+                if (StringUtils.isNotBlank(holidaySetting)) {
                     holidayDays = new HashSet<>(JSON.parseArray(holidaySetting, String.class));
                 }
             }
@@ -2019,7 +2019,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
                     //课时长度
                     long classCourseDuration = Duration.between(LocalDateTime.parse(classGroup4MixDto.getStartDate() + " " + courseTimeDto.getStartClassTime() + ":00", formatter),
-                            LocalDateTime.parse(classGroup4MixDto.getStartDate() + " " + courseTimeDto.getEndClassTime() + ":00", formatter))
+                                    LocalDateTime.parse(classGroup4MixDto.getStartDate() + " " + courseTimeDto.getEndClassTime() + ":00", formatter))
                             .toMinutes();
 
                     totalCourseDuration += classCourseDuration;
@@ -2147,8 +2147,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         Set<String> holidayDays = new HashSet<>();
         if (classGroup4MixDto.getHoliday()) {
             Integer tenantId = TenantContextHolder.getTenantId();
-            String holidaySetting = sysTenantConfigService.getTenantConfigValue(SysConfigService.HOLIDAY_SETTING,tenantId);
-            if(StringUtils.isNotBlank(holidaySetting)){
+            String holidaySetting = sysTenantConfigService.getTenantConfigValue(SysConfigService.HOLIDAY_SETTING, tenantId);
+            if (StringUtils.isNotBlank(holidaySetting)) {
                 holidayDays = new HashSet<>(JSON.parseArray(holidaySetting, String.class));
             }
         }
@@ -2388,10 +2388,10 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             List<ClassGroupTeacherMapper> byClassGroup = classGroupTeacherMapperDao.findByClassGroup(classGroupId);
             List<ClassGroupTeacherMapper> newTeacherMapperList = classGroup4MixDtos.get(0).getClassGroupTeacherMapperList();
             Set<Integer> collect = newTeacherMapperList.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
-            if(newTeacherMapperList.size() != collect.size()){
+            if (newTeacherMapperList.size() != collect.size()) {
                 throw new BizException("主教与助教存在冲突");
             }
-            if(musicGroup.getStatus() == PROGRESS){
+            if (musicGroup.getStatus() == PROGRESS) {
                 if (byClassGroup != null && byClassGroup.size() > 0) {
                     ClassGroupTeacherMapper groupTeacherMapper = byClassGroup.stream().filter(classGroupTeacherMapper -> classGroupTeacherMapper.getTeacherRole() == TeachTypeEnum.BISHOP).findFirst().get();
                     if (groupTeacherMapper != null) {
@@ -2460,7 +2460,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         for (ClassGroup4MixDto classGroup4MixDto : classGroup4MixDtos) {
             List<ClassGroupTeacherMapper> teacherMappers = classGroup4MixDto.getClassGroupTeacherMapperList();
             Set<Integer> collect = teacherMappers.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
-            if(teacherMappers.size() != collect.size()){
+            if (teacherMappers.size() != collect.size()) {
                 throw new BizException("主教与助教存在冲突");
             }
             //3、插入班级排课信息
@@ -2484,22 +2484,22 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
             Set<String> holidayDays = new HashSet<>();
             Integer tenantId = TenantContextHolder.getTenantId();
-            String holidaySetting = sysTenantConfigService.getTenantConfigValue(SysConfigService.HOLIDAY_SETTING,tenantId);
-            if(StringUtils.isNotBlank(holidaySetting)){
+            String holidaySetting = sysTenantConfigService.getTenantConfigValue(SysConfigService.HOLIDAY_SETTING, tenantId);
+            if (StringUtils.isNotBlank(holidaySetting)) {
                 holidayDays = new HashSet<>(JSON.parseArray(holidaySetting, String.class));
             }
 
             Set<Integer> allTeacherIds = new HashSet<>();
             List<SimpleUserDto> allTeacherInfo = new ArrayList<>();
-            if(!confirmGenerate){
+            if (!confirmGenerate) {
                 for (CourseTimeDto courseTimeDto : classGroup4MixDto.getCourseTimeDtoList()) {
                     List<ClassGroupTeacherMapper> newClassGroupTeacherMapperList = courseTimeDto.getClassGroupTeacherMapperList();
                     Set<Integer> teacherIds = newClassGroupTeacherMapperList.stream().map(t -> t.getUserId()).collect(Collectors.toSet());
-                    if(!CollectionUtils.isEmpty(teacherIds)){
+                    if (!CollectionUtils.isEmpty(teacherIds)) {
                         allTeacherIds.addAll(teacherIds);
                     }
                 }
-                if(!CollectionUtils.isEmpty(allTeacherIds)){
+                if (!CollectionUtils.isEmpty(allTeacherIds)) {
                     allTeacherInfo = teacherDao.getUsersSimpleInfo(new ArrayList<>(allTeacherIds));
                 }
             }
@@ -2515,8 +2515,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                         throw new BizException("主教与助教存在冲突");
                     }
 
-                    Integer teacherId = newClassGroupTeacherMapperList.stream().filter(ct->TeachTypeEnum.BISHOP.equals(ct.getTeacherRole())).findAny().get().getUserId();
-                    if(Objects.isNull(teacherId)){
+                    Integer teacherId = newClassGroupTeacherMapperList.stream().filter(ct -> TeachTypeEnum.BISHOP.equals(ct.getTeacherRole())).findAny().get().getUserId();
+                    if (Objects.isNull(teacherId)) {
                         throw new BizException("请设置主教");
                     }
 
@@ -2550,7 +2550,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
                     //课时长度
                     long classCourseDuration = Duration.between(LocalDateTime.parse(DateUtil.dateToString(courseTimeDto.getStartDate(), "yyyy-MM-dd") + " " + courseTimeDto.getStartClassTime() + ":00", formatter),
-                            LocalDateTime.parse(DateUtil.dateToString(courseTimeDto.getStartDate(), "yyyy-MM-dd") + " " + courseTimeDto.getEndClassTime() + ":00", formatter))
+                                    LocalDateTime.parse(DateUtil.dateToString(courseTimeDto.getStartDate(), "yyyy-MM-dd") + " " + courseTimeDto.getEndClassTime() + ":00", formatter))
                             .toMinutes();
 
                     totalCourseDuration += classCourseDuration;
@@ -2601,14 +2601,14 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                     courseScheduleDao.insert(courseSchedule);
                     courseScheduleList.add(courseSchedule);
 
-                    if(!confirmGenerate){
-                        Set<Integer> teacherIds = newClassGroupTeacherMapperList.stream().filter(ct->TeachTypeEnum.TEACHING.equals(ct.getTeacherRole())).map(ClassGroupTeacherMapper::getUserId).collect(Collectors.toSet());
+                    if (!confirmGenerate) {
+                        Set<Integer> teacherIds = newClassGroupTeacherMapperList.stream().filter(ct -> TeachTypeEnum.TEACHING.equals(ct.getTeacherRole())).map(ClassGroupTeacherMapper::getUserId).collect(Collectors.toSet());
                         SimpleUserDto mainTeacher = allTeacherInfo.stream().filter(t -> teacherId.equals(t.getUserId())).findAny().get();
-                        if(Objects.nonNull(mainTeacher)){
+                        if (Objects.nonNull(mainTeacher)) {
                             courseSchedule.setActualTeacherName(mainTeacher.getUserName());
                         }
                         List<SimpleUserDto> teachingTeachers = allTeacherInfo.stream().filter(t -> teacherIds.contains(t.getUserId())).collect(Collectors.toList());
-                        if(!CollectionUtils.isEmpty(teachingTeachers)){
+                        if (!CollectionUtils.isEmpty(teachingTeachers)) {
                             courseSchedule.setTeachingTeacherNames(StringUtils.join(teachingTeachers.stream().map(SimpleUserDto::getUserName).collect(Collectors.toList()), ","));
                         }
                     }
@@ -2672,28 +2672,28 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         MusicGroupSchoolTermCourseDetail termCourseDetail = musicGroupSchoolTermCourseDetailDao.get(musicGroupSchoolTermCourseDetailId);
         //校验所有学员的课时都有消耗
         String studentName = musicGroupSchoolTermStudentCourseDetailDao.getNoCourseStudentName(musicGroupSchoolTermCourseDetailId);
-        if(StringUtils.isNotEmpty(studentName)){
-            throw new BizException("操作失败:{} 未排课,请检查排课是否完整",studentName);
+        if (StringUtils.isNotEmpty(studentName)) {
+            throw new BizException("操作失败:{} 未排课,请检查排课是否完整", studentName);
         }
         //获取所有预排课课程列表
         List<CourseSchedule> courseSchedules = courseScheduleDao.queryPreCourseListByMusicGroupId(termCourseDetail.getMusicGroupId());
-        if(courseSchedules.size() == 0){
+        if (courseSchedules.size() == 0) {
             throw new BizException("操作失败:请先预排课");
         }
         //是否有进行中或者已结束的课程
         int overCourseScheduleNum = courseScheduleDao.queryOverPreCourseListByMusicGroupId(termCourseDetail.getMusicGroupId());
-        if(overCourseScheduleNum > 0){
+        if (overCourseScheduleNum > 0) {
             throw new BizException("操作失败:有进行中或已结束的课程,请重新排课");
         }
 
         Map<Integer, List<CourseSchedule>> courseMap = courseSchedules.stream().collect(Collectors.groupingBy(CourseSchedule::getClassGroupId));
-        courseMap.keySet().forEach(e->{
+        courseMap.keySet().forEach(e -> {
             //更新班级课程数
             classGroupService.updateTotalClassTimes(e, courseMap.get(e).size());
         });
         List<Long> courseScheduleIds = courseSchedules.stream().map(e -> e.getId()).collect(Collectors.toList());
         //取消预排课标记
-        courseScheduleDao.batchUpdateLockByCourseIds(courseScheduleIds,0,0);
+        courseScheduleDao.batchUpdateLockByCourseIds(courseScheduleIds, 0, 0);
         //标记已排课
         termCourseDetail.setCourseFlag(true);
         musicGroupSchoolTermCourseDetailDao.update(termCourseDetail);
@@ -2726,16 +2726,16 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         if (!CollectionUtils.isEmpty(teacherAttendances)) {
             teacherAttendanceDao.batchInsert(teacherAttendances);
         }
-        imUserFriendService.refreshGroupImUserFriend(termCourseDetail.getMusicGroupId(),MUSIC);
+        imUserFriendService.refreshGroupImUserFriend(termCourseDetail.getMusicGroupId(), MUSIC);
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void cancelPreCourseSchedule(Integer musicGroupSchoolTermCourseDetailId, Integer classGroupId) {
         MusicGroupSchoolTermCourseDetail termCourseDetail = musicGroupSchoolTermCourseDetailDao.get(musicGroupSchoolTermCourseDetailId);
-        if(classGroupId == null){
+        if (classGroupId == null) {
             List<CourseSchedule> courseSchedules = courseScheduleDao.queryPreCourseListByMusicGroupId(termCourseDetail.getMusicGroupId());
-            if(courseSchedules.size() > 0){
+            if (courseSchedules.size() > 0) {
                 List<Long> courseScheduleIds = courseSchedules.stream().map(e -> e.getId()).collect(Collectors.toList());
                 //删除课程以及关联的学员老师
                 courseScheduleStudentPaymentDao.deleteByCourseSchedule(courseScheduleIds);
@@ -2743,11 +2743,11 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 courseScheduleDao.deleteCourseSchedulesByClassGroupIds(courseScheduleIds);
             }
             //取消所有预排课
-            musicGroupSchoolTermStudentCourseDetailDao.deleteByDetailId(musicGroupSchoolTermCourseDetailId,null);
+            musicGroupSchoolTermStudentCourseDetailDao.deleteByDetailId(musicGroupSchoolTermCourseDetailId, null);
             musicGroupSchoolTermCourseDetailDao.delete(musicGroupSchoolTermCourseDetailId);
-        }else {
+        } else {
             List<CourseSchedule> courseSchedules = courseScheduleDao.queryPreCourseListByClassGroupId(classGroupId);
-            if(courseSchedules.size() == 0){
+            if (courseSchedules.size() == 0) {
                 return;
             }
             List<Long> courseScheduleIds = courseSchedules.stream().map(c -> c.getId()).collect(Collectors.toList());
@@ -2769,14 +2769,14 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                     //根据课程编号获取总时长
                     int courseMinutes = courseScheduleDao.sumCourseMinutes(courseScheduleIdList);
                     preMemberCourseMinutes += courseMinutes;
-                    if(scheduleType == SINGLE || scheduleType == TRAINING_SINGLE){
+                    if (scheduleType == SINGLE || scheduleType == TRAINING_SINGLE) {
                         singleCourseMinutes += courseMinutes;
                     }
-                    if(scheduleType == MIX || scheduleType == TRAINING_MIX){
+                    if (scheduleType == MIX || scheduleType == TRAINING_MIX) {
                         mixCourseMinutes += courseMinutes;
                     }
                 }
-                musicGroupSchoolTermStudentCourseDetailDao.cutMinutes(musicGroupSchoolTermCourseDetailId,preMemberCourseMinutes,mixCourseMinutes,singleCourseMinutes,studentId);
+                musicGroupSchoolTermStudentCourseDetailDao.cutMinutes(musicGroupSchoolTermCourseDetailId, preMemberCourseMinutes, mixCourseMinutes, singleCourseMinutes, studentId);
             }
             //删除课程以及关联的学员老师
             courseScheduleStudentPaymentDao.deleteByCourseSchedule(courseScheduleIds);
@@ -2788,12 +2788,12 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     @Override
     public List<ClassGroup> queryStudentClassGroupsAndTeacher(String musicGroupId) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if(sysUser == null){
+        if (sysUser == null) {
             throw new BizException("请登录");
         }
         List<ClassGroup> classGroups = classGroupDao.queryStudentClassGroups(musicGroupId, sysUser.getId());
-        if(classGroups.size() > 0){
-            classGroups.forEach(e->{
+        if (classGroups.size() > 0) {
+            classGroups.forEach(e -> {
                 e.setTeacherMapperList(classGroupTeacherMapperDao.findClassGroupTeachers(e.getId().toString()));
             });
         }
@@ -2819,17 +2819,17 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             throw new BizException("当前班级已冻结无法操作预排课");
         }
         MusicGroup musicGroup = musicGroupDao.get(classGroup.getMusicGroupId());
-        if(musicGroup == null){
+        if (musicGroup == null) {
             throw new BizException("乐团信息查询失败");
         }
-        if(musicGroup.getTenantId() == null){
+        if (musicGroup.getTenantId() == null) {
             throw new BizException("乐团机构信息异常,请联系管理员");
         }
         String configValue = sysTenantConfigService.getTenantConfigValue(SysConfigService.MEMBER_GROUP_TERM_GIVE_COURSE_TIME, musicGroup.getTenantId());
-        if(StringUtils.isEmpty(configValue)){
+        if (StringUtils.isEmpty(configValue)) {
             throw new BizException("请配置会员团每学期赠送课程分钟数");
         }
-        Integer giveCourseTime = Integer.parseInt(configValue)>>1;
+        Integer giveCourseTime = Integer.parseInt(configValue) >> 1;
 
         Boolean confirmGenerate = false;
         if (Objects.nonNull(classGroup4MixDtos.get(0).getConfirmGenerate())) {
@@ -2870,35 +2870,35 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
             Integer totalMixCourseMinutes = 0;
             Integer singleCourseMinutes = 0;
-            if(classGroup4MixDto.getCourseType() == SINGLE || classGroup4MixDto.getCourseType() == MIX ||
-                    classGroup4MixDto.getCourseType() == TRAINING_SINGLE || classGroup4MixDto.getCourseType() == TRAINING_MIX){
+            if (classGroup4MixDto.getCourseType() == SINGLE || classGroup4MixDto.getCourseType() == MIX ||
+                    classGroup4MixDto.getCourseType() == TRAINING_SINGLE || classGroup4MixDto.getCourseType() == TRAINING_MIX) {
                 //单技课和合奏课最大的排课时长不能超过44 * 45 分钟
-                if(classGroup4MixDto.getCourseType() == SINGLE || classGroup4MixDto.getCourseType() == TRAINING_SINGLE){
-                    if(totalCourseMinutes > giveCourseTime){
-                        throw new BizException("声部类型总时长不能超过最大限制({}分钟)",giveCourseTime);
+                if (classGroup4MixDto.getCourseType() == SINGLE || classGroup4MixDto.getCourseType() == TRAINING_SINGLE) {
+                    if (totalCourseMinutes > giveCourseTime) {
+                        throw new BizException("声部类型总时长不能超过最大限制({}分钟)", giveCourseTime);
                     }
                     singleCourseMinutes = totalCourseMinutes;
                     //获取所选学员最大的已消耗的单技课时长
-                    int maxSingleCourseMinutes = musicGroupSchoolTermStudentCourseDetailDao.getMaxSingleCourseMinutes(musicGroupSchoolTermCourseDetailId,studentIds);
-                    if(giveCourseTime - maxSingleCourseMinutes < totalCourseMinutes){
+                    int maxSingleCourseMinutes = musicGroupSchoolTermStudentCourseDetailDao.getMaxSingleCourseMinutes(musicGroupSchoolTermCourseDetailId, studentIds);
+                    if (giveCourseTime - maxSingleCourseMinutes < totalCourseMinutes) {
 //                        throw new BizException("操作失败:所选学员可排单技课时长已不足{}分钟",totalCourseMinutes);
-                        throw new BizException("声部类型总时长不能超过最大限制({}分钟)",giveCourseTime);
+                        throw new BizException("声部类型总时长不能超过最大限制({}分钟)", giveCourseTime);
                     }
                 } else {
-                    if(totalCourseMinutes > giveCourseTime){
-                        throw new BizException("合奏类型总时长不能超过最大限制({}分钟)",giveCourseTime);
+                    if (totalCourseMinutes > giveCourseTime) {
+                        throw new BizException("合奏类型总时长不能超过最大限制({}分钟)", giveCourseTime);
                     }
                     totalMixCourseMinutes = totalCourseMinutes;
-                    int maxMixCourseMinutes = musicGroupSchoolTermStudentCourseDetailDao.getMaxMixCourseMinutes(musicGroupSchoolTermCourseDetailId,studentIds);
-                    if(giveCourseTime - maxMixCourseMinutes < totalCourseMinutes){
+                    int maxMixCourseMinutes = musicGroupSchoolTermStudentCourseDetailDao.getMaxMixCourseMinutes(musicGroupSchoolTermCourseDetailId, studentIds);
+                    if (giveCourseTime - maxMixCourseMinutes < totalCourseMinutes) {
 //                        throw new BizException("操作失败:所选学员可排合奏课时长已不足{}分钟",totalCourseMinutes);
-                        throw new BizException("合奏类型总时长不能超过最大限制({}分钟)",giveCourseTime);
+                        throw new BizException("合奏类型总时长不能超过最大限制({}分钟)", giveCourseTime);
                     }
                 }
             }
             //获取班级学员最少可排课时长
-            int mixCourseMinutes = musicGroupSchoolTermStudentCourseDetailDao.getMixCourseMinutes(musicGroupSchoolTermCourseDetailId,studentIds);
-            if(totalCourseMinutes > mixCourseMinutes){
+            int mixCourseMinutes = musicGroupSchoolTermStudentCourseDetailDao.getMixCourseMinutes(musicGroupSchoolTermCourseDetailId, studentIds);
+            if (totalCourseMinutes > mixCourseMinutes) {
                 throw new BizException("操作失败:所选部分学员可排课时间不足");
             }
 
@@ -2910,22 +2910,22 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
             Set<String> holidayDays = new HashSet<>();
             Integer tenantId = TenantContextHolder.getTenantId();
-            String holidaySetting = sysTenantConfigService.getTenantConfigValue(SysConfigService.HOLIDAY_SETTING,tenantId);
-            if(StringUtils.isNotBlank(holidaySetting)){
+            String holidaySetting = sysTenantConfigService.getTenantConfigValue(SysConfigService.HOLIDAY_SETTING, tenantId);
+            if (StringUtils.isNotBlank(holidaySetting)) {
                 holidayDays = new HashSet<>(JSON.parseArray(holidaySetting, String.class));
             }
 
             Set<Integer> allTeacherIds = new HashSet<>();
             List<SimpleUserDto> allTeacherInfo = new ArrayList<>();
-            if(!confirmGenerate){
+            if (!confirmGenerate) {
                 for (CourseTimeDto courseTimeDto : classGroup4MixDto.getCourseTimeDtoList()) {
                     List<ClassGroupTeacherMapper> newClassGroupTeacherMapperList = courseTimeDto.getClassGroupTeacherMapperList();
                     Set<Integer> teacherIds = newClassGroupTeacherMapperList.stream().map(t -> t.getUserId()).collect(Collectors.toSet());
-                    if(!CollectionUtils.isEmpty(teacherIds)){
+                    if (!CollectionUtils.isEmpty(teacherIds)) {
                         allTeacherIds.addAll(teacherIds);
                     }
                 }
-                if(!CollectionUtils.isEmpty(allTeacherIds)){
+                if (!CollectionUtils.isEmpty(allTeacherIds)) {
                     allTeacherInfo = teacherDao.getUsersSimpleInfo(new ArrayList<>(allTeacherIds));
                 }
             }
@@ -2941,8 +2941,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                         throw new BizException("主教与助教存在冲突");
                     }
 
-                    Integer teacherId = newClassGroupTeacherMapperList.stream().filter(ct->TeachTypeEnum.BISHOP.equals(ct.getTeacherRole())).findAny().get().getUserId();
-                    if(Objects.isNull(teacherId)){
+                    Integer teacherId = newClassGroupTeacherMapperList.stream().filter(ct -> TeachTypeEnum.BISHOP.equals(ct.getTeacherRole())).findAny().get().getUserId();
+                    if (Objects.isNull(teacherId)) {
                         throw new BizException("请设置主教");
                     }
 
@@ -2953,11 +2953,11 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                         throw new BizException("排课循环周期错误,请核查");
                     }
                     //排课截止时间不可超过学期截止日期
-                    if(courseTimeDto.getEndDate().compareTo(schoolTermCourseDetail.getEndSchoolTerm()) > 0){
+                    if (courseTimeDto.getEndDate().compareTo(schoolTermCourseDetail.getEndSchoolTerm()) > 0) {
                         throw new BizException("操作失败:不可跨学期排课,请调整课程截止日期");
                     }
                     //排课开始时间不可小于预排课时间
-                    if(courseTimeDto.getStartDate().compareTo(schoolTermCourseDetail.getStartSchoolTerm()) < 0){
+                    if (courseTimeDto.getStartDate().compareTo(schoolTermCourseDetail.getStartSchoolTerm()) < 0) {
                         throw new BizException("操作失败:排课开始时间不可小于开课日期");
                     }
 
@@ -3029,14 +3029,14 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                     courseScheduleDao.insert(courseSchedule);
                     courseScheduleList.add(courseSchedule);
 
-                    if(!confirmGenerate){
-                        Set<Integer> teacherIds = newClassGroupTeacherMapperList.stream().filter(ct->TeachTypeEnum.TEACHING.equals(ct.getTeacherRole())).map(ClassGroupTeacherMapper::getUserId).collect(Collectors.toSet());
+                    if (!confirmGenerate) {
+                        Set<Integer> teacherIds = newClassGroupTeacherMapperList.stream().filter(ct -> TeachTypeEnum.TEACHING.equals(ct.getTeacherRole())).map(ClassGroupTeacherMapper::getUserId).collect(Collectors.toSet());
                         SimpleUserDto mainTeacher = allTeacherInfo.stream().filter(t -> teacherId.equals(t.getUserId())).findAny().get();
-                        if(Objects.nonNull(mainTeacher)){
+                        if (Objects.nonNull(mainTeacher)) {
                             courseSchedule.setActualTeacherName(mainTeacher.getUserName());
                         }
                         List<SimpleUserDto> teachingTeachers = allTeacherInfo.stream().filter(t -> teacherIds.contains(t.getUserId())).collect(Collectors.toList());
-                        if(!CollectionUtils.isEmpty(teachingTeachers)){
+                        if (!CollectionUtils.isEmpty(teachingTeachers)) {
                             courseSchedule.setTeachingTeacherNames(StringUtils.join(teachingTeachers.stream().map(SimpleUserDto::getUserName).collect(Collectors.toList()), ","));
                         }
                     }
@@ -3216,8 +3216,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             Set<String> holidayDays = new HashSet<>();
             if (classGroup4MixDto.getHoliday()) {
                 Integer tenantId = TenantContextHolder.getTenantId();
-                String holidaySetting = sysTenantConfigService.getTenantConfigValue(SysConfigService.HOLIDAY_SETTING,tenantId);
-                if(StringUtils.isNotBlank(holidaySetting)){
+                String holidaySetting = sysTenantConfigService.getTenantConfigValue(SysConfigService.HOLIDAY_SETTING, tenantId);
+                if (StringUtils.isNotBlank(holidaySetting)) {
                     holidayDays = new HashSet<>(JSON.parseArray(holidaySetting, String.class));
                 }
             }
@@ -3238,7 +3238,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
                     //课时长度
                     long classCourseDuration = Duration.between(LocalDateTime.parse(classGroup4MixDto.getStartDate() + " " + courseTimeDto.getStartClassTime() + ":00", formatter),
-                            LocalDateTime.parse(classGroup4MixDto.getStartDate() + " " + courseTimeDto.getEndClassTime() + ":00", formatter))
+                                    LocalDateTime.parse(classGroup4MixDto.getStartDate() + " " + courseTimeDto.getEndClassTime() + ":00", formatter))
                             .toMinutes();
 
                     totalCourseDuration += classCourseDuration;
@@ -3326,7 +3326,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             params.put("offset", pageInfo.getOffset());
             dataList = classGroupDao.queryMusicGroupClassGroup(params);
             List<Integer> classGroups = dataList.stream().map(e -> e.getClassGroupId()).collect(Collectors.toList());
-            Map<Integer, Long> totalNumMap = MapUtil.convertIntegerMap(courseScheduleDao.countTotalNumByClassGroupId(classGroups, null,0));
+            Map<Integer, Long> totalNumMap = MapUtil.convertIntegerMap(courseScheduleDao.countTotalNumByClassGroupId(classGroups, null, 0));
             Map<Integer, Long> currentNumMap = MapUtil.convertIntegerMap(courseScheduleDao.countExpendNumByClassGroupId(classGroups));
             String join = StringUtils.join(classGroups, ",");
             //获取主教老师
@@ -3420,16 +3420,16 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     @Transactional(rollbackFor = Exception.class)
     public int updateClassGroup(ClassGroup classGroup) {
         ClassGroup group = classGroupDao.get(classGroup.getId());
-        if(Objects.isNull(group)){
+        if (Objects.isNull(group)) {
             throw new BizException("班级信息不存在");
         }
         String groupName = classGroup.getName();
-        if(StringUtils.isEmpty(groupName)){
+        if (StringUtils.isEmpty(groupName)) {
             throw new BizException("请填写班级名称");
         }
         classGroupDao.update(classGroup);
         ImGroup imGroup = imGroupService.get(classGroup.getId().toString());
-        if(!Objects.isNull(imGroup)){
+        if (!Objects.isNull(imGroup)) {
             imGroup.setName(groupName);
             imGroupService.update(imGroup);
         }
@@ -3588,8 +3588,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     }
 
     @Override
-    public List<ClassGroupTeachersDto> getClassGroupAndTeacherByType(String musicGroupId, ClassGroupTypeEnum type) {
-        List<ClassGroupTeachersDto> classGroups = classGroupDao.findClassGroupByType(musicGroupId, type);
+    public List<ClassGroupTeachersDto> getClassGroupAndTeacherByType(String musicGroupId, ClassGroupTypeEnum type, Boolean hasCourse) {
+        List<ClassGroupTeachersDto> classGroups = classGroupDao.findClassGroupByType(musicGroupId, type, hasCourse);
         if (classGroups.size() == 0) {
             return null;
         }
@@ -3599,14 +3599,14 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         List<ClassGroupTeacherMapper> classGroupTeachers = classGroupTeacherMapperDao.findClassGroupTeachers(classGroupIds);
         Map<Integer, Integer> studyNums = JSONObject.parseObject(JSONObject.toJSONString(MapUtil.convertIntegerMap(classGroupDao.countStudyNum(classGroupIds))), HashMap.class);
 
-        Map<Integer, Long> totalNumMap = MapUtil.convertIntegerMap(courseScheduleDao.countTotalNumByClassGroupId(classGroupSet, null,0));
-        MusicGroupSchoolTermCourseDetail termCourseDetail = musicGroupSchoolTermCourseDetailDao.findByCourseDateAndMusicGroupId(musicGroupId, null,0);
+        Map<Integer, Long> totalNumMap = MapUtil.convertIntegerMap(courseScheduleDao.countTotalNumByClassGroupId(classGroupSet, null, 0));
+        MusicGroupSchoolTermCourseDetail termCourseDetail = musicGroupSchoolTermCourseDetailDao.findByCourseDateAndMusicGroupId(musicGroupId, null, 0);
         Map<Integer, Long> preTotalNumMap = null;
         Map<Integer, Long> preSubMinutesMap = null;
         Map<Integer, BigDecimal> preMinutesMap = null;
-        if(termCourseDetail != null){
+        if (termCourseDetail != null) {
             preTotalNumMap = MapUtil.convertIntegerMap(courseScheduleDao.countPreTotalNumByClassGroupId(classGroupSet));
-            preSubMinutesMap = MapUtil.convertIntegerMap(courseScheduleDao.countPreSubMinutesByClassGroupId(classGroupSet,termCourseDetail.getId()));
+            preSubMinutesMap = MapUtil.convertIntegerMap(courseScheduleDao.countPreSubMinutesByClassGroupId(classGroupSet, termCourseDetail.getId()));
             preMinutesMap = MapUtil.convertIntegerMap(courseScheduleDao.countPreMinutesByClassGroupId(classGroupSet));
         }
         Map<Integer, Long> currentNumMap = MapUtil.convertIntegerMap(courseScheduleDao.countExpendNumByClassGroupId(classGroupSet));
@@ -3621,22 +3621,22 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             classGroup.setStudentNum(studyNums.get(classGroup.getId()));
             int totalClassTimes = 0;
             int currentClassTimes = 0;
-            if(preSubMinutesMap != null){
+            if (preSubMinutesMap != null) {
                 if (preSubMinutesMap.containsKey(classGroup.getId())) {
                     Long aLong = preSubMinutesMap.get(classGroup.getId());
-                    classGroup.setPreSubMinutes(aLong==null?0:aLong.intValue());
+                    classGroup.setPreSubMinutes(aLong == null ? 0 : aLong.intValue());
                 }
             }
-            if(preMinutesMap != null){
+            if (preMinutesMap != null) {
                 if (preMinutesMap.containsKey(classGroup.getId())) {
                     BigDecimal bigDecimal = preMinutesMap.get(classGroup.getId());
-                    classGroup.setPreMinutes(bigDecimal==null?0:bigDecimal.intValue());
+                    classGroup.setPreMinutes(bigDecimal == null ? 0 : bigDecimal.intValue());
                 }
             }
-            if(preTotalNumMap != null){
+            if (preTotalNumMap != null) {
                 if (preTotalNumMap.containsKey(classGroup.getId())) {
                     Long aLong = preTotalNumMap.get(classGroup.getId());
-                    classGroup.setPreTotalClassTimes(aLong==null?0:aLong.intValue());
+                    classGroup.setPreTotalClassTimes(aLong == null ? 0 : aLong.intValue());
                 }
             }
 
@@ -3673,7 +3673,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             } else {
                 count = classGroupDao.countClassGroup(params);
             }
-        }else {
+        } else {
             count = classGroupDao.countClassGroup(params);
         }
 
@@ -3687,7 +3687,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             List<ClassGroupTeacherMapper> classGroupTeachers = classGroupTeacherMapperDao.findClassGroupTeachers(classGroupIds);
             Map<Integer, Integer> studyNums = JSONObject.parseObject(JSONObject.toJSONString(MapUtil.convertIntegerMap(classGroupDao.countStudyNum(classGroupIds))), HashMap.class);
 
-            Map<Integer, Long> totalNumMap = MapUtil.convertIntegerMap(courseScheduleDao.countTotalNumByClassGroupId(classGroupSet, null,0));
+            Map<Integer, Long> totalNumMap = MapUtil.convertIntegerMap(courseScheduleDao.countTotalNumByClassGroupId(classGroupSet, null, 0));
             Map<Integer, Long> currentNumMap = MapUtil.convertIntegerMap(courseScheduleDao.countExpendNumByClassGroupId(classGroupSet));
 
             for (ClassGroupTeachersDto classGroup : dataList) {
@@ -3722,16 +3722,16 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         MusicGroup musicGroup = musicGroupDao.get(classGroup.getMusicGroupId());
 
         Map<Integer, String> userRoleMap = new HashMap<Integer, String>();
-        if(musicGroup.getEducationalTeacherId() != null){
+        if (musicGroup.getEducationalTeacherId() != null) {
             userRoleMap.put(musicGroup.getEducationalTeacherId(), "乐团主管");
         }
-        if(musicGroup.getTeamTeacherId() != null){
+        if (musicGroup.getTeamTeacherId() != null) {
             userRoleMap.put(musicGroup.getTeamTeacherId(), "运营主管");
         }
-        if(musicGroup.getDirectorUserId() != null){
+        if (musicGroup.getDirectorUserId() != null) {
             userRoleMap.put(musicGroup.getDirectorUserId(), "乐队指导");
         }
-        if(musicGroup.getTransactionTeacherId() != null){
+        if (musicGroup.getTransactionTeacherId() != null) {
             userRoleMap.put(musicGroup.getTransactionTeacherId(), "衔接老师");
         }
         for (Integer userId : userIds) {
@@ -4061,8 +4061,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     }
 
     @Override
-    public List<RemainCourseTypeDurationDto> queryRemainCourseTypeDuration(String classGroupIdList,Integer memberFlag) {
-        return courseScheduleDao.queryRemainCourseTypeDuration(classGroupIdList,memberFlag);
+    public List<RemainCourseTypeDurationDto> queryRemainCourseTypeDuration(String classGroupIdList, Integer memberFlag) {
+        return courseScheduleDao.queryRemainCourseTypeDuration(classGroupIdList, memberFlag);
     }
 
     @Override
@@ -4137,7 +4137,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
         MusicGroup musicGroup = musicGroupDao.findByClassGroupId(classGroupIds.get(0));
         //获取欠费学员列表
-        List<Integer> noPaymentUserIds = musicGroupPaymentCalenderDetailDao.queryNoPaymentUserIds(musicGroup.getId(), new ArrayList<>(studentIds),null);
+        List<Integer> noPaymentUserIds = musicGroupPaymentCalenderDetailDao.queryNoPaymentUserIds(musicGroup.getId(), new ArrayList<>(studentIds), null);
         if (noPaymentUserIds.size() > 0) {
             throw new BizException("操作失败:有欠费的学员不允许创建缴费");
         }
@@ -4262,7 +4262,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             //冻结班级
             classGroupDao.batchUpdateLockByClassGroupIds(classGroupIds, 1);
             //冻结所选班级的课程
-            courseScheduleDao.batchUpdateLockByCourseIds(allLockCourseIds, 1,null);
+            courseScheduleDao.batchUpdateLockByCourseIds(allLockCourseIds, 1, null);
             httpResponseResult.setMsg("学员班级调整申请已提交,缴费项目审核中");
         }
         return httpResponseResult;
@@ -4388,11 +4388,11 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         classGroupIds.add(masterClassGroupId);
         List<ClassGroup> byClassGroupIds = classGroupDao.findByClassGroupIds(classGroupIds, null);
         long count = byClassGroupIds.stream().map(e -> e.getMusicGroupId()).distinct().count();
-        if(count > 1){
+        if (count > 1) {
             //获取分布默认的课程类型单价
             MusicGroup musicGroup = musicGroupDao.findByClassGroupId(masterClassGroupId);
             //主班乐团不能是系统收费团
-            if(musicGroup.getCourseViewType() == CourseViewTypeEnum.MEMBER_FEE){
+            if (musicGroup.getCourseViewType() == CourseViewTypeEnum.MEMBER_FEE) {
                 throw new BizException("操作失败:主班乐团不能是系统收费团");
             }
         }
@@ -4550,7 +4550,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                                 List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = courseScheduleTeacherSalaryDao.findByCourseSchedule(courseSchedule.getId());
                                 for (CourseScheduleTeacherSalary teacherSalary : courseScheduleTeacherSalaries) {
                                     //课酬调整后不能更新课酬
-                                    if(!teacherSalary.getEnableChangeSalary()){
+                                    if (!teacherSalary.getEnableChangeSalary()) {
                                         continue;
                                     }
                                     List<TeacherDefaultMusicGroupSalary> teacherSalaryList = teacherDefaultMusicGroupSalaryService.getTeacherSalaryByUserIdAndType(teacherSalary.getUserId(), null, null);
@@ -4608,7 +4608,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         //主班
         Integer masterClassGroupId = mergeClassSplitClassAffirmDto.getMasterClassGroupId();
         //是否有预排课
-        if(courseScheduleDao.queryPreCourseListByClassGroupId(masterClassGroupId).size() > 0){
+        if (courseScheduleDao.queryPreCourseListByClassGroupId(masterClassGroupId).size() > 0) {
             throw new BizException("操作失败: 所选主班有预排课课程,请先完成预排课操作");
         }
         //学员列表
@@ -4621,7 +4621,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         //学员列表
         List<Integer> classGroupIds = mergeClassSplitClassAffirmDto.getClassGroupIds();
         //是否有预排课
-        if(courseScheduleDao.queryPreCourseListByClassGroupIds(classGroupIds) > 0){
+        if (courseScheduleDao.queryPreCourseListByClassGroupIds(classGroupIds) > 0) {
             throw new BizException("操作失败: 所选从班班有预排课课程,请先完成预排课操作");
         }
         //班级和学员关联
@@ -4636,7 +4636,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         StudentRegistration studentRegistration = studentRegistrationDao.findApplyStudent(musicGroup.getId(), studentIds);
         if (studentRegistration != null) {
             throw new BizException("操作失败: 学员 {}/{} 在 {} 中为报名状态不可合并",
-                    studentRegistration.getName(),studentRegistration.getUserId(),musicGroup.getName());
+                    studentRegistration.getName(), studentRegistration.getUserId(), musicGroup.getName());
         }
         //获取缴费状态在审核中或者已拒绝的缴费项目的学员
         String studentId = musicGroupPaymentCalenderDao.queryCalenderStudentIds(musicGroup.getId(), null);
@@ -4656,9 +4656,9 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         //给原价赋值,前端没传过来
         for (MusicGroupPaymentCalenderStudentDetail e : calenderStudentDetails) {
             BigDecimal subtract = e.getMasterSubCoursePrice().subtract(e.getSubCourseAmount());
-            if(subtract.compareTo(BigDecimal.ZERO) < 0){
+            if (subtract.compareTo(BigDecimal.ZERO) < 0) {
                 e.setCourseOriginalPrice(BigDecimal.ZERO);
-            }else {
+            } else {
                 e.setCourseOriginalPrice(subtract);
             }
         }
@@ -4716,7 +4716,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             Map<Integer, List<MusicGroupPaymentCalenderStudentDetail>> collect = calenderStudentDetails.stream().collect(Collectors.groupingBy(e -> e.getUserId()));
             for (Map<Integer, String> classGroupStudent : classGroupStudents) {
                 Integer classGroupId = classGroupStudent.keySet().iterator().next();
-                studentRegistrationService.insertStudent(classGroupStudent.get(classGroupId), musicGroupDao.findByClassGroupId(classGroupId).getId(), musicGroup.getId(), collect,paymentCalenderDto.getBatchNo());
+                studentRegistrationService.insertStudent(classGroupStudent.get(classGroupId), musicGroupDao.findByClassGroupId(classGroupId).getId(), musicGroup.getId(), collect, paymentCalenderDto.getBatchNo());
             }
             List<Map> classGroupStudents1 = JSON.parseArray(musicGroupStudentClassAdjust.getClassGroupStudents(), Map.class);
             spanGroupClassAdjustPass(masterClassGroupId, studentIds, courseIds, classGroupStudents1, allLockCourseIds, paymentCalenderDto.getBatchNo(), masterTotalPrice);
@@ -4725,7 +4725,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 //                冻结班级
             classGroupDao.batchUpdateLockByClassGroupIds(classGroupIds, 1);
 //                冻结所选班级的课程
-            courseScheduleDao.batchUpdateLockByCourseIds(allLockCourseIds, 1,null);
+            courseScheduleDao.batchUpdateLockByCourseIds(allLockCourseIds, 1, null);
             httpResponseResult.setMsg("操作成功:学员班级调整申请已提交,缴费项目审核中");
         }
         return httpResponseResult;
@@ -4761,7 +4761,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             courseScheduleDao.deleteMusicGroupCourseSchedulesWithStudents(courseIds, studentIds);
         }
         //解冻课程
-        courseScheduleDao.batchUpdateLockByCourseIds(allLockCourseIds, 0,null);
+        courseScheduleDao.batchUpdateLockByCourseIds(allLockCourseIds, 0, null);
         //解冻班级
         classGroupIds.add(masterClassGroupId);
         classGroupDao.batchUpdateLockByClassGroupIds(classGroupIds, 0);
@@ -4784,10 +4784,10 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     @Override
     public List<CourseSchedule> queryPreCourseList(Integer classGroupId) {
         List<CourseSchedule> courseSchedules = courseScheduleDao.queryPreCourseListByClassGroupId(classGroupId);
-        if(courseSchedules.size() > 0){
+        if (courseSchedules.size() > 0) {
             List<Long> courseIdList = courseSchedules.stream().map(e -> e.getId()).collect(Collectors.toList());
-            Map<Long, String> bishopTeacherMap = MapUtil.convertMybatisMap(courseScheduleTeacherSalaryDao.queryTeacherNameMap(courseIdList,"BISHOP"));
-            Map<Long, String> teachingTeacherMap = MapUtil.convertMybatisMap(courseScheduleTeacherSalaryDao.queryTeacherNameMap(courseIdList,"TEACHING"));
+            Map<Long, String> bishopTeacherMap = MapUtil.convertMybatisMap(courseScheduleTeacherSalaryDao.queryTeacherNameMap(courseIdList, "BISHOP"));
+            Map<Long, String> teachingTeacherMap = MapUtil.convertMybatisMap(courseScheduleTeacherSalaryDao.queryTeacherNameMap(courseIdList, "TEACHING"));
             for (CourseSchedule courseSchedule : courseSchedules) {
                 courseSchedule.setActualTeacherName(bishopTeacherMap.get(courseSchedule.getId()));
                 courseSchedule.setTeachingTeacherNames(teachingTeacherMap.get(courseSchedule.getId()));

文件差異過大導致無法顯示
+ 251 - 190
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java


+ 526 - 526
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderDetailServiceImpl.java

@@ -32,544 +32,544 @@ import static com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus.NON_P
 import static com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus.PAID_COMPLETED;
 
 @Service
-public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<Long, MusicGroupPaymentCalenderDetail>  implements MusicGroupPaymentCalenderDetailService {
-	
-	@Autowired
-	private MusicGroupPaymentCalenderDetailDao musicGroupPaymentCalenderDetailDao;
-	@Autowired
-	private MusicGroupPaymentCalenderDao musicGroupPaymentCalenderDao;
-	@Autowired
-	private MusicGroupPaymentCalenderService musicGroupPaymentCalenderService;
-	@Autowired
-	private MusicGroupPaymentCalenderCourseSettingsDao musicGroupPaymentCalenderCourseSettingsDao;
-	@Autowired
-	private MusicGroupPaymentStudentCourseDetailDao musicGroupPaymentStudentCourseDetailDao;
-	@Autowired
-	private MusicGroupDao musicGroupDao;
-	@Autowired
-	private SysConfigDao sysConfigDao;
-	@Autowired
-	private MusicGroupStudentFeeDao musicGroupStudentFeeDao;
-	@Autowired
-	private ActivityUserMapperService activityUserMapperService;
-	@Autowired
-	private SysMessageService sysMessageService;
-	@Autowired
-	private MusicGroupPaymentCalenderMemberService musicGroupPaymentCalenderMemberService;
-	@Autowired
-	private MusicGroupPaymentCalenderActivityService musicGroupPaymentCalenderActivityService;
-	@Autowired
-	private StudentPaymentOrderDetailDao studentPaymentOrderDetailDao;
-	@Autowired
-	private CloudTeacherOrderService cloudTeacherOrderService;
-	@Autowired
-	private StudentPaymentOrderDao studentPaymentOrderDao;
-	@Autowired
-	private StudentDao studentDao;
-
-	@Override
-	public BaseDAO<Long, MusicGroupPaymentCalenderDetail> getDAO() {
-		return musicGroupPaymentCalenderDetailDao;
-	}
-
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public String openPayment(String ids, Date startPaymentDate, Date deadlinePaymentDate) {
-		if(StringUtils.isEmpty(ids)){
-			throw new BizException("参数校验失败");
-		}
-		//获取可开启缴费列表
-		List<MusicGroupPaymentCalenderDetail> calenderDetails = musicGroupPaymentCalenderDetailDao.queryCanOpenList(ids);
-		if(calenderDetails.size() == 0){
-			return "操作失败:所选学员已开启缴费,或已完成缴费";
-		}
-		int length = ids.split(",").length;
-		Date date = new Date();
-		
-		Long calenderId = calenderDetails.get(0).getMusicGroupPaymentCalenderId();
-		MusicGroupPaymentCalender calender = musicGroupPaymentCalenderService.get(calenderId);
-		calenderDetails.forEach(e->{
-			e.setUpdateTime(date);
-			e.setOpen(1);
-			e.setStartPaymentDate(startPaymentDate);
-			e.setDeadlinePaymentDate(deadlinePaymentDate);
-		});
-		musicGroupPaymentCalenderDetailDao.batchUpdate(calenderDetails);
-		Set<Integer> studentIds = calenderDetails.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
-		//推送消息
-		if (calender.getPayUserType() == STUDENT && studentIds.size() > 0) {
-			Map<Integer, String> push = new HashMap<>();
-			for (Integer userId : studentIds) {
-				push.put(userId, userId + "");
-			}
-			MusicGroup musicGroup = musicGroupDao.get(calender.getMusicGroupId());
-			String baseUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
-			String memo = "4?" + baseUrl + "/#/musicGroupRenew?calenderId="+calender.getId()+"&id=" + calender.getMusicGroupId();
-			// 发送续费通知
-			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, push,
-					null, 0, memo,"STUDENT",musicGroup.getName());
-			//获取未缴费且不是0元的学员列表
-			Map<Integer,String> studentMaps = MapUtil.convertMybatisMap(musicGroupPaymentCalenderDetailDao.queryNoPaymentAndNotZeroStudent(calender.getId(),studentIds));
-			if(studentMaps.size() > 0){
-				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.STUDENT_SMS_WAIT_RENEW_MESSAGE, studentMaps,
-						null, 0, memo, null, musicGroup.getName());
-			}
-		}
-		StringBuffer append = new StringBuffer("操作成功: 成功开启缴费").append(studentIds.size()).append("条,失败").append(length - studentIds.size()).append("条");
-		return append.toString();
-	}
-
-	@Override
-	public List<SimpleUserDto> findMusicGroupStudentWithSubject(String musicGroupId, Integer subjectId) {
-		if(Objects.isNull(musicGroupId)){
-			throw new BizException("请指定乐团");
-		}
-		return musicGroupPaymentCalenderDetailDao.findMusicGroupStudentWithSubject(musicGroupId, subjectId);
-	}
-
-	@Override
-	public void refreshUserMusicGroupPaymentStatusTask() {
-		musicGroupPaymentCalenderDetailDao.refreshUserMusicGroupPaymentStatusTask();
-	}
-
-
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public void batchAdd(MusicGroupPaymentCalender musicGroupPaymentCalender,List<MusicGroupPaymentCalenderStudentDetail> musicGroupPaymentCalenderStudentDetails) {
-		Map<Integer, List<MusicGroupPaymentCalenderStudentDetail>> collect = musicGroupPaymentCalenderStudentDetails.stream().collect(Collectors.groupingBy(e -> e.getUserId()));
-		MusicGroupPaymentCalenderDetail musicGroupPaymentCalenderDetail = null;
-		Long musicGroupPaymentCalenderId = musicGroupPaymentCalender.getId();
-		for (Integer studentId : collect.keySet()) {
-			musicGroupPaymentCalenderDetail = new MusicGroupPaymentCalenderDetail();
-			musicGroupPaymentCalenderDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalenderId);
-			musicGroupPaymentCalenderDetail.setPaymentStatus(PaymentStatus.NON_PAYMENT);
-			List<MusicGroupPaymentCalenderStudentDetail> calenderStudentDetails = collect.get(studentId);
-			BigDecimal totalPrice = calenderStudentDetails.stream().map(e->e.getCourseCurrentPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
+public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<Long, MusicGroupPaymentCalenderDetail> implements MusicGroupPaymentCalenderDetailService {
+
+    @Autowired
+    private MusicGroupPaymentCalenderDetailDao musicGroupPaymentCalenderDetailDao;
+    @Autowired
+    private MusicGroupPaymentCalenderDao musicGroupPaymentCalenderDao;
+    @Autowired
+    private MusicGroupPaymentCalenderService musicGroupPaymentCalenderService;
+    @Autowired
+    private MusicGroupPaymentCalenderCourseSettingsDao musicGroupPaymentCalenderCourseSettingsDao;
+    @Autowired
+    private MusicGroupPaymentStudentCourseDetailDao musicGroupPaymentStudentCourseDetailDao;
+    @Autowired
+    private MusicGroupDao musicGroupDao;
+    @Autowired
+    private SysConfigDao sysConfigDao;
+    @Autowired
+    private MusicGroupStudentFeeDao musicGroupStudentFeeDao;
+    @Autowired
+    private ActivityUserMapperService activityUserMapperService;
+    @Autowired
+    private SysMessageService sysMessageService;
+    @Autowired
+    private MusicGroupPaymentCalenderMemberService musicGroupPaymentCalenderMemberService;
+    @Autowired
+    private MusicGroupPaymentCalenderActivityService musicGroupPaymentCalenderActivityService;
+    @Autowired
+    private StudentPaymentOrderDetailDao studentPaymentOrderDetailDao;
+    @Autowired
+    private CloudTeacherOrderService cloudTeacherOrderService;
+    @Autowired
+    private StudentPaymentOrderDao studentPaymentOrderDao;
+    @Autowired
+    private StudentDao studentDao;
+
+    @Override
+    public BaseDAO<Long, MusicGroupPaymentCalenderDetail> getDAO() {
+        return musicGroupPaymentCalenderDetailDao;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String openPayment(String ids, Date startPaymentDate, Date deadlinePaymentDate) {
+        if (StringUtils.isEmpty(ids)) {
+            throw new BizException("参数校验失败");
+        }
+        //获取可开启缴费列表
+        List<MusicGroupPaymentCalenderDetail> calenderDetails = musicGroupPaymentCalenderDetailDao.queryCanOpenList(ids);
+        if (calenderDetails.size() == 0) {
+            return "操作失败:所选学员已开启缴费,或已完成缴费";
+        }
+        int length = ids.split(",").length;
+        Date date = new Date();
+
+        Long calenderId = calenderDetails.get(0).getMusicGroupPaymentCalenderId();
+        MusicGroupPaymentCalender calender = musicGroupPaymentCalenderService.get(calenderId);
+        calenderDetails.forEach(e -> {
+            e.setUpdateTime(date);
+            e.setOpen(1);
+            e.setStartPaymentDate(startPaymentDate);
+            e.setDeadlinePaymentDate(deadlinePaymentDate);
+        });
+        musicGroupPaymentCalenderDetailDao.batchUpdate(calenderDetails);
+        Set<Integer> studentIds = calenderDetails.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
+        //推送消息
+        if (calender.getPayUserType() == STUDENT && studentIds.size() > 0) {
+            Map<Integer, String> push = new HashMap<>();
+            for (Integer userId : studentIds) {
+                push.put(userId, userId + "");
+            }
+            MusicGroup musicGroup = musicGroupDao.get(calender.getMusicGroupId());
+            String baseUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
+            String memo = "4?" + baseUrl + "/#/musicGroupRenew?calenderId=" + calender.getId() + "&id=" + calender.getMusicGroupId();
+            // 发送续费通知
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, push,
+                    null, 0, memo, "STUDENT", musicGroup.getName());
+            //获取未缴费且不是0元的学员列表
+            Map<Integer, String> studentMaps = MapUtil.convertMybatisMap(musicGroupPaymentCalenderDetailDao.queryNoPaymentAndNotZeroStudent(calender.getId(), studentIds));
+            if (studentMaps.size() > 0) {
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.STUDENT_SMS_WAIT_RENEW_MESSAGE, studentMaps,
+                        null, 0, memo, null, musicGroup.getName());
+            }
+        }
+        StringBuffer append = new StringBuffer("操作成功: 成功开启缴费").append(studentIds.size()).append("条,失败").append(length - studentIds.size()).append("条");
+        return append.toString();
+    }
+
+    @Override
+    public List<SimpleUserDto> findMusicGroupStudentWithSubject(String musicGroupId, Integer subjectId) {
+        if (Objects.isNull(musicGroupId)) {
+            throw new BizException("请指定乐团");
+        }
+        return musicGroupPaymentCalenderDetailDao.findMusicGroupStudentWithSubject(musicGroupId, subjectId);
+    }
+
+    @Override
+    public void refreshUserMusicGroupPaymentStatusTask() {
+        musicGroupPaymentCalenderDetailDao.refreshUserMusicGroupPaymentStatusTask();
+    }
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void batchAdd(MusicGroupPaymentCalender musicGroupPaymentCalender, List<MusicGroupPaymentCalenderStudentDetail> musicGroupPaymentCalenderStudentDetails) {
+        Map<Integer, List<MusicGroupPaymentCalenderStudentDetail>> collect = musicGroupPaymentCalenderStudentDetails.stream().collect(Collectors.groupingBy(e -> e.getUserId()));
+        MusicGroupPaymentCalenderDetail musicGroupPaymentCalenderDetail = null;
+        Long musicGroupPaymentCalenderId = musicGroupPaymentCalender.getId();
+        for (Integer studentId : collect.keySet()) {
+            musicGroupPaymentCalenderDetail = new MusicGroupPaymentCalenderDetail();
+            musicGroupPaymentCalenderDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalenderId);
+            musicGroupPaymentCalenderDetail.setPaymentStatus(PaymentStatus.NON_PAYMENT);
+            List<MusicGroupPaymentCalenderStudentDetail> calenderStudentDetails = collect.get(studentId);
+            BigDecimal totalPrice = calenderStudentDetails.stream().map(e -> e.getCourseCurrentPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
 //			musicGroupPaymentCalenderDetail.setExpectAmount(totalPrice);
-			if(musicGroupPaymentCalender.getStatus() != AUDITING){
-				if (totalPrice.doubleValue() == 0d) {
-					musicGroupPaymentCalenderDetail.setPaymentStatus(PaymentStatus.PAID_COMPLETED);
-					musicGroupPaymentCalender.setActualNum(musicGroupPaymentCalender.getActualNum() + 1);
+            if (musicGroupPaymentCalender.getStatus() != AUDITING) {
+                if (totalPrice.doubleValue() == 0d) {
+                    musicGroupPaymentCalenderDetail.setPaymentStatus(PaymentStatus.PAID_COMPLETED);
+                    musicGroupPaymentCalender.setActualNum(musicGroupPaymentCalender.getActualNum() + 1);
 //					musicGroupPaymentCalenderDetail.setActualAmount(totalPrice);
-				}
-			}
-			musicGroupPaymentCalenderDetail.setMusicGroupId(musicGroupPaymentCalender.getMusicGroupId());
-			musicGroupPaymentCalenderDetail.setUserId(studentId);
-			musicGroupPaymentCalenderDetail.setStartPaymentDate(musicGroupPaymentCalender.getStartPaymentDate());
-			musicGroupPaymentCalenderDetail.setDeadlinePaymentDate(musicGroupPaymentCalender.getDeadlinePaymentDate());
-			musicGroupPaymentCalenderDetail.setResponsibleUserId(musicGroupPaymentCalender.getOperator());
-			musicGroupPaymentCalenderDetailDao.insert(musicGroupPaymentCalenderDetail);
-		}
-		musicGroupPaymentCalender.setExpectNum(collect.keySet().size());
-		musicGroupPaymentCalenderService.update(musicGroupPaymentCalender);
-		//给学员推送缴费通知
-		if(musicGroupPaymentCalender.getStatus() == PaymentCalenderStatusEnum.OPEN){
-			musicGroupPaymentCalenderService.pushWaitRenewMessage(musicGroupPaymentCalenderId,musicGroupDao.get(musicGroupPaymentCalender.getMusicGroupId()),collect.keySet());
-		}
-	}
-
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public void batchAdd(String batchNo, Set<Integer> userIdList) {
-		
-		List<MusicGroupPaymentCalender> musicGroupPaymentCalenderList = musicGroupPaymentCalenderDao.findByBatchNo(batchNo);
-		if(musicGroupPaymentCalenderList == null || musicGroupPaymentCalenderList.size() == 0){
-			throw new BizException("操作失败:缴费项目不存在");
-		}
-		MusicGroupPaymentCalender musicGroupPaymentCalender = musicGroupPaymentCalenderList.get(0);
-		String musicGroupId = musicGroupPaymentCalender.getMusicGroupId();
-		// 所有缴费项目已完成排课才能创建下一个缴费项目
-		List<String> batchNoList = new ArrayList<>();
-		batchNoList.add(batchNo);
+                }
+            }
+            musicGroupPaymentCalenderDetail.setMusicGroupId(musicGroupPaymentCalender.getMusicGroupId());
+            musicGroupPaymentCalenderDetail.setUserId(studentId);
+            musicGroupPaymentCalenderDetail.setStartPaymentDate(musicGroupPaymentCalender.getStartPaymentDate());
+            musicGroupPaymentCalenderDetail.setDeadlinePaymentDate(musicGroupPaymentCalender.getDeadlinePaymentDate());
+            musicGroupPaymentCalenderDetail.setResponsibleUserId(musicGroupPaymentCalender.getOperator());
+            musicGroupPaymentCalenderDetailDao.insert(musicGroupPaymentCalenderDetail);
+        }
+        musicGroupPaymentCalender.setExpectNum(collect.keySet().size());
+        musicGroupPaymentCalenderService.update(musicGroupPaymentCalender);
+        //给学员推送缴费通知
+        if (musicGroupPaymentCalender.getStatus() == PaymentCalenderStatusEnum.OPEN) {
+            musicGroupPaymentCalenderService.pushWaitRenewMessage(musicGroupPaymentCalenderId, musicGroupDao.get(musicGroupPaymentCalender.getMusicGroupId()), collect.keySet());
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void batchAdd(String batchNo, Set<Integer> userIdList) {
+
+        List<MusicGroupPaymentCalender> musicGroupPaymentCalenderList = musicGroupPaymentCalenderDao.findByBatchNo(batchNo);
+        if (musicGroupPaymentCalenderList == null || musicGroupPaymentCalenderList.size() == 0) {
+            throw new BizException("操作失败:缴费项目不存在");
+        }
+        MusicGroupPaymentCalender musicGroupPaymentCalender = musicGroupPaymentCalenderList.get(0);
+        String musicGroupId = musicGroupPaymentCalender.getMusicGroupId();
+        // 所有缴费项目已完成排课才能创建下一个缴费项目
+        List<String> batchNoList = new ArrayList<>();
+        batchNoList.add(batchNo);
 		/*String orignBatchNo = musicGroupPaymentStudentCourseDetailDao.getUnUseBatchNoWithStudentAndCourseTypeAndCourseMinutes(musicGroupId, null, null,batchNoList);
 		if (StringUtils.isNoneBlank(orignBatchNo)) {
 			throw new BizException("当前乐团存在未排课的缴费项目,请先完成排课再操作");
 		}*/
-		//获取欠费学员列表
-		List<Integer> noPaymentUserIds = musicGroupPaymentCalenderDetailDao.queryNoPaymentUserIds(musicGroupId, new ArrayList<>(userIdList),null);
-		if(noPaymentUserIds.size() > 0){
-			throw new BizException("操作失败:有欠费的学员不允许创建缴费");
-		}
-		//获取缴费状态在审核中或者已拒绝的缴费项目的学员
-		String studentIds = musicGroupPaymentCalenderDao.queryCalenderStudentIds(musicGroupId,batchNo);
-		if(StringUtils.isNotEmpty(studentIds)){
-			for (Integer integer : userIdList) {
-				if(studentIds.contains(integer.toString())){
-					throw new BizException("操作失败:所选学员有待审核或已拒绝的缴费项目");
-				}
-			}
-		}
-		Long musicGroupPaymentCalenderId = musicGroupPaymentCalender.getId();
-
-		if(musicGroupPaymentCalender.getPaymentType() == MusicGroupPaymentCalender.PaymentType.MUSIC_APPLY){
-			throw new BizException("操作失败:报名缴费项不允许添加学员");
-		}
-		if (musicGroupPaymentCalender.getStatus() == PaymentCalenderStatusEnum.AUDITING
-				|| musicGroupPaymentCalender.getStatus() == PaymentCalenderStatusEnum.REJECT) {
-			throw new BizException("当前缴费状态不能添加学生");
-		}
-		//判断学生是否已存在
-		Set<Integer> userList = musicGroupPaymentCalenderDetailDao.queryStudentIds(musicGroupPaymentCalenderId);
-		if(Collections.disjoint(userList, userIdList) == false){
-			throw new BizException("操作失败:包含已存在的学员");
-		}
-		
-		List<MusicGroupPaymentCalenderCourseSettings> courseSettingsList = musicGroupPaymentCalenderCourseSettingsDao.getWithPaymentCalender(musicGroupPaymentCalenderId);
-		
-		if (courseSettingsList != null && courseSettingsList.size() > 0) {
-			List<StudentSubTotalCourseTimesDto> studentCourseTypeDtos = musicGroupPaymentStudentCourseDetailDao.queryStudentSubTotalCourseTimes(musicGroupId);
-
-			Set<String> courseTypes = new HashSet<String>();
-			for (StudentSubTotalCourseTimesDto dto : studentCourseTypeDtos) {
-				if (userIdList.contains(dto.getUserId())) {
-					courseTypes.addAll(dto.getMapDtos().stream().filter(t -> t.getValue() > 0).map(t -> t.getKey()).collect(Collectors.toSet()));
-				}
-			}
-
-			for (MusicGroupPaymentCalenderCourseSettings mgpccs : courseSettingsList) {
-				if (courseTypes.contains(mgpccs.getCourseType().name())) {
-					throw new BizException("操作失败:存在未排完的[{}]", mgpccs.getCourseType().getMsg());
-				}
-			}
-		}
-
-		Date date = new Date();
-		MusicGroupPaymentCalenderDetail musicGroupPaymentCalenderDetail = null;
-		Map<Integer,Long> userMap = new HashMap<>();
-		List<MusicGroupPaymentCalenderDetail> musicGroupPaymentCalenderDetailList = new ArrayList<MusicGroupPaymentCalenderDetail>();
-		//创建缴费明细
-		MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
-
-		List<MusicGroupPaymentCalenderActivity> calenderActivities = musicGroupPaymentCalenderActivityService.findByCalenderId(musicGroupPaymentCalenderId);
-		MusicGroupPaymentCalenderMember calenderMember = musicGroupPaymentCalenderMemberService.findByCalenderId(musicGroupPaymentCalenderId);
-		for(Integer studentId : userIdList){
-			musicGroupPaymentCalenderDetail = new MusicGroupPaymentCalenderDetail();
-			musicGroupPaymentCalenderDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalenderId);
-			musicGroupPaymentCalenderDetail.setCreateTime(date);
-			if (musicGroupPaymentCalender.getCurrentTotalAmount().compareTo(BigDecimal.ZERO) == 0) {
-				musicGroupPaymentCalenderDetail.setPaymentStatus(PaymentStatus.PAID_COMPLETED);
-			} else {
-				musicGroupPaymentCalenderDetail.setPaymentStatus(PaymentStatus.NON_PAYMENT);
-			}
-			musicGroupPaymentCalenderDetail.setUpdateTime(date);
-			musicGroupPaymentCalenderDetail.setUserId(studentId);
-			musicGroupPaymentCalenderDetail.setStartPaymentDate(musicGroupPaymentCalender.getStartPaymentDate());
-			musicGroupPaymentCalenderDetail.setDeadlinePaymentDate(musicGroupPaymentCalender.getDeadlinePaymentDate());
-			musicGroupPaymentCalenderDetail.setResponsibleUserId(musicGroupPaymentCalender.getOperator());
-			musicGroupPaymentCalenderDetailList.add(musicGroupPaymentCalenderDetail);
-			if (musicGroupPaymentCalender.getCurrentTotalAmount().compareTo(BigDecimal.ZERO) == 0) {
-				// 添加会员
-				if(calenderMember != null){
-					CloudTeacherOrder cloudTeacherOrder = new CloudTeacherOrder();
-					cloudTeacherOrder.setOrganId(musicGroup.getOrganId());
-					cloudTeacherOrder.setType(calenderMember.getPeriod());
-					cloudTeacherOrder.setAmount(BigDecimal.ZERO);
-					cloudTeacherOrder.setStudentId(studentId);
-					cloudTeacherOrder.setLevel(calenderMember.getMemberRankSettingId());
-					cloudTeacherOrder.setTime(calenderMember.getNum().intValue());
-					cloudTeacherOrder.setStatus(1);
-					cloudTeacherOrder.setRemark("缴费项目0元新增学员");
-					cloudTeacherOrder.setMusicGroupId(musicGroupId);
-					cloudTeacherOrderService.save(cloudTeacherOrder,calenderMember.getAutoActivationFlag());
-				}
-				//添加小课包
-				if(calenderActivities != null && calenderActivities.size() > 0){
-					List<ActivityUserMapper> activityUserMapperList = new ArrayList<>();
-					for (MusicGroupPaymentCalenderActivity calenderActivity : calenderActivities) {
-						ActivityUserMapper activityUserMapper = new ActivityUserMapper();
-						activityUserMapper.setActualPrice(BigDecimal.ZERO);
-						activityUserMapper.setActivityId(calenderActivity.getActivityId());
-						Student student = studentDao.get(studentId);
-						activityUserMapper.setUserId(studentId);
-						activityUserMapper.setTeacherId(student.getTeacherId());
-						if("网管课".equals(calenderActivity.getCategoryName())){
-							activityUserMapper.setPracticeFlag(1);
-						}else {
-							activityUserMapper.setVipFlag(1);
-						}
-						activityUserMapperList.add(activityUserMapper);
-					}
-					activityUserMapperService.batchInsert(activityUserMapperList);
-				}
-			}
-		}
-
-		if (musicGroupPaymentCalenderDetailList.size() > 0) {
-			musicGroupPaymentCalenderDetailDao.batchInsert(musicGroupPaymentCalenderDetailList);
-			musicGroupPaymentCalenderDetailList.stream().forEach(e-> userMap.put(e.getUserId(),e.getId()));
-		}
-		//更新预计缴费人数
-		musicGroupPaymentCalender.setExpectNum(musicGroupPaymentCalender.getExpectNum() + userIdList.size());
-		musicGroupPaymentCalender.setUpdateTime(date);
-		if (musicGroupPaymentCalender.getCurrentTotalAmount().compareTo(BigDecimal.ZERO) == 0) {
-			musicGroupPaymentCalender.setActualNum(musicGroupPaymentCalender.getActualNum() + userIdList.size());
-		}
-		musicGroupPaymentCalenderService.update(musicGroupPaymentCalender);
-
-		//创建学生课排课分钟数
-		if(courseSettingsList != null && courseSettingsList.size() > 0){
-			List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetailList = new ArrayList<>();
-			MusicGroupPaymentStudentCourseDetail musicGroupPaymentStudentCourseDetail = null;
-			for(Integer studentId : userIdList){
-				for(MusicGroupPaymentCalenderCourseSettings courseSettings : courseSettingsList){
-					if (courseSettings.getCourseTotalMinuties() == null || courseSettings.getCourseTotalMinuties() == 0) {
-						continue;
-					}
-					musicGroupPaymentStudentCourseDetail = new MusicGroupPaymentStudentCourseDetail();
-					musicGroupPaymentStudentCourseDetail.setCourseType(courseSettings.getCourseType());
-					musicGroupPaymentStudentCourseDetail.setCreateTime(date);
-					musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalenderId);
-					musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderDetailId(userMap.get(studentId));
-					musicGroupPaymentStudentCourseDetail.setTotalCourseMinutes(courseSettings.getCourseTotalMinuties());
-					musicGroupPaymentStudentCourseDetail.setCourseOriginalPrice(courseSettings.getCourseOriginalPrice());
-					musicGroupPaymentStudentCourseDetail.setCourseCurrentPrice(courseSettings.getCourseCurrentPrice());
-					musicGroupPaymentStudentCourseDetail.setUpdateTime(date);
-					musicGroupPaymentStudentCourseDetail.setUsedCourseMinutes(0);
-					musicGroupPaymentStudentCourseDetail.setUserId(studentId);
-					musicGroupPaymentStudentCourseDetailList.add(musicGroupPaymentStudentCourseDetail);
-				}
-			}
-			if(musicGroupPaymentStudentCourseDetailList.size() > 0){
-				musicGroupPaymentStudentCourseDetailDao.batchInsert(musicGroupPaymentStudentCourseDetailList);
-			}
-		}
-		//给学员推送缴费通知
-		if (musicGroupPaymentCalender.getPayUserType() == STUDENT && musicGroupPaymentCalender.getStatus() == PaymentCalenderStatusEnum.OPEN) {
-			musicGroupPaymentCalenderService.pushWaitRenewMessage(musicGroupPaymentCalender.getId(),
-					musicGroupDao.get(musicGroupPaymentCalender.getMusicGroupId()),userIdList);
-		}
-	}
-
-	@Override
-	public List<FeeStudentDto> queryFeeStudents(String musicGroupId,String search,Integer subjectId) {
-		return musicGroupStudentFeeDao.queryFeeStudents(musicGroupId,search,subjectId);
-	}
-
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public void batchDel(String musicGroupPaymentCalenderDetailIds) {
-		List<MusicGroupPaymentCalenderDetail> details = musicGroupPaymentCalenderDetailDao.queryListByIds(musicGroupPaymentCalenderDetailIds);
-		if(details == null || details.size() == 0){
-			throw new BizException("删除失败: 数据不可为空");
-		}
-		Long musicGroupPaymentCalenderId = details.get(0).getMusicGroupPaymentCalenderId();
-		MusicGroupPaymentCalender musicGroupPaymentCalender = musicGroupPaymentCalenderDao.get(musicGroupPaymentCalenderId);
-		
-		if(musicGroupPaymentCalender == null){
-			throw new BizException("查询缴费项目失败[{}]", musicGroupPaymentCalender);
-		}
-		
-		long count = 0;
-		if (musicGroupPaymentCalender.getPayUserType() == STUDENT) {
-			// 是否已缴费
-			count = details.stream().filter(e -> e.getPaymentStatus() != NON_PAYMENT).count();
-			if (count > 0) {
-				throw new BizException("删除失败: 存在已缴费的学员");
-			}
-		}
-		List<Long> musicGroupPaymentCalenderDetailIdList = new ArrayList<Long>();
-		for(String s : musicGroupPaymentCalenderDetailIds.split(",")){
-			musicGroupPaymentCalenderDetailIdList.add(Long.parseLong(s));
-		}
-		//是否已排课
-		List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetailList = musicGroupPaymentStudentCourseDetailDao.queryByMusicGroupPaymentStudentCourseDetailId(musicGroupPaymentCalenderDetailIdList);
-		count = musicGroupPaymentStudentCourseDetailList.stream().filter(e -> e.getUsedCourseMinutes() > 0).count();
-		if(count > 0){
-			throw new BizException("删除失败:存在已排课的学员");
-		}
-		
-		int currentNum = musicGroupPaymentCalender.getExpectNum() - details.size();
-		musicGroupPaymentCalender.setExpectNum(currentNum < 0 ? 0 : currentNum);
-		musicGroupPaymentCalender.setUpdateTime(new Date());
-		musicGroupPaymentCalenderDao.update(musicGroupPaymentCalender);
-
-		musicGroupPaymentCalenderDetailDao.batchDel(musicGroupPaymentCalenderDetailIds);
-		musicGroupPaymentStudentCourseDetailDao.deleteByMusicGroupPaymentCalenderDetailId(musicGroupPaymentCalenderDetailIdList);
-	}
-
-	@Override
-	public PageInfo<MusicArrearageStudentDto> queryArrearageStudents(ArrearageStudentsQueryInfo queryInfo) {
-		PageInfo<MusicArrearageStudentDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
-		Map<String, Object> params = new HashMap<>();
-		MapUtil.populateMap(params, queryInfo);
-
-		List<MusicArrearageStudentDto> dataList = null;
-		int count = musicGroupPaymentCalenderDetailDao.countArrearageStudents(params);
-		if (count > 0) {
-			pageInfo.setTotal(count);
-			params.put("offset", pageInfo.getOffset());
-			dataList = musicGroupPaymentCalenderDetailDao.queryArrearageStudents(params);
-		}
-		if (count == 0) {
-			dataList = new ArrayList<>();
-		}
-		pageInfo.setRows(dataList);
-		return pageInfo;
-	}
-
-	@Override
-	public List<MusicGroup> getNoPaymentStudentMusicGroups(String organIdsStr) {
-		Set<Integer> organIds = null;
-		if(StringUtils.isNotBlank(organIdsStr)){
-			organIds = Arrays.stream(organIdsStr.split(",")).map(Integer::new).collect(Collectors.toSet());
-		}
-		return musicGroupPaymentCalenderDetailDao.getNoPaymentStudentMusicGroups(organIds, TenantContextHolder.getTenantId());
-	}
-
-	@Override
-	public void pushWaitRenewMessage(Long calenderId, String studentIds) {
-		List<MusicGroupPaymentCalenderDetail> calenderDetails = musicGroupPaymentCalenderDetailDao.queryNoPaymentCanPushByCalenderId(calenderId,studentIds);
-		if(calenderDetails == null || calenderDetails.size() == 0){
-			throw new BizException("发送失败:没有可以发送缴费提醒的学员");
-		}
-		Set<Integer> studentIdList = calenderDetails.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
-		MusicGroupPaymentCalender paymentCalender = musicGroupPaymentCalenderDao.get(calenderId);
-		//未缴费
-		Map<Integer,String> studentMaps = MapUtil.convertMybatisMap(musicGroupPaymentCalenderDetailDao.queryNoPaymentAndNotZeroStudent(calenderId,studentIdList));
-		MusicGroup musicGroup = musicGroupDao.get(paymentCalender.getMusicGroupId());
-		String baseUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
-		String memo = "4?" + baseUrl + "/#/musicGroupRenew?calenderId="+calenderId+"&id=" + musicGroup.getId();
-		Map<Integer, String> push = new HashMap<>();
-		for (Integer userId : studentIdList) {
-			push.put(userId, userId.toString());
-		}
-		// 发送续费通知
-		sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, push,
-				null, 0, memo, "STUDENT", musicGroup.getName());
-		sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.STUDENT_SMS_WAIT_RENEW_MESSAGE, studentMaps,
-				null, 0, memo, null, musicGroup.getName());
-	}
+        //获取欠费学员列表
+        List<Integer> noPaymentUserIds = musicGroupPaymentCalenderDetailDao.queryNoPaymentUserIds(musicGroupId, new ArrayList<>(userIdList), null);
+        if (noPaymentUserIds.size() > 0) {
+            throw new BizException("操作失败:有欠费的学员不允许创建缴费");
+        }
+        //获取缴费状态在审核中或者已拒绝的缴费项目的学员
+        String studentIds = musicGroupPaymentCalenderDao.queryCalenderStudentIds(musicGroupId, batchNo);
+        if (StringUtils.isNotEmpty(studentIds)) {
+            for (Integer integer : userIdList) {
+                if (studentIds.contains(integer.toString())) {
+                    throw new BizException("操作失败:所选学员有待审核或已拒绝的缴费项目");
+                }
+            }
+        }
+        Long musicGroupPaymentCalenderId = musicGroupPaymentCalender.getId();
+
+        if (musicGroupPaymentCalender.getPaymentType() == MusicGroupPaymentCalender.PaymentType.MUSIC_APPLY) {
+            throw new BizException("操作失败:报名缴费项不允许添加学员");
+        }
+        if (musicGroupPaymentCalender.getStatus() == PaymentCalenderStatusEnum.AUDITING
+                || musicGroupPaymentCalender.getStatus() == PaymentCalenderStatusEnum.REJECT) {
+            throw new BizException("当前缴费状态不能添加学生");
+        }
+        //判断学生是否已存在
+        Set<Integer> userList = musicGroupPaymentCalenderDetailDao.queryStudentIds(musicGroupPaymentCalenderId);
+        if (Collections.disjoint(userList, userIdList) == false) {
+            throw new BizException("操作失败:包含已存在的学员");
+        }
+
+        List<MusicGroupPaymentCalenderCourseSettings> courseSettingsList = musicGroupPaymentCalenderCourseSettingsDao.getWithPaymentCalender(musicGroupPaymentCalenderId);
+
+        if (courseSettingsList != null && courseSettingsList.size() > 0) {
+            List<StudentSubTotalCourseTimesDto> studentCourseTypeDtos = musicGroupPaymentStudentCourseDetailDao.queryStudentSubTotalCourseTimes(musicGroupId);
+
+            Set<String> courseTypes = new HashSet<String>();
+            for (StudentSubTotalCourseTimesDto dto : studentCourseTypeDtos) {
+                if (userIdList.contains(dto.getUserId())) {
+                    courseTypes.addAll(dto.getMapDtos().stream().filter(t -> t.getValue() > 0).map(t -> t.getKey()).collect(Collectors.toSet()));
+                }
+            }
+
+            for (MusicGroupPaymentCalenderCourseSettings mgpccs : courseSettingsList) {
+                if (courseTypes.contains(mgpccs.getCourseType().name())) {
+                    throw new BizException("操作失败:存在未排完的[{}]", mgpccs.getCourseType().getMsg());
+                }
+            }
+        }
+
+        Date date = new Date();
+        MusicGroupPaymentCalenderDetail musicGroupPaymentCalenderDetail = null;
+        Map<Integer, Long> userMap = new HashMap<>();
+        List<MusicGroupPaymentCalenderDetail> musicGroupPaymentCalenderDetailList = new ArrayList<MusicGroupPaymentCalenderDetail>();
+        //创建缴费明细
+        MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
+
+        List<MusicGroupPaymentCalenderActivity> calenderActivities = musicGroupPaymentCalenderActivityService.findByCalenderId(musicGroupPaymentCalenderId);
+        MusicGroupPaymentCalenderMember calenderMember = musicGroupPaymentCalenderMemberService.findByCalenderId(musicGroupPaymentCalenderId);
+        for (Integer studentId : userIdList) {
+            musicGroupPaymentCalenderDetail = new MusicGroupPaymentCalenderDetail();
+            musicGroupPaymentCalenderDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalenderId);
+            musicGroupPaymentCalenderDetail.setCreateTime(date);
+            if (musicGroupPaymentCalender.getCurrentTotalAmount().compareTo(BigDecimal.ZERO) == 0) {
+                musicGroupPaymentCalenderDetail.setPaymentStatus(PaymentStatus.PAID_COMPLETED);
+            } else {
+                musicGroupPaymentCalenderDetail.setPaymentStatus(PaymentStatus.NON_PAYMENT);
+            }
+            musicGroupPaymentCalenderDetail.setUpdateTime(date);
+            musicGroupPaymentCalenderDetail.setUserId(studentId);
+            musicGroupPaymentCalenderDetail.setStartPaymentDate(musicGroupPaymentCalender.getStartPaymentDate());
+            musicGroupPaymentCalenderDetail.setDeadlinePaymentDate(musicGroupPaymentCalender.getDeadlinePaymentDate());
+            musicGroupPaymentCalenderDetail.setResponsibleUserId(musicGroupPaymentCalender.getOperator());
+            musicGroupPaymentCalenderDetailList.add(musicGroupPaymentCalenderDetail);
+            if (musicGroupPaymentCalender.getCurrentTotalAmount().compareTo(BigDecimal.ZERO) == 0) {
+                // 添加会员
+                if (calenderMember != null) {
+                    CloudTeacherOrder cloudTeacherOrder = new CloudTeacherOrder();
+                    cloudTeacherOrder.setOrganId(musicGroup.getOrganId());
+                    cloudTeacherOrder.setType(calenderMember.getPeriod());
+                    cloudTeacherOrder.setAmount(BigDecimal.ZERO);
+                    cloudTeacherOrder.setStudentId(studentId);
+                    cloudTeacherOrder.setLevel(calenderMember.getMemberRankSettingId());
+                    cloudTeacherOrder.setTime(calenderMember.getNum().intValue());
+                    cloudTeacherOrder.setStatus(1);
+                    cloudTeacherOrder.setRemark("缴费项目0元新增学员");
+                    cloudTeacherOrder.setMusicGroupId(musicGroupId);
+                    cloudTeacherOrderService.save(cloudTeacherOrder, calenderMember.getAutoActivationFlag());
+                }
+                //添加小课包
+                if (calenderActivities != null && calenderActivities.size() > 0) {
+                    List<ActivityUserMapper> activityUserMapperList = new ArrayList<>();
+                    for (MusicGroupPaymentCalenderActivity calenderActivity : calenderActivities) {
+                        ActivityUserMapper activityUserMapper = new ActivityUserMapper();
+                        activityUserMapper.setActualPrice(BigDecimal.ZERO);
+                        activityUserMapper.setActivityId(calenderActivity.getActivityId());
+                        Student student = studentDao.get(studentId);
+                        activityUserMapper.setUserId(studentId);
+                        activityUserMapper.setTeacherId(student.getTeacherId());
+                        if ("网管课".equals(calenderActivity.getCategoryName())) {
+                            activityUserMapper.setPracticeFlag(1);
+                        } else {
+                            activityUserMapper.setVipFlag(1);
+                        }
+                        activityUserMapperList.add(activityUserMapper);
+                    }
+                    activityUserMapperService.batchInsert(activityUserMapperList);
+                }
+            }
+        }
+
+        if (musicGroupPaymentCalenderDetailList.size() > 0) {
+            musicGroupPaymentCalenderDetailDao.batchInsert(musicGroupPaymentCalenderDetailList);
+            musicGroupPaymentCalenderDetailList.stream().forEach(e -> userMap.put(e.getUserId(), e.getId()));
+        }
+        //更新预计缴费人数
+        musicGroupPaymentCalender.setExpectNum(musicGroupPaymentCalender.getExpectNum() + userIdList.size());
+        musicGroupPaymentCalender.setUpdateTime(date);
+        if (musicGroupPaymentCalender.getCurrentTotalAmount().compareTo(BigDecimal.ZERO) == 0) {
+            musicGroupPaymentCalender.setActualNum(musicGroupPaymentCalender.getActualNum() + userIdList.size());
+        }
+        musicGroupPaymentCalenderService.update(musicGroupPaymentCalender);
+
+        //创建学生课排课分钟数
+        if (courseSettingsList != null && courseSettingsList.size() > 0) {
+            List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetailList = new ArrayList<>();
+            MusicGroupPaymentStudentCourseDetail musicGroupPaymentStudentCourseDetail = null;
+            for (Integer studentId : userIdList) {
+                for (MusicGroupPaymentCalenderCourseSettings courseSettings : courseSettingsList) {
+                    if (courseSettings.getCourseTotalMinuties() == null || courseSettings.getCourseTotalMinuties() == 0) {
+                        continue;
+                    }
+                    musicGroupPaymentStudentCourseDetail = new MusicGroupPaymentStudentCourseDetail();
+                    musicGroupPaymentStudentCourseDetail.setCourseType(courseSettings.getCourseType());
+                    musicGroupPaymentStudentCourseDetail.setCreateTime(date);
+                    musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalenderId);
+                    musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderDetailId(userMap.get(studentId));
+                    musicGroupPaymentStudentCourseDetail.setTotalCourseMinutes(courseSettings.getCourseTotalMinuties());
+                    musicGroupPaymentStudentCourseDetail.setCourseOriginalPrice(courseSettings.getCourseOriginalPrice());
+                    musicGroupPaymentStudentCourseDetail.setCourseCurrentPrice(courseSettings.getCourseCurrentPrice());
+                    musicGroupPaymentStudentCourseDetail.setUpdateTime(date);
+                    musicGroupPaymentStudentCourseDetail.setUsedCourseMinutes(0);
+                    musicGroupPaymentStudentCourseDetail.setUserId(studentId);
+                    musicGroupPaymentStudentCourseDetailList.add(musicGroupPaymentStudentCourseDetail);
+                }
+            }
+            if (musicGroupPaymentStudentCourseDetailList.size() > 0) {
+                musicGroupPaymentStudentCourseDetailDao.batchInsert(musicGroupPaymentStudentCourseDetailList);
+            }
+        }
+        //给学员推送缴费通知
+        if (musicGroupPaymentCalender.getPayUserType() == STUDENT && musicGroupPaymentCalender.getStatus() == PaymentCalenderStatusEnum.OPEN) {
+            musicGroupPaymentCalenderService.pushWaitRenewMessage(musicGroupPaymentCalender.getId(),
+                    musicGroupDao.get(musicGroupPaymentCalender.getMusicGroupId()), userIdList);
+        }
+    }
+
+    @Override
+    public List<FeeStudentDto> queryFeeStudents(String musicGroupId, String search, Integer subjectId) {
+        return musicGroupStudentFeeDao.queryFeeStudents(musicGroupId, search, subjectId);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void batchDel(String musicGroupPaymentCalenderDetailIds) {
+        List<MusicGroupPaymentCalenderDetail> details = musicGroupPaymentCalenderDetailDao.queryListByIds(musicGroupPaymentCalenderDetailIds);
+        if (details == null || details.size() == 0) {
+            throw new BizException("删除失败: 数据不可为空");
+        }
+        Long musicGroupPaymentCalenderId = details.get(0).getMusicGroupPaymentCalenderId();
+        MusicGroupPaymentCalender musicGroupPaymentCalender = musicGroupPaymentCalenderDao.get(musicGroupPaymentCalenderId);
+
+        if (musicGroupPaymentCalender == null) {
+            throw new BizException("查询缴费项目失败[{}]", musicGroupPaymentCalender);
+        }
+
+        long count = 0;
+        if (musicGroupPaymentCalender.getPayUserType() == STUDENT) {
+            // 是否已缴费
+            count = details.stream().filter(e -> e.getPaymentStatus() != NON_PAYMENT).count();
+            if (count > 0) {
+                throw new BizException("删除失败: 存在已缴费的学员");
+            }
+        }
+        List<Long> musicGroupPaymentCalenderDetailIdList = new ArrayList<Long>();
+        for (String s : musicGroupPaymentCalenderDetailIds.split(",")) {
+            musicGroupPaymentCalenderDetailIdList.add(Long.parseLong(s));
+        }
+        //是否已排课
+        List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetailList = musicGroupPaymentStudentCourseDetailDao.queryByMusicGroupPaymentStudentCourseDetailId(musicGroupPaymentCalenderDetailIdList);
+        count = musicGroupPaymentStudentCourseDetailList.stream().filter(e -> e.getUsedCourseMinutes() > 0).count();
+        if (count > 0) {
+            throw new BizException("删除失败:存在已排课的学员");
+        }
+
+        int currentNum = musicGroupPaymentCalender.getExpectNum() - details.size();
+        musicGroupPaymentCalender.setExpectNum(currentNum < 0 ? 0 : currentNum);
+        musicGroupPaymentCalender.setUpdateTime(new Date());
+        musicGroupPaymentCalenderDao.update(musicGroupPaymentCalender);
+
+        musicGroupPaymentCalenderDetailDao.batchDel(musicGroupPaymentCalenderDetailIds);
+        musicGroupPaymentStudentCourseDetailDao.deleteByMusicGroupPaymentCalenderDetailId(musicGroupPaymentCalenderDetailIdList);
+    }
+
+    @Override
+    public PageInfo<MusicArrearageStudentDto> queryArrearageStudents(ArrearageStudentsQueryInfo queryInfo) {
+        PageInfo<MusicArrearageStudentDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<MusicArrearageStudentDto> dataList = null;
+        int count = musicGroupPaymentCalenderDetailDao.countArrearageStudents(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = musicGroupPaymentCalenderDetailDao.queryArrearageStudents(params);
+        }
+        if (count == 0) {
+            dataList = new ArrayList<>();
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
+    @Override
+    public List<MusicGroup> getNoPaymentStudentMusicGroups(String organIdsStr) {
+        Set<Integer> organIds = null;
+        if (StringUtils.isNotBlank(organIdsStr)) {
+            organIds = Arrays.stream(organIdsStr.split(",")).map(Integer::new).collect(Collectors.toSet());
+        }
+        return musicGroupPaymentCalenderDetailDao.getNoPaymentStudentMusicGroups(organIds, TenantContextHolder.getTenantId());
+    }
+
+    @Override
+    public void pushWaitRenewMessage(Long calenderId, String studentIds) {
+        List<MusicGroupPaymentCalenderDetail> calenderDetails = musicGroupPaymentCalenderDetailDao.queryNoPaymentCanPushByCalenderId(calenderId, studentIds);
+        if (calenderDetails == null || calenderDetails.size() == 0) {
+            throw new BizException("发送失败:没有可以发送缴费提醒的学员");
+        }
+        Set<Integer> studentIdList = calenderDetails.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
+        MusicGroupPaymentCalender paymentCalender = musicGroupPaymentCalenderDao.get(calenderId);
+        //未缴费
+        Map<Integer, String> studentMaps = MapUtil.convertMybatisMap(musicGroupPaymentCalenderDetailDao.queryNoPaymentAndNotZeroStudent(calenderId, studentIdList));
+        MusicGroup musicGroup = musicGroupDao.get(paymentCalender.getMusicGroupId());
+        String baseUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
+        String memo = "4?" + baseUrl + "/#/musicGroupRenew?calenderId=" + calenderId + "&id=" + musicGroup.getId();
+        Map<Integer, String> push = new HashMap<>();
+        for (Integer userId : studentIdList) {
+            push.put(userId, userId.toString());
+        }
+        // 发送续费通知
+        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, push,
+                null, 0, memo, "STUDENT", musicGroup.getName());
+        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.STUDENT_SMS_WAIT_RENEW_MESSAGE, studentMaps,
+                null, 0, memo, null, musicGroup.getName());
+    }
 
     @Override
     public PageInfo<MusicGroupPaymentCalenderDetailDto> queryDetailPage(MusicCalenderDetailQueryInfo queryInfo) {
-		PageInfo<MusicGroupPaymentCalenderDetailDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
-		Map<String, Object> params = new HashMap<String, Object>();
-		MapUtil.populateMap(params, queryInfo);
-
-		List<MusicGroupPaymentCalenderDetailDto> dataList = null;
-		int count = musicGroupPaymentCalenderDetailDao.countDetailPage(params);
-		if (count > 0) {
-			pageInfo.setTotal(count);
-			params.put("offset", pageInfo.getOffset());
-			dataList = musicGroupPaymentCalenderDetailDao.queryDetailPage(params);
-			List<StudentPaymentOrderDetail> orderDetail = studentPaymentOrderDetailDao.findByCalenderId(dataList.get(0).getMusicGroupPaymentCalenderId());
-			Map<Integer, List<StudentPaymentOrderDetail>> orderDetailMap = orderDetail.stream().collect(Collectors.groupingBy(StudentPaymentOrderDetail::getUserId));
-			for (MusicGroupPaymentCalenderDetailDto row : dataList) {
-				List<StudentPaymentOrderDetail> orderDetailList = orderDetailMap.get(row.getUserId());
-				if(orderDetailList != null && orderDetailList.size() > 0){
-					BigDecimal totalAmount = orderDetailList.stream().map(e -> e.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
-					//辅件
-					BigDecimal accessoriesAmount = orderDetailList.stream().filter(e -> e.getType() == OrderDetailTypeEnum.ACCESSORIES).map(e -> e.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
-					row.setAccessoriesAmount(accessoriesAmount);
-					//会员金额
-					BigDecimal cloudAmount = orderDetailList.stream().filter(e -> e.getType() == OrderDetailTypeEnum.CLOUD_TEACHER || e.getType() == OrderDetailTypeEnum.CLOUD_TEACHER_PLUS).map(e -> e.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
-					row.setCloudAmount(cloudAmount);
-					//乐器
-					BigDecimal musicalAmount = orderDetailList.stream().filter(e -> e.getType() == OrderDetailTypeEnum.MUSICAL).map(e -> e.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
-					row.setMusicalAmount(musicalAmount);
-					//乐保
-					BigDecimal maintenanceAmount = orderDetailList.stream().filter(e -> e.getType() == OrderDetailTypeEnum.MAINTENANCE).map(e -> e.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
-					row.setMaintenanceAmount(maintenanceAmount);
-					//活动
-					BigDecimal activityAmount = orderDetailList.stream().filter(e -> e.getType() == OrderDetailTypeEnum.PRACTICE || e.getType() == OrderDetailTypeEnum.VIP).map(e -> e.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
-					row.setActivityAmount(activityAmount);
-
-					totalAmount = totalAmount.subtract(accessoriesAmount).subtract(cloudAmount).subtract(musicalAmount).subtract(maintenanceAmount).subtract(activityAmount);
-					row.setCourseAmount(totalAmount);
-				}
-			}
-		}
-		if (count == 0) {
-			dataList = new ArrayList<>();
-		}
-		pageInfo.setRows(dataList);
-		return pageInfo;
+        PageInfo<MusicGroupPaymentCalenderDetailDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<String, Object>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<MusicGroupPaymentCalenderDetailDto> dataList = null;
+        int count = musicGroupPaymentCalenderDetailDao.countDetailPage(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = musicGroupPaymentCalenderDetailDao.queryDetailPage(params);
+            List<StudentPaymentOrderDetail> orderDetail = studentPaymentOrderDetailDao.findByCalenderId(dataList.get(0).getMusicGroupPaymentCalenderId());
+            Map<Integer, List<StudentPaymentOrderDetail>> orderDetailMap = orderDetail.stream().collect(Collectors.groupingBy(StudentPaymentOrderDetail::getUserId));
+            for (MusicGroupPaymentCalenderDetailDto row : dataList) {
+                List<StudentPaymentOrderDetail> orderDetailList = orderDetailMap.get(row.getUserId());
+                if (orderDetailList != null && orderDetailList.size() > 0) {
+                    BigDecimal totalAmount = orderDetailList.stream().map(e -> e.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
+                    //辅件
+                    BigDecimal accessoriesAmount = orderDetailList.stream().filter(e -> e.getType() == OrderDetailTypeEnum.ACCESSORIES).map(e -> e.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
+                    row.setAccessoriesAmount(accessoriesAmount);
+                    //会员金额
+                    BigDecimal cloudAmount = orderDetailList.stream().filter(e -> e.getType() == OrderDetailTypeEnum.CLOUD_TEACHER || e.getType() == OrderDetailTypeEnum.CLOUD_TEACHER_PLUS).map(e -> e.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
+                    row.setCloudAmount(cloudAmount);
+                    //乐器
+                    BigDecimal musicalAmount = orderDetailList.stream().filter(e -> e.getType() == OrderDetailTypeEnum.MUSICAL).map(e -> e.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
+                    row.setMusicalAmount(musicalAmount);
+                    //乐保
+                    BigDecimal maintenanceAmount = orderDetailList.stream().filter(e -> e.getType() == OrderDetailTypeEnum.MAINTENANCE).map(e -> e.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
+                    row.setMaintenanceAmount(maintenanceAmount);
+                    //活动
+                    BigDecimal activityAmount = orderDetailList.stream().filter(e -> e.getType() == OrderDetailTypeEnum.PRACTICE || e.getType() == OrderDetailTypeEnum.VIP).map(e -> e.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
+                    row.setActivityAmount(activityAmount);
+
+                    totalAmount = totalAmount.subtract(accessoriesAmount).subtract(cloudAmount).subtract(musicalAmount).subtract(maintenanceAmount).subtract(activityAmount);
+                    row.setCourseAmount(totalAmount);
+                }
+            }
+        }
+        if (count == 0) {
+            dataList = new ArrayList<>();
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
     }
 
     @Override
-	@Transactional(rollbackFor = Exception.class)
+    @Transactional(rollbackFor = Exception.class)
     public void addCalenderDetail(StudentPaymentOrder studentPaymentOrder, StudentRegistration studentRegistration) {
-		Date nowDate = new Date();
-		Integer tenantId = studentPaymentOrder.getTenantId();
-		//缴费详情 calender detail
-		MusicGroupPaymentCalender musicGroupPaymentCalender = musicGroupPaymentCalenderService.get(studentPaymentOrder.getCalenderId());
-		Long currentPaymentCalenderId = studentPaymentOrder.getCalenderId();
-		//查询缴费项目关联的订单
-		List<StudentPaymentOrder> orderList = studentPaymentOrderDao.findByCalenderId(currentPaymentCalenderId,studentPaymentOrder.getUserId());
-		if(orderList.size() == 1){
-			// 更新实际缴费人数
-			if (musicGroupPaymentCalender.getActualNum() == null) {
-				musicGroupPaymentCalender.setActualNum(1);
-			} else {
-				musicGroupPaymentCalender.setActualNum(musicGroupPaymentCalender.getActualNum() + 1);
-			}
-			if(musicGroupPaymentCalender.getPaymentType() == MusicGroupPaymentCalender.PaymentType.MUSIC_APPLY){
-				if (musicGroupPaymentCalender.getExpectNum() == null) {
-					musicGroupPaymentCalender.setExpectNum(1);
-				} else {
-					musicGroupPaymentCalender.setExpectNum(musicGroupPaymentCalender.getExpectNum() + 1);
-				}
-			}
-			musicGroupPaymentCalender.setUpdateTime(nowDate);
-			musicGroupPaymentCalenderDao.update(musicGroupPaymentCalender);
-		}
-
-		MusicGroupPaymentCalenderDetail musicGroupPaymentCalenderDetail = musicGroupPaymentCalenderDetailDao.findByCalenderIdAndUserId(currentPaymentCalenderId,studentPaymentOrder.getUserId());
-		if(musicGroupPaymentCalenderDetail == null){
-			musicGroupPaymentCalenderDetail = new MusicGroupPaymentCalenderDetail();
-			musicGroupPaymentCalenderDetail.setTenantId(tenantId);
-			musicGroupPaymentCalenderDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalender.getId());
-			musicGroupPaymentCalenderDetail.setUserId(studentPaymentOrder.getUserId());
-			musicGroupPaymentCalenderDetail.setResponsibleUserId(musicGroupPaymentCalender.getOperator());
-			musicGroupPaymentCalenderDetail.setPaymentStatus(PAID_COMPLETED);
-			musicGroupPaymentCalenderDetail.setPayTime(nowDate);
-			musicGroupPaymentCalenderDetail.setPaymentOrderId(studentPaymentOrder.getId());
-			musicGroupPaymentCalenderDetail.setUseInCourse(0);
-			musicGroupPaymentCalenderDetail.setOpen(1);
-			musicGroupPaymentCalenderDetail.setUserStatus(null);
-			musicGroupPaymentCalenderDetail.setDeadlinePaymentDate(musicGroupPaymentCalender.getDeadlinePaymentDate());
-			musicGroupPaymentCalenderDetail.setStartPaymentDate(musicGroupPaymentCalender.getStartPaymentDate());
-			musicGroupPaymentCalenderDetail.setCreateTime(nowDate);
-			musicGroupPaymentCalenderDetail.setUpdateTime(nowDate);
-			musicGroupPaymentCalenderDetailDao.insert(musicGroupPaymentCalenderDetail);
-		}else {
-			musicGroupPaymentCalenderDetail.setPaymentStatus(PAID_COMPLETED);
-			musicGroupPaymentCalenderDetail.setPayTime(nowDate);
-			musicGroupPaymentCalenderDetail.setPaymentOrderId(studentPaymentOrder.getId());
-			musicGroupPaymentCalenderDetailDao.update(musicGroupPaymentCalenderDetail);
-		}
-
-		//续费项目加学员时就生成了课程时长,报名项目在缴费成功后才需要添加课程时长
-		if(musicGroupPaymentCalender.getPaymentType() == MusicGroupPaymentCalender.PaymentType.MUSIC_APPLY){
-			List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetails = new ArrayList<>();
-			List<String> orderDetailTypes = studentPaymentOrderDetailDao.getOrderDetailType(studentPaymentOrder.getId());
-			List<MusicGroupPaymentCalenderCourseSettings> courseSettingsList = musicGroupPaymentCalenderCourseSettingsDao
-					.getWithPaymentCalender(musicGroupPaymentCalender.getId());
-			for (MusicGroupPaymentCalenderCourseSettings courseSetting : courseSettingsList) {
-				if (musicGroupPaymentCalender.getPayUserType().equals(MusicGroupPaymentCalender.PayUserType.STUDENT)
-						&& !orderDetailTypes.contains(courseSetting.getCourseType().getCode())) {
-					continue;
-				}
-				if (courseSetting.getCourseTotalMinuties() == null || courseSetting.getCourseTotalMinuties() == 0) {
-					continue;
-				}
-				MusicGroupPaymentStudentCourseDetail musicGroupPaymentStudentCourseDetail = new MusicGroupPaymentStudentCourseDetail();
-				musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalender.getId());
-				musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderDetailId(musicGroupPaymentCalenderDetail.getId());
-				musicGroupPaymentStudentCourseDetail.setUserId(studentPaymentOrder.getUserId());
-				musicGroupPaymentStudentCourseDetail.setCourseType(courseSetting.getCourseType());
-				musicGroupPaymentStudentCourseDetail.setTotalCourseMinutes(courseSetting.getCourseTotalMinuties());
-				musicGroupPaymentStudentCourseDetail.setCourseOriginalPrice(courseSetting.getCourseOriginalPrice());
-				musicGroupPaymentStudentCourseDetail.setCourseCurrentPrice(courseSetting.getCourseCurrentPrice());
-				musicGroupPaymentStudentCourseDetail.setUsedCourseMinutes(0);
-				musicGroupPaymentStudentCourseDetail.setCreateTime(nowDate);
-				musicGroupPaymentStudentCourseDetail.setUpdateTime(nowDate);
-				musicGroupPaymentStudentCourseDetail.setTenantId(tenantId);
-				musicGroupPaymentStudentCourseDetails.add(musicGroupPaymentStudentCourseDetail);
-			}
-			if (musicGroupPaymentStudentCourseDetails.size() > 0) {
-				musicGroupPaymentStudentCourseDetailDao.batchInsert(musicGroupPaymentStudentCourseDetails);
-			}
-		}
+        Date nowDate = new Date();
+        Integer tenantId = studentPaymentOrder.getTenantId();
+        //缴费详情 calender detail
+        MusicGroupPaymentCalender musicGroupPaymentCalender = musicGroupPaymentCalenderService.get(studentPaymentOrder.getCalenderId());
+        Long currentPaymentCalenderId = studentPaymentOrder.getCalenderId();
+        //查询缴费项目关联的订单
+        List<StudentPaymentOrder> orderList = studentPaymentOrderDao.findByCalenderId(currentPaymentCalenderId, studentPaymentOrder.getUserId());
+        if (orderList.size() == 1) {
+            // 更新实际缴费人数
+            if (musicGroupPaymentCalender.getActualNum() == null) {
+                musicGroupPaymentCalender.setActualNum(1);
+            } else {
+                musicGroupPaymentCalender.setActualNum(musicGroupPaymentCalender.getActualNum() + 1);
+            }
+            if (musicGroupPaymentCalender.getPaymentType() == MusicGroupPaymentCalender.PaymentType.MUSIC_APPLY) {
+                if (musicGroupPaymentCalender.getExpectNum() == null) {
+                    musicGroupPaymentCalender.setExpectNum(1);
+                } else {
+                    musicGroupPaymentCalender.setExpectNum(musicGroupPaymentCalender.getExpectNum() + 1);
+                }
+            }
+            musicGroupPaymentCalender.setUpdateTime(nowDate);
+            musicGroupPaymentCalenderDao.update(musicGroupPaymentCalender);
+        }
+
+        MusicGroupPaymentCalenderDetail musicGroupPaymentCalenderDetail = musicGroupPaymentCalenderDetailDao.findByCalenderIdAndUserId(currentPaymentCalenderId, studentPaymentOrder.getUserId());
+        if (musicGroupPaymentCalenderDetail == null) {
+            musicGroupPaymentCalenderDetail = new MusicGroupPaymentCalenderDetail();
+            musicGroupPaymentCalenderDetail.setTenantId(tenantId);
+            musicGroupPaymentCalenderDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalender.getId());
+            musicGroupPaymentCalenderDetail.setUserId(studentPaymentOrder.getUserId());
+            musicGroupPaymentCalenderDetail.setResponsibleUserId(musicGroupPaymentCalender.getOperator());
+            musicGroupPaymentCalenderDetail.setPaymentStatus(PAID_COMPLETED);
+            musicGroupPaymentCalenderDetail.setPayTime(nowDate);
+            musicGroupPaymentCalenderDetail.setPaymentOrderId(studentPaymentOrder.getId());
+            musicGroupPaymentCalenderDetail.setUseInCourse(0);
+            musicGroupPaymentCalenderDetail.setOpen(1);
+            musicGroupPaymentCalenderDetail.setUserStatus(null);
+            musicGroupPaymentCalenderDetail.setDeadlinePaymentDate(musicGroupPaymentCalender.getDeadlinePaymentDate());
+            musicGroupPaymentCalenderDetail.setStartPaymentDate(musicGroupPaymentCalender.getStartPaymentDate());
+            musicGroupPaymentCalenderDetail.setCreateTime(nowDate);
+            musicGroupPaymentCalenderDetail.setUpdateTime(nowDate);
+            musicGroupPaymentCalenderDetailDao.insert(musicGroupPaymentCalenderDetail);
+        } else {
+            musicGroupPaymentCalenderDetail.setPaymentStatus(PAID_COMPLETED);
+            musicGroupPaymentCalenderDetail.setPayTime(nowDate);
+            musicGroupPaymentCalenderDetail.setPaymentOrderId(studentPaymentOrder.getId());
+            musicGroupPaymentCalenderDetailDao.update(musicGroupPaymentCalenderDetail);
+        }
+
+        //续费项目加学员时就生成了课程时长,报名项目在缴费成功后才需要添加课程时长
+        if (musicGroupPaymentCalender.getPaymentType() == MusicGroupPaymentCalender.PaymentType.MUSIC_APPLY) {
+            List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetails = new ArrayList<>();
+            List<String> orderDetailTypes = studentPaymentOrderDetailDao.getOrderDetailType(studentPaymentOrder.getId());
+            List<MusicGroupPaymentCalenderCourseSettings> courseSettingsList = musicGroupPaymentCalenderCourseSettingsDao
+                    .getWithPaymentCalender(musicGroupPaymentCalender.getId());
+            for (MusicGroupPaymentCalenderCourseSettings courseSetting : courseSettingsList) {
+                if (musicGroupPaymentCalender.getPayUserType().equals(MusicGroupPaymentCalender.PayUserType.STUDENT)
+                        && !orderDetailTypes.contains(courseSetting.getCourseType().getCode())) {
+                    continue;
+                }
+                if (courseSetting.getCourseTotalMinuties() == null || courseSetting.getCourseTotalMinuties() == 0) {
+                    continue;
+                }
+                MusicGroupPaymentStudentCourseDetail musicGroupPaymentStudentCourseDetail = new MusicGroupPaymentStudentCourseDetail();
+                musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalender.getId());
+                musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderDetailId(musicGroupPaymentCalenderDetail.getId());
+                musicGroupPaymentStudentCourseDetail.setUserId(studentPaymentOrder.getUserId());
+                musicGroupPaymentStudentCourseDetail.setCourseType(courseSetting.getCourseType());
+                musicGroupPaymentStudentCourseDetail.setTotalCourseMinutes(courseSetting.getCourseTotalMinuties());
+                musicGroupPaymentStudentCourseDetail.setCourseOriginalPrice(courseSetting.getCourseOriginalPrice());
+                musicGroupPaymentStudentCourseDetail.setCourseCurrentPrice(courseSetting.getCourseCurrentPrice());
+                musicGroupPaymentStudentCourseDetail.setUsedCourseMinutes(0);
+                musicGroupPaymentStudentCourseDetail.setCreateTime(nowDate);
+                musicGroupPaymentStudentCourseDetail.setUpdateTime(nowDate);
+                musicGroupPaymentStudentCourseDetail.setTenantId(tenantId);
+                musicGroupPaymentStudentCourseDetails.add(musicGroupPaymentStudentCourseDetail);
+            }
+            if (musicGroupPaymentStudentCourseDetails.size() > 0) {
+                musicGroupPaymentStudentCourseDetailDao.batchInsert(musicGroupPaymentStudentCourseDetails);
+            }
+        }
     }
 }

+ 131 - 108
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java

@@ -146,10 +146,10 @@ public class StudentManageServiceImpl implements StudentManageService {
         //用户协议
         List<SysUserContracts> userAllContract = sysUserContractsDao.getUserAllContract(new ArrayList<>(userIds));
         Map<Integer, Set<Integer>> userContractVersionMap = new HashMap<>();
-        if(!CollectionUtils.isEmpty(userAllContract)){
+        if (!CollectionUtils.isEmpty(userAllContract)) {
             userContractVersionMap = userAllContract.stream().collect(Collectors.groupingBy(SysUserContracts::getUserId, Collectors.mapping(SysUserContracts::getVersion, Collectors.toSet())));
         }
-        Map<Long,String> cloudMap = MapUtil.convertMybatisMap(cloudTeacherOrderService.queryNoStartByUserIds(userIds,null));
+        Map<Long, String> cloudMap = MapUtil.convertMybatisMap(cloudTeacherOrderService.queryNoStartByUserIds(userIds, null));
         //List<Subject> studentSubject = studentManageDao.getStudentSubject(userIds);
         StudentListCourseDto studentListCourseDto = null;
         //获取所在乐团
@@ -198,20 +198,20 @@ public class StudentManageServiceImpl implements StudentManageService {
                 dto.setHasPracticeCourse(YesOrNoEnum.NO);
             }
             //如果会员已过期、是否有未生效的会员
-            if(dto.getMemberRankSettingId() == null){
+            if (dto.getMemberRankSettingId() == null) {
                 String s = cloudMap.get(dto.getUserId().longValue());
-                if(StringUtils.isNotEmpty(s)){
+                if (StringUtils.isNotEmpty(s)) {
                     dto.setHasNoStartCloudTeacher(true);
                 }
             }
 
-            if(userContractVersionMap.containsKey(dto.getUserId())){
+            if (userContractVersionMap.containsKey(dto.getUserId())) {
                 dto.setIsSignedContract(true);
-            }else{
+            } else {
                 dto.setIsSignedContract(false);
             }
             //年级
-            dto.setCurrentGrade(studentService.getStudentGrade(dto.getGradeType(),dto.getCurrentGradeNum()));
+            dto.setCurrentGrade(studentService.getStudentGrade(dto.getGradeType(), dto.getCurrentGradeNum()));
         }
         pageInfo.setRows(dataList);
         return pageInfo;
@@ -255,6 +255,7 @@ public class StudentManageServiceImpl implements StudentManageService {
         pageInfo.setRows(dataList);
         return pageInfo;
     }
+
     @Override
     public PageInfo<SimpleUserDto> queryStudentsWithTeacherByOrganId(StudentManageQueryInfo queryInfo) {
         PageInfo<SimpleUserDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
@@ -302,7 +303,7 @@ public class StudentManageServiceImpl implements StudentManageService {
             dataList = studentPaymentOrderDao.queryDouble11Students(params);
             SysConfig vipSpecialActivityConfig = sysConfigService.findByParamName(SysConfigService.VIP_SPECIAL_ACTIVITY_IDS);
             Map<Integer, StudentVipDouble11Dto> studentCourseTimeMap = new HashMap<>();
-            if(Objects.nonNull(vipSpecialActivityConfig)&&StringUtils.isNotBlank(vipSpecialActivityConfig.getParanValue())){
+            if (Objects.nonNull(vipSpecialActivityConfig) && StringUtils.isNotBlank(vipSpecialActivityConfig.getParanValue())) {
                 Set<Integer> studentIds = dataList.stream().map(StudentVipDouble11Dto::getUserId).collect(Collectors.toSet());
                 Set<Integer> specialActivityIds = Arrays.stream(vipSpecialActivityConfig.getParanValue().split(",")).map(Integer::valueOf).collect(Collectors.toSet());
                 List<StudentVipDouble11Dto> studentCourseTimeList = courseScheduleStudentPaymentDao.countStudentDouble11CourseTime(new ArrayList<>(studentIds), new ArrayList<>(specialActivityIds));
@@ -310,12 +311,12 @@ public class StudentManageServiceImpl implements StudentManageService {
             }
             for (StudentVipDouble11Dto studentVipDouble11Dto : dataList) {
                 StudentVipDouble11Dto studentCourseTime = studentCourseTimeMap.get(studentVipDouble11Dto.getUserId());
-                studentVipDouble11Dto.setCourseOneToOneTime(studentVipDouble11Dto.getPaymentOneToOneTime()*20-(Objects.isNull(studentCourseTime)?0:studentCourseTime.getCourseOneToOneTime()));
-                if(studentVipDouble11Dto.getCourseOneToOneTime()<0){
+                studentVipDouble11Dto.setCourseOneToOneTime(studentVipDouble11Dto.getPaymentOneToOneTime() * 20 - (Objects.isNull(studentCourseTime) ? 0 : studentCourseTime.getCourseOneToOneTime()));
+                if (studentVipDouble11Dto.getCourseOneToOneTime() < 0) {
                     studentVipDouble11Dto.setCourseOneToOneTime(0);
                 }
-                studentVipDouble11Dto.setCourseOneToTwoTime(studentVipDouble11Dto.getPaymentOneToTwoTime()*20-(Objects.isNull(studentCourseTime)?0:studentCourseTime.getCourseOneToTwoTime()));
-                if(studentVipDouble11Dto.getCourseOneToTwoTime()<0){
+                studentVipDouble11Dto.setCourseOneToTwoTime(studentVipDouble11Dto.getPaymentOneToTwoTime() * 20 - (Objects.isNull(studentCourseTime) ? 0 : studentCourseTime.getCourseOneToTwoTime()));
+                if (studentVipDouble11Dto.getCourseOneToTwoTime() < 0) {
                     studentVipDouble11Dto.setCourseOneToTwoTime(0);
                 }
             }
@@ -330,19 +331,19 @@ public class StudentManageServiceImpl implements StudentManageService {
         List<StudentVipDouble11Dto> studentsDouble11Infos = studentPaymentOrderDao.findStudentsDouble11Infos(studentIds);
         SysConfig vipSpecialActivityConfig = sysConfigService.findByParamName(SysConfigService.VIP_SPECIAL_ACTIVITY_IDS);
         Map<Integer, StudentVipDouble11Dto> studentCourseTimeMap = new HashMap<>();
-        if(Objects.nonNull(vipSpecialActivityConfig)&&StringUtils.isNotBlank(vipSpecialActivityConfig.getParanValue())){
+        if (Objects.nonNull(vipSpecialActivityConfig) && StringUtils.isNotBlank(vipSpecialActivityConfig.getParanValue())) {
             Set<Integer> specialActivityIds = Arrays.stream(vipSpecialActivityConfig.getParanValue().split(",")).map(Integer::valueOf).collect(Collectors.toSet());
             List<StudentVipDouble11Dto> studentCourseTimeList = courseScheduleStudentPaymentDao.countStudentDouble11CourseTime(studentIds, new ArrayList<>(specialActivityIds));
             studentCourseTimeMap = studentCourseTimeList.stream().collect(Collectors.toMap(StudentVipDouble11Dto::getUserId, s -> s));
         }
         for (StudentVipDouble11Dto studentVipDouble11Dto : studentsDouble11Infos) {
             StudentVipDouble11Dto studentCourseTime = studentCourseTimeMap.get(studentVipDouble11Dto.getUserId());
-            studentVipDouble11Dto.setCourseOneToOneTime(studentVipDouble11Dto.getPaymentOneToOneTime()*20-(Objects.isNull(studentCourseTime)?0:studentCourseTime.getCourseOneToOneTime()));
-            if(studentVipDouble11Dto.getCourseOneToOneTime()<0){
+            studentVipDouble11Dto.setCourseOneToOneTime(studentVipDouble11Dto.getPaymentOneToOneTime() * 20 - (Objects.isNull(studentCourseTime) ? 0 : studentCourseTime.getCourseOneToOneTime()));
+            if (studentVipDouble11Dto.getCourseOneToOneTime() < 0) {
                 studentVipDouble11Dto.setCourseOneToOneTime(0);
             }
-            studentVipDouble11Dto.setCourseOneToTwoTime(studentVipDouble11Dto.getPaymentOneToTwoTime()*20-(Objects.isNull(studentCourseTime)?0:studentCourseTime.getCourseOneToTwoTime()));
-            if(studentVipDouble11Dto.getCourseOneToTwoTime()<0){
+            studentVipDouble11Dto.setCourseOneToTwoTime(studentVipDouble11Dto.getPaymentOneToTwoTime() * 20 - (Objects.isNull(studentCourseTime) ? 0 : studentCourseTime.getCourseOneToTwoTime()));
+            if (studentVipDouble11Dto.getCourseOneToTwoTime() < 0) {
                 studentVipDouble11Dto.setCourseOneToTwoTime(0);
             }
         }
@@ -488,31 +489,31 @@ public class StudentManageServiceImpl implements StudentManageService {
         MapUtil.populateMap(params, queryInfo);
         List<MusicGroupStudentsDto> dataList = new ArrayList<>();
         List<StudentRegistration> studentRegistrations = studentRegistrationDao.getMusicGroupStu(queryInfo.getMusicGroupId());
-        if(studentRegistrations.size() == 0){
+        if (studentRegistrations.size() == 0) {
             return pageInfo;
         }
         List<Integer> userIds = studentRegistrations.stream().map(e -> e.getUserId()).collect(Collectors.toList());
-        if(queryInfo.getHasCourse() != null){
+        if (queryInfo.getHasCourse() != null) {
             //有剩余课程的学员
-            List<Integer> hasCourseStudent = courseScheduleDao.findHasCourseStudent(userIds,"VIP,PRACTICE");
-            if(queryInfo.getHasCourse()){
+            List<Integer> hasCourseStudent = courseScheduleDao.findHasCourseStudent(userIds, "VIP,PRACTICE");
+            if (queryInfo.getHasCourse()) {
                 userIds = hasCourseStudent;
-            }else {
+            } else {
                 userIds.removeAll(hasCourseStudent);
             }
         }
-        if(userIds.size() > 0 && queryInfo.getOweFlag() != null){
-            List<Integer> studentIds = musicGroupPaymentCalenderDetailDao.queryNoPaymentUserIds(queryInfo.getMusicGroupId(),userIds,null);
-            if(queryInfo.getOweFlag()){
+        if (userIds.size() > 0 && queryInfo.getOweFlag() != null) {
+            List<Integer> studentIds = musicGroupPaymentCalenderDetailDao.queryNoPaymentUserIds(queryInfo.getMusicGroupId(), userIds, null);
+            if (queryInfo.getOweFlag()) {
                 userIds = studentIds;
-            }else {
+            } else {
                 userIds.removeAll(studentIds);
             }
         }
-        if(userIds.size() == 0){
+        if (userIds.size() == 0) {
             return pageInfo;
         }
-        params.put("userIds",userIds);
+        params.put("userIds", userIds);
         int count = studentManageDao.countMusicGroupStudent(params);
         if (queryInfo.getIsExport() && count > 50000) {
             throw new BizException("数据集太大,不能导出.最大数据集不能超过50000");
@@ -522,7 +523,7 @@ public class StudentManageServiceImpl implements StudentManageService {
             params.put("offset", pageInfo.getOffset());
             dataList = studentManageDao.queryMusicGroupStudent(params);
             //获取乐团学员欠费金额
-            Map<Integer,BigDecimal> totalAmountMap = MapUtil.convertIntegerMap(musicGroupPaymentCalenderDetailDao.queryNoPaymentTotalAmount(queryInfo.getMusicGroupId()));
+            Map<Integer, BigDecimal> totalAmountMap = MapUtil.convertIntegerMap(musicGroupPaymentCalenderDetailDao.queryNoPaymentTotalAmount(queryInfo.getMusicGroupId()));
             //退团的学生
             List<Integer> quitUserIds = dataList.stream().filter(e -> e.getStudentStatus().equals("QUIT")).map(MusicGroupStudentsDto::getUserId).collect(Collectors.toList());
             if (quitUserIds.size() > 0) {
@@ -535,23 +536,23 @@ public class StudentManageServiceImpl implements StudentManageService {
                 }
             }
             List<Integer> collect = dataList.stream().map(e -> e.getUserId()).collect(Collectors.toList());
-            List<Integer> hasCourseStudent = courseScheduleDao.findHasCourseStudent(collect,"VIP,PRACTICE");
+            List<Integer> hasCourseStudent = courseScheduleDao.findHasCourseStudent(collect, "VIP,PRACTICE");
             List<SubjectChange> waitPayChange = subjectChangeDao.getMusicGroupWaitPay(queryInfo.getMusicGroupId());
             Map<Integer, List<SubjectChange>> studentWaitPayChange = waitPayChange.stream().collect(Collectors.groupingBy(SubjectChange::getStudentId));
             //查询是否有有效期内乐保
-            List<StudentInstrument> studentsMaintenanceNum = studentInstrumentDao.getStudentsMaintenanceNum(collect,queryInfo.getMusicGroupId());
+            List<StudentInstrument> studentsMaintenanceNum = studentInstrumentDao.getStudentsMaintenanceNum(collect, queryInfo.getMusicGroupId());
             Map<Integer, Integer> studentMaintenanceMap = studentsMaintenanceNum.stream().collect(Collectors.toMap(StudentInstrument::getStudentId, StudentInstrument::getGoodsId));
 
             //查询云教练订单
             List<CloudTeacherOrder> studentCloudTeacherOrders = cloudTeacherOrderService.getStudentCloudTeacherOrders(collect, queryInfo.getMusicGroupId());
             Map<Integer, List<CloudTeacherOrder>> studentCloudTeacherMap = studentCloudTeacherOrders.stream().collect(Collectors.groupingBy(CloudTeacherOrder::getStudentId));
             Date nowDate = new Date();
-            Map<Long,String> cloudMap = MapUtil.convertMybatisMap(cloudTeacherOrderService.queryNoStartByUserIds(new HashSet<>(collect),null));
-            dataList.forEach(e->{
+            Map<Long, String> cloudMap = MapUtil.convertMybatisMap(cloudTeacherOrderService.queryNoStartByUserIds(new HashSet<>(collect), null));
+            dataList.forEach(e -> {
                 //如果会员已过期、是否有未生效的会员
-                if(e.getMemberRankSettingId() == null){
+                if (e.getMemberRankSettingId() == null) {
                     String s = cloudMap.get(e.getUserId().longValue());
-                    if(StringUtils.isNotEmpty(s)){
+                    if (StringUtils.isNotEmpty(s)) {
                         e.setHasNoStartCloudTeacher(true);
                     }
                 }
@@ -560,16 +561,16 @@ public class StudentManageServiceImpl implements StudentManageService {
                 if (studentWaitPayChange.containsKey(e.getUserId())) {
                     e.setSubjectChange(studentWaitPayChange.get(e.getUserId()).get(0));
                 }
-                if(studentMaintenanceMap.containsKey(e.getUserId())){
+                if (studentMaintenanceMap.containsKey(e.getUserId())) {
                     e.setHasMaintenance(true);
                 }
                 if (studentCloudTeacherMap.containsKey(e.getUserId())) {
                     List<CloudTeacherOrder> cloudTeacherOrders = studentCloudTeacherMap.get(e.getUserId());
-                    if(cloudTeacherOrders != null && cloudTeacherOrders.size() > 0){
+                    if (cloudTeacherOrders != null && cloudTeacherOrders.size() > 0) {
                         BigDecimal cloudAmount = BigDecimal.ZERO;
                         for (CloudTeacherOrder cloudTeacherOrder : cloudTeacherOrders) {
-                            if (cloudTeacherOrder.getEndTime() == null || DateUtil.stringToDate(DateUtil.format(cloudTeacherOrder.getEndTime(),DateUtil.ISO_EXPANDED_DATE_FORMAT),DateUtil.ISO_EXPANDED_DATE_FORMAT).compareTo(
-                                    DateUtil.stringToDate(DateUtil.format(nowDate,DateUtil.ISO_EXPANDED_DATE_FORMAT),DateUtil.ISO_EXPANDED_DATE_FORMAT)) >= 0) {
+                            if (cloudTeacherOrder.getEndTime() == null || DateUtil.stringToDate(DateUtil.format(cloudTeacherOrder.getEndTime(), DateUtil.ISO_EXPANDED_DATE_FORMAT), DateUtil.ISO_EXPANDED_DATE_FORMAT).compareTo(
+                                    DateUtil.stringToDate(DateUtil.format(nowDate, DateUtil.ISO_EXPANDED_DATE_FORMAT), DateUtil.ISO_EXPANDED_DATE_FORMAT)) >= 0) {
                                 cloudAmount = cloudAmount.add(cloudTeacherOrder.getAmount());
                             }
                         }
@@ -594,17 +595,17 @@ public class StudentManageServiceImpl implements StudentManageService {
         //未完成vip、网管课学员数量/该乐团在读学员人数*100%
         List<StudentRegistration> studentRegistrations = studentRegistrationDao.getMusicGroupStu(musicGroupId);
         List<Integer> userIds = studentRegistrations.stream().filter(e -> e.getMusicGroupStatus() == StudentMusicGroupStatusEnum.NORMAL).map(StudentRegistration::getUserId).collect(Collectors.toList());
-        if(userIds.size() == 0){
-            resultMap.put("courseRate","0.00%");
+        if (userIds.size() == 0) {
+            resultMap.put("courseRate", "0.00%");
             return resultMap;
         }
-        List<Integer> hasCourseStudent = courseScheduleDao.findHasCourseStudent(userIds,"VIP,PRACTICE");
+        List<Integer> hasCourseStudent = courseScheduleDao.findHasCourseStudent(userIds, "VIP,PRACTICE");
         double size = userIds.size() + 0d;
-        if(hasCourseStudent.size() == 0){
-            resultMap.put("courseRate","0.00%");
-        }else {
+        if (hasCourseStudent.size() == 0) {
+            resultMap.put("courseRate", "0.00%");
+        } else {
             double d = (hasCourseStudent.size() / size) * 100;
-            resultMap.put("courseRate",String.format("%.2f", d) + "%");
+            resultMap.put("courseRate", String.format("%.2f", d) + "%");
         }
         return resultMap;
     }
@@ -639,7 +640,7 @@ public class StudentManageServiceImpl implements StudentManageService {
     public void updateUser(SysUser sysUser) {
         studentManageDao.updateUser(sysUser);
         Student student = studentDao.get(sysUser.getId());
-        if(student != null) {
+        if (student != null) {
             student.setCurrentGradeNum(sysUser.getCurrentGradeNum());
             student.setCurrentClass(sysUser.getCurrentClass());
             Optional.ofNullable(sysUser.getSubjectId()).ifPresent(student::setSubjectIdList);
@@ -684,7 +685,7 @@ public class StudentManageServiceImpl implements StudentManageService {
         Date date = new Date();
         SysUser sysUser = teacherDao.getUserWithPhone(student.getPhone());
         if (sysUser != null) {
-            EmployeeServiceImpl.checkTenantId(student.getTenantId(),sysUser.getTenantId());
+            EmployeeServiceImpl.checkTenantId(student.getTenantId(), sysUser.getTenantId());
             if (sysUser.getUserType().contains("STUDENT")) {
                 throw new BizException("手机号已被占用");
             } else {
@@ -736,13 +737,13 @@ public class StudentManageServiceImpl implements StudentManageService {
         // 同步更新机构手机号 如果它存在
         SysUser user = teacherDao.getUser(student.getId());
         tenantInfoService.updatePhone(student.getPhone(), user.getPhone());
-        activityUserMapperDao.updateTeacherId(student.getUserId(),student.getTeacherId());
-        if(Objects.nonNull(student.getCarePackage())||Objects.nonNull(student.getComeOnPackage())){
+        activityUserMapperDao.updateTeacherId(student.getUserId(), student.getTeacherId());
+        if (Objects.nonNull(student.getCarePackage()) || Objects.nonNull(student.getComeOnPackage())) {
             Student oldStudent = studentDao.get(userId);
-            if(Objects.nonNull(oldStudent.getCarePackage())&&oldStudent.getCarePackage().equals(2)){
+            if (Objects.nonNull(oldStudent.getCarePackage()) && oldStudent.getCarePackage().equals(2)) {
                 student.setCarePackage(oldStudent.getCarePackage());
             }
-            if(Objects.nonNull(oldStudent.getComeOnPackage())&&oldStudent.getComeOnPackage().equals(2)){
+            if (Objects.nonNull(oldStudent.getComeOnPackage()) && oldStudent.getComeOnPackage().equals(2)) {
                 student.setComeOnPackage(oldStudent.getComeOnPackage());
             }
         }
@@ -752,8 +753,8 @@ public class StudentManageServiceImpl implements StudentManageService {
             LocalDate monDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
             studentExtracurricularExercisesSituationService.deleteByStudent(student.getId(), monDayDate.toString());
         }
-        webFeignService.updateNickName(userId,student.getUsername());
-        imFeignService.update(new ImUserModel(userId.toString(),student.getUsername(),sysUser1 == null ? null:sysUser1.getAvatar()));
+        webFeignService.updateNickName(userId, student.getUsername());
+        imFeignService.update(new ImUserModel(userId.toString(), student.getUsername(), sysUser1 == null ? null : sysUser1.getAvatar()));
         return userId;
     }
 
@@ -784,9 +785,9 @@ public class StudentManageServiceImpl implements StudentManageService {
         studentNum = studentNum == null ? 0 : studentNum;
         signInNum = signInNum == null ? 0 : signInNum;
         leaveNum = leaveNum == null ? 0 : leaveNum;
-        if(Objects.nonNull(courseSchedule)&& !CourseStatusEnum.NOT_START.equals(courseSchedule.getStatus())){
+        if (Objects.nonNull(courseSchedule) && !CourseStatusEnum.NOT_START.equals(courseSchedule.getStatus())) {
             sum.put("truantNum", studentNum - signInNum - leaveNum);
-        }else{
+        } else {
             sum.put("truantNum", 0);
         }
         sum.put("homeworkNum", studentManageDao.countHomeworkNum(courseScheduleId));
@@ -813,14 +814,14 @@ public class StudentManageServiceImpl implements StudentManageService {
 
             List<UserGroupDto> allUserGroups = studentRegistrationDao.getUserGroups(new ArrayList<>(studentIds));
             Map<Integer, List<UserGroupDto>> userGroupsMap = new HashMap<>();
-            if(!CollectionUtils.isEmpty(allUserGroups)){
+            if (!CollectionUtils.isEmpty(allUserGroups)) {
                 userGroupsMap = allUserGroups.stream().collect(Collectors.groupingBy(UserGroupDto::getUserId));
             }
 
             for (Student4operating student4operating : dataList) {
                 List<UserGroupDto> userGroupDtos = userGroupsMap.get(student4operating.getStudentId());
-                if(!CollectionUtils.isEmpty(userGroupDtos)){
-                    student4operating.setGroupNames(userGroupDtos.stream().filter(ug->StringUtils.isNotBlank(ug.getGroupName())).map(UserGroupDto::getGroupName).sorted().collect(Collectors.joining(",")));
+                if (!CollectionUtils.isEmpty(userGroupDtos)) {
+                    student4operating.setGroupNames(userGroupDtos.stream().filter(ug -> StringUtils.isNotBlank(ug.getGroupName())).map(UserGroupDto::getGroupName).sorted().collect(Collectors.joining(",")));
                 }
             }
         }
@@ -829,14 +830,14 @@ public class StudentManageServiceImpl implements StudentManageService {
     }
 
     @Override
-    public List<BasicUserDto> queryCanAddStudent(String musicGroupId, String batchNo,String search,Integer subjectId) {
-        return studentManageDao.queryCanAddStudent(musicGroupId, batchNo,search,subjectId);
+    public List<BasicUserDto> queryCanAddStudent(String musicGroupId, String batchNo, String search, Integer subjectId) {
+        return studentManageDao.queryCanAddStudent(musicGroupId, batchNo, search, subjectId);
     }
 
     @Override
     public PageInfo<BasicUserDto> queryGroupStudents(StudentQueryInfo queryInfo) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if(sysUser == null || sysUser.getId() == null){
+        if (sysUser == null || sysUser.getId() == null) {
             throw new BizException("用户信息获取失败");
         }
         PageInfo<BasicUserDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
@@ -845,17 +846,17 @@ public class StudentManageServiceImpl implements StudentManageService {
         MapUtil.populateMap(params, queryInfo);
         params.put("offset", pageInfo.getOffset());
         Integer count = 0;
-        if("VIP".equals(queryInfo.getGroupType())){
+        if ("VIP".equals(queryInfo.getGroupType())) {
             count = studentManageDao.countVipGroupStudents(params);
-        }else {
+        } else {
             count = studentManageDao.countPracticeGroupStudents(params);
         }
         List<BasicUserDto> dataList = new ArrayList<>();
         if (count > 0) {
             pageInfo.setTotal(count);
-            if("VIP".equals(queryInfo.getGroupType())){
+            if ("VIP".equals(queryInfo.getGroupType())) {
                 dataList = studentManageDao.queryVipGroupStudents(params);
-            }else {
+            } else {
                 dataList = studentManageDao.queryPracticeGroupStudents(params);
             }
         }
@@ -866,7 +867,7 @@ public class StudentManageServiceImpl implements StudentManageService {
     @Override
     public PageInfo<StudentNoStartCoursesDto> queryStudentNoStartCourse(StudentQueryInfo queryInfo) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if(sysUser == null || sysUser.getId() == null){
+        if (sysUser == null || sysUser.getId() == null) {
             throw new BizException("用户信息获取失败");
         }
         PageInfo<StudentNoStartCoursesDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
@@ -885,13 +886,35 @@ public class StudentManageServiceImpl implements StudentManageService {
     }
 
     @Override
-    public List<StudentSubTotalCourseTimesDto> queryStudentSubTotalCourseTimes(String musicGroupId) {
-        List<StudentSubTotalCourseTimesDto> timesDtos = musicGroupPaymentStudentCourseDetailDao.queryStudentSubTotalCourseTimes(musicGroupId);
-        Map<Integer,String> classMap = MapUtil.convertMybatisMap(classGroupDao.queryStudentClassGroupMap(musicGroupId));
-        for (StudentSubTotalCourseTimesDto timesDto : timesDtos) {
-            timesDto.setClassGroupId(classMap.get(timesDto.getUserId()));
+    public Integer countStudentSubTotalCourseTimes(StudentSubTotalCourseTimesQueryInfo queryInfo) {
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+        return musicGroupPaymentStudentCourseDetailDao.countStudentSubTotalCourseTimes(params);
+    }
+
+    @Override
+    public PageInfo<StudentSubTotalCourseTimesDto> queryStudentSubTotalCourseTimes(StudentSubTotalCourseTimesQueryInfo queryInfo) {
+        PageInfo<StudentSubTotalCourseTimesDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+        params.put("offset", pageInfo.getOffset());
+
+        int count = musicGroupPaymentStudentCourseDetailDao.countStudentSubTotalCourseTimes(params);
+        List<StudentSubTotalCourseTimesDto> dataList = new ArrayList<>();
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            dataList = musicGroupPaymentStudentCourseDetailDao.pageStudentSubTotalCourseTimes(params);
+            //内部分页
+            int endIdx = pageInfo.getPageNo() * pageInfo.getLimit();
+            dataList = dataList.subList(pageInfo.getOffset(), dataList.size() > endIdx ? endIdx : dataList.size());
+
+            Map<Integer, String> classMap = MapUtil.convertMybatisMap(classGroupDao.queryStudentClassGroupMap(queryInfo.getMusicGroupId()));
+            for (StudentSubTotalCourseTimesDto timesDto : dataList) {
+                timesDto.setClassGroupId(classMap.get(timesDto.getUserId()));
+            }
         }
-        return timesDtos;
+        pageInfo.setRows(dataList);
+        return pageInfo;
     }
 
     @Override
@@ -902,7 +925,7 @@ public class StudentManageServiceImpl implements StudentManageService {
 
         Integer tenantId = TenantContextHolder.getTenantId();
         String studentErrorLeaveNum = sysTenantConfigService.getTenantConfigValue(SysConfigService.STUDENT_ERROR_LEAVE_NUM, tenantId);
-        if(StringUtils.isEmpty(studentErrorLeaveNum)){
+        if (StringUtils.isEmpty(studentErrorLeaveNum)) {
             return pageInfo;
         }
         Map<String, Object> params = new HashMap<>();
@@ -914,21 +937,21 @@ public class StudentManageServiceImpl implements StudentManageService {
         params.put("currentMonth", currentMonth);
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         //当前用户是否是分部经理
-        Boolean onlyForRole = employeePositionService.onlyForRole(SysUserRoleEnum.EDUCATION,sysUser.getId(),sysUser.getIsSuperAdmin());
+        Boolean onlyForRole = employeePositionService.onlyForRole(SysUserRoleEnum.EDUCATION, sysUser.getId(), sysUser.getIsSuperAdmin());
         if (onlyForRole) {
             //获取教务老师关联的班级列表
             List<Long> classGroupIds = classGroupDao.queryGroupClassGroupIds(sysUser.getId());
-            if(classGroupIds == null || classGroupIds.size() == 0){
+            if (classGroupIds == null || classGroupIds.size() == 0) {
                 return pageInfo;
             }
             params.put("classGroupIds", classGroupIds);
         }
-        params.put("studentErrorLeaveNum",studentErrorLeaveNum);
+        params.put("studentErrorLeaveNum", studentErrorLeaveNum);
         int count = indexBaseMonthDataDao.countStudentErrorLeave1(params);
         List<StudentErrorLeaveDto> dataList = new ArrayList<>();
         if (count > 0) {
             //获取近两个月异常请假次数
-            Map<Integer,BigDecimal> leaveNumMap = MapUtil.convertIntegerMap(indexBaseMonthDataDao.getStudentErrorLeaveNumMap(params));
+            Map<Integer, BigDecimal> leaveNumMap = MapUtil.convertIntegerMap(indexBaseMonthDataDao.getStudentErrorLeaveNumMap(params));
             pageInfo.setTotal(count);
             dataList = indexBaseMonthDataDao.queryStudentErrorLeave(params);
             for (StudentErrorLeaveDto studentErrorLeaveDto : dataList) {
@@ -960,47 +983,47 @@ public class StudentManageServiceImpl implements StudentManageService {
     @Transactional(rollbackFor = Exception.class)
     public void updateChildrenDayStudent(ActivityCourseDetailDto activityCourseDetailDto) {
         Student student = studentDao.getLocked(activityCourseDetailDto.getUserId());
-        if(student == null){
+        if (student == null) {
             throw new BizException("学员信息不存在");
         }
-        if(!activityCourseDetailDto.getVip1().equals(0) && !activityCourseDetailDto.getVip1().equals(1)){
+        if (!activityCourseDetailDto.getVip1().equals(0) && !activityCourseDetailDto.getVip1().equals(1)) {
             throw new BizException("修改失败:排课次数异常");
         }
-        if(!activityCourseDetailDto.getVip2().equals(0) && !activityCourseDetailDto.getVip2().equals(1)){
+        if (!activityCourseDetailDto.getVip2().equals(0) && !activityCourseDetailDto.getVip2().equals(1)) {
             throw new BizException("修改失败:排课次数异常");
         }
-        if(!activityCourseDetailDto.getFree_vip().equals(0) && !activityCourseDetailDto.getFree_vip().equals(1)){
+        if (!activityCourseDetailDto.getFree_vip().equals(0) && !activityCourseDetailDto.getFree_vip().equals(1)) {
             throw new BizException("修改失败:排课次数异常");
         }
-        if(!activityCourseDetailDto.getMusic_theory().equals(0) && !activityCourseDetailDto.getMusic_theory().equals(1)){
+        if (!activityCourseDetailDto.getMusic_theory().equals(0) && !activityCourseDetailDto.getMusic_theory().equals(1)) {
             throw new BizException("修改失败:排课次数异常");
         }
-        if(activityCourseDetailDto.getMusic_theory().equals(1)){
+        if (activityCourseDetailDto.getMusic_theory().equals(1)) {
             String activityCourseDetail = student.getActivityCourseDetail();
-            if(StringUtils.isNotEmpty(activityCourseDetail)){
+            if (StringUtils.isNotEmpty(activityCourseDetail)) {
                 ActivityCourseDetailDto detailDto = JSON.parseObject(activityCourseDetail, ActivityCourseDetailDto.class);
-                if(detailDto.getMusic_theory() == null || detailDto.getMusic_theory().equals(0)){
+                if (detailDto.getMusic_theory() == null || detailDto.getMusic_theory().equals(0)) {
                     SysUser sysUser = sysUserFeignService.queryUserById(student.getUserId());
-                    if(sysUser == null){
+                    if (sysUser == null) {
                         throw new BizException("请登录");
                     }
                     OrganizationDegreeCourseFee degreeCourseFee = organizationDegreeCourseFeeDao.getByOrganId(sysUser.getOrganId());
-                    if(degreeCourseFee == null){
+                    if (degreeCourseFee == null) {
                         throw new BizException("学员所在分部未配置考级价格");
                     }
                     activityCourseDetailDto.setMusic_theory_price(degreeCourseFee.getTheory());
-                }else {
+                } else {
                     activityCourseDetailDto.setMusic_theory_price(detailDto.getMusic_theory_price());
                 }
-            }else {
+            } else {
                 SysUser sysUser = teacherDao.getUser(student.getUserId());
                 OrganizationDegreeCourseFee degreeCourseFee = organizationDegreeCourseFeeDao.getByOrganId(sysUser.getOrganId());
-                if(degreeCourseFee == null){
+                if (degreeCourseFee == null) {
                     throw new BizException("学员所在分部未配置考级价格");
                 }
                 activityCourseDetailDto.setMusic_theory_price(degreeCourseFee.getTheory());
             }
-        }else {
+        } else {
             activityCourseDetailDto.setMusic_theory_price(BigDecimal.ZERO);
         }
         activityCourseDetailDto.setUserId(null);
@@ -1013,35 +1036,35 @@ public class StudentManageServiceImpl implements StudentManageService {
         Map<String, Object> params = new HashMap<>();
         MapUtil.populateMap(params, queryInfo);
         List<Integer> studentIds = new ArrayList<>();
-        params.put("studentIds",studentIds);
+        params.put("studentIds", studentIds);
         PageInfo<Student> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
-        if(queryInfo.getHasMusicCourse() != null){
-            params.put("groupType","MUSIC");
-            params.put("hasCourse",queryInfo.getHasMusicCourse());
+        if (queryInfo.getHasMusicCourse() != null) {
+            params.put("groupType", "MUSIC");
+            params.put("hasCourse", queryInfo.getHasMusicCourse());
             studentIds = courseScheduleDao.queryHasCourseStudentIds(params);
-            if(studentIds == null || studentIds.size() == 0){
+            if (studentIds == null || studentIds.size() == 0) {
                 return pageInfo;
             }
         }
-        if(queryInfo.getHasPracticeCourse() != null){
-            params.put("groupType","PRACTICE");
-            params.put("hasCourse",queryInfo.getHasPracticeCourse());
-            params.put("studentIds",studentIds);
+        if (queryInfo.getHasPracticeCourse() != null) {
+            params.put("groupType", "PRACTICE");
+            params.put("hasCourse", queryInfo.getHasPracticeCourse());
+            params.put("studentIds", studentIds);
             studentIds = courseScheduleDao.queryHasCourseStudentIds(params);
-            if(studentIds == null || studentIds.size() == 0){
+            if (studentIds == null || studentIds.size() == 0) {
                 return pageInfo;
             }
         }
-        if(queryInfo.getHasVipCourse() != null){
-            params.put("groupType","VIP");
-            params.put("hasCourse",queryInfo.getHasVipCourse());
-            params.put("studentIds",studentIds);
+        if (queryInfo.getHasVipCourse() != null) {
+            params.put("groupType", "VIP");
+            params.put("hasCourse", queryInfo.getHasVipCourse());
+            params.put("studentIds", studentIds);
             studentIds = courseScheduleDao.queryHasCourseStudentIds(params);
-            if(studentIds == null || studentIds.size() == 0){
+            if (studentIds == null || studentIds.size() == 0) {
                 return pageInfo;
             }
         }
-        params.put("studentIds",studentIds);
+        params.put("studentIds", studentIds);
         List<Student> dataList = null;
         int count = studentDao.countStudent(params);
         if (count > 0) {

+ 21 - 0
mec-biz/src/main/resources/config/mybatis/ActivityUserMapperMapper.xml

@@ -305,4 +305,25 @@
 		WHERE aum.return_fee_ = 0 AND aum.user_id_ = #{userId} AND aum.activity_id_ = #{activityId}
 		GROUP BY aum.user_id_
 	</select>
+	
+	<select id="exportStudentSubCourse" resultType="com.ym.mec.biz.dal.dto.ExportStudentSubCourse">
+		select
+			t.user_id_ as userId,
+			su.username_ as username,
+			t.activity_id_ as activityId,
+			o.name_ as organizationName,
+			vga.name_ as activityName,
+			sum(if(t.vip_flag_ = 1 || t.practice_flag_ = 1 ,1,0)) as subCourseNum,
+			sum(if(t.give_vip_flag_ = 1 || t.give_practice_flag_ = 1,1,0)) as subGiveCourseNum
+		from activity_user_mapper t
+				 left join vip_group_activity vga on t.activity_id_ = vga.id_
+				 left join sys_user su on t.user_id_ = su.id_
+				 left join organization o on su.organ_id_ = o.id_
+		where t.tenant_id_ = #{tenantId} and t.return_fee_ = 0
+		and (t.vip_flag_ = 1 or t.give_vip_flag_ = 1 or t.practice_flag_ = 1 or t.give_practice_flag_ = 1)
+		<if test="organId != null">
+			AND FIND_IN_SET(su.organ_id_,#{organId})
+		</if>
+		group by t.user_id_ , t.activity_id_
+	</select>
 </mapper>

+ 16 - 3
mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml

@@ -1236,11 +1236,24 @@
     </update>
 
     <select id="findClassGroupByType" resultMap="ClassGroupTeachers">
-        SELECT * FROM class_group WHERE music_group_id_=#{musicGroupId} AND group_type_ = 'MUSIC'
+        SELECT t.* FROM class_group t
+        WHERE t.music_group_id_=#{musicGroupId} AND t.group_type_ = 'MUSIC'
         <if test="type !=null ">
-            AND type_=#{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+            AND t.type_=#{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+        </if>
+        <if test="hasCourse != null and hasCourse == true">
+            and exists (
+               select 1 from course_schedule a where t.id_ = a.class_group_id_ and a.del_flag_ = 0
+                                                 and a.status_ in ('NOT_START','UNDERWAY') and a.is_lock_ = 0
+            )
+        </if>
+        <if test="hasCourse != null and hasCourse == false">
+            and not exists (
+                select 1 from course_schedule a where t.id_ = a.class_group_id_ and a.del_flag_ = 0
+                and a.status_ in ('NOT_START','UNDERWAY') and a.is_lock_ = 0
+            )
         </if>
-        AND del_flag_ = '0'
+        AND t.del_flag_ = '0'
     </select>
     <select id="countGroupTotalClassTimes" resultType="map">
         SELECT

+ 8 - 3
mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -62,6 +62,7 @@
         <result column="organ_name_" property="organName"/>
         <result column="isCallNames" property="isCallNames" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="is_complaints_" property="isComplaints"/>
+        <result column="merged_course_ids_" property="mergedCourseIds"/>
     </resultMap>
 
     <resultMap type="com.ym.mec.biz.dal.dto.CourseScheduleDto" id="courseScheduleDto" extends="CourseSchedule">
@@ -166,7 +167,6 @@
         cs.teaching_content_,
         cs.note_,
         cs.organ_id_,
-        cs.new_course_id_,
         cs.member_flag_,
         cs.valid_end_time_,
         cs.valid_start_time_,
@@ -2386,10 +2386,15 @@
             cs.is_lock_,
             cs.organ_id_,
             cs.member_flag_,
+            cs.new_course_id_,
             s.name_ schoole_name_,
             o.name_ organ_name_,
             CASE WHEN COUNT(CASE WHEN sa.id_ IS NULL OR (sa.status_ = 'LEAVE' AND sa.remark_ IS NOT NULL) THEN NULL ELSE 1 END) > 0 THEN 1 ELSE 0 END isCallNames,
-            CASE WHEN COUNT(CASE WHEN ta.is_complaints_ = 1 THEN 1 ELSE NULL END) > 0 THEN '1' ELSE '0' END is_complaints_
+            CASE WHEN COUNT(CASE WHEN ta.is_complaints_ = 1 THEN 1 ELSE NULL END) > 0 THEN '1' ELSE '0' END is_complaints_,
+            (
+                select group_concat(csd.id_) from course_schedule csd
+                where csd.del_flag_ = 0 and csd.id_ != csd.new_course_id_  and csd.new_course_id_ = cs.new_course_id_
+            ) as merged_course_ids_
         FROM
             course_schedule cs
             LEFT JOIN school s ON cs.schoole_id_=s.id_
@@ -2526,7 +2531,7 @@
             AND (cs.music_group_id_ = #{search} OR cs.id_=#{search} OR cs.name_ LIKE CONCAT('%' ,#{search}, '%' ))
         </if>
         <if test="courseIdSearch != null">
-            AND cs.id_ = #{courseIdSearch}
+            AND (cs.id_ = #{courseIdSearch} or cs.new_course_id_ = #{courseIdSearch})
         </if>
         <if test="tenantId != null">
             AND cs.tenant_id_ = #{tenantId}

+ 131 - 55
mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentStudentCourseDetailMapper.xml

@@ -31,7 +31,8 @@
     <!-- 全查询 -->
     <select id="findAll" resultMap="MusicGroupPaymentStudentCourseDetail">
         SELECT *
-        FROM music_group_payment_student_course_detail where tenant_id_ = #{tenantId}
+        FROM music_group_payment_student_course_detail
+        where tenant_id_ = #{tenantId}
         ORDER BY id_
     </select>
 
@@ -40,23 +41,25 @@
             parameterType="com.ym.mec.biz.dal.entity.MusicGroupPaymentStudentCourseDetail"
             useGeneratedKeys="true" keyColumn="id" keyProperty="id">
         INSERT INTO music_group_payment_student_course_detail
-        (music_group_payment_calender_id_,music_group_payment_calender_detail_id_,user_id_,course_type_,
-         total_course_minutes_,used_course_minutes_,create_time_,update_time_,course_original_price_,course_current_price_,tenant_id_)
-        VALUES(#{musicGroupPaymentCalenderId},#{musicGroupPaymentCalenderDetailId},#{userId},
-               #{courseType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{totalCourseMinutes},#{usedCourseMinutes},
-               NOW(),NOW(),#{courseOriginalPrice},#{courseCurrentPrice},#{tenantId})
+        (music_group_payment_calender_id_, music_group_payment_calender_detail_id_, user_id_, course_type_,
+         total_course_minutes_, used_course_minutes_, create_time_, update_time_, course_original_price_,
+         course_current_price_, tenant_id_)
+        VALUES (#{musicGroupPaymentCalenderId}, #{musicGroupPaymentCalenderDetailId}, #{userId},
+                #{courseType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{totalCourseMinutes},
+                #{usedCourseMinutes},
+                NOW(), NOW(), #{courseOriginalPrice}, #{courseCurrentPrice}, #{tenantId})
     </insert>
 
     <insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="true" keyColumn="id"
             keyProperty="id">
         INSERT INTO music_group_payment_student_course_detail
         (music_group_payment_calender_id_,music_group_payment_calender_detail_id_,user_id_,
-         course_type_,total_course_minutes_,used_course_minutes_,create_time_,update_time_,course_original_price_,course_current_price_,tenant_id_)
+        course_type_,total_course_minutes_,used_course_minutes_,create_time_,update_time_,course_original_price_,course_current_price_,tenant_id_)
         VALUES
         <foreach collection="list" item="item" separator=",">
             (#{item.musicGroupPaymentCalenderId},#{item.musicGroupPaymentCalenderDetailId},
-             #{item.userId},#{item.courseType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
-             #{item.totalCourseMinutes},#{item.usedCourseMinutes},NOW(),NOW(),#{item.courseOriginalPrice},#{item.courseCurrentPrice},#{item.tenantId})
+            #{item.userId},#{item.courseType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+            #{item.totalCourseMinutes},#{item.usedCourseMinutes},NOW(),NOW(),#{item.courseOriginalPrice},#{item.courseCurrentPrice},#{item.tenantId})
         </foreach>
     </insert>
 
@@ -89,7 +92,7 @@
             <if test="courseType != null">
                 course_type_ = #{courseType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             </if>
-                update_time_ = NOW()
+            update_time_ = NOW()
         </set>
         WHERE id_ = #{id} and tenant_id_ = #{tenantId}
     </update>
@@ -121,7 +124,8 @@
                     music_group_payment_calender_id_ = #{paymentCourseDetail.musicGroupPaymentCalenderId},
                 </if>
                 <if test="paymentCourseDetail.courseType != null">
-                    course_type_ = #{paymentCourseDetail.courseType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+                    course_type_ =
+                    #{paymentCourseDetail.courseType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
                 </if>
                 update_time_ = NOW()
             </set>
@@ -130,8 +134,10 @@
     </update>
     <update id="updateByCourseType">
         UPDATE music_group_payment_student_course_detail
-        SET course_current_price_ = #{courseCurrentPrice},update_time_ = NOW()
-        WHERE course_type_ = #{courseType} AND FIND_IN_SET(music_group_payment_calender_detail_id_,#{musicGroupPaymentCalenderIds})
+        SET course_current_price_ = #{courseCurrentPrice},
+            update_time_          = NOW()
+        WHERE course_type_ = #{courseType}
+          AND FIND_IN_SET(music_group_payment_calender_detail_id_, #{musicGroupPaymentCalenderIds})
     </update>
 
     <!-- 根据主键删除一条记录 -->
@@ -143,29 +149,30 @@
 
     <!-- 根据主键删除一条记录 -->
     <delete id="deleteByMusicGroupPaymentCalenderId">
-        DELETE FROM music_group_payment_student_course_detail
+        DELETE
+        FROM music_group_payment_student_course_detail
         WHERE music_group_payment_calender_id_ = #{musicGroupPaymentCalenderId}
     </delete>
-    
+
     <delete id="deleteByMusicGroupPaymentCalenderDetailId">
         DELETE FROM music_group_payment_student_course_detail
         <where>
-        	music_group_payment_calender_detail_id_ IN
-		    <foreach item="item" collection="list" separator="," open="(" close=")" index="">    
-		      #{item}    
-		    </foreach>
+            music_group_payment_calender_detail_id_ IN
+            <foreach item="item" collection="list" separator="," open="(" close=")" index="">
+                #{item}
+            </foreach>
         </where>
     </delete>
 
     <!-- 分页查询 -->
     <select id="queryByMusicGroupPaymentStudentCourseDetailId" resultMap="MusicGroupPaymentStudentCourseDetail"
             parameterType="map">
-        SELECT * FROM music_group_payment_student_course_detail 
+        SELECT * FROM music_group_payment_student_course_detail
         <where>
-        	music_group_payment_calender_detail_id_ in    
-		    <foreach item="item" collection="list" separator="," open="(" close=")" index="">    
-		      #{item}    
-		    </foreach>
+            music_group_payment_calender_detail_id_ in
+            <foreach item="item" collection="list" separator="," open="(" close=")" index="">
+                #{item}
+            </foreach>
         </where>
     </select>
 
@@ -179,15 +186,15 @@
     <!-- 查询当前表的总记录数 -->
     <select id="queryCount" resultType="int">
         SELECT COUNT(*)
-        FROM music_group_payment_student_course_detail where tenant_id_ = #{tenantId}
+        FROM music_group_payment_student_course_detail
+        where tenant_id_ = #{tenantId}
     </select>
 
     <select id="getUnUseWithStudentAndCourseTypeAndCourseMinutes" resultMap="MusicGroupPaymentStudentCourseDetail">
         SELECT mgpscd.*
-            FROM music_group_payment_student_course_detail mgpscd
-            LEFT JOIN music_group_payment_calender mgpc ON mgpscd.music_group_payment_calender_id_ = mgpc.id_
-        WHERE
-          FIND_IN_SET(mgpc.batch_no_,#{batchNo})
+        FROM music_group_payment_student_course_detail mgpscd
+                 LEFT JOIN music_group_payment_calender mgpc ON mgpscd.music_group_payment_calender_id_ = mgpc.id_
+        WHERE FIND_IN_SET(mgpc.batch_no_, #{batchNo})
           AND mgpscd.user_id_ = #{studentId}
           AND mgpscd.course_type_ = #{courseType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
           AND mgpscd.used_course_minutes_ &lt;= 0
@@ -196,38 +203,38 @@
 
     <select id="getUnUseBatchNoWithStudentAndCourseTypeAndCourseMinutes" resultType="string">
         SELECT
-            mgpc.batch_no_
+        mgpc.batch_no_
         FROM music_group_payment_calender mgpc
-            LEFT JOIN music_group_payment_student_course_detail mgpscd ON mgpscd.music_group_payment_calender_id_ = mgpc.id_
+        LEFT JOIN music_group_payment_student_course_detail mgpscd ON mgpscd.music_group_payment_calender_id_ = mgpc.id_
         WHERE
-            mgpc.music_group_id_ = #{musicGroupId}
-            <if test="studentId != null">
+        mgpc.music_group_id_ = #{musicGroupId}
+        <if test="studentId != null">
             AND mgpscd.user_id_ = #{studentId}
-            </if>
-            <if test="batchNos != null">
+        </if>
+        <if test="batchNos != null">
             AND mgpc.batch_no_ NOT IN
-                <foreach collection="batchNos" item="item" open="(" close=")" separator=",">
-                    #{item}
-                </foreach>
-            </if>
-            <if test="courseType != null">
+            <foreach collection="batchNos" item="item" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+        <if test="courseType != null">
             AND mgpscd.course_type_ = #{courseType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
-            </if>
+        </if>
         GROUP BY mgpc.batch_no_ HAVING min(mgpscd.used_course_minutes_) &lt;=0 ORDER BY MIN(mgpc.id_) LIMIT 1;
     </select>
 
     <select id="getUnUseWithStudents" resultMap="MusicGroupPaymentStudentCourseDetail">
         SELECT
-            MIN(mgpscd.id_) id_,
-            MIN(mgpscd.music_group_payment_calender_id_) music_group_payment_calender_id_,
-            mgpscd.user_id_,
-            mgpscd.course_type_,
-            SUM(mgpscd.total_course_minutes_) total_course_minutes_,
-            SUM(mgpscd.used_course_minutes_) used_course_minutes_
+        MIN(mgpscd.id_) id_,
+        MIN(mgpscd.music_group_payment_calender_id_) music_group_payment_calender_id_,
+        mgpscd.user_id_,
+        mgpscd.course_type_,
+        SUM(mgpscd.total_course_minutes_) total_course_minutes_,
+        SUM(mgpscd.used_course_minutes_) used_course_minutes_
         FROM music_group_payment_student_course_detail mgpscd
-            LEFT JOIN music_group_payment_calender mgpc ON mgpscd.music_group_payment_calender_id_ = mgpc.id_
+        LEFT JOIN music_group_payment_calender mgpc ON mgpscd.music_group_payment_calender_id_ = mgpc.id_
         WHERE mgpc.music_group_id_ = #{musicGroupId}
-            AND user_id_ IN
+        AND user_id_ IN
         <foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
             #{studentId}
         </foreach>
@@ -251,20 +258,88 @@
         <result property="username" column="username_"/>
         <result property="phone" column="phone_"/>
         <result property="classGroupId" column="class_group_id_"/>
+        <result property="courseType" column="course_type_"/>
         <collection property="mapDtos" ofType="com.ym.mec.biz.dal.dto.MapDto">
             <result property="key" column="key"/>
             <result property="value" column="value"/>
         </collection>
     </resultMap>
+
     <select id="queryStudentSubTotalCourseTimes" resultMap="StudentSubTotalCourseTimesDto">
-        SELECT mgpscd.user_id_,su.username_,su.phone_,mgpscd.course_type_ 'key',
-               SUM(CASE WHEN mgpscd.used_course_minutes_ = 0 THEN mgpscd.total_course_minutes_ ELSE 0 END) 'value'
+        SELECT mgpscd.user_id_,
+               su.username_,
+               su.phone_,
+               mgpscd.course_type_ 'key', SUM(CASE
+                                                  WHEN mgpscd.used_course_minutes_ = 0 THEN mgpscd.total_course_minutes_
+                                                  ELSE 0 END) 'value'
         FROM music_group_payment_student_course_detail mgpscd
-        LEFT JOIN music_group_payment_calender mgpc ON mgpc.id_ = mgpscd.music_group_payment_calender_id_
-        LEFT JOIN sys_user su ON su.id_ = mgpscd.user_id_
+                 LEFT JOIN music_group_payment_calender mgpc ON mgpc.id_ = mgpscd.music_group_payment_calender_id_
+                 LEFT JOIN sys_user su ON su.id_ = mgpscd.user_id_
         WHERE mgpc.music_group_id_ = #{musicGroupId}
-        GROUP BY mgpscd.user_id_,mgpscd.course_type_
+        GROUP BY mgpscd.user_id_, mgpscd.course_type_
     </select>
+
+    <sql id="sqlStudentSubTotalCourseTimes">
+        WHERE mgpc.music_group_id_ = #{musicGroupId}
+        <if test="search != null and search != ''">
+            and (
+            mgpscd.user_id_ like CONCAT('%',#{search},'%')
+            or su.phone_ like CONCAT('%',#{search},'%')
+            or su.username_ like CONCAT('%',#{search},'%')
+            )
+        </if>
+        <if test="hastimer != null and hastimer == true">
+            and (mgpscd.used_course_minutes_ is null or mgpscd.used_course_minutes_ = 0)
+        </if>
+        <if test="hastimer != null and hastimer == false">
+            and mgpscd.used_course_minutes_ &gt; 0
+        </if>
+        <if test="courseType != null and courseType != ''">
+            and mgpscd.course_type_ = #{courseType}
+        </if>
+        <if test="classGroupId != null and classGroupId != ''">
+            AND find_in_set(#{classGroupId},v.class_group_id_)
+        </if>
+    </sql>
+
+    <!-- 查询当前表的总记录数 -->
+    <select id="countStudentSubTotalCourseTimes" resultType="java.lang.Integer">
+    select count(*) from (
+        SELECT mgpscd.user_id_ FROM music_group_payment_student_course_detail mgpscd
+        LEFT JOIN sys_user su ON su.id_ = mgpscd.user_id_
+        LEFT JOIN music_group_payment_calender mgpc ON mgpc.id_ = mgpscd.music_group_payment_calender_id_
+        left join (
+            SELECT
+                user_id_ ,GROUP_CONCAT(class_group_id_) as class_group_id_
+            FROM class_group_student_mapper
+            WHERE music_group_id_ = #{musicGroupId} AND status_ = 'NORMAL'
+            GROUP BY user_id_
+        ) v on mgpscd.user_id_ = v.user_id_
+        <include refid="sqlStudentSubTotalCourseTimes"/>
+        GROUP BY mgpscd.user_id_
+    ) a
+    </select>
+
+    <select id="pageStudentSubTotalCourseTimes" resultMap="StudentSubTotalCourseTimesDto"
+            parameterType="map">
+            SELECT
+                mgpscd.user_id_,su.username_,su.phone_,
+                mgpscd.course_type_ 'key',
+                SUM(CASE WHEN mgpscd.used_course_minutes_ = 0 THEN mgpscd.total_course_minutes_ ELSE 0 END) 'value'
+            FROM music_group_payment_student_course_detail mgpscd
+            LEFT JOIN sys_user su ON su.id_ = mgpscd.user_id_
+            LEFT JOIN music_group_payment_calender mgpc ON mgpc.id_ = mgpscd.music_group_payment_calender_id_
+            left join (
+                SELECT
+                    user_id_ ,GROUP_CONCAT(class_group_id_) as class_group_id_
+                FROM class_group_student_mapper
+                WHERE music_group_id_ = #{musicGroupId} AND status_ = 'NORMAL'
+                GROUP BY user_id_
+            ) v on mgpscd.user_id_ = v.user_id_
+            <include refid="sqlStudentSubTotalCourseTimes"/>
+            GROUP BY mgpscd.user_id_,mgpscd.course_type_
+    </select>
+
     <select id="findByCalenderAndUserId" resultMap="MusicGroupPaymentStudentCourseDetail">
         SELECT * FROM music_group_payment_student_course_detail WHERE music_group_payment_calender_id_ = #{calenderId}
         <if test="userId != null">
@@ -273,7 +348,8 @@
     </select>
     <select id="checkCourseTimes" resultType="integer">
         SELECT SUM(c.a) >= SUM(c.b) FROM (
-        SELECT COUNT(DISTINCT mgpscd.course_type_) a,COUNT(DISTINCT mgpscd.total_course_minutes_) b FROM music_group_payment_student_course_detail mgpscd
+        SELECT COUNT(DISTINCT mgpscd.course_type_) a,COUNT(DISTINCT mgpscd.total_course_minutes_) b FROM
+        music_group_payment_student_course_detail mgpscd
         LEFT JOIN music_group_payment_calender mgpc ON mgpscd.music_group_payment_calender_id_ = mgpc.id_
         WHERE mgpc.music_group_id_ = #{musicGroupId} AND mgpscd.used_course_minutes_ = 0
         AND mgpscd.course_type_ IN

+ 989 - 792
mec-biz/src/main/resources/config/mybatis/StudentExtracurricularExercisesSituationMapper.xml

@@ -6,803 +6,1000 @@
 -->
 <mapper namespace="com.ym.mec.biz.dal.dao.StudentExtracurricularExercisesSituationDao">
 
-	<resultMap type="com.ym.mec.biz.dal.entity.StudentExtracurricularExercisesSituation" id="StudentExtracurricularExercisesSituation">
-		<result column="id_" property="id" />
-		<result column="student_id_" property="studentId" />
-		<result column="week_of_year_" property="weekOfYear" />
-		<result column="monday_" property="monday" />
-		<result column="sunday_" property="sunday" />
-		<result column="teacher_id_" property="teacherId" />
-		<result column="expect_exercises_num_" property="expectExercisesNum" />
-		<result column="actual_exercises_num_" property="actualExercisesNum" />
-		<result column="exercises_reply_num_" property="exercisesReplyNum" />
-		<result column="exercises_message_num_" property="exercisesMessageNum" />
-		<result column="exercises_message_timely_num_" property="exercisesMessageTimelyNum" />
-		<result column="create_time_" property="createTime" />
-		<result column="update_time_" property="updateTime" />
-		<result column="last_submit_time_" property="lastSubmitTime"/>
-		<result column="serve_type_" property="serveType"/>
-		<result column="course_ids_" property="courseIds"/>
-		<result column="not_over_course_ids_" property="notOverCourseIds"/>
-		<result column="not_over_course_num_" property="notOverCourseNum"/>
+    <resultMap type="com.ym.mec.biz.dal.entity.StudentExtracurricularExercisesSituation"
+               id="StudentExtracurricularExercisesSituation">
+        <result column="id_" property="id"/>
+        <result column="student_id_" property="studentId"/>
+        <result column="week_of_year_" property="weekOfYear"/>
+        <result column="monday_" property="monday"/>
+        <result column="sunday_" property="sunday"/>
+        <result column="teacher_id_" property="teacherId"/>
+        <result column="expect_exercises_num_" property="expectExercisesNum"/>
+        <result column="actual_exercises_num_" property="actualExercisesNum"/>
+        <result column="exercises_reply_num_" property="exercisesReplyNum"/>
+        <result column="exercises_message_num_" property="exercisesMessageNum"/>
+        <result column="exercises_message_timely_num_" property="exercisesMessageTimelyNum"/>
+        <result column="create_time_" property="createTime"/>
+        <result column="update_time_" property="updateTime"/>
+        <result column="last_submit_time_" property="lastSubmitTime"/>
+        <result column="serve_type_" property="serveType"/>
+        <result column="course_ids_" property="courseIds"/>
+        <result column="not_over_course_ids_" property="notOverCourseIds"/>
+        <result column="not_over_course_num_" property="notOverCourseNum"/>
         <result column="tenant_id_" property="tenantId"/>
-	</resultMap>
-
-	<resultMap id="StudentExercisesSituationDto" type="com.ym.mec.biz.dal.dto.StudentExercisesSituationDto" extends="StudentExtracurricularExercisesSituation">
-		<result column="student_name_" property="studentName"/>
-		<result column="teacher_name_" property="teacherName"/>
-		<result column="organ_name_" property="organName"/>
-		<result column="exist_vip_course_" property="existVipCourse"/>
-	</resultMap>
-
-	<!-- 根据主键查询一条记录 -->
-	<select id="get" resultMap="StudentExtracurricularExercisesSituation" >
-		SELECT * FROM student_extracurricular_exercises_situation_ WHERE id_ = #{id} 
-	</select>
-
-	<!-- 全查询 -->
-	<select id="findAll" resultMap="StudentExtracurricularExercisesSituation">
-		SELECT * FROM student_extracurricular_exercises_situation_ where tenant_id_ = #{tenantId} ORDER BY id_
-	</select>
-
-	<!-- 向数据库增加一条记录 -->
-	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.StudentExtracurricularExercisesSituation" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
-		<!--
-		<selectKey resultClass="int" keyProperty="id" >
-		SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL
-		</selectKey>
-		-->
-		INSERT INTO student_extracurricular_exercises_situation_ (id_,student_id_,week_of_year_,monday_,sunday_,teacher_id_,expect_exercises_num_,
-		                                                          actual_exercises_num_,exercises_reply_num_,exercises_message_num_,
-		                                                          exercises_message_timely_num_,create_time_,update_time_,last_submit_time_,
-		                                                          serve_type_,course_ids_,not_over_course_ids_,not_over_course_num_,tenant_id_)
-		VALUES(#{id},#{studentId},#{weekOfYear},#{monday},#{sunday},#{teacherId},#{expectExercisesNum},#{actualExercisesNum},#{exercisesReplyNum},
-		       #{exercisesMessageNum},#{exercisesMessageTimelyNum},NOW(),NOW(),#{lastSubmitTime},#{serveType},#{courseIds},#{notOverCourseIds},#{notOverCourseNum},#{tenantId})
-	</insert>
-
-	<insert id="batchInsert" parameterType="com.ym.mec.biz.dal.entity.StudentExtracurricularExercisesSituation" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
-		INSERT INTO student_extracurricular_exercises_situation_ (student_id_,week_of_year_,monday_,sunday_,teacher_id_,expect_exercises_num_,
-		                                                          actual_exercises_num_,exercises_reply_num_,exercises_message_num_,
-		                                                          exercises_message_timely_num_,create_time_,update_time_,last_submit_time_,
-		                                                          serve_type_,course_ids_,not_over_course_ids_,not_over_course_num_,tenant_id_)
-		VALUES
-		<foreach collection="situations" item="situation" separator=",">
-			(#{situation.studentId},#{situation.weekOfYear},#{situation.monday},#{situation.sunday},#{situation.teacherId},#{situation.expectExercisesNum},
-			#{situation.actualExercisesNum},#{situation.exercisesReplyNum},#{situation.exercisesMessageNum},#{situation.exercisesMessageTimelyNum},
-			NOW(),NOW(),#{situation.lastSubmitTime},#{situation.serveType},#{situation.courseIds},#{situation.notOverCourseIds},#{situation.notOverCourseNum},#{situation.tenantId})
-		</foreach>
-	</insert>
-
-	<!-- 根据主键查询一条记录 -->
-	<update id="update" parameterType="com.ym.mec.biz.dal.entity.StudentExtracurricularExercisesSituation">
-		UPDATE student_extracurricular_exercises_situation_
-		<set>
-			<if test="exercisesReplyNum != null">
-				exercises_reply_num_ = #{exercisesReplyNum},
-			</if>
-			<if test="monday != null">
-				monday_ = #{monday},
-			</if>
-			<if test="id != null">
-				id_ = #{id},
-			</if>
-			<if test="weekOfYear != null">
-				week_of_year_ = #{weekOfYear},
-			</if>
-			<if test="exercisesMessageNum != null">
-				exercises_message_num_ = #{exercisesMessageNum},
-			</if>
-			<if test="createTime != null">
-				create_time_ = #{createTime},
-			</if>
-			<if test="teacherId != null">
-				teacher_id_ = #{teacherId},
-			</if>
-			<if test="actualExercisesNum != null">
-				actual_exercises_num_ = #{actualExercisesNum},
-			</if>
-			<if test="exercisesMessageTimelyNum != null">
-				exercises_message_timely_num_ = #{exercisesMessageTimelyNum},
-			</if>
-			<if test="studentId != null">
-				student_id_ = #{studentId},
-			</if>
-			<if test="expectExercisesNum != null">
-				expect_exercises_num_ = #{expectExercisesNum},
-			</if>
-			<if test="sunday != null">
-				sunday_ = #{sunday},
-			</if>
-			<if test="lastSubmitTime!=null">
-				last_submit_time_=#{lastSubmitTime},
-			</if>
-			<if test="serveType!=null">
-				serve_type_=#{serveType},
-			</if>
-			<if test="courseIds!=null and courseIds!=''">
-				course_ids_=#{courseIds},
-			</if>
-			<if test="notOverCourseIds!=null and notOverCourseIds!=''">
-				not_over_course_ids_=#{notOverCourseIds},
-			</if>
-			<if test="notOverCourseNum!=null">
-				not_over_course_num_=#{notOverCourseNum},
-			</if>
-			update_time_ = #{updateTime}
-		</set> WHERE id_ = #{id} and tenant_id_ = #{tenantId}
-	</update>
-
-	<update id="batchUpdate" parameterType="com.ym.mec.biz.dal.entity.StudentExtracurricularExercisesSituation">
-		<foreach collection="situations" item="situation" separator=";">
-			UPDATE student_extracurricular_exercises_situation_
-			<set>
-				<if test="situation.exercisesReplyNum != null">
-					exercises_reply_num_ = #{situation.exercisesReplyNum},
-				</if>
-				<if test="situation.monday != null">
-					monday_ = #{situation.monday},
-				</if>
-				<if test="situation.weekOfYear != null">
-					week_of_year_ = #{situation.weekOfYear},
-				</if>
-				<if test="situation.exercisesMessageNum != null">
-					exercises_message_num_ = #{situation.exercisesMessageNum},
-				</if>
-				<if test="situation.teacherId != null">
-					teacher_id_ = #{situation.teacherId},
-				</if>
-				<if test="situation.actualExercisesNum != null">
-					actual_exercises_num_ = #{situation.actualExercisesNum},
-				</if>
-				<if test="situation.exercisesMessageTimelyNum != null">
-					exercises_message_timely_num_ = #{situation.exercisesMessageTimelyNum},
-				</if>
-				<if test="situation.studentId != null">
-					student_id_ = #{situation.studentId},
-				</if>
-				<if test="situation.expectExercisesNum != null">
-					expect_exercises_num_ = #{situation.expectExercisesNum},
-				</if>
-				<if test="situation.sunday != null">
-					sunday_ = #{situation.sunday},
-				</if>
-				<if test="situation.lastSubmitTime!=null">
-					last_submit_time_=#{situation.lastSubmitTime},
-				</if>
-				<if test="situation.serveType!=null">
-					serve_type_=#{situation.serveType},
-				</if>
-				<if test="situation.courseIds!=null">
-					course_ids_=#{situation.courseIds},
-				</if>
-				<if test="situation.notOverCourseIds!=null and situation.notOverCourseIds!=''">
-					not_over_course_ids_=#{situation.notOverCourseIds},
-				</if>
-				<if test="situation.notOverCourseNum!=null">
-					not_over_course_num_=#{situation.notOverCourseNum},
-				</if>
-				update_time_ = NOW()
-			</set> WHERE id_ = #{situation.id} and tenant_id_ = #{situation.tenantId}
-		</foreach>
-	</update>
-
-	<!-- 根据主键删除一条记录 -->
-	<delete id="delete" >
-		DELETE FROM student_extracurricular_exercises_situation_ WHERE id_ = #{id} 
-	</delete>
-	<delete id="deleteByMonday">
-		DELETE FROM student_extracurricular_exercises_situation_ WHERE monday_ = #{monday}
-		<if test="studentIds!=null and studentIds.size()>0">
-			AND student_id_ IN
-			<foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
-				#{studentId}
-			</foreach>
-		</if>
-	</delete>
-	<select id="selectByMonday" resultMap="StudentExtracurricularExercisesSituation">
-		SELECT id_,course_ids_ FROM student_extracurricular_exercises_situation_ WHERE monday_ = #{monday}
-		<if test="studentIds!=null and studentIds.size()>0">
-			AND student_id_ IN
-			<foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
-				#{studentId}
-			</foreach>
-		</if>
-	</select>
-	<delete id="deleteByStudent">
-		DELETE FROM student_extracurricular_exercises_situation_ WHERE student_id_ = #{studentId}
-		<if test="monday!=null and monday!=''">
-			AND monday_=#{monday}
-		</if>
-	</delete>
-	<delete id="batchDelete">
-		DELETE FROM student_extracurricular_exercises_situation_ WHERE id_ IN
-		<foreach collection="situationIds" item="id" open="(" close=")" separator=",">
-			#{id}
-		</foreach>
-	</delete>
-
-	<select id="selectByStudent" resultMap="StudentExtracurricularExercisesSituation">
-		SELECT id_,course_ids_ FROM student_extracurricular_exercises_situation_ WHERE student_id_ = #{studentId}
-		<if test="monday!=null and monday!=''">
-			AND monday_=#{monday}
-		</if>
-	</select>
-
-	<!-- 分页查询 -->
-	<select id="queryPage" resultMap="StudentExtracurricularExercisesSituation" parameterType="map">
-		SELECT * FROM student_extracurricular_exercises_situation_ where tenant_id_ = #{tenantId} ORDER BY id_ <include refid="global.limit"/>
-	</select>
-
-	<!-- 查询当前表的总记录数 -->
-	<select id="queryCount" resultType="int">
-		SELECT COUNT(*) FROM student_extracurricular_exercises_situation_ where tenant_id_ = #{tenantId}
-	</select>
-
-	<select id="findExercisesSituations" resultMap="StudentExercisesSituationDto">
-		SELECT
-		sees.id_ id_,
-		student_id_,
-		stu.username_ student_name_,
-		tea.real_name_ teacher_name_,
-		o.name_ organ_name_,
-		sees.monday_,
-		sees.sunday_,
-		sees.serve_type_,
-		sees.course_ids_,
-		expect_exercises_num_ expect_exercises_num_,
-		actual_exercises_num_ actual_exercises_num_,
-		<if test="submitStartDate==null or submitEndDate==null">
-			exercises_reply_num_ exercises_reply_num_,
-			exercises_message_num_ exercises_message_num_,
-			exercises_message_timely_num_ exercises_message_timely_num_,
-			last_submit_time_ last_submit_time_
-		</if>
-		<if test="submitStartDate!=null and submitEndDate!=null">
-			IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_reply_num_,0) exercises_reply_num_,
-			IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0) exercises_message_num_,
-			IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_timely_num_,0) exercises_message_timely_num_,
-			IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},last_submit_time_, NULL) last_submit_time_
-		</if>
-		FROM
-			student_extracurricular_exercises_situation_ sees
-			LEFT JOIN sys_user stu ON stu.id_=sees.student_id_
-			LEFT JOIN teacher t ON t.id_=sees.teacher_id_
-			LEFT JOIN sys_user tea ON tea.id_=sees.teacher_id_
-			LEFT JOIN organization o ON stu.organ_id_=o.id_
-		WHERE
-		sees.monday_ &gt;= #{monday}
-		AND sees.sunday_ &lt;= #{sunday} and sees.tenant_id_ = #{tenantId}
-		<if test="teacherId!=null">
-			AND sees.teacher_id_ = #{teacherId}
-		</if>
-		<if test="search!=null">
-			AND (stu.id_=#{search} OR stu.username_ LIKE CONCAT('%', #{search}, '%'))
-		</if>
-		<if test="organId != null and organId != ''">
-			AND FIND_IN_SET(t.organ_id_,#{organId})
-		</if>
-		<if test="existVipCourse!=null and existVipCourse==1">
-			AND EXISTS (SELECT cssp.id_ FROM course_schedule_student_payment cssp LEFT JOIN course_schedule cs ON cs.id_=cssp.course_schedule_id_ WHERE cssp.user_id_=sees.student_id_ AND cssp.group_type_='VIP' AND class_date_ BETWEEN #{monday} AND #{sunday})
-		</if>
-		<if test="existVipCourse!=null and existVipCourse==0">
-			AND NOT EXISTS (SELECT cssp.id_ FROM course_schedule_student_payment cssp LEFT JOIN course_schedule cs ON cs.id_=cssp.course_schedule_id_ WHERE cssp.user_id_=sees.student_id_ AND cssp.group_type_='VIP' AND class_date_ BETWEEN #{monday} AND #{sunday})
-		</if>
-		<if test="existPracticeCourse!=null and existPracticeCourse==1">
-			AND EXISTS (SELECT cssp.id_ FROM course_schedule_student_payment cssp LEFT JOIN course_schedule cs ON cs.id_=cssp.course_schedule_id_ LEFT JOIN practice_group pg ON pg.id_=cssp.music_group_id_ WHERE cssp.user_id_=sees.student_id_ AND cssp.group_type_='PRACTICE' AND pg.type_='CHARGE' AND class_date_ BETWEEN #{monday} AND #{sunday})
-		</if>
-		<if test="existPracticeCourse!=null and existPracticeCourse==0">
-			AND NOT EXISTS (SELECT cssp.id_ FROM course_schedule_student_payment cssp LEFT JOIN course_schedule cs ON cs.id_=cssp.course_schedule_id_ LEFT JOIN practice_group pg ON pg.id_=cssp.music_group_id_ WHERE cssp.user_id_=sees.student_id_ AND cssp.group_type_='PRACTICE' AND pg.type_='CHARGE' AND class_date_ BETWEEN #{monday} AND #{sunday})
-		</if>
-
-		<if test="expectExercisesNum!=null">
-			AND expect_exercises_num_ = #{expectExercisesNum}
-		</if>
-		<if test="actualExercisesNumIsAchieve!=null and actualExercisesNumIsAchieve==0">
-			AND actual_exercises_num_ &lt; expect_exercises_num_
-		</if>
-		<if test="actualExercisesNumIsAchieve!=null and actualExercisesNumIsAchieve==1">
-			AND actual_exercises_num_ &gt;= expect_exercises_num_
-		</if>
-		<if test="submitStartDate==null or submitEndDate==null">
-			<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==0">
-				AND exercises_reply_num_ &lt; actual_exercises_num_
-			</if>
-			<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==1">
-				AND exercises_reply_num_ &gt;= actual_exercises_num_
-			</if>
-			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
-				AND exercises_message_num_ &lt; exercises_reply_num_
-			</if>
-			<if test="serviceIsError!=null and serviceIsError">
-				AND (actual_exercises_num_ &lt; expect_exercises_num_ OR exercises_message_num_ &lt; exercises_reply_num_)
-			</if>
-			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
-				AND exercises_message_num_ &gt;= exercises_reply_num_
-			</if>
-			<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==0">
-				AND exercises_message_timely_num_ &lt; exercises_message_num_
-			</if>
-			<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==1">
-				AND exercises_message_timely_num_ &gt;= exercises_message_num_
-			</if>
-		</if>
-		<if test="submitStartDate!=null and submitEndDate!=null">
-			<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==0">
-				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_reply_num_,0) &lt; actual_exercises_num_
-			</if>
-			<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==1">
-				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_reply_num_,0) &gt;= actual_exercises_num_
-			</if>
-			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
-				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0) &lt; exercises_reply_num_
-			</if>
-			<if test="serviceIsError!=null and serviceIsError">
-				AND (actual_exercises_num_ &lt; expect_exercises_num_ OR IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0) &lt; exercises_reply_num_)
-			</if>
-			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
-				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0) &gt;= exercises_reply_num_
-			</if>
-			<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==0">
-				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_timely_num_,0) &lt; exercises_message_num_
-			</if>
-			<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==1">
-				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_timely_num_,0) &gt;= exercises_message_num_
-			</if>
-		</if>
-		ORDER BY student_id_
-		<include refid="global.limit"/>
-	</select>
-
-	<select id="countExercisesSituations" resultType="int">
-		SELECT COUNT(1) FROM (
-		SELECT
-		1
-		FROM
-		student_extracurricular_exercises_situation_ sees
-		LEFT JOIN sys_user stu ON stu.id_=sees.student_id_
-		LEFT JOIN teacher t ON t.id_=sees.teacher_id_
-		LEFT JOIN sys_user tea ON tea.id_=sees.teacher_id_
-		LEFT JOIN organization o ON stu.organ_id_=o.id_
-		WHERE
-		sees.monday_ &gt;= #{monday}
-		AND sees.sunday_ &lt;= #{sunday} and sees.tenant_id_ = #{tenantId}
-		<if test="teacherId!=null">
-			AND sees.teacher_id_ = #{teacherId}
-		</if>
-		<if test="search!=null">
-			AND (stu.id_=#{search} OR stu.username_ LIKE CONCAT('%', #{search}, '%'))
-		</if>
-		<if test="organId != null and organId != ''">
-			AND FIND_IN_SET(t.organ_id_, #{organId})
-		</if>
-		<if test="existVipCourse!=null and existVipCourse==1">
-			AND EXISTS (SELECT cssp.id_ FROM course_schedule_student_payment cssp LEFT JOIN course_schedule cs ON cs.id_=cssp.course_schedule_id_ WHERE cssp.user_id_=sees.student_id_ AND cssp.group_type_='VIP' AND class_date_ BETWEEN #{monday} AND #{sunday})
-		</if>
-		<if test="existVipCourse!=null and existVipCourse==0">
-			AND NOT EXISTS (SELECT cssp.id_ FROM course_schedule_student_payment cssp LEFT JOIN course_schedule cs ON cs.id_=cssp.course_schedule_id_ WHERE cssp.user_id_=sees.student_id_ AND cssp.group_type_='VIP' AND class_date_ BETWEEN #{monday} AND #{sunday})
-		</if>
-		<if test="existPracticeCourse!=null and existPracticeCourse==1">
-			AND EXISTS (SELECT cssp.id_ FROM course_schedule_student_payment cssp LEFT JOIN course_schedule cs ON cs.id_=cssp.course_schedule_id_ LEFT JOIN practice_group pg ON pg.id_=cssp.music_group_id_ WHERE cssp.user_id_=sees.student_id_ AND cssp.group_type_='PRACTICE' AND pg.type_='CHARGE' AND class_date_ BETWEEN #{monday} AND #{sunday})
-		</if>
-		<if test="existPracticeCourse!=null and existPracticeCourse==0">
-			AND NOT EXISTS (SELECT cssp.id_ FROM course_schedule_student_payment cssp LEFT JOIN course_schedule cs ON cs.id_=cssp.course_schedule_id_ LEFT JOIN practice_group pg ON pg.id_=cssp.music_group_id_ WHERE cssp.user_id_=sees.student_id_ AND cssp.group_type_='PRACTICE' AND pg.type_='CHARGE' AND class_date_ BETWEEN #{monday} AND #{sunday})
-		</if>
-
-		<if test="expectExercisesNum!=null">
-			AND expect_exercises_num_ = #{expectExercisesNum}
-		</if>
-		<if test="actualExercisesNumIsAchieve!=null and actualExercisesNumIsAchieve==0">
-			AND actual_exercises_num_ &lt; expect_exercises_num_
-		</if>
-		<if test="actualExercisesNumIsAchieve!=null and actualExercisesNumIsAchieve==1">
-			AND actual_exercises_num_ &gt;= expect_exercises_num_
-		</if>
-		<if test="submitStartDate==null or submitEndDate==null">
-			<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==0">
-				AND exercises_reply_num_ &lt; actual_exercises_num_
-			</if>
-			<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==1">
-				AND exercises_reply_num_ &gt;= actual_exercises_num_
-			</if>
-			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
-				AND exercises_message_num_ &lt; exercises_reply_num_
-			</if>
-			<if test="serviceIsError!=null and serviceIsError">
-				AND (actual_exercises_num_ &lt; expect_exercises_num_ OR exercises_message_num_ &lt; exercises_reply_num_)
-			</if>
-			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
-				AND exercises_message_num_ &gt;= exercises_reply_num_
-			</if>
-			<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==0">
-				AND exercises_message_timely_num_ &lt; exercises_message_num_
-			</if>
-			<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==1">
-				AND exercises_message_timely_num_ &gt;= exercises_message_num_
-			</if>
-		</if>
-		<if test="submitStartDate!=null and submitEndDate!=null">
-			<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==0">
-				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_reply_num_,0) &lt; actual_exercises_num_
-			</if>
-			<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==1">
-				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_reply_num_,0) &gt;= actual_exercises_num_
-			</if>
-			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
-				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0) &lt; exercises_reply_num_
-			</if>
-			<if test="serviceIsError!=null and serviceIsError">
-				AND (actual_exercises_num_ &lt; expect_exercises_num_ OR IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0) &lt; exercises_reply_num_)
-			</if>
-			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
-				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0) &gt;= exercises_reply_num_
-			</if>
-			<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==0">
-				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_timely_num_,0) &lt; exercises_message_num_
-			</if>
-			<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==1">
-				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_timely_num_,0) &gt;= exercises_message_num_
-			</if>
-		</if>
-		) tmp
-	</select>
-
-	<select id="findExercisesSituationsById" resultMap="StudentExtracurricularExercisesSituation">
-		SELECT * FROM student_extracurricular_exercises_situation_ WHERE id_ IN
-		<foreach collection="ids" item="id" separator="," open="(" close=")">
-			#{id}
-		</foreach>
-	</select>
-
-	<select id="findTeacherExercisesServiceSituations" resultType="com.ym.mec.biz.dal.dto.TeacherExercisesServiceDto">
-		SELECT
-		teacher_id_ teacherId,
-		COUNT( exercises_reply_num_ ) expectExercisesNum,
-		COUNT( CASE WHEN actual_exercises_num_ = 1 THEN 1 ELSE NULL END ) actualExercisesNum
-		FROM
-		student_extracurricular_exercises_situation_
-		FORCE INDEX(monday_)
-		WHERE monday_ = #{monday}
-		AND teacher_id_ IN
-		<foreach collection="teacherIds" item="teacherId" open="(" close=")" separator=",">
-			#{teacherId}
-		</foreach>
-		GROUP BY
-		teacher_id_;
-	</select>
-
-	<select id="findLastWeekTodayUpdateNum" resultType="int">
-		SELECT COUNT(id_) FROM student_extracurricular_exercises_situation_ WHERE sunday_=#{sunday} AND DATE_FORMAT(update_time_,'%Y-%m-%d')=DATE_FORMAT(NOW(),'%Y-%m-%d') 
+    </resultMap>
+
+    <resultMap id="StudentExercisesSituationDto" type="com.ym.mec.biz.dal.dto.StudentExercisesSituationDto"
+               extends="StudentExtracurricularExercisesSituation">
+        <result column="student_name_" property="studentName"/>
+        <result column="teacher_name_" property="teacherName"/>
+        <result column="organ_name_" property="organName"/>
+        <result column="exist_vip_course_" property="existVipCourse"/>
+    </resultMap>
+
+    <!-- 根据主键查询一条记录 -->
+    <select id="get" resultMap="StudentExtracurricularExercisesSituation">
+        SELECT *
+        FROM student_extracurricular_exercises_situation_
+        WHERE id_ = #{id}
+    </select>
+
+    <!-- 全查询 -->
+    <select id="findAll" resultMap="StudentExtracurricularExercisesSituation">
+        SELECT *
+        FROM student_extracurricular_exercises_situation_
+        where tenant_id_ = #{tenantId}
+        ORDER BY id_
+    </select>
+
+    <!-- 向数据库增加一条记录 -->
+    <insert id="insert" parameterType="com.ym.mec.biz.dal.entity.StudentExtracurricularExercisesSituation"
+            useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+        <!--
+        <selectKey resultClass="int" keyProperty="id" >
+        SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL
+        </selectKey>
+        -->
+        INSERT INTO student_extracurricular_exercises_situation_
+        (id_,student_id_,week_of_year_,monday_,sunday_,teacher_id_,expect_exercises_num_,
+        actual_exercises_num_,exercises_reply_num_,exercises_message_num_,
+        exercises_message_timely_num_,create_time_,update_time_,last_submit_time_,
+        serve_type_,course_ids_,not_over_course_ids_,not_over_course_num_,tenant_id_)
+        VALUES(#{id},#{studentId},#{weekOfYear},#{monday},#{sunday},#{teacherId},#{expectExercisesNum},#{actualExercisesNum},#{exercisesReplyNum},
+        #{exercisesMessageNum},#{exercisesMessageTimelyNum},NOW(),NOW(),#{lastSubmitTime},#{serveType},#{courseIds},#{notOverCourseIds},#{notOverCourseNum},#{tenantId})
+    </insert>
+
+    <insert id="batchInsert" parameterType="com.ym.mec.biz.dal.entity.StudentExtracurricularExercisesSituation"
+            useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+        INSERT INTO student_extracurricular_exercises_situation_
+        (student_id_,week_of_year_,monday_,sunday_,teacher_id_,expect_exercises_num_,
+        actual_exercises_num_,exercises_reply_num_,exercises_message_num_,
+        exercises_message_timely_num_,create_time_,update_time_,last_submit_time_,
+        serve_type_,course_ids_,not_over_course_ids_,not_over_course_num_,tenant_id_)
+        VALUES
+        <foreach collection="situations" item="situation" separator=",">
+            (#{situation.studentId},#{situation.weekOfYear},#{situation.monday},#{situation.sunday},#{situation.teacherId},#{situation.expectExercisesNum},
+            #{situation.actualExercisesNum},#{situation.exercisesReplyNum},#{situation.exercisesMessageNum},#{situation.exercisesMessageTimelyNum},
+            NOW(),NOW(),#{situation.lastSubmitTime},#{situation.serveType},#{situation.courseIds},#{situation.notOverCourseIds},#{situation.notOverCourseNum},#{situation.tenantId})
+        </foreach>
+    </insert>
+
+    <!-- 根据主键查询一条记录 -->
+    <update id="update" parameterType="com.ym.mec.biz.dal.entity.StudentExtracurricularExercisesSituation">
+        UPDATE student_extracurricular_exercises_situation_
+        <set>
+            <if test="exercisesReplyNum != null">
+                exercises_reply_num_ = #{exercisesReplyNum},
+            </if>
+            <if test="monday != null">
+                monday_ = #{monday},
+            </if>
+            <if test="id != null">
+                id_ = #{id},
+            </if>
+            <if test="weekOfYear != null">
+                week_of_year_ = #{weekOfYear},
+            </if>
+            <if test="exercisesMessageNum != null">
+                exercises_message_num_ = #{exercisesMessageNum},
+            </if>
+            <if test="createTime != null">
+                create_time_ = #{createTime},
+            </if>
+            <if test="teacherId != null">
+                teacher_id_ = #{teacherId},
+            </if>
+            <if test="actualExercisesNum != null">
+                actual_exercises_num_ = #{actualExercisesNum},
+            </if>
+            <if test="exercisesMessageTimelyNum != null">
+                exercises_message_timely_num_ = #{exercisesMessageTimelyNum},
+            </if>
+            <if test="studentId != null">
+                student_id_ = #{studentId},
+            </if>
+            <if test="expectExercisesNum != null">
+                expect_exercises_num_ = #{expectExercisesNum},
+            </if>
+            <if test="sunday != null">
+                sunday_ = #{sunday},
+            </if>
+            <if test="lastSubmitTime!=null">
+                last_submit_time_=#{lastSubmitTime},
+            </if>
+            <if test="serveType!=null">
+                serve_type_=#{serveType},
+            </if>
+            <if test="courseIds!=null and courseIds!=''">
+                course_ids_=#{courseIds},
+            </if>
+            <if test="notOverCourseIds!=null and notOverCourseIds!=''">
+                not_over_course_ids_=#{notOverCourseIds},
+            </if>
+            <if test="notOverCourseNum!=null">
+                not_over_course_num_=#{notOverCourseNum},
+            </if>
+            update_time_ = #{updateTime}
+        </set>
+        WHERE id_ = #{id} and tenant_id_ = #{tenantId}
+    </update>
+
+    <update id="batchUpdate" parameterType="com.ym.mec.biz.dal.entity.StudentExtracurricularExercisesSituation">
+        <foreach collection="situations" item="situation" separator=";">
+            UPDATE student_extracurricular_exercises_situation_
+            <set>
+                <if test="situation.exercisesReplyNum != null">
+                    exercises_reply_num_ = #{situation.exercisesReplyNum},
+                </if>
+                <if test="situation.monday != null">
+                    monday_ = #{situation.monday},
+                </if>
+                <if test="situation.weekOfYear != null">
+                    week_of_year_ = #{situation.weekOfYear},
+                </if>
+                <if test="situation.exercisesMessageNum != null">
+                    exercises_message_num_ = #{situation.exercisesMessageNum},
+                </if>
+                <if test="situation.teacherId != null">
+                    teacher_id_ = #{situation.teacherId},
+                </if>
+                <if test="situation.actualExercisesNum != null">
+                    actual_exercises_num_ = #{situation.actualExercisesNum},
+                </if>
+                <if test="situation.exercisesMessageTimelyNum != null">
+                    exercises_message_timely_num_ = #{situation.exercisesMessageTimelyNum},
+                </if>
+                <if test="situation.studentId != null">
+                    student_id_ = #{situation.studentId},
+                </if>
+                <if test="situation.expectExercisesNum != null">
+                    expect_exercises_num_ = #{situation.expectExercisesNum},
+                </if>
+                <if test="situation.sunday != null">
+                    sunday_ = #{situation.sunday},
+                </if>
+                <if test="situation.lastSubmitTime!=null">
+                    last_submit_time_=#{situation.lastSubmitTime},
+                </if>
+                <if test="situation.serveType!=null">
+                    serve_type_=#{situation.serveType},
+                </if>
+                <if test="situation.courseIds!=null">
+                    course_ids_=#{situation.courseIds},
+                </if>
+                <if test="situation.notOverCourseIds!=null and situation.notOverCourseIds!=''">
+                    not_over_course_ids_=#{situation.notOverCourseIds},
+                </if>
+                <if test="situation.notOverCourseNum!=null">
+                    not_over_course_num_=#{situation.notOverCourseNum},
+                </if>
+                update_time_ = NOW()
+            </set>
+            WHERE id_ = #{situation.id} and tenant_id_ = #{situation.tenantId}
+        </foreach>
+    </update>
+
+    <!-- 根据主键删除一条记录 -->
+    <delete id="delete">
+        DELETE
+        FROM student_extracurricular_exercises_situation_
+        WHERE id_ = #{id}
+    </delete>
+    <delete id="deleteByMonday">
+        DELETE FROM student_extracurricular_exercises_situation_ WHERE monday_ = #{monday}
+        <if test="studentIds!=null and studentIds.size()>0">
+            AND student_id_ IN
+            <foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
+                #{studentId}
+            </foreach>
+        </if>
+    </delete>
+    <select id="selectByMonday" resultMap="StudentExtracurricularExercisesSituation">
+        SELECT id_,course_ids_ FROM student_extracurricular_exercises_situation_ WHERE monday_ = #{monday}
+        <if test="studentIds!=null and studentIds.size()>0">
+            AND student_id_ IN
+            <foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
+                #{studentId}
+            </foreach>
+        </if>
+    </select>
+    <delete id="deleteByStudent">
+        DELETE FROM student_extracurricular_exercises_situation_ WHERE student_id_ = #{studentId}
+        <if test="monday!=null and monday!=''">
+            AND monday_=#{monday}
+        </if>
+    </delete>
+    <delete id="batchDelete">
+        DELETE FROM student_extracurricular_exercises_situation_ WHERE id_ IN
+        <foreach collection="situationIds" item="id" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+    </delete>
+
+    <select id="selectByStudent" resultMap="StudentExtracurricularExercisesSituation">
+        SELECT id_,course_ids_ FROM student_extracurricular_exercises_situation_ WHERE student_id_ = #{studentId}
+        <if test="monday!=null and monday!=''">
+            AND monday_=#{monday}
+        </if>
+    </select>
+
+    <!-- 分页查询 -->
+    <select id="queryPage" resultMap="StudentExtracurricularExercisesSituation" parameterType="map">
+        SELECT * FROM student_extracurricular_exercises_situation_ where tenant_id_ = #{tenantId} ORDER BY id_
+        <include refid="global.limit"/>
+    </select>
+
+    <!-- 查询当前表的总记录数 -->
+    <select id="queryCount" resultType="int">
+        SELECT COUNT(*)
+        FROM student_extracurricular_exercises_situation_
+        where tenant_id_ = #{tenantId}
+    </select>
+
+    <select id="findExercisesSituations" resultMap="StudentExercisesSituationDto">
+        SELECT
+        sees.id_ id_,
+        student_id_,
+        stu.username_ student_name_,
+        tea.real_name_ teacher_name_,
+        o.name_ organ_name_,
+        sees.monday_,
+        sees.sunday_,
+        sees.serve_type_,
+        sees.course_ids_,
+        expect_exercises_num_ expect_exercises_num_,
+        actual_exercises_num_ actual_exercises_num_,
+        <if test="submitStartDate==null or submitEndDate==null">
+            exercises_reply_num_ exercises_reply_num_,
+            exercises_message_num_ exercises_message_num_,
+            exercises_message_timely_num_ exercises_message_timely_num_,
+            last_submit_time_ last_submit_time_
+        </if>
+        <if test="submitStartDate!=null and submitEndDate!=null">
+            IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND
+            #{submitEndDate},exercises_reply_num_,0) exercises_reply_num_,
+            IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND
+            #{submitEndDate},exercises_message_num_,0) exercises_message_num_,
+            IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND
+            #{submitEndDate},exercises_message_timely_num_,0) exercises_message_timely_num_,
+            IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND
+            #{submitEndDate},last_submit_time_, NULL) last_submit_time_
+        </if>
+        FROM
+        student_extracurricular_exercises_situation_ sees
+        LEFT JOIN sys_user stu ON stu.id_=sees.student_id_
+        LEFT JOIN teacher t ON t.id_=sees.teacher_id_
+        LEFT JOIN sys_user tea ON tea.id_=sees.teacher_id_
+        LEFT JOIN organization o ON stu.organ_id_=o.id_
+        WHERE
+        sees.monday_ &gt;= #{monday}
+        AND sees.sunday_ &lt;= #{sunday} and sees.tenant_id_ = #{tenantId}
+        <if test="teacherId!=null">
+            AND sees.teacher_id_ = #{teacherId}
+        </if>
+        <if test="search!=null">
+            AND (stu.id_=#{search} OR stu.username_ LIKE CONCAT('%', #{search}, '%'))
+        </if>
+        <if test="organId != null and organId != ''">
+            AND FIND_IN_SET(t.organ_id_,#{organId})
+        </if>
+        <if test="existVipCourse!=null and existVipCourse==1">
+            AND EXISTS (SELECT cssp.id_ FROM course_schedule_student_payment cssp LEFT JOIN course_schedule cs ON
+            cs.id_=cssp.course_schedule_id_ WHERE cssp.user_id_=sees.student_id_ AND cssp.group_type_='VIP' AND
+            class_date_ BETWEEN #{monday} AND #{sunday})
+        </if>
+        <if test="existVipCourse!=null and existVipCourse==0">
+            AND NOT EXISTS (SELECT cssp.id_ FROM course_schedule_student_payment cssp LEFT JOIN course_schedule cs ON
+            cs.id_=cssp.course_schedule_id_ WHERE cssp.user_id_=sees.student_id_ AND cssp.group_type_='VIP' AND
+            class_date_ BETWEEN #{monday} AND #{sunday})
+        </if>
+        <if test="existPracticeCourse!=null and existPracticeCourse==1">
+            AND EXISTS (SELECT cssp.id_ FROM course_schedule_student_payment cssp LEFT JOIN course_schedule cs ON
+            cs.id_=cssp.course_schedule_id_ LEFT JOIN practice_group pg ON pg.id_=cssp.music_group_id_ WHERE
+            cssp.user_id_=sees.student_id_ AND cssp.group_type_='PRACTICE' AND pg.type_='CHARGE' AND class_date_ BETWEEN
+            #{monday} AND #{sunday})
+        </if>
+        <if test="existPracticeCourse!=null and existPracticeCourse==0">
+            AND NOT EXISTS (SELECT cssp.id_ FROM course_schedule_student_payment cssp LEFT JOIN course_schedule cs ON
+            cs.id_=cssp.course_schedule_id_ LEFT JOIN practice_group pg ON pg.id_=cssp.music_group_id_ WHERE
+            cssp.user_id_=sees.student_id_ AND cssp.group_type_='PRACTICE' AND pg.type_='CHARGE' AND class_date_ BETWEEN
+            #{monday} AND #{sunday})
+        </if>
+
+        <if test="expectExercisesNum!=null">
+            AND expect_exercises_num_ = #{expectExercisesNum}
+        </if>
+        <if test="actualExercisesNumIsAchieve!=null and actualExercisesNumIsAchieve==0">
+            AND actual_exercises_num_ &lt; expect_exercises_num_
+        </if>
+        <if test="actualExercisesNumIsAchieve!=null and actualExercisesNumIsAchieve==1">
+            AND actual_exercises_num_ &gt;= expect_exercises_num_
+        </if>
+        <if test="submitStartDate==null or submitEndDate==null">
+            <if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==0">
+                AND exercises_reply_num_ &lt; actual_exercises_num_
+            </if>
+            <if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==1">
+                AND exercises_reply_num_ &gt;= actual_exercises_num_
+            </if>
+            <if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
+                AND exercises_message_num_ &lt; exercises_reply_num_
+            </if>
+            <if test="serviceIsError!=null and serviceIsError">
+                AND (actual_exercises_num_ &lt; expect_exercises_num_ OR exercises_message_num_ &lt;
+                exercises_reply_num_)
+            </if>
+            <if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
+                AND exercises_message_num_ &gt;= exercises_reply_num_
+            </if>
+            <if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==0">
+                AND exercises_message_timely_num_ &lt; exercises_message_num_
+            </if>
+            <if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==1">
+                AND exercises_message_timely_num_ &gt;= exercises_message_num_
+            </if>
+        </if>
+        <if test="submitStartDate!=null and submitEndDate!=null">
+            <if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==0">
+                AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND
+                #{submitEndDate},exercises_reply_num_,0) &lt; actual_exercises_num_
+            </if>
+            <if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==1">
+                AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND
+                #{submitEndDate},exercises_reply_num_,0) &gt;= actual_exercises_num_
+            </if>
+            <if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
+                AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND
+                #{submitEndDate},exercises_message_num_,0) &lt; exercises_reply_num_
+            </if>
+            <if test="serviceIsError!=null and serviceIsError">
+                AND (actual_exercises_num_ &lt; expect_exercises_num_ OR IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d')
+                BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0) &lt; exercises_reply_num_)
+            </if>
+            <if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
+                AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND
+                #{submitEndDate},exercises_message_num_,0) &gt;= exercises_reply_num_
+            </if>
+            <if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==0">
+                AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND
+                #{submitEndDate},exercises_message_timely_num_,0) &lt; exercises_message_num_
+            </if>
+            <if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==1">
+                AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND
+                #{submitEndDate},exercises_message_timely_num_,0) &gt;= exercises_message_num_
+            </if>
+        </if>
+        ORDER BY student_id_
+        <include refid="global.limit"/>
+    </select>
+
+    <select id="countExercisesSituations" resultType="int">
+        SELECT COUNT(1) FROM (
+        SELECT
+        1
+        FROM
+        student_extracurricular_exercises_situation_ sees
+        LEFT JOIN sys_user stu ON stu.id_=sees.student_id_
+        LEFT JOIN teacher t ON t.id_=sees.teacher_id_
+        LEFT JOIN sys_user tea ON tea.id_=sees.teacher_id_
+        LEFT JOIN organization o ON stu.organ_id_=o.id_
+        WHERE
+        sees.monday_ &gt;= #{monday}
+        AND sees.sunday_ &lt;= #{sunday} and sees.tenant_id_ = #{tenantId}
+        <if test="teacherId!=null">
+            AND sees.teacher_id_ = #{teacherId}
+        </if>
+        <if test="search!=null">
+            AND (stu.id_=#{search} OR stu.username_ LIKE CONCAT('%', #{search}, '%'))
+        </if>
+        <if test="organId != null and organId != ''">
+            AND FIND_IN_SET(t.organ_id_, #{organId})
+        </if>
+        <if test="existVipCourse!=null and existVipCourse==1">
+            AND EXISTS (SELECT cssp.id_ FROM course_schedule_student_payment cssp LEFT JOIN course_schedule cs ON
+            cs.id_=cssp.course_schedule_id_ WHERE cssp.user_id_=sees.student_id_ AND cssp.group_type_='VIP' AND
+            class_date_ BETWEEN #{monday} AND #{sunday})
+        </if>
+        <if test="existVipCourse!=null and existVipCourse==0">
+            AND NOT EXISTS (SELECT cssp.id_ FROM course_schedule_student_payment cssp LEFT JOIN course_schedule cs ON
+            cs.id_=cssp.course_schedule_id_ WHERE cssp.user_id_=sees.student_id_ AND cssp.group_type_='VIP' AND
+            class_date_ BETWEEN #{monday} AND #{sunday})
+        </if>
+        <if test="existPracticeCourse!=null and existPracticeCourse==1">
+            AND EXISTS (SELECT cssp.id_ FROM course_schedule_student_payment cssp LEFT JOIN course_schedule cs ON
+            cs.id_=cssp.course_schedule_id_ LEFT JOIN practice_group pg ON pg.id_=cssp.music_group_id_ WHERE
+            cssp.user_id_=sees.student_id_ AND cssp.group_type_='PRACTICE' AND pg.type_='CHARGE' AND class_date_ BETWEEN
+            #{monday} AND #{sunday})
+        </if>
+        <if test="existPracticeCourse!=null and existPracticeCourse==0">
+            AND NOT EXISTS (SELECT cssp.id_ FROM course_schedule_student_payment cssp LEFT JOIN course_schedule cs ON
+            cs.id_=cssp.course_schedule_id_ LEFT JOIN practice_group pg ON pg.id_=cssp.music_group_id_ WHERE
+            cssp.user_id_=sees.student_id_ AND cssp.group_type_='PRACTICE' AND pg.type_='CHARGE' AND class_date_ BETWEEN
+            #{monday} AND #{sunday})
+        </if>
+
+        <if test="expectExercisesNum!=null">
+            AND expect_exercises_num_ = #{expectExercisesNum}
+        </if>
+        <if test="actualExercisesNumIsAchieve!=null and actualExercisesNumIsAchieve==0">
+            AND actual_exercises_num_ &lt; expect_exercises_num_
+        </if>
+        <if test="actualExercisesNumIsAchieve!=null and actualExercisesNumIsAchieve==1">
+            AND actual_exercises_num_ &gt;= expect_exercises_num_
+        </if>
+        <if test="submitStartDate==null or submitEndDate==null">
+            <if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==0">
+                AND exercises_reply_num_ &lt; actual_exercises_num_
+            </if>
+            <if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==1">
+                AND exercises_reply_num_ &gt;= actual_exercises_num_
+            </if>
+            <if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
+                AND exercises_message_num_ &lt; exercises_reply_num_
+            </if>
+            <if test="serviceIsError!=null and serviceIsError">
+                AND (actual_exercises_num_ &lt; expect_exercises_num_ OR exercises_message_num_ &lt;
+                exercises_reply_num_)
+            </if>
+            <if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
+                AND exercises_message_num_ &gt;= exercises_reply_num_
+            </if>
+            <if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==0">
+                AND exercises_message_timely_num_ &lt; exercises_message_num_
+            </if>
+            <if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==1">
+                AND exercises_message_timely_num_ &gt;= exercises_message_num_
+            </if>
+        </if>
+        <if test="submitStartDate!=null and submitEndDate!=null">
+            <if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==0">
+                AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND
+                #{submitEndDate},exercises_reply_num_,0) &lt; actual_exercises_num_
+            </if>
+            <if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==1">
+                AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND
+                #{submitEndDate},exercises_reply_num_,0) &gt;= actual_exercises_num_
+            </if>
+            <if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
+                AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND
+                #{submitEndDate},exercises_message_num_,0) &lt; exercises_reply_num_
+            </if>
+            <if test="serviceIsError!=null and serviceIsError">
+                AND (actual_exercises_num_ &lt; expect_exercises_num_ OR IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d')
+                BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0) &lt; exercises_reply_num_)
+            </if>
+            <if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
+                AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND
+                #{submitEndDate},exercises_message_num_,0) &gt;= exercises_reply_num_
+            </if>
+            <if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==0">
+                AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND
+                #{submitEndDate},exercises_message_timely_num_,0) &lt; exercises_message_num_
+            </if>
+            <if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==1">
+                AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND
+                #{submitEndDate},exercises_message_timely_num_,0) &gt;= exercises_message_num_
+            </if>
+        </if>
+        ) tmp
+    </select>
+
+    <select id="findExercisesSituationsById" resultMap="StudentExtracurricularExercisesSituation">
+        SELECT * FROM student_extracurricular_exercises_situation_ WHERE id_ IN
+        <foreach collection="ids" item="id" separator="," open="(" close=")">
+            #{id}
+        </foreach>
+    </select>
+
+    <select id="findTeacherExercisesServiceSituations" resultType="com.ym.mec.biz.dal.dto.TeacherExercisesServiceDto">
+        SELECT
+        teacher_id_ teacherId,
+        COUNT( exercises_reply_num_ ) expectExercisesNum,
+        COUNT( CASE WHEN actual_exercises_num_ = 1 THEN 1 ELSE NULL END ) actualExercisesNum
+        FROM
+        student_extracurricular_exercises_situation_
+        FORCE INDEX(monday_)
+        WHERE monday_ = #{monday}
+        AND teacher_id_ IN
+        <foreach collection="teacherIds" item="teacherId" open="(" close=")" separator=",">
+            #{teacherId}
+        </foreach>
+        GROUP BY
+        teacher_id_;
+    </select>
+
+    <select id="findLastWeekTodayUpdateNum" resultType="int">
+        SELECT COUNT(id_) FROM student_extracurricular_exercises_situation_ WHERE sunday_=#{sunday} AND
+        DATE_FORMAT(update_time_,'%Y-%m-%d')=DATE_FORMAT(NOW(),'%Y-%m-%d')
         <if test="tenantId != null">
-        and tenant_id_ = #{tenantId}
+            and tenant_id_ = #{tenantId}
         </if>
     </select>
 
-	<select id="findStudentExercisesSituationsWithMonDay" resultMap="StudentExtracurricularExercisesSituation">
-		SELECT * FROM student_extracurricular_exercises_situation_ WHERE monday_=#{monday} AND student_id_=#{studentId}
-	</select>
-
-	<select id="getNoFinishedServiceTeacher" resultType="java.util.Map">
-		SELECT
-			teacher_id_ AS 'key',
-			COUNT( student_id_ ) AS 'value'
-		FROM
-			student_extracurricular_exercises_situation_
-		WHERE
-			actual_exercises_num_ = 0
-			AND serve_type_ = 'EXERCISE'
-			AND monday_ = #{monday}
-			AND teacher_id_ IS NOT NULL
-		GROUP BY
-			teacher_id_
-	</select>
-
-	<select id="countWeekServiceNum" resultType="int">
-		SELECT COUNT(id_) FROM student_extracurricular_exercises_situation_ WHERE monday_=#{monday} 
+    <select id="findStudentExercisesSituationsWithMonDay" resultMap="StudentExtracurricularExercisesSituation">
+        SELECT *
+        FROM student_extracurricular_exercises_situation_
+        WHERE monday_ = #{monday}
+          AND student_id_ = #{studentId}
+    </select>
+
+    <select id="getNoFinishedServiceTeacher" resultType="java.util.Map">
+        SELECT teacher_id_ AS 'key', COUNT( student_id_ ) AS 'value'
+        FROM student_extracurricular_exercises_situation_
+        WHERE actual_exercises_num_ = 0
+          AND serve_type_ = 'EXERCISE'
+          AND monday_ = #{monday}
+          AND teacher_id_ IS NOT NULL
+        GROUP BY teacher_id_
+    </select>
+
+    <select id="countWeekServiceNum" resultType="int">
+        SELECT COUNT(id_) FROM student_extracurricular_exercises_situation_ WHERE monday_=#{monday}
         <if test="tenantId != null">
-        and tenant_id_ = #{tenantId}
-        </if>
-	</select>
-
-	<select id="findWeekServiceWithStudents" resultMap="StudentExtracurricularExercisesSituation">
-		SELECT * FROM student_extracurricular_exercises_situation_
-		<where>
-			teacher_id_=#{teacherId}
-			<if test="monday != null and monday != ''">
-				AND monday_ = #{monday}
-			</if>
-			<if test="studentIds!=null and studentIds.size()>0">
-				AND student_id_ IN
-				<foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
-					#{studentId}
-				</foreach>
-			</if>
-		</where>
-	</select>
+            and tenant_id_ = #{tenantId}
+        </if>
+    </select>
+
+    <select id="findWeekServiceWithStudents" resultMap="StudentExtracurricularExercisesSituation">
+        SELECT * FROM student_extracurricular_exercises_situation_
+        <where>
+            teacher_id_=#{teacherId}
+            <if test="monday != null and monday != ''">
+                AND monday_ = #{monday}
+            </if>
+            <if test="studentIds!=null and studentIds.size()>0">
+                AND student_id_ IN
+                <foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
+                    #{studentId}
+                </foreach>
+            </if>
+        </where>
+    </select>
     <select id="findTeacherNoStartServices" resultMap="StudentExtracurricularExercisesSituation">
-		SELECT * FROM student_extracurricular_exercises_situation_ WHERE teacher_id_=#{teacherId} AND actual_exercises_num_&lt;=0 AND serve_type_='HOMEWORK';
-	</select>
-
-
-	<select id="getTeacherHomeworkCourseIdsWithMonday" resultType="string">
-		SELECT course_ids_ FROM student_extracurricular_exercises_situation_
-		WHERE teacher_id_=#{teacherId}
-		  	AND serve_type_='HOMEWORK'
-			<if test="monday!=null and monday!=''">
-				AND monday_=#{monday}
-			</if>
-	</select>
-
-	<select id="findServiceWithCourse"
-			resultMap="StudentExtracurricularExercisesSituation">
-		SELECT * FROM student_extracurricular_exercises_situation_ WHERE monday_=#{monday} AND FIND_IN_SET(#{courseId}, course_ids_)
-	</select>
-
-	<resultMap id="TeacherServeDto" type="com.ym.mec.biz.dal.dto.TeacherServeDto">
-		<result column="organ_name_" property="organName"/>
-		<result column="monday_" property="monday"/>
-		<result column="sunday_" property="sunday"/>
-		<result column="teacher_id_" property="teacherId"/>
-		<result column="teacher_name_" property="teacherName"/>
-		<result column="homework_num_" property="homeworkNum"/>
-		<result column="exercise_num_" property="exerciseNum"/>
-		<result column="un_done_" property="unDone"/>
-		<result column="remind_time_" property="remindDate"/>
-		<result column="operator_name_" property="operatorName"/>
-		<result column="job_nature_" property="jobNature" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
-		<result column="expect_exercises_num_" property="expectExercisesNum" />
-		<result column="actual_exercises_num_" property="actualExercisesNum" />
-		<result column="exercises_reply_num_" property="exercisesReplyNum" />
-		<result column="exercises_message_num_" property="exercisesMessageNum" />
-		<result column="exercises_message_timely_num_" property="exercisesMessageTimelyNum" />
-	</resultMap>
-
-	<sql id="queryTeacherServeInfoCondition">
-		<where>
-			sees.tenant_id_ = #{tenantId} 
-			<if test="organIds != null and organIds.size()>0">
-				AND tea.organ_id_ IN
-				<foreach collection="organIds" item="organId" open="(" close=")" separator=",">
-					#{organId}
-				</foreach>
-			</if>
-			<if test="monday!=null and monday!='' and sunday!=null and sunday!=''">
-				AND sees.monday_ BETWEEN #{monday} AND #{sunday}
-			</if>
-			<if test="teacherId!=null">
-				AND sees.teacher_id_ = #{teacherId}
-			</if>
-			<if test="reminded!=null and reminded==0">
-				AND NOT EXISTS (SELECT id_ FROM teacher_remind WHERE teacher_id_=sees.teacher_id_ AND monday_ = sees.monday_ AND type_='SERVICE')
-			</if>
-			<if test="reminded!=null and reminded==1">
-				AND EXISTS (SELECT id_ FROM teacher_remind WHERE teacher_id_=sees.teacher_id_ AND monday_ = sees.monday_ AND type_='SERVICE')
-			</if>
-			<if test="operatorId!=null">
-				AND EXISTS (SELECT id_ FROM teacher_remind WHERE operator_id_=#{operatorId} AND teacher_id_=sees.teacher_id_ AND monday_ = sees.monday_ AND type_='SERVICE')
-			</if>
-			<if test="jobNature!=null">
-				AND tea.job_nature_=#{jobNature,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
-			</if>
-		</where>
-	</sql>
-
-	<select id="queryTeacherServeInfo" resultMap="TeacherServeDto">
-		SELECT
-			organ.name_ organ_name_,
-			sees.monday_,
-			sees.sunday_,
-			sees.teacher_id_,
-			su.real_name_ teacher_name_,
-		    tea.job_nature_,
-			SUM(expect_exercises_num_) expect_exercises_num_,
-			SUM(actual_exercises_num_) actual_exercises_num_,
-			SUM(exercises_reply_num_) exercises_reply_num_,
-			SUM(exercises_message_num_) exercises_message_num_,
-			SUM(exercises_message_timely_num_) exercises_message_timely_num_,
-			SUM(CASE sees.serve_type_ WHEN 'HOMEWORK' THEN sees.expect_exercises_num_ ELSE 0 END) homework_num_,
-			SUM(CASE sees.serve_type_ WHEN 'EXERCISE' THEN 1 ELSE 0 END) exercise_num_,
-			SUM( sees.expect_exercises_num_-sees.not_over_course_num_ )> SUM( sees.actual_exercises_num_ ) un_done_
-		FROM
-			student_extracurricular_exercises_situation_ sees
-			LEFT JOIN teacher tea ON tea.id_=sees.teacher_id_
-			LEFT JOIN organization organ ON organ.id_=tea.organ_id_
-			LEFT JOIN sys_user su ON tea.id_=su.id_
-		<include refid="queryTeacherServeInfoCondition" />
-		GROUP BY sees.monday_,sees.sunday_,sees.teacher_id_
-		<trim prefix="HAVING" prefixOverrides="AND">
-			<if test="unDone!=null">
-				<if test="unDone==1">
-					AND SUM( sees.expect_exercises_num_-sees.not_over_course_num_ ) &gt; SUM( sees.actual_exercises_num_ )
-				</if>
-				<if test="unDone==0">
-					AND SUM( sees.expect_exercises_num_-sees.not_over_course_num_ ) &lt;= SUM( sees.actual_exercises_num_ )
-				</if>
-			</if>
-			<if test="actualExercisesNumIsAchieve!=null and actualExercisesNumIsAchieve==0">
-				AND SUM(actual_exercises_num_) &lt; SUM(expect_exercises_num_)
-			</if>
-			<if test="actualExercisesNumIsAchieve!=null and actualExercisesNumIsAchieve==1">
-				AND SUM(actual_exercises_num_) &gt;= SUM(expect_exercises_num_)
-			</if>
-			<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==0">
-				AND SUM(exercises_reply_num_) &lt; SUM(actual_exercises_num_)
-			</if>
-			<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==1">
-				AND SUM(exercises_reply_num_) &gt;= SUM(actual_exercises_num_)
-			</if>
-			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
-				AND SUM(exercises_message_num_) &lt; SUM(exercises_reply_num_)
-			</if>
-			<if test="serviceIsError!=null and serviceIsError">
-				AND (SUM(actual_exercises_num_) &lt; SUM(expect_exercises_num_) OR SUM(exercises_message_num_) &lt; SUM(exercises_reply_num_))
-			</if>
-			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
-				AND SUM(exercises_message_num_) &gt;= SUM(exercises_reply_num_)
-			</if>
-			<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==0">
-				AND SUM(exercises_message_timely_num_) &lt; SUM(exercises_message_num_)
-			</if>
-			<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==1">
-				AND SUM(exercises_message_timely_num_) &gt;= SUM(exercises_message_num_)
-			</if>
-		</trim>
-		ORDER BY sees.monday_,sees.sunday_,sees.teacher_id_
-		<include refid="global.limit"></include>
-	</select>
-
-	<select id="countTeacherServeInfo" resultType="int">
-		SELECT COUNT(1) FROM (
-			SELECT
-				sees.id_
-			FROM
-				student_extracurricular_exercises_situation_ sees
-				LEFT JOIN teacher tea ON tea.id_=sees.teacher_id_
-			<include refid="queryTeacherServeInfoCondition" />
-			GROUP BY sees.monday_,sees.sunday_,sees.teacher_id_
-			<trim prefix="HAVING" prefixOverrides="AND">
-				<if test="unDone!=null">
-					<if test="unDone==1">
-						AND SUM( sees.expect_exercises_num_-sees.not_over_course_num_ ) &gt; SUM( sees.actual_exercises_num_ )
-					</if>
-					<if test="unDone==0">
-						AND SUM( sees.expect_exercises_num_-sees.not_over_course_num_ ) &lt;= SUM( sees.actual_exercises_num_ )
-					</if>
-				</if>
-				<if test="actualExercisesNumIsAchieve!=null and actualExercisesNumIsAchieve==0">
-					AND SUM(actual_exercises_num_) &lt; SUM(expect_exercises_num_)
-				</if>
-				<if test="actualExercisesNumIsAchieve!=null and actualExercisesNumIsAchieve==1">
-					AND SUM(actual_exercises_num_) &gt;= SUM(expect_exercises_num_)
-				</if>
-				<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==0">
-					AND SUM(exercises_reply_num_) &lt; SUM(actual_exercises_num_)
-				</if>
-				<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==1">
-					AND SUM(exercises_reply_num_) &gt;= SUM(actual_exercises_num_)
-				</if>
-				<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
-					AND SUM(exercises_message_num_) &lt; SUM(exercises_reply_num_)
-				</if>
-				<if test="serviceIsError!=null and serviceIsError">
-					AND (SUM(actual_exercises_num_) &lt; SUM(expect_exercises_num_) OR SUM(exercises_message_num_) &lt; SUM(exercises_reply_num_))
-				</if>
-				<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
-					AND SUM(exercises_message_num_) &gt;= SUM(exercises_reply_num_)
-				</if>
-				<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==0">
-					AND SUM(exercises_message_timely_num_) &lt; SUM(exercises_message_num_)
-				</if>
-				<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==1">
-					AND SUM(exercises_message_timely_num_) &gt;= SUM(exercises_message_num_)
-				</if>
-			</trim>
-			ORDER BY sees.monday_,sees.sunday_,sees.teacher_id_
-		) e
-	</select>
-
-	<select id="findTeacherServeWithDate" resultMap="StudentExtracurricularExercisesSituation">
-		SELECT * FROM student_extracurricular_exercises_situation_
-		WHERE monday_ BETWEEN #{monday} AND #{sunday}
-			<if test="serveType!=null and serveType!=''">
-				AND serve_type_=#{serveType}
-			</if>
-			  AND teacher_id_ IN
-			  <foreach collection="teacherIds" item="teacherId" open="(" close=")" separator=",">
-				  #{teacherId}
-			  </foreach>
-	</select>
-
-	<select id="getHomeworkData" resultMap="com.ym.mec.biz.dal.dao.IndexBaseMonthDataDao.IndexBaseMonthData">
-		SELECT
-		sees.monday_ month_,
-		<choose>
-			<when test="type == 'submit'">
-				SUM(sees.actual_exercises_num_) total_num_,
-				SUM(sees.exercises_reply_num_) activate_num_,
-				TRUNCATE(SUM(sees.exercises_reply_num_)/SUM(sees.actual_exercises_num_)*100, 2) percent_
-			</when>
-			<when test="type == 'comment'">
-				SUM(sees.exercises_reply_num_) total_num_,
-				SUM(sees.exercises_message_num_) activate_num_,
-				TRUNCATE(SUM(sees.exercises_message_num_)/SUM(sees.exercises_reply_num_)*100, 2) percent_
-			</when>
-			<otherwise>
-				SUM(sees.expect_exercises_num_-sees.not_over_course_num_) total_num_,
-				SUM(sees.actual_exercises_num_) activate_num_,
-				TRUNCATE(SUM(sees.actual_exercises_num_)/SUM(sees.expect_exercises_num_-sees.not_over_course_num_)*100, 2) percent_
-			</otherwise>
-		</choose>
-		FROM student_extracurricular_exercises_situation_ sees
-		LEFT JOIN teacher tea ON sees.teacher_id_=tea.id_
-		WHERE tea.job_nature_='FULL_TIME'
-		AND DATE_FORMAT(sees.monday_, '%Y-%m-%d')&gt;=#{startDay}
-		AND DATE_FORMAT(sees.sunday_, '%Y-%m-%d')&lt;=#{endDay}
-		AND (sees.serve_type_ = 'EXERCISE' OR EXISTS (SELECT id_ FROM course_schedule WHERE group_type_='MUSIC' AND music_group_id_=#{musicGroupId} AND FIND_IN_SET(id_, sees.course_ids_)))
-		AND sees.student_id_ IN
-		<foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
-			#{studentId}
-		</foreach>
-		GROUP BY sees.monday_
-	</select>
-
-	<select id="queryCourseIdByClassDate" resultType="java.lang.Long">
-		SELECT DISTINCT csts.course_schedule_id_ FROM course_schedule_teacher_salary csts
-		LEFT JOIN course_schedule cs ON cs.id_ = csts.course_schedule_id_
-		LEFT JOIN student_extracurricular_exercises_situation_ se ON se.teacher_id_ = csts.user_id_
-		WHERE csts.user_id_ = #{teacherId} AND cs.class_date_ BETWEEN #{firstDayOfMonth} AND #{lastDayOfMonth}
-		AND FIND_IN_SET(cs.id_,se.course_ids_) AND se.serve_type_ = 'HOMEWORK'
-	</select>
-
-	<select id="countWaitCreateHomeworkNum" resultType="java.lang.Integer">
-		SELECT COUNT(id_) FROM student_extracurricular_exercises_situation_ WHERE teacher_id_ = #{teacherId}
-		AND expect_exercises_num_ > actual_exercises_num_ AND DATE_FORMAT(NOW(), '%Y-%m-%d') BETWEEN monday_ AND sunday_
-		AND serve_type_ = 'EXERCISE'
-	</select>
-	<select id="countWaitCreateHomeworkNum1" resultType="java.lang.Integer">
-		SELECT SUM(t.num_) FROM (
-		SELECT COUNT(se.id_) num_ FROM student_extracurricular_exercises_situation_ se
-		LEFT JOIN course_schedule cs ON FIND_IN_SET(cs.id_,se.course_ids_)
-		WHERE se.teacher_id_ = #{teacherId}
-		AND se.expect_exercises_num_ > se.actual_exercises_num_ AND DATE_FORMAT(NOW(), '%Y-%m-%d') BETWEEN se.monday_ AND se.sunday_
-		AND se.serve_type_ = 'HOMEWORK' AND cs.group_type_ = 'MUSIC' AND cs.class_date_ = DATE_FORMAT(NOW(), '%Y-%m-%d')
-		UNION ALL
-		SELECT COUNT(se.id_) num_ FROM student_extracurricular_exercises_situation_ se
-		LEFT JOIN course_schedule cs ON FIND_IN_SET(cs.id_,se.course_ids_)
-		WHERE se.teacher_id_ = #{teacherId}
-		AND se.expect_exercises_num_ > se.actual_exercises_num_ AND DATE_FORMAT(NOW(), '%Y-%m-%d') BETWEEN se.monday_ AND se.sunday_
-		AND se.serve_type_ = 'HOMEWORK' AND cs.group_type_ != 'MUSIC' AND cs.class_date_ &lt;= DATE_FORMAT(NOW(), '%Y-%m-%d'))t
-	</select>
-
-	<select id="queryTeacherPerformanceIndicator" resultMap="TeacherServeDto">
-		SELECT
-			organ.name_ organ_name_,
-			sees.monday_,
-			sees.sunday_,
-			sees.teacher_id_,
-			su.real_name_ teacher_name_,
-		    tea.job_nature_,
-			SUM(expect_exercises_num_) expect_exercises_num_,
-			SUM(actual_exercises_num_) actual_exercises_num_,
-			SUM(exercises_reply_num_) exercises_reply_num_,
-			SUM(exercises_message_num_) exercises_message_num_,
-			SUM(exercises_message_timely_num_) exercises_message_timely_num_,
-			SUM(CASE sees.serve_type_ WHEN 'HOMEWORK' THEN sees.expect_exercises_num_ ELSE 0 END) homework_num_,
-			SUM(CASE sees.serve_type_ WHEN 'EXERCISE' THEN 1 ELSE 0 END) exercise_num_,
-			SUM( sees.expect_exercises_num_-sees.not_over_course_num_ )> SUM( sees.actual_exercises_num_ ) un_done_
-		FROM
-			student_extracurricular_exercises_situation_ sees
-			LEFT JOIN teacher tea ON tea.id_=sees.teacher_id_
-			LEFT JOIN organization organ ON organ.id_=tea.organ_id_
-			LEFT JOIN sys_user su ON tea.id_=su.id_
-		<include refid="queryTeacherServeInfoCondition" />
-		GROUP BY sees.teacher_id_
-		ORDER BY sees.teacher_id_
-		<include refid="global.limit"></include>
-	</select>
-	<select id="getHomeworkSituations" resultType="java.util.Date">
-		SELECT cs.class_date_ FROM student_extracurricular_exercises_situation_ sees
-		LEFT JOIN course_schedule cs ON FIND_IN_SET(cs.id_,sees.course_ids_)
-		WHERE sees.serve_type_ = #{serveType} AND cs.id_ != #{courseScheduleId} AND cs.music_group_id_ = #{musicGroupId}
-		AND sees.monday_ = #{month} AND sees.student_id_ = #{userId}
-	</select>
+        SELECT *
+        FROM student_extracurricular_exercises_situation_
+        WHERE teacher_id_ = #{teacherId}
+          AND actual_exercises_num_ &lt;= 0
+          AND serve_type_ = 'HOMEWORK';
+    </select>
+
+
+    <select id="getTeacherHomeworkCourseIdsWithMonday" resultType="string">
+        SELECT course_ids_ FROM student_extracurricular_exercises_situation_
+        WHERE teacher_id_=#{teacherId}
+        AND serve_type_='HOMEWORK'
+        <if test="monday!=null and monday!=''">
+            AND monday_=#{monday}
+        </if>
+    </select>
+
+    <select id="findServiceWithCourse"
+            resultMap="StudentExtracurricularExercisesSituation">
+        SELECT *
+        FROM student_extracurricular_exercises_situation_
+        WHERE monday_ = #{monday}
+          AND FIND_IN_SET(#{courseId}, course_ids_)
+    </select>
+
+    <resultMap id="TeacherServeDto" type="com.ym.mec.biz.dal.dto.TeacherServeDto">
+        <result column="organ_name_" property="organName"/>
+        <result column="monday_" property="monday"/>
+        <result column="sunday_" property="sunday"/>
+        <result column="teacher_id_" property="teacherId"/>
+        <result column="teacher_name_" property="teacherName"/>
+        <result column="homework_num_" property="homeworkNum"/>
+        <result column="exercise_num_" property="exerciseNum"/>
+        <result column="un_done_" property="unDone"/>
+        <result column="remind_time_" property="remindDate"/>
+        <result column="operator_name_" property="operatorName"/>
+        <result column="job_nature_" property="jobNature" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result column="expect_exercises_num_" property="expectExercisesNum"/>
+        <result column="actual_exercises_num_" property="actualExercisesNum"/>
+        <result column="exercises_reply_num_" property="exercisesReplyNum"/>
+        <result column="exercises_message_num_" property="exercisesMessageNum"/>
+        <result column="exercises_message_timely_num_" property="exercisesMessageTimelyNum"/>
+    </resultMap>
+
+
+    <sql id="queryTeacherServeInfoCondition">
+        <where>
+            sees.tenant_id_ = #{tenantId}
+            <if test="organIds != null and organIds.size()>0">
+                AND tea.organ_id_ IN
+                <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+                    #{organId}
+                </foreach>
+            </if>
+            <if test="monday!=null and monday!='' and sunday!=null and sunday!=''">
+                AND sees.monday_ BETWEEN #{monday} AND #{sunday}
+            </if>
+            <if test="teacherId!=null">
+                AND sees.teacher_id_ = #{teacherId}
+            </if>
+            <if test="reminded!=null and reminded==0">
+                AND NOT EXISTS (SELECT id_ FROM teacher_remind WHERE teacher_id_=sees.teacher_id_ AND monday_ =
+                sees.monday_ AND type_='SERVICE')
+            </if>
+            <if test="reminded!=null and reminded==1">
+                AND EXISTS (SELECT id_ FROM teacher_remind WHERE teacher_id_=sees.teacher_id_ AND monday_ = sees.monday_
+                AND type_='SERVICE')
+            </if>
+            <if test="operatorId!=null">
+                AND EXISTS (SELECT id_ FROM teacher_remind WHERE operator_id_=#{operatorId} AND
+                teacher_id_=sees.teacher_id_ AND monday_ = sees.monday_ AND type_='SERVICE')
+            </if>
+            <if test="jobNature!=null">
+                AND tea.job_nature_=#{jobNature,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+            </if>
+        </where>
+    </sql>
+
+    <select id="queryTeacherServeInfo" resultMap="TeacherServeDto">
+        SELECT
+        organ.name_ organ_name_,
+        sees.monday_,
+        sees.sunday_,
+        sees.teacher_id_,
+        su.real_name_ teacher_name_,
+        tea.job_nature_,
+        SUM(expect_exercises_num_) expect_exercises_num_,
+        SUM(actual_exercises_num_) actual_exercises_num_,
+        SUM(exercises_reply_num_) exercises_reply_num_,
+        SUM(exercises_message_num_) exercises_message_num_,
+        SUM(exercises_message_timely_num_) exercises_message_timely_num_,
+        SUM(CASE sees.serve_type_ WHEN 'HOMEWORK' THEN sees.expect_exercises_num_ ELSE 0 END) homework_num_,
+        SUM(CASE sees.serve_type_ WHEN 'EXERCISE' THEN 1 ELSE 0 END) exercise_num_,
+        SUM( sees.expect_exercises_num_-sees.not_over_course_num_ )> SUM( sees.actual_exercises_num_ ) un_done_
+        FROM
+        student_extracurricular_exercises_situation_ sees
+        LEFT JOIN teacher tea ON tea.id_=sees.teacher_id_
+        LEFT JOIN organization organ ON organ.id_=tea.organ_id_
+        LEFT JOIN sys_user su ON tea.id_=su.id_
+        <include refid="queryTeacherServeInfoCondition"/>
+        GROUP BY sees.monday_,sees.sunday_,sees.teacher_id_
+        <trim prefix="HAVING" prefixOverrides="AND">
+            <if test="unDone!=null">
+                <if test="unDone==1">
+                    AND SUM( sees.expect_exercises_num_-sees.not_over_course_num_ ) &gt; SUM( sees.actual_exercises_num_
+                    )
+                </if>
+                <if test="unDone==0">
+                    AND SUM( sees.expect_exercises_num_-sees.not_over_course_num_ ) &lt;= SUM(
+                    sees.actual_exercises_num_ )
+                </if>
+            </if>
+            <if test="actualExercisesNumIsAchieve!=null and actualExercisesNumIsAchieve==0">
+                AND SUM(actual_exercises_num_) &lt; SUM(expect_exercises_num_)
+            </if>
+            <if test="actualExercisesNumIsAchieve!=null and actualExercisesNumIsAchieve==1">
+                AND SUM(actual_exercises_num_) &gt;= SUM(expect_exercises_num_)
+            </if>
+            <if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==0">
+                AND SUM(exercises_reply_num_) &lt; SUM(actual_exercises_num_)
+            </if>
+            <if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==1">
+                AND SUM(exercises_reply_num_) &gt;= SUM(actual_exercises_num_)
+            </if>
+            <if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
+                AND SUM(exercises_message_num_) &lt; SUM(exercises_reply_num_)
+            </if>
+            <if test="serviceIsError!=null and serviceIsError">
+                AND (SUM(actual_exercises_num_) &lt; SUM(expect_exercises_num_) OR SUM(exercises_message_num_) &lt;
+                SUM(exercises_reply_num_))
+            </if>
+            <if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
+                AND SUM(exercises_message_num_) &gt;= SUM(exercises_reply_num_)
+            </if>
+            <if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==0">
+                AND SUM(exercises_message_timely_num_) &lt; SUM(exercises_message_num_)
+            </if>
+            <if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==1">
+                AND SUM(exercises_message_timely_num_) &gt;= SUM(exercises_message_num_)
+            </if>
+        </trim>
+        ORDER BY sees.monday_,sees.sunday_,sees.teacher_id_
+        <include refid="global.limit"></include>
+    </select>
+
+    <select id="countTeacherServeInfo" resultType="int">
+        SELECT COUNT(1) FROM (
+        SELECT
+        sees.id_
+        FROM
+        student_extracurricular_exercises_situation_ sees
+        LEFT JOIN teacher tea ON tea.id_=sees.teacher_id_
+        <include refid="queryTeacherServeInfoCondition"/>
+        GROUP BY sees.monday_,sees.sunday_,sees.teacher_id_
+        <trim prefix="HAVING" prefixOverrides="AND">
+            <if test="unDone!=null">
+                <if test="unDone==1">
+                    AND SUM( sees.expect_exercises_num_-sees.not_over_course_num_ ) &gt; SUM( sees.actual_exercises_num_
+                    )
+                </if>
+                <if test="unDone==0">
+                    AND SUM( sees.expect_exercises_num_-sees.not_over_course_num_ ) &lt;= SUM(
+                    sees.actual_exercises_num_ )
+                </if>
+            </if>
+            <if test="actualExercisesNumIsAchieve!=null and actualExercisesNumIsAchieve==0">
+                AND SUM(actual_exercises_num_) &lt; SUM(expect_exercises_num_)
+            </if>
+            <if test="actualExercisesNumIsAchieve!=null and actualExercisesNumIsAchieve==1">
+                AND SUM(actual_exercises_num_) &gt;= SUM(expect_exercises_num_)
+            </if>
+            <if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==0">
+                AND SUM(exercises_reply_num_) &lt; SUM(actual_exercises_num_)
+            </if>
+            <if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==1">
+                AND SUM(exercises_reply_num_) &gt;= SUM(actual_exercises_num_)
+            </if>
+            <if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
+                AND SUM(exercises_message_num_) &lt; SUM(exercises_reply_num_)
+            </if>
+            <if test="serviceIsError!=null and serviceIsError">
+                AND (SUM(actual_exercises_num_) &lt; SUM(expect_exercises_num_) OR SUM(exercises_message_num_) &lt;
+                SUM(exercises_reply_num_))
+            </if>
+            <if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
+                AND SUM(exercises_message_num_) &gt;= SUM(exercises_reply_num_)
+            </if>
+            <if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==0">
+                AND SUM(exercises_message_timely_num_) &lt; SUM(exercises_message_num_)
+            </if>
+            <if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==1">
+                AND SUM(exercises_message_timely_num_) &gt;= SUM(exercises_message_num_)
+            </if>
+        </trim>
+        ORDER BY sees.monday_,sees.sunday_,sees.teacher_id_
+        ) e
+    </select>
+
+    <select id="findTeacherServeWithDate" resultMap="StudentExtracurricularExercisesSituation">
+        SELECT * FROM student_extracurricular_exercises_situation_
+        WHERE monday_ BETWEEN #{monday} AND #{sunday}
+        <if test="serveType!=null and serveType!=''">
+            AND serve_type_=#{serveType}
+        </if>
+        AND teacher_id_ IN
+        <foreach collection="teacherIds" item="teacherId" open="(" close=")" separator=",">
+            #{teacherId}
+        </foreach>
+    </select>
+
+    <select id="getHomeworkData" resultMap="com.ym.mec.biz.dal.dao.IndexBaseMonthDataDao.IndexBaseMonthData">
+        SELECT
+        sees.monday_ month_,
+        <choose>
+            <when test="type == 'submit'">
+                SUM(sees.actual_exercises_num_) total_num_,
+                SUM(sees.exercises_reply_num_) activate_num_,
+                TRUNCATE(SUM(sees.exercises_reply_num_)/SUM(sees.actual_exercises_num_)*100, 2) percent_
+            </when>
+            <when test="type == 'comment'">
+                SUM(sees.exercises_reply_num_) total_num_,
+                SUM(sees.exercises_message_num_) activate_num_,
+                TRUNCATE(SUM(sees.exercises_message_num_)/SUM(sees.exercises_reply_num_)*100, 2) percent_
+            </when>
+            <otherwise>
+                SUM(sees.expect_exercises_num_-sees.not_over_course_num_) total_num_,
+                SUM(sees.actual_exercises_num_) activate_num_,
+                TRUNCATE(SUM(sees.actual_exercises_num_)/SUM(sees.expect_exercises_num_-sees.not_over_course_num_)*100,
+                2) percent_
+            </otherwise>
+        </choose>
+        FROM student_extracurricular_exercises_situation_ sees
+        LEFT JOIN teacher tea ON sees.teacher_id_=tea.id_
+        WHERE tea.job_nature_='FULL_TIME'
+        AND DATE_FORMAT(sees.monday_, '%Y-%m-%d')&gt;=#{startDay}
+        AND DATE_FORMAT(sees.sunday_, '%Y-%m-%d')&lt;=#{endDay}
+        AND (sees.serve_type_ = 'EXERCISE' OR EXISTS (SELECT id_ FROM course_schedule WHERE group_type_='MUSIC' AND
+        music_group_id_=#{musicGroupId} AND FIND_IN_SET(id_, sees.course_ids_)))
+        AND sees.student_id_ IN
+        <foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
+            #{studentId}
+        </foreach>
+        GROUP BY sees.monday_
+    </select>
+
+    <select id="queryCourseIdByClassDate" resultType="java.lang.Long">
+        SELECT DISTINCT csts.course_schedule_id_
+        FROM course_schedule_teacher_salary csts
+                 LEFT JOIN course_schedule cs ON cs.id_ = csts.course_schedule_id_
+                 LEFT JOIN student_extracurricular_exercises_situation_ se ON se.teacher_id_ = csts.user_id_
+        WHERE csts.user_id_ = #{teacherId}
+          AND cs.class_date_ BETWEEN #{firstDayOfMonth} AND #{lastDayOfMonth}
+          AND FIND_IN_SET(cs.id_, se.course_ids_)
+          AND se.serve_type_ = 'HOMEWORK'
+    </select>
+
+    <select id="countWaitCreateHomeworkNum" resultType="java.lang.Integer">
+        SELECT COUNT(id_)
+        FROM student_extracurricular_exercises_situation_
+        WHERE teacher_id_ = #{teacherId}
+          AND expect_exercises_num_ > actual_exercises_num_
+          AND DATE_FORMAT(NOW(), '%Y-%m-%d') BETWEEN monday_ AND sunday_
+          AND serve_type_ = 'EXERCISE'
+    </select>
+    <select id="countWaitCreateHomeworkNum1" resultType="java.lang.Integer">
+        SELECT SUM(t.num_)
+        FROM (
+                 SELECT COUNT(se.id_) num_
+                 FROM student_extracurricular_exercises_situation_ se
+                          LEFT JOIN course_schedule cs ON FIND_IN_SET(cs.id_, se.course_ids_)
+                 WHERE se.teacher_id_ = #{teacherId}
+                   AND se.expect_exercises_num_ > se.actual_exercises_num_
+                   AND DATE_FORMAT(NOW(), '%Y-%m-%d') BETWEEN se.monday_ AND se.sunday_
+                   AND se.serve_type_ = 'HOMEWORK'
+                   AND cs.group_type_ = 'MUSIC'
+                   AND cs.class_date_ = DATE_FORMAT(NOW(), '%Y-%m-%d')
+                 UNION ALL
+                 SELECT COUNT(se.id_) num_
+                 FROM student_extracurricular_exercises_situation_ se
+                          LEFT JOIN course_schedule cs ON FIND_IN_SET(cs.id_, se.course_ids_)
+                 WHERE se.teacher_id_ = #{teacherId}
+                   AND se.expect_exercises_num_ > se.actual_exercises_num_
+                   AND DATE_FORMAT(NOW(), '%Y-%m-%d') BETWEEN se.monday_ AND se.sunday_
+                   AND se.serve_type_ = 'HOMEWORK'
+                   AND cs.group_type_ != 'MUSIC' AND cs.class_date_ &lt;= DATE_FORMAT(NOW(), '%Y-%m-%d')) t
+    </select>
+
+    <select id="queryTeacherPerformanceIndicator" resultMap="TeacherServeDto">
+        SELECT
+        organ.name_ organ_name_,
+        sees.monday_,
+        sees.sunday_,
+        sees.teacher_id_,
+        su.real_name_ teacher_name_,
+        tea.job_nature_,
+        SUM(expect_exercises_num_) expect_exercises_num_,
+        SUM(actual_exercises_num_) actual_exercises_num_,
+        SUM(exercises_reply_num_) exercises_reply_num_,
+        SUM(exercises_message_num_) exercises_message_num_,
+        SUM(exercises_message_timely_num_) exercises_message_timely_num_,
+        SUM(CASE sees.serve_type_ WHEN 'HOMEWORK' THEN sees.expect_exercises_num_ ELSE 0 END) homework_num_,
+        SUM(CASE sees.serve_type_ WHEN 'EXERCISE' THEN 1 ELSE 0 END) exercise_num_,
+        SUM( sees.expect_exercises_num_-sees.not_over_course_num_ )> SUM( sees.actual_exercises_num_ ) un_done_
+        FROM
+        student_extracurricular_exercises_situation_ sees
+        LEFT JOIN teacher tea ON tea.id_=sees.teacher_id_
+        LEFT JOIN organization organ ON organ.id_=tea.organ_id_
+        LEFT JOIN sys_user su ON tea.id_=su.id_
+        <include refid="queryTeacherServeInfoCondition"/>
+        GROUP BY sees.teacher_id_
+        ORDER BY sees.teacher_id_
+        <include refid="global.limit"></include>
+    </select>
+    <select id="getHomeworkSituations" resultType="java.util.Date">
+        SELECT cs.class_date_
+        FROM student_extracurricular_exercises_situation_ sees
+                 LEFT JOIN course_schedule cs ON FIND_IN_SET(cs.id_, sees.course_ids_)
+        WHERE sees.serve_type_ = #{serveType}
+          AND cs.id_ != #{courseScheduleId}
+          AND cs.music_group_id_ = #{musicGroupId}
+          AND sees.monday_ = #{month}
+          AND sees.student_id_ = #{userId}
+    </select>
+
+    <resultMap id="StudentServeDto" type="com.ym.mec.biz.dal.dto.StudentServeDto">
+        <result column="student_id_" property="userId"/>
+        <result column="username_" property="username"/>
+        <result column="music_group_name_" property="musicGroupName"/>
+        <result column="organ_name_" property="organName"/>
+        <result column="serve_period_" property="servePeriod"/>
+        <result column="serve_num_" property="serveNum"/>
+        <result column="actual_exercises_num_" property="actualExercisesNum"/>
+        <result column="exercises_reply_num_" property="exercisesReplyNum"/>
+        <result column="exercises_message_num_" property="exercisesMessageNum"/>
+        <result column="sign_rate_" property="signRate"/>
+        <result column="pass_rate_" property="passRate"/>
+    </resultMap>
+
+    <!-- 还差出勤率和达标率 -->
+    <select id="queryStudentServeInfo" resultMap="StudentServeDto">
+        select
+            t.student_id_,
+            t.music_group_name_,
+            concat(#{params.startTime},'至', #{params.endTime}) as serve_period_,
+            t.username_,
+            t.organ_name_,
+            ifnull(sees.serve_num_,0) as serve_num_,
+            ifnull(sees.actual_exercises_num_,0) as actual_exercises_num_,
+            ifnull(sees.exercises_reply_num_,0) as exercises_reply_num_,
+            ifnull(sees.exercises_message_num_,0) as exercises_message_num_,
+            round(ifnull(a.sign_rate_,0) * 100,2) as sign_rate_,
+            round(ifnull(a.pass_rate_,0) * 100,2) as pass_rate_
+        from (
+            select
+                a.user_id_ as student_id_,
+                group_concat(distinct b.name_) as music_group_name_,
+                u.username_,
+                organ.name_ as organ_name_
+            from student_registration a
+            left join music_group b on a.music_group_id_ = b.id_
+            left join sys_user u ON a.user_id_ = u.id_
+            LEFT JOIN organization organ ON organ.id_=u.organ_id_ and organ.del_flag_ = 0
+            where payment_status_ = 2 and b.status_ = 'PROGRESS'
+            <if test="params.tenantId != null and params.tenantId > 0">
+                AND a.tenant_id_ = #{params.tenantId}
+            </if>
+            <if test="params.organId != null and params.organId != ''">
+                AND FIND_IN_SET(u.organ_id_,#{params.organId})
+            </if>
+            group by a.user_id_
+        ) t
+        left join
+        (
+            select
+                sees.student_id_,
+                sum(sees.expect_exercises_num_) as serve_num_,
+                sum(sees.actual_exercises_num_) as actual_exercises_num_,
+                sum(sees.exercises_reply_num_) as exercises_reply_num_,
+                sum(sees.exercises_message_num_) as exercises_message_num_
+            from student_extracurricular_exercises_situation_ sees
+            left join sys_user u ON sees.student_id_ = u.id_
+            <where>
+                <if test="params.tenantId != null and params.tenantId > 0">
+                    AND sees.tenant_id_ = #{params.tenantId}
+                </if>
+                <if test="params.startTime != null and params.startTime != ''">
+                    AND DATE_FORMAT(sees.monday_, '%Y-%m-%d') &gt;= #{params.startTime}
+                </if>
+                <if test="params.endTime != null and params.endTime != ''">
+                    AND DATE_FORMAT(sees.sunday_, '%Y-%m-%d') &lt;= #{params.endTime}
+                </if>
+                <if test="params.organId != null and params.organId != ''">
+                    AND FIND_IN_SET(u.organ_id_,#{params.organId})
+                </if>
+            </where>
+            group by sees.student_id_
+        ) sees on t.student_id_ = sees.student_id_
+        left join (
+            select
+                cssp.user_id_,
+                ifnull(sum(if(sa.status_ in ('NORMAL','LATE'),1,0))/count(cs.id_),0) as sign_rate_,
+                ifnull(sum(sa.qualified_flag_)/count(cs.id_),0) as pass_rate_
+            from course_schedule cs
+            left join course_schedule_student_payment cssp on cs.id_ = cssp.course_schedule_id_
+            left join sys_user u ON cssp.user_id_ = u.id_
+            left join student_attendance sa on cssp.user_id_ = sa.user_id_ and cs.id_ = sa.course_schedule_id_
+            <where>
+                cs.del_flag_ = 0 and cs.is_lock_ = 0 AND cs.pre_course_flag_ = 0 AND cs.organ_id_ IS NOT NULL and cs.id_ is not null
+                and cs.group_type_ = 'MUSIC'
+                and (cs.new_course_id_ is null or cs.id_ = cs.new_course_id_)
+                <if test="params.tenantId != null and params.tenantId > 0">
+                    AND cs.tenant_id_ = #{params.tenantId}
+                </if>
+                <if test="params.startTime != null and params.startTime != ''">
+                    AND DATE_FORMAT(cs.class_date_, '%Y-%m-%d') &gt;= #{params.startTime}
+                </if>
+                <if test="params.endTime != null and params.endTime != ''">
+                    AND DATE_FORMAT(cs.class_date_, '%Y-%m-%d') &lt;= #{params.endTime}
+                </if>
+                <if test="params.organId != null and params.organId != ''">
+                    AND FIND_IN_SET(u.organ_id_,#{params.organId})
+                </if>
+            </where>
+            group by cssp.user_id_
+        ) a on sees.student_id_ = a.user_id_
+    </select>
 </mapper>

+ 12 - 5
mec-biz/src/main/resources/config/mybatis/StudentStatisticsMapper.xml

@@ -296,6 +296,12 @@
 			<if test="firstCourseEndTime != null">
 				AND ss.first_course_time_ &lt;= #{firstCourseEndTime}
 			</if>
+			<if test="lastVisitStartTime != null and lastVisitStartTime != '' ">
+				AND ss.last_visit_time_ >= #{lastVisitStartTime}
+			</if>
+			<if test="lastVisitEndTime != null and lastVisitEndTime != '' ">
+				AND ss.last_visit_time_ &lt;= #{lastVisitEndTime}
+			</if>
 			<if test="subCourseMinNum != null">
 				AND (ss.no_schedule_num_ + ss.sub_course_num_) >= #{subCourseMinNum}
 			</if>
@@ -321,11 +327,12 @@
 	</select>
 	<select id="queryStatistics" resultMap="StudentStatisticsDto">
 		SELECT *,ss.not_start_course_fee_ + ss.no_course_fee_ preCourseFee,
-		CASE WHEN (ss.no_schedule_num_ > 0 OR ss.sub_course_num_ > 0) AND (ss.lately_year_course_consumer_ > 0 OR ss.over_course_num_ &lt;= 0) THEN '在读'
-		WHEN ss.over_course_num_ > 0 AND (ss.sub_course_num_ > 0 OR ss.no_schedule_num_ > 0) AND ss.lately_year_course_consumer_ &lt;= 0 THEN '沉睡'
-		WHEN ss.over_course_num_ > 0 AND ss.sub_course_num_ &lt;= 0 AND ss.no_schedule_num_ &lt;= 0 AND suca.course_balance_ &lt;= 0 THEN '流失'
-		WHEN suca.course_balance_ > 0 AND ss.sub_course_num_ &lt;= 0 AND ss.no_schedule_num_ &lt;= 0 THEN '暂停' ELSE '其他' END student_status_
-		,suca.course_balance_
+			CASE WHEN (ss.no_schedule_num_ > 0 OR ss.sub_course_num_ > 0) AND (ss.lately_year_course_consumer_ > 0 OR ss.over_course_num_ &lt;= 0) THEN '在读'
+			WHEN ss.over_course_num_ > 0 AND (ss.sub_course_num_ > 0 OR ss.no_schedule_num_ > 0) AND ss.lately_year_course_consumer_ &lt;= 0 THEN '沉睡'
+			WHEN ss.over_course_num_ > 0 AND ss.sub_course_num_ &lt;= 0 AND ss.no_schedule_num_ &lt;= 0 AND suca.course_balance_ &lt;= 0 THEN '流失'
+			WHEN suca.course_balance_ > 0 AND ss.sub_course_num_ &lt;= 0 AND ss.no_schedule_num_ &lt;= 0 THEN '暂停' ELSE '其他' END student_status_
+			,suca.course_balance_,
+			ss.last_visit_time_
 		FROM student_basic_info sbi
 		LEFT JOIN student_statistics ss ON ss.user_id_ = sbi.user_id_
 		LEFT JOIN sys_user_cash_account suca ON sbi.user_id_ = suca.user_id_

+ 1 - 0
mec-student/src/main/java/com/ym/mec/student/config/ResourceServerConfig.java

@@ -34,6 +34,7 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
                 "/repair/getRepairInfo",
                 "/repair/payRepair",
                 "/degree/*",
+                "/getUploadSign",
                 "/practiceGroup/queryOrderInfo",
                 "/systemDate/query",
                 "/organization/getOrgans",

+ 6 - 1
mec-teacher/src/main/java/com/ym/mec/teacher/controller/CourseReviewController.java

@@ -16,7 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.Date;
+import java.util.Calendar;
 import java.util.List;
 import java.util.Objects;
 
@@ -113,6 +113,11 @@ public class CourseReviewController extends BaseController {
         if (Objects.isNull(sysUser)) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
+        if(null == courseHomeworkInfo.getExpiryDate()){
+            Calendar instance = Calendar.getInstance();
+            instance.add(Calendar.WEEK_OF_MONTH,1);
+            courseHomeworkInfo.setExpiryDate(instance.getTime());
+        }
         return succeed(courseReviewService.addHomeWork(courseHomeworkInfo));
     }
 

+ 6 - 0
mec-teacher/src/main/java/com/ym/mec/teacher/controller/ExtracurricularExercisesController.java

@@ -103,6 +103,12 @@ public class ExtracurricularExercisesController extends BaseController {
         if(Objects.isNull(sysUser)){
             return failed(HttpStatus.FORBIDDEN,"请登录");
         }
+        if(null == exercises.getExpireDate()){
+            Calendar instance = Calendar.getInstance();
+            instance.add(Calendar.WEEK_OF_MONTH,1);
+            exercises.setExpireDate(instance.getTime());
+        }
+
         exercises.setTeacherId(sysUser.getId());
         extracurricularExercisesService.createExtraExercises(exercises);
         return succeed();

+ 3 - 2
mec-web/src/main/java/com/ym/mec/web/controller/ClassGroupController.java

@@ -308,9 +308,10 @@ public class ClassGroupController extends BaseController {
     @ApiImplicitParams({
             @ApiImplicitParam(name = "musicGroupId", value = "乐团id", required = true, dataType = "string"),
             @ApiImplicitParam(name = "type", value = "班级类型", required = true, dataType = "string"),
+            @ApiImplicitParam(name = "hasCourse", value = "是否有剩余课程", required = true, dataType = "Boolean")
     })
-    public HttpResponseResult classGroupAndTeacher(String musicGroupId, ClassGroupTypeEnum type) throws Exception {
-        return succeed(classGroupService.getClassGroupAndTeacherByType(musicGroupId, type));
+    public HttpResponseResult classGroupAndTeacher(String musicGroupId, ClassGroupTypeEnum type,Boolean hasCourse) throws Exception {
+        return succeed(classGroupService.getClassGroupAndTeacherByType(musicGroupId, type,hasCourse));
     }
 
     @ApiOperation(value = "获取所有班级列表")

+ 0 - 2
mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleController.java

@@ -86,12 +86,10 @@ public class CourseScheduleController extends BaseController {
         if(Objects.isNull(createCourseScheduleDto.getMusicGroupID())){
             throw new BizException("请指定乐团");
         }
-        
         MusicGroup musicGroup = musicGroupService.get(createCourseScheduleDto.getMusicGroupID());
         if(musicGroup == null){
         	return failed("乐团信息不存在");
         }
-        
         List<ClassGroupTeacherMapper> byMusicGroup = classGroupTeacherMapperDao.findByMusicGroup(createCourseScheduleDto.getMusicGroupID());
         Map<Integer, List<ClassGroupTeacherMapper>> teacherByClassGroup = byMusicGroup.stream().collect(Collectors.groupingBy(ClassGroupTeacherMapper::getClassGroupId));
 

+ 1 - 1
mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java

@@ -2908,7 +2908,7 @@ public class ExportController extends BaseController {
         try {
             String[] header = {
                     "编号", "名称", "所属声部", "类型", "分类", "是否收费", "节拍器", "是否上传伴奏", "伴奏状态", "上传人", "上传时间"};
-            String[] body = {"id", "name", "subjectName", "typeName", "categoriesName", "rankIds", "openMetronomeName", "museScoreMemo","showName","createUserName","createTime"};
+            String[] body = {"id", "name", "subjectName", "typeName", "categoriesName", "rankIds", "openMetronomeName", "museScoreMemo", "showName", "createUserName", "createTime"};
             HSSFWorkbook workbook = POIUtil.exportExcel(header, body, list);
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attachment;filename=BuyFreeLiveTheoryCourse-" + DateUtil.getDate(new Date()) + ".xls");

+ 10 - 2
mec-web/src/main/java/com/ym/mec/web/controller/StudentManageController.java

@@ -11,6 +11,7 @@ import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.QueryInfo;
 import io.swagger.annotations.*;
+import io.swagger.models.auth.In;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -126,11 +127,18 @@ public class StudentManageController extends BaseController {
         return succeed(studentManageService.queryMusicGroupStudent(queryInfo));
     }
 
+    @ApiOperation(value = "乐团管理--乐团详情--学员列表--获取学员可排课时长 数据数")
+    @GetMapping("/countStudentSubTotalCourseTimes")
+    @PreAuthorize("@pcs.hasPermissions('studentManage/countStudentSubTotalCourseTimes')")
+    public HttpResponseResult<Integer> countStudentSubTotalCourseTimes(StudentSubTotalCourseTimesQueryInfo queryInfo){
+        return succeed(studentManageService.countStudentSubTotalCourseTimes(queryInfo));
+    }
+
     @ApiOperation(value = "乐团管理--乐团详情--学员列表--获取学员可排课时长")
     @GetMapping("/queryStudentSubTotalCourseTimes")
     @PreAuthorize("@pcs.hasPermissions('studentManage/queryStudentSubTotalCourseTimes')")
-    public Object queryStudentSubTotalCourseTimes(String musicGroupId){
-        return succeed(studentManageService.queryStudentSubTotalCourseTimes(musicGroupId));
+    public HttpResponseResult<PageInfo<StudentSubTotalCourseTimesDto>> queryStudentSubTotalCourseTimes(StudentSubTotalCourseTimesQueryInfo queryInfo){
+        return succeed(studentManageService.queryStudentSubTotalCourseTimes(queryInfo));
     }
 
     @ApiOperation(value = "乐团修改--学员缴费记录--可新增学员列表")

+ 24 - 1
mec-web/src/main/resources/columnMapper.ini

@@ -79,4 +79,27 @@ ID = id
 
 [直播间用户观看权限表]
 学员编号 = userId
-名称 = userName
+名称 = userName
+
+
+[活动资格导出]
+分部 = organizationName
+学员编号 = userId
+学员姓名 = username
+活动编号 = activityId
+活动名称 = activityName
+剩余排课资格 = subCourseNum
+剩余赠送排课资格 = subGiveCourseNum
+
+[乐团学生服务指标导出]
+编号 = userId
+姓名 = username
+乐团名称 = musicGroupName
+分部 = organName
+服务周期 = servePeriod
+服务指标总数 = serveNum
+已布置 = actualExercisesNum
+已提交数 = exercisesReplyNum
+点评数 = exercisesMessageNum
+出勤率 = signRate
+达标率 = passRate

+ 9 - 1
mec-web/src/main/resources/exportColumnMapper.ini

@@ -280,4 +280,12 @@ fieldColumns = ["organName", "username", "userId", "teacherName", "teacherId", "
 
 [服务指标导出]
 headColumns = ["分部","老师编号","老师姓名","预计安排(人次)","实际安排(人次)","布置率(%)","提交人数","点评次数","点评率(%)","及时点评次数","及时点评率(%)"]
-fieldColumns = ["organName","teacherId","teacherName","expectExercisesNum","actualExercisesNum", "100 * actualExercisesNum / expectExercisesNum","exercisesReplyNum","exercisesMessageNum", "100 * exercisesMessageNum / exercisesReplyNum", "exercisesMessageTimelyNum","100 * exercisesMessageTimelyNum / exercisesReplyNum"]
+fieldColumns = ["organName","teacherId","teacherName","expectExercisesNum","actualExercisesNum", "100 * actualExercisesNum / expectExercisesNum","exercisesReplyNum","exercisesMessageNum", "100 * exercisesMessageNum / exercisesReplyNum", "exercisesMessageTimelyNum","100 * exercisesMessageTimelyNum / exercisesReplyNum"]
+
+[活动资格导出]
+headColumns = ["分部","学员编号","学员姓名","活动编号","活动名称","剩余排课资格","剩余赠送排课资格"]
+fieldColumns = ["organizationName","userId","username","activityId","activityName", "subCourseNum","subGiveCourseNum"]
+
+[乐团学生服务指标导出]
+headColumns = ["编号","姓名","乐团名称","分部","服务周期","服务指标总数","已布置","已提交数","点评数","出勤率","达标率"]
+fieldColumns = ["userId","username","musicGroupName","organName","servePeriod", "serveNum","actualExercisesNum","exercisesReplyNum","exercisesMessageNum","signRate","passRate"]

部分文件因文件數量過多而無法顯示