Explorar o código

Merge remote-tracking branch 'origin/master_saas' into master_saas

zouxuan %!s(int64=3) %!d(string=hai) anos
pai
achega
0d7785ec19
Modificáronse 29 ficheiros con 1084 adicións e 761 borrados
  1. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ActivityUserMapperDao.java
  2. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupDao.java
  3. 8 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentStudentCourseDetailDao.java
  4. 76 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ExportStudentSubCourse.java
  5. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentSubTotalCourseTimesDto.java
  6. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseSchedule.java
  7. 3 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExportEnum.java
  8. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExportTypeEnum.java
  9. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentStatisticsQueryInfo.java
  10. 37 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentSubTotalCourseTimesQueryInfo.java
  11. 7 4
      mec-biz/src/main/java/com/ym/mec/biz/service/ActivityUserMapperService.java
  12. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupService.java
  13. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ExportService.java
  14. 3 1
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentManageService.java
  15. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ActivityUserMapperServiceImpl.java
  16. 147 147
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  17. 23 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java
  18. 526 526
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderDetailServiceImpl.java
  19. 25 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java
  20. 20 0
      mec-biz/src/main/resources/config/mybatis/ActivityUserMapperMapper.xml
  21. 16 3
      mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml
  22. 2 2
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  23. 111 53
      mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentStudentCourseDetailMapper.xml
  24. 8 1
      mec-biz/src/main/resources/config/mybatis/StudentStatisticsMapper.xml
  25. 3 2
      mec-web/src/main/java/com/ym/mec/web/controller/ClassGroupController.java
  26. 0 2
      mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleController.java
  27. 1 1
      mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java
  28. 10 2
      mec-web/src/main/java/com/ym/mec/web/controller/StudentManageController.java
  29. 10 1
      mec-web/src/main/resources/columnMapper.ini

+ 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);
 
 }

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

@@ -0,0 +1,76 @@
+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;
+
+    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;
+    }
+}

+ 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;

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

@@ -70,11 +70,12 @@ 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", "活动资格导出"),
+    ;
 
     private String code;
 

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

@@ -13,7 +13,8 @@ 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, "活动资格导出");
 
 	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;
     }

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

@@ -0,0 +1,37 @@
+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;
+
+    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;
+    }
+}

+ 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()));

+ 23 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java

@@ -2,7 +2,6 @@ package com.ym.mec.biz.service.impl;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
-import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.*;
@@ -33,7 +32,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.system.ApplicationHome;
 import org.springframework.core.io.ClassPathResource;
-import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
@@ -177,6 +175,9 @@ public class ExportServiceImpl implements ExportService {
     private SysUserCashAccountLogService sysUserCashAccountLogService;
     @Autowired
     private StudentStatisticsService studentStatisticsService;
+    @Autowired
+    private ActivityUserMapperService activityUserMapperService;
+
     private static final ExecutorService exportExecutorService = Executors.newFixedThreadPool(10);
     @Autowired
     private HfMerchantConfigService hfMerchantConfigService;
@@ -338,6 +339,7 @@ public class ExportServiceImpl implements ExportService {
         exportFuncMap.put(ExportEnum.STUDENT_INSTRUMENT, info -> exportStudentInstrument(info));
         exportFuncMap.put(ExportEnum.EXPORT_BILL, info -> exportBill(info));
 
+
         //导出到报表中心
 //        exportManageFuncMap.put(ExportEnum.SUPER_FIND_COURSE_SCHEDULES, (info,headColumns) -> this.superFindCourseSchedules(info,headColumns));
         //针对不同的用户有不同的模板
@@ -350,8 +352,10 @@ public class ExportServiceImpl implements ExportService {
         exportManageFuncMap.put(ExportEnum.STUDENT_VIP_COURSE_INFO, (info,headColumns) -> exportStudentVipCourseInfo(info,headColumns));
         exportManageFuncMap.put(ExportEnum.STUDENT_MUSIC_THEORY_COURSE_INFO, (info,headColumns) -> exportStudentMusicTheoryCourseInfo(info,headColumns));
         exportManageFuncMap.put(ExportEnum.VIP_STUDENT_COURSE_MANAGE, (info,headColumns) -> exportVipStudentCourseManage(info,headColumns));
+        exportManageFuncMap.put(ExportEnum.EXPORT_STUDENT_SUBCOURSE, (info,headColumns) -> exportStudentSubCourse(info,headColumns));
     }
 
+
     //导出对账单
     @Override
     public List exportBill(Map<String, Object> info){
@@ -1434,6 +1438,23 @@ public class ExportServiceImpl implements ExportService {
                 managerDownload.getName());
     }
 
+    @Override
+    public HttpResponseResult exportStudentSubCourse(Map<String, Object> info, List<String> headColumns) {
+        SysUser sysUser = sysUserService.getUser();
+        String organId = organizationService.getEmployeeOrgan(sysUser.getId(),getParam(info, "organId", String.class),sysUser.getIsSuperAdmin());
+
+        ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.EXPORT_STUDENT_SUBCOURSE,sysUser.getId());
+        Integer tenantId = TenantContextHolder.getTenantId();
+        return this.asyncExport(() -> this.queryStudentSubCourse(organId, tenantId,managerDownload,headColumns,ExportEnum.EXPORT_STUDENT_SUBCOURSE),
+                managerDownload.getName());
+    }
+
+    private void queryStudentSubCourse(String organId, Integer tenantId, ManagerDownload managerDownload, List<String> headColumns, ExportEnum exportEnum) {
+        List<ExportStudentSubCourse> rows = activityUserMapperService.exportStudentSubCourse(organId, tenantId);
+        exportManagerDownload(getHSSFWorkbook(rows,headColumns,exportEnum),managerDownload);
+    }
+
+
     //学员小课记录导出
     @Override
     public HttpResponseResult exportStudentMusicTheoryCourseInfo(Map<String, Object> info, List<String> headColumns){

+ 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);
+            }
+        }
     }
 }

+ 25 - 6
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java

@@ -883,13 +883,32 @@ 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);
+
+            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

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

@@ -305,4 +305,24 @@
 		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,
+			ifnull(su.real_name_,su.username_) as username,
+			t.activity_id_ as activityId,
+			o.name_ as organizationName,
+			vga.name_ as activityName,
+			sum(ifnull(t.sub_course_num_,0) + ifnull(sub_give_course_num_,0)) as subCourseNum
+		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.sub_course_num_>0 or t.sub_give_course_num_>0)
+		<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

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

@@ -166,7 +166,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,6 +2385,7 @@
             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,
@@ -2526,7 +2526,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}

+ 111 - 53
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,19 +258,69 @@
         <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_
+        WHERE mgpc.music_group_id_ = #{musicGroupId}
+        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>
+    </sql>
+
+    <!-- 查询当前表的总记录数 -->
+    <select id="countStudentSubTotalCourseTimes" resultType="java.lang.Integer">
+    select count(*) from (
+        SELECT
+            mgpscd.user_id_,mgpscd.course_type_
         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_
-        WHERE mgpc.music_group_id_ = #{musicGroupId}
+        <include refid="sqlStudentSubTotalCourseTimes"/>
         GROUP BY mgpscd.user_id_,mgpscd.course_type_
+    ) a
+    </select>
+
+    <select id="pageStudentSubTotalCourseTimes" resultMap="StudentSubTotalCourseTimesDto"
+            parameterType="map">
+        SELECT mgpscd.user_id_,su.username_,su.phone_,mgpscd.course_type_ 'key',mgpscd.course_type_,
+            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_
+        <include refid="sqlStudentSubTotalCourseTimes"/>
+        GROUP BY mgpscd.user_id_,mgpscd.course_type_
+        <include refid="global.limit"/>
     </select>
     <select id="findByCalenderAndUserId" resultMap="MusicGroupPaymentStudentCourseDetail">
         SELECT * FROM music_group_payment_student_course_detail WHERE music_group_payment_calender_id_ = #{calenderId}
@@ -273,7 +330,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

+ 8 - 1
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>
@@ -325,7 +331,8 @@
 		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_
+		,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_

+ 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;
@@ -129,11 +130,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 = "乐团修改--学员缴费记录--可新增学员列表")

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

@@ -79,4 +79,13 @@ ID = id
 
 [直播间用户观看权限表]
 学员编号 = userId
-名称 = userName
+名称 = userName
+
+
+[活动资格导出]
+分部 = organizationName
+学员编号 = userId
+学员姓名 = username
+活动编号 = activityId
+活动名称 = activityName
+剩余排课资格 = subCourseNum