From 5f612ab2f67b2c6f6894c624a7780799526d566d Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期四, 05 十一月 2026 20:20:05 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_business_新高电力' into dev_business_新高电力

---
 yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/employee/HrmEmployeeServiceImpl.java |   62 ++++++++++++++++++++++++++----
 1 files changed, 53 insertions(+), 9 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 424a3ea..35a9635 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
@@ -38,6 +38,7 @@
 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 com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.annotation.Lazy;
@@ -107,10 +108,8 @@
         deptApi.validateDeptList(Collections.singleton(createReqVO.getDeptId()));
         // 2. 鏍¢獙宀椾綅
         postApi.validPostList(Collections.singleton(createReqVO.getPostId()));
-        // 3. 鏍¢獙鎵嬫満鍙锋槸鍚﹀凡瀛樺湪
-        if (employeeMapper.selectByPhone(createReqVO.getPhone()) != null) {
-            throw exception(EMPLOYEE_PHONE_EXISTS);
-        }
+        // 3. 鏍¢獙鎵嬫満鍙锋槸鍚﹀凡瀛樺湪锛堝苟閲婃斁杞垹闄ゅ巻鍙茶褰曞崰鐢ㄧ殑鎵嬫満鍙凤級
+        validatePhoneUniqueAndReleaseStale(null, createReqVO.getPhone());
         // 4. 鍚屾鍒涘缓绯荤粺鐢ㄦ埛
         AdminUserCreateReqDTO userCreateReqDTO = new AdminUserCreateReqDTO();
         userCreateReqDTO.setUsername(createReqVO.getPhone());
@@ -167,6 +166,42 @@
         return employeeId;
     }
 
+    /**
+     * 缁熶竴鎵嬫満鍙峰敮涓�鎬ф牎楠�
+     *
+     * <p>鑳屾櫙锛歨rm_employee.uk_phone 鏄缓鍦� phone 鍒椾笂鐨勫敮涓�绱㈠紩锛堜笉鍚� deleted锛夛紝
+     * 鍥犳銆屽凡杞垹闄や絾鎵嬫満鍙锋湭娓呯┖銆嶇殑鍘嗗彶妗f浼氶暱鏈熷崰鐫�杩欎釜鎵嬫満鍙枫��
+     * 姝ゆ椂 MyBatis-Plus 鐨� selectByPhone 鍥犻�昏緫鍒犻櫎杩囨护鏌ヤ笉鍒板畠锛岄鏍¢獙閫氳繃锛�
+     * 浣嗗啓搴撴椂鏁版嵁搴撲粛浼氭姏 DuplicateKeyException锛屾帴鍙h〃鐜颁负 500銆岀郴缁熷紓甯搞�嶃��</p>
+     *
+     * <p>澶勭悊绛栫暐锛堜笉鏀瑰簱缁撴瀯锛夛細
+     * 1. 鑻ユ墜鏈哄彿琚�屽凡杞垹闄ゃ�嶇殑鍘嗗彶璁板綍鍗犵敤 鈫� 鑷姩娓呯┖璇ュ巻鍙茶褰曠殑鎵嬫満鍙凤紝閲婃斁鍞竴绱㈠紩锛�
+     * 2. 鑻ヨ銆屾湭鍒犻櫎銆嶇殑鍏朵粬鍛樺伐鍗犵敤 鈫� 鎶涗笟鍔″紓甯搞�屾墜鏈哄彿宸插瓨鍦ㄣ�嶏紝涓嶅啀杩斿洖 500銆�</p>
+     *
+     * @param selfId 褰撳墠姝e湪鏂板/淇敼鐨勫憳宸ョ紪鍙凤紙鏂板浼� null锛夛紱鍛戒腑鑷韩鏃惰烦杩�
+     * @param phone  寰呮牎楠岀殑鎵嬫満鍙�
+     */
+    private void validatePhoneUniqueAndReleaseStale(Long selfId, String phone) {
+        if (StrUtil.isBlank(phone)) {
+            return;
+        }
+        // 1. 閲婃斁琚蒋鍒犻櫎鍘嗗彶璁板綍鍗犵敤鐨勬墜鏈哄彿
+        HrmEmployeeDO staleHolder = employeeMapper.selectByPhoneIncludeDeleted(phone);
+        if (staleHolder != null && !Objects.equals(staleHolder.getId(), selfId)
+                && Boolean.TRUE.equals(staleHolder.getDeleted())) {
+            employeeMapper.update(null, new LambdaUpdateWrapper<HrmEmployeeDO>()
+                    .eq(HrmEmployeeDO::getId, staleHolder.getId())
+                    .set(HrmEmployeeDO::getPhone, null));
+            log.info("[validatePhoneUniqueAndReleaseStale][閲婃斁鍘嗗彶杞垹闄ゅ憳宸�({})鍗犵敤鐨勬墜鏈哄彿]",
+                    staleHolder.getId());
+        }
+        // 2. 鏍¢獙鏄惁浠嶈娲昏穬鍛樺伐鍗犵敤
+        HrmEmployeeDO exist = employeeMapper.selectByPhone(phone);
+        if (exist != null && !Objects.equals(exist.getId(), selfId)) {
+            throw exception(EMPLOYEE_PHONE_EXISTS);
+        }
+    }
+
     private String generateUniqueEmployeeNo() {
         String employeeNo = noRedisDAO.generateEmployeeNo();
         if (employeeMapper.selectByEmployeeNo(employeeNo) != null) {
@@ -184,10 +219,9 @@
         deptApi.validateDeptList(Collections.singleton(updateReqVO.getDeptId()));
         // 鏍¢獙宀椾綅
         postApi.validPostList(Collections.singleton(updateReqVO.getPostId()));
-        // 鏍¢獙鎵嬫満鍙锋槸鍚﹀凡瀛樺湪锛堝鏋滄墜鏈哄彿鏈夊彉鏇达級
-        if (!Objects.equals(employee.getPhone(), updateReqVO.getPhone())
-                && employeeMapper.selectByPhone(updateReqVO.getPhone()) != null) {
-            throw exception(EMPLOYEE_PHONE_EXISTS);
+        // 鏍¢獙鎵嬫満鍙锋槸鍚﹀凡瀛樺湪锛堝鏋滄墜鏈哄彿鏈夊彉鏇达紱骞堕噴鏀捐蒋鍒犻櫎鍘嗗彶璁板綍鍗犵敤鐨勬墜鏈哄彿锛�
+        if (!Objects.equals(employee.getPhone(), updateReqVO.getPhone())) {
+            validatePhoneUniqueAndReleaseStale(updateReqVO.getId(), updateReqVO.getPhone());
         }
         // 鏇存柊鍛樺伐涓昏〃
         HrmEmployeeDO updateObj = BeanUtils.toBean(updateReqVO, HrmEmployeeDO.class);
@@ -286,7 +320,15 @@
         educationMapper.deleteByEmployeeId(id);
         workHistoryMapper.deleteByEmployeeId(id);
         emergencyContactMapper.deleteByEmployeeId(id);
-        // 3. 鍒犻櫎鍛樺伐
+        // 3. 杞垹闄ゅ墠閲婃斁鍞竴绾︽潫瀛楁锛岄伩鍏嶅巻鍙叉暟鎹暱鏈熷崰鐢� uk_phone / uk_user_id锛�
+        //    瀵艰嚧鍚庣画鏂版。妗堜娇鐢ㄥ悓涓�鎵嬫満鍙锋垨缁戝畾鍚屼竴璐﹀彿鏃舵挒鏁版嵁搴撳敮涓�绱㈠紩锛堣〃鐜颁负 500锛�
+        //    娉細employee_no 涓� NOT NULL 涓� uk_employee_no 鏈惈 deleted锛岃繖閲屼笉缃┖锛�
+        //    浣嗘妸 user_id 缃┖鍙噴鏀� uk_user_id锛涙墜鏈哄彿缃┖鍙噴鏀� uk_phone銆�
+        employeeMapper.update(null, new LambdaUpdateWrapper<HrmEmployeeDO>()
+                .eq(HrmEmployeeDO::getId, id)
+                .set(HrmEmployeeDO::getPhone, null)
+                .set(HrmEmployeeDO::getUserId, null));
+        // 4. 鍒犻櫎鍛樺伐
         employeeMapper.deleteById(id);
     }
 
@@ -474,6 +516,8 @@
                     }
                 }
                 HrmEmployeeSaveReqVO save = buildImportSaveReqVO(row, deptMatches.get(0).getId(), postMatches.get(0).getId(), roleIds);
+                // 瀵煎叆鍓嶅厛閲婃斁琚蒋鍒犻櫎鍘嗗彶璁板綍鍗犵敤鐨勬墜鏈哄彿锛岄伩鍏嶆暣琛屽鍏ュ洜鍞竴绱㈠紩鍐茬獊澶辫触
+                validatePhoneUniqueAndReleaseStale(null, row.getPhone());
                 HrmEmployeeDO existing = employeeMapper.selectByPhone(row.getPhone());
                 if (existing == null) {
                     if (row.getGender() == null) throw exception(EMPLOYEE_IMPORT_FIELD_REQUIRED, "鎬у埆");

--
Gitblit v1.9.3