zouxuan 3 năm trước cách đây
mục cha
commit
164936ac19

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/TenantInfoService.java

@@ -20,4 +20,5 @@ public interface TenantInfoService extends IService<TenantInfo> {
 
     PageInfo<TenantInfoInfoPageVo> queryPage(Map<String, Object> param);
 
+    TenantInfo get(Integer tenantId);
 }

+ 102 - 243
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java

@@ -45,6 +45,7 @@ import java.time.temporal.TemporalAdjusters;
 import java.util.*;
 import java.util.function.BiConsumer;
 import java.util.function.BiFunction;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 @Service
@@ -214,132 +215,6 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         }
     }
 
-//    public void teacherSalarySettlement(List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries,Integer tenantId){
-//        if (CollectionUtils.isEmpty(courseScheduleTeacherSalaries)) {
-//            return;
-//        }
-//        List<Long> courseScheduleIds = courseScheduleTeacherSalaries.stream().map(CourseScheduleTeacherSalary::getCourseScheduleId).collect(Collectors.toList());
-//        //定位范围
-//        String gpsRange = sysTenantConfigService.getTenantConfigValue(SysConfigService.ATTENDANCE_RANGE,tenantId);
-//        double attendanceRange = 0;
-//        if(StringUtils.isNotEmpty(gpsRange)){
-//            attendanceRange = Double.valueOf(gpsRange);
-//        }
-//        //试用期课酬规则
-//        String configValue2 = sysTenantConfigService.getTenantConfigValue(SysConfigService.PROBATION_TEACHER_SALARY,tenantId);
-//        Integer probationTeacherSalary = 100;
-//        if(StringUtils.isNotEmpty(configValue2)){
-//            probationTeacherSalary = Integer.parseInt(configValue2);
-//        }
-//
-//        //教师签到记录
-//        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())));
-//
-//        Set<Integer> teacherIds = courseScheduleTeacherSalaries.stream().map(CourseScheduleTeacherSalary::getUserId).collect(Collectors.toSet());
-//        List<Teacher> teachers = teacherDao.findByTeacherIds(new ArrayList<>(teacherIds));
-//        Map<Integer, Teacher> idTeacherMap = teachers.stream().collect(Collectors.toMap(Teacher::getId, t -> t, (t1, t2) -> t1));
-//
-//        //计算课酬
-//        for (CourseScheduleTeacherSalary courseScheduleTeacherSalary : courseScheduleTeacherSalaries) {
-//            //当前课酬对应的课程信息
-//            CourseSchedule courseSchedule = courseScheduleIdMap.get(courseScheduleTeacherSalary.getCourseScheduleId());
-//            //教师课酬
-//            BigDecimal teacherSalary = courseScheduleTeacherSalary.getExpectSalary();
-//
-//            Teacher teacher = idTeacherMap.get(courseScheduleTeacherSalary.getUserId());
-//
-//            if(Objects.isNull(teacher)||(Objects.nonNull(teacher.getIsSettlementSalary())&&!teacher.getIsSettlementSalary())){
-//                courseScheduleTeacherSalary.setDeductionReason("不结算课酬");
-//
-//                courseScheduleTeacherSalary.setActualSalary(BigDecimal.ZERO);
-//                courseScheduleTeacherSalary.setSubsidy(BigDecimal.ZERO);
-//                courseScheduleTeacherSalary.setBelongToDaya(false);
-//                courseScheduleTeacherSalary.setSettlementTime(now);
-//                continue;
-//            }
-//
-//            List<String> deductReasons = new ArrayList<>();
-//
-//            if(Objects.isNull(courseScheduleTeacherSalary.getSubsidy())){
-//                courseScheduleTeacherSalary.setSubsidy(BigDecimal.ZERO);
-//            }
-//
-//            if(BigDecimal.ZERO.compareTo(courseScheduleTeacherSalary.getSubsidy()) != 0){
-//                teacherSalary = teacherSalary.add(courseScheduleTeacherSalary.getSubsidy());
-//                deductReasons.add("课程补贴:" + courseScheduleTeacherSalary.getSubsidy());
-//            }
-//
-//            //如果上课日期在试用期内按80%结算
-//            if(isTrail(teacher,courseSchedule.getClassDate())){
-//                teacherSalary = teacherSalary.multiply(new BigDecimal(probationTeacherSalary/100));
-//                deductReasons.add("未转正");
-//            }
-//
-//            //扣除费用
-//            BigDecimal deductCost = BigDecimal.ZERO;
-//
-//            List<TeacherAttendance> courseTeacherAttendances = teacherCourseAttendanceMap.get(org.apache.commons.lang3.StringUtils.joinWith(":", courseScheduleTeacherSalary.getCourseScheduleId(), courseScheduleTeacherSalary.getUserId()));
-//
-//            TeacherAttendance teacherAttendance = courseTeacherAttendances.get(0);
-//            //获取签到状态
-//            TeachModeEnum teachMode = courseScheduleTeacherSalary.getCourseSchedule().getTeachMode();
-//            SalarySettlementSignEnum signInStatus = getSignInStatus(teacherAttendance.getSignInTime(), courseSchedule.getStartClassTime(), teachMode,tenantId);
-//            BigDecimal signInDeductCost = getSignInDeduce(teacherSalary, signInStatus, teachMode);
-//            if(signInDeductCost.compareTo(BigDecimal.ZERO) > 0){
-//                deductCost = deductCost.add(signInDeductCost);
-//                deductReasons.add("签到状态异常扣除课酬" + signInDeductCost);
-//            }
-//            SalarySettlementSignEnum signOutStatus = getSignInStatus(teacherAttendance.getSignInTime(), courseSchedule.getStartClassTime(), teachMode,tenantId);
-//            BigDecimal signOutDeductCost = getSignInDeduce(teacherSalary, signOutStatus, teachMode);
-//            if(signOutDeductCost.compareTo(BigDecimal.ZERO) > 0){
-//                deductCost = deductCost.add(signOutDeductCost);
-//                deductReasons.add("签退状态异常扣除课酬" + signOutDeductCost);
-//            }
-//            //经纬度是否正常
-//            if(teachMode == TeachModeEnum.OFFLINE){
-//                School school = idSchoolMap.get(courseSchedule.getSchoolId());
-//                if(school != null){
-//                    Boolean signInRange = getSignRange(school.getLongitudeLatitude(),teacherAttendance.getSignInLongitudeLatitude(),attendanceRange);
-//                    Boolean signOutRange = getSignRange(school.getLongitudeLatitude(),teacherAttendance.getSignOutLongitudeLatitude(),attendanceRange);
-//
-//                    if(!signInRange){
-//                        String c = sysTenantConfigService.getTenantConfigValue(SysConfigService.OFFLINE_SIGN_IN_GPS_ERROR_CUT_SALARY, tenantId);
-//                        String c1 = sysTenantConfigService.getTenantConfigValue(SysConfigService.OFFLINE_SIGN_IN_GPS_ERROR_CUT_SALARY_UNIT, tenantId);
-//                        BigDecimal signInGpsCutAmount = getCutAmount(c, c1, teacherSalary);
-//                        if(signInGpsCutAmount.compareTo(BigDecimal.ZERO) > 0){
-//                            deductReasons.add("签到经纬度异常扣除" + signInGpsCutAmount);
-//                        }
-//                    }
-//                    if(!signOutRange){
-//                        String c = sysTenantConfigService.getTenantConfigValue(SysConfigService.OFFLINE_SIGN_OUT_GPS_ERROR_CUT_SALARY, tenantId);
-//                        String c1 = sysTenantConfigService.getTenantConfigValue(SysConfigService.OFFLINE_SIGN_OUT_GPS_ERROR_CUT_SALARY_UNIT, tenantId);
-//                        BigDecimal signOutGpsCutAmount = getCutAmount(c, c1, teacherSalary);
-//                        if(signOutGpsCutAmount.compareTo(BigDecimal.ZERO) > 0){
-//                            deductReasons.add("签退经纬度异常扣除" + signOutGpsCutAmount);
-//                        }
-//                    }
-//                }
-//            }
-//
-//            BigDecimal finalSalary = teacherSalary.subtract(deductCost).setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP);
-//
-//            if(BigDecimal.ZERO.compareTo(deductCost)<0){
-//                deductReasons.add("扣除总费用:" + deductCost);
-//            }
-//            if(!CollectionUtils.isEmpty(deductReasons))
-//                courseScheduleTeacherSalary.setDeductionReason(org.apache.commons.lang3.StringUtils.join(deductReasons, ";"));
-//
-//            //更新教师结算信息
-//            courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary);
-//            courseScheduleTeacherSalary.setBelongToDaya(false);
-//            courseScheduleTeacherSalary.setSettlementTime(now);
-//        }
-//        if(courseScheduleTeacherSalaries != null && courseScheduleTeacherSalaries.size() > 0){
-//            courseScheduleTeacherSalaryDao.batchUpdate(courseScheduleTeacherSalaries);
-//        }
-//    }
-
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void practiceTeacherSalarySettlement(Integer tenantId) {
@@ -375,8 +250,6 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             probationTeacherSalary = Integer.parseInt(configValue2);
         }
 
-        BigDecimal zero = new BigDecimal("0");
-
         for (int i = 0; i < someDayAgoTeacherCourseSalaryNoSettlement.size(); i++) {
             CourseScheduleTeacherSalary courseScheduleTeacherSalary = someDayAgoTeacherCourseSalaryNoSettlement.get(i);
             List<String> deductReasons = new ArrayList<>();
@@ -384,7 +257,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             BigDecimal expectSalary = courseScheduleTeacherSalary.getExpectSalary();
 
             if(Objects.isNull(courseScheduleTeacherSalary.getSubsidy())){
-                courseScheduleTeacherSalary.setSubsidy(zero);
+                courseScheduleTeacherSalary.setSubsidy(BigDecimal.ZERO);
             }
 
             if(BigDecimal.ZERO.compareTo(courseScheduleTeacherSalary.getSubsidy())!=0){
@@ -396,13 +269,11 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
 
             if(Objects.isNull(teacher)||(Objects.nonNull(teacher.getIsSettlementSalary())&&!teacher.getIsSettlementSalary())){
                 courseScheduleTeacherSalary.setDeductionReason("不结算课酬");
-
                 courseScheduleTeacherSalary.setActualSalary(BigDecimal.ZERO);
                 courseScheduleTeacherSalary.setSubsidy(BigDecimal.ZERO);
                 courseScheduleTeacherSalary.setSettlementTime(now);
                 courseScheduleTeacherSalary.setBelongToDaya(false);
-                courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
-                return;
+                continue;
             }
 
             //判断课程是否在试用期内
@@ -412,50 +283,27 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             }
 
             //扣除费用
-            BigDecimal deductCost = new BigDecimal(0);
+            BigDecimal deductCost = BigDecimal.ZERO;
 
             List<TeacherAttendance> courseTeacherAttendances = teacherCourseAttendanceMap.get(org.apache.commons.lang3.StringUtils.joinWith(":", courseScheduleTeacherSalary.getCourseScheduleId(), courseScheduleTeacherSalary.getUserId()));
-
-            TeacherAttendance teacherAttendance = null;
-            if(!CollectionUtils.isEmpty(courseTeacherAttendances)){
-                teacherAttendance = courseTeacherAttendances.get(0);
-            }
-            if(CollectionUtils.isEmpty(courseTeacherAttendances)||Objects.isNull(teacherAttendance.getSignInStatus())){
-                //未签到扣除全部课酬
-                deductCost = deductCost.add(expectSalary.abs());
-                deductReasons.add("未签到扣除全部课酬");
-            }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignInStatus())){
-                //异常签到
-                int signCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignInTime(), courseScheduleTeacherSalary.getCourseSchedule().getStartClassTime());
-                float signCourseTimeBetween = (float)signCourseTimeBetweenSeconds/(float)60;
-                if(signCourseTimeBetween<=1&&signCourseTimeBetween>-3){
-                    //课程开始前1分钟至开始后3分钟进入教室
-                    deductCost = deductCost.add(expectSalary.divide(new BigDecimal(2)).abs());
-                    deductReasons.add("课程开始前1分钟至开始后3分钟进入教室扣除一半课酬");
-                }else if(signCourseTimeBetween<=-3){
-                    //课程开始后3分钟后进入教室
-                    deductCost = deductCost.add(expectSalary.abs());
-                    deductReasons.add("课程开始后3分钟进入教室扣除全部课酬");
+            CourseSchedule courseSchedule = courseScheduleTeacherSalary.getCourseSchedule();
+            TeacherAttendance teacherAttendance = courseTeacherAttendances.get(0);
+            //获取签到状态
+            TeachModeEnum teachMode = courseScheduleTeacherSalary.getCourseSchedule().getTeachMode();
+            if(teacherAttendance.getSignInStatus() == YesOrNoEnum.NO){
+                SalarySettlementSignEnum signInStatus = getSignInStatus(teacherAttendance.getSignInTime(), courseSchedule.getStartClassTime(), teachMode,tenantId);
+                BigDecimal signInDeductCost = getSignInDeduce(expectSalary, signInStatus, teachMode,tenantId);
+                if(signInDeductCost.compareTo(BigDecimal.ZERO) > 0){
+                    deductCost = deductCost.add(signInDeductCost);
+                    deductReasons.add("签到状态异常扣除课酬" + signInDeductCost);
                 }
             }
-
-            if(CollectionUtils.isEmpty(courseTeacherAttendances)||Objects.isNull(teacherAttendance.getSignOutStatus())){
-                //未签退扣除全部课酬
-                deductCost = deductCost.add(expectSalary.abs());
-                deductReasons.add("未签退扣除全部课酬");
-            }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignOutStatus())){
-                //异常签退
-                int signOutCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignOutTime(), courseScheduleTeacherSalary.getCourseSchedule().getEndClassTime());
-                float signOutCourseTimeBetween = (float)signOutCourseTimeBetweenSeconds/(float)60;
-
-                if(signOutCourseTimeBetween>3){
-                    //课程开始前20分钟至开始后3分钟退出教室
-                    deductCost = deductCost.add(expectSalary.abs());
-                    deductReasons.add("课程结束前3分钟之前退出教室扣除全部课酬");
-                }else if(signOutCourseTimeBetween<=3&&signOutCourseTimeBetween>0){
-                    //课程结束前3分钟后至课程结束前退出教室
-                    deductCost = deductCost.add(expectSalary.divide(new BigDecimal(2)).abs());
-                    deductReasons.add("课程结束前3分钟后至课程结束前退出教室扣除一半课酬");
+            if(teacherAttendance.getSignOutStatus() == YesOrNoEnum.NO){
+                SalarySettlementSignEnum signOutStatus = getSignInStatus(teacherAttendance.getSignInTime(), courseSchedule.getStartClassTime(), teachMode,tenantId);
+                BigDecimal signOutDeductCost = getSignInDeduce(expectSalary, signOutStatus, teachMode,tenantId);
+                if(signOutDeductCost.compareTo(BigDecimal.ZERO) > 0){
+                    deductCost = deductCost.add(signOutDeductCost);
+                    deductReasons.add("签退状态异常扣除课酬" + signOutDeductCost);
                 }
             }
 
@@ -469,7 +317,9 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary);
             courseScheduleTeacherSalary.setSettlementTime(now);
             courseScheduleTeacherSalary.setBelongToDaya(false);
-            courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
+        }
+        if(someDayAgoTeacherCourseSalaryNoSettlement != null && someDayAgoTeacherCourseSalaryNoSettlement.size() > 0){
+            courseScheduleTeacherSalaryDao.batchUpdate(someDayAgoTeacherCourseSalaryNoSettlement);
         }
     }
 
@@ -519,22 +369,20 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 courseScheduleTeacherSalary.setSubsidy(BigDecimal.ZERO);
             }
 
-            if(BigDecimal.ZERO.compareTo(courseScheduleTeacherSalary.getSubsidy())!=0){
+            if(BigDecimal.ZERO.compareTo(courseScheduleTeacherSalary.getSubsidy()) != 0){
                 expectSalary = expectSalary.add(courseScheduleTeacherSalary.getSubsidy());
                 deductReasons.add("课程补贴:" + courseScheduleTeacherSalary.getSubsidy());
             }
 
             Teacher teacher = idTeacherMap.get(courseScheduleTeacherSalary.getUserId());
 
-            if(Objects.isNull(teacher)||(Objects.nonNull(teacher.getIsSettlementSalary())&&!teacher.getIsSettlementSalary())){
+            if(Objects.isNull(teacher)||(Objects.nonNull(teacher.getIsSettlementSalary()) && !teacher.getIsSettlementSalary())){
                 courseScheduleTeacherSalary.setDeductionReason("不结算课酬");
-
                 courseScheduleTeacherSalary.setActualSalary(BigDecimal.ZERO);
                 courseScheduleTeacherSalary.setSubsidy(BigDecimal.ZERO);
                 courseScheduleTeacherSalary.setSettlementTime(now);
                 courseScheduleTeacherSalary.setBelongToDaya(false);
-                courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
-                return;
+                continue;
             }
 
             //判断课程是否在试用期内
@@ -543,54 +391,50 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 expectSalary = expectSalary.multiply(new BigDecimal(probationTeacherSalary/100));
                 deductReasons.add("未转正");
             }
-
             //扣除费用
-            BigDecimal deductCost = new BigDecimal(0);
+            BigDecimal deductCost = BigDecimal.ZERO;
             List<TeacherAttendance> courseTeacherAttendances = teacherCourseAttendanceMap.get(org.apache.commons.lang3.StringUtils.joinWith(":", courseScheduleTeacherSalary.getCourseScheduleId(), courseScheduleTeacherSalary.getUserId()));
 
-            if(CollectionUtils.isEmpty(courseTeacherAttendances)||Objects.isNull(courseTeacherAttendances.get(0).getSignInStatus())){
-                //未签到扣除全部课酬
-                deductCost = deductCost.add(expectSalary.abs());
-                deductReasons.add("未签到扣除全部课酬");
-            }else if(YesOrNoEnum.NO.equals(courseTeacherAttendances.get(0).getSignInStatus())&&TeachModeEnum.ONLINE.equals(courseScheduleTeacherSalary.getCourseSchedule().getTeachMode())){
-                //异常签到
-                int signCourseTimeBetweenSeconds = DateUtil.secondsBetween(courseTeacherAttendances.get(0).getSignInTime(), courseScheduleTeacherSalary.getCourseSchedule().getStartClassTime());
-                float signCourseTimeBetween = (float)signCourseTimeBetweenSeconds/(float)60;
-                if(signCourseTimeBetween<=1&&signCourseTimeBetween>-3){
-                    //课程开始前1分钟至开始后3分钟进入教室
-                    deductCost = deductCost.add(expectSalary.divide(new BigDecimal(2)).abs());
-                    deductReasons.add("课程开始前1分钟至开始后3分钟进入教室扣除一半课酬");
-                }else if(signCourseTimeBetween<=-3){
-                    //课程开始后3分钟后进入教室
-                    deductCost = deductCost.add(expectSalary.abs());
-                    deductReasons.add("课程开始后3分钟进入教室扣除全部课酬");
+            CourseSchedule courseSchedule = courseScheduleTeacherSalary.getCourseSchedule();
+            TeachModeEnum teachMode = courseScheduleTeacherSalary.getCourseSchedule().getTeachMode();
+            if(TeachModeEnum.OFFLINE == teachMode){
+                if(true){
+                    String c = sysTenantConfigService.getTenantConfigValue(SysConfigService.OFFLINE_SIGN_IN_GPS_ERROR_CUT_SALARY, tenantId);
+                    String c1 = sysTenantConfigService.getTenantConfigValue(SysConfigService.OFFLINE_SIGN_IN_GPS_ERROR_CUT_SALARY_UNIT, tenantId);
+                    BigDecimal signInGpsCutAmount = getCutAmount(c, c1, expectSalary);
+                    if(signInGpsCutAmount.compareTo(BigDecimal.ZERO) > 0){
+                        deductReasons.add("签到经纬度异常扣除" + signInGpsCutAmount);
+                    }
                 }
-            }else if(YesOrNoEnum.NO.equals(courseTeacherAttendances.get(0).getSignInStatus())&&TeachModeEnum.OFFLINE.equals(courseScheduleTeacherSalary.getCourseSchedule().getTeachMode())){
-                deductCost = deductCost.add(expectSalary.abs());
-                deductReasons.add("点名时经纬度不在范围内扣除全部课酬");
-            }
-
-            if(CollectionUtils.isEmpty(courseTeacherAttendances)||Objects.isNull(courseTeacherAttendances.get(0).getSignOutStatus())){
-                //未签退扣除全部课酬
-                deductCost = deductCost.add(expectSalary.abs());
-                deductReasons.add("未签退扣除全部课酬");
-            }else if(YesOrNoEnum.NO.equals(courseTeacherAttendances.get(0).getSignOutStatus())&&TeachModeEnum.ONLINE.equals(courseScheduleTeacherSalary.getCourseSchedule().getTeachMode())){
-                //异常签退
-                int signOutCourseTimeBetweenSeconds = DateUtil.secondsBetween(courseTeacherAttendances.get(0).getSignOutTime(), courseScheduleTeacherSalary.getCourseSchedule().getEndClassTime());
-                float signOutCourseTimeBetween = (float)signOutCourseTimeBetweenSeconds/(float)60;
-
-                if(signOutCourseTimeBetween>3){
-                    //课程开始前20分钟至开始后3分钟退出教室
-                    deductCost = deductCost.add(expectSalary.abs());
-                    deductReasons.add("课程结束前3分钟之前退出教室扣除全部课酬");
-                }else if(signOutCourseTimeBetween<=3&&signOutCourseTimeBetween>0){
-                    //课程结束前3分钟后至课程结束前退出教室
-                    deductCost = deductCost.add(expectSalary.divide(new BigDecimal(2)).abs());
-                    deductReasons.add("课程结束前3分钟后至课程结束前退出教室扣除一半课酬");
+                if(true){
+                    String c = sysTenantConfigService.getTenantConfigValue(SysConfigService.OFFLINE_SIGN_OUT_GPS_ERROR_CUT_SALARY, tenantId);
+                    String c1 = sysTenantConfigService.getTenantConfigValue(SysConfigService.OFFLINE_SIGN_OUT_GPS_ERROR_CUT_SALARY_UNIT, tenantId);
+                    BigDecimal signOutGpsCutAmount = getCutAmount(c, c1, expectSalary);
+                    if(signOutGpsCutAmount.compareTo(BigDecimal.ZERO) > 0){
+                        deductReasons.add("签退经纬度异常扣除" + signOutGpsCutAmount);
+                    }
+                }
+            }else {
+                TeacherAttendance teacherAttendance = null;
+                if(courseTeacherAttendances != null && courseTeacherAttendances.size() > 0){
+                    teacherAttendance = courseTeacherAttendances.get(0);
+                }
+                if(teacherAttendance.getSignInStatus() == YesOrNoEnum.NO){
+                    SalarySettlementSignEnum signInStatus = getSignInStatus(teacherAttendance.getSignInTime(), courseSchedule.getStartClassTime(), teachMode,tenantId);
+                    BigDecimal signInDeductCost = getSignInDeduce(expectSalary, signInStatus, teachMode,tenantId);
+                    if(signInDeductCost.compareTo(BigDecimal.ZERO) > 0){
+                        deductCost = deductCost.add(signInDeductCost);
+                        deductReasons.add("签到状态异常扣除课酬" + signInDeductCost);
+                    }
+                }
+                if(teacherAttendance.getSignOutStatus() == YesOrNoEnum.NO){
+                    SalarySettlementSignEnum signOutStatus = getSignInStatus(teacherAttendance.getSignInTime(), courseSchedule.getStartClassTime(), teachMode,tenantId);
+                    BigDecimal signOutDeductCost = getSignInDeduce(expectSalary, signOutStatus, teachMode,tenantId);
+                    if(signOutDeductCost.compareTo(BigDecimal.ZERO) > 0){
+                        deductCost = deductCost.add(signOutDeductCost);
+                        deductReasons.add("签退状态异常扣除课酬" + signOutDeductCost);
+                    }
                 }
-            }else if(YesOrNoEnum.NO.equals(courseTeacherAttendances.get(0).getSignInStatus())&&TeachModeEnum.OFFLINE.equals(courseScheduleTeacherSalary.getCourseSchedule().getTeachMode())){
-                deductCost = deductCost.add(expectSalary.abs());
-                deductReasons.add("点名时经纬度不在范围内扣除全部课酬");
             }
 
             if(BigDecimal.ZERO.compareTo(deductCost)<0){
@@ -604,7 +448,9 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary);
             courseScheduleTeacherSalary.setSettlementTime(now);
             courseScheduleTeacherSalary.setBelongToDaya(false);
-            courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
+        }
+        if(someDayAgoTeacherCourseSalaryNoSettlement.size() > 0){
+            courseScheduleTeacherSalaryDao.batchUpdate(someDayAgoTeacherCourseSalaryNoSettlement);
         }
     }
 
@@ -706,8 +552,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
     }
 
     //获取签到扣除金额
-    public BigDecimal getSignInDeduce(BigDecimal salary,SalarySettlementSignEnum signEnum,TeachModeEnum teachModeEnum){
-        Integer tenantId = TenantIdThreadLocal.get();
+    public BigDecimal getSignInDeduce(BigDecimal salary,SalarySettlementSignEnum signEnum,TeachModeEnum teachModeEnum,Integer tenantId){
         String cutSalary = null;
         String cutSalaryUnit = null;
         switch (signEnum) {
@@ -822,12 +667,13 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         List<CourseSchedule> yesterdayCourseSchedules = courseScheduleDao.findCourseScheduleWithDate(startDate,endDate);
 
         Set<Integer> schoolIds = yesterdayCourseSchedules.stream().map(CourseSchedule::getSchoolId).collect(Collectors.toSet());
-        List<School> schools = schoolDao.getSchools(new ArrayList<>(schoolIds));
         Map<Integer, School> idSchoolMap = new HashMap<>();
-        if(!CollectionUtils.isEmpty(schools)){
-            idSchoolMap = schools.stream().collect(Collectors.toMap(School::getId, s->s, (s1, s2)->s1));
+        if(schoolIds != null && schoolIds.size() > 0){
+            List<School> schools = schoolDao.getSchools(new ArrayList<>(schoolIds));
+            if(!CollectionUtils.isEmpty(schools)){
+                idSchoolMap = schools.stream().collect(Collectors.toMap(School::getId, s->s, (s1, s2)->s1));
+            }
         }
-
         //课程编号与课程对应集合
         Map<Long, CourseSchedule> courseScheduleIdMap = yesterdayCourseSchedules.stream()
                 .collect(Collectors.toMap(CourseSchedule::getId, courseSchedule -> courseSchedule));
@@ -893,29 +739,42 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             BigDecimal deductCost = BigDecimal.ZERO;
 
             List<TeacherAttendance> courseTeacherAttendances = teacherCourseAttendanceMap.get(org.apache.commons.lang3.StringUtils.joinWith(":", courseScheduleTeacherSalary.getCourseScheduleId(), courseScheduleTeacherSalary.getUserId()));
+            TeacherAttendance teacherAttendance = null;
+            if(courseTeacherAttendances != null && courseTeacherAttendances.size() > 0){
+                teacherAttendance = courseTeacherAttendances.get(0);
+            }
 
-            TeacherAttendance teacherAttendance = courseTeacherAttendances.get(0);
             //获取签到状态
             TeachModeEnum teachMode = courseScheduleTeacherSalary.getCourseSchedule().getTeachMode();
-            SalarySettlementSignEnum signInStatus = getSignInStatus(teacherAttendance.getSignInTime(), courseSchedule.getStartClassTime(), teachMode,tenantId);
-            BigDecimal signInDeductCost = getSignInDeduce(teacherSalary, signInStatus, teachMode);
-            if(signInDeductCost.compareTo(BigDecimal.ZERO) > 0){
-                deductCost = deductCost.add(signInDeductCost);
-                deductReasons.add("签到状态异常扣除课酬" + signInDeductCost);
-            }
-            SalarySettlementSignEnum signOutStatus = getSignInStatus(teacherAttendance.getSignInTime(), courseSchedule.getStartClassTime(), teachMode,tenantId);
-            BigDecimal signOutDeductCost = getSignInDeduce(teacherSalary, signOutStatus, teachMode);
-            if(signOutDeductCost.compareTo(BigDecimal.ZERO) > 0){
-                deductCost = deductCost.add(signOutDeductCost);
-                deductReasons.add("签退状态异常扣除课酬" + signOutDeductCost);
+            if(teacherAttendance == null || teacherAttendance.getSignInStatus() == null || teacherAttendance.getSignInStatus() == YesOrNoEnum.NO){
+                SalarySettlementSignEnum signInStatus = getSignInStatus(teacherAttendance.getSignInTime(), courseSchedule.getStartClassTime(), teachMode,tenantId);
+                BigDecimal signInDeductCost = getSignInDeduce(teacherSalary, signInStatus, teachMode,tenantId);
+                if(signInDeductCost.compareTo(BigDecimal.ZERO) > 0){
+                    deductCost = deductCost.add(signInDeductCost);
+                    deductReasons.add("签到状态异常扣除课酬" + signInDeductCost);
+                }
             }
+            if(teacherAttendance == null || teacherAttendance.getSignOutStatus() == null || teacherAttendance.getSignOutStatus() == YesOrNoEnum.NO){
+                SalarySettlementSignEnum signOutStatus = getSignInStatus(teacherAttendance.getSignInTime(), courseSchedule.getStartClassTime(), teachMode,tenantId);
+                BigDecimal signOutDeductCost = getSignInDeduce(teacherSalary, signOutStatus, teachMode,tenantId);
+                if(signOutDeductCost.compareTo(BigDecimal.ZERO) > 0){
+                    deductCost = deductCost.add(signOutDeductCost);
+                    deductReasons.add("签退状态异常扣除课酬" + signOutDeductCost);
+                }
+            }
+
             //经纬度是否正常
             if(teachMode == TeachModeEnum.OFFLINE){
                 School school = idSchoolMap.get(courseSchedule.getSchoolId());
                 if(school != null){
-                    Boolean signInRange = getSignRange(school.getLongitudeLatitude(),teacherAttendance.getSignInLongitudeLatitude(),attendanceRange);
-                    Boolean signOutRange = getSignRange(school.getLongitudeLatitude(),teacherAttendance.getSignOutLongitudeLatitude(),attendanceRange);
-
+                    Boolean signInRange = false;
+                    if(teacherAttendance == null || StringUtils.isEmpty(teacherAttendance.getSignInLongitudeLatitude())){
+                        signInRange = getSignRange(school.getLongitudeLatitude(),teacherAttendance.getSignInLongitudeLatitude(),attendanceRange);
+                    }
+                    Boolean signOutRange = false;
+                    if(teacherAttendance == null || StringUtils.isEmpty(teacherAttendance.getSignOutLongitudeLatitude())){
+                        signOutRange = getSignRange(school.getLongitudeLatitude(),teacherAttendance.getSignOutLongitudeLatitude(),attendanceRange);
+                    }
                     if(!signInRange){
                         String c = sysTenantConfigService.getTenantConfigValue(SysConfigService.OFFLINE_SIGN_IN_GPS_ERROR_CUT_SALARY, tenantId);
                         String c1 = sysTenantConfigService.getTenantConfigValue(SysConfigService.OFFLINE_SIGN_IN_GPS_ERROR_CUT_SALARY_UNIT, tenantId);

+ 5 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantInfoServiceImpl.java

@@ -170,6 +170,11 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
         return PageUtil.pageInfo(baseMapper.queryPage(pageInfo, param));
     }
 
+    @Override
+    public TenantInfo get(Integer tenantId) {
+        return baseMapper.selectById(tenantId);
+    }
+
     /**
      * 校验手机号
      */

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

@@ -326,7 +326,7 @@
 		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.schoole_id_,
+		cs.schoole_id_,cs.teach_mode_,
 		csts.*
 		FROM
 			course_schedule_teacher_salary csts
@@ -335,7 +335,7 @@
 		<if test="startDate != null">
 			AND cs.class_date_ BETWEEN #{startDate} AND #{endDate}
 		</if>
-		AND cs.type_ = #{groupType}
+		AND cs.group_type_ = #{groupType}
 		AND csts.settlement_time_ IS NULL
 		AND (cs.del_flag_ IS NULL OR cs.del_flag_=0)
     </select>

+ 4 - 0
mec-web/pom.xml

@@ -66,6 +66,10 @@
 			<artifactId>easy-captcha</artifactId>
 			<version>1.6.2</version>
 		</dependency>
+		<dependency>
+			<groupId>com.yonge.datasource</groupId>
+			<artifactId>dynamic-datasource</artifactId>
+		</dependency>
 
 	</dependencies>
 	<build>

+ 1 - 1
mec-web/src/main/java/com/ym/mec/web/WebApplication.java

@@ -24,7 +24,7 @@ import com.ym.mec.common.filters.EmojiEncodingFilter;
 @SpringBootApplication
 @EnableDiscoveryClient
 @EnableFeignClients("com.ym.mec")
-@MapperScan(basePackages = {"com.ym.mec.biz.**.dao"})
+@MapperScan(basePackages = {"com.ym.mec.biz.**.dao", "com.yonge.datasource.dao"})
 @ComponentScan(basePackages = {"com.ym.mec", "com.yonge.log"})
 @Configuration
 @EnableSwagger2Doc

+ 7 - 1
mec-web/src/main/java/com/ym/mec/web/config/WebMvcConfig.java

@@ -3,6 +3,7 @@ package com.ym.mec.web.config;
 import java.util.ArrayList;
 import java.util.List;
 
+import com.ym.mec.web.interceptor.TenantInterceptor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
 import org.springframework.context.annotation.Bean;
@@ -32,7 +33,7 @@ public class WebMvcConfig implements WebMvcConfigurer {
 
 	@Override
 	public void addInterceptors(InterceptorRegistry registry) {
-
+		registry.addInterceptor(getTenantInterceptor()).addPathPatterns("/**");
 		registry.addInterceptor(operationLogInterceptor).addPathPatterns("/**").excludePathPatterns("/login");
 	}
 
@@ -45,4 +46,9 @@ public class WebMvcConfig implements WebMvcConfigurer {
 		return new HttpMessageConverters(converter);
 	}
 
+	@Bean
+	public TenantInterceptor getTenantInterceptor() {
+		return new TenantInterceptor();
+	}
+
 }

+ 48 - 0
mec-web/src/main/java/com/ym/mec/web/interceptor/TenantInterceptor.java

@@ -0,0 +1,48 @@
+package com.ym.mec.web.interceptor;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.entity.TenantInfo;
+import com.ym.mec.biz.service.TenantInfoService;
+import com.ym.mec.common.tenant.TenantContextHolder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+public class TenantInterceptor extends HandlerInterceptorAdapter {
+
+	private static final String DATA_SOURCE_ID = "datasourceId";
+
+	@Autowired
+	@Lazy
+	private SysUserFeignService sysUserFeignService;
+	
+	@Autowired
+	private TenantInfoService tenantInfoService;
+
+	@Override
+	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+		
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		
+		if(sysUser != null){
+			TenantContextHolder.setTenantId(sysUser.getTenantId() + "");
+			
+			TenantInfo tenantInfo = tenantInfoService.get(sysUser.getTenantId());
+			if(tenantInfo != null){
+				request.setAttribute(DATA_SOURCE_ID, tenantInfo.getDataSource());
+			}
+		}
+		
+		return true;
+	}
+
+	@Override
+	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
+		TenantContextHolder.clearTenantId();
+	}
+
+}