Explorar o código

feat:线下课考勤调整

Joburgess %!s(int64=4) %!d(string=hai) anos
pai
achega
e219a2d88f

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleTeacherSalaryService.java

@@ -157,4 +157,14 @@ public interface CourseScheduleTeacherSalaryService extends BaseService<Long, Co
      */
     void closeSalaryConfirm(String month);
 
+    /**
+     * @describe 创建教师课程课酬记录
+     * @author Joburgess
+     * @date 2020.10.22
+     * @param courseSchedule: 课程计划
+     * @param teacherIds: 教师编号列表
+     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary>
+     */
+    List<CourseScheduleTeacherSalary> createTeacherCourseSalary(CourseSchedule courseSchedule, List<Integer> teacherIds);
+
 }

+ 124 - 77
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java

@@ -30,6 +30,8 @@ import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
 import java.math.BigDecimal;
+import java.time.Duration;
+import java.time.LocalDateTime;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -1098,6 +1100,43 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         teacherCourseRewardDao.updateTeacherRewardConfirmStatusWithMonth(month, null, TeacherSalaryConfirmStatus.COMPLETED);
     }
 
+    @Override
+    public List<CourseScheduleTeacherSalary> createTeacherCourseSalary(CourseSchedule courseSchedule, List<Integer> teacherIds) {
+        if(Objects.isNull(courseSchedule.getType())){
+            throw new BizException("请指定课程类型");
+        }
+
+        List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = new ArrayList<>();
+        Date now = new Date();
+        for (Integer teacherId : teacherIds) {
+            CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
+            courseScheduleTeacherSalary.setGroupType(courseSchedule.getGroupType());
+            courseScheduleTeacherSalary.setMusicGroupId(courseSchedule.getMusicGroupId());
+            courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
+            courseScheduleTeacherSalary.setClassGroupId(courseSchedule.getClassGroupId());
+            if(teacherId.equals(courseSchedule.getActualTeacherId())){
+                courseScheduleTeacherSalary.setTeacherRole(TeachTypeEnum.BISHOP);
+            }else{
+                courseScheduleTeacherSalary.setTeacherRole(TeachTypeEnum.TEACHING);
+            }
+            courseScheduleTeacherSalary.setUserId(teacherId);
+            courseScheduleTeacherSalary.setCreateTime(now);
+            courseScheduleTeacherSalary.setUpdateTime(now);
+        }
+        switch (courseSchedule.getGroupType()){
+            case MUSIC:
+                createMusicGroupCourseTeacerSalary(courseSchedule, courseScheduleTeacherSalaries);
+                break;
+            case VIP:
+                //生成vip课课酬
+                break;
+            case PRACTICE:
+                //生成网管课课酬
+                break;
+        }
+        return courseScheduleTeacherSalaries;
+    }
+
     /**
      * @describe 创建课程指定教师的课酬记录-乐团课
      * @author Joburgess
@@ -1110,83 +1149,91 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         MusicGroup musicGroup = musicGroupDao.get(courseSchedule.getMusicGroupId());
 
         List<Integer> teacherIds = courseScheduleTeacherSalaries.stream().map(CourseScheduleTeacherSalary::getUserId).collect(Collectors.toList());
-        teacherDefaultMusicGroupSalaryDao.findByTeacher(teacherIds);
 
-//        List<TeacherDefaultMusicGroupSalary> teacherSalaryList = teacherDefaultMusicGroupSalaryService.getTeacherSalaryByUserIdAndType(classGroupTeacherMapper.getUserId(), null, null);
-//
-//        BigDecimal salary;
-//
-//        Map<CourseSchedule.CourseScheduleType, TeacherDefaultMusicGroupSalary> collect = teacherSalaryList.stream().collect(Collectors.toMap(TeacherDefaultMusicGroupSalary::getCourseScheduleType, teacherDefaultMusicGroupSalary -> teacherDefaultMusicGroupSalary));
-//
-//        TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary = collect.get(classGroup4MixDto.getCourseType());
-//
-//        Teacher teacher = teacherMap.get(classGroupTeacherMapper.getUserId());
-//        if (teacherDefaultMusicGroupSalary == null) {
-//            throw new BizException("请设置" + teacher.getRealName() + "老师的" + classGroup4MixDto.getCourseType().getMsg() + "课酬");
-//        }
-//
-//        //对应基准课酬
-//        BigDecimal baseSalary = new BigDecimal(0), classTimeDuty = new BigDecimal(0);
-//
-//        SalarySettlementTypeEnum settlementType = musicGroup.getSettlementType();
-//        if (Objects.nonNull(teacher.getEntryDate())
-//                && (teacher.getEntryDate().after(entryDate) || teacher.getEntryDate().getTime() == entryDate.getTime())) {
-//            settlementType = SalarySettlementTypeEnum.GRADIENT_SALARY;
-//        }
-//
-//        //基准课酬
-//        if (settlementType.equals(SalarySettlementTypeEnum.TEACHER_DEFAULT) && teacherDefaultMusicGroupSalary != null) {
-//            //课程时长与结算单位时长占比
-//            classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(30), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
-//            baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
-//        }
-//        //阶梯课酬
-//        if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY) && teacherDefaultMusicGroupSalary != null) {
-//            //课程时长与结算单位时长占比
-//            classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(90), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
-//            baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
-//        }
-//
-//        //课堂课课酬改为按分钟数计算,并且时长占比向下取整
-//        if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)){
-//            baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
-//            classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(40), BigDecimal.ZERO.intValue(), BigDecimal.ROUND_DOWN);
-//        }
-//
-//        salary = baseSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
-//
-//        //基础技能提高课
-//        if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
-//            salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
-//            if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY)) {
-//                salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
-//            }
-//        }
-//        //线上小班课
-//        if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.HIGH_ONLINE)) {
-//            Integer studentNum = classGroupStudentMapperDao.countClassGroupNormalStudentNum(classGroupTeacherMapper.getClassGroupId());
-//            if (studentNum < 3 || studentNum > 5) {
-//                String numWaring = studentNum < 3 ? "人数不能小于3," : "人数不能大于5,";
-//                throw new BizException(classGroup.getName() + numWaring + "请调整");
-//            }
-//            salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal(studentNum.toString());
-//        }
-//
-//        if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.MUSIC_NETWORK)) {
-//            salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal("1");
-//        }
-//
-//        CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
-//        courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
-//        courseScheduleTeacherSalary.setGroupType(courseSchedule.getGroupType());
-//        courseScheduleTeacherSalary.setMusicGroupId(courseSchedule.getMusicGroupId());
-//        courseScheduleTeacherSalary.setTeacherRole(classGroupTeacherMapper.getTeacherRole());
-//        courseScheduleTeacherSalary.setUserId(classGroupTeacherMapper.getUserId());
-//        courseScheduleTeacherSalary.setExpectSalary(salary);
-//        courseScheduleTeacherSalary.setClassGroupId(classGroup.getId());
-//        courseScheduleTeacherSalary.setCreateTime(date);
-//        courseScheduleTeacherSalary.setUpdateTime(date);
-//        courseScheduleTeacherSalaryList.add(courseScheduleTeacherSalary);
-        return null;
+        List<Teacher> teachers = teacherDao.findByTeacherIds(teacherIds);
+        Map<Integer, Teacher> teacherMap = teachers.stream().collect(Collectors.toMap(Teacher::getId, teacher -> teacher));
+
+        List<TeacherDefaultMusicGroupSalary> allTeacherDefaultMusicGroupSalary = teacherDefaultMusicGroupSalaryDao.findByTeacher(teacherIds);
+        Map<Integer, List<TeacherDefaultMusicGroupSalary>> teacherSalaryMap = allTeacherDefaultMusicGroupSalary.stream().collect(Collectors.groupingBy(TeacherDefaultMusicGroupSalary::getUserId));
+
+        Date now = new Date();
+        Date entryDate = DateUtil.stringToDate(sysConfigDao.findByParamName(SysConfigService.TEACHER_ENTRY_DATE).getParanValue(), "yyyy-MM-dd");
+
+        long classCourseDuration = DateUtil.minutesBetween(courseSchedule.getStartClassTime(), courseSchedule.getEndClassTime());
+
+        for (CourseScheduleTeacherSalary courseScheduleTeacherSalary : courseScheduleTeacherSalaries) {
+            List<TeacherDefaultMusicGroupSalary> teacherSalaryList = teacherSalaryMap.get(courseScheduleTeacherSalary.getUserId());
+
+            BigDecimal salary;
+
+            Map<CourseSchedule.CourseScheduleType, TeacherDefaultMusicGroupSalary> collect = teacherSalaryList.stream().collect(Collectors.toMap(TeacherDefaultMusicGroupSalary::getCourseScheduleType, teacherDefaultMusicGroupSalary -> teacherDefaultMusicGroupSalary));
+
+            TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary = collect.get(courseSchedule.getType());
+
+            Teacher teacher = teacherMap.get(courseScheduleTeacherSalary.getUserId());
+            if (teacherDefaultMusicGroupSalary == null) {
+                throw new BizException("请设置" + teacher.getRealName() + "老师的" + courseSchedule.getType().getMsg() + "课酬");
+            }
+
+            //对应基准课酬
+            BigDecimal baseSalary = new BigDecimal(0), classTimeDuty = new BigDecimal(0);
+
+            SalarySettlementTypeEnum settlementType = musicGroup.getSettlementType();
+            if (Objects.nonNull(teacher.getEntryDate())
+                    && (teacher.getEntryDate().after(entryDate) || teacher.getEntryDate().getTime() == entryDate.getTime())) {
+                settlementType = SalarySettlementTypeEnum.GRADIENT_SALARY;
+            }
+
+            //基准课酬
+            if (settlementType.equals(SalarySettlementTypeEnum.TEACHER_DEFAULT) && teacherDefaultMusicGroupSalary != null) {
+                //课程时长与结算单位时长占比
+                classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(30), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
+                baseSalary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+            }
+            //阶梯课酬
+            if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY) && teacherDefaultMusicGroupSalary != null) {
+                //课程时长与结算单位时长占比
+                classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(90), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
+                baseSalary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
+            }
+
+            //课堂课课酬改为按分钟数计算,并且时长占比向下取整
+            if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)){
+                baseSalary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+                classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(40), BigDecimal.ZERO.intValue(), BigDecimal.ROUND_DOWN);
+            }
+
+            salary = baseSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
+
+            //基础技能提高课
+            if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
+                salary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+                if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY)) {
+                    salary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
+                }
+            }
+            //线上小班课
+            if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH_ONLINE)) {
+                Integer studentNum = classGroupStudentMapperDao.countClassGroupNormalStudentNum(courseSchedule.getClassGroupId());
+                if (studentNum < 3 || studentNum > 5) {
+                    String numWaring = studentNum < 3 ? "小班课人数不能小于3," : "小班课人数不能大于5,";
+                    throw new BizException( numWaring + "请调整");
+                }
+                salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal(studentNum.toString());
+            }
+
+            if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.MUSIC_NETWORK)) {
+                salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal("1");
+            }
+
+            courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
+            courseScheduleTeacherSalary.setGroupType(courseSchedule.getGroupType());
+            courseScheduleTeacherSalary.setMusicGroupId(courseSchedule.getMusicGroupId());
+            courseScheduleTeacherSalary.setExpectSalary(salary);
+            courseScheduleTeacherSalary.setClassGroupId(courseSchedule.getClassGroupId());
+            courseScheduleTeacherSalary.setCreateTime(now);
+            courseScheduleTeacherSalary.setUpdateTime(now);
+        }
+        return courseScheduleTeacherSalaries;
     }
 }

+ 2 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java

@@ -112,6 +112,7 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 		teacherAttendance.setRemark(teacherSignOutDto.getTeacherAttendanceInfo().getRemark());
 		teacherAttendance.setSignOutRemark(teacherSignOutDto.getTeacherAttendanceInfo().getSignOutRemark());
 		int advanceSignMinutes = Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ADVANCE_SIGN_IN_MINUTES));
+		int advanceSignOutMinutes = Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ADVANCE_SIGN_OUT_MINUTES));
 		int offlineSignInEarlyForwardTime = Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.OFFLINE_SIGN_IN_EARLY_FORWARD_TIME));
 
 		CourseSchedule courseSchedule = courseScheduleDao.get(teacherAttendance.getCourseScheduleId());
@@ -134,7 +135,7 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 		//上课时间
 		Date classStartDateTime = DateUtil.stringToDate(classDate + " " + startClassTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
 		Date classEndDateTime = DateUtil.stringToDate(classDate + " " + endClassTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
-		Date classEndDateAdd60Minutes = DateUtil.addMinutes(classEndDateTime, 60);
+		Date classEndDateAdd60Minutes = DateUtil.addMinutes(classEndDateTime, advanceSignOutMinutes);
 		Date add60Minutes = DateUtil.addMinutes(classStartDateTime, offlineSignInEarlyForwardTime * -1);
 		Date add20Minutes = DateUtil.addMinutes(classStartDateTime, advanceSignMinutes * -1);
 		if(teacherAttendance.getSignInTime() == null && teacherSignOutDto.getTeacherAttendanceInfo().getStatus().equals(SignStatusEnum.SIGN_IN.getCode())){