|
@@ -246,9 +246,9 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
|
|
|
//试用期课酬规则
|
|
|
String configValue2 = sysTenantConfigService.getTenantConfigValue(SysConfigService.PROBATION_TEACHER_SALARY,tenantId);
|
|
|
- Integer probationTeacherSalary = 100;
|
|
|
+ double probationTeacherSalary = 100;
|
|
|
if(StringUtils.isNotEmpty(configValue2)){
|
|
|
- probationTeacherSalary = Integer.parseInt(configValue2);
|
|
|
+ probationTeacherSalary = Double.parseDouble(configValue2);
|
|
|
}
|
|
|
|
|
|
for (int i = 0; i < someDayAgoTeacherCourseSalaryNoSettlement.size(); i++) {
|
|
@@ -326,7 +326,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
courseScheduleTeacherSalary.setBelongToDaya(false);
|
|
|
}
|
|
|
if(someDayAgoTeacherCourseSalaryNoSettlement != null && someDayAgoTeacherCourseSalaryNoSettlement.size() > 0){
|
|
|
- courseScheduleTeacherSalaryDao.batchUpdate(someDayAgoTeacherCourseSalaryNoSettlement);
|
|
|
+ courseScheduleTeacherSalaryDao.batchUpdateSalary(someDayAgoTeacherCourseSalaryNoSettlement);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -354,9 +354,9 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
|
|
|
//试用期课酬规则
|
|
|
String configValue2 = sysTenantConfigService.getTenantConfigValue(SysConfigService.PROBATION_TEACHER_SALARY,tenantId);
|
|
|
- Integer probationTeacherSalary = 100;
|
|
|
+ double probationTeacherSalary = 100;
|
|
|
if(StringUtils.isNotEmpty(configValue2)){
|
|
|
- probationTeacherSalary = Integer.parseInt(configValue2);
|
|
|
+ probationTeacherSalary = Double.parseDouble(configValue2);
|
|
|
}
|
|
|
//获取未结算课程编号列表
|
|
|
List<Long> courseScheduleIds = someDayAgoTeacherCourseSalaryNoSettlement.stream().map(CourseScheduleTeacherSalary::getCourseScheduleId).collect(Collectors.toList());
|
|
@@ -460,17 +460,19 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
courseScheduleTeacherSalary.setBelongToDaya(false);
|
|
|
}
|
|
|
if(someDayAgoTeacherCourseSalaryNoSettlement.size() > 0){
|
|
|
- courseScheduleTeacherSalaryDao.batchUpdate(someDayAgoTeacherCourseSalaryNoSettlement);
|
|
|
+ courseScheduleTeacherSalaryDao.batchUpdateSalary(someDayAgoTeacherCourseSalaryNoSettlement);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
Boolean isTrail(Teacher teacher,Date classDate){
|
|
|
//判断课程是否在试用期内
|
|
|
boolean trail = false;
|
|
|
- if(Objects.nonNull(teacher)&&Objects.nonNull(teacher.getEntryDate())&&classDate.compareTo(teacher.getEntryDate())>=0){
|
|
|
+ if(Objects.nonNull(teacher) && Objects.nonNull(teacher.getEntryDate())
|
|
|
+ && classDate.compareTo(teacher.getEntryDate()) >= 0){
|
|
|
trail = true;
|
|
|
}
|
|
|
- if(Objects.nonNull(teacher)&&Objects.nonNull(teacher.getFormalStaffDate())&&classDate.compareTo(teacher.getFormalStaffDate())>=0){
|
|
|
+ if(Objects.nonNull(teacher) && Objects.nonNull(teacher.getFormalStaffDate())
|
|
|
+ && classDate.compareTo(teacher.getFormalStaffDate())>=0){
|
|
|
trail = false;
|
|
|
}
|
|
|
return trail;
|
|
@@ -636,7 +638,11 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
return getCutAmount(cutSalary,cutSalaryUnit,salary);
|
|
|
}
|
|
|
|
|
|
- public Boolean getSignRange(String schoolLongitudeLatitude,String longitudeLatitude,double attendanceRange){
|
|
|
+ public Boolean getSignRange(String schoolLongitudeLatitude,String longitudeLatitude,String gpsRange){
|
|
|
+ if(StringUtils.isEmpty(gpsRange)){
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ double attendanceRange = Double.parseDouble(gpsRange);
|
|
|
Boolean signRange = false;
|
|
|
if(Objects.nonNull(schoolLongitudeLatitude) && StringUtils.isNotBlank(longitudeLatitude)){
|
|
|
double signInDistance = MapUtil.distance(longitudeLatitude,schoolLongitudeLatitude);
|
|
@@ -654,7 +660,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
if(cutSalaryUnit.equals("1")){
|
|
|
return new BigDecimal(cutSalary);
|
|
|
}else {
|
|
|
- return teacherSalary.multiply(new BigDecimal(Integer.parseInt(cutSalary)/100));
|
|
|
+ return teacherSalary.multiply(new BigDecimal(cutSalary).divide(new BigDecimal(100)));
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -689,16 +695,12 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
.collect(Collectors.toMap(CourseSchedule::getId, courseSchedule -> courseSchedule));
|
|
|
|
|
|
//定位范围
|
|
|
- String gpsRange = sysTenantConfigService.getTenantConfigValue(SysConfigService.ATTENDANCE_RANGE,tenantId);
|
|
|
- double attendanceRange = 0;
|
|
|
- if(StringUtils.isNotEmpty(gpsRange)){
|
|
|
- attendanceRange = Double.valueOf(gpsRange);
|
|
|
- }
|
|
|
+ String attendanceRange = sysTenantConfigService.getTenantConfigValue(SysConfigService.ATTENDANCE_RANGE,tenantId);
|
|
|
//试用期课酬规则
|
|
|
String configValue2 = sysTenantConfigService.getTenantConfigValue(SysConfigService.PROBATION_TEACHER_SALARY,tenantId);
|
|
|
- Integer probationTeacherSalary = 100;
|
|
|
+ double probationTeacherSalary = 100;
|
|
|
if(StringUtils.isNotEmpty(configValue2)){
|
|
|
- probationTeacherSalary = Integer.parseInt(configValue2);
|
|
|
+ probationTeacherSalary = Double.parseDouble(configValue2);
|
|
|
}
|
|
|
|
|
|
//教师签到记录
|
|
@@ -783,7 +785,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
signInRange = getSignRange(school.getLongitudeLatitude(),teacherAttendance.getSignInLongitudeLatitude(),attendanceRange);
|
|
|
}
|
|
|
Boolean signOutRange = false;
|
|
|
- if(teacherAttendance != null || StringUtils.isNotEmpty(teacherAttendance.getSignOutLongitudeLatitude())){
|
|
|
+ if(teacherAttendance != null && StringUtils.isNotEmpty(teacherAttendance.getSignOutLongitudeLatitude())){
|
|
|
signOutRange = getSignRange(school.getLongitudeLatitude(),teacherAttendance.getSignOutLongitudeLatitude(),attendanceRange);
|
|
|
}
|
|
|
if(!signInRange){
|
|
@@ -819,7 +821,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
courseScheduleTeacherSalary.setSettlementTime(now);
|
|
|
}
|
|
|
if(courseScheduleTeacherSalaries != null && courseScheduleTeacherSalaries.size() > 0){
|
|
|
- courseScheduleTeacherSalaryDao.batchUpdate(courseScheduleTeacherSalaries);
|
|
|
+ courseScheduleTeacherSalaryDao.batchUpdateSalary(courseScheduleTeacherSalaries);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1457,7 +1459,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void salaryMarkNew(Date startDay) {
|
|
|
+ public void salaryMarkNew(Date startDay,Integer tenantId) {
|
|
|
Date now = new Date();
|
|
|
Date date = DateUtil.addMonths(now, -1);
|
|
|
if(Objects.nonNull(startDay)){
|
|
@@ -1471,10 +1473,10 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
if(CollectionUtils.isEmpty(salaries)){
|
|
|
return;
|
|
|
}
|
|
|
- SysConfig dayaBaseSalaryAmountConfig = sysConfigService.findByParamName(SysConfigService.DAYA_BASE_SALARY_AMOUNT);
|
|
|
+ String dayaBaseSalaryAmountConfig = sysTenantConfigService.getTenantConfigValue(SysConfigService.DAYA_BASE_SALARY_AMOUNT,tenantId);
|
|
|
BigDecimal dayaBaseSalaryAmount = new BigDecimal(4000);
|
|
|
- if(Objects.nonNull(dayaBaseSalaryAmountConfig)&&StringUtils.isNotBlank(dayaBaseSalaryAmountConfig.getParanValue())){
|
|
|
- dayaBaseSalaryAmount = new BigDecimal(dayaBaseSalaryAmountConfig.getParanValue());
|
|
|
+ if(StringUtils.isEmpty(dayaBaseSalaryAmountConfig)){
|
|
|
+ dayaBaseSalaryAmount = new BigDecimal(dayaBaseSalaryAmountConfig);
|
|
|
}
|
|
|
|
|
|
Map<Integer, List<CourseScheduleTeacherSalary>> teacherSalariesMap = salaries.stream().collect(Collectors.groupingBy(CourseScheduleTeacherSalary::getUserId));
|
|
@@ -1504,52 +1506,52 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
- @Transactional(rollbackFor = Exception.class)
|
|
|
- public void salaryMark() {
|
|
|
- Date now = new Date();
|
|
|
- Date date = DateUtil.addMonths(now, -1);
|
|
|
- String startDate = DateUtil.format(DateUtil.getFirstDayOfMonth(date),DateUtil.DEFAULT_PATTERN);
|
|
|
- String endDate = DateUtil.format(DateUtil.getLastDayOfMonth(date),DateUtil.DEFAULT_PATTERN);
|
|
|
-
|
|
|
- int isSalaryGroupTypes = redisTemplate.opsForSet().size(CourseScheduleTeacherSalaryService.TASK_KEY).intValue();
|
|
|
- if(isSalaryGroupTypes<3){
|
|
|
- return;
|
|
|
- }
|
|
|
- redisTemplate.delete(CourseScheduleTeacherSalaryService.TASK_KEY);
|
|
|
- List<CourseScheduleTeacherSalary> salaries = courseScheduleTeacherSalaryDao.getIsSalaryWithDate(startDate, endDate);
|
|
|
- if(CollectionUtils.isEmpty(salaries)){
|
|
|
- return;
|
|
|
- }
|
|
|
- SysConfig dayaBaseSalaryAmountConfig = sysConfigService.findByParamName(SysConfigService.DAYA_BASE_SALARY_AMOUNT);
|
|
|
- BigDecimal dayaBaseSalaryAmount = new BigDecimal(4000);
|
|
|
- if(Objects.nonNull(dayaBaseSalaryAmountConfig)&&StringUtils.isNotBlank(dayaBaseSalaryAmountConfig.getParanValue())){
|
|
|
- dayaBaseSalaryAmount = new BigDecimal(dayaBaseSalaryAmountConfig.getParanValue());
|
|
|
- }
|
|
|
-
|
|
|
- Map<Integer, List<CourseScheduleTeacherSalary>> teacherSalariesMap = salaries.stream().collect(Collectors.groupingBy(CourseScheduleTeacherSalary::getUserId));
|
|
|
- List<CourseScheduleTeacherSalary> updateRecords = new ArrayList<>();
|
|
|
- for (Map.Entry<Integer, List<CourseScheduleTeacherSalary>> teacherSalariesMapEntry : teacherSalariesMap.entrySet()) {
|
|
|
- List<CourseScheduleTeacherSalary> teacherSalaries = teacherSalariesMapEntry.getValue();
|
|
|
- List<BigDecimal> amounts = teacherSalaries.stream().map(CourseScheduleTeacherSalary::getActualSalary).collect(Collectors.toList());
|
|
|
- List<BigDecimal> resultAmounts = salaryComposition(amounts, dayaBaseSalaryAmount);
|
|
|
- for (BigDecimal resultAmount : resultAmounts) {
|
|
|
- Iterator<CourseScheduleTeacherSalary> iterator = teacherSalaries.iterator();
|
|
|
- while (iterator.hasNext()){
|
|
|
- CourseScheduleTeacherSalary teacherSalary = iterator.next();
|
|
|
- if(teacherSalary.getActualSalary().compareTo(resultAmount)==0){
|
|
|
- CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
|
|
|
- courseScheduleTeacherSalary.setId(teacherSalary.getId());
|
|
|
- courseScheduleTeacherSalary.setBelongToDaya(true);
|
|
|
- updateRecords.add(courseScheduleTeacherSalary);
|
|
|
- iterator.remove();
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- courseScheduleTeacherSalaryDao.batchUpdate(updateRecords);
|
|
|
- }
|
|
|
+// @Override
|
|
|
+// @Transactional(rollbackFor = Exception.class)
|
|
|
+// public void salaryMark() {
|
|
|
+// Date now = new Date();
|
|
|
+// Date date = DateUtil.addMonths(now, -1);
|
|
|
+// String startDate = DateUtil.format(DateUtil.getFirstDayOfMonth(date),DateUtil.DEFAULT_PATTERN);
|
|
|
+// String endDate = DateUtil.format(DateUtil.getLastDayOfMonth(date),DateUtil.DEFAULT_PATTERN);
|
|
|
+//
|
|
|
+// int isSalaryGroupTypes = redisTemplate.opsForSet().size(CourseScheduleTeacherSalaryService.TASK_KEY).intValue();
|
|
|
+// if(isSalaryGroupTypes<3){
|
|
|
+// return;
|
|
|
+// }
|
|
|
+// redisTemplate.delete(CourseScheduleTeacherSalaryService.TASK_KEY);
|
|
|
+// List<CourseScheduleTeacherSalary> salaries = courseScheduleTeacherSalaryDao.getIsSalaryWithDate(startDate, endDate);
|
|
|
+// if(CollectionUtils.isEmpty(salaries)){
|
|
|
+// return;
|
|
|
+// }
|
|
|
+// String dayaBaseSalaryAmountConfig = sysTenantConfigService.getTenantConfigValue(SysConfigService.DAYA_BASE_SALARY_AMOUNT,tenantId);
|
|
|
+// BigDecimal dayaBaseSalaryAmount = new BigDecimal(4000);
|
|
|
+// if(StringUtils.isEmpty(dayaBaseSalaryAmountConfig)){
|
|
|
+// dayaBaseSalaryAmount = new BigDecimal(dayaBaseSalaryAmountConfig);
|
|
|
+// }
|
|
|
+//
|
|
|
+// Map<Integer, List<CourseScheduleTeacherSalary>> teacherSalariesMap = salaries.stream().collect(Collectors.groupingBy(CourseScheduleTeacherSalary::getUserId));
|
|
|
+// List<CourseScheduleTeacherSalary> updateRecords = new ArrayList<>();
|
|
|
+// for (Map.Entry<Integer, List<CourseScheduleTeacherSalary>> teacherSalariesMapEntry : teacherSalariesMap.entrySet()) {
|
|
|
+// List<CourseScheduleTeacherSalary> teacherSalaries = teacherSalariesMapEntry.getValue();
|
|
|
+// List<BigDecimal> amounts = teacherSalaries.stream().map(CourseScheduleTeacherSalary::getActualSalary).collect(Collectors.toList());
|
|
|
+// List<BigDecimal> resultAmounts = salaryComposition(amounts, dayaBaseSalaryAmount);
|
|
|
+// for (BigDecimal resultAmount : resultAmounts) {
|
|
|
+// Iterator<CourseScheduleTeacherSalary> iterator = teacherSalaries.iterator();
|
|
|
+// while (iterator.hasNext()){
|
|
|
+// CourseScheduleTeacherSalary teacherSalary = iterator.next();
|
|
|
+// if(teacherSalary.getActualSalary().compareTo(resultAmount)==0){
|
|
|
+// CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
|
|
|
+// courseScheduleTeacherSalary.setId(teacherSalary.getId());
|
|
|
+// courseScheduleTeacherSalary.setBelongToDaya(true);
|
|
|
+// updateRecords.add(courseScheduleTeacherSalary);
|
|
|
+// iterator.remove();
|
|
|
+// break;
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+// courseScheduleTeacherSalaryDao.batchUpdate(updateRecords);
|
|
|
+// }
|
|
|
|
|
|
@Override
|
|
|
public List<BigDecimal> salaryComposition(List<BigDecimal> salaries, BigDecimal targetSalary) {
|
|
@@ -1596,8 +1598,10 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
|
|
|
@Override
|
|
|
public void calMusicCourseTeacherActualSalary(CourseSchedule courseSchedule, CourseScheduleTeacherSalary courseScheduleTeacherSalary,
|
|
|
- List<TeacherAttendance> teacherAttendances, School school, Teacher teacher, double attendanceRange, Boolean updated) {
|
|
|
+ List<TeacherAttendance> teacherAttendances, School school, Teacher teacher, String attendanceRange, Boolean updated) {
|
|
|
+
|
|
|
|
|
|
+ //教师课酬
|
|
|
if(StringUtils.isNotBlank(courseScheduleTeacherSalary.getDeductionReason())&&"不结算课酬".equals(courseScheduleTeacherSalary.getDeductionReason())){
|
|
|
//不结算课酬
|
|
|
if(updated){
|
|
@@ -1609,223 +1613,100 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- BigDecimal teacherSalary = courseScheduleTeacherSalary.getExpectSalary();
|
|
|
-
|
|
|
- if(CourseSchedule.CourseScheduleType.MUSIC_NETWORK.equals(courseSchedule.getType())||CourseSchedule.CourseScheduleType.HIGH_ONLINE.equals(courseSchedule.getType())){
|
|
|
- List<TeacherSalaryDeductReasonDto> deductReasons = new ArrayList<>();
|
|
|
-
|
|
|
- teacherSalary = teacherSalary.add(courseScheduleTeacherSalary.getSubsidy());
|
|
|
- if(BigDecimal.ZERO.compareTo(teacherSalary)>0){
|
|
|
- teacherSalary = new BigDecimal(0);
|
|
|
- }
|
|
|
-
|
|
|
- BigDecimal expectTeacherSalary = teacherSalary;
|
|
|
-
|
|
|
- //判断课程是否在试用期内
|
|
|
- boolean trail = false;
|
|
|
-
|
|
|
- if(Objects.nonNull(teacher)&&Objects.nonNull(teacher.getEntryDate())&&courseSchedule.getClassDate().compareTo(teacher.getEntryDate())>=0){
|
|
|
- trail = true;
|
|
|
- }
|
|
|
- if(Objects.nonNull(teacher)&&Objects.nonNull(teacher.getFormalStaffDate())&&courseSchedule.getClassDate().compareTo(teacher.getFormalStaffDate())>=0){
|
|
|
- trail = false;
|
|
|
- }
|
|
|
-
|
|
|
- //如果上课日期在试用期内按80%结算
|
|
|
- if(trail){
|
|
|
- teacherSalary = teacherSalary.multiply(new BigDecimal("0.8"));
|
|
|
- deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.TRAIL, expectTeacherSalary.subtract(teacherSalary)));
|
|
|
- }
|
|
|
-
|
|
|
- //扣除费用
|
|
|
- BigDecimal deductCost = new BigDecimal(0);
|
|
|
-
|
|
|
- TeacherAttendance teacherAttendance = teacherAttendances.get(0);
|
|
|
- if(CollectionUtils.isEmpty(teacherAttendances)||Objects.isNull(teacherAttendance.getSignInStatus())){
|
|
|
- //未签到扣除全部课酬
|
|
|
- deductCost = deductCost.add(teacherSalary.abs());
|
|
|
- deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_TIME_ERR, teacherSalary.abs()));
|
|
|
- }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignInStatus())){
|
|
|
- //异常签到
|
|
|
- int signCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignInTime(), courseSchedule.getStartClassTime());
|
|
|
- float signCourseTimeBetween = (float)signCourseTimeBetweenSeconds/(float)60;
|
|
|
- if(signCourseTimeBetween<=1&&signCourseTimeBetween>-3){
|
|
|
- //课程开始前1分钟至开始后3分钟进入教室
|
|
|
- deductCost = deductCost.add(teacherSalary.divide(new BigDecimal(2)).abs());
|
|
|
- deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_TIME_ERR, teacherSalary.divide(new BigDecimal(2)).abs()));
|
|
|
- }else if(signCourseTimeBetween<=-3){
|
|
|
- //课程开始后3分钟后进入教室
|
|
|
- deductCost = deductCost.add(teacherSalary.abs());
|
|
|
- deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_TIME_ERR, teacherSalary.abs()));
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if(CollectionUtils.isEmpty(teacherAttendances)||Objects.isNull(teacherAttendance.getSignOutStatus())){
|
|
|
- //未签退扣除一半课酬
|
|
|
- deductCost = deductCost.add(teacherSalary.divide(new BigDecimal(2)).abs());
|
|
|
- deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_TIME_ERR, teacherSalary.divide(new BigDecimal(2)).abs()));
|
|
|
- }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignOutStatus())){
|
|
|
- //异常签退
|
|
|
- int signOutCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignOutTime(), courseSchedule.getEndClassTime());
|
|
|
- float signOutCourseTimeBetween = (float)signOutCourseTimeBetweenSeconds/(float)60;
|
|
|
-
|
|
|
- if(signOutCourseTimeBetween>3){
|
|
|
- //课程开始前20分钟至开始后3分钟退出教室
|
|
|
- deductCost = deductCost.add(teacherSalary.abs());
|
|
|
-// deductReasons.add("课程结束前3分钟之前退出教室扣除全部课酬");
|
|
|
- deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_TIME_ERR, teacherSalary.abs()));
|
|
|
- }else if(signOutCourseTimeBetween<=3&&signOutCourseTimeBetween>0){
|
|
|
- //课程结束前3分钟后至课程结束前退出教室
|
|
|
- deductCost = deductCost.add(teacherSalary.divide(new BigDecimal(2)).abs());
|
|
|
-// deductReasons.add("课程结束前3分钟后至课程结束前退出教室扣除一半课酬");
|
|
|
- deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_TIME_ERR, teacherSalary.divide(new BigDecimal(2)).abs()));
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- BigDecimal finalSalary = teacherSalary.subtract(deductCost).setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP);
|
|
|
-
|
|
|
- //更新教师结算信息
|
|
|
- courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary);
|
|
|
- courseScheduleTeacherSalary.setDeductReasons(deductReasons);
|
|
|
- }else{
|
|
|
- List<TeacherSalaryDeductReasonDto> deductReasons = new ArrayList<>();
|
|
|
+ List<TeacherSalaryDeductReasonDto> deductReasons = new ArrayList<>();
|
|
|
|
|
|
+ BigDecimal teacherSalary = courseScheduleTeacherSalary.getExpectSalary();
|
|
|
+ if(Objects.isNull(courseScheduleTeacherSalary.getSubsidy())){
|
|
|
+ courseScheduleTeacherSalary.setSubsidy(BigDecimal.ZERO);
|
|
|
+ }
|
|
|
+ if(BigDecimal.ZERO.compareTo(courseScheduleTeacherSalary.getSubsidy()) != 0){
|
|
|
teacherSalary = teacherSalary.add(courseScheduleTeacherSalary.getSubsidy());
|
|
|
- if(BigDecimal.ZERO.compareTo(teacherSalary)>0){
|
|
|
- teacherSalary = new BigDecimal(0);
|
|
|
- }
|
|
|
-
|
|
|
- BigDecimal expectTeacherSalary = teacherSalary;
|
|
|
+ deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SUBSIDY, courseScheduleTeacherSalary.getSubsidy()));
|
|
|
+ }
|
|
|
+ if(BigDecimal.ZERO.compareTo(teacherSalary) > 0){
|
|
|
+ teacherSalary = new BigDecimal(0);
|
|
|
+ }
|
|
|
|
|
|
- //判断课程是否在试用期内
|
|
|
- boolean trail = false;
|
|
|
+ Integer tenantId = TenantContextHolder.getTenantId();
|
|
|
|
|
|
- if(Objects.nonNull(teacher)&&Objects.nonNull(teacher.getEntryDate())&&courseSchedule.getClassDate().compareTo(teacher.getEntryDate())>=0){
|
|
|
- trail = true;
|
|
|
- }
|
|
|
- if(Objects.nonNull(teacher)&&Objects.nonNull(teacher.getFormalStaffDate())&&courseSchedule.getClassDate().compareTo(teacher.getFormalStaffDate())>=0){
|
|
|
- trail = false;
|
|
|
- }
|
|
|
+ //试用期课酬规则
|
|
|
+ String configValue2 = sysTenantConfigService.getTenantConfigValue(SysConfigService.PROBATION_TEACHER_SALARY,tenantId);
|
|
|
+ Integer probationTeacherSalary = 100;
|
|
|
+ if(StringUtils.isNotEmpty(configValue2)){
|
|
|
+ probationTeacherSalary = Integer.parseInt(configValue2);
|
|
|
+ }
|
|
|
+ //如果上课日期在试用期内按80%结算
|
|
|
+ BigDecimal expectTeacherSalary = teacherSalary;
|
|
|
+ if(isTrail(teacher,courseSchedule.getClassDate())){
|
|
|
+ teacherSalary = teacherSalary.multiply(new BigDecimal(probationTeacherSalary / 100));
|
|
|
+ deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.TRAIL, expectTeacherSalary.subtract(teacherSalary)));
|
|
|
+ }
|
|
|
|
|
|
- //如果上课日期在试用期内按80%结算
|
|
|
- if(trail){
|
|
|
- teacherSalary = teacherSalary.multiply(new BigDecimal("0.8"));
|
|
|
-// deductReasons.add("未转正");
|
|
|
- deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.TRAIL, expectTeacherSalary.subtract(teacherSalary)));
|
|
|
+ //扣除费用
|
|
|
+ BigDecimal deductCost = BigDecimal.ZERO;
|
|
|
+ //获取签到状态
|
|
|
+ TeachModeEnum teachMode = courseScheduleTeacherSalary.getCourseSchedule().getTeachMode();
|
|
|
+ TeacherAttendance teacherAttendance = null;
|
|
|
+ if(teacherAttendances != null && teacherAttendances.size() > 0){
|
|
|
+ teacherAttendance = teacherAttendances.get(0);
|
|
|
+ }
|
|
|
+ if(teacherAttendance == null){
|
|
|
+ teacherAttendance = new TeacherAttendance();
|
|
|
+ }
|
|
|
+ if(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(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_TIME_ERR, teacherSalary.subtract(signInDeductCost)));
|
|
|
}
|
|
|
-
|
|
|
- //扣除费用
|
|
|
- BigDecimal deductCost = BigDecimal.ZERO;
|
|
|
-
|
|
|
- TeacherAttendance teacherAttendance = null;
|
|
|
- if(!CollectionUtils.isEmpty(teacherAttendances)){
|
|
|
- teacherAttendance = teacherAttendances.get(0);
|
|
|
+ }
|
|
|
+ if(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(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_TIME_ERR, teacherSalary.subtract(signOutDeductCost)));
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- boolean signInInRange = false;
|
|
|
- boolean signOutInRange = false;
|
|
|
- if(Objects.nonNull(school)&&Objects.nonNull(school.getLongitudeLatitude())
|
|
|
- &&Objects.nonNull(teacherAttendance)
|
|
|
- &&StringUtils.isNotBlank(teacherAttendance.getSignInLongitudeLatitude())
|
|
|
- &&StringUtils.isNotBlank(teacherAttendance.getSignOutLongitudeLatitude())){
|
|
|
- double signInDistance = MapUtil.distance(teacherAttendance.getSignInLongitudeLatitude(),
|
|
|
- school.getLongitudeLatitude());
|
|
|
- if (signInDistance <= attendanceRange) {
|
|
|
- signInInRange = true;
|
|
|
+ //经纬度是否正常
|
|
|
+ if(teachMode == TeachModeEnum.OFFLINE){
|
|
|
+ if(school != null){
|
|
|
+ Boolean signInRange = false;
|
|
|
+ if(teacherAttendance != null && StringUtils.isNotEmpty(teacherAttendance.getSignInLongitudeLatitude())){
|
|
|
+ signInRange = getSignRange(school.getLongitudeLatitude(),teacherAttendance.getSignInLongitudeLatitude(),attendanceRange);
|
|
|
}
|
|
|
- double signOutDistance = MapUtil.distance(teacherAttendance.getSignOutLongitudeLatitude(),
|
|
|
- school.getLongitudeLatitude());
|
|
|
- if (signOutDistance <= attendanceRange) {
|
|
|
- signOutInRange = true;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- BigDecimal gpsDeductAmount = new BigDecimal("0");
|
|
|
-
|
|
|
- if(Objects.isNull(teacherAttendance)||Objects.isNull(teacherAttendance.getSignInStatus())){
|
|
|
- //无签到记录扣除全部课酬
|
|
|
- deductCost = deductCost.add(teacherSalary.abs());
|
|
|
-// deductReasons.add("未签到扣除全部课酬");
|
|
|
- deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_TIME_ERR, teacherSalary.abs()));
|
|
|
- }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignInStatus())){
|
|
|
- int signCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignInTime(), courseSchedule.getStartClassTime());
|
|
|
- float signCourseTimeBetween = (float)signCourseTimeBetweenSeconds/(float)60;
|
|
|
- if(signCourseTimeBetween>0&&signCourseTimeBetween<=20){
|
|
|
- //未提前20分钟打卡扣除50元
|
|
|
- deductCost = deductCost.add(new BigDecimal(50));
|
|
|
-// deductReasons.add("未提前20分钟打卡扣除50元");
|
|
|
- deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_TIME_ERR, new BigDecimal(50)));
|
|
|
- }else if(signCourseTimeBetween<=0&&signCourseTimeBetween>-30){
|
|
|
- //迟到30分钟内扣除一半课酬
|
|
|
- deductCost = deductCost.add(teacherSalary.divide(new BigDecimal(2)).abs());
|
|
|
-// deductReasons.add("迟到30分钟内扣除一半课酬");
|
|
|
- deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_TIME_ERR, teacherSalary.divide(new BigDecimal(2)).abs()));
|
|
|
- }else if(signCourseTimeBetween<=-30){
|
|
|
- //迟到30分钟及以上扣除全部课酬
|
|
|
- deductCost = deductCost.add(teacherSalary.abs());
|
|
|
-// deductReasons.add("迟到30分钟及以上扣除全部课酬");
|
|
|
- deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_TIME_ERR, teacherSalary.abs()));
|
|
|
+ Boolean signOutRange = false;
|
|
|
+ if(teacherAttendance != null || StringUtils.isNotEmpty(teacherAttendance.getSignOutLongitudeLatitude())){
|
|
|
+ signOutRange = getSignRange(school.getLongitudeLatitude(),teacherAttendance.getSignOutLongitudeLatitude(),attendanceRange);
|
|
|
}
|
|
|
- if(!signInInRange){
|
|
|
- //签到经纬度异常扣除50
|
|
|
- deductCost = deductCost.add(new BigDecimal(50));
|
|
|
-// deductReasons.add("签到经纬度异常扣除50");
|
|
|
- gpsDeductAmount = new BigDecimal(50);
|
|
|
+ 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(new TeacherSalaryDeductReasonDto(DeductReasonEnum.GPS_ERR_IN, teacherSalary.subtract(signInGpsCutAmount)));
|
|
|
+ }
|
|
|
}
|
|
|
- }else{
|
|
|
- signInInRange = true;
|
|
|
- }
|
|
|
-
|
|
|
- if(Objects.isNull(teacherAttendance)||Objects.isNull(teacherAttendance.getSignOutStatus())){
|
|
|
- //未签退扣除全部课酬
|
|
|
- deductCost = deductCost.add(teacherSalary.abs());
|
|
|
-// deductReasons.add("未签退扣除全部课酬");
|
|
|
- deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_TIME_ERR, teacherSalary.abs()));
|
|
|
- }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignOutStatus())){
|
|
|
- int signOutCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignOutTime(), courseSchedule.getEndClassTime());
|
|
|
- float signOutCourseTimeBetween = (float)signOutCourseTimeBetweenSeconds/(float) 60;
|
|
|
- if(signOutCourseTimeBetween>3){
|
|
|
- //早退
|
|
|
- deductCost = deductCost.add(teacherSalary.abs());
|
|
|
-// deductReasons.add("早退扣除全部课酬");
|
|
|
- deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_TIME_ERR, teacherSalary.abs()));
|
|
|
- }else if((signOutCourseTimeBetween<=3&&signOutCourseTimeBetween>0)||signOutCourseTimeBetween>=3600){
|
|
|
- //异常签退,扣除50元
|
|
|
- deductCost = deductCost.add(new BigDecimal(50));
|
|
|
-// deductReasons.add("异常签退,扣除50元");
|
|
|
- deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_TIME_ERR, new BigDecimal(50)));
|
|
|
- }else{
|
|
|
- //签退经纬度异常,扣除50元
|
|
|
- deductCost = deductCost.add(new BigDecimal(50));
|
|
|
-// deductReasons.add("签退经纬度异常,扣除50元");
|
|
|
- gpsDeductAmount = new BigDecimal(50);
|
|
|
+ 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(new TeacherSalaryDeductReasonDto(DeductReasonEnum.GPS_ERR_OUT, teacherSalary.subtract(signOutGpsCutAmount)));
|
|
|
+ }
|
|
|
}
|
|
|
- }else{
|
|
|
- signOutInRange = true;
|
|
|
- }
|
|
|
-
|
|
|
- if(!signInInRange&&!signOutInRange){
|
|
|
- //签到签退GPS定位在指定距离外
|
|
|
- deductCost = deductCost.add(teacherSalary.abs());
|
|
|
-// deductReasons.add("签到签退GPS定位在指定距离外,扣除全部课酬");
|
|
|
- gpsDeductAmount = teacherSalary.abs();
|
|
|
}
|
|
|
-
|
|
|
- if(BigDecimal.ZERO.compareTo(gpsDeductAmount)<0){
|
|
|
- deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.GPS_ERR, gpsDeductAmount));
|
|
|
- }
|
|
|
-
|
|
|
- BigDecimal finalSalary = teacherSalary.subtract(deductCost).setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP);
|
|
|
-
|
|
|
- //更新教师结算信息
|
|
|
- courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary);
|
|
|
- courseScheduleTeacherSalary.setDeductReasons(deductReasons);
|
|
|
}
|
|
|
+ BigDecimal finalSalary = teacherSalary.subtract(deductCost).setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP);
|
|
|
+ courseScheduleTeacherSalary.setDeductReasons(deductReasons);
|
|
|
+ courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void calVipCourseTeacherActualSalary(CourseSchedule courseSchedule, CourseScheduleTeacherSalary courseScheduleTeacherSalary,
|
|
|
- List<TeacherAttendance> teacherAttendances, School school, Teacher teacher, double attendanceRange, Boolean updated) {
|
|
|
+ List<TeacherAttendance> teacherAttendances, School school, Teacher teacher, String attendanceRange, Boolean updated) {
|
|
|
List<TeacherSalaryDeductReasonDto> deductReasons = new ArrayList<>();
|
|
|
|
|
|
if(StringUtils.isNotBlank(courseScheduleTeacherSalary.getDeductionReason())&&"不结算课酬".equals(courseScheduleTeacherSalary.getDeductionReason())){
|
|
@@ -1837,97 +1718,81 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
}
|
|
|
return;
|
|
|
}
|
|
|
-
|
|
|
- BigDecimal expectSalary = courseScheduleTeacherSalary.getExpectSalary();
|
|
|
|
|
|
- expectSalary = expectSalary.add(courseScheduleTeacherSalary.getSubsidy());
|
|
|
- if(BigDecimal.ZERO.compareTo(expectSalary)>0){
|
|
|
+ BigDecimal expectSalary = courseScheduleTeacherSalary.getExpectSalary();
|
|
|
+ if(Objects.isNull(courseScheduleTeacherSalary.getSubsidy())){
|
|
|
+ courseScheduleTeacherSalary.setSubsidy(BigDecimal.ZERO);
|
|
|
+ }
|
|
|
+ if(BigDecimal.ZERO.compareTo(courseScheduleTeacherSalary.getSubsidy()) != 0){
|
|
|
+ expectSalary = expectSalary.add(courseScheduleTeacherSalary.getSubsidy());
|
|
|
+ deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SUBSIDY, courseScheduleTeacherSalary.getSubsidy()));
|
|
|
+ }
|
|
|
+ if(BigDecimal.ZERO.compareTo(expectSalary) > 0){
|
|
|
expectSalary = new BigDecimal(0);
|
|
|
}
|
|
|
|
|
|
- BigDecimal expectTeacherSalary = expectSalary;
|
|
|
-
|
|
|
- //判断课程是否在试用期内
|
|
|
- boolean trail = false;
|
|
|
+ Integer tenantId = TenantContextHolder.getTenantId();
|
|
|
|
|
|
- if(Objects.nonNull(teacher)&&Objects.nonNull(teacher.getEntryDate())&&courseSchedule.getClassDate().compareTo(teacher.getEntryDate())>=0){
|
|
|
- trail = true;
|
|
|
- }
|
|
|
- if(Objects.nonNull(teacher)&&Objects.nonNull(teacher.getFormalStaffDate())&&courseSchedule.getClassDate().compareTo(teacher.getFormalStaffDate())>=0){
|
|
|
- trail = false;
|
|
|
+ //试用期课酬规则
|
|
|
+ String configValue2 = sysTenantConfigService.getTenantConfigValue(SysConfigService.PROBATION_TEACHER_SALARY,tenantId);
|
|
|
+ Integer probationTeacherSalary = 100;
|
|
|
+ if(StringUtils.isNotEmpty(configValue2)){
|
|
|
+ probationTeacherSalary = Integer.parseInt(configValue2);
|
|
|
}
|
|
|
-
|
|
|
//如果上课日期在试用期内按80%结算
|
|
|
- if(trail){
|
|
|
- expectSalary = expectSalary.multiply(new BigDecimal("0.8"));
|
|
|
-// deductReasons.add("未转正");
|
|
|
+ BigDecimal expectTeacherSalary = expectSalary;
|
|
|
+ if(isTrail(teacher,courseSchedule.getClassDate())){
|
|
|
+ expectSalary = expectSalary.multiply(new BigDecimal(probationTeacherSalary / 100));
|
|
|
deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.TRAIL, expectTeacherSalary.subtract(expectSalary)));
|
|
|
}
|
|
|
-
|
|
|
//扣除费用
|
|
|
- BigDecimal deductCost = new BigDecimal(0);
|
|
|
- BigDecimal gpsDeductAmount = new BigDecimal("0");
|
|
|
-
|
|
|
- if(CollectionUtils.isEmpty(teacherAttendances)||Objects.isNull(teacherAttendances.get(0).getSignInStatus())){
|
|
|
- //未签到扣除全部课酬
|
|
|
- deductCost = deductCost.add(expectSalary.abs());
|
|
|
-// deductReasons.add("未签到扣除全部课酬");
|
|
|
- deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_TIME_ERR, expectSalary.abs()));
|
|
|
- }else if(YesOrNoEnum.NO.equals(teacherAttendances.get(0).getSignInStatus())&&TeachModeEnum.ONLINE.equals(courseSchedule.getTeachMode())){
|
|
|
- //异常签到
|
|
|
- int signCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendances.get(0).getSignInTime(), courseSchedule.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分钟进入教室扣除一半课酬");
|
|
|
- deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_TIME_ERR, expectSalary.divide(new BigDecimal(2)).abs()));
|
|
|
- }else if(signCourseTimeBetween<=-3){
|
|
|
- //课程开始后3分钟后进入教室
|
|
|
- deductCost = deductCost.add(expectSalary.abs());
|
|
|
-// deductReasons.add("课程开始后3分钟进入教室扣除全部课酬");
|
|
|
- deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_TIME_ERR, expectSalary.abs()));
|
|
|
- }
|
|
|
- }else if(YesOrNoEnum.NO.equals(teacherAttendances.get(0).getSignInStatus())&&TeachModeEnum.OFFLINE.equals(courseSchedule.getTeachMode())){
|
|
|
- deductCost = deductCost.add(expectSalary.abs());
|
|
|
-// deductReasons.add("点名时经纬度不在范围内扣除全部课酬");
|
|
|
- gpsDeductAmount = expectSalary.abs();
|
|
|
- }
|
|
|
-
|
|
|
- if(CollectionUtils.isEmpty(teacherAttendances)||Objects.isNull(teacherAttendances.get(0).getSignOutStatus())){
|
|
|
- //未签退扣除全部课酬
|
|
|
- deductCost = deductCost.add(expectSalary.abs());
|
|
|
-// deductReasons.add("未签退扣除全部课酬");
|
|
|
- deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_TIME_ERR, expectSalary.abs()));
|
|
|
- }else if(YesOrNoEnum.NO.equals(teacherAttendances.get(0).getSignOutStatus())&&TeachModeEnum.ONLINE.equals(courseSchedule.getTeachMode())){
|
|
|
- //异常签退
|
|
|
- int signOutCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendances.get(0).getSignOutTime(), courseSchedule.getEndClassTime());
|
|
|
- float signOutCourseTimeBetween = (float)signOutCourseTimeBetweenSeconds/(float)60;
|
|
|
-
|
|
|
- if(signOutCourseTimeBetween>3){
|
|
|
- //课程开始前20分钟至开始后3分钟退出教室
|
|
|
- deductCost = deductCost.add(expectSalary.abs());
|
|
|
-// deductReasons.add("课程结束前3分钟之前退出教室扣除全部课酬");
|
|
|
- deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_TIME_ERR, expectSalary.abs()));
|
|
|
- }else if(signOutCourseTimeBetween<=3&&signOutCourseTimeBetween>0){
|
|
|
- //课程结束前3分钟后至课程结束前退出教室
|
|
|
- deductCost = deductCost.add(expectSalary.divide(new BigDecimal(2)).abs());
|
|
|
-// deductReasons.add("课程结束前3分钟后至课程结束前退出教室扣除一半课酬");
|
|
|
- deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_TIME_ERR, expectSalary.divide(new BigDecimal(2)).abs()));
|
|
|
- }
|
|
|
- }else if(YesOrNoEnum.NO.equals(teacherAttendances.get(0).getSignInStatus())&&TeachModeEnum.OFFLINE.equals(courseSchedule.getTeachMode())){
|
|
|
- deductCost = deductCost.add(expectSalary.abs());
|
|
|
-// deductReasons.add("点名时经纬度不在范围内扣除全部课酬");
|
|
|
- gpsDeductAmount = expectSalary.abs();
|
|
|
- }
|
|
|
-
|
|
|
- if(BigDecimal.ZERO.compareTo(gpsDeductAmount)<0){
|
|
|
- deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.GPS_ERR, gpsDeductAmount));
|
|
|
+ BigDecimal deductCost = BigDecimal.ZERO;
|
|
|
+ TeachModeEnum teachMode = courseSchedule.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(new TeacherSalaryDeductReasonDto(DeductReasonEnum.GPS_ERR_IN, expectSalary.subtract(signInGpsCutAmount)));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ 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(new TeacherSalaryDeductReasonDto(DeductReasonEnum.GPS_ERR_OUT, expectSalary.subtract(signOutGpsCutAmount)));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ TeacherAttendance teacherAttendance = null;
|
|
|
+ if(teacherAttendances != null && teacherAttendances.size() > 0){
|
|
|
+ teacherAttendance = teacherAttendances.get(0);
|
|
|
+ }
|
|
|
+ if(teacherAttendance == null){
|
|
|
+ teacherAttendance = new TeacherAttendance();
|
|
|
+ }
|
|
|
+ if(teacherAttendance.getSignInStatus() == null || 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(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_TIME_ERR, expectSalary.subtract(signInDeductCost)));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(teacherAttendance.getSignOutStatus() == null || 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(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_TIME_ERR, expectSalary.subtract(signOutDeductCost)));
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
-
|
|
|
+ courseScheduleTeacherSalary.setDeductReasons(deductReasons);
|
|
|
BigDecimal finalSalary = expectSalary.subtract(deductCost).setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP);
|
|
|
courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary);
|
|
|
- courseScheduleTeacherSalary.setDeductReasons(deductReasons);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -1944,89 +1809,65 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
}
|
|
|
return;
|
|
|
}
|
|
|
-
|
|
|
- BigDecimal expectSalary = courseScheduleTeacherSalary.getExpectSalary();
|
|
|
+ Integer tenantId = TenantContextHolder.getTenantId();
|
|
|
|
|
|
- expectSalary = expectSalary.add(courseScheduleTeacherSalary.getSubsidy());
|
|
|
- if(BigDecimal.ZERO.compareTo(expectSalary)>0){
|
|
|
- expectSalary = new BigDecimal(0);
|
|
|
+ BigDecimal expectSalary = courseScheduleTeacherSalary.getExpectSalary();
|
|
|
+ if(Objects.isNull(courseScheduleTeacherSalary.getSubsidy())){
|
|
|
+ courseScheduleTeacherSalary.setSubsidy(BigDecimal.ZERO);
|
|
|
}
|
|
|
-
|
|
|
- BigDecimal expectTeacherSalary = expectSalary;
|
|
|
-
|
|
|
- //判断课程是否在试用期内
|
|
|
- boolean trail = false;
|
|
|
-
|
|
|
- if(Objects.nonNull(teacher)&&Objects.nonNull(teacher.getEntryDate())&&courseSchedule.getClassDate().compareTo(teacher.getEntryDate())>=0){
|
|
|
- trail = true;
|
|
|
+ if(BigDecimal.ZERO.compareTo(courseScheduleTeacherSalary.getSubsidy()) != 0){
|
|
|
+ expectSalary = expectSalary.add(courseScheduleTeacherSalary.getSubsidy());
|
|
|
+ deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SUBSIDY, courseScheduleTeacherSalary.getSubsidy()));
|
|
|
}
|
|
|
- if(Objects.nonNull(teacher)&&Objects.nonNull(teacher.getFormalStaffDate())&&courseSchedule.getClassDate().compareTo(teacher.getFormalStaffDate())>=0){
|
|
|
- trail = false;
|
|
|
+ if(BigDecimal.ZERO.compareTo(expectSalary) > 0){
|
|
|
+ expectSalary = new BigDecimal(0);
|
|
|
}
|
|
|
|
|
|
//如果上课日期在试用期内按80%结算
|
|
|
- if(trail){
|
|
|
- expectSalary = expectSalary.multiply(new BigDecimal("0.8"));
|
|
|
-// deductReasons.add("未转正");
|
|
|
+ //试用期课酬规则
|
|
|
+ String configValue2 = sysTenantConfigService.getTenantConfigValue(SysConfigService.PROBATION_TEACHER_SALARY,tenantId);
|
|
|
+ Integer probationTeacherSalary = 100;
|
|
|
+ if(StringUtils.isNotEmpty(configValue2)){
|
|
|
+ probationTeacherSalary = Integer.parseInt(configValue2);
|
|
|
+ }
|
|
|
+ BigDecimal expectTeacherSalary = expectSalary;
|
|
|
+ if(isTrail(teacher,courseSchedule.getClassDate())){
|
|
|
+ expectSalary = expectSalary.multiply(new BigDecimal(probationTeacherSalary / 100));
|
|
|
deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.TRAIL, expectTeacherSalary.subtract(expectSalary)));
|
|
|
}
|
|
|
|
|
|
//扣除费用
|
|
|
- BigDecimal deductCost = new BigDecimal(0);
|
|
|
+ BigDecimal deductCost = BigDecimal.ZERO;
|
|
|
|
|
|
+ //获取签到状态
|
|
|
+ TeachModeEnum teachMode = courseScheduleTeacherSalary.getCourseSchedule().getTeachMode();
|
|
|
TeacherAttendance teacherAttendance = null;
|
|
|
- if(!CollectionUtils.isEmpty(teacherAttendances)){
|
|
|
+ if(teacherAttendances != null && teacherAttendances.size() > 0){
|
|
|
teacherAttendance = teacherAttendances.get(0);
|
|
|
}
|
|
|
- if(CollectionUtils.isEmpty(teacherAttendances)||Objects.isNull(teacherAttendance.getSignInStatus())){
|
|
|
- //未签到扣除全部课酬
|
|
|
- deductCost = deductCost.add(expectSalary.abs());
|
|
|
-// deductReasons.add("未签到扣除全部课酬");
|
|
|
- deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_TIME_ERR, expectSalary.abs()));
|
|
|
- }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignInStatus())){
|
|
|
- //异常签到
|
|
|
- int signCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignInTime(), courseSchedule.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分钟进入教室扣除一半课酬");
|
|
|
- deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_TIME_ERR, expectSalary.divide(new BigDecimal(2)).abs()));
|
|
|
- }else if(signCourseTimeBetween<=-3){
|
|
|
- //课程开始后3分钟后进入教室
|
|
|
- deductCost = deductCost.add(expectSalary.abs());
|
|
|
-// deductReasons.add("课程开始后3分钟进入教室扣除全部课酬");
|
|
|
- deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_TIME_ERR, expectSalary.abs()));
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if(CollectionUtils.isEmpty(teacherAttendances)||Objects.isNull(teacherAttendance.getSignOutStatus())){
|
|
|
- //未签退扣除全部课酬
|
|
|
- deductCost = deductCost.add(expectSalary.abs());
|
|
|
-// deductReasons.add("未签退扣除全部课酬");
|
|
|
- deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_TIME_ERR, expectSalary.abs()));
|
|
|
- }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignOutStatus())){
|
|
|
- //异常签退
|
|
|
- int signOutCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignOutTime(), courseSchedule.getEndClassTime());
|
|
|
- float signOutCourseTimeBetween = (float)signOutCourseTimeBetweenSeconds/(float)60;
|
|
|
-
|
|
|
- if(signOutCourseTimeBetween>3){
|
|
|
- //课程开始前20分钟至开始后3分钟退出教室
|
|
|
- deductCost = deductCost.add(expectSalary.abs());
|
|
|
-// deductReasons.add("课程结束前3分钟之前退出教室扣除全部课酬");
|
|
|
- deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_TIME_ERR, expectSalary.abs()));
|
|
|
- }else if(signOutCourseTimeBetween<=3&&signOutCourseTimeBetween>0){
|
|
|
- //课程结束前3分钟后至课程结束前退出教室
|
|
|
- deductCost = deductCost.add(expectSalary.divide(new BigDecimal(2)).abs());
|
|
|
-// deductReasons.add("课程结束前3分钟后至课程结束前退出教室扣除一半课酬");
|
|
|
- deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_TIME_ERR, expectSalary.divide(new BigDecimal(2)).abs()));
|
|
|
+ if(teacherAttendance == null){
|
|
|
+ teacherAttendance = new TeacherAttendance();
|
|
|
+ }
|
|
|
+ if(teacherAttendance.getSignInStatus() == null || 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(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_TIME_ERR, signInDeductCost));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(teacherAttendance.getSignInStatus() == null || 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(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_TIME_ERR, signOutDeductCost));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
BigDecimal finalSalary = expectSalary.subtract(deductCost).setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP);
|
|
|
-
|
|
|
- courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary);
|
|
|
courseScheduleTeacherSalary.setDeductReasons(deductReasons);
|
|
|
+ courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -2035,6 +1876,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
TeacherIncomeReviewDto teacherSalaryOverview = new TeacherIncomeReviewDto();
|
|
|
return teacherSalaryOverview;
|
|
|
}
|
|
|
+ Integer tenantId = TenantContextHolder.getTenantId();
|
|
|
|
|
|
if(StringUtils.isBlank(queryInfo.getStartDay())){
|
|
|
LocalDate nowDate = LocalDate.now();
|
|
@@ -2077,18 +1919,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
}
|
|
|
|
|
|
//签到GPS范围
|
|
|
- SysConfig sysConfig = sysConfigService.findByParamName(SysConfigService.ATTENDANCE_RANGE);
|
|
|
- double attendanceRange = 0;
|
|
|
- if(Objects.nonNull(sysConfig)){
|
|
|
- attendanceRange = Double.valueOf(sysConfig.getParanValue());
|
|
|
- }
|
|
|
-
|
|
|
- //签到GPS范围VIP
|
|
|
-// SysConfig vipSysConfig = sysConfigService.findByParamName(SysConfigService.ATTENDANCE_RANGE);
|
|
|
-// double vipAttendanceRange = 0;
|
|
|
-// if(Objects.nonNull(vipSysConfig)){
|
|
|
-// vipAttendanceRange = Double.valueOf(vipSysConfig.getParanValue());
|
|
|
-// }
|
|
|
+ String attendanceRange = sysTenantConfigService.getTenantConfigValue(SysConfigService.ATTENDANCE_RANGE,tenantId);
|
|
|
|
|
|
//教师签到记录
|
|
|
List<TeacherAttendance> allTeacherAttendances = teacherAttendanceDao.findByCourseSchedules(courseIds);
|
|
@@ -2138,10 +1969,10 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
BigDecimal monthActualIncome = teacherSalaries.stream().map(CourseScheduleTeacherSalary::getActualSalary).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
teacherSalaryOverview.setThisMonthActualIncome(monthActualIncome);
|
|
|
|
|
|
- SysConfig dayaBaseSalaryAmountConfig = sysConfigService.findByParamName(SysConfigService.DAYA_BASE_SALARY_AMOUNT);
|
|
|
+ String dayaBaseSalaryAmountConfig = sysTenantConfigService.getTenantConfigValue(SysConfigService.DAYA_BASE_SALARY_AMOUNT,tenantId);
|
|
|
BigDecimal dayaBaseSalaryAmount = new BigDecimal(4000);
|
|
|
- if(Objects.nonNull(dayaBaseSalaryAmountConfig)&&StringUtils.isNotBlank(dayaBaseSalaryAmountConfig.getParanValue())){
|
|
|
- dayaBaseSalaryAmount = new BigDecimal(dayaBaseSalaryAmountConfig.getParanValue());
|
|
|
+ if(StringUtils.isEmpty(dayaBaseSalaryAmountConfig)){
|
|
|
+ dayaBaseSalaryAmount = new BigDecimal(dayaBaseSalaryAmountConfig);
|
|
|
}
|
|
|
|
|
|
if(monthActualIncome.compareTo(dayaBaseSalaryAmount)>0){
|
|
@@ -2151,8 +1982,8 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
teacherSalaryOverview.setDayaIncome(monthActualIncome);
|
|
|
}
|
|
|
|
|
|
- teacherSalaryOverview.setAttendanceRange(attendanceRange);
|
|
|
- teacherSalaryOverview.setVipAttendanceRange(attendanceRange);
|
|
|
+ teacherSalaryOverview.setAttendanceRange(StringUtils.isEmpty(attendanceRange)?0:Double.parseDouble(attendanceRange));
|
|
|
+ teacherSalaryOverview.setVipAttendanceRange(StringUtils.isEmpty(attendanceRange)?0:Double.parseDouble(attendanceRange));
|
|
|
|
|
|
return teacherSalaryOverview;
|
|
|
}
|
|
@@ -2169,6 +2000,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
pageInfo.setRows(Collections.EMPTY_LIST);
|
|
|
return pageInfo;
|
|
|
}
|
|
|
+ Integer tenantId = TenantContextHolder.getTenantId();
|
|
|
|
|
|
int count = courseScheduleDao.countTeacherCourse(params);
|
|
|
pageInfo.setTotal(count);
|
|
@@ -2194,18 +2026,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
}
|
|
|
|
|
|
//签到GPS范围
|
|
|
- SysConfig sysConfig = sysConfigService.findByParamName(SysConfigService.ATTENDANCE_RANGE);
|
|
|
- double attendanceRange = 0;
|
|
|
- if(Objects.nonNull(sysConfig)){
|
|
|
- attendanceRange = Double.valueOf(sysConfig.getParanValue());
|
|
|
- }
|
|
|
-
|
|
|
- //签到GPS范围VIP
|
|
|
-// SysConfig vipSysConfig = sysConfigService.findByParamName(SysConfigService.ATTENDANCE_RANGE_VIP);
|
|
|
-// double vipAttendanceRange = 0;
|
|
|
-// if(Objects.nonNull(vipSysConfig)){
|
|
|
-// vipAttendanceRange = Double.valueOf(vipSysConfig.getParanValue());
|
|
|
-// }
|
|
|
+ String attendanceRange = sysTenantConfigService.getTenantConfigValue(SysConfigService.ATTENDANCE_RANGE,tenantId);
|
|
|
|
|
|
//教师签到记录
|
|
|
List<TeacherAttendance> allTeacherAttendances = teacherAttendanceDao.findByCourseSchedules(courseIds);
|