From 488940d9c4a7da12806f6383f5630bea5c673019 Mon Sep 17 00:00:00 2001 From: b2894lxlx <517289602@qq.com> Date: Mon, 26 Oct 2026 09:53:27 +0800 Subject: [PATCH] =?UTF-8?q?:bug:=20OA=E4=BA=BA=E5=91=98=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E5=9C=A8=E9=83=A8=E9=97=A8=E5=8C=B9=E9=85=8D=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?=E6=97=B6=E4=BB=8D=E6=B8=85=E7=90=86=E5=8E=86=E5=8F=B2=E8=84=8F?= =?UTF-8?q?=E9=83=A8=E9=97=A8=E5=85=B3=E7=B3=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- .../service/impl/OaUserListSyncHelper.java | 72 +++++++++++-------- 1 file changed, 44 insertions(+), 28 deletions(-) diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/OaUserListSyncHelper.java b/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/OaUserListSyncHelper.java index f7382827..d4c89dc2 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/OaUserListSyncHelper.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/OaUserListSyncHelper.java @@ -793,12 +793,13 @@ public class OaUserListSyncHelper { .map(UserDept::getId) .filter(Objects::nonNull) .collect(Collectors.toSet()); - Set reboundUserIds = userDeptList.stream() - .map(UserDept::getUserId) + // 本批已同步人员都要对齐部门:即使 findDept 失败没绑上新部门,也必须清掉历史脏关系, + // 否则会继续挂在运输事业部「运营管理部」等旧部门下被列表查出来。 + Set syncedUserIds = userMap.values().stream() .filter(Objects::nonNull) .collect(Collectors.toSet()); List staleUserDeptIds = existingUserDeptList.stream() - .filter(userDept -> userDept.getId() != null && reboundUserIds.contains(userDept.getUserId())) + .filter(userDept -> userDept.getId() != null && syncedUserIds.contains(userDept.getUserId())) .map(UserDept::getId) .filter(userDeptId -> !currentUserDeptIds.contains(userDeptId)) .toList(); @@ -825,6 +826,10 @@ public class OaUserListSyncHelper { } Collection userIds = userMap.values(); List list = userDeptService.queryUserDeptIds(userIds); + Set usersWithDept = list.stream() + .map(UserDeptIdsVO::getUserId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); Set noRoleUserIds = userService.list(Wrappers.lambdaQuery() .in(User::getId, userIds) .and(wrapper -> wrapper.isNull(User::getRoleId) @@ -834,31 +839,42 @@ public class OaUserListSyncHelper { .map(User::getId) .collect(Collectors.toSet()); String defaultRoleId = getDefaultRoleId(); - List updateUserParams = list.stream() - .filter(userDeptIds -> { - if (StringUtils.isBlank(userDeptIds.getDeptIds())) { - return false; - } - int deptIdLength = userDeptIds.getDeptIds().length(); - int deptCodesLength = StringUtils.length(userDeptIds.getDeptCodes()); - if (deptIdLength > MAX_DEPT_ID_LENGTH || deptCodesLength > MAX_DEPT_ID_LENGTH) { - ComposeLogUtil.getLastLog().warn( - "用户部门字段超长已跳过回写 userId={} deptIdLen={} deptCodesLen={} max={}", - userDeptIds.getUserId(), deptIdLength, deptCodesLength, MAX_DEPT_ID_LENGTH); - return false; - } - return true; - }) - .map(userDeptIds -> { - User user = new User(); - user.setId(userDeptIds.getUserId()); - user.setDeptId(userDeptIds.getDeptIds()); - user.setDeptCodes(userDeptIds.getDeptCodes()); - if (noRoleUserIds.contains(userDeptIds.getUserId())) { - user.setRoleId(defaultRoleId); - } - return user; - }).toList(); + List updateUserParams = new ArrayList<>(); + for (UserDeptIdsVO userDeptIds : list) { + if (userDeptIds.getUserId() == null || StringUtils.isBlank(userDeptIds.getDeptIds())) { + continue; + } + int deptIdLength = userDeptIds.getDeptIds().length(); + int deptCodesLength = StringUtils.length(userDeptIds.getDeptCodes()); + if (deptIdLength > MAX_DEPT_ID_LENGTH || deptCodesLength > MAX_DEPT_ID_LENGTH) { + ComposeLogUtil.getLastLog().warn( + "用户部门字段超长已跳过回写 userId={} deptIdLen={} deptCodesLen={} max={}", + userDeptIds.getUserId(), deptIdLength, deptCodesLength, MAX_DEPT_ID_LENGTH); + continue; + } + User user = new User(); + user.setId(userDeptIds.getUserId()); + user.setDeptId(userDeptIds.getDeptIds()); + user.setDeptCodes(userDeptIds.getDeptCodes()); + if (noRoleUserIds.contains(userDeptIds.getUserId())) { + user.setRoleId(defaultRoleId); + } + updateUserParams.add(user); + } + // 本批已同步但已无任何部门关系的人员,清空 blade_user 上残留的 dept_id/dept_codes + for (Long userId : syncedUserIds) { + if (usersWithDept.contains(userId)) { + continue; + } + User user = new User(); + user.setId(userId); + user.setDeptId(""); + user.setDeptCodes(""); + if (noRoleUserIds.contains(userId)) { + user.setRoleId(defaultRoleId); + } + updateUserParams.add(user); + } if (CollectionUtil.isNotEmpty(updateUserParams)) { userService.updateBatchById(updateUserParams); }