|
@@ -81,33 +81,44 @@ public class WecomContactSyncService {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * 全量同步部门:从企微拉取完整部门树,upsert 到本地表
|
|
|
|
|
|
|
+ * 全量同步部门:从企微拉取完整部门树(递归 BFS),upsert 到本地表
|
|
|
*/
|
|
*/
|
|
|
private Map<String, Integer> syncAllDepartments(String accessToken) {
|
|
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);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|