feat: 同步钉钉组织架构时自动创建缺失的部门

This commit is contained in:
Your Name 2026-01-09 12:14:34 +08:00
parent dcb86dc9f2
commit 63fa20c0ef

View File

@ -1000,15 +1000,30 @@ public class DingTalkService {
skippedUsers++;
}
} else {
// 系统中没有对应部门,尝试获取钉钉部门信息并创建
// 系统中没有对应部门,自动创建
Map<String, Object> dingDeptInfo = getDingDepartmentDetail(accessToken, dingDeptId);
if (dingDeptInfo != null) {
String deptName = (String) dingDeptInfo.get("name");
log.warn("用户 {} 的钉钉部门 {} ({}) 在系统中不存在,请先在部门管理中创建对应部门",
user.getRealName(), deptName, dingDeptId);
errors.add(String.format("用户 %s 的钉钉部门 %s 在系统中不存在", user.getRealName(), deptName));
Object parentIdObj = dingDeptInfo.get("parent_id");
Long dingParentId = parentIdObj != null ? Long.parseLong(parentIdObj.toString()) : 1L;
// 创建新部门
Department newDept = createDepartmentFromDingTalk(accessToken, dingDeptId, deptName, dingParentId);
if (newDept != null) {
// 更新用户部门
user.setDeptId(newDept.getId());
user.setDeptName(newDept.getDeptName());
userMapper.updateById(user);
updatedUsers++;
log.info("自动创建部门并更新用户: userId={}, userName={}, newDeptId={}, newDeptName={}",
user.getId(), user.getRealName(), newDept.getId(), newDept.getDeptName());
} else {
errors.add(String.format("用户 %s 的钉钉部门 %s 创建失败", user.getRealName(), deptName));
errorUsers++;
}
} else {
errorUsers++;
}
errorUsers++;
}
} else {
skippedUsers++;
@ -1101,6 +1116,69 @@ public class DingTalkService {
}
return null;
}
/**
* 从钉钉部门信息创建系统部门
* 注意:不设置部门负责人,保留给管理员手动设置
*/
private Department createDepartmentFromDingTalk(String accessToken, Long dingDeptId, String deptName, Long dingParentId) {
try {
// 查找父部门
Long sysParentId = 0L;
if (dingParentId != null && dingParentId > 1) {
Department parentDept = departmentMapper.selectOne(
new LambdaQueryWrapper<Department>()
.eq(Department::getDingDeptId, dingParentId.toString())
.eq(Department::getStatus, 1)
);
if (parentDept != null) {
sysParentId = parentDept.getId();
} else {
// 递归创建父部门
Map<String, Object> parentDingDeptInfo = getDingDepartmentDetail(accessToken, dingParentId);
if (parentDingDeptInfo != null) {
String parentName = (String) parentDingDeptInfo.get("name");
Object grandParentIdObj = parentDingDeptInfo.get("parent_id");
Long grandParentId = grandParentIdObj != null ? Long.parseLong(grandParentIdObj.toString()) : 1L;
Department createdParent = createDepartmentFromDingTalk(accessToken, dingParentId, parentName, grandParentId);
if (createdParent != null) {
sysParentId = createdParent.getId();
}
}
}
}
// 推断部门类型
String deptType = inferDeptType(deptName);
// 如果有父部门,继承父部门的类型
if (sysParentId > 0) {
Department parentDept = departmentMapper.selectById(sysParentId);
if (parentDept != null && parentDept.getDeptType() != null) {
deptType = parentDept.getDeptType();
}
}
// 创建新部门
Department newDept = new Department();
newDept.setDeptName(deptName);
newDept.setDingDeptId(dingDeptId.toString());
newDept.setParentId(sysParentId);
newDept.setDeptType(deptType);
newDept.setStatus(1);
newDept.setSortOrder(0);
// 注意:不设置 leaderId,保留给管理员手动设置
departmentMapper.insert(newDept);
log.info("自动创建部门: id={}, name={}, dingDeptId={}, parentId={}, deptType={}",
newDept.getId(), deptName, dingDeptId, sysParentId, deptType);
return newDept;
} catch (Exception e) {
log.error("创建部门失败: dingDeptId={}, deptName={}", dingDeptId, deptName, e);
return null;
}
}
/**
* 检查功能是否启用