瀏覽代碼

课程转换

zouxuan 3 年之前
父節點
當前提交
52fc305071

+ 34 - 9
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ClassGroupDto.java

@@ -9,6 +9,7 @@ import io.swagger.annotations.ApiModelProperty;
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
 import java.util.List;
+import java.util.Map;
 
 public class ClassGroupDto extends BaseEntity {
 
@@ -19,7 +20,8 @@ public class ClassGroupDto extends BaseEntity {
 	@ApiModelProperty(value = "课程组类型", required = true)
 	private GroupType groupType;
 
-	private Boolean confirmGenerate = false;
+	@ApiModelProperty(value = "确认0元课酬", required = true)
+	private Boolean allowZeroSalary = false;
 
 	/**  */
 	@ApiModelProperty(value = "乐团编号", required = true)
@@ -41,6 +43,9 @@ public class ClassGroupDto extends BaseEntity {
 	@ApiModelProperty(value = "预计招生人数", required = true)
 	private Integer expectStudentNum;
 
+	@ApiModelProperty(value = "学生数量", required = false)
+	private Integer studentNum;
+
 	/** 班级类型(普通班级、合奏班级) */
 	@ApiModelProperty(value = "班级类型(普通班级、合奏班级、提高课班级、VIP班级、试听课)", required = true)
 	@NotNull(message = "班级类型不能为空")
@@ -49,8 +54,36 @@ public class ClassGroupDto extends BaseEntity {
 	@ApiModelProperty(value = "班级老师设置", required = true)
 	private List<ClassGroupTeacherMapper> classGroupTeacherMapperList;
 
+	@ApiModelProperty(value = "排课周期", required = true)
 	private List<CourseTimeDto> courseTimeDtoList;
 
+	@ApiModelProperty(value = "获取可转换的课程时长", required = true)
+	Map<String, Integer> courseTypeMinutesMap;
+
+	public Map<String, Integer> getCourseTypeMinutesMap() {
+		return courseTypeMinutesMap;
+	}
+
+	public void setCourseTypeMinutesMap(Map<String, Integer> courseTypeMinutesMap) {
+		this.courseTypeMinutesMap = courseTypeMinutesMap;
+	}
+
+	public Boolean getAllowZeroSalary() {
+		return allowZeroSalary;
+	}
+
+	public void setAllowZeroSalary(Boolean allowZeroSalary) {
+		this.allowZeroSalary = allowZeroSalary;
+	}
+
+	public Integer getStudentNum() {
+		return studentNum;
+	}
+
+	public void setStudentNum(Integer studentNum) {
+		this.studentNum = studentNum;
+	}
+
 	public List<ClassGroupTeacherMapper> getClassGroupTeacherMapperList() {
 		return classGroupTeacherMapperList;
 	}
@@ -75,14 +108,6 @@ public class ClassGroupDto extends BaseEntity {
 		this.groupType = groupType;
 	}
 
-	public Boolean getConfirmGenerate() {
-		return confirmGenerate;
-	}
-
-	public void setConfirmGenerate(Boolean confirmGenerate) {
-		this.confirmGenerate = confirmGenerate;
-	}
-
 	public String getMusicGroupId() {
 		return musicGroupId;
 	}

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

@@ -300,6 +300,13 @@ public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
     HttpResponseResult<ClassGroup> classGroupUpdate(List<ClassGroup4MixDto> classGroup4MixDtos) throws Exception;
 
     /**
+     * 排课
+     * @param classGroup4MixDtos
+     * @return
+     */
+    HttpResponseResult<ClassGroup> createCourse(List<ClassGroup4MixDto> classGroup4MixDtos) throws Exception;
+
+    /**
      * 班级预排课
      * @param classGroup4MixDtos
      * @return

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupStudentMapperService.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.service;
 
 import com.ym.mec.biz.dal.dto.ClassGroupStudentInfoDto;
+import com.ym.mec.biz.dal.entity.ClassGroup;
 import com.ym.mec.biz.dal.entity.ClassGroupStudentMapper;
 import com.ym.mec.biz.dal.entity.StudentRegistration;
 import com.ym.mec.biz.dal.enums.ClassGroupStudentStatusEnum;
@@ -100,4 +101,13 @@ public interface ClassGroupStudentMapperService extends BaseService<Long, ClassG
      */
     void updateClassGroupStudents1(Long classGroupId, List<Integer> studentIds, List<Long> allLockCourseIds, String batchNo, BigDecimal masterTotalPrice);
 
+    /**
+    * @description: 添加班级学员关联
+     * @param classGroup
+     * @param userIdStrSet
+    * @return void
+    * @author zx
+    * @date 2022/9/23 11:50
+    */
+    void addMapper(ClassGroup classGroup, List<String> userIdStrSet);
 }

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupTeacherMapperService.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dao.ClassGroupTeacherMapperDao;
 import com.ym.mec.biz.dal.dto.ClassGroupTeachersDto;
 import com.ym.mec.biz.dal.entity.ClassGroup;
 import com.ym.mec.biz.dal.entity.ClassGroupTeacherMapper;
@@ -12,6 +13,7 @@ import java.util.Map;
 import java.util.Set;
 
 public interface ClassGroupTeacherMapperService extends BaseService<Long, ClassGroupTeacherMapper> {
+    ClassGroupTeacherMapperDao getDao();
 
     /**
      * 批量插入班级老师
@@ -94,4 +96,13 @@ public interface ClassGroupTeacherMapperService extends BaseService<Long, ClassG
     * @date 2022/9/23 11:30
     */
     List<Integer> addMapper(ClassGroup classGroup);
+
+    /**
+    * @description: 校验老师是否冲突
+     * @param teacherMappers
+    * @return void
+    * @author zx
+    * @date 2022/9/23 14:45
+    */
+    void checkTeachingBishop(List<ClassGroupTeacherMapper> teacherMappers);
 }

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleService.java

@@ -686,4 +686,13 @@ public interface CourseScheduleService extends BaseService<Long, CourseSchedule>
 	* @date 2022/3/1 18:01
 	*/
 	PageInfo<StudentStandardDto> queryStudyStandardWaitVisit(EvaluateCourseQueryInfo queryInfo);
+
+	/**
+	* @description: 排课
+	 * @param groupDto
+	* @return void
+	* @author zx
+	* @date 2022/9/23 13:57
+	*/
+	void createCourse(ClassGroupDto groupDto);
 }

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentRegistrationService.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
@@ -14,6 +15,7 @@ import java.util.List;
 import java.util.Map;
 
 public interface StudentRegistrationService extends BaseService<Long, StudentRegistration> {
+    StudentRegistrationDao getDao();
 
     /**
      * 获取乐团学员报名详情

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

@@ -95,10 +95,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     @Autowired
     private SubjectService subjectService;
     @Autowired
-    private ClassGroupTeacherMapperDao classGroupTeacherMapperDao;
-    @Autowired
-    private ClassGroupTeacherMapperService classGroupTeacherMapperService;
-    @Autowired
     private CourseScheduleDao courseScheduleDao;
     @Autowired
     private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
@@ -160,8 +156,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     private MusicGroupSchoolTermStudentCourseDetailDao musicGroupSchoolTermStudentCourseDetailDao;
     @Autowired
     private MusicGroupSchoolTermCourseDetailDao musicGroupSchoolTermCourseDetailDao;
-    @Autowired
-    private CourseScheduleStatisticsService courseScheduleStatisticsService;
 
     @Override
     public BaseDAO<Integer, ClassGroup> getDAO() {
@@ -188,7 +182,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             for (ClassGroup cg : dataList) {
                 Long studentNum = classGroupStudentNumMap.get(cg.getId());
                 cg.setStudentNum(Objects.isNull(studentNum) ? 0 : studentNum.intValue());
-                cg.setTeacherMapperList(classGroupTeacherMapperDao.findClassGroupTeachers(cg.getId() + ""));
+                cg.setTeacherMapperList(classGroupTeacherMapperService.getDao().findClassGroupTeachers(cg.getId() + ""));
                 cg.setCourseScheduleList(courseScheduleDao.findCoursesByClassGroupId(cg.getId(), null));
             }
         }
@@ -197,24 +191,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         return pageInfo;
     }
 
-    //校验主教助教是否冲突
-    private void checkTeachingBishop(List<ClassGroupTeacherMapper> teacherMappers){
-        Set<Integer> collect = teacherMappers.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
-        if (teacherMappers.size() != collect.size()) {
-            throw new BizException("主教与助教存在冲突");
-        }
-    }
-
-    private ClassGroup create(ClassGroupDto groupDto){
-        ClassGroup classGroup = new ClassGroup();
-        BeanUtils.copyProperties(groupDto,classGroup);
-        String userIds = classGroup.getUserIds();
-        Set<String> userIdStrSet = new HashSet<>(Arrays.asList(userIds.split(",")));
-        classGroup.setStudentNum(userIdStrSet.size());
-        this.insert(classGroup);
-        return classGroup;
-    }
-
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Integer create(ClassGroup classGroup) {
@@ -225,7 +201,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             throw new BizException("课程组类型不能为空");
         }
 //        校验主教助教是否冲突
-        this.checkTeachingBishop(classGroup.getTeacherMapperList());
+        classGroupTeacherMapperService.checkTeachingBishop(classGroup.getTeacherMapperList());
 
         //疫情原因去掉这块限制
         //基础技能班和线上基础技能班,可分班原则为声部人数/6向上取整
@@ -265,7 +241,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         }
 
         if (teacherMapperList.size() > 0) {
-            classGroupTeacherMapperDao.classGroupTeachersInsert(teacherMapperList);
+            classGroupTeacherMapperService.getDao().classGroupTeachersInsert(teacherMapperList);
         }
 
         //2、插入班级学生关联关系
@@ -326,67 +302,24 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     @Transactional(rollbackFor = Exception.class)
     public void create1(List<ClassGroupDto> classGroups) {
         //校验主教助教是否冲突
-        classGroups.stream().forEach(e->checkTeachingBishop(e.getClassGroupTeacherMapperList()));
+        classGroups.stream().forEach(e->classGroupTeacherMapperService.checkTeachingBishop(e.getClassGroupTeacherMapperList()));
         Date date = new Date();
         for (ClassGroupDto groupDto : classGroups) {
+            List<String> userIdStrSet = new ArrayList<>(Arrays.asList(groupDto.getUserIds().split(",")));
+            groupDto.setStudentNum(userIdStrSet.size());
             //创建班级
-            ClassGroup classGroup = this.create(groupDto);
+            ClassGroup classGroup = new ClassGroup();
+            BeanUtils.copyProperties(groupDto,classGroup);
+            this.insert(classGroup);
+            groupDto.setClassGroupId(classGroup.getId());
             //设置班级上的老师
             List<Integer> teacherIdList = classGroupTeacherMapperService.addMapper(classGroup);
+            //2、插入班级学生关联关系
+            classGroupStudentMapperService.addMapper(classGroup,userIdStrSet);
+            //排课
+            courseScheduleService.createCourse(groupDto);
         }
-
-        //2、插入班级学生关联关系
-        List<Integer> userIdList = new ArrayList<>();
-        List<ClassGroupStudentMapper> classGroupStudentList = new ArrayList<>();
-        for (String userId : userIdStrSet) {
-            ClassGroupStudentMapper classGroupStudentMapper = new ClassGroupStudentMapper();
-            classGroupStudentMapper.setMusicGroupId(classGroup.getMusicGroupId());
-            classGroupStudentMapper.setClassGroupId(classGroup.getId());
-            classGroupStudentMapper.setUserId(Integer.parseInt(userId));
-            classGroupStudentMapper.setCreateTime(date);
-            classGroupStudentMapper.setStatus(ClassGroupStudentStatusEnum.NORMAL);
-            classGroupStudentMapper.setGroupType(MUSIC);
-            classGroupStudentList.add(classGroupStudentMapper);
-
-            StudentRegistration studentRegistration = new StudentRegistration();
-            studentRegistration.setClassGroupId(classGroup.getId());
-            studentRegistration.setUserId(Integer.parseInt(userId));
-            studentRegistration.setMusicGroupId(classGroup.getMusicGroupId());
-            studentRegistrationDao.updateByUserIdAndMusicGroupId(studentRegistration);
-
-            userIdList.add(Integer.parseInt(userId));
-        }
-        if (classGroupStudentList.size() > 0) {
-            classGroupStudentMapperDao.classGroupStudentsInsert(classGroupStudentList);
-        }
-
         // 加入IM群组
-        if (userIdList.size() > 0) {
-            addImGroup(classGroup, userIdList, teacherIdList);
-        } else {
-            MusicGroup musicGroup = musicGroupDao.get(classGroup.getMusicGroupId());
-            Map<Integer, String> userRoleMap = new HashMap<>();
-            if (musicGroup.getEducationalTeacherId() != null) {
-                userRoleMap.put(musicGroup.getEducationalTeacherId(), "乐团主管");
-            }
-            if (musicGroup.getTeamTeacherId() != null) {
-                userRoleMap.put(musicGroup.getTeamTeacherId(), "运营主管");
-            }
-            if (musicGroup.getDirectorUserId() != null) {
-                userRoleMap.put(musicGroup.getDirectorUserId(), "乐队指导");
-            }
-            if (musicGroup.getTransactionTeacherId() != null) {
-                userRoleMap.put(musicGroup.getTransactionTeacherId(), "衔接老师");
-            }
-            if (teacherIdList != null && teacherIdList.size() > 0) {
-                for (Integer teacherId : teacherIdList) {
-                    userRoleMap.put(teacherId, "指导老师");
-                }
-            }
-            imGroupService.create(classGroup.getId().toString(), null, classGroup.getName(), musicGroup.getName(),
-                    musicGroup.getName(), musicGroup.getName(), null, "MUSIC", ImGroup.GroupTypeEnum.valueOf(classGroup.getType().getCode()));
-            imGroupMemberService.join(classGroup.getId().toString(), userRoleMap);
-        }
         return classGroup.getId();
     }
 
@@ -564,7 +497,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 // 删除基础提高班
                 classGroupDao.batchSoftDelete(classGroupIds);
                 // 删除基础提高老师
-                classGroupTeacherMapperDao.delClassGroupTeacherMapper(classGroupIds);
+                classGroupTeacherMapperService.getDao().delClassGroupTeacherMapper(classGroupIds);
 
                 List<CourseSchedule> classGroupNoStartCourseSchedules = courseScheduleService.findClassGroupNoStartCourseSchedules(classGroupIds,
                         MUSIC);
@@ -1639,7 +1572,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         List<Map<Long, Integer>> vipGroupOverCourses = courseScheduleDao.countGroupOverCourse(musicGroupIds, "VIP");
         Map<Long, Integer> vipGroupOverCourseMaps = MapUtil.convertIntegerMap(vipGroupOverCourses);
 
-        List<ClassGroupTeacherMapper> bishopTeachers = classGroupTeacherMapperDao.findByClassGroupIdsAndType(classGroupIds, "BISHOP");
+        List<ClassGroupTeacherMapper> bishopTeachers = classGroupTeacherMapperService.getDao().findByClassGroupIdsAndType(classGroupIds, "BISHOP");
         Map<Integer, Integer> classGroupTeacherMap = bishopTeachers.stream().collect(Collectors.toMap(ClassGroupTeacherMapper::getClassGroupId, ClassGroupTeacherMapper::getUserId));
 //        Map<Integer, ClassGroup> classGorupIdMap = byClassGroupIds.stream().collect(Collectors.toMap(ClassGroup::getId, classGroup -> classGroup));
 
@@ -1803,16 +1736,16 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         if (subjectNames != null && !subjectNames.isEmpty()) {
             teacherClassHeadInfo.setSubjectNames(subjectNames);
         }
-        ClassGroupTeacherMapper bishopTeacher = classGroupTeacherMapperDao.findByClassGroupAndRole(classGroupId, TeachTypeEnum.BISHOP);
+        ClassGroupTeacherMapper bishopTeacher = classGroupTeacherMapperService.getDao().findByClassGroupAndRole(classGroupId, TeachTypeEnum.BISHOP);
         if (Objects.nonNull(bishopTeacher)) {
             teacherClassHeadInfo.setBishopTeacherId(bishopTeacher.getId());
             teacherClassHeadInfo.setBishopTeacher(bishopTeacher.getUserName());
         }
 
-        String name = classGroupTeacherMapperDao.queryTeachingNames(classGroupId);
+        String name = classGroupTeacherMapperService.getDao().queryTeachingNames(classGroupId);
         teacherClassHeadInfo.setTeachingTeacher(name);
 
-//        ClassGroupTeacherMapper teachingTeacher = classGroupTeacherMapperDao.findByClassGroupAndRole(classGroupId, TeachTypeEnum.TEACHING);
+//        ClassGroupTeacherMapper teachingTeacher = classGroupTeacherMapperService.getDao().findByClassGroupAndRole(classGroupId, TeachTypeEnum.TEACHING);
 //        if (Objects.nonNull(teachingTeacher)) {
 //            teacherClassHeadInfo.setTeachingTeacherId(teachingTeacher.getId());
 //            teacherClassHeadInfo.setTeachingTeacher(teachingTeacher.getUserName());
@@ -2045,7 +1978,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 teacherId = groupTeacherMapper.getUserId();
             }
         }
-        classGroupTeacherMapperDao.classGroupTeachersInsert(classGroupTeacherMapperList);
+        classGroupTeacherMapperService.getDao().classGroupTeachersInsert(classGroupTeacherMapperList);
 
         //单建班级不排课
         if (classGroup4MixDtos.get(0).getOnlyCreateClassGroup()) {
@@ -2404,7 +2337,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 teacherIds.add(groupTeacherMapper.getUserId());
             }
             //3、将老师加入关联关系
-            classGroupTeacherMapperDao.classGroupTeachersInsert(classGroupTeacherMapperList);
+            classGroupTeacherMapperService.getDao().classGroupTeachersInsert(classGroupTeacherMapperList);
             //创建IM群组
             addImGroup(classGroup, userIds, teacherIds);
         }
@@ -2478,7 +2411,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
         //1、更新班级关联老师信息
         if (Objects.nonNull(classGroup4MixDto1.getCourseAddType()) &&classGroup4MixDto1.getCourseAddType().equals("onlyUpdateTeacher")) {
-            List<ClassGroupTeacherMapper> byClassGroup = classGroupTeacherMapperDao.findByClassGroup(classGroupId);
+            List<ClassGroupTeacherMapper> byClassGroup = classGroupTeacherMapperService.getDao().findByClassGroup(classGroupId);
             List<ClassGroupTeacherMapper> newTeacherMapperList =classGroup4MixDto1.getClassGroupTeacherMapperList();
             Set<Integer> collect = newTeacherMapperList.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
             if (newTeacherMapperList.size() != collect.size()) {
@@ -2506,14 +2439,14 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             List<Integer> classGroupIds = new ArrayList<>();
             classGroupIds.add(classGroupId);
             // 删除历史记录
-            classGroupTeacherMapperDao.delClassGroupTeacherMapper(classGroupIds);
+            classGroupTeacherMapperService.getDao().delClassGroupTeacherMapper(classGroupIds);
             for (ClassGroupTeacherMapper tm : newTeacherMapperList) {
                 tm.setClassGroupId(classGroupId);
                 tm.setCreateTime(date);
                 tm.setGroupType(GroupType.MUSIC);
                 tm.setMusicGroupId(musicGroupId);
                 tm.setUpdateTime(date);
-                classGroupTeacherMapperDao.insert(tm);
+                classGroupTeacherMapperService.getDao().insert(tm);
             }
             imUserFriendService.refreshClassImUserFriend(classGroupId);
             return BaseController.succeed(classGroup);
@@ -2874,7 +2807,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         List<ClassGroup> classGroups = classGroupDao.queryStudentClassGroups(musicGroupId, sysUser.getId());
         if (classGroups.size() > 0) {
             classGroups.forEach(e -> {
-                e.setTeacherMapperList(classGroupTeacherMapperDao.findClassGroupTeachers(e.getId().toString()));
+                e.setTeacherMapperList(classGroupTeacherMapperService.getDao().findClassGroupTeachers(e.getId().toString()));
             });
         }
         return classGroups;
@@ -3250,7 +3183,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 teacherId = groupTeacherMapper.getUserId();
             }
         }
-        classGroupTeacherMapperDao.classGroupTeachersInsert(classGroupTeacherMapperList);
+        classGroupTeacherMapperService.getDao().classGroupTeachersInsert(classGroupTeacherMapperList);
 
         //单建班级不排课
         if (classGroup4MixDtos.get(0).getOnlyCreateClassGroup()) {
@@ -3611,7 +3544,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         }
         classGroupIds = classGroupIds.substring(0, classGroupIds.length() - 1);
 
-        List<ClassGroupTeacherMapper> classGroupTeachers = classGroupTeacherMapperDao.findClassGroupTeachers(classGroupIds);
+        List<ClassGroupTeacherMapper> classGroupTeachers = classGroupTeacherMapperService.getDao().findClassGroupTeachers(classGroupIds);
         for (ClassGroupTeachersDto classGroup : classGroups) {
             List<ClassGroupTeacherMapper> classGroupTeacherMappers = new ArrayList<>();
             for (ClassGroupTeacherMapper classGroupTeacher : classGroupTeachers) {
@@ -3630,7 +3563,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             List<String> subjects = subjectService.findBySubIds(highClassGroup.getSubjectIdList());
             highClassGroup.setSubjectName(subjects.stream().collect(Collectors.joining(",")));
 
-            ClassGroupTeacherMapper bishopTeacher = classGroupTeacherMapperDao.findByClassGroupAndRole(highClassGroup.getId(), TeachTypeEnum.BISHOP);
+            ClassGroupTeacherMapper bishopTeacher = classGroupTeacherMapperService.getDao().findByClassGroupAndRole(highClassGroup.getId(), TeachTypeEnum.BISHOP);
             highClassGroup.setTeacherName(bishopTeacher.getUserName());
             highClassGroup.setUserId(bishopTeacher.getUserId());
             CourseSchedule courseSchedule = courseScheduleDao.findOneCourseScheduleByClassGroupId(highClassGroup.getId());
@@ -3676,7 +3609,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         String classGroupIds = classGroups.stream().map(classGroup -> classGroup.getId().toString()).collect(Collectors.joining(","));
         List<Integer> classGroupSet = classGroups.stream().map(classGroup -> classGroup.getId()).collect(Collectors.toList());
 
-        List<ClassGroupTeacherMapper> classGroupTeachers = classGroupTeacherMapperDao.findClassGroupTeachers(classGroupIds);
+        List<ClassGroupTeacherMapper> classGroupTeachers = classGroupTeacherMapperService.getDao().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));
@@ -3764,7 +3697,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             String classGroupIds = dataList.stream().map(classGroup -> classGroup.getId().toString()).collect(Collectors.joining(","));
             List<Integer> classGroupSet = dataList.stream().map(classGroup -> classGroup.getId()).collect(Collectors.toList());
 
-            List<ClassGroupTeacherMapper> classGroupTeachers = classGroupTeacherMapperDao.findClassGroupTeachers(classGroupIds);
+            List<ClassGroupTeacherMapper> classGroupTeachers = classGroupTeacherMapperService.getDao().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));
@@ -4006,7 +3939,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             for (SuperClassGroupDto result : results) {
                 classGroupIds.add(result.getId());
             }
-            List<ClassGroupTeacherMapDto> classGroupTeacherMaps = classGroupTeacherMapperDao.findByClassGroupIds(classGroupIds);
+            List<ClassGroupTeacherMapDto> classGroupTeacherMaps = classGroupTeacherMapperService.getDao().findByClassGroupIds(classGroupIds);
             Map<Integer, Map<TeachTypeEnum, List<ClassGroupTeacherMapDto>>> classTeacherTypeMaps = classGroupTeacherMaps.stream()
                     .collect(Collectors.groupingBy(ClassGroupTeacherMapDto::getClassGroupId, Collectors.groupingBy(ClassGroupTeacherMapDto::getTeacherRole)));
             List<Group> groups = groupDao.findByClassGroupIds(classGroupIds);
@@ -4099,13 +4032,13 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         if (subjectNames != null && !subjectNames.isEmpty()) {
             teacherClassHeadInfo.setSubjectNames(subjectNames);
         }
-        ClassGroupTeacherMapper bishopTeacher = classGroupTeacherMapperDao.findByClassGroupAndRole(classGroupId, TeachTypeEnum.BISHOP);
+        ClassGroupTeacherMapper bishopTeacher = classGroupTeacherMapperService.getDao().findByClassGroupAndRole(classGroupId, TeachTypeEnum.BISHOP);
         if (Objects.nonNull(bishopTeacher)) {
             teacherClassHeadInfo.setBishopTeacherId(bishopTeacher.getId());
             teacherClassHeadInfo.setBishopTeacher(bishopTeacher.getUserName());
         }
 
-        String name = classGroupTeacherMapperDao.queryTeachingNames(classGroupId);
+        String name = classGroupTeacherMapperService.getDao().queryTeachingNames(classGroupId);
         teacherClassHeadInfo.setTeachingTeacher(name);
 
         if (classGroup.getType() == ClassGroupTypeEnum.VIP) {

+ 41 - 61
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupStudentMapperServiceImpl.java

@@ -1,79 +1,35 @@
 package com.ym.mec.biz.service.impl;
 
-import java.io.IOException;
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Isolation;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
-
 import com.alibaba.fastjson.JSON;
-import com.ym.mec.biz.dal.dao.ClassGroupDao;
-import com.ym.mec.biz.dal.dao.ClassGroupStudentMapperDao;
-import com.ym.mec.biz.dal.dao.CourseScheduleDao;
-import com.ym.mec.biz.dal.dao.CourseScheduleStudentPaymentDao;
-import com.ym.mec.biz.dal.dao.CourseScheduleTeacherSalaryDao;
-import com.ym.mec.biz.dal.dao.MusicGroupDao;
-import com.ym.mec.biz.dal.dao.OrganizationCourseUnitPriceSettingsDao;
-import com.ym.mec.biz.dal.dao.StudentDao;
+import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.ClassGroupStudentInfoDto;
-import com.ym.mec.biz.dal.entity.ClassGroup;
-import com.ym.mec.biz.dal.entity.ClassGroupRelation;
-import com.ym.mec.biz.dal.entity.ClassGroupStudentMapper;
-import com.ym.mec.biz.dal.entity.ClassGroupTeacherMapper;
-import com.ym.mec.biz.dal.entity.CourseSchedule;
-import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
-import com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary;
-import com.ym.mec.biz.dal.entity.MusicGroup;
-import com.ym.mec.biz.dal.entity.StudentRegistration;
-import com.ym.mec.biz.dal.entity.TeacherDefaultMusicGroupSalary;
-import com.ym.mec.biz.dal.enums.ClassGroupStudentStatusEnum;
-import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
-import com.ym.mec.biz.dal.enums.CourseStatusEnum;
-import com.ym.mec.biz.dal.enums.GroupType;
-import com.ym.mec.biz.dal.enums.MusicGroupStatusEnum;
-import com.ym.mec.biz.dal.enums.SalarySettlementTypeEnum;
-import com.ym.mec.biz.dal.enums.TeachTypeEnum;
-import com.ym.mec.biz.dal.enums.YesOrNoEnum;
-import com.ym.mec.biz.service.ClassGroupRelationService;
-import com.ym.mec.biz.service.ClassGroupService;
-import com.ym.mec.biz.service.ClassGroupStudentMapperService;
-import com.ym.mec.biz.service.ClassGroupTeacherMapperService;
-import com.ym.mec.biz.service.CourseScheduleService;
-import com.ym.mec.biz.service.CourseScheduleStudentPaymentService;
-import com.ym.mec.biz.service.CourseScheduleTeacherSalaryService;
-import com.ym.mec.biz.service.ImGroupMemberService;
-import com.ym.mec.biz.service.ImUserFriendService;
-import com.ym.mec.biz.service.StudentRegistrationService;
-import com.ym.mec.biz.service.TeacherDefaultMusicGroupSalaryService;
+import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.enums.*;
+import com.ym.mec.biz.service.*;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.util.http.HttpUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
 
 @Service
 public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, ClassGroupStudentMapper> implements ClassGroupStudentMapperService {
 
     @Autowired
     private ClassGroupStudentMapperDao classGroupStudentMapperDao;
-
     @Autowired
     private CourseScheduleService courseScheduleService;
     @Autowired
-    StudentRegistrationService studentRegistrationService;
+    private StudentRegistrationService studentRegistrationService;
     @Autowired
     private CourseScheduleStudentPaymentService courseScheduleStudentPaymentService;
     @Autowired
@@ -95,8 +51,6 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
     @Autowired
     private CourseScheduleDao courseScheduleDao;
     @Autowired
-    private OrganizationCourseUnitPriceSettingsDao organizationCourseUnitPriceSettingsDao;
-    @Autowired
     private ClassGroupDao classGroupDao;
     @Autowired
     private MusicGroupDao musicGroupDao;
@@ -693,4 +647,30 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
         imGroupMemberService.join(classGroupId.toString(), userRoleMap);
         imUserFriendService.refreshClassImUserFriend(classGroupId.intValue());
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void addMapper(ClassGroup classGroup, List<String> userIdList) {
+        if(CollectionUtils.isEmpty(userIdList)){
+            return;
+        }
+        List<ClassGroupStudentMapper> classGroupStudentList = new ArrayList<>();
+        for (String userId : userIdList) {
+            ClassGroupStudentMapper classGroupStudentMapper = new ClassGroupStudentMapper();
+            classGroupStudentMapper.setMusicGroupId(classGroup.getMusicGroupId());
+            classGroupStudentMapper.setClassGroupId(classGroup.getId());
+            classGroupStudentMapper.setUserId(Integer.parseInt(userId));
+            classGroupStudentMapper.setStatus(ClassGroupStudentStatusEnum.NORMAL);
+            classGroupStudentMapper.setGroupType(classGroup.getGroupType());
+            classGroupStudentList.add(classGroupStudentMapper);
+
+            //原有业务逻辑,用于更新学员注册表班级信息
+            StudentRegistration studentRegistration = new StudentRegistration();
+            studentRegistration.setClassGroupId(classGroup.getId());
+            studentRegistration.setUserId(Integer.parseInt(userId));
+            studentRegistration.setMusicGroupId(classGroup.getMusicGroupId());
+            studentRegistrationService.getDao().updateByUserIdAndMusicGroupId(studentRegistration);
+        }
+        classGroupStudentMapperDao.classGroupStudentsInsert(classGroupStudentList);
+    }
 }

+ 18 - 8
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupTeacherMapperServiceImpl.java

@@ -3,13 +3,14 @@ package com.ym.mec.biz.service.impl;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.ClassGroupTeachersDto;
 import com.ym.mec.biz.dal.entity.*;
-import com.ym.mec.biz.dal.enums.*;
+import com.ym.mec.biz.dal.enums.CourseStatusEnum;
+import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.biz.dal.enums.TeachTypeEnum;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.util.collection.MapUtil;
-
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -34,8 +35,6 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
     @Autowired
     private TeacherDefaultMusicGroupSalaryDao teacherDefaultMusicGroupSalaryDao;
     @Autowired
-    private SysConfigDao sysConfigDao;
-    @Autowired
     private ImGroupMemberService imGroupMemberService;
     @Autowired
     private ClassGroupService classGroupService;
@@ -45,10 +44,6 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
     private TeacherAttendanceDao teacherAttendanceDao;
     @Autowired
     private CourseScheduleDao courseScheduleDao;
-    @Autowired
-    private TeacherDao teacherDao;
-    @Autowired
-    private ClassGroupStudentMapperDao classGroupStudentMapperDao;
 
     @Override
     public BaseDAO<Long, ClassGroupTeacherMapper> getDAO() {
@@ -56,6 +51,11 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
     }
 
     @Override
+    public ClassGroupTeacherMapperDao getDao() {
+        return classGroupTeacherMapperDao;
+    }
+
+    @Override
     @Transactional(rollbackFor = Exception.class)
     public int classGroupTeachersInsert(List<ClassGroupTeacherMapper> classGroupTeacherMapperList) {
 
@@ -396,4 +396,14 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
         classGroupTeacherMapperDao.classGroupTeachersInsert(teacherMapperList);
         return teacherIdList;
     }
+
+
+    //校验主教助教是否冲突
+    @Override
+    public void checkTeachingBishop(List<ClassGroupTeacherMapper> teacherMappers){
+        Set<Integer> collect = teacherMappers.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
+        if (teacherMappers.size() != collect.size()) {
+            throw new BizException("主教与助教存在冲突");
+        }
+    }
 }

+ 249 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -26,6 +26,7 @@ import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext.MessageSender;
 import com.ym.mec.util.collection.ListUtil;
 import com.ym.mec.util.collection.MapUtil;
+import com.ym.mec.util.date.DateConvertor;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.json.JsonUtil;
 import org.apache.commons.collections.ListUtils;
@@ -46,14 +47,19 @@ import java.lang.reflect.InvocationTargetException;
 import java.math.BigDecimal;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.time.Duration;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import static com.ym.mec.biz.dal.entity.CourseSchedule.CourseScheduleType.MIX;
+import static com.ym.mec.biz.dal.enums.ClassGroupTypeEnum.HIGH_ONLINE;
 import static com.ym.mec.biz.dal.enums.GroupType.*;
+import static com.ym.mec.biz.dal.enums.MusicGroupStatusEnum.PROGRESS;
 import static com.ym.mec.biz.dal.enums.PracticeGroupType.FREE;
 import static com.ym.mec.biz.dal.enums.PracticeGroupType.TRIAL;
 import static com.ym.mec.biz.dal.enums.SysUserRoleEnum.ORGAN_MANAGER;
@@ -163,6 +169,8 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 	private TenantConfigService tenantConfigService;
     @Autowired
 	private VipGroupCategoryDao vipGroupCategoryDao;
+    @Autowired
+	private MusicGroupPaymentCalenderCourseSettingsService musicGroupPaymentCalenderCourseSettingsService;
 
     private final Logger LOGGER = LoggerFactory
             .getLogger(this.getClass());
@@ -5816,4 +5824,245 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         pageInfo.setRows(dataList);
         return pageInfo;
     }
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void createCourse(ClassGroupDto groupDto) {
+		Date date = new Date();
+		Integer classGroupId = groupDto.getClassGroupId();
+		String musicGroupId = groupDto.getMusicGroupId();
+		ClassGroupTypeEnum type = groupDto.getType();
+		List<CourseTimeDto> courseTimeDtoList = groupDto.getCourseTimeDtoList();
+		MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
+
+		TeachModeEnum teachMode = TeachModeEnum.OFFLINE;
+		if (type.equals(HIGH_ONLINE) || type.equals(ClassGroupTypeEnum.MUSIC_NETWORK)) {
+			teachMode = TeachModeEnum.ONLINE;
+		}
+		if (CollectionUtils.isEmpty(courseTimeDtoList)) {
+			throw new BizException("排课次数必须大于0");
+		}
+
+		Integer schoolId = teachMode.equals(TeachModeEnum.ONLINE) ? null : musicGroup.getSchoolId();
+
+		List<Subject> subjectList = subjectDao.findBySubjectByIdList(groupDto.getSubjectIdList());
+
+		String subjectNames = subjectList.stream().map(Subject::getName).collect(Collectors.joining("/"));
+
+		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+		//2、获取班级学生
+		List<Integer> studentIds = Arrays.stream(groupDto.getUserIds().split(",")).map(id -> Integer.valueOf(id)).distinct().collect(Collectors.toList());
+
+		//获取可转换的课程时长
+		Map<String, Integer> courseTypeMinutesMap = musicGroupPaymentCalenderCourseSettingsService.getMusicCourseSettingsWithStudents(musicGroupId, studentIds);
+
+		//计算每节课的课酬
+		List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList = new ArrayList<>();
+		List<CourseSchedule> courseScheduleList = new ArrayList<>();
+		for (CourseTimeDto courseTimeDto : courseTimeDtoList) {
+			//校验老师是否冲突
+			classGroupTeacherMapperService.checkTeachingBishop(courseTimeDto.getClassGroupTeacherMapperList());
+
+		}
+
+		for (ClassGroup4MixDto classGroup4MixDto : classGroup4MixDtos) {
+			//3、插入班级排课信息
+			LocalDateTime now = LocalDateTime.now().withHour(0).withMinute(0).withSecond(0).withNano(0);
+
+			if (!courseTypeMinutesMap.containsKey(classGroup4MixDto.getCourseType().getCode())) {
+				throw new BizException("{}课程类型暂无剩余课程时长", classGroup4MixDto.getCourseType().getMsg());
+			}
+			Integer totalMinutes = courseTypeMinutesMap.get(classGroup4MixDto.getCourseType().getCode());
+			long totalCourseDuration = 0;
+
+			if (classGroup4MixDto.getCourseTimes() <= 0) {
+				throw new BizException("{}课程类型剩余课程时长不足", classGroup4MixDto.getCourseType().getMsg());
+			}
+
+			int totalCourseTimes = 0;
+			int generateCourseTimes = 0;
+			if (!CollectionUtils.isEmpty(classGroup4MixDto.getCourseTimeDtoList())) {
+				totalCourseTimes = classGroup4MixDto.getCourseTimeDtoList().stream().mapToInt(CourseTimeDto::getExpectCourseNum).reduce(0, Integer::sum);
+			}
+
+			Set<String> holidayDays = new HashSet<>();
+			Integer tenantId = TenantContextHolder.getTenantId();
+			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) {
+				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)) {
+						allTeacherIds.addAll(teacherIds);
+					}
+				}
+				if (!CollectionUtils.isEmpty(allTeacherIds)) {
+					allTeacherInfo = teacherDao.getUsersSimpleInfo(new ArrayList<>(allTeacherIds));
+				}
+			}
+
+			WhileNode:
+			while (true) {
+				int dayOfWeek = now.getDayOfWeek().getValue();
+				for (CourseTimeDto courseTimeDto : classGroup4MixDto.getCourseTimeDtoList()) {
+					List<ClassGroupTeacherMapper> newClassGroupTeacherMapperList = courseTimeDto.getClassGroupTeacherMapperList();
+
+					Set<Integer> noRepeatTeacherIds = newClassGroupTeacherMapperList.stream().map(ClassGroupTeacherMapper::getUserId).collect(Collectors.toSet());
+					if (noRepeatTeacherIds.size() != newClassGroupTeacherMapperList.size()) {
+						throw new BizException("主教与助教存在冲突");
+					}
+
+					Integer teacherId = newClassGroupTeacherMapperList.stream().filter(ct -> TeachTypeEnum.BISHOP.equals(ct.getTeacherRole())).findAny().get().getUserId();
+					if (Objects.isNull(teacherId)) {
+						throw new BizException("请设置主教");
+					}
+
+					if (courseTimeDto.getDayOfWeek() < 1 || courseTimeDto.getDayOfWeek() > 7) {
+						throw new BizException("排课循环周期错误,请核查");
+					}
+					if (Objects.isNull(courseTimeDto.getStartDate()) || Objects.isNull(courseTimeDto.getEndDate())) {
+						throw new BizException("排课循环周期错误,请核查");
+					}
+
+					//跳过节假日
+					if (courseTimeDto.getHoliday() && holidayDays.contains(now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")))) {
+						continue;
+					}
+
+					if (!courseTimeDto.getDayOfWeek().equals(dayOfWeek)) continue;
+
+					Date classDate = DateConvertor.toDate(now);
+
+					if (courseTimeDto.getStartDate().compareTo(classDate) > 0
+							|| courseTimeDto.getEndDate().compareTo(classDate) < 0
+							|| courseTimeDto.getExpectCourseNum() <= courseTimeDto.getCourseNum()) {
+						if (courseTimeDto.getEndDate().compareTo(classDate) < 0 && courseTimeDto.getExpectCourseNum() > courseTimeDto.getCourseNum()) {
+							throw new BizException("在指定的排课时间段内({}-{})无法完成预计课时数的排课", DateUtil.dateToString(courseTimeDto.getStartDate(), "yyyy.MM.dd"), DateUtil.dateToString(courseTimeDto.getEndDate(), "yyyy.MM.dd"));
+						}
+						if (totalCourseTimes <= generateCourseTimes) {
+							break WhileNode;
+						}
+						continue;
+					}
+
+					//课时长度
+					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))
+							.toMinutes();
+
+					totalCourseDuration += classCourseDuration;
+
+					courseTimeDto.setCourseNum(courseTimeDto.getCourseNum() + 1);
+					generateCourseTimes += 1;
+
+					if (totalCourseTimes < generateCourseTimes) {
+						break WhileNode;
+					}
+
+					String startClassTime = DateUtil.getDate(classDate) + " " + courseTimeDto.getStartClassTime() + ":00";
+					String endClassTime = DateUtil.getDate(classDate) + " " + courseTimeDto.getEndClassTime() + ":00";
+
+					CourseSchedule courseSchedule = new CourseSchedule();
+					courseSchedule.setSchoolId(schoolId);
+					courseSchedule.setClassGroupId(classGroup.getId());
+					courseSchedule.setStatus(CourseStatusEnum.NOT_START);
+					courseSchedule.setClassDate(classDate);
+					courseSchedule.setStartClassTime(DateUtil.stringToDate(startClassTime));
+					if (date.compareTo(courseSchedule.getStartClassTime()) > 0) {
+						throw new BizException("课程开始时间不得早于当前时间");
+					}
+					courseSchedule.setEndClassTime(DateUtil.stringToDate(endClassTime));
+					courseSchedule.setCreateTime(date);
+					courseSchedule.setUpdateTime(date);
+					courseSchedule.setTeachMode(teachMode);
+					courseSchedule.setMusicGroupId(classGroup.getMusicGroupId());
+					courseSchedule.setType(classGroup4MixDto.getCourseType());
+
+					if (classGroup4MixDto.getCourseType().equals(MIX)) {
+						courseSchedule.setName(classGroup4MixDto.getCourseType().getMsg());
+					} else if (classGroup4MixDto.getCourseType().equals(CourseScheduleType.MUSIC_NETWORK)) {
+						courseSchedule.setName(classGroup.getName());
+					} else {
+						courseSchedule.setName(subjectNames + "-" + classGroup4MixDto.getCourseType().getMsg());
+					}
+
+					courseSchedule.setGroupType(MUSIC);
+					courseSchedule.setTeacherId(teacherId);
+					courseSchedule.setActualTeacherId(teacherId);
+					courseSchedule.setOrganId(musicGroup.getOrganId());
+					courseSchedule.setClassGroupType(classGroup.getType().getCode());
+					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());
+						SimpleUserDto mainTeacher = allTeacherInfo.stream().filter(t -> teacherId.equals(t.getUserId())).findAny().get();
+						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)) {
+							courseSchedule.setTeachingTeacherNames(StringUtils.join(teachingTeachers.stream().map(SimpleUserDto::getUserName).collect(Collectors.toList()), ","));
+						}
+					}
+
+					for (ClassGroupTeacherMapper classGroupTeacherMapper : newClassGroupTeacherMapperList) {
+						CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
+						courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
+						courseScheduleTeacherSalary.setGroupType(courseSchedule.getGroupType());
+						courseScheduleTeacherSalary.setMusicGroupId(courseSchedule.getMusicGroupId());
+						courseScheduleTeacherSalary.setTeacherRole(classGroupTeacherMapper.getTeacherRole());
+						courseScheduleTeacherSalary.setUserId(classGroupTeacherMapper.getUserId());
+						courseScheduleTeacherSalary.setClassGroupId(classGroup.getId());
+						courseScheduleTeacherSalary.setCreateTime(date);
+						courseScheduleTeacherSalary.setUpdateTime(date);
+						courseScheduleTeacherSalaryService.createMusicGroupCourseTeacherSalary(musicGroup, courseSchedule, courseScheduleTeacherSalary);
+						courseScheduleTeacherSalaryList.add(courseScheduleTeacherSalary);
+						if (confirmGenerate && !classGroup4MixDto.getAllowZeroSalary() && BigDecimal.ZERO.compareTo(courseScheduleTeacherSalary.getExpectSalary()) == 0) {
+							TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+							return BaseController.failed(HttpStatus.MULTI_STATUS, "当前课程课酬预计为0,是否继续");
+						}
+					}
+				}
+
+				now = now.plusDays(1);
+			}
+
+			if (totalCourseDuration > totalMinutes) {
+				throw new BizException("课程时长不足");
+			}
+		}
+
+		courseScheduleService.checkNewCourseSchedules(courseScheduleList, false, false);
+
+		if (!confirmGenerate) {
+			TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+			courseScheduleList.sort(Comparator.comparing(CourseSchedule::getStartClassTime));
+			return BaseController.failed(HttpStatus.PARTIAL_CONTENT, courseScheduleList, "");
+		}
+		classGroupService.updateTotalClassTimes(classGroup.getId(), courseScheduleList.size());
+
+		//老师结算表
+		if (courseScheduleTeacherSalaryList.size() > 0) {
+			courseScheduleTeacherSalaryService.batchInsert(courseScheduleTeacherSalaryList);
+		}
+
+		if (!CollectionUtils.isEmpty(studentList)) {
+			studentService.updateStudentServiceTag(null, studentIds, YesOrNoEnum.YES.getCode());
+
+			//学生结算表
+			courseScheduleStudentPaymentService.createForMusicGroup(musicGroupId, courseScheduleList, studentIds);
+		}
+		if (musicGroup.getStatus() == PROGRESS) {
+			imUserFriendService.refreshClassImUserFriend(classGroupId);
+		}
+		return BaseController.succeed(classGroup);
+	}
 }

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

@@ -158,6 +158,11 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
     }
 
     @Override
+    public StudentRegistrationDao getDao() {
+        return studentRegistrationDao;
+    }
+
+    @Override
     public PageInfo<StudentApplyDetailDto> queryStudentDetailPage(StudentRegistrationQueryInfo queryInfo) {
         PageInfo<StudentApplyDetailDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
         Map<String, Object> params = new HashMap<>();

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

@@ -113,10 +113,11 @@
 
     <!-- 班级学生批量插入 -->
     <insert id="classGroupStudentsInsert" parameterType="java.util.List">
-        INSERT INTO class_group_student_mapper (group_type_,music_group_id_,class_group_id_,user_id_,status_,create_time_,tenant_id_)
+        INSERT INTO class_group_student_mapper (group_type_,music_group_id_,class_group_id_,user_id_,status_,create_time_,update_time_,tenant_id_)
         VALUE
         <foreach collection="classGroupStudentMapperList" item="item" index="index" separator=",">
-            (#{item.groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{item.musicGroupId},#{item.classGroupId},#{item.userId},#{item.status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},now(),#{item.tenantId})
+            (#{item.groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{item.musicGroupId},#{item.classGroupId},
+            #{item.userId},#{item.status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},now(),now(),#{item.tenantId})
         </foreach>
     </insert>