|  | @@ -2630,7 +2630,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @Override
 | 
	
		
			
				|  |  | -    public HttpResponseResult confirmPreCourseSchedule(Integer musicGroupSchoolTermCourseDetailId) {
 | 
	
		
			
				|  |  | +    @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | +    public void confirmPreCourseSchedule(Integer musicGroupSchoolTermCourseDetailId) {
 | 
	
		
			
				|  |  |          MusicGroupSchoolTermCourseDetail termCourseDetail = musicGroupSchoolTermCourseDetailDao.get(musicGroupSchoolTermCourseDetailId);
 | 
	
		
			
				|  |  |          //校验所有学员的课时都有消耗
 | 
	
		
			
				|  |  |          if(musicGroupSchoolTermStudentCourseDetailDao.checkNoCourse(musicGroupSchoolTermCourseDetailId)){
 | 
	
	
		
			
				|  | @@ -2658,14 +2659,14 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 | 
	
		
			
				|  |  |          studentDao.updateStudentServiceTag(null, studentIds, YesOrNoEnum.YES.getCode());
 | 
	
		
			
				|  |  |          //初始化老师考勤表
 | 
	
		
			
				|  |  |          List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = courseScheduleTeacherSalaryDao.findByCourseSchedules(courseScheduleIds);
 | 
	
		
			
				|  |  | -        List<ClassGroup> byCourseSchedules = classGroupDao.findByCourseSchedules(courseScheduleIds);
 | 
	
		
			
				|  |  | +//        List<ClassGroup> byCourseSchedules = classGroupDao.findByCourseSchedules(courseScheduleIds);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        Map<Integer, ClassGroup> classGroupMap = new HashMap<Integer, ClassGroup>();
 | 
	
		
			
				|  |  | -        for (ClassGroup classGroup : byCourseSchedules) {
 | 
	
		
			
				|  |  | -            if (!classGroupMap.containsKey(classGroup.getId())) {
 | 
	
		
			
				|  |  | -                classGroupMap.put(classGroup.getId(), classGroup);
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +//        Map<Integer, ClassGroup> classGroupMap = new HashMap<Integer, ClassGroup>();
 | 
	
		
			
				|  |  | +//        for (ClassGroup classGroup : byCourseSchedules) {
 | 
	
		
			
				|  |  | +//            if (!classGroupMap.containsKey(classGroup.getId())) {
 | 
	
		
			
				|  |  | +//                classGroupMap.put(classGroup.getId(), classGroup);
 | 
	
		
			
				|  |  | +//            }
 | 
	
		
			
				|  |  | +//        }
 | 
	
		
			
				|  |  |          List<TeacherAttendance> teacherIdByCourseSchedule = teacherAttendanceDao.findTeacherIdByCourseSchedule(courseScheduleIds);
 | 
	
		
			
				|  |  |          Map<Long, List<TeacherAttendance>> courseScheduleTeacherAttendanceMap = teacherIdByCourseSchedule.stream()
 | 
	
		
			
				|  |  |                  .collect(Collectors.groupingBy(TeacherAttendance::getCourseScheduleId));
 | 
	
	
		
			
				|  | @@ -2690,7 +2691,62 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 | 
	
		
			
				|  |  |              teacherAttendanceDao.batchInsert(teacherAttendances);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          imUserFriendService.refreshGroupImUserFriend(termCourseDetail.getMusicGroupId(),MUSIC);
 | 
	
		
			
				|  |  | -        return null;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | +    public void cancelPreCourseSchedule(Integer musicGroupSchoolTermCourseDetailId, Integer classGroupId) {
 | 
	
		
			
				|  |  | +        MusicGroupSchoolTermCourseDetail termCourseDetail = musicGroupSchoolTermCourseDetailDao.get(musicGroupSchoolTermCourseDetailId);
 | 
	
		
			
				|  |  | +        if(classGroupId == null){
 | 
	
		
			
				|  |  | +            List<CourseSchedule> courseSchedules = courseScheduleDao.queryPreCourseListByMusicGroupId(termCourseDetail.getMusicGroupId());
 | 
	
		
			
				|  |  | +            if(courseSchedules.size() == 0){
 | 
	
		
			
				|  |  | +                return;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            List<Long> courseScheduleIds = courseSchedules.stream().map(e -> e.getId()).collect(Collectors.toList());
 | 
	
		
			
				|  |  | +            //取消所有预排课
 | 
	
		
			
				|  |  | +            musicGroupSchoolTermStudentCourseDetailDao.cleanMinutes(musicGroupSchoolTermCourseDetailId);
 | 
	
		
			
				|  |  | +            //删除课程以及关联的学员老师
 | 
	
		
			
				|  |  | +            courseScheduleStudentPaymentDao.deleteByCourseSchedule(courseScheduleIds);
 | 
	
		
			
				|  |  | +            courseScheduleTeacherSalaryDao.batchDeleteByCourseScheduleIds(courseScheduleIds);
 | 
	
		
			
				|  |  | +            courseScheduleDao.deleteCourseSchedulesByClassGroupIds(courseScheduleIds);
 | 
	
		
			
				|  |  | +        }else {
 | 
	
		
			
				|  |  | +            List<CourseSchedule> courseSchedules = courseScheduleDao.queryPreCourseListByClassGroupId(classGroupId);
 | 
	
		
			
				|  |  | +            if(courseSchedules.size() == 0){
 | 
	
		
			
				|  |  | +                return;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            List<Long> courseScheduleIds = courseSchedules.stream().map(c -> c.getId()).collect(Collectors.toList());
 | 
	
		
			
				|  |  | +            List<CourseScheduleStudentPayment> courseScheduleStudentPayments = courseScheduleStudentPaymentDao.findByCourseScheduleIds(courseScheduleIds);
 | 
	
		
			
				|  |  | +            Map<Integer, List<CourseScheduleStudentPayment>> studentCourseMap = courseScheduleStudentPayments.stream().collect(Collectors.groupingBy(CourseScheduleStudentPayment::getUserId));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            for (Integer studentId : studentCourseMap.keySet()) {
 | 
	
		
			
				|  |  | +                int preMemberCourseMinutes = 0;
 | 
	
		
			
				|  |  | +                int mixCourseMinutes = 0;
 | 
	
		
			
				|  |  | +                int singleCourseMinutes = 0;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                List<CourseScheduleStudentPayment> courseScheduleStudentPaymentList = studentCourseMap.get(studentId);
 | 
	
		
			
				|  |  | +                List<Long> courseIds = courseScheduleStudentPaymentList.stream().map(c -> c.getId()).collect(Collectors.toList());
 | 
	
		
			
				|  |  | +                List<CourseSchedule> schedules = courseScheduleDao.findByCourseScheduleIds(courseIds);
 | 
	
		
			
				|  |  | +                Map<CourseScheduleType, List<CourseSchedule>> courseTypeMap = schedules.stream().collect(Collectors.groupingBy(CourseSchedule::getType));
 | 
	
		
			
				|  |  | +                for (CourseScheduleType scheduleType : courseTypeMap.keySet()) {
 | 
	
		
			
				|  |  | +                    List<CourseSchedule> courseScheduleList = courseTypeMap.get(scheduleType);
 | 
	
		
			
				|  |  | +                    List<Long> courseScheduleIdList = courseScheduleList.stream().map(c -> c.getId()).collect(Collectors.toList());
 | 
	
		
			
				|  |  | +                    //根据课程编号获取总时长
 | 
	
		
			
				|  |  | +                    int courseMinutes = courseScheduleDao.sumCourseMinutes(courseScheduleIdList);
 | 
	
		
			
				|  |  | +                    preMemberCourseMinutes += courseMinutes;
 | 
	
		
			
				|  |  | +                    if(scheduleType == SINGLE || scheduleType == TRAINING_SINGLE){
 | 
	
		
			
				|  |  | +                        singleCourseMinutes += courseMinutes;
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    if(scheduleType == MIX || scheduleType == TRAINING_MIX){
 | 
	
		
			
				|  |  | +                        mixCourseMinutes += courseMinutes;
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                musicGroupSchoolTermStudentCourseDetailDao.cutMinutes(musicGroupSchoolTermCourseDetailId,preMemberCourseMinutes,mixCourseMinutes,singleCourseMinutes,studentId);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            //删除课程以及关联的学员老师
 | 
	
		
			
				|  |  | +            courseScheduleStudentPaymentDao.deleteByCourseSchedule(courseScheduleIds);
 | 
	
		
			
				|  |  | +            courseScheduleTeacherSalaryDao.batchDeleteByCourseScheduleIds(courseScheduleIds);
 | 
	
		
			
				|  |  | +            courseScheduleDao.deleteCourseSchedulesByClassGroupIds(courseScheduleIds);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @Override
 | 
	
	
		
			
				|  | @@ -2742,11 +2798,12 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 | 
	
		
			
				|  |  |          List<CourseSchedule> courseScheduleList = new ArrayList<>();
 | 
	
		
			
				|  |  |          MusicGroupSchoolTermCourseDetail schoolTermCourseDetail = musicGroupSchoolTermCourseDetailDao.get(musicGroupSchoolTermCourseDetailId);
 | 
	
		
			
				|  |  |          for (ClassGroup4MixDto classGroup4MixDto : classGroup4MixDtos) {
 | 
	
		
			
				|  |  | -            //更新学员的排课时长
 | 
	
		
			
				|  |  |              //3、插入班级排课信息
 | 
	
		
			
				|  |  |              LocalDateTime now = LocalDateTime.now().withHour(0).withMinute(0).withSecond(0).withNano(0);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              int totalCourseMinutes = classGroup4MixDto.getExpectStudentNum() * classGroup4MixDto.getCourseMinutes();
 | 
	
		
			
				|  |  | +            Integer totalMixCourseMinutes = 0;
 | 
	
		
			
				|  |  | +            Integer singleCourseMinutes = 0;
 | 
	
		
			
				|  |  |              if(classGroup4MixDto.getCourseType() == SINGLE || classGroup4MixDto.getCourseType() == MIX ||
 | 
	
		
			
				|  |  |                      classGroup4MixDto.getCourseType() == TRAINING_SINGLE || classGroup4MixDto.getCourseType() == TRAINING_MIX){
 | 
	
		
			
				|  |  |                  //单技课和合奏课最大的排课时长不能超过44 * 45 分钟
 | 
	
	
		
			
				|  | @@ -2754,12 +2811,14 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 | 
	
		
			
				|  |  |                      throw new BizException("操作失败:单技课和合奏课最大的排课时长不能超过{}分钟",44*45);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |                  if(classGroup4MixDto.getCourseType() == SINGLE || classGroup4MixDto.getCourseType() == TRAINING_SINGLE){
 | 
	
		
			
				|  |  | +                    singleCourseMinutes = totalCourseMinutes;
 | 
	
		
			
				|  |  |                      //获取所选学员最大的已消耗的单技课时长
 | 
	
		
			
				|  |  |                      int maxSingleCourseMinutes = musicGroupSchoolTermStudentCourseDetailDao.getMaxSingleCourseMinutes(musicGroupSchoolTermCourseDetailId,studentIds);
 | 
	
		
			
				|  |  |                      if(44 * 45 - maxSingleCourseMinutes > totalCourseMinutes){
 | 
	
		
			
				|  |  |                          throw new BizException("操作失败:所选学员可排单技课时长已不足{}分钟",totalCourseMinutes);
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                  } else {
 | 
	
		
			
				|  |  | +                    totalMixCourseMinutes = totalCourseMinutes;
 | 
	
		
			
				|  |  |                      int maxMixCourseMinutes = musicGroupSchoolTermStudentCourseDetailDao.getMaxMixCourseMinutes(musicGroupSchoolTermCourseDetailId,studentIds);
 | 
	
		
			
				|  |  |                      if(44 * 45 - maxMixCourseMinutes > totalCourseMinutes){
 | 
	
		
			
				|  |  |                          throw new BizException("操作失败:所选学员可排合奏课时长已不足{}分钟",totalCourseMinutes);
 | 
	
	
		
			
				|  | @@ -2935,10 +2994,12 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  now = now.plusDays(1);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -//            if (totalCourseDuration > totalMinutes) {
 | 
	
		
			
				|  |  | -//                throw new BizException("课程时长不足");
 | 
	
		
			
				|  |  | -//            }
 | 
	
		
			
				|  |  | +            //更新学员的排课时长
 | 
	
		
			
				|  |  | +            musicGroupSchoolTermStudentCourseDetailDao.updateMinutes(musicGroupSchoolTermCourseDetailId,
 | 
	
		
			
				|  |  | +                    totalCourseMinutes,
 | 
	
		
			
				|  |  | +                    totalMixCourseMinutes,
 | 
	
		
			
				|  |  | +                    singleCourseMinutes,
 | 
	
		
			
				|  |  | +                    studentIds);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          courseScheduleService.checkNewCourseSchedules(courseScheduleList, false, false);
 | 
	
	
		
			
				|  | @@ -2957,7 +3018,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          if (!CollectionUtils.isEmpty(studentList)) {
 | 
	
		
			
				|  |  |  //            studentDao.updateStudentServiceTag(null, studentIds, YesOrNoEnum.YES.getCode());
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              //学生结算表
 | 
	
		
			
				|  |  |              courseScheduleStudentPaymentService.createForMemberMusicGroup(musicGroupId, courseScheduleList, studentIds);
 | 
	
		
			
				|  |  |          }
 |