Sfoglia il codice sorgente

Merge branch 'master' of http://git.dayaedu.com/yonge/mec

yonge 4 anni fa
parent
commit
6ead2031be

+ 38 - 27
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupStudentMapperServiceImpl.java

@@ -86,7 +86,7 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
     private CourseScheduleDao courseScheduleDao;
     @Autowired
     private ClassGroupDao classGroupDao;
-    
+
     @Autowired
     private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
 
@@ -104,7 +104,7 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public boolean delClassGroupStudent(Integer userId, Integer classGroupId,Boolean quitMusicGroup) {
+    public boolean delClassGroupStudent(Integer userId, Integer classGroupId, Boolean quitMusicGroup) {
         ClassGroup classGroup = classGroupService.get(classGroupId);
         Integer studentNum = classGroupStudentMapperDao.countClassGroupNormalStudentNum(classGroupId);
         /*if (!quitMusicGroup && classGroup.getType().equals(ClassGroupTypeEnum.HIGH_ONLINE) && studentNum <= 3) {
@@ -131,9 +131,9 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
         List<CourseSchedule> courseScheduleList = courseScheduleService.findNoStartCoursesByClassGroupId(classGroupId);
         if (courseScheduleList.size() > 0) {
 
-            List<Long> tempMergedCourseIdList = courseScheduleList.stream().map(CourseSchedule :: getId).collect(Collectors.toList());
-            if(tempMergedCourseIdList != null && tempMergedCourseIdList.size() > 0){
-            	courseScheduleStudentPaymentDao.deleteStudentCourseSchedule(userId, tempMergedCourseIdList);
+            List<Long> tempMergedCourseIdList = courseScheduleList.stream().map(CourseSchedule::getId).collect(Collectors.toList());
+            if (tempMergedCourseIdList != null && tempMergedCourseIdList.size() > 0) {
+                courseScheduleStudentPaymentDao.deleteStudentCourseSchedule(userId, tempMergedCourseIdList);
             }
         }
 
@@ -153,8 +153,8 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
                     }
                     Map<CourseSchedule.CourseScheduleType, TeacherDefaultMusicGroupSalary> collect = teacherSalaryList.stream().collect(Collectors.toMap(TeacherDefaultMusicGroupSalary::getCourseScheduleType, teacherDefaultMusicGroupSalary -> teacherDefaultMusicGroupSalary));
                     TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary = collect.get(CourseSchedule.CourseScheduleType.HIGH_ONLINE);
-                    if(studentNum>5){
-                        studentNum=5;
+                    if (studentNum > 5) {
+                        studentNum = 5;
                     }
                     BigDecimal salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal(studentNum.toString());
 
@@ -321,8 +321,8 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
                     }
                     Map<CourseSchedule.CourseScheduleType, TeacherDefaultMusicGroupSalary> collect = teacherSalaryList.stream().collect(Collectors.toMap(TeacherDefaultMusicGroupSalary::getCourseScheduleType, teacherDefaultMusicGroupSalary -> teacherDefaultMusicGroupSalary));
                     TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary = collect.get(courseSchedule.getType());
-                    if(studentNum>5){
-                        studentNum=5;
+                    if (studentNum > 5) {
+                        studentNum = 5;
                     }
                     BigDecimal salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal(studentNum.toString());
 
@@ -342,7 +342,7 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
             courseScheduleTeacherSalaryService.batchInsert(courseScheduleTeacherSalaryList);
 
             List<Integer> studentIds = userIdStrSet.stream().map(e -> Integer.parseInt(e)).collect(Collectors.toList());
-            studentDao.updateStudentServiceTag(null,studentIds, YesOrNoEnum.YES.getCode());
+            studentDao.updateStudentServiceTag(null, studentIds, YesOrNoEnum.YES.getCode());
         }
 
         //乐团在合奏班
@@ -381,11 +381,11 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
     @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
     public void updateClassGroupStudents(Long classGroupId, Set<Integer> studentIds) {
         ClassGroup classGroup = classGroupDao.lockClassGroup(classGroupId.intValue());
-        if(Objects.isNull(classGroup)){
+        if (Objects.isNull(classGroup)) {
             throw new BizException("班级信息错误");
         }
 
-        if(ClassGroupTypeEnum.MUSIC_NETWORK.equals(classGroup.getType())){
+        if (ClassGroupTypeEnum.MUSIC_NETWORK.equals(classGroup.getType())) {
             String subjectName = classGroup.getName().split("•")[0];
             List<String> studentNames = studentDao.getStudentNames(new ArrayList<>(studentIds));
             classGroup.setName(subjectName + "•" + studentNames);
@@ -393,17 +393,28 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
 
         List<ClassGroupStudentMapper> classGroupStudents = classGroupStudentMapperDao.findAllByClassGroup(classGroupId);
 
+        if (classGroupStudents.size() <= 0 && (classGroup.getType().equals(ClassGroupTypeEnum.HIGH) ||
+                classGroup.getType().equals(ClassGroupTypeEnum.HIGH_ONLINE))) {
+            String errTips = classGroup.getType().equals(ClassGroupTypeEnum.HIGH_ONLINE) ? "线上基础技能班" : "基础技能班";
+            if (studentIds.size() < 3) {
+                throw new BizException(errTips + "人数不能小于3人");
+            }
+            if (studentIds.size() > 6) {
+                throw new BizException(errTips + "人数不能大于6人");
+            }
+        }
+
         Set<Integer> allStudentIds = new HashSet<>();
         Set<Integer> oldStudentIds = new HashSet<>();
         Set<Integer> oldNormalStudentIds = new HashSet<>();
         Set<Integer> addStudentIds;
         Set<Integer> removeStudentIds;
 
-        if(!CollectionUtils.isEmpty(studentIds)){
+        if (!CollectionUtils.isEmpty(studentIds)) {
             allStudentIds = studentIds;
         }
 
-        if(!CollectionUtils.isEmpty(classGroupStudents)){
+        if (!CollectionUtils.isEmpty(classGroupStudents)) {
             oldStudentIds = classGroupStudents.stream().map(ClassGroupStudentMapper::getUserId).collect(Collectors.toSet());
             oldNormalStudentIds = classGroupStudents.stream().filter(s -> ClassGroupStudentStatusEnum.NORMAL.equals(s.getStatus())).map(ClassGroupStudentMapper::getUserId).collect(Collectors.toSet());
         }
@@ -415,24 +426,24 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
         List<ClassGroupStudentMapper> needUpdateClassGroupStudents = new ArrayList<>();
 
         for (ClassGroupStudentMapper classGroupStudent : classGroupStudents) {
-            if(addStudentIds.contains(classGroupStudent.getUserId())&&!classGroupStudent.getStatus().equals(ClassGroupStudentStatusEnum.NORMAL)){
+            if (addStudentIds.contains(classGroupStudent.getUserId()) && !classGroupStudent.getStatus().equals(ClassGroupStudentStatusEnum.NORMAL)) {
                 classGroupStudent.setStatus(ClassGroupStudentStatusEnum.NORMAL);
-            }else if(removeStudentIds.contains(classGroupStudent.getUserId())&&!classGroupStudent.getStatus().equals(ClassGroupStudentStatusEnum.QUIT)){
+            } else if (removeStudentIds.contains(classGroupStudent.getUserId()) && !classGroupStudent.getStatus().equals(ClassGroupStudentStatusEnum.QUIT)) {
                 classGroupStudent.setStatus(ClassGroupStudentStatusEnum.QUIT);
-            }else{
+            } else {
                 continue;
             }
             needUpdateClassGroupStudents.add(classGroupStudent);
         }
 
-        if(!CollectionUtils.isEmpty(needUpdateClassGroupStudents)){
+        if (!CollectionUtils.isEmpty(needUpdateClassGroupStudents)) {
             classGroupStudentMapperDao.batchUpdate(needUpdateClassGroupStudents);
         }
 
         Date now = new Date();
         List<ClassGroupStudentMapper> classGroupStudentMappers = new ArrayList<>();
         for (Integer addStudentId : addStudentIds) {
-            if(oldStudentIds.contains(addStudentId)){
+            if (oldStudentIds.contains(addStudentId)) {
                 continue;
             }
             ClassGroupStudentMapper classGroupStudentMapper = new ClassGroupStudentMapper();
@@ -452,11 +463,11 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
         classGroupService.updateClassStudentNum(classGroupId.intValue(), allStudentIds.size());
 
         List<CourseSchedule> classGroupNotStartCourse = courseScheduleDao.findCoursesByClassGroupId(classGroupId.intValue(), CourseStatusEnum.NOT_START);
-        if(CollectionUtils.isEmpty(classGroupNotStartCourse)){
+        if (CollectionUtils.isEmpty(classGroupNotStartCourse)) {
             return;
         }
 
-        if(ClassGroupTypeEnum.MUSIC_NETWORK.equals(classGroup.getType())){
+        if (ClassGroupTypeEnum.MUSIC_NETWORK.equals(classGroup.getType())) {
             for (CourseSchedule courseSchedule : classGroupNotStartCourse) {
                 courseSchedule.setName(classGroup.getName());
             }
@@ -467,7 +478,7 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
 
         //4、调整未上课课酬
         List<ClassGroupTeacherMapper> classGroupTeachers = classGroupTeacherMapperService.getClassGroupTeachers(classGroupId.intValue());
-        if ((classGroup.getType().equals(ClassGroupTypeEnum.HIGH_ONLINE)||classGroup.getType().equals(ClassGroupTypeEnum.HIGH)) && classGroupNotStartCourse.size() > 0) {
+        if ((classGroup.getType().equals(ClassGroupTypeEnum.HIGH_ONLINE) || classGroup.getType().equals(ClassGroupTypeEnum.HIGH)) && classGroupNotStartCourse.size() > 0) {
             Date nowDate = new Date();
             List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList = new ArrayList<>();
             List<Long> courseScheduleIds = classGroupNotStartCourse.stream().map(CourseSchedule::getId).collect(Collectors.toList());
@@ -482,11 +493,11 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
                     TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary = collect.get(CourseSchedule.CourseScheduleType.HIGH_ONLINE);
 
                     int studentNum = studentIds.size();
-                    if(studentNum>5){
-                        studentNum=5;
+                    if (studentNum > 5) {
+                        studentNum = 5;
                     }
 
-                    BigDecimal salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal(studentNum+"");
+                    BigDecimal salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal(studentNum + "");
 
                     CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
                     courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
@@ -504,7 +515,7 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
             courseScheduleTeacherSalaryService.batchInsert(courseScheduleTeacherSalaryList);
         }
 
-        if(!CollectionUtils.isEmpty(removeStudentIds)){
+        if (!CollectionUtils.isEmpty(removeStudentIds)) {
             courseScheduleDao.deleteMusicGroupCourseSchedulesWithStudents(courseIds, new ArrayList<>(removeStudentIds));
             List<ImGroupMember> imGroupMemberList = new ArrayList<>();
             for (Integer addStudentId : addStudentIds) {
@@ -515,7 +526,7 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
             imFeignService.groupQuit(new ImGroupModel(classGroup.getId().toString(), imGroupMembers, classGroup.getName()));
         }
 
-        if(!CollectionUtils.isEmpty(addStudentIds)){
+        if (!CollectionUtils.isEmpty(addStudentIds)) {
             courseScheduleStudentPaymentService.createForMusicGroup(classGroup.getMusicGroupId(), classGroupNotStartCourse, new ArrayList<>(addStudentIds));
             List<ImGroupMember> imGroupMemberList = new ArrayList<>();
             for (Integer addStudentId : addStudentIds) {

+ 88 - 34
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java

@@ -232,12 +232,12 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignInStatus())){
                 //异常签到
                 int signCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignInTime(), courseScheduleTeacherSalary.getCourseSchedule().getStartClassTime());
-                int signCourseTimeBetween = signCourseTimeBetweenSeconds/60;
-                if(signCourseTimeBetween<1&&signCourseTimeBetween>-3){
+                float signCourseTimeBetween = (float)signCourseTimeBetweenSeconds/(float)60;
+                if(signCourseTimeBetween<=1&&signCourseTimeBetween>-3){
                     //课程开始前1分钟至开始后3分钟进入教室
-                    deductCost = deductCost.add(new BigDecimal(50));
-                    deductReasons.add("课程开始前1分钟至开始后3分钟进入教室扣除50元");
-                }else if(signCourseTimeBetween<-3){
+                    deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary().divide(new BigDecimal(2)));
+                    deductReasons.add("课程开始前1分钟至开始后3分钟进入教室扣除一半课酬");
+                }else if(signCourseTimeBetween<=-3){
                     //课程开始后3分钟后进入教室
                     deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary());
                     deductReasons.add("课程开始后3分钟进入教室扣除全部课酬");
@@ -246,24 +246,21 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
 
             if(CollectionUtils.isEmpty(courseTeacherAttendances)||Objects.isNull(teacherAttendance.getSignOutStatus())){
                 //未签退扣除一半课酬
-                deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary().divide(new BigDecimal(2)));
-                deductReasons.add("未签退扣除一半课酬");
+                deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary());
+                deductReasons.add("未签退扣除全部课酬");
             }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignOutStatus())){
                 //异常签退
-                int signCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignOutTime(), courseScheduleTeacherSalary.getCourseSchedule().getStartClassTime());
-                float signCourseTimeBetween = (float)signCourseTimeBetweenSeconds/(float)60;
-
                 int signOutCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignOutTime(), courseScheduleTeacherSalary.getCourseSchedule().getEndClassTime());
                 float signOutCourseTimeBetween = (float)signOutCourseTimeBetweenSeconds/(float)60;
 
-                if(signCourseTimeBetween<=20&&signOutCourseTimeBetween>3){
+                if(signOutCourseTimeBetween>3){
                     //课程开始前20分钟至开始后3分钟退出教室
                     deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary());
-                    deductReasons.add("课程开始前20分钟至开始后3分钟退出教室扣除全部课酬");
+                    deductReasons.add("课程结束前3分钟之前退出教室扣除全部课酬");
                 }else if(signOutCourseTimeBetween<=3&&signOutCourseTimeBetween>0){
                     //课程结束前3分钟后至课程结束前退出教室
-                    deductCost = deductCost.add(new BigDecimal(50));
-                    deductReasons.add("课程结束前3分钟后至课程结束前退出教室扣除50元");
+                    deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary().divide(new BigDecimal(2)));
+                    deductReasons.add("课程结束前3分钟后至课程结束前退出教室扣除一半课酬");
                 }
             }
 
@@ -274,7 +271,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 courseScheduleTeacherSalary.setDeductionReason(StringUtils.join(deductReasons, ";"));
             }
 
-            courseScheduleTeacherSalary.setActualSalary(finalSalary);
+            courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary);
             courseScheduleTeacherSalary.setSettlementTime(now);
             courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
         });
@@ -348,8 +345,8 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 float signCourseTimeBetween = (float)signCourseTimeBetweenSeconds/(float)60;
                 if(signCourseTimeBetween<=1&&signCourseTimeBetween>-3){
                     //课程开始前1分钟至开始后3分钟进入教室
-                    deductCost = deductCost.add(new BigDecimal(50));
-                    deductReasons.add("课程开始前1分钟至开始后3分钟进入教室扣除50元");
+                    deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary().divide(new BigDecimal(2)));
+                    deductReasons.add("课程开始前1分钟至开始后3分钟进入教室扣除一半课酬");
                 }else if(signCourseTimeBetween<=-3){
                     //课程开始后3分钟后进入教室
                     deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary());
@@ -364,25 +361,22 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             }
 
             if(CollectionUtils.isEmpty(courseTeacherAttendances)||Objects.isNull(teacherAttendance.getSignOutStatus())){
-                //未签退扣除一半课酬
-                deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary().divide(new BigDecimal(2)));
-                deductReasons.add("未签退扣除一半课酬");
+                //未签退扣除全部课酬
+                deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary());
+                deductReasons.add("未签退扣除全部课酬");
             }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignOutStatus())){
                 //异常签退
-                int signCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignOutTime(), courseScheduleTeacherSalary.getCourseSchedule().getStartClassTime());
-                float signCourseTimeBetween = (float)signCourseTimeBetweenSeconds/(float)60;
-
                 int signOutCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignOutTime(), courseScheduleTeacherSalary.getCourseSchedule().getEndClassTime());
                 float signOutCourseTimeBetween = (float)signOutCourseTimeBetweenSeconds/(float)60;
 
-                if(signCourseTimeBetween<=20&&signOutCourseTimeBetween>3){
+                if(signOutCourseTimeBetween>3){
                     //课程开始前20分钟至开始后3分钟退出教室
                     deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary());
-                    deductReasons.add("课程开始前20分钟至开始后3分钟退出教室扣除全部课酬");
+                    deductReasons.add("课程结束前3分钟之前退出教室扣除全部课酬");
                 }else if(signOutCourseTimeBetween<=3&&signOutCourseTimeBetween>0){
                     //课程结束前3分钟后至课程结束前退出教室
-                    deductCost = deductCost.add(new BigDecimal(50));
-                    deductReasons.add("课程结束前3分钟后至课程结束前退出教室扣除50元");
+                    deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary().divide(new BigDecimal(2)));
+                    deductReasons.add("课程结束前3分钟后至课程结束前退出教室扣除一半课酬");
                 }
 
                 if(TeachModeEnum.OFFLINE.equals(courseScheduleTeacherSalary.getCourseSchedule().getTeachMode())){
@@ -399,7 +393,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
 
             BigDecimal finalSalary = courseScheduleTeacherSalary.getExpectSalary().subtract(deductCost).setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP);
 
-            courseScheduleTeacherSalary.setActualSalary(finalSalary);
+            courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary);
             courseScheduleTeacherSalary.setSettlementTime(now);
             courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
         });
@@ -464,15 +458,15 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                         || CourseSchedule.CourseScheduleType.HIGH.equals(c.getType()))
                 .map(CourseSchedule::getId).collect(Collectors.toList());
 
-        List<StudentAttendance> studentAttendances = null;
+        List<CourseScheduleStudentPayment> studentAttendances = null;
         if(!CollectionUtils.isEmpty(needStudentAttendanceCourseScheduleIds)){
-            studentAttendances = studentAttendanceDao.findByCourseIds(needStudentAttendanceCourseScheduleIds);
+            studentAttendances = courseScheduleStudentPaymentDao.findByCourseScheduleIds(needStudentAttendanceCourseScheduleIds);
         }
         Map<Long, Long> courseNormalStudentsMap = new HashMap<>();
         if(!CollectionUtils.isEmpty(studentAttendances)){
             courseNormalStudentsMap =studentAttendances.stream()
 //                    .filter(studentAttendance -> StudentAttendanceStatusEnum.NORMAL.equals(studentAttendance.getStatus()))
-                    .collect(Collectors.groupingBy(StudentAttendance::getCourseScheduleId, Collectors.counting()));
+                    .collect(Collectors.groupingBy(CourseScheduleStudentPayment::getCourseScheduleId, Collectors.counting()));
         }
 
         //课程对应乐团结算方式集合
@@ -522,6 +516,66 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 if(Objects.isNull(teacherSalary)){
                     teacherSalary = BigDecimal.ZERO;
                 }
+
+                //扣除费用
+                BigDecimal deductCost = new BigDecimal(0);
+                List<String> deductReasons = new ArrayList<>();
+                deductReasons.add("课程应到人数:" + normalStudentNum);
+                List<TeacherAttendance> courseTeacherAttendances = teacherCourseAttendanceMap.get(org.apache.commons.lang3.StringUtils.joinWith(":", courseScheduleTeacherSalary.getCourseScheduleId(), courseScheduleTeacherSalary.getUserId()));
+
+                TeacherAttendance teacherAttendance = courseTeacherAttendances.get(0);
+                if(CollectionUtils.isEmpty(courseTeacherAttendances)||Objects.isNull(teacherAttendance.getSignInStatus())){
+                    //未签到扣除全部课酬
+                    deductCost = deductCost.add(teacherSalary);
+                    deductReasons.add("未签到扣除全部课酬");
+                }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)));
+                        deductReasons.add("课程开始前1分钟至开始后3分钟进入教室扣除一半课酬");
+                    }else if(signCourseTimeBetween<=-3){
+                        //课程开始后3分钟后进入教室
+                        deductCost = deductCost.add(teacherSalary);
+                        deductReasons.add("课程开始后3分钟进入教室扣除全部课酬");
+                    }
+                }
+
+                if(CollectionUtils.isEmpty(courseTeacherAttendances)||Objects.isNull(teacherAttendance.getSignOutStatus())){
+                    //未签退扣除一半课酬
+                    deductCost = deductCost.add(teacherSalary.divide(new BigDecimal(2)));
+                    deductReasons.add("未签退扣除一半课酬");
+                }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);
+                        deductReasons.add("课程结束前3分钟之前退出教室扣除全部课酬");
+                    }else if(signOutCourseTimeBetween<=3&&signOutCourseTimeBetween>0){
+                        //课程结束前3分钟后至课程结束前退出教室
+                        deductCost = deductCost.add(teacherSalary.divide(new BigDecimal(2)));
+                        deductReasons.add("课程结束前3分钟后至课程结束前退出教室扣除一半课酬");
+                    }
+                }
+
+                BigDecimal finalSalary = teacherSalary.subtract(deductCost).setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP);
+
+                if(BigDecimal.ZERO.compareTo(deductCost)<0){
+                    deductReasons.add("扣除总费用:" + deductCost);
+                }
+                courseScheduleTeacherSalary.setDeductionReason(org.apache.commons.lang3.StringUtils.join(deductReasons, ";"));
+
+                //更新教师结算信息
+                courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary);
+                courseScheduleTeacherSalary.setSettlementTime(now);
+                courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
+
+                continue;
             }else if(CourseSchedule.CourseScheduleType.HIGH.equals(courseSchedule.getType())){
                 //根据课程类型获取对应的默认课酬设置列表
                 List<TeacherDefaultMusicGroupSalary> teacherDefaultMusicGroupSalariesWithCourseType = teacherDefaultMusicGroupSalariesGroupByCourseType.get(courseSchedule.getType());
@@ -611,11 +665,11 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             }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){
+                if(signCourseTimeBetween>0&&signCourseTimeBetween<=20){
                     //未提前20分钟打卡扣除50元
                     deductCost = deductCost.add(new BigDecimal(50));
                     deductReasons.add("未提前20分钟打卡扣除50元");
-                }else if(signCourseTimeBetween<0&&signCourseTimeBetween>-30){
+                }else if(signCourseTimeBetween<=0&&signCourseTimeBetween>-30){
                     //迟到30分钟内扣除一半课酬
                     deductCost = deductCost.add(teacherSalary.divide(new BigDecimal(2)));
                     deductReasons.add("迟到30分钟内扣除一半课酬");
@@ -642,7 +696,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                     //早退
                     deductCost = deductCost.add(teacherSalary);
                     deductReasons.add("早退扣除全部课酬");
-                }else if((signOutCourseTimeBetween<=3&&signOutCourseTimeBetween>0)||signOutCourseTimeBetween<3600){
+                }else if((signOutCourseTimeBetween<=3&&signOutCourseTimeBetween>0)||signOutCourseTimeBetween<=3600){
                     //异常签退,扣除50元
                     deductCost = deductCost.add(new BigDecimal(50));
                     deductReasons.add("异常签退,扣除50元");

+ 1 - 1
mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml

@@ -612,7 +612,7 @@
         UPDATE sys_user SET real_name_ = #{realName},id_card_no_=#{idCardNo} WHERE id_=#{id}
     </update>
     <update id="updateCurrentClass" parameterType="com.ym.mec.biz.dal.entity.StudentRegistration">
-        UPDATE student_registration sr SET sr.current_grade_ = #{currentGrade},sr.current_class_ = #{currentClass},sr.update_time_ = NOW()
+        UPDATE student_registration sr SET sr.current_grade_ = #{currentGrade},sr.current_class_ = #{currentClass},sr.current_grade_date_= NOW(),sr.update_time_ = NOW()
         WHERE sr.user_id_ = #{userId}
     </update>