Explorar el Código

fix: 从根部门开始查询部门

wuwenyi hace 5 días
padre
commit
d809299dee

+ 32 - 21
src/main/java/com/qqflow/engine/domain/ewechat/service/WecomContactSyncService.java

@@ -81,33 +81,44 @@ public class WecomContactSyncService {
     }
 
     /**
-     * 全量同步部门:从企微拉取完整部门树,upsert 到本地表
+     * 全量同步部门:从企微拉取完整部门树(递归 BFS),upsert 到本地表
      */
     private Map<String, Integer> syncAllDepartments(String accessToken) {
-        var rsp = enterpriseWechatApi.listDepartment(accessToken, null);
-        if (rsp == null || rsp.getDepartment() == null || rsp.getDepartment().isEmpty()) {
-            log.warn("[通讯录同步] 企微返回的部门列表为空");
-            return Map.of("total", 0, "inserted", 0, "updated", 0);
-        }
+        int total = 0, inserted = 0, updated = 0;
+
+        // BFS 队列:从根部门开始,逐层拉取子部门
+        Deque<Long> queue = new ArrayDeque<>();
+        queue.add(0L);
+
+        while (!queue.isEmpty()) {
+            Long parentId = queue.poll();
+            var rsp = enterpriseWechatApi.listDepartment(accessToken, parentId);
+            if (rsp == null || rsp.getDepartment() == null) continue;
+
+            for (var d : rsp.getDepartment()) {
+                // 跳过父节点自身(API 会返回查询的部门本身及其子部门)
+                if (Objects.equals(d.getId(), parentId)) continue;
+                total++;
+                EnterpriseWechatDepartment dept = departmentMapper.selectById(d.getId());
+                if (dept == null) {
+                    dept = new EnterpriseWechatDepartment();
+                    dept.setId(d.getId());
+                    dept.setCreatedTime(LocalDateTime.now());
+                    inserted++;
+                } else {
+                    updated++;
+                }
+                dept.setName(d.getName());
+                dept.setParentId(d.getParentid() != null ? d.getParentid() : 0L);
+                this.departmentMapper.insertOrUpdate(dept);
 
-        int inserted = 0, updated = 0;
-        for (var d : rsp.getDepartment()) {
-            EnterpriseWechatDepartment dept = departmentMapper.selectById(d.getId());
-            if (dept == null) {
-                dept = new EnterpriseWechatDepartment();
-                dept.setId(d.getId());
-                dept.setCreatedTime(LocalDateTime.now());
-                inserted++;
-            } else {
-                updated++;
+                // 将此部门加入队列,继续拉取其子部门
+                queue.add(d.getId());
             }
-            dept.setName(d.getName());
-            dept.setParentId(d.getParentid() != null ? d.getParentid() : 0L);
-            this.departmentMapper.insertOrUpdate(dept);
         }
 
-        log.info("[通讯录同步] 部门同步完成 | 总数:{} 新增:{} 更新:{}", rsp.getDepartment().size(), inserted, updated);
-        return Map.of("total", rsp.getDepartment().size(), "inserted", inserted, "updated", updated);
+        log.info("[通讯录同步] 部门同步完成 | 总数:{} 新增:{} 更新:{}", total, inserted, updated);
+        return Map.of("total", total, "inserted", inserted, "updated", updated);
     }
 
     /**