🐛 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)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
Set<Long> reboundUserIds = userDeptList.stream()
.map(UserDept::getUserId)
// 本批已同步人员都要对齐部门:即使 findDept 失败没绑上新部门,也必须清掉历史脏关系,
// 否则会继续挂在运输事业部「运营管理部」等旧部门下被列表查出来。
Set<Long> syncedUserIds = userMap.values().stream()
.filter(Objects::nonNull)
.collect(Collectors.toSet());
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)
.filter(userDeptId -> !currentUserDeptIds.contains(userDeptId))
.toList();
@@ -825,6 +826,10 @@ public class OaUserListSyncHelper {
}
Collection<Long> userIds = userMap.values();
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()
.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<User> 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<User> 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);
}