Browse Source

合班拆班

zouxuan 4 năm trước cách đây
mục cha
commit
624e879f18

+ 8 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java

@@ -1662,4 +1662,12 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      * @return
      */
     List<Long> findNoStudentCourseIds(@Param("courseIds") List<Long> courseIds);
+
+    /**
+     * 获取班级中未开始的合班课程
+     * @author zouxuan
+     * @param classGroupIds
+     * @return
+     */
+    List<CourseSchedule> queryNoStartNewCourseList(@Param("classGroupIds") List<Integer> classGroupIds);
 }

+ 14 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ClassGroup4MixDto.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.dal.dto;
 
+import com.ym.mec.biz.dal.entity.ClassGroup;
 import com.ym.mec.biz.dal.entity.ClassGroupTeacherMapper;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
@@ -7,7 +8,7 @@ import io.swagger.annotations.ApiModelProperty;
 
 import java.util.List;
 
-public class ClassGroup4MixDto {
+public class ClassGroup4MixDto implements Cloneable{
 
     @ApiModelProperty(value = "班级id", required = true)
     private Integer classGroupId;
@@ -60,6 +61,17 @@ public class ClassGroup4MixDto {
     @ApiModelProperty(value = "申请编号,用于自动排课", required = true)
     private Integer musicGroupStudentClassAdjustId;
 
+    @ApiModelProperty(value = "班级", required = true)
+    private ClassGroup classGroup;
+
+    public ClassGroup getClassGroup() {
+        return classGroup;
+    }
+
+    public void setClassGroup(ClassGroup classGroup) {
+        this.classGroup = classGroup;
+    }
+
     public Integer getMusicGroupStudentClassAdjustId() {
         return musicGroupStudentClassAdjustId;
     }
@@ -195,4 +207,5 @@ public class ClassGroup4MixDto {
     public void setSubjectId(Integer subjectId) {
         this.subjectId = subjectId;
     }
+
 }

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

@@ -280,6 +280,13 @@ public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
     ClassGroup classGroupAdjust(List<ClassGroup4MixDto> classGroup4MixDto);
 
     /**
+     * 合班拆班新建班级
+     * @param classGroup4MixDto
+     * @return
+     */
+    ClassGroup classGroupAdjust2(ClassGroup4MixDto classGroup4MixDto);
+
+    /**
      * 班级调整(修改班级)
      * @param classGroup4MixDtos
      * @return

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

@@ -37,6 +37,7 @@ import org.apache.commons.beanutils.BeanUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
@@ -1885,6 +1886,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                     courseScheduleList.add(courseSchedule);
                     courseSchedules.add(courseSchedule);
 
+
                     times++;
 
                     for (ClassGroupTeacherMapper classGroupTeacherMapper : classGroupTeacherMapperList) {
@@ -2025,6 +2027,319 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
     @Override
     @Transactional(rollbackFor = Exception.class)
+    public ClassGroup classGroupAdjust2(ClassGroup4MixDto classGroup4MixDto){
+        Date date = new Date();
+        String musicGroupId = classGroup4MixDto.getMusicGroupId();
+        MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
+        if (musicGroup == null) {
+            throw new BizException("乐团不存在");
+        }
+        if (classGroup4MixDto.getCourseTimes().compareTo(0) <= 0) {
+            throw new BizException("排课次数必须大于0");
+        }
+        Integer schoolId = musicGroup.getSchoolId();
+
+        List<Integer> studentIdList = classGroup4MixDto.getStudents();
+        List<StudentRegistration> studentList = studentRegistrationService.findStudentListByUserIdList(musicGroupId, studentIdList);
+
+        List<Integer> subjectIdList = studentList.stream().map(student -> student.getActualSubjectId()).collect(Collectors.toList());
+        TeachModeEnum teachMode = TeachModeEnum.OFFLINE;
+        if (classGroup4MixDto.getType().equals(ClassGroupTypeEnum.HIGH_ONLINE)) {
+            subjectIdList.clear();
+            subjectIdList.add(classGroup4MixDto.getSubjectId());
+            teachMode = TeachModeEnum.ONLINE;
+        }
+
+        List<Subject> subjectList = subjectService.findBySubjectByIdList(subjectIdList);
+
+        String subjectIds = subjectList.stream().map(subject -> subject.getId().toString()).collect(Collectors.joining(","));
+        String subjectNames = subjectList.stream().map(subject -> subject.getName()).collect(Collectors.joining("/"));
+
+        if(classGroup4MixDto.getType().equals(ClassGroupTypeEnum.MUSIC_NETWORK)){
+            teachMode = TeachModeEnum.ONLINE;
+            List<String> studentNames = studentDao.getStudentNames(studentIdList);
+            classGroup4MixDto.setClassGroupName(subjectNames + "•" + StringUtils.join(studentNames, ","));
+        }
+
+        if (classGroup4MixDto.getType() == null) {
+            classGroup4MixDto.setType(ClassGroupTypeEnum.NORMAL);
+        }
+
+        List<ClassGroupTeacherMapper> classGroupTeacherMapperList = classGroup4MixDto.getClassGroupTeacherMapperList();
+
+        Set<Integer> noRepeatTeacherIds = classGroupTeacherMapperList.stream().map(ClassGroupTeacherMapper::getUserId).collect(Collectors.toSet());
+        if(noRepeatTeacherIds.size()!=classGroupTeacherMapperList.size()){
+            throw new BizException("主教与助教存在冲突");
+        }
+
+        Integer teacherId = null;
+        for (ClassGroupTeacherMapper groupTeacherMapper : classGroupTeacherMapperList) {
+            if (groupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP)) {
+                teacherId = groupTeacherMapper.getUserId();
+            }
+        }
+
+        String classCourseMinute = classGroup4MixDto.getClassCourseMinute();
+
+        //5、插入班级排课信息
+        LocalDateTime now = LocalDate.parse(classGroup4MixDto.getStartDate(), DateTimeFormatter.ofPattern("yyyy-MM-dd")).atStartOfDay();
+        //获取默认的排课时长
+        String courseDefaultMinutes = sysConfigDao.findConfigValue("music_course_default_minutes");
+        JSONObject jsonObject = JSON.parseObject(courseDefaultMinutes);
+        long classCourseDuration = Integer.parseInt(jsonObject.get(classGroup4MixDto.getCourseType().getCode()).toString());
+//
+        Map<String, Integer> classCourseMinuteMap = JSON.parseObject(classCourseMinute, Map.class);
+        classGroup4MixDto.setCourseTimes(classCourseMinuteMap.get(classGroup4MixDto.getCourseType().getCode())/(int)classCourseDuration);
+
+        Set<String> holidayDays = new HashSet<>();
+        if (classGroup4MixDto.getHoliday()) {
+            SysConfig holidaySetting = sysConfigService.findByParamName(SysConfigService.HOLIDAY_SETTING);
+            if (Objects.nonNull(holidaySetting) && StringUtils.isNotBlank(holidaySetting.getParanValue())) {
+                holidayDays = new HashSet<>(JSON.parseArray(holidaySetting.getParanValue(), String.class));
+            }
+        }
+
+        List<CourseSchedule> courseScheduleList = new ArrayList<>();
+        int times = 0;
+        WhileNode:
+        while (true) {
+            if (classGroup4MixDto.getHoliday() && holidayDays.contains(now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")))) {
+                now = now.plusDays(1);
+                continue;
+            }
+            int dayOfWeek = now.getDayOfWeek().getValue();//当前星期
+            for (CourseTimeDto courseTimeDto : classGroup4MixDto.getCourseTimeDtoList()) {
+                if (courseTimeDto.getDayOfWeek() < 1 || courseTimeDto.getDayOfWeek() > 7) {
+                    throw new BizException("排课循环周期错误,请核查");
+                }
+                if (!courseTimeDto.getDayOfWeek().equals(dayOfWeek)) continue;
+                Date classDate = DateConvertor.toDate(now);
+                String startClassTime = DateUtil.getDate(classDate) + " " + courseTimeDto.getStartClassTime() + ":00";
+                String endClassTime = DateUtil.getDate(classDate) + " " + courseTimeDto.getEndClassTime() + ":00";
+
+                CourseSchedule courseSchedule = new CourseSchedule();
+                courseSchedule.setSchoolId(schoolId);
+                courseSchedule.setMusicGroupId(musicGroupId);
+                courseSchedule.setStatus(CourseStatusEnum.NOT_START);
+                courseSchedule.setClassDate(classDate);
+                courseSchedule.setStartClassTime(DateUtil.stringToDate(startClassTime));
+                courseSchedule.setEndClassTime(DateUtil.stringToDate(endClassTime));
+                courseSchedule.setCreateTime(date);
+                courseSchedule.setUpdateTime(date);
+                courseSchedule.setTeachMode(teachMode);
+                courseSchedule.setType(classGroup4MixDto.getCourseType());
+                courseSchedule.setGroupType(MUSIC);
+                courseSchedule.setOrganId(musicGroup.getOrganId());
+                courseSchedule.setTeacherId(teacherId);
+                courseSchedule.setActualTeacherId(teacherId);
+                courseScheduleList.add(courseSchedule);
+
+                times++;
+
+                if (classGroup4MixDto.getCourseTimes().equals(times)) {
+                    break WhileNode;
+                }
+            }
+            now = now.plusDays(1);
+        }
+
+        ClassGroup classGroup = classGroup4MixDto.getClassGroup();
+                //计算每节课的课酬
+        List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList = new ArrayList<>();
+
+        if(classGroup == null){
+            //1、新建班级
+            classGroup = new ClassGroup();
+            classGroup.setMusicGroupId(classGroup4MixDto.getMusicGroupId());
+            classGroup.setSubjectIdList(subjectIds);
+            classGroup.setName(classGroup4MixDto.getClassGroupName());
+            classGroup.setExpectStudentNum(studentList.size());
+            classGroup.setStudentNum(studentList.size());
+            classGroup.setType(classGroup4MixDto.getType());
+            classGroup.setDelFlag(0);
+            classGroup.setGroupType(MUSIC);
+            classGroup.setCurrentClassTimes(0);
+            classGroup.setTotalClassTimes(classGroup4MixDto.getCourseTimes());
+            classGroup.setCreateTime(date);
+            classGroup.setUpdateTime(date);
+            classGroupDao.insert(classGroup);
+            for (CourseSchedule courseSchedule : courseScheduleList) {
+                courseSchedule.setClassGroupId(classGroup.getId());
+                if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.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());
+                }
+            }
+        }
+
+        //自动排课,校验冲突
+        if(courseScheduleList.size() > 0){
+            try {
+                courseScheduleService.checkNewCourseSchedules(courseScheduleList, false);
+            }catch (BizException e){
+                classGroup4MixDto.setClassGroup(classGroup);
+                //排课开始时间加一周
+                Date stringToDate = DateUtil.stringToDate(classGroup4MixDto.getStartDate(), DateUtil.ISO_EXPANDED_DATE_FORMAT);
+                classGroup4MixDto.setStartDate(DateUtil.format(DateUtil.addDays(stringToDate, 7),DateUtil.ISO_EXPANDED_DATE_FORMAT));
+//                    再次尝试排课
+                classGroupAdjust2(classGroup4MixDto);
+            }
+
+            //2、将学生加入新班级(学生注册表,关联表
+            List<ClassGroupStudentMapper> classGroupStudentMapperList = new ArrayList<>();
+            List<Integer> userIds = new ArrayList<>(); //用户ids
+            for (StudentRegistration studentRegistration : studentList) {
+                if (classGroup4MixDto.getType().equals(ClassGroupTypeEnum.NORMAL)) {
+                    studentRegistration.setClassGroupId(classGroup.getId());
+                    studentRegistrationService.update(studentRegistration);
+                }
+
+                ClassGroupStudentMapper classGroupStudentMapper = new ClassGroupStudentMapper();
+                classGroupStudentMapper.setMusicGroupId(musicGroupId);
+                classGroupStudentMapper.setClassGroupId(classGroup.getId());
+                classGroupStudentMapper.setUserId(studentRegistration.getUserId());
+                classGroupStudentMapper.setCreateTime(date);
+                classGroupStudentMapper.setStatus(ClassGroupStudentStatusEnum.NORMAL);
+                classGroupStudentMapper.setGroupType(MUSIC);
+                classGroupStudentMapperList.add(classGroupStudentMapper);
+
+                userIds.add(studentRegistration.getUserId());
+            }
+            classGroupStudentMapperDao.classGroupStudentsInsert(classGroupStudentMapperList);
+
+            for (ClassGroupTeacherMapper groupTeacherMapper : classGroupTeacherMapperList) {
+                groupTeacherMapper.setGroupType(classGroup.getGroupType());
+                groupTeacherMapper.setClassGroupId(classGroup.getId());
+                groupTeacherMapper.setMusicGroupId(classGroup4MixDto.getMusicGroupId());
+                userIds.add(groupTeacherMapper.getUserId());
+            }
+            //3、将老师加入关联关系
+            classGroupTeacherMapperDao.classGroupTeachersInsert(classGroupTeacherMapperList);
+            //创建IM群组
+            addImGroup(classGroup, userIds);
+
+            List<Integer> allTeacherIds = classGroupTeacherMapperList.stream()
+                    .map(ClassGroupTeacherMapper::getUserId)
+                    .collect(Collectors.toList());
+
+            //所有教师列表
+            List<Teacher> teachers = teacherDao.findByTeacherIds(allTeacherIds);
+            Map<Integer, Teacher> teacherMap = teachers.stream()
+                    .collect(Collectors.toMap(Teacher::getId, teacher -> teacher));
+
+            courseScheduleDao.batchAddCourseSchedules(courseScheduleList);
+
+            Date entryDate = DateUtil.stringToDate(sysConfigDao.findByParamName(SysConfigService.TEACHER_ENTRY_DATE).getParanValue(), "yyyy-MM-dd");
+            for (CourseSchedule courseSchedule : courseScheduleList) {
+                //默认课程时长
+                for (ClassGroupTeacherMapper classGroupTeacherMapper : classGroupTeacherMapperList) {
+                    List<TeacherDefaultMusicGroupSalary> teacherSalaryList = teacherDefaultMusicGroupSalaryService.getTeacherSalaryByUserIdAndType(classGroupTeacherMapper.getUserId(), null, null);
+                    BigDecimal salary = new BigDecimal("0");
+
+                    Map<CourseSchedule.CourseScheduleType, TeacherDefaultMusicGroupSalary> collect = teacherSalaryList.stream().collect(Collectors.toMap(TeacherDefaultMusicGroupSalary::getCourseScheduleType, teacherDefaultMusicGroupSalary -> teacherDefaultMusicGroupSalary));
+
+                    TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary = collect.get(classGroup4MixDto.getCourseType());
+                    Teacher teacher = teacherMap.get(classGroupTeacherMapper.getUserId());
+                    if (teacherDefaultMusicGroupSalary == null) {
+                        throw new BizException("请设置" + teacher.getRealName() + "老师的" + classGroup4MixDto.getCourseType().getMsg() + "课酬");
+                    }
+                    if ((classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.HIGH_ONLINE) ||
+                            classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.MUSIC_NETWORK)) &&
+                            StringUtils.isBlank(teacherDefaultMusicGroupSalary.getSalaryRuleJson())) {
+                        throw new BizException("请设置" + teacher.getRealName() + "老师的" + classGroup4MixDto.getCourseType().getMsg() + "课酬");
+                    } else if (teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary() == null
+                            || teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary() == null
+                            || teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() == null
+                            || teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() == null) {
+                        throw new BizException("请设置" + teacher.getRealName() + "老师的" + classGroup4MixDto.getCourseType().getMsg() + "课酬");
+                    }
+
+                    //对应基准课酬
+                    BigDecimal baseSalary = new BigDecimal(0), classTimeDuty = new BigDecimal(0);
+
+                    SalarySettlementTypeEnum settlementType = musicGroup.getSettlementType();
+                    if (Objects.nonNull(teacher.getEntryDate())
+                            && (teacher.getEntryDate().after(entryDate) || teacher.getEntryDate().getTime() == entryDate.getTime())) {
+                        settlementType = SalarySettlementTypeEnum.GRADIENT_SALARY;
+                    }
+
+                    //基准课酬
+                    if (settlementType.equals(SalarySettlementTypeEnum.TEACHER_DEFAULT) && teacherDefaultMusicGroupSalary != null) {
+                        //课程时长与结算单位时长占比
+                        classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(30), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
+                        baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+                    }
+                    //阶梯课酬
+                    if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY) && teacherDefaultMusicGroupSalary != null) {
+                        //课程时长与结算单位时长占比
+                        classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(90), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
+                        baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
+                    }
+
+                    //课堂课课酬改为按分钟数计算,并且时长占比向下取整
+                    if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)){
+                        baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+                        classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(40), BigDecimal.ZERO.intValue(), BigDecimal.ROUND_DOWN);
+                    }
+
+                    salary = baseSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
+
+                    //基础技能提高课
+                    if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
+                        salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+                        if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY)) {
+                            salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
+                        }
+                    }
+                    //线上小班课
+                    if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.HIGH_ONLINE)||classGroup4MixDto.getCourseType().equals(CourseScheduleType.HIGH)) {
+                        teacherDefaultMusicGroupSalary = collect.get(CourseSchedule.CourseScheduleType.HIGH_ONLINE);
+                        Integer studentNum = classGroupStudentMapperDao.countClassGroupNormalStudentNum(classGroupTeacherMapper.getClassGroupId());
+                        if(studentNum>5){
+                            studentNum=5;
+                        }
+                        salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal(studentNum.toString());
+                        if(Objects.isNull(salary)){
+                            throw new BizException("课酬设置异常");
+                        }
+                    }
+
+                    if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.MUSIC_NETWORK)) {
+                        salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal("1");
+                    }
+
+                    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.setExpectSalary(salary);
+                    courseScheduleTeacherSalary.setClassGroupId(classGroup.getId());
+                    courseScheduleTeacherSalary.setMusicGroupId(musicGroupId);
+                    courseScheduleTeacherSalary.setCreateTime(date);
+                    courseScheduleTeacherSalary.setUpdateTime(date);
+                    courseScheduleTeacherSalaryList.add(courseScheduleTeacherSalary);
+                }
+            }
+
+            //老师结算表
+            if (courseScheduleTeacherSalaryList.size() > 0) {
+                courseScheduleTeacherSalaryService.batchInsert(courseScheduleTeacherSalaryList);
+            }
+            Integer musicGroupStudentClassAdjustId = classGroup4MixDto.getMusicGroupStudentClassAdjustId();
+            //学生结算表
+            courseScheduleStudentPaymentService.createForMusicGroup(courseScheduleList, studentIdList,musicGroupStudentClassAdjustId);
+            return classGroup;
+        }
+        return null;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
     public ClassGroup classGroupUpdate(List<ClassGroup4MixDto> classGroup4MixDtos) {
         Date date = new Date();
         Integer classGroupId = classGroup4MixDtos.get(0).getClassGroupId();
@@ -3410,7 +3725,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         }
         musicGroupStudentClassAdjustDao.insert(musicGroupStudentClassAdjust);
         //如果需要审核,校验参数配置
-        checkMergeClassSplitClassAffirmParam(classGroup4MixDtos);
+        checkMergeClassSplitClassAffirmParam(mergeClassSplitClassAffirmDto);
         //如果缴费项目不需要审核,那么生成班级以及课表
         if(status == null || status != AUDITING){
 
@@ -3427,7 +3742,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 List<CourseTimeDto> courseTimeDtos = new ArrayList<>();
                 courseTimeDtos.add(courseTimeDto);
                 classGroup4MixDto.setCourseTimeDtoList(courseTimeDtos);
-                classGroupService.classGroupAdjust(classGroup4MixDtos);
+                classGroupService.classGroupAdjust2(classGroup4MixDto);
             }
             //排课完成后删除所选课程
             courseScheduleDao.deleteMusicGroupCourseSchedulesWithStudents(courseIds,studentIds);
@@ -3452,11 +3767,12 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         }
     }
 
-    private void checkMergeClassSplitClassAffirmParam(List<ClassGroup4MixDto> classGroup4MixDtos){
-        if (classGroup4MixDtos.get(0).getCourseTimes().compareTo(0) <= 0) {
+    private void checkMergeClassSplitClassAffirmParam(MergeClassSplitClassAffirmDto mergeClassSplitClassAffirmDto){
+        ClassGroup4MixDto classGroup4MixDto = mergeClassSplitClassAffirmDto.getClassGroup4MixDtos().get(0);
+        if (classGroup4MixDto.getCourseTimes().compareTo(0) <= 0) {
             throw new BizException("排课次数必须大于0");
         }
-        List<ClassGroupTeacherMapper> classGroupTeacherMapperList = classGroup4MixDtos.get(0).getClassGroupTeacherMapperList();
+        List<ClassGroupTeacherMapper> classGroupTeacherMapperList = classGroup4MixDto.getClassGroupTeacherMapperList();
         if(classGroupTeacherMapperList == null || classGroupTeacherMapperList.size() == 0){
             throw new BizException("请设置上课老师");
         }
@@ -3464,7 +3780,11 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         if(noRepeatTeacherIds.size()!=classGroupTeacherMapperList.size()){
             throw new BizException("主教与助教存在冲突");
         }
-        //所选课程不能有未开始的临时合并课程
+        //所选班级不能有未开始的临时合并课程
+        List<CourseSchedule> noStartNewCourseList = courseScheduleDao.queryNoStartNewCourseList(mergeClassSplitClassAffirmDto.getClassGroupIds());
+        if(noStartNewCourseList != null && noStartNewCourseList.size() > 0){
+            throw new BizException("所选班级不能有未开始的临时合并课程");
+        }
         List<Integer> allTeacherIds = classGroupTeacherMapperList.stream()
                 .map(ClassGroupTeacherMapper::getUserId)
                 .collect(Collectors.toList());
@@ -3473,27 +3793,25 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         List<Teacher> teachers = teacherDao.findByTeacherIds(allTeacherIds);
         Map<Integer, Teacher> teacherMap = teachers.stream()
                 .collect(Collectors.toMap(Teacher::getId, teacher -> teacher));
-        for (ClassGroup4MixDto classGroup4MixDto : classGroup4MixDtos) {
-            for (ClassGroupTeacherMapper classGroupTeacherMapper : classGroupTeacherMapperList) {
-                List<TeacherDefaultMusicGroupSalary> teacherSalaryList = teacherDefaultMusicGroupSalaryService.getTeacherSalaryByUserIdAndType(classGroupTeacherMapper.getUserId(), null, null);
-
-                Map<CourseSchedule.CourseScheduleType, TeacherDefaultMusicGroupSalary> collect = teacherSalaryList.stream().collect(Collectors.toMap(TeacherDefaultMusicGroupSalary::getCourseScheduleType, teacherDefaultMusicGroupSalary -> teacherDefaultMusicGroupSalary));
-
-                TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary = collect.get(classGroup4MixDto.getCourseType());
-                Teacher teacher = teacherMap.get(classGroupTeacherMapper.getUserId());
-                if (teacherDefaultMusicGroupSalary == null) {
-                    throw new BizException("请设置" + teacher.getRealName() + "老师的" + classGroup4MixDto.getCourseType().getMsg() + "课酬");
-                }
-                if ((classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.HIGH_ONLINE) ||
-                        classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.MUSIC_NETWORK)) &&
-                        StringUtils.isBlank(teacherDefaultMusicGroupSalary.getSalaryRuleJson())) {
-                    throw new BizException("请设置" + teacher.getRealName() + "老师的" + classGroup4MixDto.getCourseType().getMsg() + "课酬");
-                } else if (teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary() == null
-                        || teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary() == null
-                        || teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() == null
-                        || teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() == null) {
-                    throw new BizException("请设置" + teacher.getRealName() + "老师的" + classGroup4MixDto.getCourseType().getMsg() + "课酬");
-                }
+        for (ClassGroupTeacherMapper classGroupTeacherMapper : classGroupTeacherMapperList) {
+            List<TeacherDefaultMusicGroupSalary> teacherSalaryList = teacherDefaultMusicGroupSalaryService.getTeacherSalaryByUserIdAndType(classGroupTeacherMapper.getUserId(), null, null);
+
+            Map<CourseSchedule.CourseScheduleType, TeacherDefaultMusicGroupSalary> collect = teacherSalaryList.stream().collect(Collectors.toMap(TeacherDefaultMusicGroupSalary::getCourseScheduleType, teacherDefaultMusicGroupSalary -> teacherDefaultMusicGroupSalary));
+
+            TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary = collect.get(classGroup4MixDto.getCourseType());
+            Teacher teacher = teacherMap.get(classGroupTeacherMapper.getUserId());
+            if (teacherDefaultMusicGroupSalary == null) {
+                throw new BizException("请设置" + teacher.getRealName() + "老师的" + classGroup4MixDto.getCourseType().getMsg() + "课酬");
+            }
+            if ((classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.HIGH_ONLINE) ||
+                    classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.MUSIC_NETWORK)) &&
+                    StringUtils.isBlank(teacherDefaultMusicGroupSalary.getSalaryRuleJson())) {
+                throw new BizException("请设置" + teacher.getRealName() + "老师的" + classGroup4MixDto.getCourseType().getMsg() + "课酬");
+            } else if (teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary() == null
+                    || teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary() == null
+                    || teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() == null
+                    || teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() == null) {
+                throw new BizException("请设置" + teacher.getRealName() + "老师的" + classGroup4MixDto.getCourseType().getMsg() + "课酬");
             }
         }
     }

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

@@ -44,6 +44,7 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
@@ -1773,6 +1774,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class,isolation = Isolation.READ_COMMITTED)
     public void checkNewCourseSchedules(List<CourseSchedule> courseSchedules, boolean checkExistCourseSchedule) {
         if (CollectionUtils.isEmpty(courseSchedules)) {
             return;

+ 0 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleStudentPaymentServiceImpl.java

@@ -313,7 +313,6 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 	}
 
 	@Override
-	@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
 	public void createForMusicGroup(List<CourseSchedule> courseSchedules, List<Integer> studentIds,Integer musicGroupStudentClassAdjustId) {
 		//获取提交的合班申请
 		MusicGroupStudentClassAdjust classAdjust = musicGroupStudentClassAdjustDao.get(musicGroupStudentClassAdjustId);

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java

@@ -2055,6 +2055,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 sysMessageService.batchSendMessage(MessageSender.AWSMS, MessageTypeEnum.STUDENT_SMS_MUSIC_GROUP_RENEW_SUCCESS, yimei, null, 0, "1", "",
                         studentRegistration.getParentsName(), studentPaymentOrder.getActualAmount());
             }
+            studentRegistrationService.updateUserSurplusCourseFee(userId,musicGroupId,amount.negate(),"",userId);
             return true;
         } else {
             if (studentPaymentOrder.getBalancePaymentAmount() != null && studentPaymentOrder.getBalancePaymentAmount().doubleValue() > 0) {

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

@@ -3411,4 +3411,15 @@
         SELECT * FROM course_schedule WHERE id_ = #{courseId} FOR UPDATE
     </select>
 
+    <select id="queryNoStartNewCourseList" resultMap="CourseSchedule">
+        SELECT * FROM course_schedule
+        WHERE new_course_id_ IS NOT NULL AND new_course_id_ > 0
+        AND CONCAT(class_date_,' ',start_class_time_) > NOW()
+        AND del_flag_ = 0 AND is_lock_ = 0
+        AND class_group_id_ IN
+        <foreach collection="classGroupIds" open="(" close=")" separator="," item="item">
+            #{item}
+        </foreach>
+    </select>
+
 </mapper>

+ 3 - 0
mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderMapper.xml

@@ -434,6 +434,9 @@
             <if test="paymentType != null">
                 AND mgpc.payment_type_ = #{paymentType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
             </if>
+            <if test="payUserType != null">
+                AND mgpc.pay_user_type_ = #{payUserType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+            </if>
             <if test="status != null">
                 AND mgpc.status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
             </if>