🐛 OA人员同步在部门匹配失败时仍清理历史脏部门关系

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-10-26 09:53:27 +08:00
parent 3b5507ab2e
commit 488940d9c4
@@ -793,12 +793,13 @@ public class OaUserListSyncHelper {
.map(UserDept::getId) .map(UserDept::getId)
.filter(Objects::nonNull) .filter(Objects::nonNull)
.collect(Collectors.toSet()); .collect(Collectors.toSet());
Set<Long> reboundUserIds = userDeptList.stream() // 本批已同步人员都要对齐部门:即使 findDept 失败没绑上新部门,也必须清掉历史脏关系,
.map(UserDept::getUserId) // 否则会继续挂在运输事业部「运营管理部」等旧部门下被列表查出来。
Set<Long> syncedUserIds = userMap.values().stream()
.filter(Objects::nonNull) .filter(Objects::nonNull)
.collect(Collectors.toSet()); .collect(Collectors.toSet());
List<Long> staleUserDeptIds = existingUserDeptList.stream() List<Long> staleUserDeptIds = existingUserDeptList.stream()
.filter(userDept -> userDept.getId() != null && reboundUserIds.contains(userDept.getUserId())) .filter(userDept -> userDept.getId() != null && syncedUserIds.contains(userDept.getUserId()))
.map(UserDept::getId) .map(UserDept::getId)
.filter(userDeptId -> !currentUserDeptIds.contains(userDeptId)) .filter(userDeptId -> !currentUserDeptIds.contains(userDeptId))
.toList(); .toList();
@@ -825,6 +826,10 @@ public class OaUserListSyncHelper {
} }
Collection<Long> userIds = userMap.values(); Collection<Long> userIds = userMap.values();
List<UserDeptIdsVO> list = userDeptService.queryUserDeptIds(userIds); List<UserDeptIdsVO> list = userDeptService.queryUserDeptIds(userIds);
Set<Long> usersWithDept = list.stream()
.map(UserDeptIdsVO::getUserId)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
Set<Long> noRoleUserIds = userService.list(Wrappers.<User>lambdaQuery() Set<Long> noRoleUserIds = userService.list(Wrappers.<User>lambdaQuery()
.in(User::getId, userIds) .in(User::getId, userIds)
.and(wrapper -> wrapper.isNull(User::getRoleId) .and(wrapper -> wrapper.isNull(User::getRoleId)
@@ -834,31 +839,42 @@ public class OaUserListSyncHelper {
.map(User::getId) .map(User::getId)
.collect(Collectors.toSet()); .collect(Collectors.toSet());
String defaultRoleId = getDefaultRoleId(); String defaultRoleId = getDefaultRoleId();
List<User> updateUserParams = list.stream() List<User> updateUserParams = new ArrayList<>();
.filter(userDeptIds -> { for (UserDeptIdsVO userDeptIds : list) {
if (StringUtils.isBlank(userDeptIds.getDeptIds())) { if (userDeptIds.getUserId() == null || StringUtils.isBlank(userDeptIds.getDeptIds())) {
return false; continue;
} }
int deptIdLength = userDeptIds.getDeptIds().length(); int deptIdLength = userDeptIds.getDeptIds().length();
int deptCodesLength = StringUtils.length(userDeptIds.getDeptCodes()); int deptCodesLength = StringUtils.length(userDeptIds.getDeptCodes());
if (deptIdLength > MAX_DEPT_ID_LENGTH || deptCodesLength > MAX_DEPT_ID_LENGTH) { if (deptIdLength > MAX_DEPT_ID_LENGTH || deptCodesLength > MAX_DEPT_ID_LENGTH) {
ComposeLogUtil.getLastLog().warn( ComposeLogUtil.getLastLog().warn(
"用户部门字段超长已跳过回写 userId={} deptIdLen={} deptCodesLen={} max={}", "用户部门字段超长已跳过回写 userId={} deptIdLen={} deptCodesLen={} max={}",
userDeptIds.getUserId(), deptIdLength, deptCodesLength, MAX_DEPT_ID_LENGTH); userDeptIds.getUserId(), deptIdLength, deptCodesLength, MAX_DEPT_ID_LENGTH);
return false; continue;
} }
return true; User user = new User();
}) user.setId(userDeptIds.getUserId());
.map(userDeptIds -> { user.setDeptId(userDeptIds.getDeptIds());
User user = new User(); user.setDeptCodes(userDeptIds.getDeptCodes());
user.setId(userDeptIds.getUserId()); if (noRoleUserIds.contains(userDeptIds.getUserId())) {
user.setDeptId(userDeptIds.getDeptIds()); user.setRoleId(defaultRoleId);
user.setDeptCodes(userDeptIds.getDeptCodes()); }
if (noRoleUserIds.contains(userDeptIds.getUserId())) { updateUserParams.add(user);
user.setRoleId(defaultRoleId); }
} // 本批已同步但已无任何部门关系的人员,清空 blade_user 上残留的 dept_id/dept_codes
return user; for (Long userId : syncedUserIds) {
}).toList(); 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)) { if (CollectionUtil.isNotEmpty(updateUserParams)) {
userService.updateBatchById(updateUserParams); userService.updateBatchById(updateUserParams);
} }