diff --git a/backend/src/main/java/com/designhub/service/DingTalkService.java b/backend/src/main/java/com/designhub/service/DingTalkService.java index 703e49a..1719266 100644 --- a/backend/src/main/java/com/designhub/service/DingTalkService.java +++ b/backend/src/main/java/com/designhub/service/DingTalkService.java @@ -1000,15 +1000,30 @@ public class DingTalkService { skippedUsers++; } } else { - // 系统中没有对应部门,尝试获取钉钉部门信息并创建 + // 系统中没有对应部门,自动创建 Map 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() + .eq(Department::getDingDeptId, dingParentId.toString()) + .eq(Department::getStatus, 1) + ); + if (parentDept != null) { + sysParentId = parentDept.getId(); + } else { + // 递归创建父部门 + Map 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; + } + } /** * 检查功能是否启用