瀏覽代碼

fix:课酬

Joburgess 4 年之前
父節點
當前提交
cb5c86306b

+ 133 - 45
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java

@@ -221,27 +221,57 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             List<TeacherAttendance> courseTeacherAttendances = teacherCourseAttendanceMap.get(org.apache.commons.lang3.StringUtils.joinWith(":", courseScheduleTeacherSalary.getCourseScheduleId(), courseScheduleTeacherSalary.getUserId()));
 
             TeacherAttendance teacherAttendance = courseTeacherAttendances.get(0);
-            if(CollectionUtils.isEmpty(courseTeacherAttendances)||Objects.isNull(teacherAttendance.getSignInStatus())||YesOrNoEnum.NO.equals(teacherAttendance.getSignInStatus())){
-                //未签到或异常签到扣除一半课酬
-                deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary().divide(new BigDecimal(2)));
-                deductReasons.add("未签到或异常签到扣除一半课酬");
+            if(CollectionUtils.isEmpty(courseTeacherAttendances)||Objects.isNull(teacherAttendance.getSignInStatus())){
+                //未签到扣除全部课酬
+                deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary());
+                deductReasons.add("未签到扣除全部课酬");
+            }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignInStatus())){
+                //异常签到
+                int signCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignInTime(), courseScheduleTeacherSalary.getCourseSchedule().getStartClassTime());
+                int signCourseTimeBetween = signCourseTimeBetweenSeconds/60;
+                if(signCourseTimeBetween<1&&signCourseTimeBetween>-3){
+                    //课程开始前1分钟至开始后3分钟进入教室
+                    deductCost = deductCost.add(new BigDecimal(50));
+                    deductReasons.add("课程开始前1分钟至开始后3分钟进入教室扣除50元");
+                }else if(signCourseTimeBetween<-3){
+                    //课程开始后3分钟后进入教室
+                    deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary());
+                    deductReasons.add("课程开始后3分钟进入教室扣除全部课酬");
+                }
             }
 
-            if(CollectionUtils.isEmpty(courseTeacherAttendances)||Objects.isNull(teacherAttendance.getSignOutStatus())||YesOrNoEnum.NO.equals(teacherAttendance.getSignOutStatus())){
-                //未签退或异常签退扣除一半课酬
+            if(CollectionUtils.isEmpty(courseTeacherAttendances)||Objects.isNull(teacherAttendance.getSignOutStatus())){
+                //未签退扣除一半课酬
                 deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary().divide(new BigDecimal(2)));
-                deductReasons.add("未签退或异常签退扣除一半课酬");
+                deductReasons.add("未签退扣除一半课酬");
+            }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignOutStatus())){
+                //异常签退
+                int signCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignOutTime(), courseScheduleTeacherSalary.getCourseSchedule().getStartClassTime());
+                int signCourseTimeBetween = signCourseTimeBetweenSeconds/60;
+
+                int signOutCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignOutTime(), courseScheduleTeacherSalary.getCourseSchedule().getEndClassTime());
+                int signOutCourseTimeBetween = signOutCourseTimeBetweenSeconds/60;
+
+                if(signCourseTimeBetween<20&&signCourseTimeBetween>-3){
+                    //课程开始前20分钟至开始后3分钟退出教室
+                    deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary());
+                    deductReasons.add("课程开始前20分钟至开始后3分钟退出教室扣除全部课酬");
+                }else if(signOutCourseTimeBetween<=3&&signOutCourseTimeBetween>0){
+                    //课程结束前3分钟后至课程结束前退出教室
+                    deductCost = deductCost.add(new BigDecimal(50));
+                    deductReasons.add("课程结束前3分钟后至课程结束前退出教室扣除50元");
+                }
             }
 
             BigDecimal finalSalary = courseScheduleTeacherSalary.getExpectSalary().subtract(deductCost).setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP);
 
             if(BigDecimal.ZERO.compareTo(deductCost)<0){
                 deductReasons.add("扣除总费用:" + deductCost);
+                courseScheduleTeacherSalary.setDeductionReason(StringUtils.join(deductReasons, ";"));
             }
 
             courseScheduleTeacherSalary.setActualSalary(finalSalary);
             courseScheduleTeacherSalary.setSettlementTime(now);
-            courseScheduleTeacherSalary.setDeductionReason(StringUtils.join(deductReasons, ";"));
             courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
         });
     }
@@ -304,26 +334,68 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             List<TeacherAttendance> courseTeacherAttendances = teacherCourseAttendanceMap.get(org.apache.commons.lang3.StringUtils.joinWith(":", courseScheduleTeacherSalary.getCourseScheduleId(), courseScheduleTeacherSalary.getUserId()));
 
             TeacherAttendance teacherAttendance = courseTeacherAttendances.get(0);
-            if(CollectionUtils.isEmpty(courseTeacherAttendances)||Objects.isNull(teacherAttendance.getSignInStatus())||YesOrNoEnum.NO.equals(teacherAttendance.getSignInStatus())){
-                //未签到或异常签到扣除一半课酬
-                deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary().divide(new BigDecimal(2)));
-                deductReasons.add("未签到或异常签到扣除一半课酬");
+            if(CollectionUtils.isEmpty(courseTeacherAttendances)||Objects.isNull(teacherAttendance.getSignInStatus())){
+                //未签到扣除全部课酬
+                deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary());
+                deductReasons.add("未签到扣除全部课酬");
+            }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignInStatus())){
+                //异常签到
+                int signCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignInTime(), courseScheduleTeacherSalary.getCourseSchedule().getStartClassTime());
+                int signCourseTimeBetween = signCourseTimeBetweenSeconds/60;
+                if(signCourseTimeBetween<1&&signCourseTimeBetween>-3){
+                    //课程开始前1分钟至开始后3分钟进入教室
+                    deductCost = deductCost.add(new BigDecimal(50));
+                    deductReasons.add("课程开始前1分钟至开始后3分钟进入教室扣除50元");
+                }else if(signCourseTimeBetween<-3){
+                    //课程开始后3分钟后进入教室
+                    deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary());
+                    deductReasons.add("课程开始后3分钟进入教室扣除全部课酬");
+                }
+
+                if(TeachModeEnum.OFFLINE.equals(courseScheduleTeacherSalary.getCourseSchedule().getTeachMode())){
+                    deductCost = courseScheduleTeacherSalary.getExpectSalary();
+                    deductReasons.clear();
+                    deductReasons.add("点名时经纬度不在范围内扣除全部课酬");
+                }
             }
 
-            if(CollectionUtils.isEmpty(courseTeacherAttendances)||Objects.isNull(teacherAttendance.getSignOutStatus())||YesOrNoEnum.NO.equals(teacherAttendance.getSignOutStatus())){
-                //未签退或异常签退扣除一半课酬
+            if(CollectionUtils.isEmpty(courseTeacherAttendances)||Objects.isNull(teacherAttendance.getSignOutStatus())){
+                //未签退扣除一半课酬
                 deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary().divide(new BigDecimal(2)));
-                deductReasons.add("未签退或异常签退扣除一半课酬");
+                deductReasons.add("未签退扣除一半课酬");
+            }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignOutStatus())){
+                //异常签退
+                int signCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignOutTime(), courseScheduleTeacherSalary.getCourseSchedule().getStartClassTime());
+                int signCourseTimeBetween = signCourseTimeBetweenSeconds/60;
+
+                int signOutCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignOutTime(), courseScheduleTeacherSalary.getCourseSchedule().getEndClassTime());
+                int signOutCourseTimeBetween = signOutCourseTimeBetweenSeconds/60;
+
+                if(signCourseTimeBetween<20&&signCourseTimeBetween>-3){
+                    //课程开始前20分钟至开始后3分钟退出教室
+                    deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary());
+                    deductReasons.add("课程开始前20分钟至开始后3分钟退出教室扣除全部课酬");
+                }else if(signOutCourseTimeBetween<=3&&signOutCourseTimeBetween>0){
+                    //课程结束前3分钟后至课程结束前退出教室
+                    deductCost = deductCost.add(new BigDecimal(50));
+                    deductReasons.add("课程结束前3分钟后至课程结束前退出教室扣除50元");
+                }
+
+                if(TeachModeEnum.OFFLINE.equals(courseScheduleTeacherSalary.getCourseSchedule().getTeachMode())){
+                    deductCost = courseScheduleTeacherSalary.getExpectSalary();
+                    deductReasons.clear();
+                    deductReasons.add("点名时经纬度不在范围内扣除全部课酬");
+                }
             }
 
             if(BigDecimal.ZERO.compareTo(deductCost)<0){
                 deductReasons.add("扣除总费用:" + deductCost);
+                courseScheduleTeacherSalary.setDeductionReason(StringUtils.join(deductReasons, ";"));
             }
 
             BigDecimal finalSalary = courseScheduleTeacherSalary.getExpectSalary().subtract(deductCost).setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP);
 
             courseScheduleTeacherSalary.setActualSalary(finalSalary);
-            courseScheduleTeacherSalary.setDeductionReason(StringUtils.join(deductReasons, ";"));
             courseScheduleTeacherSalary.setSettlementTime(now);
             courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
         });
@@ -375,7 +447,10 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                         || CourseSchedule.CourseScheduleType.HIGH.equals(c.getType()))
                 .map(CourseSchedule::getId).collect(Collectors.toList());
 
-        List<StudentAttendance> studentAttendances = studentAttendanceDao.findByCourseIds(needStudentAttendanceCourseScheduleIds);
+        List<StudentAttendance> studentAttendances = null;
+        if(!CollectionUtils.isEmpty(needStudentAttendanceCourseScheduleIds)){
+            studentAttendances = studentAttendanceDao.findByCourseIds(needStudentAttendanceCourseScheduleIds);
+        }
         Map<Long, Long> courseNormalStudentsMap = new HashMap<>();
         if(!CollectionUtils.isEmpty(studentAttendances)){
             courseNormalStudentsMap =studentAttendances.stream()
@@ -489,52 +564,65 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 }
             }
 
-            if(CollectionUtils.isEmpty(courseTeacherAttendances)||!isCallName){
-                //无签到记录或者未点名扣除全部课酬
+            TeacherAttendance teacherAttendance = null;
+            if(!CollectionUtils.isEmpty(courseTeacherAttendances)){
+                teacherAttendance = courseTeacherAttendances.get(0);
+            }
+
+            if(Objects.isNull(teacherAttendance)||Objects.isNull(teacherAttendance.getSignInStatus())){
+                //无签到记录扣除全部课酬
                 deductCost = deductCost.add(teacherSalary);
-                deductReasons.add("无签到记录扣除全部课酬");
-            }else{
-                TeacherAttendance teacherAttendance = courseTeacherAttendances.get(0);
-                if(Objects.isNull(teacherAttendance.getSignInStatus())){
-                    //未签到扣除全部课酬
+                deductReasons.add("未签到扣除全部课酬");
+            }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignInStatus())){
+                int signCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignInTime(), courseSchedule.getStartClassTime());
+                int signCourseTimeBetween = signCourseTimeBetweenSeconds/60;
+                if(signCourseTimeBetween>=0&&signCourseTimeBetween<20){
+                    //未提前20分钟打卡扣除50元
+                    deductCost = deductCost.add(new BigDecimal(50));
+                    deductReasons.add("未提前20分钟打卡扣除50元");
+                }else if(signCourseTimeBetween<0&&signCourseTimeBetween>-30){
+                    //迟到30分钟内扣除一半课酬
+                    deductCost = deductCost.add(teacherSalary.divide(new BigDecimal(2)));
+                    deductReasons.add("迟到30分钟内扣除一半课酬");
+                }else if(signCourseTimeBetween<=-30){
+                    //迟到30分钟及以上扣除全部课酬
                     deductCost = deductCost.add(teacherSalary);
-                    deductReasons.add("未签到扣除全部课酬");
-                }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignInStatus())){
-                    int signCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignInTime(), courseSchedule.getStartClassTime());
-                    int signCourseTimeBetween = signCourseTimeBetweenSeconds/60;
-                    if(signCourseTimeBetween>=0&&signCourseTimeBetween<20){
-                        //未提前20分钟打卡扣除50元
-                        deductCost = deductCost.add(new BigDecimal(50));
-                        deductReasons.add("未提前20分钟打卡扣除50元");
-                    }else if(signCourseTimeBetween<0&&signCourseTimeBetween>-30){
-                        //迟到30分钟内扣除一半课酬
-                        deductCost = deductCost.add(teacherSalary.divide(new BigDecimal(2)));
-                        deductReasons.add("迟到30分钟内扣除一半课酬");
-                    }else if(signCourseTimeBetween<=-30){
-                        //迟到30分钟及以上扣除全部课酬
-                        deductCost = deductCost.add(teacherSalary);
-                        deductReasons.add("迟到30分钟及以上扣除全部课酬");
-                    }
+                    deductReasons.add("迟到30分钟及以上扣除全部课酬");
+                }else{
+                    //其他,例如签到经纬度不在范围内
+                    deductCost = deductCost.add(new BigDecimal(50));
+                    deductReasons.add("经纬度不在范围内扣除50元");
                 }
+            }
 
-                if((Objects.isNull(teacherAttendance.getSignOutStatus())||YesOrNoEnum.NO.equals(teacherAttendance.getSignOutStatus()))&&isCallName){
-                    //异常签退或者未签退,但是正常点名扣除50元课酬
+            if(Objects.isNull(teacherAttendance)||!isCallName||Objects.isNull(teacherAttendance.getSignOutStatus())){
+                //未签退或者未点名扣除全部课酬
+                deductCost = deductCost.add(teacherSalary);
+                deductReasons.add("未签退或者未点名扣除全部课酬");
+            }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignOutStatus())){
+                int signOutCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignOutTime(), courseSchedule.getSignOutTime());
+                int signOutCourseTimeBetween = signOutCourseTimeBetweenSeconds/60;
+                if(signOutCourseTimeBetween<=3&&signOutCourseTimeBetween>0){
+                    //早退
+                    deductCost = deductCost.add(teacherSalary);
+                    deductReasons.add("早退扣除全部课酬");
+                }if(isCallName){
+                    //异常签退,但是正常点名扣除50元课酬
                     deductCost = deductCost.add(new BigDecimal(50));
                     deductReasons.add("异常签退或者未签退,但是正常点名扣除50元课酬");
                 }
-
             }
 
             BigDecimal finalSalary = teacherSalary.subtract(deductCost).setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP);
 
             if(BigDecimal.ZERO.compareTo(deductCost)<0){
                 deductReasons.add("扣除总费用:" + deductCost);
+                courseScheduleTeacherSalary.setDeductionReason(org.apache.commons.lang3.StringUtils.join(deductReasons, ";"));
             }
 
             //更新教师结算信息
             courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary);
             courseScheduleTeacherSalary.setSettlementTime(now);
-            courseScheduleTeacherSalary.setDeductionReason(org.apache.commons.lang3.StringUtils.join(deductReasons, ";"));
             courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
         }
     }

+ 7 - 2
mec-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml

@@ -266,8 +266,11 @@
 	</select>
     <select id="findSomeDayAgoTeacherCourseSalaryNoSettlement" resultMap="CourseScheduleTeacherSalary">
 		SELECT
-		cs.class_date_,
-		csts.*
+			cs.class_date_,
+			CONCAT(cs.class_date_	,' ',cs.start_class_time_) start_class_time_,
+			CONCAT( cs.class_date_, ' ', cs.end_class_time_ ) end_class_time_,
+			cs.teach_mode_,
+			csts.*
 		FROM
 		course_schedule_teacher_salary csts
 		LEFT JOIN course_schedule cs ON cs.id_ = csts.course_schedule_id_
@@ -295,6 +298,8 @@
     <select id="findTeacherCourseSalaryNoSettlement" resultMap="CourseScheduleTeacherSalary">
 		SELECT
 		cs.class_date_,
+		CONCAT(cs.class_date_	,' ',cs.start_class_time_) start_class_time_,
+		CONCAT( cs.class_date_, ' ', cs.end_class_time_ ) end_class_time_,
 		csts.*
 		FROM
 		course_schedule_teacher_salary csts