Joburgess пре 4 година
родитељ
комит
305c8b90d9

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherAttendanceDao.java

@@ -113,6 +113,15 @@ public interface TeacherAttendanceDao extends BaseDAO<Long, TeacherAttendance> {
      * @return java.util.List<java.util.Map<java.lang.Integer,java.lang.Integer>>
      */
     List<TeacherAttendance> findTeacherIdByCourseSchedule(@Param("courseScheduleIds") List<Long> courseScheduleIds);
+
+    /**
+     * @describe 获取指定课程的教师签到记录
+     * @author Joburgess
+     * @date 2020.10.19
+     * @param courseScheduleIds:
+     * @return java.util.List<com.ym.mec.biz.dal.entity.TeacherAttendance>
+     */
+    List<TeacherAttendance> findByCourseSchedules(@Param("courseScheduleIds") List<Long> courseScheduleIds);
     
 	/**
 	 * 更新vip课的签退状态

+ 27 - 9
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java

@@ -1642,13 +1642,19 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                         baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
                     }
 
+                    //课堂课课酬改为按分钟数计算,并且时长占比向下取整
+                    if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)){
+                        baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+                        classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(40), BigDecimal.ZERO.intValue(), BigDecimal.ROUND_DOWN);
+                    }
+
                     salary = baseSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
 
 
                     //课堂课课酬
-                    if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
-                        salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
-                    }
+//                    if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
+//                        salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+//                    }
                     //基础技能提高课
                     if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
                         salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
@@ -1953,6 +1959,12 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                         baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
                     }
 
+                    //课堂课课酬改为按分钟数计算,并且时长占比向下取整
+                    if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)){
+                        baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+                        classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(40), BigDecimal.ZERO.intValue(), BigDecimal.ROUND_DOWN);
+                    }
+
                     salary = baseSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
 
 //                    for (CourseScheduleTeacherSalary teacherSalary : allTeacherSalarys) {
@@ -1965,9 +1977,9 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 //                    }
 
                     //课堂课课酬
-                    if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
-                        salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
-                    }
+//                    if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
+//                        salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+//                    }
                     //基础技能提高课
                     if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
                         salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
@@ -2252,12 +2264,18 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                         baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
                     }
 
+                    //课堂课课酬改为按分钟数计算,并且时长占比向下取整
+                    if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)){
+                        baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+                        classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(40), BigDecimal.ZERO.intValue(), BigDecimal.ROUND_DOWN);
+                    }
+
                     salary = baseSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
 
                     //课堂课课酬
-                    if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
-                        salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
-                    }
+//                    if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
+//                        salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+//                    }
                     //基础技能提高课
                     if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
                         salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();

+ 40 - 30
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupTeacherMapperServiceImpl.java

@@ -232,12 +232,18 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
                     baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
                 }
 
+                //课堂课课酬改为按分钟数计算,并且时长占比向下取整
+                if (musicGroup.isClassroomLessons() || classGroupNoStartCourseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)){
+                    baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+                    classTimeDuty = new BigDecimal(duration).divide(new BigDecimal(40), BigDecimal.ZERO.intValue(), BigDecimal.ROUND_DOWN);
+                }
+
                 salary = baseSalary.multiply(classTimeDuty).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
 
                 //课堂课课酬
-                if (musicGroup.isClassroomLessons() || classGroupNoStartCourseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
-                    salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
-                }
+//                if (musicGroup.isClassroomLessons() || classGroupNoStartCourseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
+//                    salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+//                }
                 //基础技能提高课
                 if (classGroupNoStartCourseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
                     salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
@@ -344,6 +350,13 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
                     classTimeDuty = new BigDecimal(duration).divide(new BigDecimal(90), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
                     baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
                 }
+
+                //课堂课课酬改为按分钟数计算,并且时长占比向下取整
+                if (musicGroup.isClassroomLessons() || classGroupNoStartCourseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)){
+                    baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+                    classTimeDuty = new BigDecimal(duration).divide(new BigDecimal(40), BigDecimal.ZERO.intValue(), BigDecimal.ROUND_DOWN);
+                }
+
                 salary = baseSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
 
                 for (CourseScheduleTeacherSalary teacherSalary : allTeacherSalarys) {
@@ -356,9 +369,9 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
                 }
 
                 //课堂课课酬
-                if (musicGroup.isClassroomLessons()) {
-                    salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
-                }
+//                if (musicGroup.isClassroomLessons()) {
+//                    salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+//                }
                 //基础技能提高课
                 if (classGroupNoStartCourseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
                     salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
@@ -567,39 +580,36 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
         int duration = DateUtil.minutesBetween(courseSchedule.getStartClassTime(), courseSchedule.getEndClassTime());
 
         BigDecimal teacherDefaultSalary = BigDecimal.ZERO;
+        BigDecimal baseTime = BigDecimal.ZERO;
 
         //如果结算方式是教师默认课酬
         if (settlementType.equals(SalarySettlementTypeEnum.TEACHER_DEFAULT.getCode())) {
-            BigDecimal baseTime = new BigDecimal(30);
-            if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
-                baseTime = new BigDecimal(45);
-            }
-            if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
-                baseTime = new BigDecimal(40);
-            }
-            //课程时长与结算单位时长占比
-            BigDecimal classTimeDuty = new BigDecimal(duration).divide(baseTime, CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
+             baseTime = new BigDecimal(30);
             teacherDefaultSalary = teachType == TeachTypeEnum.BISHOP ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher30MinSalary();
-            teacherSalary = teacherDefaultSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
         } else if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY.getCode())) {
             teacherDefaultSalary = teachType == TeachTypeEnum.BISHOP ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher90MinSalary();
-            BigDecimal baseTime = new BigDecimal(90);
-            if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
-                baseTime = new BigDecimal(45);
-            }
-            if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
-                baseTime = new BigDecimal(40);
-                teacherDefaultSalary = teachType == TeachTypeEnum.BISHOP ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher30MinSalary();
-            }
-            //课程时长与结算单位时长占比
-            BigDecimal classTimeDuty = new BigDecimal(duration).divide(baseTime, CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
-            teacherSalary = teacherDefaultSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
+            baseTime = new BigDecimal(90);
         }
+        if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
+            baseTime = new BigDecimal(45);
+        }else if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
+            baseTime = new BigDecimal(40);
+            teacherDefaultSalary = teachType == TeachTypeEnum.BISHOP ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher30MinSalary();
+        }
+        //课程时长与结算单位时长占比
+        BigDecimal classTimeDuty = new BigDecimal(duration).divide(baseTime, CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
 
-        //课堂课课酬
-        if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
-            teacherSalary = teachType.equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher30MinSalary();
+        //课堂课课酬改为按分钟数计算,并且时长占比向下取整
+        if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)){
+            teacherDefaultSalary = teachType.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);
+
+        //课堂课课酬
+//        if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
+//            teacherSalary = teachType.equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher30MinSalary();
+//        }
         //基础技能提高课
         if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
             teacherSalary = teachType.equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher30MinSalary();

+ 95 - 44
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java

@@ -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,58 @@ 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)));
+                }
+            }
+
             //更新教师结算信息
-            courseScheduleTeacherSalary.setActualSalary(teacherSalary);
+            courseScheduleTeacherSalary.setActualSalary(teacherSalary.subtract(deductCost));
             courseScheduleTeacherSalary.setSettlementTime(now);
             courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
         }

+ 9 - 0
mec-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml

@@ -425,6 +425,15 @@
             #{courseScheduleId}
         </foreach>
     </select>
+    <select id="findByCourseSchedules" resultMap="TeacherAttendance">
+        SELECT
+        *
+        FROM teacher_attendance
+        WHERE course_schedule_id_ IN
+        <foreach collection="courseScheduleIds" item="courseScheduleId" open="(" close=")" separator=",">
+            #{courseScheduleId}
+        </foreach>
+    </select>
     <select id="findCourseTimeByClassGroup" resultType="java.util.Map">
         SELECT
             course_schedule_id_ AS 'key',