From eab4b6ba2ab6b80d903ed94b68ef59e138ab7fb9 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 7 Jan 2026 10:40:44 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E9=92=89=E9=92=89?= =?UTF-8?q?=E9=83=A8=E9=97=A8=E5=8C=B9=E9=85=8D=E9=80=BB=E8=BE=91=EF=BC=8C?= =?UTF-8?q?=E4=BC=98=E5=85=88=E5=8C=B9=E9=85=8D=E5=AD=90=E9=83=A8=E9=97=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/designhub/service/UserService.java | 49 +++++++++++++++++-- 1 file changed, 45 insertions(+), 4 deletions(-) diff --git a/backend/src/main/java/com/designhub/service/UserService.java b/backend/src/main/java/com/designhub/service/UserService.java index 25a5e01..c7a728e 100644 --- a/backend/src/main/java/com/designhub/service/UserService.java +++ b/backend/src/main/java/com/designhub/service/UserService.java @@ -1317,15 +1317,44 @@ public class UserService { } } - // 2. 通过部门名称模糊匹配 + // 2. 优先通过部门名称完全相等匹配 if (matched == null && dingDeptName != null) { matched = systemDepts.stream() - .filter(d -> d.getDeptName().contains(dingDeptName) || - dingDeptName.contains(d.getDeptName())) + .filter(d -> d.getDeptName().equals(dingDeptName)) .findFirst() .orElse(null); if (matched != null) { - log.info("通过部门名称模糊匹配: {} -> {}", dingDeptName, matched.getDeptName()); + log.info("通过部门名称精确匹配: {} -> {}", dingDeptName, matched.getDeptName()); + } + } + + // 3. 通过部门名称模糊匹配,优先选择层级更深的部门(有parentId的) + if (matched == null && dingDeptName != null) { + List fuzzyMatched = systemDepts.stream() + .filter(d -> d.getDeptName().contains(dingDeptName) || + dingDeptName.contains(d.getDeptName())) + .collect(Collectors.toList()); + + if (!fuzzyMatched.isEmpty()) { + // 优先选择层级更深的部门(有parentId的优先,然后按名称相似度排序) + matched = fuzzyMatched.stream() + .sorted((a, b) -> { + // 1. 优先选择有parentId的(子部门) + int levelCompare = Boolean.compare(a.getParentId() == null, b.getParentId() == null); + if (levelCompare != 0) return levelCompare; + + // 2. 如果都有或都没有parentId,按名称长度差异排序(越接近越好) + int diffA = Math.abs(a.getDeptName().length() - dingDeptName.length()); + int diffB = Math.abs(b.getDeptName().length() - dingDeptName.length()); + return Integer.compare(diffA, diffB); + }) + .findFirst() + .orElse(null); + + if (matched != null) { + log.info("通过部门名称模糊匹配: {} -> {} (候选数: {})", + dingDeptName, matched.getDeptName(), fuzzyMatched.size()); + } } } @@ -1334,6 +1363,18 @@ public class UserService { } } + // 对匹配结果进行排序:优先返回层级更深的部门 + if (matchedDeptIds.size() > 1) { + matchedDeptIds.sort((id1, id2) -> { + Department d1 = systemDepts.stream().filter(d -> d.getId().equals(id1)).findFirst().orElse(null); + Department d2 = systemDepts.stream().filter(d -> d.getId().equals(id2)).findFirst().orElse(null); + if (d1 == null || d2 == null) return 0; + // 有parentId的排前面 + return Boolean.compare(d1.getParentId() == null, d2.getParentId() == null); + }); + log.info("部门匹配结果排序后(优先子部门): {}", matchedDeptIds); + } + return matchedDeptIds; }