Browse Source

feat(risk-inspectionTask): 移动端登录改造+巡检审核模块+DB增量脚本

1. 后端 SecurityConfig(application.yml)
   - 移除 /risk/inspectionTask/mobileList 的免登录配置
   - 移动端任务列表改为登录后访问,inspectorId 从 token 取

2. RiskInspectionTaskController#mobileList
   - 删除硬编码 inspectorId=1 的兜底
   - 改为 StpUtil.getLoginIdAsLong() 取当前登录用户

3. sql/risk_control_platform.sql (主脚本同步 2026-07-06 增量)
   - risk_inspection_record 加 5 个审核字段+idx_audit_status
   - risk_special_equipment 加 next_maintenance_date/maintenance_status+2 索引
   - risk_equipment_maintenance 加 next_maintenance_date
   - sys_dict_data 追加 7 项 (handle_result/audit_status/maintenance_status)
   - sys_dict_type 追加 risk_handle_result

4. sql/risk_update_20260706.sql (新增,幂等增量脚本)
   - 用于已有环境升级,所有 ALTER/INSERT 均幂等
yangjingjing 2 days ago
parent
commit
f7dc5de8f4

+ 2 - 2
ruoyi-admin/src/main/resources/application.yml

@@ -132,8 +132,8 @@ security:
     - /resource/sse/close
     - /resource/sse
     - /captchaImage
-    # 移动端登录接口(uniapp)
-    - /risk/inspectionTask/mobileList
+    # 移动端登录接口(uniapp,要求登录后访问,inspectorId 从 token 取)
+    # 注意: /risk/inspectionTask/mobileList 已不再排除,必须登录
     - /risk/inspectionTask/mobileDetail/**
     - /risk/inspectionTask/verifyQr
     - /risk/inspectionRecord/punch

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

@@ -1,6 +1,7 @@
 package org.dromara.risk.controller;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.dev33.satoken.stp.StpUtil;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotEmpty;
@@ -127,19 +128,19 @@ public class RiskInspectionTaskController extends BaseController {
 
     /**
      * 移动端-查询我的巡检任务列表(分页,带打卡状态)
+     * <p>
+     * 登录态: 从 Sa-Token 取当前登录用户ID 作为 inspectorId;
+     *        若未登录(Sa-Token 抛 NotLoginException)则拒绝访问。
+     *        移动端不再允许匿名查询。
      *
-     * @param inspectorId 巡检人ID(可空,空则默认取 admin 用户,用于演示)
-     * @param status      任务状态: PENDING-待打卡 / PUNCHED-已打卡 / OVERDUE-已逾期 / FINISHED-已完成
+     * @param status 任务状态: PENDING-待打卡 / PUNCHED-已打卡 / OVERDUE-已逾期 / FINISHED-已完成
      */
     @GetMapping("/mobileList")
     public TableDataInfo<org.dromara.risk.domain.vo.MobileInspectionTaskVo> mobileList(
-        @RequestParam(required = false) Long inspectorId,
         @RequestParam(required = false) String status,
         PageQuery pageQuery) {
-        // 演示阶段未登录,默认查询 admin(id=1)的任务
-        if (inspectorId == null) {
-            inspectorId = 1L;
-        }
+        // 移动端登录态取当前用户作为巡检人,获取"我的巡检任务"
+        Long inspectorId = StpUtil.getLoginIdAsLong();
         return inspectionTaskService.queryMobileList(inspectorId, status, pageQuery);
     }
 

File diff suppressed because it is too large
+ 14 - 3
sql/risk_control_platform.sql


+ 252 - 0
sql/risk_update_20260706.sql

@@ -0,0 +1,252 @@
+-- =============================================================
+-- 风控平台 数据库增量脚本  2026-07-06
+-- 适用版本: risk_control_platform 2026-07-06 之前的部署
+-- 合并自以下三份独立脚本(均已在 2026-07-06 当天执行过):
+--   1. risk_hidden_danger_dict.sql          隐患处理结果字典
+--   2. risk_inspection_record_audit.sql     巡检记录审核字段 + audit_status 字典
+--   3. risk_special_equipment_maintenance.sql 特种设备维护字段 + maintenance_status 字典
+--
+-- 本脚本特征:
+--   - 全部 SQL 幂等,可重复执行(基于 INFORMATION_SCHEMA 判断)
+--   - 新环境用 risk_control_platform.sql 部署;已有环境用本脚本增量升级
+--   - 不修改业务表已有数据,只补字段、索引、字典
+-- =============================================================
+
+SET NAMES utf8mb4;
+
+-- =============================================================
+-- 1. 巡检记录表 risk_inspection_record 加审核字段
+-- =============================================================
+
+-- 1.1 audit_status
+SET @sql = (SELECT IF(
+  (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
+     WHERE TABLE_SCHEMA = DATABASE()
+       AND TABLE_NAME   = 'risk_inspection_record'
+       AND COLUMN_NAME  = 'audit_status') = 0,
+  'ALTER TABLE `risk_inspection_record` ADD COLUMN `audit_status` VARCHAR(20) DEFAULT ''待审核'' COMMENT ''审核状态(待审核/审核通过/审核不通过)''',
+  'SELECT 1'));
+PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
+
+-- 1.2 auditor_id
+SET @sql = (SELECT IF(
+  (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
+     WHERE TABLE_SCHEMA = DATABASE()
+       AND TABLE_NAME   = 'risk_inspection_record'
+       AND COLUMN_NAME  = 'auditor_id') = 0,
+  'ALTER TABLE `risk_inspection_record` ADD COLUMN `auditor_id` BIGINT DEFAULT NULL COMMENT ''审核人ID''',
+  'SELECT 1'));
+PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
+
+-- 1.3 auditor_name
+SET @sql = (SELECT IF(
+  (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
+     WHERE TABLE_SCHEMA = DATABASE()
+       AND TABLE_NAME   = 'risk_inspection_record'
+       AND COLUMN_NAME  = 'auditor_name') = 0,
+  'ALTER TABLE `risk_inspection_record` ADD COLUMN `auditor_name` VARCHAR(50) DEFAULT NULL COMMENT ''审核人''',
+  'SELECT 1'));
+PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
+
+-- 1.4 audit_time
+SET @sql = (SELECT IF(
+  (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
+     WHERE TABLE_SCHEMA = DATABASE()
+       AND TABLE_NAME   = 'risk_inspection_record'
+       AND COLUMN_NAME  = 'audit_time') = 0,
+  'ALTER TABLE `risk_inspection_record` ADD COLUMN `audit_time` DATETIME DEFAULT NULL COMMENT ''审核时间''',
+  'SELECT 1'));
+PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
+
+-- 1.5 audit_opinion
+SET @sql = (SELECT IF(
+  (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
+     WHERE TABLE_SCHEMA = DATABASE()
+       AND TABLE_NAME   = 'risk_inspection_record'
+       AND COLUMN_NAME  = 'audit_opinion') = 0,
+  'ALTER TABLE `risk_inspection_record` ADD COLUMN `audit_opinion` TEXT COMMENT ''审核意见/不通过原因''',
+  'SELECT 1'));
+PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
+
+-- 1.6 索引 idx_audit_status
+SET @sql = (SELECT IF(
+  (SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS
+     WHERE TABLE_SCHEMA = DATABASE()
+       AND TABLE_NAME   = 'risk_inspection_record'
+       AND INDEX_NAME   = 'idx_audit_status') = 0,
+  'ALTER TABLE `risk_inspection_record` ADD KEY `idx_audit_status` (`audit_status`)',
+  'SELECT 1'));
+PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
+
+
+-- =============================================================
+-- 2. 特种设备表 risk_special_equipment 加维护字段
+-- =============================================================
+
+-- 2.1 next_maintenance_date
+SET @sql = (SELECT IF(
+  (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
+     WHERE TABLE_SCHEMA = DATABASE()
+       AND TABLE_NAME   = 'risk_special_equipment'
+       AND COLUMN_NAME  = 'next_maintenance_date') = 0,
+  'ALTER TABLE `risk_special_equipment` ADD COLUMN `next_maintenance_date` DATE DEFAULT NULL COMMENT ''下次维护时间(完成维护时由用户录入)'' AFTER `install_date`',
+  'SELECT 1'));
+PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
+
+-- 2.2 maintenance_status
+SET @sql = (SELECT IF(
+  (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
+     WHERE TABLE_SCHEMA = DATABASE()
+       AND TABLE_NAME   = 'risk_special_equipment'
+       AND COLUMN_NAME  = 'maintenance_status') = 0,
+  'ALTER TABLE `risk_special_equipment` ADD COLUMN `maintenance_status` VARCHAR(20) DEFAULT ''未维护'' COMMENT ''维护状态(未维护/待维护/维护中/正常)'' AFTER `next_maintenance_date`',
+  'SELECT 1'));
+PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
+
+-- 2.3 索引 idx_maintenance_status
+SET @sql = (SELECT IF(
+  (SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS
+     WHERE TABLE_SCHEMA = DATABASE()
+       AND TABLE_NAME   = 'risk_special_equipment'
+       AND INDEX_NAME   = 'idx_maintenance_status') = 0,
+  'ALTER TABLE `risk_special_equipment` ADD KEY `idx_maintenance_status` (`maintenance_status`)',
+  'SELECT 1'));
+PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
+
+-- 2.4 索引 idx_next_maintenance_date
+SET @sql = (SELECT IF(
+  (SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS
+     WHERE TABLE_SCHEMA = DATABASE()
+       AND TABLE_NAME   = 'risk_special_equipment'
+       AND INDEX_NAME   = 'idx_next_maintenance_date') = 0,
+  'ALTER TABLE `risk_special_equipment` ADD KEY `idx_next_maintenance_date` (`next_maintenance_date`)',
+  'SELECT 1'));
+PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
+
+-- 2.5 初始化历史设备 maintenance_status
+UPDATE `risk_special_equipment`
+   SET `maintenance_status` = '未维护'
+ WHERE `maintenance_status` IS NULL OR `maintenance_status` = '';
+
+
+-- =============================================================
+-- 3. 维护记录表 risk_equipment_maintenance 加字段
+-- =============================================================
+
+SET @sql = (SELECT IF(
+  (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
+     WHERE TABLE_SCHEMA = DATABASE()
+       AND TABLE_NAME   = 'risk_equipment_maintenance'
+       AND COLUMN_NAME  = 'next_maintenance_date') = 0,
+  'ALTER TABLE `risk_equipment_maintenance` ADD COLUMN `next_maintenance_date` DATE DEFAULT NULL COMMENT ''下次维护时间(维护完成时录入)'' AFTER `actual_end_time`',
+  'SELECT 1'));
+PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
+
+
+-- =============================================================
+-- 4. 字典 seed: 隐患处理结果 risk_handle_result
+-- =============================================================
+
+-- 4.1 字典类型
+INSERT INTO `sys_dict_type`
+    (`dict_name`, `dict_type`, `status`, `create_dept`, `create_by`, `create_time`, `remark`)
+VALUES
+    ('隐患处理结果', 'risk_handle_result', '0', 103, 1, NOW(), '安全隐患处理结果字典')
+ON DUPLICATE KEY UPDATE `update_time` = NOW();
+
+-- 4.2 字典数据 seed(只保留隐患已处置 / 隐患误报 两项)
+DELETE FROM `sys_dict_data`
+ WHERE `dict_type` = 'risk_handle_result'
+   AND `dict_value` IN ('隐患已消除', '已设置警戒', '已上报整改', '临时管控', '其他');
+
+INSERT INTO `sys_dict_data`
+    (`dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `status`, `create_dept`, `create_by`, `create_time`, `remark`)
+VALUES
+    (1, '隐患已处置', '隐患已处置', 'risk_handle_result', '', 'success', 'N', '0', 103, 1, NOW(), '隐患已经现场处置完成'),
+    (2, '隐患误报',   '隐患误报',   'risk_handle_result', '', 'info',    'N', '0', 103, 1, NOW(), '经核实为误报,无需处置')
+ON DUPLICATE KEY UPDATE `update_time` = NOW();
+
+
+-- =============================================================
+-- 5. 字典 seed: 审核状态 audit_status (巡检/作业/人员变动通用)
+-- =============================================================
+
+-- 5.1 字典类型(若不存在则补)
+INSERT IGNORE INTO `sys_dict_type`
+    (`dict_name`, `dict_type`, `remark`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`)
+VALUES
+    ('审核状态', 'audit_status', '巡检/作业/人员变动等业务通用审核状态', 103, 1, NOW(), 1, NOW());
+
+-- 5.2 字典数据
+DELETE FROM `sys_dict_data`
+ WHERE `dict_type` = 'audit_status'
+   AND `dict_label` IN ('待审核', '审核通过', '审核不通过');
+
+INSERT INTO `sys_dict_data`
+    (`dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `remark`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`)
+VALUES
+    (1, '待审核',     '待审核',     'audit_status', '', 'warning', 'N', '巡检人提交后默认状态', 103, 1, NOW(), 1, NOW()),
+    (2, '审核通过',   '审核通过',   'audit_status', '', 'success', 'N', '审核人审核通过',       103, 1, NOW(), 1, NOW()),
+    (3, '审核不通过', '审核不通过', 'audit_status', '', 'danger',  'N', '审核不通过需填原因',   103, 1, NOW(), 1, NOW());
+
+
+-- =============================================================
+-- 6. 字典 seed: 维护状态 maintenance_status
+-- =============================================================
+
+INSERT INTO `sys_dict_data`
+    (`dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `status`, `create_dept`, `create_by`, `create_time`, `remark`)
+SELECT  0, '未维护',  '未维护',  'maintenance_status', '', 'info',    'N', '0', 103, 1, NOW(), '设备从未做过维护'
+  FROM DUAL
+ WHERE NOT EXISTS (SELECT 1 FROM `sys_dict_data` WHERE `dict_type` = 'maintenance_status' AND `dict_value` = '未维护');
+
+INSERT INTO `sys_dict_data`
+    (`dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `status`, `create_dept`, `create_by`, `create_time`, `remark`)
+SELECT 10, '待维护',  '待维护',  'maintenance_status', '', 'warning', 'N', '0', 103, 1, NOW(), '下一次维护时间已过'
+  FROM DUAL
+ WHERE NOT EXISTS (SELECT 1 FROM `sys_dict_data` WHERE `dict_type` = 'maintenance_status' AND `dict_value` = '待维护');
+
+INSERT INTO `sys_dict_data`
+    (`dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `status`, `create_dept`, `create_by`, `create_time`, `remark`)
+SELECT 20, '维护中',  '维护中',  'maintenance_status', '', 'primary', 'N', '0', 103, 1, NOW(), '正在进行维护作业'
+  FROM DUAL
+ WHERE NOT EXISTS (SELECT 1 FROM `sys_dict_data` WHERE `dict_type` = 'maintenance_status' AND `dict_value` = '维护中');
+
+INSERT INTO `sys_dict_data`
+    (`dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `status`, `create_dept`, `create_by`, `create_time`, `remark`)
+SELECT 30, '已维护',  '已维护',  'maintenance_status', '', 'success', 'N', '0', 103, 1, NOW(), '本次维护已完成且尚未到期'
+  FROM DUAL
+ WHERE NOT EXISTS (SELECT 1 FROM `sys_dict_data` WHERE `dict_type` = 'maintenance_status' AND `dict_value` = '已维护');
+
+
+-- =============================================================
+-- 7. (可选)历史数据清洗
+-- =============================================================
+
+-- 7.1 隐患历史"处理中"状态归并到"待处理"
+UPDATE `risk_hidden_danger`
+   SET `handle_status` = '待处理'
+ WHERE `handle_status` = '处理中';
+
+
+-- =============================================================
+-- 8. 验证清单(可手动 SELECT 确认)
+-- =============================================================
+-- SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS
+--   WHERE TABLE_SCHEMA = DATABASE()
+--     AND TABLE_NAME = 'risk_inspection_record'
+--     AND COLUMN_NAME IN ('audit_status','auditor_id','auditor_name','audit_time','audit_opinion');
+--
+-- SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS
+--   WHERE TABLE_SCHEMA = DATABASE()
+--     AND TABLE_NAME = 'risk_special_equipment'
+--     AND COLUMN_NAME IN ('next_maintenance_date','maintenance_status');
+--
+-- SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS
+--   WHERE TABLE_SCHEMA = DATABASE()
+--     AND TABLE_NAME = 'risk_equipment_maintenance'
+--     AND COLUMN_NAME = 'next_maintenance_date';
+--
+-- SELECT dict_type, dict_label, dict_value FROM sys_dict_data
+--  WHERE dict_type IN ('risk_handle_result','audit_status','maintenance_status')
+--  ORDER BY dict_type, dict_sort;

Some files were not shown because too many files changed in this diff