|
@@ -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);
|