|
@@ -9,20 +9,22 @@ import com.ym.mec.biz.dal.enums.*;
|
|
|
import com.ym.mec.biz.dal.page.CourseSalaryQueryInfo4Web;
|
|
|
import com.ym.mec.biz.dal.page.CourseScheduleTeacherSalaryQueryInfo;
|
|
|
import com.ym.mec.biz.dal.page.ExportTeacherSalaryQueryInfo;
|
|
|
+import com.ym.mec.biz.dal.page.TeacherIncomeQueryInfo;
|
|
|
import com.ym.mec.biz.service.*;
|
|
|
import com.ym.mec.common.constant.CommonConstants;
|
|
|
import com.ym.mec.common.dal.BaseDAO;
|
|
|
import com.ym.mec.common.exception.BizException;
|
|
|
import com.ym.mec.common.page.PageInfo;
|
|
|
-import com.ym.mec.common.page.QueryInfo;
|
|
|
import com.ym.mec.common.service.impl.BaseServiceImpl;
|
|
|
import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
|
|
|
import com.ym.mec.util.collection.MapUtil;
|
|
|
import com.ym.mec.util.date.DateUtil;
|
|
|
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.apache.poi.ss.formula.functions.T;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.context.annotation.Lazy;
|
|
|
import org.springframework.data.redis.core.RedisTemplate;
|
|
@@ -32,6 +34,11 @@ import org.springframework.transaction.annotation.Transactional;
|
|
|
import org.springframework.util.CollectionUtils;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
+import java.text.DateFormat;
|
|
|
+import java.time.LocalDate;
|
|
|
+import java.time.format.DateTimeFormatter;
|
|
|
+import java.time.temporal.ChronoField;
|
|
|
+import java.time.temporal.TemporalAdjusters;
|
|
|
import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
@@ -1487,19 +1494,16 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
BigDecimal teacherSalary = courseScheduleTeacherSalary.getExpectSalary();
|
|
|
|
|
|
if(CourseSchedule.CourseScheduleType.MUSIC_NETWORK.equals(courseSchedule.getType())||CourseSchedule.CourseScheduleType.HIGH_ONLINE.equals(courseSchedule.getType())){
|
|
|
- List<String> deductReasons = new ArrayList<>();
|
|
|
+ List<TeacherSalaryDeductReasonDto> deductReasons = new ArrayList<>();
|
|
|
|
|
|
- BigDecimal subsidy = school.getSubsidy();
|
|
|
- if (Objects.isNull(subsidy)) {
|
|
|
- subsidy = new BigDecimal(0);
|
|
|
- }
|
|
|
- if (Objects.isNull(subsidy)) {
|
|
|
- subsidy = new BigDecimal(0);
|
|
|
+ BigDecimal subsidy = new BigDecimal(0);
|
|
|
+ if (Objects.nonNull(school)&&Objects.nonNull(school.getSubsidy())) {
|
|
|
+ subsidy = school.getSubsidy();
|
|
|
}
|
|
|
+
|
|
|
teacherSalary = teacherSalary.add(subsidy);
|
|
|
- if(BigDecimal.ZERO.compareTo(subsidy)!=0){
|
|
|
- deductReasons.add("教学点补贴:" + subsidy);
|
|
|
- }
|
|
|
+
|
|
|
+ BigDecimal expectTeacherSalary = teacherSalary;
|
|
|
|
|
|
//判断课程是否在试用期内
|
|
|
boolean trail = false;
|
|
@@ -1514,7 +1518,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
//如果上课日期在试用期内按80%结算
|
|
|
if(trail){
|
|
|
teacherSalary = teacherSalary.multiply(new BigDecimal("0.8"));
|
|
|
- deductReasons.add("未转正");
|
|
|
+ deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.TRAIL, expectTeacherSalary.subtract(teacherSalary)));
|
|
|
}
|
|
|
|
|
|
//扣除费用
|
|
@@ -1524,7 +1528,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
if(CollectionUtils.isEmpty(teacherAttendances)||Objects.isNull(teacherAttendance.getSignInStatus())){
|
|
|
//未签到扣除全部课酬
|
|
|
deductCost = deductCost.add(teacherSalary.abs());
|
|
|
- deductReasons.add("未签到扣除全部课酬");
|
|
|
+ deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_ERR, teacherSalary.abs()));
|
|
|
}else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignInStatus())){
|
|
|
//异常签到
|
|
|
int signCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignInTime(), courseSchedule.getStartClassTime());
|
|
@@ -1532,18 +1536,18 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
if(signCourseTimeBetween<=1&&signCourseTimeBetween>-3){
|
|
|
//课程开始前1分钟至开始后3分钟进入教室
|
|
|
deductCost = deductCost.add(teacherSalary.divide(new BigDecimal(2)).abs());
|
|
|
- deductReasons.add("课程开始前1分钟至开始后3分钟进入教室扣除一半课酬");
|
|
|
+ deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_ERR, teacherSalary.divide(new BigDecimal(2)).abs()));
|
|
|
}else if(signCourseTimeBetween<=-3){
|
|
|
//课程开始后3分钟后进入教室
|
|
|
deductCost = deductCost.add(teacherSalary.abs());
|
|
|
- deductReasons.add("课程开始后3分钟进入教室扣除全部课酬");
|
|
|
+ deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_ERR, teacherSalary.abs()));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if(CollectionUtils.isEmpty(teacherAttendances)||Objects.isNull(teacherAttendance.getSignOutStatus())){
|
|
|
//未签退扣除一半课酬
|
|
|
deductCost = deductCost.add(teacherSalary.divide(new BigDecimal(2)).abs());
|
|
|
- deductReasons.add("未签退扣除一半课酬");
|
|
|
+ deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_ERR, teacherSalary.divide(new BigDecimal(2)).abs()));
|
|
|
}else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignOutStatus())){
|
|
|
//异常签退
|
|
|
int signOutCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignOutTime(), courseSchedule.getEndClassTime());
|
|
@@ -1552,34 +1556,32 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
if(signOutCourseTimeBetween>3){
|
|
|
//课程开始前20分钟至开始后3分钟退出教室
|
|
|
deductCost = deductCost.add(teacherSalary.abs());
|
|
|
- deductReasons.add("课程结束前3分钟之前退出教室扣除全部课酬");
|
|
|
+// deductReasons.add("课程结束前3分钟之前退出教室扣除全部课酬");
|
|
|
+ deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_ERR, teacherSalary.abs()));
|
|
|
}else if(signOutCourseTimeBetween<=3&&signOutCourseTimeBetween>0){
|
|
|
//课程结束前3分钟后至课程结束前退出教室
|
|
|
deductCost = deductCost.add(teacherSalary.divide(new BigDecimal(2)).abs());
|
|
|
- deductReasons.add("课程结束前3分钟后至课程结束前退出教室扣除一半课酬");
|
|
|
+// deductReasons.add("课程结束前3分钟后至课程结束前退出教室扣除一半课酬");
|
|
|
+ deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_ERR, teacherSalary.divide(new BigDecimal(2)).abs()));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
BigDecimal finalSalary = teacherSalary.subtract(deductCost).setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP);
|
|
|
|
|
|
- if(BigDecimal.ZERO.compareTo(deductCost)<0){
|
|
|
- deductReasons.add("扣除总费用:" + deductCost);
|
|
|
- }
|
|
|
-
|
|
|
//更新教师结算信息
|
|
|
courseScheduleTeacherSalary.setSubsidy(subsidy);
|
|
|
courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary);
|
|
|
+ courseScheduleTeacherSalary.setDeductReasons(deductReasons);
|
|
|
}else{
|
|
|
- List<String> deductReasons = new ArrayList<>();
|
|
|
+ List<TeacherSalaryDeductReasonDto> deductReasons = new ArrayList<>();
|
|
|
|
|
|
BigDecimal subsidy = school.getSubsidy();
|
|
|
if (Objects.isNull(subsidy)) {
|
|
|
subsidy = new BigDecimal(0);
|
|
|
}
|
|
|
teacherSalary = teacherSalary.add(subsidy);
|
|
|
- if(BigDecimal.ZERO.compareTo(subsidy)!=0){
|
|
|
- deductReasons.add("教学点补贴:" + subsidy);
|
|
|
- }
|
|
|
+
|
|
|
+ BigDecimal expectTeacherSalary = teacherSalary;
|
|
|
|
|
|
//判断课程是否在试用期内
|
|
|
boolean trail = false;
|
|
@@ -1594,7 +1596,8 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
//如果上课日期在试用期内按80%结算
|
|
|
if(trail){
|
|
|
teacherSalary = teacherSalary.multiply(new BigDecimal("0.8"));
|
|
|
- deductReasons.add("未转正");
|
|
|
+// deductReasons.add("未转正");
|
|
|
+ deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.TRAIL, expectTeacherSalary.subtract(teacherSalary)));
|
|
|
}
|
|
|
|
|
|
//扣除费用
|
|
@@ -1626,27 +1629,32 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
if(Objects.isNull(teacherAttendance)||Objects.isNull(teacherAttendance.getSignInStatus())){
|
|
|
//无签到记录扣除全部课酬
|
|
|
deductCost = deductCost.add(teacherSalary.abs());
|
|
|
- deductReasons.add("未签到扣除全部课酬");
|
|
|
+// deductReasons.add("未签到扣除全部课酬");
|
|
|
+ deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_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("未提前20分钟打卡扣除50元");
|
|
|
+ deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_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("迟到30分钟内扣除一半课酬");
|
|
|
+ deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_ERR, teacherSalary.divide(new BigDecimal(2)).abs()));
|
|
|
}else if(signCourseTimeBetween<=-30){
|
|
|
//迟到30分钟及以上扣除全部课酬
|
|
|
deductCost = deductCost.add(teacherSalary.abs());
|
|
|
- deductReasons.add("迟到30分钟及以上扣除全部课酬");
|
|
|
+// deductReasons.add("迟到30分钟及以上扣除全部课酬");
|
|
|
+ deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_ERR, teacherSalary.abs()));
|
|
|
}
|
|
|
if(!signInInRange){
|
|
|
//签到经纬度异常扣除50
|
|
|
deductCost = deductCost.add(new BigDecimal(50));
|
|
|
- deductReasons.add("签到经纬度异常扣除50");
|
|
|
+// deductReasons.add("签到经纬度异常扣除50");
|
|
|
+ deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.GPS_ERR, new BigDecimal(50)));
|
|
|
}
|
|
|
}else{
|
|
|
signInInRange = true;
|
|
@@ -1655,22 +1663,26 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
if(Objects.isNull(teacherAttendance)||Objects.isNull(teacherAttendance.getSignOutStatus())){
|
|
|
//未签退扣除全部课酬
|
|
|
deductCost = deductCost.add(teacherSalary.abs());
|
|
|
- deductReasons.add("未签退扣除全部课酬");
|
|
|
+// deductReasons.add("未签退扣除全部课酬");
|
|
|
+ deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_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("早退扣除全部课酬");
|
|
|
+ deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_ERR, teacherSalary.abs()));
|
|
|
}else if((signOutCourseTimeBetween<=3&&signOutCourseTimeBetween>0)||signOutCourseTimeBetween<=3600){
|
|
|
//异常签退,扣除50元
|
|
|
deductCost = deductCost.add(new BigDecimal(50));
|
|
|
- deductReasons.add("异常签退,扣除50元");
|
|
|
+// deductReasons.add("异常签退,扣除50元");
|
|
|
+ deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_ERR, new BigDecimal(50)));
|
|
|
}else{
|
|
|
//签退经纬度异常,扣除50元
|
|
|
deductCost = deductCost.add(new BigDecimal(50));
|
|
|
- deductReasons.add("签退经纬度异常,扣除50元");
|
|
|
+// deductReasons.add("签退经纬度异常,扣除50元");
|
|
|
+ deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_ERR, new BigDecimal(50)));
|
|
|
}
|
|
|
}else{
|
|
|
signOutInRange = true;
|
|
@@ -1679,52 +1691,50 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
if(!signInInRange&&!signOutInRange){
|
|
|
//签到签退GPS定位在指定距离外
|
|
|
deductCost = deductCost.add(teacherSalary.abs());
|
|
|
- deductReasons.add("签到签退GPS定位在指定距离外,扣除全部课酬");
|
|
|
+// deductReasons.add("签到签退GPS定位在指定距离外,扣除全部课酬");
|
|
|
+ deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_ERR, teacherSalary.abs()));
|
|
|
}
|
|
|
|
|
|
BigDecimal finalSalary = teacherSalary.subtract(deductCost).setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP);
|
|
|
|
|
|
- if(BigDecimal.ZERO.compareTo(deductCost)<0){
|
|
|
- deductReasons.add("扣除总费用:" + deductCost);
|
|
|
- }
|
|
|
-
|
|
|
//更新教师结算信息
|
|
|
courseScheduleTeacherSalary.setSubsidy(subsidy);
|
|
|
courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary);
|
|
|
+ courseScheduleTeacherSalary.setDeductReasons(deductReasons);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void calVipCourseTeacherActualSalary(CourseSchedule courseSchedule, CourseScheduleTeacherSalary courseScheduleTeacherSalary,
|
|
|
List<TeacherAttendance> teacherAttendances, School school, Teacher teacher, double attendanceRange) {
|
|
|
- List<String> deductReasons = new ArrayList<>();
|
|
|
+ List<TeacherSalaryDeductReasonDto> deductReasons = new ArrayList<>();
|
|
|
|
|
|
BigDecimal expectSalary = courseScheduleTeacherSalary.getExpectSalary();
|
|
|
|
|
|
- BigDecimal subsidy = school.getSubsidy();
|
|
|
- if (Objects.isNull(subsidy)) {
|
|
|
- subsidy = new BigDecimal(0);
|
|
|
+ BigDecimal subsidy = new BigDecimal(0);
|
|
|
+ if (Objects.nonNull(school)&&Objects.nonNull(school.getSubsidy())) {
|
|
|
+ subsidy = school.getSubsidy();
|
|
|
}
|
|
|
courseScheduleTeacherSalary.setSubsidy(subsidy);
|
|
|
expectSalary = expectSalary.add(subsidy);
|
|
|
- if(BigDecimal.ZERO.compareTo(subsidy)!=0){
|
|
|
- deductReasons.add("教学点补贴:" + subsidy);
|
|
|
- }
|
|
|
+
|
|
|
+ BigDecimal expectTeacherSalary = expectSalary;
|
|
|
|
|
|
//判断课程是否在试用期内
|
|
|
boolean trail = false;
|
|
|
|
|
|
- if(Objects.nonNull(teacher)&&Objects.nonNull(teacher.getEntryDate())&&courseScheduleTeacherSalary.getCourseSchedule().getClassDate().compareTo(teacher.getEntryDate())>=0){
|
|
|
+ if(Objects.nonNull(teacher)&&Objects.nonNull(teacher.getEntryDate())&&courseSchedule.getClassDate().compareTo(teacher.getEntryDate())>=0){
|
|
|
trail = true;
|
|
|
}
|
|
|
- if(Objects.nonNull(teacher)&&Objects.nonNull(teacher.getFormalStaffDate())&&courseScheduleTeacherSalary.getCourseSchedule().getClassDate().compareTo(teacher.getFormalStaffDate())>=0){
|
|
|
+ if(Objects.nonNull(teacher)&&Objects.nonNull(teacher.getFormalStaffDate())&&courseSchedule.getClassDate().compareTo(teacher.getFormalStaffDate())>=0){
|
|
|
trail = false;
|
|
|
}
|
|
|
|
|
|
//如果上课日期在试用期内按80%结算
|
|
|
if(trail){
|
|
|
expectSalary = expectSalary.multiply(new BigDecimal("0.8"));
|
|
|
- deductReasons.add("未转正");
|
|
|
+// deductReasons.add("未转正");
|
|
|
+ deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.TRAIL, expectTeacherSalary.subtract(expectSalary)));
|
|
|
}
|
|
|
|
|
|
//扣除费用
|
|
@@ -1733,88 +1743,92 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
if(CollectionUtils.isEmpty(teacherAttendances)||Objects.isNull(teacherAttendances.get(0).getSignInStatus())){
|
|
|
//未签到扣除全部课酬
|
|
|
deductCost = deductCost.add(expectSalary.abs());
|
|
|
- deductReasons.add("未签到扣除全部课酬");
|
|
|
- }else if(YesOrNoEnum.NO.equals(teacherAttendances.get(0).getSignInStatus())&&TeachModeEnum.ONLINE.equals(courseScheduleTeacherSalary.getCourseSchedule().getTeachMode())){
|
|
|
+// deductReasons.add("未签到扣除全部课酬");
|
|
|
+ deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_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(), courseScheduleTeacherSalary.getCourseSchedule().getStartClassTime());
|
|
|
+ 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("课程开始前1分钟至开始后3分钟进入教室扣除一半课酬");
|
|
|
+ deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_ERR, expectSalary.divide(new BigDecimal(2)).abs()));
|
|
|
}else if(signCourseTimeBetween<=-3){
|
|
|
//课程开始后3分钟后进入教室
|
|
|
deductCost = deductCost.add(expectSalary.abs());
|
|
|
- deductReasons.add("课程开始后3分钟进入教室扣除全部课酬");
|
|
|
+// deductReasons.add("课程开始后3分钟进入教室扣除全部课酬");
|
|
|
+ deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_ERR, expectSalary.abs()));
|
|
|
}
|
|
|
- }else if(YesOrNoEnum.NO.equals(teacherAttendances.get(0).getSignInStatus())&&TeachModeEnum.OFFLINE.equals(courseScheduleTeacherSalary.getCourseSchedule().getTeachMode())){
|
|
|
+ }else if(YesOrNoEnum.NO.equals(teacherAttendances.get(0).getSignInStatus())&&TeachModeEnum.OFFLINE.equals(courseSchedule.getTeachMode())){
|
|
|
deductCost = deductCost.add(expectSalary.abs());
|
|
|
- deductReasons.add("点名时经纬度不在范围内扣除全部课酬");
|
|
|
+// deductReasons.add("点名时经纬度不在范围内扣除全部课酬");
|
|
|
+ deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_ERR, expectSalary.abs()));
|
|
|
}
|
|
|
|
|
|
if(CollectionUtils.isEmpty(teacherAttendances)||Objects.isNull(teacherAttendances.get(0).getSignOutStatus())){
|
|
|
//未签退扣除全部课酬
|
|
|
deductCost = deductCost.add(expectSalary.abs());
|
|
|
- deductReasons.add("未签退扣除全部课酬");
|
|
|
- }else if(YesOrNoEnum.NO.equals(teacherAttendances.get(0).getSignOutStatus())&&TeachModeEnum.ONLINE.equals(courseScheduleTeacherSalary.getCourseSchedule().getTeachMode())){
|
|
|
+// deductReasons.add("未签退扣除全部课酬");
|
|
|
+ deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_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(), courseScheduleTeacherSalary.getCourseSchedule().getEndClassTime());
|
|
|
+ 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("课程结束前3分钟之前退出教室扣除全部课酬");
|
|
|
+ deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_ERR, expectSalary.abs()));
|
|
|
}else if(signOutCourseTimeBetween<=3&&signOutCourseTimeBetween>0){
|
|
|
//课程结束前3分钟后至课程结束前退出教室
|
|
|
deductCost = deductCost.add(expectSalary.divide(new BigDecimal(2)).abs());
|
|
|
- deductReasons.add("课程结束前3分钟后至课程结束前退出教室扣除一半课酬");
|
|
|
+// deductReasons.add("课程结束前3分钟后至课程结束前退出教室扣除一半课酬");
|
|
|
+ deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_ERR, expectSalary.divide(new BigDecimal(2)).abs()));
|
|
|
}
|
|
|
- }else if(YesOrNoEnum.NO.equals(teacherAttendances.get(0).getSignInStatus())&&TeachModeEnum.OFFLINE.equals(courseScheduleTeacherSalary.getCourseSchedule().getTeachMode())){
|
|
|
+ }else if(YesOrNoEnum.NO.equals(teacherAttendances.get(0).getSignInStatus())&&TeachModeEnum.OFFLINE.equals(courseSchedule.getTeachMode())){
|
|
|
deductCost = deductCost.add(expectSalary.abs());
|
|
|
- deductReasons.add("点名时经纬度不在范围内扣除全部课酬");
|
|
|
- }
|
|
|
-
|
|
|
- if(BigDecimal.ZERO.compareTo(deductCost)<0){
|
|
|
- deductReasons.add("扣除总费用:" + deductCost);
|
|
|
+// deductReasons.add("点名时经纬度不在范围内扣除全部课酬");
|
|
|
+ deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_ERR, expectSalary.abs()));
|
|
|
}
|
|
|
|
|
|
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
|
|
|
public void calPracticeTeacherActualSalary(CourseSchedule courseSchedule, CourseScheduleTeacherSalary courseScheduleTeacherSalary,
|
|
|
List<TeacherAttendance> teacherAttendances, School school, Teacher teacher) {
|
|
|
- List<String> deductReasons = new ArrayList<>();
|
|
|
+ List<TeacherSalaryDeductReasonDto> deductReasons = new ArrayList<>();
|
|
|
|
|
|
BigDecimal expectSalary = courseScheduleTeacherSalary.getExpectSalary();
|
|
|
|
|
|
- BigDecimal subsidy = school.getSubsidy();
|
|
|
- if (Objects.isNull(subsidy)) {
|
|
|
- subsidy = new BigDecimal(0);
|
|
|
+ BigDecimal subsidy = new BigDecimal(0);
|
|
|
+ if (Objects.nonNull(school)&&Objects.nonNull(school.getSubsidy())) {
|
|
|
+ subsidy = school.getSubsidy();
|
|
|
}
|
|
|
courseScheduleTeacherSalary.setSubsidy(subsidy);
|
|
|
expectSalary = expectSalary.add(subsidy);
|
|
|
|
|
|
- if(BigDecimal.ZERO.compareTo(subsidy)!=0){
|
|
|
- deductReasons.add("教学点补贴:" + subsidy);
|
|
|
- }
|
|
|
+ BigDecimal expectTeacherSalary = expectSalary;
|
|
|
|
|
|
//判断课程是否在试用期内
|
|
|
boolean trail = false;
|
|
|
|
|
|
- if(Objects.nonNull(teacher)&&Objects.nonNull(teacher.getEntryDate())&&courseScheduleTeacherSalary.getCourseSchedule().getClassDate().compareTo(teacher.getEntryDate())>=0){
|
|
|
+ if(Objects.nonNull(teacher)&&Objects.nonNull(teacher.getEntryDate())&&courseSchedule.getClassDate().compareTo(teacher.getEntryDate())>=0){
|
|
|
trail = true;
|
|
|
}
|
|
|
- if(Objects.nonNull(teacher)&&Objects.nonNull(teacher.getFormalStaffDate())&&courseScheduleTeacherSalary.getCourseSchedule().getClassDate().compareTo(teacher.getFormalStaffDate())>=0){
|
|
|
+ if(Objects.nonNull(teacher)&&Objects.nonNull(teacher.getFormalStaffDate())&&courseSchedule.getClassDate().compareTo(teacher.getFormalStaffDate())>=0){
|
|
|
trail = false;
|
|
|
}
|
|
|
|
|
|
//如果上课日期在试用期内按80%结算
|
|
|
if(trail){
|
|
|
expectSalary = expectSalary.multiply(new BigDecimal("0.8"));
|
|
|
- deductReasons.add("未转正");
|
|
|
+// deductReasons.add("未转正");
|
|
|
+ deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.TRAIL, expectTeacherSalary.subtract(expectSalary)));
|
|
|
}
|
|
|
|
|
|
//扣除费用
|
|
@@ -1827,64 +1841,232 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
if(CollectionUtils.isEmpty(teacherAttendances)||Objects.isNull(teacherAttendance.getSignInStatus())){
|
|
|
//未签到扣除全部课酬
|
|
|
deductCost = deductCost.add(expectSalary.abs());
|
|
|
- deductReasons.add("未签到扣除全部课酬");
|
|
|
+// deductReasons.add("未签到扣除全部课酬");
|
|
|
+ deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_ERR, expectSalary.abs()));
|
|
|
}else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignInStatus())){
|
|
|
//异常签到
|
|
|
- int signCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignInTime(), courseScheduleTeacherSalary.getCourseSchedule().getStartClassTime());
|
|
|
+ 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("课程开始前1分钟至开始后3分钟进入教室扣除一半课酬");
|
|
|
+ deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_ERR, expectSalary.divide(new BigDecimal(2)).abs()));
|
|
|
}else if(signCourseTimeBetween<=-3){
|
|
|
//课程开始后3分钟后进入教室
|
|
|
deductCost = deductCost.add(expectSalary.abs());
|
|
|
- deductReasons.add("课程开始后3分钟进入教室扣除全部课酬");
|
|
|
+// deductReasons.add("课程开始后3分钟进入教室扣除全部课酬");
|
|
|
+ deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_ERR, expectSalary.abs()));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if(CollectionUtils.isEmpty(teacherAttendances)||Objects.isNull(teacherAttendance.getSignOutStatus())){
|
|
|
//未签退扣除全部课酬
|
|
|
deductCost = deductCost.add(expectSalary.abs());
|
|
|
- deductReasons.add("未签退扣除全部课酬");
|
|
|
+// deductReasons.add("未签退扣除全部课酬");
|
|
|
+ deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_ERR, expectSalary.abs()));
|
|
|
}else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignOutStatus())){
|
|
|
//异常签退
|
|
|
- int signOutCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignOutTime(), courseScheduleTeacherSalary.getCourseSchedule().getEndClassTime());
|
|
|
+ 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("课程结束前3分钟之前退出教室扣除全部课酬");
|
|
|
+ deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_ERR, expectSalary.abs()));
|
|
|
}else if(signOutCourseTimeBetween<=3&&signOutCourseTimeBetween>0){
|
|
|
//课程结束前3分钟后至课程结束前退出教室
|
|
|
deductCost = deductCost.add(expectSalary.divide(new BigDecimal(2)).abs());
|
|
|
- deductReasons.add("课程结束前3分钟后至课程结束前退出教室扣除一半课酬");
|
|
|
+// deductReasons.add("课程结束前3分钟后至课程结束前退出教室扣除一半课酬");
|
|
|
+ deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_ERR, expectSalary.divide(new BigDecimal(2)).abs()));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
BigDecimal finalSalary = expectSalary.subtract(deductCost).setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP);
|
|
|
|
|
|
- if(BigDecimal.ZERO.compareTo(deductCost)<0){
|
|
|
- deductReasons.add("扣除总费用:" + deductCost);
|
|
|
- }
|
|
|
-
|
|
|
courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary);
|
|
|
+ courseScheduleTeacherSalary.setDeductReasons(deductReasons);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public TeacherIncomeDto getTeacherSalaryOverview(Integer teacherId) {
|
|
|
- Date now = new Date();
|
|
|
- String monthStr = DateUtil.dateToString(now, "yyyy-MM");
|
|
|
- TeacherIncomeDto teacherSalaryOverview = courseScheduleTeacherSalaryDao.getTeacherSalaryOverview(teacherId, monthStr);
|
|
|
+ public TeacherIncomeReviewDto getTeacherSalaryOverview(Integer teacherId) {
|
|
|
+ LocalDate nowDate = LocalDate.now();
|
|
|
+ LocalDate monthFirstDay = nowDate.with(TemporalAdjusters.firstDayOfMonth());
|
|
|
+ LocalDate monthLastDay = nowDate.with(TemporalAdjusters.lastDayOfMonth());
|
|
|
+
|
|
|
+ TeacherIncomeReviewDto teacherSalaryOverview = courseScheduleTeacherSalaryDao.getTeacherSalaryOverview(teacherId, monthFirstDay.toString(), monthLastDay.toString(), CourseStatusEnum.OVER);
|
|
|
+ if(Objects.isNull(teacherSalaryOverview)){
|
|
|
+ teacherSalaryOverview = new TeacherIncomeReviewDto();
|
|
|
+ }
|
|
|
+
|
|
|
+ List<CourseSchedule> teacherCourses = courseScheduleDao.getTeacherCourseWithClassDate(teacherId, monthFirstDay.toString(), monthLastDay.toString(), CourseStatusEnum.OVER);
|
|
|
+ if(CollectionUtils.isEmpty(teacherCourses)){
|
|
|
+ return teacherSalaryOverview;
|
|
|
+ }
|
|
|
+
|
|
|
+ List<Long> courseIds = teacherCourses.stream().map(CourseSchedule::getId).collect(Collectors.toList());
|
|
|
+
|
|
|
+ //课程教师课酬
|
|
|
+ List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = courseScheduleTeacherSalaryDao.findByCourseSchedules(courseIds);
|
|
|
+ List<CourseScheduleTeacherSalary> teacherSalaries = courseScheduleTeacherSalaries.stream().filter(c -> teacherId.equals(c.getUserId())).collect(Collectors.toList());
|
|
|
+ if(CollectionUtils.isEmpty(teacherSalaries)){
|
|
|
+ return teacherSalaryOverview;
|
|
|
+ }
|
|
|
+
|
|
|
+ Map<Long, CourseSchedule> idCourseMap = teacherCourses.stream().collect(Collectors.toMap(CourseSchedule::getId, c -> c, (c1, c2) -> c1));
|
|
|
+
|
|
|
+ //教学点
|
|
|
+ Set<Integer> schoolIds = teacherCourses.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));
|
|
|
+ }
|
|
|
|
|
|
-// courseScheduleDao.findTeacherCoursesWithDateRangeWithoutMusicGroup()
|
|
|
+ //签到时间范围
|
|
|
+ SysConfig sysConfig = sysConfigService.findByParamName(SysConfigService.ATTENDANCE_RANGE_VIP);
|
|
|
+ double attendanceRange = 0;
|
|
|
+ if(Objects.nonNull(sysConfig)){
|
|
|
+ attendanceRange = Double.valueOf(sysConfig.getParanValue());
|
|
|
+ }
|
|
|
+
|
|
|
+ //教师签到记录
|
|
|
+ List<TeacherAttendance> allTeacherAttendances = teacherAttendanceDao.findByCourseSchedules(courseIds);
|
|
|
+ Map<Long, List<TeacherAttendance>> teacherCourseAttendanceMap = allTeacherAttendances.stream().filter(c->teacherId.equals(c.getTeacherId())).collect(Collectors.groupingBy(TeacherAttendance::getCourseScheduleId));
|
|
|
+
|
|
|
+ //教师信息
|
|
|
+ Set<Integer> teacherIds = teacherSalaries.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 teacherSalary : teacherSalaries) {
|
|
|
+ //课程
|
|
|
+ CourseSchedule courseSchedule = idCourseMap.get(teacherSalary.getCourseScheduleId());
|
|
|
+ //签到记录
|
|
|
+ List<TeacherAttendance> teacherAttendances = teacherCourseAttendanceMap.get(teacherSalary.getCourseScheduleId());
|
|
|
+ //教学点
|
|
|
+ School school = idSchoolMap.get(courseSchedule.getSchoolId());
|
|
|
+ //教师
|
|
|
+ Teacher teacher = idTeacherMap.get(teacherSalary.getUserId());
|
|
|
+
|
|
|
+ switch (courseSchedule.getGroupType()){
|
|
|
+ case MUSIC:
|
|
|
+ calMusicCourseTeacherActualSalary(courseSchedule, teacherSalary, teacherAttendances, school, teacher, attendanceRange);
|
|
|
+ break;
|
|
|
+ case VIP:
|
|
|
+ calVipCourseTeacherActualSalary(courseSchedule, teacherSalary, teacherAttendances, school, teacher, attendanceRange);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case PRACTICE:
|
|
|
+ calPracticeTeacherActualSalary(courseSchedule, teacherSalary, teacherAttendances, school, teacher);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ BigDecimal monthActualIncome = teacherSalaries.stream().map(CourseScheduleTeacherSalary::getActualSalary).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+ teacherSalaryOverview.setThisMonthActualIncome(monthActualIncome);
|
|
|
|
|
|
return teacherSalaryOverview;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void queryTeacherIncomeList(QueryInfo queryInfo) {
|
|
|
-
|
|
|
+ public PageInfo<TeacherIncomeDto> queryTeacherIncomeList(TeacherIncomeQueryInfo queryInfo) {
|
|
|
+ PageInfo<TeacherIncomeDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
|
|
|
+ Map<String, Object> params = new HashMap<String, Object>();
|
|
|
+ MapUtil.populateMap(params, queryInfo);
|
|
|
+
|
|
|
+ int count = courseScheduleDao.countTeacherCourse(params);
|
|
|
+ pageInfo.setTotal(count);
|
|
|
+ params.put("offset", pageInfo.getOffset());
|
|
|
+ List<CourseSchedule> courseSchedules = courseScheduleDao.queryTeacherCourse(params);
|
|
|
+
|
|
|
+ List<TeacherIncomeDto> dataList = new ArrayList<>();
|
|
|
+ if (!CollectionUtils.isEmpty(courseSchedules)) {
|
|
|
+ List<Long> courseIds = courseSchedules.stream().map(CourseSchedule::getId).collect(Collectors.toList());
|
|
|
+
|
|
|
+ //课程教师课酬
|
|
|
+ List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = courseScheduleTeacherSalaryDao.findByCourseSchedules(courseIds);
|
|
|
+ List<CourseScheduleTeacherSalary> teacherSalaries = courseScheduleTeacherSalaries.stream().filter(c -> queryInfo.getTeacherId().equals(c.getUserId())).collect(Collectors.toList());
|
|
|
+
|
|
|
+ Map<Long, CourseSchedule> idCourseMap = courseSchedules.stream().collect(Collectors.toMap(CourseSchedule::getId, c -> c, (c1, c2) -> c1));
|
|
|
+
|
|
|
+ //教学点
|
|
|
+ Set<Integer> schoolIds = courseSchedules.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));
|
|
|
+ }
|
|
|
+
|
|
|
+ //签到时间范围
|
|
|
+ SysConfig sysConfig = sysConfigService.findByParamName(SysConfigService.ATTENDANCE_RANGE_VIP);
|
|
|
+ double attendanceRange = 0;
|
|
|
+ if(Objects.nonNull(sysConfig)){
|
|
|
+ attendanceRange = Double.valueOf(sysConfig.getParanValue());
|
|
|
+ }
|
|
|
+
|
|
|
+ //教师签到记录
|
|
|
+ List<TeacherAttendance> allTeacherAttendances = teacherAttendanceDao.findByCourseSchedules(courseIds);
|
|
|
+ Map<Long, List<TeacherAttendance>> teacherCourseAttendanceMap = allTeacherAttendances.stream().filter(c->queryInfo.getTeacherId().equals(c.getTeacherId())).collect(Collectors.groupingBy(TeacherAttendance::getCourseScheduleId));
|
|
|
+
|
|
|
+ //教师信息
|
|
|
+ Set<Integer> teacherIds = teacherSalaries.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 teacherSalary : teacherSalaries) {
|
|
|
+ //课程
|
|
|
+ CourseSchedule courseSchedule = idCourseMap.get(teacherSalary.getCourseScheduleId());
|
|
|
+ //签到记录
|
|
|
+ List<TeacherAttendance> teacherAttendances = teacherCourseAttendanceMap.get(teacherSalary.getCourseScheduleId());
|
|
|
+ //教学点
|
|
|
+ School school = idSchoolMap.get(courseSchedule.getSchoolId());
|
|
|
+ //教师
|
|
|
+ Teacher teacher = idTeacherMap.get(teacherSalary.getUserId());
|
|
|
+
|
|
|
+ switch (courseSchedule.getGroupType()){
|
|
|
+ case MUSIC:
|
|
|
+ calMusicCourseTeacherActualSalary(courseSchedule, teacherSalary, teacherAttendances, school, teacher, attendanceRange);
|
|
|
+ break;
|
|
|
+ case VIP:
|
|
|
+ calVipCourseTeacherActualSalary(courseSchedule, teacherSalary, teacherAttendances, school, teacher, attendanceRange);
|
|
|
+ break;
|
|
|
+ case PRACTICE:
|
|
|
+ calPracticeTeacherActualSalary(courseSchedule, teacherSalary, teacherAttendances, school, teacher);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ TeacherIncomeDto teacherIncomeInfo = new TeacherIncomeDto();
|
|
|
+ BeanUtils.copyProperties(courseSchedule, teacherIncomeInfo);
|
|
|
+ teacherIncomeInfo.setExpectSalary(teacherSalary.getExpectSalary());
|
|
|
+ teacherIncomeInfo.setSubsidy(teacherSalary.getSubsidy());
|
|
|
+ teacherIncomeInfo.setActualSalary(teacherSalary.getActualSalary());
|
|
|
+ teacherIncomeInfo.setDeductReasons(teacherSalary.getDeductReasons());
|
|
|
+ teacherIncomeInfo.setTeacherAttendance(teacherAttendances.get(0));
|
|
|
+ dataList.add(teacherIncomeInfo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ pageInfo.setRows(dataList);
|
|
|
+ return pageInfo;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Map<String, BigDecimal> teacherIncomeStat(Integer teacherId, Integer year) {
|
|
|
+ List<Map<String, BigDecimal>> monthIncomeMapList = courseScheduleTeacherSalaryDao.teacherIncomeStat(teacherId, year);
|
|
|
+ Map<String, BigDecimal> monthIncomeMap = MapUtil.convertIntegerMap(monthIncomeMapList);
|
|
|
+ LocalDate now = LocalDate.now();
|
|
|
+ DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM");
|
|
|
+
|
|
|
+ LocalDate startDate = LocalDate.of(year, 1, 1);
|
|
|
+ while (startDate.compareTo(now)<=0&&year.equals(startDate.get(ChronoField.YEAR))){
|
|
|
+ String monthStr = dateFormatter.format(startDate);
|
|
|
+ if(!monthIncomeMap.containsKey(monthStr)){
|
|
|
+ monthIncomeMap.put(monthStr, BigDecimal.ZERO);
|
|
|
+ }
|
|
|
+ startDate = startDate.plusMonths(1);
|
|
|
+ }
|
|
|
+
|
|
|
+ return monthIncomeMap;
|
|
|
}
|
|
|
}
|