From ce96310177bdd6d24ac90bd6f92d8def30b680af Mon Sep 17 00:00:00 2001
From: tuqin <tuqin@tuqin.cn>
Date: 星期一, 26 十月 2026 13:58:23 +0800
Subject: [PATCH] fix(hrm): 修复修改员工时的「部门不存在」与「系统异常」

---
 yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/employee/HrmEmployeeServiceImpl.java |   24 +++++++++++++++++-------
 yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java      |    1 +
 yudao-module-hrm-api/src/main/java/cn/iocoder/yudao/module/hrm/enums/ErrorCodeConstants.java            |    2 ++
 yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/mysql/employee/HrmEmployeeMapper.java    |   16 ++++++++++++++++
 4 files changed, 36 insertions(+), 7 deletions(-)

diff --git a/yudao-module-hrm-api/src/main/java/cn/iocoder/yudao/module/hrm/enums/ErrorCodeConstants.java b/yudao-module-hrm-api/src/main/java/cn/iocoder/yudao/module/hrm/enums/ErrorCodeConstants.java
index 3af9511..1d0a320 100644
--- a/yudao-module-hrm-api/src/main/java/cn/iocoder/yudao/module/hrm/enums/ErrorCodeConstants.java
+++ b/yudao-module-hrm-api/src/main/java/cn/iocoder/yudao/module/hrm/enums/ErrorCodeConstants.java
@@ -31,6 +31,8 @@
     ErrorCode EMPLOYEE_CONTRACT_IMPORT_EMPLOYEE_NAME_NOT_EXISTS = new ErrorCode(1_030_000_018, "鍛樺伐濮撳悕銆恵}銆戜笉瀛樺湪锛岃鍏堢淮鎶ゅ憳宸ユ。妗�");
     ErrorCode EMPLOYEE_CONTRACT_IMPORT_EMPLOYEE_NAME_MULTIPLE = new ErrorCode(1_030_000_019, "鍛樺伐濮撳悕銆恵}銆戝搴斿涓憳宸ユ。妗堬紝鏃犳硶鑷姩鍖归厤锛岃鍏堝湪椤甸潰鎵嬪伐涓鸿鍛樺伐鏂板鍚堝悓");
     ErrorCode EMPLOYEE_CONTRACT_IMPORT_CONTRACT_EXISTS = new ErrorCode(1_030_000_020, "璇ュ憳宸ャ�恵}銆戝凡瀛樺湪鐩稿悓绫诲瀷銆佺浉鍚屽紑濮嬫棩鏈熺殑鍚堝悓锛屽闇�瑕嗙洊璇峰嬀閫夆�滃凡瀛樺湪鏃舵洿鏂扳��");
+    ErrorCode EMPLOYEE_PHONE_OCCUPIED_BY_DELETED = new ErrorCode(1_030_000_021, "鎵嬫満鍙枫�恵}銆戝凡琚竴鏉°�愬凡鍒犻櫎銆戠殑鍛樺伐妗f鍗犵敤锛岃鏇存崲鎵嬫満鍙凤紝鎴栬仈绯荤鐞嗗憳娓呯悊璇ュ巻鍙叉。妗�");
+    ErrorCode EMPLOYEE_NO_OCCUPIED_BY_DELETED = new ErrorCode(1_030_000_022, "鍛樺伐缂栧彿銆恵}銆戝凡琚竴鏉°�愬凡鍒犻櫎銆戠殑鍛樺伐妗f鍗犵敤锛岃鏇存崲鍛樺伐缂栧彿锛屾垨鑱旂郴绠$悊鍛樻竻鐞嗚鍘嗗彶妗f");
 
     // ========== 璇峰亣鐢宠 1-030-001-000 ==========
     ErrorCode LEAVE_APPLICATION_NOT_EXISTS = new ErrorCode(1_030_001_000, "璇峰亣鐢宠涓嶅瓨鍦�");
diff --git a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/mysql/employee/HrmEmployeeMapper.java b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/mysql/employee/HrmEmployeeMapper.java
index 0a48fa0..7ce97b7 100644
--- a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/mysql/employee/HrmEmployeeMapper.java
+++ b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/mysql/employee/HrmEmployeeMapper.java
@@ -7,6 +7,8 @@
 import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeePageReqVO;
 import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeDO;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
 
 import java.util.Collection;
 import java.util.List;
@@ -23,6 +25,20 @@
         return selectOne(HrmEmployeeDO::getPhone, phone);
     }
 
+    /**
+     * 鎸夋墜鏈哄彿鏌ヨ锛�**鍖呭惈宸查�昏緫鍒犻櫎鐨勮褰�**锛夈��
+     * 鍞竴鎬ф牎楠屽繀椤诲寘鍚凡鍒犻櫎璁板綍锛歨rm_employee.uk_phone 鍞竴绱㈠紩涓嶅尯鍒� deleted锛�
+     * 鑻ュ彧鏌ユ湭鍒犻櫎璁板綍浼氭紡鍒わ紝鍐欏簱鏃舵姏鍞竴绾︽潫寮傚父锛屽墠绔〃鐜颁负鈥滅郴缁熷紓甯糕�濄��
+     */
+    @Select("SELECT * FROM hrm_employee WHERE phone = #{phone} LIMIT 1")
+    HrmEmployeeDO selectByPhoneIgnoreDeleted(@Param("phone") String phone);
+
+    /**
+     * 鎸夊憳宸ョ紪鍙锋煡璇紙**鍖呭惈宸查�昏緫鍒犻櫎鐨勮褰�**锛夛紝鐢ㄩ�斿悓涓娿��
+     */
+    @Select("SELECT * FROM hrm_employee WHERE employee_no = #{employeeNo} LIMIT 1")
+    HrmEmployeeDO selectByEmployeeNoIgnoreDeleted(@Param("employeeNo") String employeeNo);
+
     default HrmEmployeeDO selectByName(String name) {
         return selectOne(HrmEmployeeDO::getName, name);
     }
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 d32b4c5..f2a01a6 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
@@ -104,9 +104,15 @@
         deptApi.validateDeptList(Collections.singleton(createReqVO.getDeptId()));
         // 2. 鏍¢獙宀椾綅
         postApi.validPostList(createReqVO.getPostIds());
-        // 3. 鏍¢獙鎵嬫満鍙锋槸鍚﹀凡瀛樺湪
-        if (employeeMapper.selectByPhone(createReqVO.getPhone()) != null) {
-            throw exception(EMPLOYEE_PHONE_EXISTS);
+        // 3. 鏍¢獙鎵嬫満鍙锋槸鍚﹀凡瀛樺湪锛�**鍖呭惈宸插垹闄ゆ。妗�**锛歶k_phone 鍞竴绱㈠紩涓嶅尯鍒� deleted锛�
+        //    鍙煡鏈垹闄よ褰曚細婕忓垽锛屽鑷村啓搴撴椂鎶涘敮涓�绾︽潫寮傚父锛屽墠绔樉绀衡�滅郴缁熷紓甯糕�濓級
+        if (createReqVO.getPhone() != null) {
+            HrmEmployeeDO existPhone = employeeMapper.selectByPhoneIgnoreDeleted(createReqVO.getPhone());
+            if (existPhone != null) {
+                throw existPhone.getDeleted() != null && existPhone.getDeleted()
+                        ? exception(EMPLOYEE_PHONE_OCCUPIED_BY_DELETED, createReqVO.getPhone())
+                        : exception(EMPLOYEE_PHONE_EXISTS);
+            }
         }
         // 4. 鍚屾鍒涘缓绯荤粺鐢ㄦ埛
         AdminUserCreateReqDTO userCreateReqDTO = new AdminUserCreateReqDTO();
@@ -186,10 +192,14 @@
         deptApi.validateDeptList(Collections.singleton(updateReqVO.getDeptId()));
         // 鏍¢獙宀椾綅
         postApi.validPostList(updateReqVO.getPostIds());
-        // 鏍¢獙鎵嬫満鍙锋槸鍚﹀凡瀛樺湪锛堝鏋滄墜鏈哄彿鏈夊彉鏇达級
-        if (!Objects.equals(employee.getPhone(), updateReqVO.getPhone())
-                && employeeMapper.selectByPhone(updateReqVO.getPhone()) != null) {
-            throw exception(EMPLOYEE_PHONE_EXISTS);
+        // 鏍¢獙鎵嬫満鍙锋槸鍚﹀凡瀛樺湪锛堝鏋滄墜鏈哄彿鏈夊彉鏇达紱**鍖呭惈宸插垹闄ゆ。妗�**锛屽師鍥犺 createEmployee锛�
+        if (!Objects.equals(employee.getPhone(), updateReqVO.getPhone()) && updateReqVO.getPhone() != null) {
+            HrmEmployeeDO existPhone = employeeMapper.selectByPhoneIgnoreDeleted(updateReqVO.getPhone());
+            if (existPhone != null && !Objects.equals(existPhone.getId(), updateReqVO.getId())) {
+                throw existPhone.getDeleted() != null && existPhone.getDeleted()
+                        ? exception(EMPLOYEE_PHONE_OCCUPIED_BY_DELETED, updateReqVO.getPhone())
+                        : exception(EMPLOYEE_PHONE_EXISTS);
+            }
         }
         // 鏇存柊鍛樺伐涓昏〃
         HrmEmployeeDO updateObj = BeanUtils.toBean(updateReqVO, HrmEmployeeDO.class);
diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java
index 360f66d..9e14757 100644
--- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java
+++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java
@@ -223,6 +223,7 @@
     }
 
     @Override
+    @DataPermission(enable = false) // 浠呮牎楠岄儴闂ㄦ槸鍚﹀瓨鍦�/鍚敤锛屼笉鍙楁暟鎹潈闄愰檺鍒讹紙鍚﹀垯闈炶秴绠′細璇姤"閮ㄩ棬涓嶅瓨鍦�"锛�
     public void validateDeptList(Collection<Long> ids) {
         if (CollUtil.isEmpty(ids)) {
             return;

--
Gitblit v1.9.3