| 
					
				 | 
			
			
				@@ -2,6 +2,7 @@ package com.ym.mec.biz.service.impl; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.alibaba.fastjson.JSON; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.alibaba.fastjson.JSONObject; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.ym.mec.auth.api.entity.SysUser; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ym.mec.biz.dal.dao.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ym.mec.biz.dal.dto.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ym.mec.biz.dal.entity.*; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -9,6 +10,7 @@ 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; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -20,8 +22,10 @@ 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; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -31,6 +35,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; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -264,7 +273,6 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 trail = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             //如果上课日期在试用期内按80%结算 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if(trail){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 expectSalary = expectSalary.multiply(new BigDecimal("0.8")); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -503,7 +511,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        SysConfig sysConfig = sysConfigService.findByParamName(SysConfigService.ATTENDANCE_RANGE_VIP); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        SysConfig sysConfig = sysConfigService.findByParamName(SysConfigService.ATTENDANCE_RANGE); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         double attendanceRange = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if(Objects.nonNull(sysConfig)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             attendanceRange = Double.valueOf(sysConfig.getParanValue()); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -774,7 +782,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     //早退 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     deductCost = deductCost.add(teacherSalary.abs()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     deductReasons.add("早退扣除全部课酬"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                }else if((signOutCourseTimeBetween<=3&&signOutCourseTimeBetween>0)||signOutCourseTimeBetween<=3600){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }else if((signOutCourseTimeBetween<=3&&signOutCourseTimeBetween>0)||signOutCourseTimeBetween>=3600){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     //异常签退,扣除50元 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     deductCost = deductCost.add(new BigDecimal(50)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     deductReasons.add("异常签退,扣除50元"); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1409,6 +1417,54 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void salaryMarkNew(Date startDay) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Date now = new Date(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Date date = DateUtil.addMonths(now, -1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(Objects.nonNull(startDay)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            date = startDay; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String startDate = DateUtil.format(DateUtil.getFirstDayOfMonth(date),DateUtil.DEFAULT_PATTERN); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String endDate = DateUtil.format(DateUtil.getLastDayOfMonth(date),DateUtil.DEFAULT_PATTERN); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        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(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            BigDecimal teacherBaseSalaryAmount = new BigDecimal("0"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            teacherSalaries.sort(Comparator.comparing(ts->ts.getCourseSchedule().getStartClassTime())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for (CourseScheduleTeacherSalary teacherSalary : teacherSalaries) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if(teacherBaseSalaryAmount.compareTo(dayaBaseSalaryAmount)>=0){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                teacherBaseSalaryAmount = teacherBaseSalaryAmount.add(teacherSalary.getActualSalary()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                courseScheduleTeacherSalary.setId(teacherSalary.getId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                courseScheduleTeacherSalary.setBelongToDaya(true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                updateRecords.add(courseScheduleTeacherSalary); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(!CollectionUtils.isEmpty(updateRecords)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            courseScheduleTeacherSalaryDao.batchUpdate(updateRecords); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Transactional(rollbackFor = Exception.class) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public void salaryMark() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         Date now = new Date(); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1497,4 +1553,738 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return result.get(0).get(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void calMusicCourseTeacherActualSalary(CourseSchedule courseSchedule, CourseScheduleTeacherSalary courseScheduleTeacherSalary, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                  List<TeacherAttendance> teacherAttendances, School school, Teacher teacher, double attendanceRange) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        BigDecimal teacherSalary = courseScheduleTeacherSalary.getExpectSalary(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(CourseSchedule.CourseScheduleType.MUSIC_NETWORK.equals(courseSchedule.getType())||CourseSchedule.CourseScheduleType.HIGH_ONLINE.equals(courseSchedule.getType())){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            List<TeacherSalaryDeductReasonDto> deductReasons = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            BigDecimal subsidy = new BigDecimal(0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (Objects.nonNull(school)&&Objects.nonNull(school.getSubsidy())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                subsidy = school.getSubsidy(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            teacherSalary = teacherSalary.add(subsidy); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            teacherSalary = teacherSalary.add(subsidy); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            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.setSubsidy(subsidy); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            courseScheduleTeacherSalary.setDeductReasons(deductReasons); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            List<TeacherSalaryDeductReasonDto> deductReasons = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            BigDecimal subsidy = new BigDecimal(0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (Objects.nonNull(school)&&Objects.nonNull(school.getSubsidy())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                subsidy = school.getSubsidy(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            teacherSalary = teacherSalary.add(subsidy); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            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("未转正"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.TRAIL, expectTeacherSalary.subtract(teacherSalary))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //扣除费用 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            BigDecimal deductCost = BigDecimal.ZERO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            TeacherAttendance teacherAttendance = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(!CollectionUtils.isEmpty(teacherAttendances)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                teacherAttendance = teacherAttendances.get(0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            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; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                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())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if(!signInInRange){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    //签到经纬度异常扣除50 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    deductCost = deductCost.add(new BigDecimal(50)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                    deductReasons.add("签到经纬度异常扣除50"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    gpsDeductAmount =  new BigDecimal(50); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }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); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }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.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<TeacherSalaryDeductReasonDto> deductReasons = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        BigDecimal expectSalary = courseScheduleTeacherSalary.getExpectSalary(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        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(expectSalary)>0){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            expectSalary = new BigDecimal(0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        BigDecimal expectTeacherSalary = expectSalary; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //判断课程是否在试用期内 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        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){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            expectSalary = expectSalary.multiply(new BigDecimal("0.8")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            deductReasons.add("未转正"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            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 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<TeacherSalaryDeductReasonDto> deductReasons = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        BigDecimal expectSalary = courseScheduleTeacherSalary.getExpectSalary(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        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(expectSalary)>0){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            expectSalary = new BigDecimal(0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        BigDecimal expectTeacherSalary = expectSalary; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //判断课程是否在试用期内 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        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){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            expectSalary = expectSalary.multiply(new BigDecimal("0.8")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            deductReasons.add("未转正"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.TRAIL, expectTeacherSalary.subtract(expectSalary))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //扣除费用 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        BigDecimal deductCost = new BigDecimal(0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        TeacherAttendance teacherAttendance = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(!CollectionUtils.isEmpty(teacherAttendances)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            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())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        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 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(), "2021-03-01", null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(Objects.isNull(teacherSalaryOverview)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            teacherSalaryOverview = new TeacherIncomeReviewDto(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(BigDecimal.ZERO.compareTo(teacherSalaryOverview.getThisMonthExpectIncome())>0){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            teacherSalaryOverview.setThisMonthExpectIncome(BigDecimal.ZERO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        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)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //签到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()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //教师签到记录 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        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, vipAttendanceRange); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    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); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        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()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(monthActualIncome.compareTo(dayaBaseSalaryAmount)>0){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            teacherSalaryOverview.setDayaIncome(dayaBaseSalaryAmount); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            teacherSalaryOverview.setOtherIncome(monthActualIncome.subtract(dayaBaseSalaryAmount)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            teacherSalaryOverview.setDayaIncome(monthActualIncome); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        teacherSalaryOverview.setAttendanceRange(attendanceRange); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        teacherSalaryOverview.setVipAttendanceRange(vipAttendanceRange); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return teacherSalaryOverview; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    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)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //签到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()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //教师签到记录 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            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()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                BigDecimal oldSalary = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                BigDecimal oldSubsidy = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if(Objects.nonNull(teacherSalary.getSettlementTime())){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    oldSalary = teacherSalary.getActualSalary(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    oldSubsidy = teacherSalary.getSubsidy(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                switch (courseSchedule.getGroupType()){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    case MUSIC: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        calMusicCourseTeacherActualSalary(courseSchedule, teacherSalary, teacherAttendances, school, teacher, attendanceRange); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    case VIP: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        calVipCourseTeacherActualSalary(courseSchedule, teacherSalary, teacherAttendances, school, teacher, vipAttendanceRange); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    case PRACTICE: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        calPracticeTeacherActualSalary(courseSchedule, teacherSalary, teacherAttendances, school, teacher); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                TeacherIncomeDto teacherIncomeInfo = new TeacherIncomeDto(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                BeanUtils.copyProperties(courseSchedule, teacherIncomeInfo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                teacherIncomeInfo.setExpectSalary(teacherSalary.getExpectSalary()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                teacherIncomeInfo.setSubsidy(Objects.nonNull(oldSalary)?oldSubsidy:teacherSalary.getSubsidy()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                teacherIncomeInfo.setActualSalary(Objects.nonNull(oldSalary)?oldSalary:teacherSalary.getActualSalary()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                teacherIncomeInfo.setExpectIncome(teacherIncomeInfo.getExpectSalary().add(teacherIncomeInfo.getSubsidy())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if(BigDecimal.ZERO.compareTo(teacherIncomeInfo.getExpectIncome())>0){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    teacherIncomeInfo.setExpectIncome(BigDecimal.ZERO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //如果是已结算课程,则需要处理扣减原因 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if(Objects.nonNull(oldSalary)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    //判断课程是否在试用期内 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    boolean trail = StringUtils.isNotBlank(teacherSalary.getDeductionReason())&&teacherSalary.getDeductionReason().indexOf("未转正")!=-1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    //如果上课日期在试用期内按80%结算 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if(trail){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        long trailReasonNum = teacherSalary.getDeductReasons().stream().filter(p -> DeductReasonEnum.TRAIL.equals(p.getDeductReason())).count(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if(trailReasonNum<=0){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            teacherSalary.getDeductReasons().add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.TRAIL, teacherIncomeInfo.getExpectIncome().subtract(teacherIncomeInfo.getExpectIncome().multiply(new BigDecimal("0.8"))))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        teacherSalary.setDeductReasons(teacherSalary.getDeductReasons().stream().filter(p->!DeductReasonEnum.TRAIL.equals(p.getDeductReason())).collect(Collectors.toList())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                teacherIncomeInfo.setDeductReasons(teacherSalary.getDeductReasons()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                teacherIncomeInfo.setTeacherAttendance(teacherAttendances.get(0)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if(Objects.nonNull(school)&&Objects.nonNull(teacherIncomeInfo.getTeacherAttendance())){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    teacherIncomeInfo.getTeacherAttendance().setSchoolLongitudeLatitude(school.getLongitudeLatitude()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                teacherIncomeInfo.setBelongToDaya(teacherSalary.getBelongToDaya()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                teacherIncomeInfo.setSortNum(courseSchedule.getStartClassTime().getTime()+courseSchedule.getId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                dataList.add(teacherIncomeInfo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        dataList.sort(Comparator.comparing(TeacherIncomeDto::getSortNum).reversed()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        pageInfo.setRows(dataList); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return pageInfo; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public Map<String, Object> teacherIncomeStat(Integer teacherId, Integer year, Integer month) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(Objects.isNull(year)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            year = LocalDate.now().get(ChronoField.YEAR); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Map<String, Object> result = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        result.put("total", BigDecimal.ZERO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        result.put("salary", BigDecimal.ZERO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        LocalDate minDate = LocalDate.of(2021, 3, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        LocalDate startDate = LocalDate.of(year, Objects.isNull(month)?1:month, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(year<=2021&&Objects.isNull(month)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            startDate = startDate.withMonth(3); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        result.put("total", BigDecimal.ZERO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        result.put("salary", BigDecimal.ZERO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        result.put("data", Collections.emptyList()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(startDate.compareTo(minDate)<0){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<LocalDateBigDecimalMapDto> monthIncomeMapList = courseScheduleTeacherSalaryDao.teacherIncomeStat(teacherId, year, month); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(CollectionUtils.isEmpty(monthIncomeMapList)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(Objects.isNull(month)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Set<String> months = monthIncomeMapList.stream().map(e -> DateUtil.dateToString(e.getDate(), "yyyy-MM")).collect(Collectors.toSet()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            LocalDate now = LocalDate.now(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            now = now.plusMonths(-1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            while (startDate.compareTo(now)<=0&&year.equals(startDate.get(ChronoField.YEAR))){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                String dateStr = dateFormatter.format(startDate); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if(!months.contains(dateStr)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    monthIncomeMapList.add(new LocalDateBigDecimalMapDto(Date.from(startDate.atStartOfDay(DateUtil.zoneId).toInstant()), dateStr, BigDecimal.ZERO)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                startDate = startDate.plusMonths(1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Set<String> dates = monthIncomeMapList.stream().map(e -> DateUtil.dateToString(e.getDate(), "yyyy-MM-dd")).collect(Collectors.toSet()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Integer oldMonth = Objects.isNull(month)?new Integer(1):month; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            while (oldMonth.equals(startDate.get(ChronoField.MONTH_OF_YEAR))){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                String dateStr = DateUtil.dateFormatter.format(startDate); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if(!dates.contains(dateStr)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    monthIncomeMapList.add(new LocalDateBigDecimalMapDto(Date.from(startDate.atStartOfDay(DateUtil.zoneId).toInstant()), dateStr, BigDecimal.ZERO)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                startDate = startDate.plusDays(1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        monthIncomeMapList.sort(Comparator.comparing(LocalDateBigDecimalMapDto::getDate)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        BigDecimal reduce = monthIncomeMapList.stream().map(LocalDateBigDecimalMapDto::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        result.put("total", reduce); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        result.put("salary", reduce); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        result.put("data", monthIncomeMapList); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void todayIncomeRemind() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<Integer> teacherIds = courseScheduleTeacherSalaryDao.getTodayHasCourseTeacherIds(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(CollectionUtils.isEmpty(teacherIds)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Map<Integer, String> userMap = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (Integer teacherId : teacherIds) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            userMap.put(teacherId, teacherId.toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        sysMessageService.batchPushMessage(MessageTypeEnum.TEACHER_INCOME_REMIND, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                userMap, null, 0, "12", "TEACHER","income_remind.mp3","income_remind_channel"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |