Просмотр исходного кода

feat(ruoyi-risk): PC端巡检列表联动展示APP端打卡结果

- RiskInspectionTaskVo 新增 recordStatus/checkResult/totalCount 三个字段
- ServiceImpl.queryPageList/queryList 后调用 fillLatestRecord 填充最新打卡记录
- 移动端接口 mobileList/mobileDetail/verifyQr 免登录白名单
- 新增 VerifyQrBo 用于二维码校验
- application.yml security.excludes 补全 5 个移动端路径
- 回滚移动端登录:移除 @SaCheckLogin 和 LoginHelper 集成
- AuthController.login 恢复 @ApiEncrypt 加密
yangjingjing 1 неделя назад
Родитель
Сommit
4627246c05

+ 6 - 0
ruoyi-admin/src/main/resources/application.yml

@@ -132,6 +132,12 @@ security:
     - /resource/sse/close
     - /resource/sse
     - /captchaImage
+    # 移动端免登录接口(uniapp)
+    - /risk/inspectionTask/mobileList
+    - /risk/inspectionTask/mobileDetail/**
+    - /risk/inspectionTask/verifyQr
+    - /risk/inspectionRecord/punch
+    - /risk/inspectionRecord/**
 
 # 多租户配置
 tenant:

+ 1 - 1
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/controller/RiskInspectionRecordController.java

@@ -35,7 +35,7 @@ public class RiskInspectionRecordController extends BaseController {
     private final IRiskInspectionRecordService inspectionRecordService;
 
     /**
-     * 移动端-提交巡检打卡(无需 Sa-Token 权限,token 走请求头)
+     * 移动端-提交巡检打卡(免登录)
      *
      * @param bo 打卡参数(含经纬度/打卡类型/项目结果明细)
      * @return 打卡记录ID

+ 9 - 7
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/controller/RiskInspectionTaskController.java

@@ -123,12 +123,12 @@ public class RiskInspectionTaskController extends BaseController {
         return R.ok(inspectionTaskService.queryRecordListByTaskId(taskId));
     }
 
-    // ===================== 移动端接口(免 Sa-Token 权限,移动端走 token 头鉴权) =====================
+    // ===================== 移动端接口(免登录) =====================
 
     /**
      * 移动端-查询我的巡检任务列表(分页,带打卡状态)
      *
-     * @param inspectorId 巡检人ID(可空,空则取当前登录用户)
+     * @param inspectorId 巡检人ID(可空,空则默认取 admin 用户,用于演示)
      * @param status      任务状态: PENDING-待打卡 / PUNCHED-已打卡 / OVERDUE-已逾期 / FINISHED-已完成
      */
     @GetMapping("/mobileList")
@@ -136,6 +136,10 @@ public class RiskInspectionTaskController extends BaseController {
         @RequestParam(required = false) Long inspectorId,
         @RequestParam(required = false) String status,
         PageQuery pageQuery) {
+        // 演示阶段未登录,默认查询 admin(id=1)的任务
+        if (inspectorId == null) {
+            inspectorId = 1L;
+        }
         return inspectionTaskService.queryMobileList(inspectorId, status, pageQuery);
     }
 
@@ -150,13 +154,11 @@ public class RiskInspectionTaskController extends BaseController {
     /**
      * 移动端-校验二维码内容
      *
-     * @param taskId 任务ID
-     * @param qrCode 扫码得到的字符串
+     * @param bo 任务ID + 二维码内容
      */
     @PostMapping("/verifyQr")
-    public R<Boolean> verifyQr(@NotNull(message = "任务ID不能为空") @RequestParam Long taskId,
-                                @NotBlank(message = "二维码内容不能为空") @RequestParam String qrCode) {
-        return R.ok(inspectionTaskService.verifyQrCode(taskId, qrCode));
+    public R<Boolean> verifyQr(@RequestBody org.dromara.risk.domain.bo.VerifyQrBo bo) {
+        return R.ok(inspectionTaskService.verifyQrCode(bo.getTaskId(), bo.getQrCode()));
     }
 
 }

+ 28 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/bo/VerifyQrBo.java

@@ -0,0 +1,28 @@
+package org.dromara.risk.domain.bo;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 移动端 - 校验二维码请求业务对象
+ *
+ * @author ruoyi
+ */
+@Data
+public class VerifyQrBo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /** 任务ID */
+    @NotNull(message = "任务ID不能为空")
+    private Long taskId;
+
+    /** 二维码内容 */
+    @NotBlank(message = "二维码内容不能为空")
+    private String qrCode;
+}

+ 17 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/RiskInspectionTaskVo.java

@@ -231,4 +231,21 @@ public class RiskInspectionTaskVo implements Serializable {
     @ExcelProperty(value = "更新时间")
     private Date updateTime;
 
+    // ============== PC 端列表展示用的最新打卡记录字段(由 service 填充) ==============
+
+    /**
+     * 最新打卡状态(来自 risk_inspection_record.record_status),与列表项联动
+     */
+    private String recordStatus;
+
+    /**
+     * 最新打卡结果(来自 risk_inspection_record.result,0正常/1异常)
+     */
+    private String checkResult;
+
+    /**
+     * 项目总数(=itemCount,前端表格用 totalCount 列名)
+     */
+    private Integer totalCount;
+
 }

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

@@ -62,6 +62,8 @@ public class RiskInspectionTaskServiceImpl implements IRiskInspectionTaskService
     public TableDataInfo<RiskInspectionTaskVo> queryPageList(RiskInspectionTaskBo bo, PageQuery pageQuery) {
         LambdaQueryWrapper<RiskInspectionTask> lqw = buildQueryWrapper(bo);
         Page<RiskInspectionTaskVo> page = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        // 填充最新打卡记录字段(联动 APP 端打卡结果)
+        fillLatestRecord(page.getRecords());
         return TableDataInfo.build(page);
     }
 
@@ -71,7 +73,37 @@ public class RiskInspectionTaskServiceImpl implements IRiskInspectionTaskService
     @Override
     public List<RiskInspectionTaskVo> queryList(RiskInspectionTaskBo bo) {
         LambdaQueryWrapper<RiskInspectionTask> lqw = buildQueryWrapper(bo);
-        return baseMapper.selectVoList(lqw);
+        List<RiskInspectionTaskVo> list = baseMapper.selectVoList(lqw);
+        fillLatestRecord(list);
+        return list;
+    }
+
+    /**
+     * 给任务 VO 列表填充最新打卡记录(recordStatus/checkResult/totalCount)
+     * 用于 PC 端列表展示 APP 端的打卡结果
+     */
+    private void fillLatestRecord(List<RiskInspectionTaskVo> taskVos) {
+        if (ObjectUtil.isEmpty(taskVos)) {
+            return;
+        }
+        for (RiskInspectionTaskVo vo : taskVos) {
+            if (vo == null || vo.getId() == null) {
+                continue;
+            }
+            // 项目总数
+            vo.setTotalCount(vo.getItemCount());
+            // 查最新一条打卡记录
+            RiskInspectionRecord latest = recordMapper.selectOne(
+                Wrappers.<RiskInspectionRecord>lambdaQuery()
+                    .eq(RiskInspectionRecord::getTaskId, vo.getId())
+                    .orderByDesc(RiskInspectionRecord::getCheckInTime)
+                    .last("LIMIT 1")
+            );
+            if (latest != null) {
+                vo.setRecordStatus(latest.getRecordStatus());
+                vo.setCheckResult(latest.getResult());
+            }
+        }
     }
 
     /**