feat: 同步钉钉组织架构时自动创建缺失的部门
This commit is contained in:
parent
dcb86dc9f2
commit
63fa20c0ef
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查功能是否启用
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user