fix: 已有部门的用户登录时不再自动覆盖部门设置

This commit is contained in:
Your Name 2026-01-07 11:05:36 +08:00
parent a6997c55f4
commit 599f9ef4a8

View File

@ -498,7 +498,17 @@ public class UserService {
}
// 3. 同步部门(支持多部门)
if (dingDepartments != null && !dingDepartments.isEmpty()) {
// 🔥 重要:如果用户已有部门设置,则不再自动覆盖(保留手动调整的部门)
boolean userHasDepartment = user.getDeptId() != null && user.getDeptId() > 0;
if (userHasDepartment) {
// 用户已有部门,只记录日志,不覆盖
log.info("用户已有部门设置,跳过部门同步: userId={}, deptId={}, deptName={}",
user.getId(), user.getDeptId(), user.getDeptName());
} else if (dingDepartments != null && !dingDepartments.isEmpty()) {
// 用户没有部门,尝试从钉钉同步
log.info("用户无部门设置,尝试从钉钉同步: userId={}", user.getId());
// 匹配多个部门
List<Long> matchedDeptIds = matchSystemDepartments(dingDepartments);
@ -519,22 +529,14 @@ public class UserService {
user.getId(), currentRoleIds);
boolean isAdmin = currentRoleIds != null &&
(currentRoleIds.contains("1") || currentRoleIds.contains("2"));
log.info("syncUserFromDingTalk - isAdmin={}, currentRoleIds.contains('1')={}, currentRoleIds.contains('2')={}",
isAdmin, currentRoleIds != null && currentRoleIds.contains("1"),
currentRoleIds != null && currentRoleIds.contains("2"));
if (!isAdmin) {
// 只有非管理员用户才根据部门类型设置角色
String newRoleIds = "receiving".equals(primaryDept.getDeptType()) ? "5" : "6";
log.info("syncUserFromDingTalk - 非管理员用户,设置角色: userId={}, newRoleIds={}",
user.getId(), newRoleIds);
user.setRoleIds(newRoleIds);
} else {
log.info("用户已是管理员,保留管理员角色: userId={}, roleIds={}",
user.getId(), currentRoleIds);
}
user.setStatus(1); // 启用用户
needUpdate = true;
log.info("同步用户多个部门: userId={}, 部门数量={}, 主部门={}",
log.info("首次同步用户部门: userId={}, 部门数量={}, 主部门={}",
user.getId(), matchedDeptIds.size(), primaryDept.getDeptName());
}
} else {
@ -554,28 +556,16 @@ public class UserService {
user.setDeptName(defaultDept.getDeptName());
// 根据部门类型设置角色(但如果用户已经是管理员,保留管理员角色)
String currentRoleIds = user.getRoleIds();
log.info("syncUserFromDingTalk - 检查管理员角色(默认部门): userId={}, currentRoleIds={}",
user.getId(), currentRoleIds);
boolean isAdmin = currentRoleIds != null &&
(currentRoleIds.contains("1") || currentRoleIds.contains("2"));
log.info("syncUserFromDingTalk - isAdmin={}", isAdmin);
if (!isAdmin) {
// 只有非管理员用户才根据部门类型设置角色
String newRoleIds = "receiving".equals(defaultDept.getDeptType()) ? "5" : "6";
log.info("syncUserFromDingTalk - 非管理员用户,设置角色: userId={}, newRoleIds={}",
user.getId(), newRoleIds);
user.setRoleIds(newRoleIds);
} else {
log.info("用户已是管理员,保留管理员角色: userId={}, roleIds={}",
user.getId(), currentRoleIds);
}
user.setStatus(1); // 启用用户
needUpdate = true;
log.warn("已有用户无法匹配,使用默认部门: userId={}, deptId={}, deptName={}, 钉钉部门: {}",
user.getId(), defaultDept.getId(), defaultDept.getDeptName(),
dingDepartments.stream()
.map(d -> String.valueOf(d.get("name")))
.collect(Collectors.joining(", ")));
log.warn("用户无法匹配钉钉部门,使用默认部门: userId={}, deptId={}, deptName={}",
user.getId(), defaultDept.getId(), defaultDept.getDeptName());
}
}
}