|  | @@ -511,9 +511,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
 | 
	
		
			
				|  |  |          Date date = DateUtil.addMonths(now, -1);
 | 
	
		
			
				|  |  |          String startDate = DateUtil.format(DateUtil.getFirstDayOfMonth(date),DateUtil.DEFAULT_PATTERN);
 | 
	
		
			
				|  |  |          String endDate = DateUtil.format(DateUtil.getLastDayOfMonth(date),DateUtil.DEFAULT_PATTERN);
 | 
	
		
			
				|  |  | -        Integer settlementClassMinutes = Integer.parseInt(sysConfigDao.findByParamName(SysConfigService.MUSIC_GROUP_SETTLEMENT_CLASS_MINUTES).getParanValue());
 | 
	
		
			
				|  |  | -        Integer singleClassTime = Integer.parseInt(sysConfigDao.findByParamName(SysConfigService.MUSIC_GROUP_SETTLEMENT_SINGLE_CLASS_MINUTES).getParanValue());
 | 
	
		
			
				|  |  | -        Date entryDate = DateUtil.stringToDate(sysConfigDao.findByParamName(SysConfigService.TEACHER_ENTRY_DATE).getParanValue(),"yyyy-MM-dd");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          //获取上个月的课程计划
 | 
	
		
			
				|  |  |          List<CourseSchedule> yesterdayCourseSchedules = courseScheduleDao.findCourseScheduleWithDate(startDate,endDate);
 | 
	
		
			
				|  |  |          //课程编号列表
 | 
	
	
		
			
				|  | @@ -560,100 +558,19 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
 | 
	
		
			
				|  |  |                      .collect(Collectors.groupingBy(StudentAttendance::getCourseScheduleId, Collectors.counting()));
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        //课程对应乐团结算方式集合
 | 
	
		
			
				|  |  | -        List<Map<String, String>> musicGroupSettlementTypeByCourse = courseScheduleTeacherSalaryDao.findMusicGroupSettlementTypeByCourse(courseScheduleIds);
 | 
	
		
			
				|  |  | -        Map<String, String> musicGroupSettlementsMap = MapUtil.convertMybatisMap(musicGroupSettlementTypeByCourse);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        //教师对应课程列表集合
 | 
	
		
			
				|  |  | -        Map<Integer, List<CourseScheduleTeacherSalary>> teacherSalarysByTeacher = courseScheduleTeacherSalaries.stream()
 | 
	
		
			
				|  |  | -                .collect(Collectors.groupingBy(CourseScheduleTeacherSalary::getUserId));
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |          //所有老师编号
 | 
	
		
			
				|  |  |          List<Integer> allTeacherIds = courseScheduleTeacherSalaries.stream()
 | 
	
		
			
				|  |  |                  .map(CourseScheduleTeacherSalary::getUserId)
 | 
	
		
			
				|  |  |                  .collect(Collectors.toList());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        //所有教师列表
 | 
	
		
			
				|  |  | -        List<Teacher> teachers = teacherDao.findByTeacherIds(allTeacherIds);
 | 
	
		
			
				|  |  | -        Map<Integer, Teacher> teacherMap = teachers.stream()
 | 
	
		
			
				|  |  | -                .collect(Collectors.toMap(Teacher::getId, teacher -> teacher));
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |          //所有老师默认乐团课酬
 | 
	
		
			
				|  |  |          List<TeacherDefaultMusicGroupSalary> teacherDefaultMusicGroupSalaries = teacherDefaultMusicGroupSalaryDao.findByTeacher(allTeacherIds);
 | 
	
		
			
				|  |  |          Map<CourseSchedule.CourseScheduleType, List<TeacherDefaultMusicGroupSalary>> teacherDefaultMusicGroupSalariesGroupByCourseType = teacherDefaultMusicGroupSalaries.stream().collect(Collectors.groupingBy(TeacherDefaultMusicGroupSalary::getCourseScheduleType));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        //教师对应的每个教学点的总课时
 | 
	
		
			
				|  |  | -        Map<Integer, Map<Integer, Map<Date, Integer>>> teacherClassMinutesMap = new HashMap<>();
 | 
	
		
			
				|  |  | -        //计算老师对应的总课时
 | 
	
		
			
				|  |  | -        teacherSalarysByTeacher.forEach((teacherId, teacherSalarys) -> {
 | 
	
		
			
				|  |  | -            //当前老师所在课程的编号列表
 | 
	
		
			
				|  |  | -            List<Long> currentTeacherCourscheduleIds = teacherSalarys.stream()
 | 
	
		
			
				|  |  | -                    .map(CourseScheduleTeacherSalary::getCourseScheduleId)
 | 
	
		
			
				|  |  | -                    .collect(Collectors.toList());
 | 
	
		
			
				|  |  | -            //当前老师的课程列表
 | 
	
		
			
				|  |  | -            List<CourseSchedule> currentTeacherCourseSchedules = yesterdayCourseSchedules.stream()
 | 
	
		
			
				|  |  | -                    .filter(courseSchedule -> currentTeacherCourscheduleIds.contains(courseSchedule.getId()))
 | 
	
		
			
				|  |  | -                    .collect(Collectors.toList());
 | 
	
		
			
				|  |  | -            //根据教学点将当前老师的课程分组
 | 
	
		
			
				|  |  | -            Map<Integer, List<CourseSchedule>> schoolCourseSchedules = currentTeacherCourseSchedules.stream()
 | 
	
		
			
				|  |  | -                    .filter(courseSchedule -> Objects.nonNull(courseSchedule.getSchoolId()))
 | 
	
		
			
				|  |  | -                    .collect(Collectors.groupingBy(CourseSchedule::getSchoolId));
 | 
	
		
			
				|  |  | -            Map<Integer, Map<Date,Integer>> schoolClassMinutesMap = new HashMap<>();
 | 
	
		
			
				|  |  | -            for (Integer schoolId : schoolCourseSchedules.keySet()) {
 | 
	
		
			
				|  |  | -                //当前教学点的课程
 | 
	
		
			
				|  |  | -                List<CourseSchedule> currentSchoolCourseSchedules = schoolCourseSchedules.get(schoolId);
 | 
	
		
			
				|  |  | -                Map<Date, List<CourseSchedule>> courseScheduleWithDate = currentSchoolCourseSchedules.stream()
 | 
	
		
			
				|  |  | -                        .collect(Collectors.groupingBy(CourseSchedule::getClassDate));
 | 
	
		
			
				|  |  | -                Map<Date,Integer> dataClassMinutesMpa = new HashMap<>();
 | 
	
		
			
				|  |  | -                for (Date classDate:courseScheduleWithDate.keySet()){
 | 
	
		
			
				|  |  | -                    Integer classMinutes = 0;
 | 
	
		
			
				|  |  | -                    List<CourseSchedule> classCourses = courseScheduleWithDate.get(classDate);
 | 
	
		
			
				|  |  | -                    for (CourseSchedule courseSchedule : classCourses) {
 | 
	
		
			
				|  |  | -                        //如果课程为单机课或者为合奏课,则算入总课时长
 | 
	
		
			
				|  |  | -                        if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.SINGLE)
 | 
	
		
			
				|  |  | -                                || courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.MIX)) {
 | 
	
		
			
				|  |  | -                            classMinutes += DateUtil.minutesBetween(courseSchedule.getStartClassTime(), courseSchedule.getEndClassTime());
 | 
	
		
			
				|  |  | -                        }
 | 
	
		
			
				|  |  | -                    }
 | 
	
		
			
				|  |  | -                    dataClassMinutesMpa.put(classDate, classMinutes);
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -                schoolClassMinutesMap.put(schoolId, dataClassMinutesMpa);
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            teacherClassMinutesMap.put(teacherId, schoolClassMinutesMap);
 | 
	
		
			
				|  |  | -        });
 | 
	
		
			
				|  |  |          //计算课酬
 | 
	
		
			
				|  |  |          for (CourseScheduleTeacherSalary courseScheduleTeacherSalary : courseScheduleTeacherSalaries) {
 | 
	
		
			
				|  |  | -            boolean durationIsChange = false;
 | 
	
		
			
				|  |  |              //当前课酬对应的课程信息
 | 
	
		
			
				|  |  |              CourseSchedule courseSchedule = courseScheduleIdMap.get(courseScheduleTeacherSalary.getCourseScheduleId());
 | 
	
		
			
				|  |  | -            Map<Integer, Map<Date,Integer>> schoolClassMinutesMap = teacherClassMinutesMap.get(courseScheduleTeacherSalary.getUserId());
 | 
	
		
			
				|  |  | -            Map<Date,Integer> classDateMinutes = schoolClassMinutesMap.get(courseSchedule.getSchoolId());
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            //结算方式
 | 
	
		
			
				|  |  | -            String settlementType = musicGroupSettlementsMap.get(courseScheduleTeacherSalary.getCourseScheduleId());
 | 
	
		
			
				|  |  | -            if(StringUtils.isEmpty(settlementType)){
 | 
	
		
			
				|  |  | -                LOGGER.error("未指定课酬结算方式[{}]", courseScheduleTeacherSalary.getId());
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            Teacher teacher=teacherMap.get(courseScheduleTeacherSalary.getUserId());
 | 
	
		
			
				|  |  | -            //如果当前教师是在指定日期之后入职的,则按照3.0的方式结算
 | 
	
		
			
				|  |  | -            if(Objects.nonNull(teacher.getEntryDate())
 | 
	
		
			
				|  |  | -                    &&(teacher.getEntryDate().after(entryDate)||teacher.getEntryDate().getTime()==entryDate.getTime())){
 | 
	
		
			
				|  |  | -                settlementType = SalarySettlementTypeEnum.GRADIENT_SALARY.getCode();
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            //当前课程的时长
 | 
	
		
			
				|  |  | -            int duration = DateUtil.minutesBetween(courseSchedule.getStartClassTime(), courseSchedule.getEndClassTime());
 | 
	
		
			
				|  |  | -            //如果是单技课或者合奏课并且结算方式为3.0
 | 
	
		
			
				|  |  | -            if (Objects.nonNull(classDateMinutes)&&settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY.getCode())
 | 
	
		
			
				|  |  | -                    &&(courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.SINGLE)
 | 
	
		
			
				|  |  | -                    || courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.MIX))) {
 | 
	
		
			
				|  |  | -                Integer schoolClassMinutes = classDateMinutes.get(courseSchedule.getClassDate());
 | 
	
		
			
				|  |  | -                if (schoolClassMinutes >= settlementClassMinutes && duration < singleClassTime) {
 | 
	
		
			
				|  |  | -                    duration = singleClassTime;
 | 
	
		
			
				|  |  | -                    durationIsChange = true;
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              if(CourseSchedule.CourseScheduleType.HIGH.equals(courseSchedule.getType())){
 | 
	
		
			
				|  |  |                  courseSchedule.setType(CourseSchedule.CourseScheduleType.HIGH_ONLINE);
 | 
	
	
		
			
				|  | @@ -688,43 +605,6 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
 | 
	
		
			
				|  |  |                  if(Objects.isNull(teacherSalary)){
 | 
	
		
			
				|  |  |                      teacherSalary = BigDecimal.ZERO;
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  | -            }else if(durationIsChange&&!UNIT_PRICE_COURSE_TYPES.contains(courseSchedule.getType())){
 | 
	
		
			
				|  |  | -                //根据课程类型获取对应的默认课酬设置列表
 | 
	
		
			
				|  |  | -                List<TeacherDefaultMusicGroupSalary> teacherDefaultMusicGroupSalariesWithCourseType = teacherDefaultMusicGroupSalariesGroupByCourseType.get(courseSchedule.getType());
 | 
	
		
			
				|  |  | -                if (CollectionUtils.isEmpty(teacherDefaultMusicGroupSalariesWithCourseType)) {
 | 
	
		
			
				|  |  | -                    LOGGER.error("存在未指定结算方式的课程类型[{}]", courseScheduleTeacherSalary.getId());
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                //根据教师编号将对应结算方式下的默认课酬设置分组
 | 
	
		
			
				|  |  | -                Map<Integer, TeacherDefaultMusicGroupSalary> teacherDefaultMusicGroupSalariesGroupByTeacherId = teacherDefaultMusicGroupSalariesWithCourseType.stream().collect(Collectors.toMap(TeacherDefaultMusicGroupSalary::getUserId, teacherDefaultMusicGroupSalary -> teacherDefaultMusicGroupSalary));
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalaryWithTeacherId = teacherDefaultMusicGroupSalariesGroupByTeacherId.get(courseScheduleTeacherSalary.getUserId());
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                //课程时长与结算单位时长占比
 | 
	
		
			
				|  |  | -                BigDecimal classTimeDuty = new BigDecimal(duration);
 | 
	
		
			
				|  |  | -                BigDecimal teacherDefaultSalary = new BigDecimal(0);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                //如果结算方式是教师默认课酬
 | 
	
		
			
				|  |  | -                if (settlementType.equals(SalarySettlementTypeEnum.TEACHER_DEFAULT.getCode())) {
 | 
	
		
			
				|  |  | -                    classTimeDuty = classTimeDuty.divide(new BigDecimal(30), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
 | 
	
		
			
				|  |  | -                    if(Objects.nonNull(teacherDefaultMusicGroupSalaryWithTeacherId)){
 | 
	
		
			
				|  |  | -                        teacherDefaultSalary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher30MinSalary();
 | 
	
		
			
				|  |  | -                    }
 | 
	
		
			
				|  |  | -                } else if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY.getCode())) {
 | 
	
		
			
				|  |  | -                    classTimeDuty = classTimeDuty.divide(new BigDecimal(90), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
 | 
	
		
			
				|  |  | -                    if(Objects.nonNull(teacherDefaultMusicGroupSalaryWithTeacherId)){
 | 
	
		
			
				|  |  | -                        teacherDefaultSalary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher90MinSalary();
 | 
	
		
			
				|  |  | -                    }
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
 | 
	
		
			
				|  |  | -                    classTimeDuty = new BigDecimal(duration).divide(new BigDecimal(45), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
 | 
	
		
			
				|  |  | -                } else if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
 | 
	
		
			
				|  |  | -                    teacherDefaultSalary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher30MinSalary();
 | 
	
		
			
				|  |  | -                    classTimeDuty = new BigDecimal(duration).divide(new BigDecimal(40), BigDecimal.ZERO.intValue(), BigDecimal.ROUND_DOWN);
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                teacherSalary = teacherDefaultSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
 | 
	
		
			
				|  |  |              }else{
 | 
	
		
			
				|  |  |                  teacherSalary=courseScheduleTeacherSalary.getExpectSalary();
 | 
	
		
			
				|  |  |              }
 |