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; }