From 81c76ca9e4741b71747b16eec61d0a00bec9f1f3 Mon Sep 17 00:00:00 2001
From: xiaoyi <908147524@qq.com>
Date: 星期四, 29 十月 2026 11:14:19 +0800
Subject: [PATCH] fix(safety): 特种作业证持证人改为关联员工档案,不再手填姓名

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/safety/SafetyCertificateService.java |   74 +++++++++++++++++++++++++++++++------
 1 files changed, 62 insertions(+), 12 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/safety/SafetyCertificateService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/safety/SafetyCertificateService.java
index 84f7a7f..575cddb 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/safety/SafetyCertificateService.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/safety/SafetyCertificateService.java
@@ -1,8 +1,11 @@
 package cn.iocoder.yudao.module.mes.service.safety;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.hrm.api.employee.HrmEmployeeApi;
+import cn.iocoder.yudao.module.hrm.api.employee.dto.HrmEmployeeSimpleDTO;
 import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.cert.SafetyCertificatePageReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.cert.SafetyCertificateRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.cert.SafetyCertificateSaveReqVO;
@@ -17,7 +20,9 @@
 import java.time.LocalDate;
 import java.time.temporal.ChronoUnit;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.mes.enums.SafetyErrorCodeConstants.*;
@@ -27,6 +32,10 @@
  *
  * <p>鏍稿績鑳藉姏锛氳瘉涔﹀埌鏈熻嚜鍔ㄩ璀︺�傜姸鎬佺敱 {@link #resolveStatus} 鏍规嵁鏈夋晥鏈熷疄鏃舵帹瀵硷紝
  * 涓嶄緷璧栨墜宸ョ淮鎶わ紝閬垮厤杩囨湡鏈強鏃舵洿鏂扮姸鎬併��</p>
+ *
+ * <p>鎸佽瘉浜洪�氳繃 employeeId 鍏宠仈浜哄姏璧勬簮鐨勫憳宸ユ。妗堬細
+ * 鏂板/淇敼鏃朵粠妗f甯﹀嚭濮撳悕銆佸伐鍙枫�侀儴闂ㄥ苟钀戒负蹇収锛涙煡璇㈡椂瀹炴椂鍥炲~鏈�鏂版。妗堜俊鎭紝
+ * 鍛樺伐璋冨矖鍚庤瘉浠跺垪琛ㄤ篃浼氳窡鐫�鏄剧ず鏂伴儴闂ㄣ��</p>
  *
  * @author 瓒呯骇绠$悊鍛�
  */
@@ -39,11 +48,13 @@
 
     @Resource
     private SafetyCertificateMapper certificateMapper;
+    @Resource
+    private HrmEmployeeApi hrmEmployeeApi;
 
     public Long createCertificate(SafetyCertificateSaveReqVO reqVO) {
         reqVO.setId(null);
         validateCertificateForCreate(reqVO);
-        SafetyCertificateDO cert = buildCertificate(reqVO);
+        SafetyCertificateDO cert = buildCertificate(reqVO, null);
         certificateMapper.insert(cert);
         return cert.getId();
     }
@@ -51,7 +62,7 @@
     public void updateCertificate(SafetyCertificateSaveReqVO reqVO) {
         SafetyCertificateDO old = validateCertificateExists(reqVO.getId());
         validateCertificateForUpdate(reqVO, old);
-        SafetyCertificateDO cert = buildCertificate(reqVO);
+        SafetyCertificateDO cert = buildCertificate(reqVO, old);
         certificateMapper.updateById(cert);
     }
 
@@ -79,15 +90,47 @@
     }
 
     /**
-     * 鍒嗛〉缁撴灉鐨勫睍绀哄瓧娈佃ˉ鍏紙绫诲瀷鍚嶇О銆佺姸鎬佸悕绉般�佸墿浣欏ぉ鏁帮級
+     * 鎵归噺琛ュ叏鎸佽瘉浜虹殑鏈�鏂板憳宸ユ。妗堜俊鎭紙濮撳悕銆佸伐鍙枫�侀儴闂ㄣ�佹墜鏈恒�佸叧鑱旂敤鎴凤級
+     *
+     * <p>鏌ヨ鏃剁敤妗f瀹炴椂鍊艰鐩栧揩鐓у�硷紝淇濊瘉鍛樺伐璋冨矖鍚庡彴璐﹀悓姝ワ紱
+     * 鍛樺伐妗f宸茶鍒犻櫎鏃跺洖閫�鍒板揩鐓у�硷紝淇濊瘉鍘嗗彶璇佷欢浠嶅彲灞曠ず銆�</p>
      */
-    public static void fillDisplayFields(SafetyCertificateDO cert, SafetyCertificateRespVO respVO) {
+    public void fillEmployeeInfo(List<SafetyCertificateDO> certs) {
+        List<Long> employeeIds = certs.stream()
+                .map(SafetyCertificateDO::getEmployeeId)
+                .filter(Objects::nonNull).distinct().toList();
+        Map<Long, HrmEmployeeSimpleDTO> employeeMap = employeeIds.isEmpty() ? Map.of()
+                : hrmEmployeeApi.getEmployeeList(employeeIds).stream()
+                        .collect(Collectors.toMap(HrmEmployeeSimpleDTO::getId, e -> e, (a, b) -> a));
+        certs.forEach(cert -> {
+            HrmEmployeeSimpleDTO employee = employeeMap.get(cert.getEmployeeId());
+            if (employee != null) {
+                cert.setEmployeeName(employee.getName());
+                cert.setEmployeeNo(employee.getEmployeeNo());
+                cert.setDeptName(employee.getDeptName());
+            }
+        });
+    }
+
+    /**
+     * 鍗曚釜璇佷欢鐨勫睍绀哄瓧娈佃ˉ鍏紙绫诲瀷鍚嶇О銆佺姸鎬佸悕绉般�佸墿浣欏ぉ鏁般�佹寔璇佷汉妗f锛�
+     */
+    public void fillDisplayFields(SafetyCertificateDO cert, SafetyCertificateRespVO respVO) {
         respVO.setCertTypeName(SafetyCertificateTypeEnum.getNameByType(cert.getCertType()));
         String status = resolveStatus(cert.getExpireDate(), cert.getWarnDays(), cert.getStatus());
         respVO.setStatus(status);
         respVO.setStatusName(SafetyCertificateStatusEnum.getNameByStatus(status));
         if (cert.getExpireDate() != null) {
             respVO.setRemainingDays(ChronoUnit.DAYS.between(LocalDate.now(), cert.getExpireDate()));
+        }
+        HrmEmployeeSimpleDTO employee = cert.getEmployeeId() == null ? null
+                : hrmEmployeeApi.getEmployee(cert.getEmployeeId());
+        if (employee != null) {
+            respVO.setEmployeeName(employee.getName());
+            respVO.setEmployeeNo(employee.getEmployeeNo());
+            respVO.setDeptName(employee.getDeptName());
+            respVO.setPhone(employee.getPhone());
+            respVO.setUserId(employee.getUserId());
         }
     }
 
@@ -116,12 +159,24 @@
         return SafetyCertificateStatusEnum.VALID.getStatus();
     }
 
-    private SafetyCertificateDO buildCertificate(SafetyCertificateSaveReqVO reqVO) {
+    /**
+     * 鏋勫缓 DO锛氭寔璇佷汉濮撳悕/宸ュ彿/閮ㄩ棬浠庡憳宸ユ。妗堝甫鍑哄苟钀戒负蹇収
+     */
+    private SafetyCertificateDO buildCertificate(SafetyCertificateSaveReqVO reqVO, SafetyCertificateDO old) {
+        HrmEmployeeSimpleDTO employee = hrmEmployeeApi.getEmployee(reqVO.getEmployeeId());
+        if (employee == null) {
+            throw exception(SAFETY_CERT_EMPLOYEE_NOT_EXISTS);
+        }
         SafetyCertificateDO cert = BeanUtils.toBean(reqVO, SafetyCertificateDO.class);
-        cert.setEmployeeName(StrUtil.trim(reqVO.getEmployeeName()));
+        cert.setEmployeeId(employee.getId());
+        cert.setEmployeeName(employee.getName());
+        cert.setEmployeeNo(employee.getEmployeeNo());
+        cert.setDeptName(employee.getDeptName());
         cert.setCertNo(StrUtil.trim(reqVO.getCertNo()));
         cert.setWarnDays(reqVO.getWarnDays() == null ? DEFAULT_WARN_DAYS : reqVO.getWarnDays());
-        cert.setStatus(resolveStatus(reqVO.getExpireDate(), cert.getWarnDays(), reqVO.getStatus()));
+        // 宸叉敞閿�鐘舵�佷笉鍏佽閫氳繃缂栬緫鏀瑰洖
+        String currentStatus = old == null ? reqVO.getStatus() : old.getStatus();
+        cert.setStatus(resolveStatus(reqVO.getExpireDate(), cert.getWarnDays(), currentStatus));
         cert.setRemark(reqVO.getRemark() == null ? "" : reqVO.getRemark().trim());
         return cert;
     }
@@ -138,11 +193,6 @@
         SafetyCertificateDO byCertNo = certificateMapper.selectByCertNo(StrUtil.trim(reqVO.getCertNo()));
         if (byCertNo != null && !byCertNo.getId().equals(old.getId())) {
             throw exception(SAFETY_CERT_NO_DUPLICATE);
-        }
-        // 淇濈暀鍘熺姸鎬佷腑鐨勩�屽凡娉ㄩ攢銆嶏紝涓嶅厑璁搁�氳繃缂栬緫闅忔剰鏀瑰洖
-        if (SafetyCertificateStatusEnum.REVOKED.getStatus().equals(old.getStatus())
-                && !SafetyCertificateStatusEnum.REVOKED.getStatus().equals(reqVO.getStatus())) {
-            reqVO.setStatus(SafetyCertificateStatusEnum.REVOKED.getStatus());
         }
     }
 

--
Gitblit v1.9.3