Ver Fonte

教师考勤调整

dzx há 1 ano atrás
pai
commit
dbb417e6ad

+ 54 - 49
src/main/java/com/xjrsoft/module/attendance/controller/TeacherStatisticsController.java

@@ -147,33 +147,33 @@ public class TeacherStatisticsController {
                     }
                     if(dto.getTimePeriod() != null && dto.getTimePeriod() == 1){
                         startTime = queryDate.atTime(5, 0, 0);
-                        if(detailsUserVo != null && detailsUserVo.getAmStartTime() != null){
+                        if(detailsUserVo.getAmStartTime() != null){
                             startTime = queryDate.atTime(detailsUserVo.getAmStartTime());
                         }
                         endTime = queryDate.atTime(12, 0, 0);
-                        if(detailsUserVo != null && detailsUserVo.getAmEndTime() != null){
+                        if(detailsUserVo.getAmEndTime() != null){
                             endTime = queryDate.atTime(detailsUserVo.getAmEndTime());
                         }
                     }else if(dto.getTimePeriod() != null && dto.getTimePeriod() == 2){
                         startTime = queryDate.atTime(12, 0, 0);
-                        if(detailsUserVo != null && detailsUserVo.getPmStartTime() != null){
+                        if(detailsUserVo.getPmStartTime() != null){
                             startTime = queryDate.atTime(detailsUserVo.getPmStartTime());
                         }
                         endTime = queryDate.atTime(18, 0, 0);
-                        if(detailsUserVo != null && detailsUserVo.getPmEndTime() != null){
+                        if(detailsUserVo.getPmEndTime() != null){
                             endTime = queryDate.atTime(detailsUserVo.getPmEndTime());
                         }
                         amEndTime  = queryDate.atTime(12, 0, 0);
-                        if(detailsUserVo != null && detailsUserVo.getAmEndTime() != null){
+                        if(detailsUserVo.getAmEndTime() != null){
                             amEndTime = queryDate.atTime(detailsUserVo.getAmEndTime());
                         }
                     }else{
                         startTime = queryDate.atTime(0, 0, 0);
-                        if(detailsUserVo != null && detailsUserVo.getEveningStartTime() != null){
+                        if(detailsUserVo.getEveningStartTime() != null){
                             startTime = queryDate.atTime(detailsUserVo.getEveningStartTime());
                         }
                         endTime = queryDate.atTime(23, 59, 59);
-                        if(detailsUserVo != null && detailsUserVo.getEveningEndTime() != null){
+                        if(detailsUserVo.getEveningEndTime() != null){
                             endTime = queryDate.atTime(detailsUserVo.getEveningEndTime());
                         }
                     }
@@ -184,18 +184,6 @@ public class TeacherStatisticsController {
                         continue;
                     }
 
-                    WfHeadTeacherLeave teacherLeave = headTeacherLeaveService.selectJoinOne(WfHeadTeacherLeave.class,
-                            new MPJLambdaWrapper<WfHeadTeacherLeave>()
-                                    .select(WfHeadTeacherLeave.class, x -> VoToColumnUtil.fieldsToColumns(WfHeadTeacherLeave.class).contains(x.getProperty()))
-                                    .innerJoin(XjrUser.class, XjrUser::getId, WfHeadTeacherLeave::getApplicantUserId)
-                                    .eq(WfHeadTeacherLeave::getStatus, 1)
-                                    .eq(WfHeadTeacherLeave::getApplicantUserId, record.getUserId())
-                                    .between(WfHeadTeacherLeave::getStartTime, startTime, endTime)
-                    );
-                    if(teacherLeave != null){
-                        record.setStatus(teacherLeave.getLeaveReason());
-                        continue;
-                    }
                     TeacherOutInRecordDto outInDto = new TeacherOutInRecordDto();
                     outInDto.setQueryDate(startTime.toLocalDate());
                     outInDto.setStartTime(startTime);
@@ -203,39 +191,56 @@ public class TeacherStatisticsController {
                     outInDto.setStatus(OutInStatusEnum.enter.getCode());
                     outInDto.setUserId(record.getUserId());
                     List<TeacherOutInRecord> outInRecords = teacherOutInRecordService.getListByParam(outInDto);
-                    if(!outInRecords.isEmpty()){
+                    //查询该教师是否通过车辆进入
+                    List<CarOutInRecord> list = carOutInRecordService.list(
+                            new MPJLambdaWrapper<CarOutInRecord>()
+                                    .select(CarOutInRecord.class, x -> VoToColumnUtil.fieldsToColumns(CarOutInRecord.class).contains(x.getProperty()))
+                                    .leftJoin(CarMessageApply.class, CarMessageApply::getId, CarOutInRecord::getCarMessageApplyId)
+                                    .le(CarOutInRecord::getRecordTime, endTime)
+                                    .eq("DATE_FORMAT(record_time, '%Y-%m-%d')", endTime.toLocalDate())
+                                    .eq(CarMessageApply::getUserId, record.getUserId())
+                                    .ge(dto.getTimePeriod() == 2, CarOutInRecord::getRecordTime, amEndTime)
+                                    .eq(CarOutInRecord::getStatus, OutInStatusEnum.enter.getCode())
+                                    .orderByAsc(CarOutInRecord::getRecordTime)
+                    );
+                    //最早进入方式:1人脸 2车辆
+                    Integer inStatus = 0;
+                    if(!outInRecords.isEmpty() && !list.isEmpty()){
+                        TeacherOutInRecord teacherOutInRecord = outInRecords.get(0);
+                        CarOutInRecord carOutInRecord = list.get(0);
+                        int result = teacherOutInRecord.getRecordTime().compareTo(carOutInRecord.getRecordTime());
+                        if(result < 0){//人脸进入
+                            inStatus = 1;
+                        }else if(result == 0){//同时
+                            inStatus = 0;
+                        }else{//车辆进入
+                            inStatus = 2;
+                        }
+                    }else if(!outInRecords.isEmpty()){
+                        inStatus = 1;
+                    }else if(!list.isEmpty()){
+                        inStatus = 2;
+                    }
+
+                    if(inStatus == 1){
                         TeacherOutInRecord outInRecord = outInRecords.get(0);
-                        if(outInRecord != null){
+                        if(outInRecord != null && outInRecord.getRecordTime().isBefore(startTime)){
+                            record.setRecordTime(outInRecord.getRecordTime());
+                            record.setStatus("到校");
+                        }else if(outInRecord != null && outInRecord.getRecordTime().isAfter(startTime)){
                             record.setRecordTime(outInRecord.getRecordTime());
-                            record.setStatus(outInRecord.getAttendanceStatus());
-                            record.setAttendanceMode("人脸");
+                            record.setStatus("迟到");
                         }
-                    }else{
-                        //查询该教师是否通过车辆进入
-                        List<CarOutInRecord> list = carOutInRecordService.list(
-                                new MPJLambdaWrapper<CarOutInRecord>()
-                                        .select(CarOutInRecord.class, x -> VoToColumnUtil.fieldsToColumns(CarOutInRecord.class).contains(x.getProperty()))
-                                        .leftJoin(CarMessageApply.class, CarMessageApply::getId, CarOutInRecord::getCarMessageApplyId)
-                                        .le(CarOutInRecord::getRecordTime, endTime)
-                                        .eq("DATE_FORMAT(record_time, '%Y-%m-%d')", endTime.toLocalDate())
-                                        .eq(CarMessageApply::getUserId, record.getUserId())
-                                        .ge(dto.getTimePeriod() != null && dto.getTimePeriod() == 2 && amEndTime != null, CarOutInRecord::getRecordTime, amEndTime)
-                                        .eq(CarOutInRecord::getStatus, OutInStatusEnum.enter.getCode())
-                                        .orderByAsc(CarOutInRecord::getRecordTime)
-                        );
-                        if(!list.isEmpty()){
-                            CarOutInRecord outInRecord = list.get(0);
-                            if(outInRecord != null && outInRecord.getRecordTime().isBefore(startTime)){
-                                record.setRecordTime(outInRecord.getRecordTime());
-                                record.setStatus("到校");
-                                record.setAttendanceMode("车辆");
-                                record.setCarNumber(outInRecord.getPlanNo());
-                            }else if(outInRecord != null && outInRecord.getRecordTime().isAfter(startTime)){
-                                record.setRecordTime(outInRecord.getRecordTime());
-                                record.setStatus("迟到");
-                                record.setAttendanceMode("车辆");
-                                record.setCarNumber(outInRecord.getPlanNo());
-                            }
+                    }else if(inStatus == 2){
+                        CarOutInRecord outInRecord = list.get(0);
+                        if(outInRecord != null && outInRecord.getRecordTime().isBefore(startTime)){
+                            record.setRecordTime(outInRecord.getRecordTime());
+                            record.setStatus("到校");
+                            record.setCarNumber(outInRecord.getPlanNo());
+                        }else if(outInRecord != null && outInRecord.getRecordTime().isAfter(startTime)){
+                            record.setRecordTime(outInRecord.getRecordTime());
+                            record.setStatus("迟到");
+                            record.setCarNumber(outInRecord.getPlanNo());
                         }
                     }
 

+ 41 - 31
src/main/java/com/xjrsoft/module/job/AttendanceRecordTask.java

@@ -83,27 +83,27 @@ public class AttendanceRecordTask {
         LocalDateTime startDateTime = now.withHour(0).withMinute(0).withSecond(0).withNano(0);
         LocalDateTime endDateTime = startDateTime.plusDays(1).plusSeconds(-1);
 
-        if(now.isBefore(noon)){
-            //计算上午考勤
-            teacherAttendanceRecord(startDateTime, endDateTime, 1);
-        }else if(now.isAfter(noon) && now.isBefore(evening)){
-            //计算上午考勤
-            teacherAttendanceRecord(startDateTime, endDateTime, 2);
-        }
-
-        LocalDateTime beginTime = now.withHour(0).withMinute(58).withSecond(0);
-        LocalDateTime endTime = now.withHour(1).withMinute(3).withSecond(0);
-
-        //凌晨1点计算前一天的数据
-        if(now.isAfter(beginTime) && now.isBefore(endTime)){
-            startDateTime = now.plusDays(-1).withHour(0).withMinute(0).withSecond(0).withNano(0);
-            endDateTime = startDateTime.plusDays(1).plusSeconds(-1);
-
-            //计算上午考勤
-            teacherAttendanceRecord(startDateTime, endDateTime, 1);
-            //计算上午考勤
-            teacherAttendanceRecord(startDateTime, endDateTime, 2);
-        }
+//        if(now.isBefore(noon)){
+//            //计算上午考勤
+//            teacherAttendanceRecord(startDateTime, endDateTime, 1);
+//        }else if(now.isAfter(noon) && now.isBefore(evening)){
+//            //计算上午考勤
+//            teacherAttendanceRecord(startDateTime, endDateTime, 2);
+//        }
+//
+//        LocalDateTime beginTime = now.withHour(0).withMinute(58).withSecond(0);
+//        LocalDateTime endTime = now.withHour(1).withMinute(3).withSecond(0);
+//
+//        //凌晨1点计算前一天的数据
+//        if(now.isAfter(beginTime) && now.isBefore(endTime)){
+//            startDateTime = now.plusDays(-1).withHour(0).withMinute(0).withSecond(0).withNano(0);
+//            endDateTime = startDateTime.plusDays(1).plusSeconds(-1);
+//
+//            //计算上午考勤
+//            teacherAttendanceRecord(startDateTime, endDateTime, 1);
+//            //计算上午考勤
+//            teacherAttendanceRecord(startDateTime, endDateTime, 2);
+//        }
     }
 
     /**
@@ -199,6 +199,7 @@ public class AttendanceRecordTask {
             WfTeacherleave studentLeave = wfTeacherleaveService.getLeaveByUserId(startTime, endTime, user.getId());
             if(studentLeave != null){
                 record.setAttendanceStatus(studentLeave.getLeaveType());
+                insertList.add(record);
                 continue;
             }
 
@@ -246,22 +247,26 @@ public class AttendanceRecordTask {
 
             if(inStatus == 1){
                 TeacherOutInRecord outInRecord = outInRecords.get(0);
-                if(outInRecord != null){
+                if(outInRecord != null && outInRecord.getRecordTime().isBefore(startTime)){
                     record.setRecordTime(outInRecord.getRecordTime());
-                    record.setAttendanceStatus(outInRecord.getAttendanceStatus());
-                    record.setAttendanceMode(1);
+                    record.setAttendanceStatus("到校");
+                    record.setAttendanceMode(inStatus);
+                }else if(outInRecord != null && outInRecord.getRecordTime().isAfter(startTime)){
+                    record.setRecordTime(outInRecord.getRecordTime());
+                    record.setAttendanceStatus("迟到");
+                    record.setAttendanceMode(inStatus);
                 }
             }else if(inStatus == 2){
                 CarOutInRecord outInRecord = list.get(0);
                 if(outInRecord != null && outInRecord.getRecordTime().isBefore(startTime)){
                     record.setRecordTime(outInRecord.getRecordTime());
                     record.setAttendanceStatus("到校");
-                    record.setAttendanceMode(2);
+                    record.setAttendanceMode(inStatus);
                     record.setCarNumber(outInRecord.getPlanNo());
                 }else if(outInRecord != null && outInRecord.getRecordTime().isAfter(startTime)){
                     record.setRecordTime(outInRecord.getRecordTime());
                     record.setAttendanceStatus("迟到");
-                    record.setAttendanceMode(1);
+                    record.setAttendanceMode(inStatus);
                     record.setCarNumber(outInRecord.getPlanNo());
                 }
             }
@@ -378,6 +383,7 @@ public class AttendanceRecordTask {
             WfTeacherleave studentLeave = wfTeacherleaveService.getLeaveByUserId(startTime, endTime, user.getId());
             if(studentLeave != null){
                 record.setAttendanceStatus(studentLeave.getLeaveType());
+                insertList.add(record);
                 continue;
             }
             TeacherOutInRecordDto outInDto = new TeacherOutInRecordDto();
@@ -423,22 +429,26 @@ public class AttendanceRecordTask {
 
             if(inStatus == 1){
                 TeacherOutInRecord outInRecord = outInRecords.get(0);
-                if(outInRecord != null){
+                if(outInRecord != null && outInRecord.getRecordTime().isBefore(startTime)){
                     record.setRecordTime(outInRecord.getRecordTime());
-                    record.setAttendanceStatus(outInRecord.getAttendanceStatus());
-                    record.setAttendanceMode(1);
+                    record.setAttendanceStatus("到校");
+                    record.setAttendanceMode(inStatus);
+                }else if(outInRecord != null && outInRecord.getRecordTime().isAfter(startTime)){
+                    record.setRecordTime(outInRecord.getRecordTime());
+                    record.setAttendanceStatus("迟到");
+                    record.setAttendanceMode(inStatus);
                 }
             }else if(inStatus == 2){
                 CarOutInRecord outInRecord = list.get(0);
                 if(outInRecord != null && outInRecord.getRecordTime().isBefore(startTime)){
                     record.setRecordTime(outInRecord.getRecordTime());
                     record.setAttendanceStatus("到校");
-                    record.setAttendanceMode(2);
+                    record.setAttendanceMode(inStatus);
                     record.setCarNumber(outInRecord.getPlanNo());
                 }else if(outInRecord != null && outInRecord.getRecordTime().isAfter(startTime)){
                     record.setRecordTime(outInRecord.getRecordTime());
                     record.setAttendanceStatus("迟到");
-                    record.setAttendanceMode(1);
+                    record.setAttendanceMode(inStatus);
                     record.setCarNumber(outInRecord.getPlanNo());
                 }
             }

+ 20 - 28
src/test/java/com/xjrsoft/module/job/AttendanceRecordTaskTest.java

@@ -58,9 +58,6 @@ class AttendanceRecordTaskTest {
     @Autowired
     private IWfTeacherleaveService wfTeacherleaveService;
 
-    @Autowired
-    private IWfHeadTeacherLeaveService headTeacherLeaveService;
-
     @Autowired
     private ITeacherOutInRecordService teacherOutInRecordService;
 
@@ -75,14 +72,14 @@ class AttendanceRecordTaskTest {
     @Test
     public void execute() {
 
-        LocalDateTime now = LocalDateTime.of(2024, 12, 5, 0, 0, 0);
+        LocalDateTime now = LocalDateTime.of(2024, 12, 6, 0, 0, 0);
         for (int i = 0; i < 1; i ++){
             LocalDateTime startDateTime = now.plusDays(i).withHour(0).withMinute(0).withSecond(0).withNano(0);
             LocalDateTime endDateTime = startDateTime.plusDays(i).withHour(23).withMinute(59).withSecond(59);
 
-//            teacherAttendanceRecord(startDateTime, endDateTime, 1);
+            teacherAttendanceRecord(startDateTime, endDateTime, 1);
 
-            teacherAttendanceRecord(startDateTime, endDateTime, 2);
+//            teacherAttendanceRecord(startDateTime, endDateTime, 2);
         }
 
     }
@@ -94,16 +91,13 @@ class AttendanceRecordTaskTest {
      */
     public void teacherAttendanceRecord(LocalDateTime startDateTime, LocalDateTime endDateTime, Integer timePeriod){
         List<String> nameList = new ArrayList<>();
-        nameList.add("李顺");
-        nameList.add("袁凯");
-        nameList.add("童勇");
-        nameList.add("张伟(大)");
+        nameList.add("彭佳佳");
         List<User> teacherList = userService.list(
                 new MPJLambdaWrapper<User>()
                         .select(User::getId)
                         .select(User.class, x -> VoToColumnUtil.fieldsToColumns(User.class).contains(x.getProperty()))
                         .innerJoin(BaseTeacher.class, BaseTeacher::getUserId, User::getId)
-                        //.in(User::getName, nameList)
+                        .in(User::getName, nameList)
         );
         List<Long> userIds = teacherList.stream().map(User::getId).collect(Collectors.toList());
         Map<Long, AttendanceRuleDetailsUserVo> teacherTodyRuleByUserId = ruleCategoryService.getTeacherTodyRuleByUserId(userIds);
@@ -186,21 +180,10 @@ class AttendanceRecordTaskTest {
             WfTeacherleave studentLeave = wfTeacherleaveService.getLeaveByUserId(startTime, endTime, user.getId());
             if(studentLeave != null){
                 record.setAttendanceStatus(studentLeave.getLeaveType());
+                insertList.add(record);
                 continue;
             }
 
-            WfHeadTeacherLeave teacherLeave = headTeacherLeaveService.selectJoinOne(WfHeadTeacherLeave.class,
-                    new MPJLambdaWrapper<WfHeadTeacherLeave>()
-                            .select(WfHeadTeacherLeave.class, x -> VoToColumnUtil.fieldsToColumns(WfHeadTeacherLeave.class).contains(x.getProperty()))
-                            .innerJoin(XjrUser.class, XjrUser::getId, WfHeadTeacherLeave::getApplicantUserId)
-                            .eq(WfHeadTeacherLeave::getStatus, 1)
-                            .eq(WfHeadTeacherLeave::getApplicantUserId, record.getUserId())
-                            .between(WfHeadTeacherLeave::getStartTime, startTime, endTime)
-            );
-            if(teacherLeave != null){
-                record.setAttendanceStatus(teacherLeave.getLeaveReason());
-                continue;
-            }
             TeacherOutInRecordDto outInDto = new TeacherOutInRecordDto();
             outInDto.setQueryDate(startTime.toLocalDate());
             outInDto.setEndTime(endTime);
@@ -244,22 +227,26 @@ class AttendanceRecordTaskTest {
 
             if(inStatus == 1){
                 TeacherOutInRecord outInRecord = outInRecords.get(0);
-                if(outInRecord != null){
+                if(outInRecord != null && outInRecord.getRecordTime().isBefore(startTime)){
+                    record.setRecordTime(outInRecord.getRecordTime());
+                    record.setAttendanceStatus("到校");
+                    record.setAttendanceMode(inStatus);
+                }else if(outInRecord != null && outInRecord.getRecordTime().isAfter(startTime)){
                     record.setRecordTime(outInRecord.getRecordTime());
-                    record.setAttendanceStatus(outInRecord.getAttendanceStatus());
-                    record.setAttendanceMode(1);
+                    record.setAttendanceStatus("迟到");
+                    record.setAttendanceMode(inStatus);
                 }
             }else if(inStatus == 2){
                 CarOutInRecord outInRecord = list.get(0);
                 if(outInRecord != null && outInRecord.getRecordTime().isBefore(startTime)){
                     record.setRecordTime(outInRecord.getRecordTime());
                     record.setAttendanceStatus("到校");
-                    record.setAttendanceMode(2);
+                    record.setAttendanceMode(inStatus);
                     record.setCarNumber(outInRecord.getPlanNo());
                 }else if(outInRecord != null && outInRecord.getRecordTime().isAfter(startTime)){
                     record.setRecordTime(outInRecord.getRecordTime());
                     record.setAttendanceStatus("迟到");
-                    record.setAttendanceMode(1);
+                    record.setAttendanceMode(inStatus);
                     record.setCarNumber(outInRecord.getPlanNo());
                 }
             }
@@ -272,6 +259,11 @@ class AttendanceRecordTaskTest {
         }
 
         if(!insertList.isEmpty()){
+            recordService.remove(
+                    new QueryWrapper<TeacherAttendanceRecord>().lambda()
+                            .eq(TeacherAttendanceRecord::getTimeInterval, timePeriod)
+                            .eq(TeacherAttendanceRecord::getAttendanceDate, queryDate)
+            );
             recordService.saveBatch(insertList);
         }
     }