From 7e72c665ee182c0f9ddbbed13044cd9ace0d95bd Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 2 Jan 2026 13:58:17 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=92=89=E9=92=89=E9=83=A8?= =?UTF-8?q?=E9=97=A8=E5=90=8C=E6=AD=A5=EF=BC=9A=E4=BF=AE=E5=A4=8Dparent=5F?= =?UTF-8?q?id=E6=9B=B4=E6=96=B0=E9=80=BB=E8=BE=91=EF=BC=8C=E7=A1=AE?= =?UTF-8?q?=E4=BF=9D=E7=88=B6=E5=AD=90=E5=85=B3=E7=B3=BB=E6=AD=A3=E7=A1=AE?= =?UTF-8?q?=E5=A4=84=E7=90=86=EF=BC=88=E6=94=AF=E6=8C=81=E5=A4=9A=E7=BA=A7?= =?UTF-8?q?=E5=85=B3=E7=B3=BB=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../designhub/service/DingTalkService.java | 102 ++++++++++++------ 1 file changed, 68 insertions(+), 34 deletions(-) diff --git a/backend/src/main/java/com/designhub/service/DingTalkService.java b/backend/src/main/java/com/designhub/service/DingTalkService.java index 90a5957..4a69037 100644 --- a/backend/src/main/java/com/designhub/service/DingTalkService.java +++ b/backend/src/main/java/com/designhub/service/DingTalkService.java @@ -538,13 +538,15 @@ public class DingTalkService { log.info("从钉钉获取到 {} 个部门", allDepartments.size()); - // 同步每个部门到数据库 + // 按照层级排序:父部门在前,子部门在后 + // 通过多次遍历确保父部门先创建 + Map dingDeptIdToSysIdMap = new HashMap<>(); // 缓存ding_dept_id到系统ID的映射 + + // 第一遍:创建所有部门(如果不存在),并设置ding_dept_id和parent_id为0 for (Map dingDept : allDepartments) { Object deptIdObj = dingDept.get("dept_id"); String dingDeptId = deptIdObj != null ? deptIdObj.toString() : null; String deptName = (String) dingDept.get("name"); - Object parentIdObj = dingDept.get("parent_id"); - String parentDingDeptId = parentIdObj != null ? parentIdObj.toString() : null; if (dingDeptId == null || deptName == null) { log.warn("跳过无效的部门信息: {}", dingDept); @@ -569,29 +571,10 @@ public class DingTalkService { ); } - if (sysDept != null) { - // 更新现有部门:设置ding_dept_id - sysDept.setDingDeptId(dingDeptId); - departmentMapper.updateById(sysDept); - log.info("更新部门: id={}, name={}, ding_dept_id={}", sysDept.getId(), deptName, dingDeptId); - } else { - // 部门不存在,自动创建 + if (sysDept == null) { + // 部门不存在,自动创建(先不设置parent_id,等第二遍再设置) try { - Long parentId = 0L; - if (parentDingDeptId != null && !parentDingDeptId.equals("1")) { - // 查找父部门的系统ID - com.designhub.entity.Department parentDept = departmentMapper.selectOne( - new LambdaQueryWrapper() - .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); // 创建新部门 @@ -599,24 +582,75 @@ public class DingTalkService { newDept.setDeptName(deptName); newDept.setDingDeptId(dingDeptId); newDept.setDeptType(deptType); - newDept.setParentId(parentId); + newDept.setParentId(0L); // 先设置为0,第二遍再更新 newDept.setStatus(1); // 启用 newDept.setSortOrder(0); departmentMapper.insert(newDept); + sysDept = newDept; - // 初始化积分池会在DepartmentService.createDepartment中处理 - // 这里直接调用createDepartment会触发积分池初始化 - // 但为了避免循环依赖,我们直接使用mapper插入,积分池可以稍后初始化 - // 如果需要积分池,可以在后台手动初始化,或者用户首次使用时会自动创建 - - log.info("自动创建部门: id={}, name={}, ding_dept_id={}, type={}, parentId={}", - newDept.getId(), deptName, dingDeptId, deptType, parentId); + log.info("自动创建部门(第一遍): id={}, name={}, ding_dept_id={}, type={}", + newDept.getId(), deptName, dingDeptId, deptType); } catch (Exception e) { log.error("自动创建部门失败: name={}, ding_dept_id={}", deptName, dingDeptId, e); - // 创建失败不影响其他部门的同步,继续处理下一个 + continue; // 跳过失败的部门 + } + } else { + // 更新ding_dept_id(如果还没有) + if (!dingDeptId.equals(sysDept.getDingDeptId())) { + sysDept.setDingDeptId(dingDeptId); + departmentMapper.updateById(sysDept); + log.info("更新部门ding_dept_id: id={}, name={}, ding_dept_id={}", + sysDept.getId(), deptName, dingDeptId); } } + + // 缓存映射关系 + dingDeptIdToSysIdMap.put(dingDeptId, sysDept.getId()); + } + + // 第二遍:更新所有部门的parent_id + for (Map dingDept : allDepartments) { + Object deptIdObj = dingDept.get("dept_id"); + String dingDeptId = deptIdObj != null ? deptIdObj.toString() : null; + String deptName = (String) dingDept.get("name"); + Object parentIdObj = dingDept.get("parent_id"); + String parentDingDeptId = parentIdObj != null ? parentIdObj.toString() : null; + + if (dingDeptId == null || deptName == null) { + continue; + } + + Long sysDeptId = dingDeptIdToSysIdMap.get(dingDeptId); + if (sysDeptId == null) { + continue; // 第一遍创建失败的部门跳过 + } + + // 获取系统部门 + com.designhub.entity.Department sysDept = departmentMapper.selectById(sysDeptId); + if (sysDept == null) { + continue; + } + + // 确定parent_id + Long parentId = 0L; + if (parentDingDeptId != null && !parentDingDeptId.equals("1")) { + // 从缓存中获取父部门的系统ID + Long parentSysId = dingDeptIdToSysIdMap.get(parentDingDeptId); + if (parentSysId != null) { + parentId = parentSysId; + } + } + + // 更新parent_id(如果不同) + Long currentParentId = sysDept.getParentId() != null ? sysDept.getParentId() : 0L; + if (!parentId.equals(currentParentId)) { + sysDept.setParentId(parentId); + departmentMapper.updateById(sysDept); + log.info("更新部门父子关系: id={}, name={}, parentId: {} -> {}", + sysDept.getId(), deptName, currentParentId, parentId); + } + syncCount++; }