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