实现部门自动创建功能:同步钉钉部门时自动创建不存在的部门,修复已有用户部门分配逻辑

This commit is contained in:
Your Name 2026-01-02 13:42:23 +08:00
parent 5f75dd3888
commit 43c6a6ce36
2 changed files with 105 additions and 24 deletions

View File

@ -6,6 +6,7 @@ import com.designhub.entity.DingTalkConfig;
import com.designhub.exception.BusinessException;
import com.designhub.mapper.DepartmentMapper;
import com.designhub.mapper.DingTalkConfigMapper;
import org.springframework.util.StringUtils;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
@ -574,9 +575,47 @@ public class DingTalkService {
departmentMapper.updateById(sysDept);
log.info("更新部门: id={}, name={}, ding_dept_id={}", sysDept.getId(), deptName, dingDeptId);
} else {
// 部门不存在,可以选择创建或跳过
// 这里选择跳过,因为部门应该先在系统中创建
log.warn("系统部门不存在,跳过同步: name={}, ding_dept_id={}", deptName, dingDeptId);
// 部门不存在,自动创建
try {
Long parentId = 0L;
if (parentDingDeptId != null && !parentDingDeptId.equals("1")) {
// 查找父部门的系统ID
com.designhub.entity.Department parentDept = departmentMapper.selectOne(
new LambdaQueryWrapper<com.designhub.entity.Department>()
.eq(com.designhub.entity.Department::getDingDeptId, parentDingDeptId)
.eq(com.designhub.entity.Department::getDeleted, 0)
.last("LIMIT 1")
);
if (parentDept != null) {
parentId = parentDept.getId();
}
}
// 根据部门名称智能判断部门类型(可根据实际业务规则调整)
String deptType = inferDeptType(deptName);
// 创建新部门
com.designhub.entity.Department newDept = new com.designhub.entity.Department();
newDept.setDeptName(deptName);
newDept.setDingDeptId(dingDeptId);
newDept.setDeptType(deptType);
newDept.setParentId(parentId);
newDept.setStatus(1); // 启用
newDept.setSortOrder(0);
departmentMapper.insert(newDept);
// 初始化积分池会在DepartmentService.createDepartment中处理
// 这里直接调用createDepartment会触发积分池初始化
// 但为了避免循环依赖,我们直接使用mapper插入,积分池可以稍后初始化
// 如果需要积分池,可以在后台手动初始化,或者用户首次使用时会自动创建
log.info("自动创建部门: id={}, name={}, ding_dept_id={}, type={}, parentId={}",
newDept.getId(), deptName, dingDeptId, deptType, parentId);
} catch (Exception e) {
log.error("自动创建部门失败: name={}, ding_dept_id={}", deptName, dingDeptId, e);
// 创建失败不影响其他部门的同步,继续处理下一个
}
}
syncCount++;
}

View File

@ -488,29 +488,71 @@ public class UserService {
}
// 3. 检查部门是否需要更新
if (user.getDeptId() != null && dingDepartments != null && !dingDepartments.isEmpty()) {
Department currentDept = departmentMapper.selectById(user.getDeptId());
if (currentDept != null && StringUtils.hasText(currentDept.getDingDeptId())) {
// 检查用户是否还在原部门
boolean stillInDept = dingDepartments.stream()
.anyMatch(d -> currentDept.getDingDeptId().equals(d.get("dept_id").toString()));
if (!stillInDept) {
String newDeptNames = dingDepartments.stream()
.map(d -> String.valueOf(d.get("name")))
.collect(Collectors.joining(","));
log.warn("用户钉钉部门已变化: userId={}, 原部门={}, 钉钉部门={}",
user.getId(), currentDept.getDeptName(), newDeptNames);
if (dingDepartments != null && !dingDepartments.isEmpty()) {
if (user.getDeptId() != null) {
// 用户已有部门:检查是否需要更新
Department currentDept = departmentMapper.selectById(user.getDeptId());
if (currentDept != null && StringUtils.hasText(currentDept.getDingDeptId())) {
// 检查用户是否还在原部门
boolean stillInDept = dingDepartments.stream()
.anyMatch(d -> currentDept.getDingDeptId().equals(d.get("dept_id").toString()));
// 尝试重新匹配部门
Long newDeptId = matchSystemDepartment(dingDepartments);
if (newDeptId != null && !newDeptId.equals(user.getDeptId())) {
Department newDept = departmentMapper.selectById(newDeptId);
user.setDeptId(newDeptId);
user.setDeptName(newDept.getDeptName());
if (!stillInDept) {
String newDeptNames = dingDepartments.stream()
.map(d -> String.valueOf(d.get("name")))
.collect(Collectors.joining(","));
log.warn("用户钉钉部门已变化: userId={}, 原部门={}, 钉钉部门={}",
user.getId(), currentDept.getDeptName(), newDeptNames);
// 尝试重新匹配部门
Long newDeptId = matchSystemDepartment(dingDepartments);
if (newDeptId != null && !newDeptId.equals(user.getDeptId())) {
Department newDept = departmentMapper.selectById(newDeptId);
user.setDeptId(newDeptId);
user.setDeptName(newDept.getDeptName());
// 根据部门类型设置角色
user.setRoleIds("receiving".equals(newDept.getDeptType()) ? "5" : "6");
user.setStatus(1); // 启用用户
needUpdate = true;
log.info("自动同步到新部门: userId={}, 新部门={}",
user.getId(), newDept.getDeptName());
}
}
}
} else {
// 用户没有部门:尝试匹配部门
Long matchedDeptId = matchSystemDepartment(dingDepartments);
if (matchedDeptId != null) {
Department dept = departmentMapper.selectById(matchedDeptId);
user.setDeptId(matchedDeptId);
user.setDeptName(dept.getDeptName());
user.setRoleIds("receiving".equals(dept.getDeptType()) ? "5" : "6");
user.setStatus(1); // 启用用户
needUpdate = true;
log.info("已有用户匹配到部门: userId={}, deptId={}, deptName={}",
user.getId(), matchedDeptId, dept.getDeptName());
} else {
// 无法匹配,使用第一个可用部门作为默认值
List<Department> availableDepts = departmentMapper.selectList(
new LambdaQueryWrapper<Department>()
.eq(Department::getStatus, 1)
.eq(Department::getDeleted, 0)
.orderByAsc(Department::getSortOrder)
.orderByAsc(Department::getId)
);
if (!availableDepts.isEmpty()) {
Department defaultDept = availableDepts.get(0);
user.setDeptId(defaultDept.getId());
user.setDeptName(defaultDept.getDeptName());
user.setRoleIds("receiving".equals(defaultDept.getDeptType()) ? "5" : "6");
user.setStatus(1); // 启用用户
needUpdate = true;
log.info("自动同步到新部门: userId={}, 新部门={}",
user.getId(), newDept.getDeptName());
log.warn("已有用户无法匹配,使用默认部门: userId={}, deptId={}, deptName={}, 钉钉部门: {}",
user.getId(), defaultDept.getId(), defaultDept.getDeptName(),
dingDepartments.stream()
.map(d -> String.valueOf(d.get("name")))
.collect(Collectors.joining(", ")));
}
}
}