|  | @@ -91,7 +91,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
 | 
	
		
			
				|  |  |              .getLogger(CourseScheduleTeacherSalaryServiceImpl.class);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      //按节数计算课酬的课程类型
 | 
	
		
			
				|  |  | -    protected static final Set<CourseSchedule.CourseScheduleType> UNIT_PRICE_COURSE_TYPES=new HashSet<>(Arrays.asList(CourseSchedule.CourseScheduleType.CLASSROOM, CourseSchedule.CourseScheduleType.HIGH, CourseSchedule.CourseScheduleType.HIGH_ONLINE, CourseSchedule.CourseScheduleType.MUSIC_NETWORK));
 | 
	
		
			
				|  |  | +    protected static final Set<CourseSchedule.CourseScheduleType> UNIT_PRICE_COURSE_TYPES=new HashSet<>(Arrays.asList(CourseSchedule.CourseScheduleType.HIGH_ONLINE, CourseSchedule.CourseScheduleType.MUSIC_NETWORK));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @Override
 | 
	
		
			
				|  |  |      public BaseDAO<Long, CourseScheduleTeacherSalary> getDAO() {
 | 
	
	
		
			
				|  | @@ -532,6 +532,14 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
 | 
	
		
			
				|  |  |              return;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        //教师签到记录
 | 
	
		
			
				|  |  | +        List<TeacherAttendance> allTeacherAttendances = teacherAttendanceDao.findByCourseSchedules(courseScheduleIds);
 | 
	
		
			
				|  |  | +        Map<String, List<TeacherAttendance>> teacherCourseAttendanceMap = allTeacherAttendances.stream().collect(Collectors.groupingBy(ta -> org.apache.commons.lang3.StringUtils.joinWith(":", ta.getCourseScheduleId(), ta.getTeacherId())));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        //学员点名记录
 | 
	
		
			
				|  |  | +        List<StudentAttendance> allStudentAttendances = studentAttendanceDao.findByCourseIds(courseScheduleIds);
 | 
	
		
			
				|  |  | +        Map<Long, List<StudentAttendance>> courseStudentAttendanceMap = allStudentAttendances.stream().collect(Collectors.groupingBy(StudentAttendance::getCourseScheduleId));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          //需要根据实际上课学员结算课酬的课程编号
 | 
	
		
			
				|  |  |          List<Long> needStudentAttendanceCourseScheduleIds = yesterdayCourseSchedules.stream()
 | 
	
		
			
				|  |  |                  .filter(c -> CourseSchedule.CourseScheduleType.HIGH_ONLINE.equals(c.getType()) || CourseSchedule.CourseScheduleType.MUSIC_NETWORK.equals(c.getType()))
 | 
	
	
		
			
				|  | @@ -643,7 +651,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
 | 
	
		
			
				|  |  |              //教师课酬
 | 
	
		
			
				|  |  |              BigDecimal teacherSalary = new BigDecimal(0);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            if(durationIsChange&&!UNIT_PRICE_COURSE_TYPES.contains(courseSchedule.getType())){
 | 
	
		
			
				|  |  | +            if(CourseSchedule.CourseScheduleType.MUSIC_NETWORK.equals(courseSchedule.getType())||CourseSchedule.CourseScheduleType.HIGH_ONLINE.equals(courseSchedule.getType())||CourseSchedule.CourseScheduleType.HIGH.equals(courseSchedule.getType())){
 | 
	
		
			
				|  |  |                  //根据课程类型获取对应的默认课酬设置列表
 | 
	
		
			
				|  |  |                  List<TeacherDefaultMusicGroupSalary> teacherDefaultMusicGroupSalariesWithCourseType = teacherDefaultMusicGroupSalariesGroupByCourseType.get(courseSchedule.getType());
 | 
	
		
			
				|  |  |                  if (CollectionUtils.isEmpty(teacherDefaultMusicGroupSalariesWithCourseType)) {
 | 
	
	
		
			
				|  | @@ -655,39 +663,18 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalaryWithTeacherId = teacherDefaultMusicGroupSalariesGroupByTeacherId.get(courseScheduleTeacherSalary.getUserId());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                //如果结算方式是教师默认课酬
 | 
	
		
			
				|  |  | -                if (settlementType.equals(SalarySettlementTypeEnum.TEACHER_DEFAULT.getCode())) {
 | 
	
		
			
				|  |  | -                    //课程时长与结算单位时长占比
 | 
	
		
			
				|  |  | -                    BigDecimal classTimeDuty = new BigDecimal(duration);
 | 
	
		
			
				|  |  | -                    if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
 | 
	
		
			
				|  |  | -                        classTimeDuty = classTimeDuty.divide(new BigDecimal(45), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
 | 
	
		
			
				|  |  | -                    } else if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
 | 
	
		
			
				|  |  | -                        classTimeDuty = classTimeDuty.divide(new BigDecimal(40), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
 | 
	
		
			
				|  |  | -                    } else {
 | 
	
		
			
				|  |  | -                        classTimeDuty = classTimeDuty.divide(new BigDecimal(30), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
 | 
	
		
			
				|  |  | -                    }
 | 
	
		
			
				|  |  | -                    BigDecimal teacherDefaultSalary = new BigDecimal(0);
 | 
	
		
			
				|  |  | -                    if(Objects.nonNull(teacherDefaultMusicGroupSalaryWithTeacherId)){
 | 
	
		
			
				|  |  | -                        teacherDefaultSalary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher30MinSalary();
 | 
	
		
			
				|  |  | -                    }
 | 
	
		
			
				|  |  | -                    teacherSalary = teacherDefaultSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
 | 
	
		
			
				|  |  | -                } else if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY.getCode())) {
 | 
	
		
			
				|  |  | -                    //课程时长与结算单位时长占比
 | 
	
		
			
				|  |  | -                    BigDecimal classTimeDuty = new BigDecimal(duration);
 | 
	
		
			
				|  |  | -                    if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
 | 
	
		
			
				|  |  | -                        classTimeDuty = classTimeDuty.divide(new BigDecimal(45), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
 | 
	
		
			
				|  |  | -                    } else if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
 | 
	
		
			
				|  |  | -                        classTimeDuty = classTimeDuty.divide(new BigDecimal(40), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
 | 
	
		
			
				|  |  | -                    } else {
 | 
	
		
			
				|  |  | -                        classTimeDuty = classTimeDuty.divide(new BigDecimal(90), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
 | 
	
		
			
				|  |  | -                    }
 | 
	
		
			
				|  |  | -                    BigDecimal teacherDefaultSalary = new BigDecimal(0);
 | 
	
		
			
				|  |  | -                    if(Objects.nonNull(teacherDefaultMusicGroupSalaryWithTeacherId)){
 | 
	
		
			
				|  |  | -                        teacherDefaultSalary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher90MinSalary();
 | 
	
		
			
				|  |  | -                    }
 | 
	
		
			
				|  |  | -                    teacherSalary = teacherDefaultSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
 | 
	
		
			
				|  |  | +                Long normalStudentNum = courseNormalStudentsMap.get(courseSchedule.getId());
 | 
	
		
			
				|  |  | +                if(Objects.isNull(normalStudentNum)){
 | 
	
		
			
				|  |  | +                    normalStudentNum = Long.valueOf(0);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                if(Objects.nonNull(teacherDefaultMusicGroupSalaryWithTeacherId)&& org.apache.commons.lang3.StringUtils.isNoneBlank(teacherDefaultMusicGroupSalaryWithTeacherId.getSalaryRuleJson())){
 | 
	
		
			
				|  |  | +                    JSONObject salaryRuleJsonObject = JSONObject.parseObject(teacherDefaultMusicGroupSalaryWithTeacherId.getSalaryRuleJson());
 | 
	
		
			
				|  |  | +                    teacherSalary = salaryRuleJsonObject.getBigDecimal(normalStudentNum.toString());
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  | -            }else if(CourseSchedule.CourseScheduleType.MUSIC_NETWORK.equals(courseSchedule.getType())||CourseSchedule.CourseScheduleType.HIGH_ONLINE.equals(courseSchedule.getType())){
 | 
	
		
			
				|  |  | +                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)) {
 | 
	
	
		
			
				|  | @@ -699,17 +686,30 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalaryWithTeacherId = teacherDefaultMusicGroupSalariesGroupByTeacherId.get(courseScheduleTeacherSalary.getUserId());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                Long normalStudentNum = courseNormalStudentsMap.get(courseSchedule.getId());
 | 
	
		
			
				|  |  | -                if(Objects.isNull(normalStudentNum)){
 | 
	
		
			
				|  |  | -                    normalStudentNum = Long.valueOf(0);
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -                if(Objects.nonNull(teacherDefaultMusicGroupSalaryWithTeacherId)&& org.apache.commons.lang3.StringUtils.isNoneBlank(teacherDefaultMusicGroupSalaryWithTeacherId.getSalaryRuleJson())){
 | 
	
		
			
				|  |  | -                    JSONObject salaryRuleJsonObject = JSONObject.parseObject(teacherDefaultMusicGroupSalaryWithTeacherId.getSalaryRuleJson());
 | 
	
		
			
				|  |  | -                    teacherSalary = salaryRuleJsonObject.getBigDecimal(normalStudentNum.toString());
 | 
	
		
			
				|  |  | +                //课程时长与结算单位时长占比
 | 
	
		
			
				|  |  | +                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(Objects.isNull(teacherSalary)){
 | 
	
		
			
				|  |  | -                    teacherSalary = BigDecimal.ZERO;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
 | 
	
		
			
				|  |  | +                    classTimeDuty = classTimeDuty.divide(new BigDecimal(45), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
 | 
	
		
			
				|  |  | +                } else if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
 | 
	
		
			
				|  |  | +                    classTimeDuty = classTimeDuty.divide(new BigDecimal(40), BigDecimal.ZERO.intValue(), BigDecimal.ROUND_DOWN);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                teacherSalary = teacherDefaultSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
 | 
	
		
			
				|  |  |              }else{
 | 
	
		
			
				|  |  |                  teacherSalary=courseScheduleTeacherSalary.getExpectSalary();
 | 
	
		
			
				|  |  |              }
 | 
	
	
		
			
				|  | @@ -719,8 +719,55 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
 | 
	
		
			
				|  |  |                  subsidy = new BigDecimal(0);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              teacherSalary = teacherSalary.add(subsidy);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //扣除费用
 | 
	
		
			
				|  |  | +            BigDecimal deductCost = BigDecimal.ZERO;
 | 
	
		
			
				|  |  | +            List<TeacherAttendance> courseTeacherAttendances = teacherCourseAttendanceMap.get(courseScheduleTeacherSalary.getCourseScheduleId());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            boolean isCallName = false;
 | 
	
		
			
				|  |  | +            List<StudentAttendance> courseStudentAttendance = courseStudentAttendanceMap.get(courseScheduleTeacherSalary.getCourseScheduleId());
 | 
	
		
			
				|  |  | +            if(!CollectionUtils.isEmpty(courseStudentAttendance)){
 | 
	
		
			
				|  |  | +                long csaNum = courseStudentAttendance.stream().filter(csa -> DateUtil.hoursBetween(csa.getSignInTime(), courseSchedule.getStartClassTime()) < 4).count();
 | 
	
		
			
				|  |  | +                if(csaNum>0){
 | 
	
		
			
				|  |  | +                    isCallName = true;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            if(CollectionUtils.isEmpty(courseTeacherAttendances)){
 | 
	
		
			
				|  |  | +                //无签到记录扣除全部课酬
 | 
	
		
			
				|  |  | +                deductCost = deductCost.add(teacherSalary);
 | 
	
		
			
				|  |  | +            }else{
 | 
	
		
			
				|  |  | +                TeacherAttendance teacherAttendance = courseTeacherAttendances.get(0);
 | 
	
		
			
				|  |  | +                int signCourseTimeBetween = DateUtil.minutesBetween(teacherAttendance.getSignInTime(), courseSchedule.getStartClassTime());
 | 
	
		
			
				|  |  | +                if(Objects.isNull(teacherAttendance.getSignInStatus())){
 | 
	
		
			
				|  |  | +                    //未签到扣除全部课酬
 | 
	
		
			
				|  |  | +                    deductCost = deductCost.add(teacherSalary);
 | 
	
		
			
				|  |  | +                }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignInStatus())&&signCourseTimeBetween>=0&&signCourseTimeBetween<20){
 | 
	
		
			
				|  |  | +                    //未提前20分钟打卡扣除50元
 | 
	
		
			
				|  |  | +                    deductCost = deductCost.add(new BigDecimal(50));
 | 
	
		
			
				|  |  | +                }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignInStatus())&&signCourseTimeBetween<0&&signCourseTimeBetween>-30){
 | 
	
		
			
				|  |  | +                    //迟到30分钟内扣除一半课酬
 | 
	
		
			
				|  |  | +                    deductCost = deductCost.add(teacherSalary.divide(new BigDecimal(2)));
 | 
	
		
			
				|  |  | +                }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignInStatus())&&signCourseTimeBetween<=-30){
 | 
	
		
			
				|  |  | +                    //迟到30分钟及以上扣除全部课酬
 | 
	
		
			
				|  |  | +                    deductCost = deductCost.add(teacherSalary);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                if((Objects.isNull(teacherAttendance.getSignOutStatus())||YesOrNoEnum.NO.equals(teacherAttendance.getSignOutStatus()))&&isCallName){
 | 
	
		
			
				|  |  | +                    //异常签退或者未签退,但是正常点名扣除50元课酬
 | 
	
		
			
				|  |  | +                    deductCost = deductCost.add(new BigDecimal(50));
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                if(!isCallName){
 | 
	
		
			
				|  |  | +                    //未点名扣除一半课酬
 | 
	
		
			
				|  |  | +                    deductCost = deductCost.add(teacherSalary.divide(new BigDecimal(2)));
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            List<StudentAttendance> courseStudentAttendances = courseStudentAttendanceMap.get(courseScheduleTeacherSalary.getCourseScheduleId());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |              //更新教师结算信息
 | 
	
		
			
				|  |  | -            courseScheduleTeacherSalary.setActualSalary(teacherSalary);
 | 
	
		
			
				|  |  | +            courseScheduleTeacherSalary.setActualSalary(teacherSalary.subtract(deductCost));
 | 
	
		
			
				|  |  |              courseScheduleTeacherSalary.setSettlementTime(now);
 | 
	
		
			
				|  |  |              courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
 | 
	
		
			
				|  |  |          }
 |