From 9aa810eae18397cc5e452feedbe453800d9aaa5c Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期一, 26 十月 2026 17:49:59 +0800
Subject: [PATCH] feat(hrm): 支持定位范围打卡

---
 yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/employee/HrmEmployeeServiceImpl.java |   74 +++++++++++++++++++++++++++++++++---
 1 files changed, 67 insertions(+), 7 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 54cc87d..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
@@ -48,6 +48,7 @@
 import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
@@ -103,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();
@@ -185,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);
@@ -370,19 +381,68 @@
                 .filter(Objects::nonNull)
                 .collect(Collectors.toSet());
         Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(deptIds);
+        // 瑙f瀽宀椾綅ID锛坧ost_ids 瀛樼殑鏄� JSON 鏁扮粍瀛楃涓诧紝濡� [38]锛夛紝骞舵壒閲忓姞杞藉矖浣嶅悕绉�
+        Map<Long, List<Long>> empPostIdsMap = new LinkedHashMap<>();
+        Set<Long> allPostIds = new LinkedHashSet<>();
+        for (HrmEmployeeDO emp : list) {
+            List<Long> postIdList = parseEmployeePostIds(emp.getPostIds());
+            empPostIdsMap.put(emp.getId(), postIdList);
+            allPostIds.addAll(postIdList);
+        }
+        Map<Long, PostRespDTO> postMap = CollUtil.isEmpty(allPostIds)
+                ? Collections.emptyMap() : postApi.getPostMap(allPostIds);
         return list.stream().map(emp -> {
             HrmEmployeeSimpleRespVO vo = new HrmEmployeeSimpleRespVO();
             vo.setId(emp.getId());
             vo.setEmployeeNo(emp.getEmployeeNo());
             vo.setName(emp.getName());
             vo.setEmployeeStatus(emp.getEmployeeStatus());
+            vo.setDeptId(emp.getDeptId());
             if (emp.getDeptId() != null && deptMap.containsKey(emp.getDeptId())) {
                 vo.setDeptName(deptMap.get(emp.getDeptId()).getName());
+            }
+            // 宀椾綅淇℃伅锛堢敤浜庤皟宀楃瓑鍦烘櫙鑷姩甯﹀嚭鍘熷矖浣嶏級
+            List<Long> postIdList = empPostIdsMap.getOrDefault(emp.getId(), Collections.emptyList());
+            vo.setPostIds(postIdList);
+            if (CollUtil.isNotEmpty(postIdList)) {
+                vo.setPostName(postIdList.stream()
+                        .map(postMap::get)
+                        .filter(Objects::nonNull)
+                        .map(PostRespDTO::getName)
+                        .collect(Collectors.joining(",")));
             }
             return vo;
         }).collect(Collectors.toList());
     }
 
+    /**
+     * 瑙f瀽鍛樺伐鐨勫矖浣岻D瀛楃涓诧紙JSON 鏁扮粍鏍煎紡锛屽 [38] 鎴� [1,2]锛�
+     */
+
+    /**
+     * 瑙f瀽鍛樺伐宀椾綅ID瀛楃涓诧紙post_ids 瀛� JSON 鏁扮粍锛屽 [38] 鎴� [1,2]锛�
+     */
+    private java.util.List<Long> parseEmployeePostIds(String postIds) {
+        if (StrUtil.isBlank(postIds)) {
+            return Collections.emptyList();
+        }
+
+        // post_ids 褰㈠ "[38]" 鎴� "[1,2]"锛氬幓鎺変腑鎷彿鍚庢寜閫楀彿瑙f瀽
+        return Arrays.stream(postIds.replace("[", "").replace("]", "").split(","))
+                .map(String::trim)
+                .filter(StrUtil::isNotBlank)
+                .map(s -> {
+                    try {
+                        return Long.valueOf(s);
+                    } catch (NumberFormatException ex) {
+                        return null;
+                    }
+                })
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
+    }
+
+
     @Override
     public HrmEmployeeDO getEmployeeByUserId(Long userId) {
         return employeeMapper.selectByUserId(userId);

--
Gitblit v1.9.3