From 9d4cbff7464ebfd7803c2ce53ded49d0f73fe011 Mon Sep 17 00:00:00 2001
From: longz <longzhaoz@qq.com>
Date: 星期一, 29 六月 2026 20:33:55 +0800
Subject: [PATCH] 初步调整fix

---
 backend/src/main/java/com/sinata/appointment/service/DeptManageApplicationService.java |  102 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 102 insertions(+), 0 deletions(-)

diff --git a/backend/src/main/java/com/sinata/appointment/service/DeptManageApplicationService.java b/backend/src/main/java/com/sinata/appointment/service/DeptManageApplicationService.java
index 0a35c1e..9de25ae 100644
--- a/backend/src/main/java/com/sinata/appointment/service/DeptManageApplicationService.java
+++ b/backend/src/main/java/com/sinata/appointment/service/DeptManageApplicationService.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.sinata.appointment.constants.BizErrorCode;
+import com.sinata.appointment.constants.MiniUserType;
 import com.sinata.appointment.dto.DeptCreateRequest;
 import com.sinata.appointment.dto.DeptTreeNodeVo;
 import com.sinata.appointment.dto.DeptUpdateRequest;
@@ -86,6 +87,7 @@
         d.setDeptName(trimName(req.getDeptName()));
         d.setStatus(normalizeStatus(req.getStatus()));
         d.setSortOrder(0);
+        applyDeptLeaders(d, req.getLeaderIds());
         sysDeptMapper.insert(d);
         SysDept fresh = sysDeptMapper.selectById(d.getId());
         if (fresh == null || !StringUtils.hasText(fresh.getUuid())) {
@@ -102,6 +104,7 @@
         SysDept d = loadActiveWithUuid(id, req.getUuid());
         d.setDeptName(trimName(req.getDeptName()));
         d.setStatus(normalizeStatus(req.getStatus()));
+        applyDeptLeaders(d, req.getLeaderIds());
 
         Long oldParent = d.getParentId() == null ? 0L : d.getParentId();
         if (oldParent == 0L) {
@@ -183,6 +186,47 @@
             cur = p;
         }
         return false;
+    }
+
+    private void applyDeptLeaders(SysDept dept, List<Long> leaderIds) {
+        List<Long> normalized = normalizeLeaderIds(leaderIds);
+        validateLeaders(normalized);
+        dept.setLeaderIds(joinIds(normalized));
+    }
+
+    private List<Long> normalizeLeaderIds(List<Long> leaderIds) {
+        List<Long> raw = leaderIds == null ? new ArrayList<>() : new ArrayList<>(leaderIds);
+        List<Long> out = new ArrayList<>();
+        Set<Long> seen = new HashSet<>();
+        for (Long id : raw) {
+            if (id == null || id <= 0 || !seen.add(id)) {
+                continue;
+            }
+            out.add(id);
+        }
+        return out;
+    }
+
+    private void validateLeaders(List<Long> leaderIds) {
+        if (leaderIds == null || leaderIds.isEmpty()) {
+            return;
+        }
+        List<MpUser> users =
+                mpUserMapper.selectList(
+                        new LambdaQueryWrapper<MpUser>()
+                                .eq(MpUser::getDelFlag, 0)
+                                .eq(MpUser::getStatus, 1)
+                                .eq(MpUser::getUserType, MiniUserType.EMPLOYEE)
+                                .in(MpUser::getId, leaderIds));
+        Set<Long> validIds = new HashSet<>();
+        for (MpUser user : users) {
+            validIds.add(user.getId());
+        }
+        for (Long id : leaderIds) {
+            if (!validIds.contains(id)) {
+                throw new BizException(BizErrorCode.RESOURCE_VERIFY_FAILED, "部门负责人不存在或已禁用: " + id);
+            }
+        }
     }
 
     private int subtreeHeight(long id, Map<Long, List<SysDept>> byParent) {
@@ -284,9 +328,67 @@
         v.setDeptName(d.getDeptName());
         v.setSortOrder(d.getSortOrder());
         v.setStatus(d.getStatus() == null ? 1 : d.getStatus());
+        List<Long> leaderIds = parseLeaderIds(d);
+        v.setLeaderIds(leaderIds);
+        v.setLeaderNames(resolveLeaderNames(leaderIds));
         return v;
     }
 
+    private List<Long> parseLeaderIds(SysDept dept) {
+        return parseIds(dept.getLeaderIds());
+    }
+
+    private List<Long> parseIds(String raw) {
+        if (!StringUtils.hasText(raw)) {
+            return List.of();
+        }
+        List<Long> ids = new ArrayList<>();
+        Set<Long> seen = new HashSet<>();
+        for (String part : raw.split(",")) {
+            if (!StringUtils.hasText(part)) {
+                continue;
+            }
+            try {
+                Long id = Long.parseLong(part.trim());
+                if (id > 0 && seen.add(id)) {
+                    ids.add(id);
+                }
+            } catch (NumberFormatException ignored) {
+            }
+        }
+        return ids;
+    }
+
+    private String joinIds(List<Long> ids) {
+        if (ids == null || ids.isEmpty()) {
+            return null;
+        }
+        return ids.stream().map(String::valueOf).collect(java.util.stream.Collectors.joining(","));
+    }
+
+    private String resolveLeaderNames(List<Long> leaderIds) {
+        if (leaderIds == null || leaderIds.isEmpty()) {
+            return null;
+        }
+        List<MpUser> users =
+                mpUserMapper.selectList(
+                        new LambdaQueryWrapper<MpUser>()
+                                .eq(MpUser::getDelFlag, 0)
+                                .in(MpUser::getId, leaderIds));
+        Map<Long, String> names = new HashMap<>();
+        for (MpUser user : users) {
+            names.put(user.getId(), user.getNickName());
+        }
+        List<String> ordered = new ArrayList<>();
+        for (Long id : leaderIds) {
+            String name = names.get(id);
+            if (StringUtils.hasText(name)) {
+                ordered.add(name.trim());
+            }
+        }
+        return ordered.isEmpty() ? null : String.join("、", ordered);
+    }
+
     private SysDept loadActive(long id) {
         SysDept d = sysDeptMapper.selectById(id);
         if (d == null || d.getDelFlag() != null && d.getDelFlag() == 1) {

--
Gitblit v1.7.1