|
@@ -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();
|
|
|
}
|