From cc5438a25896d19f02b652865781dc443b274354 Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期三, 28 十月 2026 14:26:23 +0800
Subject: [PATCH] feat(hrm): 员工档案与系统账号双向同步

---
 yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/employee/HrmEmployeeServiceImpl.java |   63 ++++++++++++++++++++++++++++++-
 1 files changed, 60 insertions(+), 3 deletions(-)

diff --git a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/employee/HrmEmployeeServiceImpl.java b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/employee/HrmEmployeeServiceImpl.java
index 0e6ffcc..6a0e028 100644
--- a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/employee/HrmEmployeeServiceImpl.java
+++ b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/employee/HrmEmployeeServiceImpl.java
@@ -37,7 +37,9 @@
 import cn.iocoder.yudao.module.system.api.permission.dto.RoleRespDTO;
 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserCreateReqDTO;
+import cn.iocoder.yudao.module.system.api.user.dto.AdminUserSyncReqDTO;
 import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -65,6 +67,7 @@
  */
 @Service
 @Validated
+@Slf4j
 public class HrmEmployeeServiceImpl implements HrmEmployeeService {
 
     @Resource
@@ -201,12 +204,39 @@
             adminUserApi.updateUserPassword(employee.getUserId(), updateReqVO.getPassword());
         }
 
+        // 鍚屾绯荤粺璐﹀彿鍙搴斿瓧娈碉紙濮撳悕 / 鎵嬫満鍙� / 閮ㄩ棬 / 鎬у埆 / 閭锛�
+        if (employee.getUserId() != null) {
+            syncSystemUserForEmployee(employee, updateReqVO);
+        }
+
         // 鍚屾鏁欒偛缁忓巻
         syncEducationList(employeeId, updateReqVO.getEducations());
         // 鍚屾宸ヤ綔缁忓巻
         syncWorkHistoryList(employeeId, updateReqVO.getWorkHistories());
         // 鍚屾绱ф�ヨ仈绯讳汉
         syncEmergencyContactList(employeeId, updateReqVO.getEmergencyContacts());
+    }
+
+    /**
+     * 鍛樺伐淇敼鍚庯紝鎶婂彲涓�涓�瀵瑰簲鐨勫瓧娈靛悓姝ュ埌绯荤粺璐﹀彿銆�
+     *
+     * 鍙悓姝ワ細濮撳悕鈫旀樀绉般�佹墜鏈哄彿鈫攎obile銆侀儴闂ㄣ�佹�у埆銆侀偖绠便��
+     * 鐧诲綍鍚� username銆佸矖浣嶃�佽鑹层�佺姸鎬佷笉鍚屾銆�
+     * 鍚屾澶辫触鍙褰曟棩蹇楋紝涓嶉樆鏂憳宸ヤ慨鏀逛富娴佺▼銆�
+     */
+    private void syncSystemUserForEmployee(HrmEmployeeDO employee, HrmEmployeeSaveReqVO reqVO) {
+        try {
+            AdminUserSyncReqDTO dto = new AdminUserSyncReqDTO();
+            dto.setUserId(employee.getUserId());
+            dto.setNickname(reqVO.getName() != null ? reqVO.getName() : employee.getName());
+            dto.setMobile(reqVO.getPhone() != null ? reqVO.getPhone() : employee.getPhone());
+            dto.setDeptId(reqVO.getDeptId() != null ? reqVO.getDeptId() : employee.getDeptId());
+            dto.setSex(reqVO.getGender() != null ? reqVO.getGender() : employee.getGender());
+            dto.setEmail(reqVO.getEmail() != null ? reqVO.getEmail() : employee.getEmail());
+            adminUserApi.updateUserForEmployee(dto);
+        } catch (Exception ex) {
+            log.warn("[updateEmployee][鍛樺伐({}) 鍚屾璐﹀彿({}) 澶辫触锛屽凡蹇界暐]", employee.getId(), employee.getUserId(), ex);
+        }
     }
 
     private void syncEducationList(Long employeeId, List<HrmEmployeeEducationSaveReqVO> newList) {
@@ -249,15 +279,42 @@
     @Transactional(rollbackFor = Exception.class)
     public void deleteEmployee(Long id) {
         // 鏍¢獙瀛樺湪
-        validateEmployeeExists(id);
-        // 绾ц仈鍒犻櫎瀛愯〃
+        HrmEmployeeDO employee = validateEmployeeExists(id);
+        // 1. 鑱斿姩鍒犻櫎绯荤粺璐﹀彿锛堜笉鍙戝竷浜嬩欢锛岄伩鍏嶅洖鐜級
+        deleteLinkedSystemUser(employee);
+        // 2. 绾ц仈鍒犻櫎瀛愯〃
         educationMapper.deleteByEmployeeId(id);
         workHistoryMapper.deleteByEmployeeId(id);
         emergencyContactMapper.deleteByEmployeeId(id);
-        // 鍒犻櫎鍛樺伐
+        // 3. 鍒犻櫎鍛樺伐
         employeeMapper.deleteById(id);
     }
 
+    /**
+     * 鍒犻櫎鍛樺伐鏃惰仈鍔ㄥ垹闄ゅ叾绯荤粺璐﹀彿銆�
+     *
+     * 瀹堝崼锛�
+     * 1. 鏈粦瀹氳处鍙� -> 璺宠繃
+     * 2. 鍐呯疆 admin锛坕d=1锛� -> 璺宠繃
+     * 3. 鍚屼竴璐﹀彿琚鏉″憳宸ユ。妗堝紩鐢� -> 璺宠繃锛堜竴鍛樺伐涓�璐﹀彿绾﹀畾涓嬩笉搴斿嚭鐜帮級
+     */
+    private void deleteLinkedSystemUser(HrmEmployeeDO employee) {
+        Long userId = employee.getUserId();
+        if (userId == null) {
+            return;
+        }
+        if (Long.valueOf(1L).equals(userId)) {
+            log.warn("[deleteEmployee][鍛樺伐({}) 缁戝畾鐨勬槸鍐呯疆绠$悊鍛樿处鍙�({})锛屼笉鑷姩鍒犻櫎璐﹀彿]", employee.getId(), userId);
+            return;
+        }
+        Long count = employeeMapper.selectCount(HrmEmployeeDO::getUserId, userId);
+        if (count != null && count > 1) {
+            log.warn("[deleteEmployee][璐﹀彿({}) 鍏宠仈浜� {} 鏉″憳宸ユ。妗堬紝涓嶈嚜鍔ㄥ垹闄よ处鍙穄", userId, count);
+            return;
+        }
+        adminUserApi.deleteUserSilently(userId);
+    }
+
     private HrmEmployeeDO validateEmployeeExists(Long id) {
         HrmEmployeeDO employee = employeeMapper.selectById(id);
         if (employee == null) {

--
Gitblit v1.9.3