|
@@ -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,31 @@ 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 = 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();
|
|
|
}
|
|
@@ -719,8 +720,60 @@ 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){
|
|
|
+ if(isCallName){
|
|
|
+ //异常签退或者未签退,但是正常点名扣除50元课酬
|
|
|
+ deductCost = deductCost.add(new BigDecimal(50));
|
|
|
+ }else{
|
|
|
+ //异常签退或者未签退, 且未点名扣除一半课酬
|
|
|
+ deductCost = deductCost.add(teacherSalary.divide(new BigDecimal(2)));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(!isCallName){
|
|
|
+ //未点名扣除一半课酬
|
|
|
+ deductCost = deductCost.add(teacherSalary.divide(new BigDecimal(2)));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ BigDecimal finalSalary = teacherSalary.subtract(deductCost);
|
|
|
+
|
|
|
//更新教师结算信息
|
|
|
- courseScheduleTeacherSalary.setActualSalary(teacherSalary);
|
|
|
+ courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary);
|
|
|
courseScheduleTeacherSalary.setSettlementTime(now);
|
|
|
courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
|
|
|
}
|