From f9d697ea58c81acd0f938b15ff82a80b23d5094a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Mon, 1 Dec 2025 15:12:21 +0800 Subject: [PATCH] =?UTF-8?q?=E9=92=89=E9=92=89=E8=80=83=E5=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../market/service/impl/DingService.java | 63 +++++++++++++------ 1 file changed, 43 insertions(+), 20 deletions(-) diff --git a/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/DingService.java b/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/DingService.java index 37581bf9d..44df7d2f0 100644 --- a/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/DingService.java +++ b/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/DingService.java @@ -22,6 +22,9 @@ import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.*; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; import java.util.stream.Collectors; @Service @@ -80,6 +83,10 @@ public class DingService { } public Map getColumns(String key, String secret, Long shopId) { + Object value = redisService.get("ding_columns:" + shopId); + if (value instanceof String && StrUtil.isNotBlank((String) value)) { + return JSONObject.parseObject((String) value, Map.class); + } DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/attendance/getattcolumns"); OapiAttendanceGetattcolumnsRequest req = new OapiAttendanceGetattcolumnsRequest(); OapiAttendanceGetattcolumnsResponse rsp = null; @@ -102,6 +109,7 @@ public class DingService { }) .collect(Collectors.toMap(item -> ((JSONObject) item).getLong("id").toString(), item -> ((JSONObject) item).getString("name"))); + redisService.set("ding_columns:" + shopId, JSONObject.toJSONString(columMap)); return columMap; } @@ -177,39 +185,54 @@ public class DingService { } } - public ArrayList getUserList(String name,String key, String secret, Long shopId, String userId) { + public ArrayList getUserList(String name, String key, String secret, Long shopId, String userId) { try { DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/listsub"); OapiV2DepartmentListsubRequest req = new OapiV2DepartmentListsubRequest(); req.setDeptId(1L); req.setLanguage("zh_CN"); + OapiV2DepartmentListsubResponse rsp = client.execute(req, getToken(key, secret, shopId)); - Set deptIdList = getData(rsp, true).getJSONArray("result").stream().map(item -> ((JSONObject) item) - .getLong("dept_id")).collect(Collectors.toSet()); - ArrayList dingUserVOS = new ArrayList<>(); - for (Long dptId : deptIdList) { - dingUserVOS.addAll(getUserByDeptId(dptId, key, secret, shopId)); - } - if (StrUtil.isNotBlank(name)) { - return dingUserVOS.stream().filter(item -> { - boolean flag = true; - if (StrUtil.isNotBlank(userId)) { - flag = item.getUserid().equals(userId); - } + Set deptIdList = getData(rsp, true).getJSONArray("result") + .stream() + .map(item -> ((JSONObject) item).getLong("dept_id")) + .collect(Collectors.toSet()); - if (StrUtil.isNotBlank(name)) { - flag = item.getName().contains(name); - } - return flag; - }).collect(Collectors.toCollection(ArrayList::new)); + // 线程池:按 CPU 核数 * 2 + ExecutorService pool = Executors.newFixedThreadPool( + Math.min(deptIdList.size(), Runtime.getRuntime().availableProcessors() * 2) + ); + + List>> futures = new ArrayList<>(); + + // 并发拉取 + for (Long deptId : deptIdList) { + futures.add(pool.submit(() -> getUserByDeptId(deptId, key, secret, shopId))); } - return dingUserVOS; - }catch (Exception e) { + + // 汇总结果 + List allUsers = new ArrayList<>(); + for (Future> f : futures) { + allUsers.addAll(f.get()); + } + + pool.shutdown(); + + // 正确过滤逻辑 + return allUsers.stream().filter(item -> { + if (StrUtil.isNotBlank(userId) && !item.getUserid().equals(userId)) { + return false; + } + return !StrUtil.isNotBlank(name) || item.getName().contains(name); + }).collect(Collectors.toCollection(ArrayList::new)); + + } catch (Exception e) { throw new RuntimeException(e); } } + public ArrayList getUserReport(Long shopId, String key, String secret, DateTime startTime, DateTime endTime, String name, String userId) { Map columns = getColumns(key, secret, shopId); ArrayList userList = getUserList(name, key, secret, shopId, userId);