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