ソースを参照

fix(risk-hiddenDanger): 隐患编号自动生成 + 处理接口权限修正

1. RiskHiddenDangerController
   - handle 方法权限从 risk:hiddenDanger:edit 改为 risk:hiddenDanger:handle
     (与菜单 sys_menu 中 '隐患处理' 权限对齐,只有勾选处理权限才能点)
   - add 方法移除强制 setDangerCode(null),改由 Service 生成

2. RiskHiddenDangerServiceImpl
   - 新增 generateDangerCode() 私有方法:AHD + yyyyMMddHHmmss + 3位随机数
     冲突自动重试 5 次,极端情况用 UUID 兜底
     确保 UNIQUE KEY uk_danger_code 不冲突
   - insertByBo:若前端未传 dangerCode 则自动生成,避免插入空串导致报表/导出无法识别
yangjingjing 3 日 前
コミット
b526a0000e

+ 2 - 5
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/controller/RiskHiddenDangerController.java

@@ -67,10 +67,7 @@ public class RiskHiddenDangerController extends BaseController {
     @RepeatSubmit()
     @PostMapping
     public R<Void> add(@Validated(AddGroup.class) @RequestBody RiskHiddenDangerBo bo) {
-        if (ObjectUtil.isNull(bo.getId())) {
-            // 编号由系统生成,无需前端传入
-            bo.setDangerCode(null);
-        }
+        // 隐患编号由 Service 自动生成,前端无需传入
         return toAjax(hiddenDangerService.insertByBo(bo));
     }
 
@@ -138,7 +135,7 @@ public class RiskHiddenDangerController extends BaseController {
     /**
      * 处理隐患
      */
-    @SaCheckPermission("risk:hiddenDanger:edit")
+    @SaCheckPermission("risk:hiddenDanger:handle")
     @Log(title = "安全隐患", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PutMapping("/handle/{id}")

+ 30 - 1
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/service/impl/RiskHiddenDangerServiceImpl.java

@@ -1,5 +1,6 @@
 package org.dromara.risk.service.impl;
 
+import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -17,6 +18,8 @@ import org.dromara.risk.mapper.RiskHiddenDangerMapper;
 import org.dromara.risk.service.IRiskHiddenDangerService;
 import org.springframework.stereotype.Service;
 
+import java.text.SimpleDateFormat;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -92,7 +95,11 @@ public class RiskHiddenDangerServiceImpl implements IRiskHiddenDangerService {
     public int insertByBo(RiskHiddenDangerBo bo) {
         // 发现时间前端不传时取当前时间
         if (bo.getDiscoverTime() == null) {
-            bo.setDiscoverTime(new java.util.Date());
+            bo.setDiscoverTime(new Date());
+        }
+        // 隐患编号:前端未传时系统自动生成(确保 UNIQUE 索引不冲突)
+        if (StringUtils.isBlank(bo.getDangerCode())) {
+            bo.setDangerCode(generateDangerCode());
         }
         RiskHiddenDanger add = MapstructUtils.convert(bo, RiskHiddenDanger.class);
         int row = baseMapper.insert(add);
@@ -100,6 +107,28 @@ public class RiskHiddenDangerServiceImpl implements IRiskHiddenDangerService {
         return row;
     }
 
+    /**
+     * 生成隐患编号:AHD + yyyyMMddHHmmss + 3位随机数
+     * 冲突时自动重试(最多 5 次),保证 UNIQUE KEY uk_danger_code 不冲突
+     */
+    private String generateDangerCode() {
+        String prefix = "AHD";
+        String ts = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
+        java.util.concurrent.ThreadLocalRandom random = java.util.concurrent.ThreadLocalRandom.current();
+        for (int i = 0; i < 5; i++) {
+            String suffix = StringUtils.leftPad(
+                Integer.toString(random.nextInt(1000)), 3, '0');
+            String code = prefix + ts + suffix;
+            Long exists = baseMapper.selectCount(Wrappers.<RiskHiddenDanger>lambdaQuery()
+                .eq(RiskHiddenDanger::getDangerCode, code));
+            if (exists == null || exists == 0) {
+                return code;
+            }
+        }
+        // 极端情况:同秒生成的 5 个都撞了,加 UUID 后缀兜底
+        return prefix + ts + IdUtil.fastSimpleUUID().substring(0, 4).toUpperCase();
+    }
+
     /**
      * 修改安全隐患
      */