|  | @@ -2631,6 +2631,126 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @Override
 | 
	
		
			
				|  |  |      @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | +    public void confirmPreCourseSchedule(Integer musicGroupSchoolTermCourseDetailId) {
 | 
	
		
			
				|  |  | +        MusicGroupSchoolTermCourseDetail termCourseDetail = musicGroupSchoolTermCourseDetailDao.get(musicGroupSchoolTermCourseDetailId);
 | 
	
		
			
				|  |  | +        //校验所有学员的课时都有消耗
 | 
	
		
			
				|  |  | +        if(musicGroupSchoolTermStudentCourseDetailDao.checkNoCourse(musicGroupSchoolTermCourseDetailId)){
 | 
	
		
			
				|  |  | +            throw new BizException("操作失败:请确保所有学员都已排课");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        //获取所有预排课课程列表
 | 
	
		
			
				|  |  | +        List<CourseSchedule> courseSchedules = courseScheduleDao.queryPreCourseListByMusicGroupId(termCourseDetail.getMusicGroupId());
 | 
	
		
			
				|  |  | +        if(courseSchedules.size() == 0){
 | 
	
		
			
				|  |  | +            throw new BizException("操作失败:请先预排课");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        Map<Integer, List<CourseSchedule>> courseMap = courseSchedules.stream().collect(Collectors.groupingBy(CourseSchedule::getClassGroupId));
 | 
	
		
			
				|  |  | +        courseMap.keySet().forEach(e->{
 | 
	
		
			
				|  |  | +            //更新班级课程数
 | 
	
		
			
				|  |  | +            classGroupService.updateTotalClassTimes(e, courseMap.get(e).size());
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +        List<Long> courseScheduleIds = courseSchedules.stream().map(e -> e.getId()).collect(Collectors.toList());
 | 
	
		
			
				|  |  | +        //取消预排课标记
 | 
	
		
			
				|  |  | +        courseScheduleDao.batchUpdateLockByCourseIds(courseScheduleIds,0,0);
 | 
	
		
			
				|  |  | +        //标记已排课
 | 
	
		
			
				|  |  | +        termCourseDetail.setCourseFlag(true);
 | 
	
		
			
				|  |  | +        musicGroupSchoolTermCourseDetailDao.update(termCourseDetail);
 | 
	
		
			
				|  |  | +        //更新学员服务指标
 | 
	
		
			
				|  |  | +        List<CourseScheduleStudentPayment> studentPayments = courseScheduleStudentPaymentDao.findByCourseScheduleIds(courseScheduleIds);
 | 
	
		
			
				|  |  | +        List<Integer> studentIds = studentPayments.stream().map(e -> e.getUserId()).collect(Collectors.toList());
 | 
	
		
			
				|  |  | +        studentDao.updateStudentServiceTag(null, studentIds, YesOrNoEnum.YES.getCode());
 | 
	
		
			
				|  |  | +        //初始化老师考勤表
 | 
	
		
			
				|  |  | +        List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = courseScheduleTeacherSalaryDao.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);
 | 
	
		
			
				|  |  | +//            }
 | 
	
		
			
				|  |  | +//        }
 | 
	
		
			
				|  |  | +        List<TeacherAttendance> teacherIdByCourseSchedule = teacherAttendanceDao.findTeacherIdByCourseSchedule(courseScheduleIds);
 | 
	
		
			
				|  |  | +        Map<Long, List<TeacherAttendance>> courseScheduleTeacherAttendanceMap = teacherIdByCourseSchedule.stream()
 | 
	
		
			
				|  |  | +                .collect(Collectors.groupingBy(TeacherAttendance::getCourseScheduleId));
 | 
	
		
			
				|  |  | +        List<TeacherAttendance> teacherAttendances = new ArrayList<>();
 | 
	
		
			
				|  |  | +        courseScheduleTeacherSalaries.forEach(courseScheduleTeacherSalary -> {
 | 
	
		
			
				|  |  | +            List<TeacherAttendance> teacherAttendancesTemp = courseScheduleTeacherAttendanceMap.get(courseScheduleTeacherSalary.getCourseScheduleId());
 | 
	
		
			
				|  |  | +            List<Integer> collect = new ArrayList<>();
 | 
	
		
			
				|  |  | +            if (!CollectionUtils.isEmpty(teacherAttendancesTemp)) {
 | 
	
		
			
				|  |  | +                collect = teacherAttendancesTemp.stream().map(TeacherAttendance::getTeacherId).collect(Collectors.toList());
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            TeacherAttendance teacherAttendance = new TeacherAttendance();
 | 
	
		
			
				|  |  | +            teacherAttendance.setGroupType(courseScheduleTeacherSalary.getGroupType());
 | 
	
		
			
				|  |  | +            teacherAttendance.setClassGroupId(courseScheduleTeacherSalary.getClassGroupId());
 | 
	
		
			
				|  |  | +            teacherAttendance.setMusicGroupId(courseScheduleTeacherSalary.getMusicGroupId());
 | 
	
		
			
				|  |  | +            if (CollectionUtils.isEmpty(collect) || !collect.contains(courseScheduleTeacherSalary.getUserId())) {
 | 
	
		
			
				|  |  | +                teacherAttendance.setTeacherId(courseScheduleTeacherSalary.getUserId());
 | 
	
		
			
				|  |  | +                teacherAttendance.setCourseScheduleId(courseScheduleTeacherSalary.getCourseScheduleId());
 | 
	
		
			
				|  |  | +                teacherAttendances.add(teacherAttendance);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +        if (!CollectionUtils.isEmpty(teacherAttendances)) {
 | 
	
		
			
				|  |  | +            teacherAttendanceDao.batchInsert(teacherAttendances);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        imUserFriendService.refreshGroupImUserFriend(termCourseDetail.getMusicGroupId(),MUSIC);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | +    public void cancelPreCourseSchedule(Integer musicGroupSchoolTermCourseDetailId, Integer classGroupId) {
 | 
	
		
			
				|  |  | +        MusicGroupSchoolTermCourseDetail termCourseDetail = musicGroupSchoolTermCourseDetailDao.get(musicGroupSchoolTermCourseDetailId);
 | 
	
		
			
				|  |  | +        if(classGroupId == null){
 | 
	
		
			
				|  |  | +            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
 | 
	
		
			
				|  |  | +    @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  |      public HttpResponseResult preCourseSchedule(List<ClassGroup4MixDto> classGroup4MixDtos) {
 | 
	
		
			
				|  |  |          Date date = new Date();
 | 
	
		
			
				|  |  |          Integer classGroupId = classGroup4MixDtos.get(0).getClassGroupId();
 | 
	
	
		
			
				|  | @@ -2682,6 +2802,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 | 
	
		
			
				|  |  |              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 分钟
 | 
	
	
		
			
				|  | @@ -2689,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);
 | 
	
	
		
			
				|  | @@ -2870,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);
 | 
	
	
		
			
				|  | @@ -2892,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);
 | 
	
		
			
				|  |  |          }
 | 
	
	
		
			
				|  | @@ -4021,7 +4146,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 | 
	
		
			
				|  |  |              //冻结班级
 | 
	
		
			
				|  |  |              classGroupDao.batchUpdateLockByClassGroupIds(classGroupIds, 1);
 | 
	
		
			
				|  |  |              //冻结所选班级的课程
 | 
	
		
			
				|  |  | -            courseScheduleDao.batchUpdateLockByCourseIds(allLockCourseIds, 1);
 | 
	
		
			
				|  |  | +            courseScheduleDao.batchUpdateLockByCourseIds(allLockCourseIds, 1,null);
 | 
	
		
			
				|  |  |              httpResponseResult.setMsg("学员班级调整申请已提交,缴费项目审核中");
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          return httpResponseResult;
 | 
	
	
		
			
				|  | @@ -4452,7 +4577,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 | 
	
		
			
				|  |  |  //                冻结班级
 | 
	
		
			
				|  |  |              classGroupDao.batchUpdateLockByClassGroupIds(classGroupIds, 1);
 | 
	
		
			
				|  |  |  //                冻结所选班级的课程
 | 
	
		
			
				|  |  | -            courseScheduleDao.batchUpdateLockByCourseIds(allLockCourseIds, 1);
 | 
	
		
			
				|  |  | +            courseScheduleDao.batchUpdateLockByCourseIds(allLockCourseIds, 1,null);
 | 
	
		
			
				|  |  |              httpResponseResult.setMsg("操作成功:学员班级调整申请已提交,缴费项目审核中");
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          return httpResponseResult;
 | 
	
	
		
			
				|  | @@ -4488,7 +4613,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 | 
	
		
			
				|  |  |              courseScheduleDao.deleteMusicGroupCourseSchedulesWithStudents(courseIds, studentIds);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          //解冻课程
 | 
	
		
			
				|  |  | -        courseScheduleDao.batchUpdateLockByCourseIds(allLockCourseIds, 0);
 | 
	
		
			
				|  |  | +        courseScheduleDao.batchUpdateLockByCourseIds(allLockCourseIds, 0,null);
 | 
	
		
			
				|  |  |          //解冻班级
 | 
	
		
			
				|  |  |          classGroupIds.add(masterClassGroupId);
 | 
	
		
			
				|  |  |          classGroupDao.batchUpdateLockByClassGroupIds(classGroupIds, 0);
 | 
	
	
		
			
				|  | @@ -4510,7 +4635,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @Override
 | 
	
		
			
				|  |  |      public List<CourseSchedule> queryPreCourseList(Integer classGroupId) {
 | 
	
		
			
				|  |  | -        List<CourseSchedule> courseSchedules = courseScheduleDao.queryPreCourseList(classGroupId);
 | 
	
		
			
				|  |  | +        List<CourseSchedule> courseSchedules = courseScheduleDao.queryPreCourseListByClassGroupId(classGroupId);
 | 
	
		
			
				|  |  |          if(courseSchedules.size() > 0){
 | 
	
		
			
				|  |  |              List<Long> courseIdList = courseSchedules.stream().map(e -> e.getId()).collect(Collectors.toList());
 | 
	
		
			
				|  |  |              Map<Long, String> bishopTeacherMap = MapUtil.convertMybatisMap(courseScheduleTeacherSalaryDao.queryTeacherIdMap(courseIdList,"BISHOP"));
 | 
	
	
		
			
				|  | @@ -4522,9 +4647,4 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          return courseSchedules;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    @Override
 | 
	
		
			
				|  |  | -    public HttpResponseResult confirmPreCourseSchedule(Integer musicGroupSchoolTermCourseDetailId) {
 | 
	
		
			
				|  |  | -        return null;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  |  }
 |