From 9bacdf10738802fa49ad8be2a946d75b86264822 Mon Sep 17 00:00:00 2001
From: xuhy <3313886187@qq.com>
Date: 星期日, 15 三月 2026 10:40:58 +0800
Subject: [PATCH] 缺卡定时任务修改

---
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/ClockInScheduleTask.java |   47 ++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 46 insertions(+), 1 deletions(-)

diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/ClockInScheduleTask.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/ClockInScheduleTask.java
index 9dd7fff..653c716 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/ClockInScheduleTask.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/ClockInScheduleTask.java
@@ -56,13 +56,17 @@
     /**
      * 每5分钟执行一次
      */
-    @Scheduled(cron = "0 */5 * * * ?")
+    @Scheduled(fixedRate = 60*1000)
     public void clockInScheduleTask() {
         log.info("========== 开始执行打卡检查 ==========");
         try {
             // 查询下班卡在今天的
             List<XpSchedulingDetail> clockOutPlanList = xpSchedulingDetailService.list(Wrappers.lambdaQuery(XpSchedulingDetail.class)
                     .likeRight(XpSchedulingDetail::getPlanTime, LocalDate.now()));
+
+            // 下班卡在昨天的
+            List<XpSchedulingDetail> clockOutPlanListLast = xpSchedulingDetailService.list(Wrappers.lambdaQuery(XpSchedulingDetail.class)
+                    .likeRight(XpSchedulingDetail::getPlanTime, LocalDate.now().minusDays(1)));
 
             if(!CollectionUtils.isEmpty(clockOutPlanList)){
                 List<Long> fleetIds = clockOutPlanList.stream().map(XpSchedulingDetail::getFleetId).collect(Collectors.toList());
@@ -154,6 +158,47 @@
                 }
             }
 
+            if (!CollectionUtils.isEmpty(clockOutPlanListLast)){
+                List<Long> fleetIds = clockOutPlanListLast.stream().map(XpSchedulingDetail::getFleetId).distinct().collect(Collectors.toList());
+                // 查询所有车队的绑定人员
+                List<XpFleetOperations> xpFleetOperations = xpFleetOperationsClient.getOperationsIdsByFleetIds(fleetIds).getData();
+                // 查询班次
+                List<Long> shiftIds = clockOutPlanListLast.stream().map(XpSchedulingDetail::getShiftId).collect(Collectors.toList());
+                List<XpShift> xpShifts = xpShiftService.list(Wrappers.lambdaQuery(XpShift.class)
+                        .in(XpShift::getId, shiftIds));
+                log.info("========== 查询到{}个车队 ==========", xpFleetOperations.size());
+
+                // 处理下班卡缺卡情况
+                // 过滤当前时间在班次下班打卡时间之后5小时的数据   今日已过下班打卡时间5小时后的班次
+                List<XpShift> shiftListFive = xpShifts.stream().filter(xpShift ->
+                        DateUtils.stringToLocalDateTime(LocalDate.now().minusDays(1) + " " + xpShift.getEndTime() + ":00").plusHours(5).isBefore(LocalDateTime.now())).collect(Collectors.toList());
+                List<Long> fiveIds = shiftListFive.stream().map(XpShift::getId).collect(Collectors.toList());
+                if(!CollectionUtils.isEmpty(fiveIds)){
+                    log.info("========== 进入下班过期的班次 ==========");
+                    // 获取过期当前班次的排班明细  覆盖
+                    List<XpSchedulingDetail> fiveClockOutPlans = clockOutPlanListLast.stream().filter(xpSchedulingDetail -> fiveIds.contains(xpSchedulingDetail.getShiftId())).collect(Collectors.toList());
+                    List<Long> fiveFleetIdIn = fiveClockOutPlans.stream().map(XpSchedulingDetail::getFleetId).collect(Collectors.toList());
+                    // 查询所有车队的绑定人员
+                    if(!CollectionUtils.isEmpty(xpFleetOperations)){
+                        List<Long> operationsUserIdsFive = xpFleetOperations.stream().filter(x -> fiveFleetIdIn.contains(x.getFleetId()))
+                                .map(XpFleetOperations::getOperationsUserId).distinct().collect(Collectors.toList());
+                        // 批量查询人员打卡信息
+                        List<XpClockIn> clockInListFive = xpClockInService.list(Wrappers.lambdaQuery(XpClockIn.class)
+                                .in(XpClockIn::getAppUserId, operationsUserIdsFive)
+                                .isNull(XpClockIn::getClockOutTime));
+                        log.info("========== 获取到{}个人员没有下班打卡信息 ==========", clockInListFive.size());
+                        if(!CollectionUtils.isEmpty(clockInListFive)){
+                            for (XpClockIn xpClockIn : clockInListFive) {
+                                xpClockIn.setClockOutTime(LocalDateTime.now());
+                                xpClockIn.setClockOutResult(3);
+                            }
+                            xpClockInService.updateBatchById(clockInListFive);
+                            log.info("========== 修改为下班缺卡 ==========");
+                        }
+                    }
+                }
+            }
+
         } catch (Exception e) {
             log.error("执行打卡检查任务执行失败", e);
         }

--
Gitblit v1.7.1