Pārlūkot izejas kodu

feat: 同步时,没有部门就只同步根目录下的成员

wuwenyi 4 dienas atpakaļ
vecāks
revīzija
b18269073a

+ 11 - 58
src/main/java/com/qqflow/engine/domain/ewechat/controller/EnterpriseTestController.java

@@ -5,6 +5,7 @@ import com.qqflow.engine.domain.ewechat.api.EnterpriseWechatApi;
 import com.qqflow.engine.domain.ewechat.dto.EnterpriseCorpDto;
 import com.qqflow.engine.domain.ewechat.model.enterprise.req.EnterpriseWechatSendMsgReq;
 import com.qqflow.engine.domain.ewechat.model.enterprise.rsp.*;
+import com.qqflow.engine.domain.ewechat.service.EnterpriseWechatMsgService;
 import com.qqflow.engine.domain.ewechat.service.EnterpriseWechatService;
 import lombok.RequiredArgsConstructor;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -20,18 +21,11 @@ import java.io.File;
 @Tag(name = "内部企微测试用接口")
 @RestController
 @RequiredArgsConstructor
-@RequestMapping("/api/enterprise/test/p")
+@RequestMapping("/open-api/enterprise/test")
 public class EnterpriseTestController {
     private final EnterpriseWechatApi enterpriseWechatApi;
     private final EnterpriseWechatService enterpriseWechatService;
-
-    @GetMapping("/change-session-state")
-    public Result<EnterpriseWechatChangeSessionRsp> changeSessionState(@RequestParam String userId, @RequestParam String openKfId,
-            @RequestParam Integer sessionState, EnterpriseCorpDto dto) {
-        String accessToken = enterpriseWechatService.getAccessToken(dto.getCorpId(), dto.getSuiteId());
-        EnterpriseWechatChangeSessionRsp rsp = enterpriseWechatApi.changeSessionState(accessToken, openKfId, userId, sessionState);
-        return Result.ok(rsp);
-    }
+    private final EnterpriseWechatMsgService wechatMsgService;
 
     @GetMapping("/get-session-state")
     public Result<EnterpriseWechatSessionRsp> getSessionState(@RequestParam String userId, @RequestParam String openKfId, EnterpriseCorpDto dto) {
@@ -40,57 +34,16 @@ public class EnterpriseTestController {
         return Result.ok(sessionState);
     }
 
-    @GetMapping("/get-media")
-    public Result<String> getMedia(@RequestParam String mediaId, EnterpriseCorpDto dto) {
-        String accessToken = enterpriseWechatService.getAccessToken(dto.getCorpId(), dto.getSuiteId());
-        String media = enterpriseWechatApi.downloadMedia(accessToken, mediaId);
-        File file = new File(media);
-        file.deleteOnExit();
-        return Result.ok(media);
+    @GetMapping("/departments")
+    public Result<EnterpriseWechatDepartmentListRsp> departments(@RequestParam(defaultValue = "0") Long id) {
+        String accessToken = wechatMsgService.getCorpAccessToken();
+        return Result.ok(enterpriseWechatApi.listDepartment(accessToken, id));
     }
 
-//    @PostMapping("/upload-media")
-//    public Result<EnterpriseWechatUploadRsp> uploadMedia(@RequestParam String mediaType, @RequestParam String imgUrl, EnterpriseCorpDto dto) {
-//        File file = HttpClientUtil.downloadFile(imgUrl);
-//        String accessToken = enterpriseWechatService.getAccessToken(dto.getCorpId(), dto.getSuiteId());
-//        EnterpriseWechatUploadRsp uploadRsp = enterpriseWechatApi.upload(accessToken, mediaType, file);
-//        file.deleteOnExit();
-//        return Result.ok(uploadRsp);
-//    }
-
-    @PostMapping("/upload-media2")
-    public Result<EnterpriseWechatUploadRsp> uploadMedia(@RequestParam String mediaType, @RequestParam MultipartFile file, EnterpriseCorpDto dto) {
-        String accessToken = enterpriseWechatService.getAccessToken(dto.getCorpId(), dto.getSuiteId());
-        EnterpriseWechatUploadRsp uploadRsp = enterpriseWechatApi.upload(accessToken, mediaType, file);
-        return Result.ok(uploadRsp);
-    }
-
-    @PostMapping("/send-img-msg")
-    public Result<EnterpriseWechatSendMsgRsp> sendImg(@RequestBody EnterpriseWechatSendMsgReq req, EnterpriseCorpDto dto) {
-        String accessToken = enterpriseWechatService.getAccessToken(dto.getCorpId(), dto.getSuiteId());
-        EnterpriseWechatSendMsgRsp sendMsgRsp = enterpriseWechatApi.sendKfMsg(accessToken, req);
-        return Result.ok(sendMsgRsp);
+    @GetMapping("/members")
+    public Result<EnterpriseWechatUserListRsp> members(@RequestParam(defaultValue = "1") Long departmentId) {
+        String accessToken = wechatMsgService.getCorpAccessToken();
+        return Result.ok(enterpriseWechatApi.listDepartmentUsers(accessToken, departmentId));
     }
 
-    @PostMapping("/add-cs")
-    public Result<EnterpriseWechatAddCsRsp> addCs(@RequestParam String name, @RequestParam String mediaId, EnterpriseCorpDto dto) {
-        String accessToken = enterpriseWechatService.getAccessToken(dto.getCorpId(), dto.getSuiteId());
-        EnterpriseWechatAddCsRsp rsp = enterpriseWechatApi.addCs(accessToken, name, mediaId);
-        return Result.ok(rsp);
-    }
-
-    @PostMapping("get-cs-url")
-    public Result<EnterpriseWechatCsUrlRsp> getCsUrl(@RequestParam String csId, EnterpriseCorpDto dto) {
-        //wkU17nDAAATaRZs9Xtf1urye0rOws6Rw
-        String accessToken = enterpriseWechatService.getAccessToken(dto.getCorpId(), dto.getSuiteId());
-        EnterpriseWechatCsUrlRsp rsp = enterpriseWechatApi.getCsUrl(accessToken, csId);
-        return Result.ok(rsp);
-    }
-
-    @PostMapping("delete-cs")
-    public Result<EnterpriseWechatBaseRsp> deleteCs(@RequestParam String openKfid, EnterpriseCorpDto dto) {
-        String accessToken = enterpriseWechatService.getAccessToken(dto.getCorpId(), dto.getSuiteId());
-        EnterpriseWechatBaseRsp rsp = enterpriseWechatApi.deleteCs(accessToken, openKfid);
-        return Result.ok(rsp);
-    }
 }

+ 38 - 30
src/main/java/com/qqflow/engine/domain/ewechat/service/WecomContactSyncService.java

@@ -122,43 +122,22 @@ public class WecomContactSyncService {
     }
 
     /**
-     * 全量同步成员:遍历本地已同步的所有部门,从企微拉取各部门成员并 upsert
+     * 全量同步成员:遍历本地已同步的所有部门,从企微拉取各部门成员并 upsert。
+     * 如果本地无部门数据,则只同步根目录(id=1)下的成员。
      */
     private Map<String, Integer> syncAllMembers(String accessToken) {
-        List<EnterpriseWechatDepartment> allDepts = departmentMapper.selectList(
-                new LambdaQueryWrapper<EnterpriseWechatDepartment>());
+        List<EnterpriseWechatDepartment> allDepts = departmentMapper.selectList(new LambdaQueryWrapper<>());
         if (allDepts.isEmpty()) {
-            log.warn("[通讯录同步] 本地无部门数据,请先同步部门");
-            return Map.of("departments", 0, "total", 0, "inserted", 0, "updated", 0);
+            log.info("[通讯录同步] 本地无部门,只同步根目录成员");
+            return this.syncMembersByDeptId(accessToken, 1L);
         }
 
         int totalInserted = 0, totalUpdated = 0, totalMembers = 0;
         for (var dept : allDepts) {
-            var rsp = enterpriseWechatApi.listDepartmentUsers(accessToken, dept.getId());
-            if (rsp == null || rsp.getUserlist() == null) continue;
-
-            for (var u : rsp.getUserlist()) {
-                totalMembers++;
-                // 按 userid + departmentId 查重(一个用户可能在多个部门)
-                var existing = memberMapper.selectList(
-                        new LambdaQueryWrapper<EnterpriseWechatMember>()
-                                .eq(EnterpriseWechatMember::getUserid, u.getUserid())
-                                .eq(EnterpriseWechatMember::getDepartmentId, dept.getId()));
-                EnterpriseWechatMember wm;
-                if (existing != null && !existing.isEmpty()) {
-                    wm = existing.get(0);
-                    totalUpdated++;
-                } else {
-                    wm = new EnterpriseWechatMember();
-                    totalInserted++;
-                }
-                wm.setUserid(u.getUserid());
-                wm.setName(u.getName() != null ? u.getName() : u.getUserid());
-                wm.setDepartmentId(dept.getId());
-                wm.setOpenUserid(u.getOpenUserid());
-                wm.setUpdatedTime(LocalDateTime.now());
-                this.memberMapper.insertOrUpdate(wm);
-            }
+            var r = this.syncMembersByDeptId(accessToken, dept.getId());
+            totalMembers += r.getOrDefault("total", 0);
+            totalInserted += r.getOrDefault("inserted", 0);
+            totalUpdated += r.getOrDefault("updated", 0);
         }
 
         log.info("[通讯录同步] 成员同步完成 | 部门数:{} 成员总数:{} 新增:{} 更新:{}",
@@ -167,4 +146,33 @@ public class WecomContactSyncService {
                 "inserted", totalInserted, "updated", totalUpdated);
     }
 
+    /** 同步单个部门的成员 */
+    private Map<String, Integer> syncMembersByDeptId(String accessToken, Long deptId) {
+        var rsp = enterpriseWechatApi.listDepartmentUsers(accessToken, deptId);
+        if (rsp == null || rsp.getUserlist() == null) return Map.of("total", 0, "inserted", 0, "updated", 0);
+
+        int inserted = 0, updated = 0;
+        for (var u : rsp.getUserlist()) {
+            var existing = memberMapper.selectList(
+                    new LambdaQueryWrapper<EnterpriseWechatMember>()
+                            .eq(EnterpriseWechatMember::getUserid, u.getUserid())
+                            .eq(EnterpriseWechatMember::getDepartmentId, deptId));
+            EnterpriseWechatMember wm;
+            if (existing != null && !existing.isEmpty()) {
+                wm = existing.get(0);
+                updated++;
+            } else {
+                wm = new EnterpriseWechatMember();
+                inserted++;
+            }
+            wm.setUserid(u.getUserid());
+            wm.setName(u.getName() != null ? u.getName() : u.getUserid());
+            wm.setDepartmentId(deptId);
+            wm.setOpenUserid(u.getOpenUserid());
+            wm.setUpdatedTime(LocalDateTime.now());
+            this.memberMapper.insertOrUpdate(wm);
+        }
+        return Map.of("total", rsp.getUserlist().size(), "inserted", inserted, "updated", updated);
+    }
+
 }