Procházet zdrojové kódy

fix(risk): mobileList 查 record 时 slot 兼容 fallback

之前 expandByTimeSlots 从 task.time_slot 拆 slot (e.g. '15:00-16:00')
传给 convertToMobileVo,但 submitPunch 时如果 bo.slot 为空,record.slot=NULL,
导致 (taskId, slot) 精确查不到 → latest=null → 走 task.planEndTime.before(now)
误判成 OVERDUE,移动端 list 看到的状态跟实际 task_status='已打卡' 不一致,
task 卡片按钮显示错误,用户能反复进打卡页。

修复:convertToMobileVo 查 (taskId, slot) 查不到时,fallback 查 (taskId, slot IS NULL),
兼容老 record 没存 slot 的情况(单时段任务 submitPunch 不传 slot)。

实测:防重复测试_1553 punchStatus 从 OVERDUE → PUNCHED ✓
yangjingjing před 12 hodinami
rodič
revize
4c6094ba6a

+ 13 - 1
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/service/impl/RiskInspectionTaskServiceImpl.java

@@ -620,7 +620,10 @@ public class RiskInspectionTaskServiceImpl implements IRiskInspectionTaskService
             || "扫码".equals(task.getCheckMethod());
         vo.setPunchType(isScan ? "SCAN" : "NORMAL");
 
-        // 2. 查最近一条记录(每日多时段按 (taskId, slot) 查;单时段/无 slot 按 taskId 查)
+        // 2. 查最近一条记录
+        //    - 每日多时段按 (taskId, slot) 查,精确匹配
+        //    - 兜底:若 (taskId, slot) 查不到(如老 record 没存 slot),fallback 查 (taskId, slot IS NULL)
+        //      否则单时段任务会误判成 PENDING/OVERDUE
         RiskInspectionRecord latest = recordMapper.selectOne(
             Wrappers.<RiskInspectionRecord>lambdaQuery()
                 .eq(RiskInspectionRecord::getTaskId, task.getId())
@@ -628,6 +631,15 @@ public class RiskInspectionTaskServiceImpl implements IRiskInspectionTaskService
                 .orderByDesc(RiskInspectionRecord::getCheckInTime)
                 .last("LIMIT 1")
         );
+        if (latest == null && StringUtils.isNotBlank(slot)) {
+            latest = recordMapper.selectOne(
+                Wrappers.<RiskInspectionRecord>lambdaQuery()
+                    .eq(RiskInspectionRecord::getTaskId, task.getId())
+                    .isNull(RiskInspectionRecord::getSlot)
+                    .orderByDesc(RiskInspectionRecord::getCheckInTime)
+                    .last("LIMIT 1")
+            );
+        }
 
         // 3. 任务原始状态
         String originStatus = task.getTaskStatus();