From e67c67d99119e35c9fd476ea674f42f84b7153f4 Mon Sep 17 00:00:00 2001
From: longz <longzhaoz@qq.com>
Date: 星期二, 04 八月 2026 20:40:54 +0800
Subject: [PATCH] fix: 加盟商看板慢查询优化(SQL聚合下推/分块反查/物理索引)

---
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/support/FranchiseeUserStatistics.java |   25 ++++++++++++++++++++-----
 1 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/support/FranchiseeUserStatistics.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/support/FranchiseeUserStatistics.java
index 77d8bcb..9e8d59e 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/support/FranchiseeUserStatistics.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/support/FranchiseeUserStatistics.java
@@ -22,23 +22,38 @@
     private FranchiseeUserStatistics() {
     }
 
+    /**
+     * 旧入口:由订单列表推导"每日充电用户集合"后计算。
+     */
     public static Result calculate(List<TChargingOrder> orders,
                                    List<TPartnerAppUser> relations,
                                    LocalDateTime start,
                                    LocalDateTime end) {
         List<TChargingOrder> safeOrders = orders == null ? Collections.emptyList() : orders;
-        List<TPartnerAppUser> safeRelations = relations == null ? Collections.emptyList() : relations;
-
         Map<LocalDate, Set<Long>> chargingUsersByDay = new HashMap<>();
-        Set<Long> chargingUsers = new HashSet<>();
         for (TChargingOrder order : safeOrders) {
             if (order == null || order.getAppUserId() == null || !inRange(order.getEndTime(), start, end)) {
                 continue;
             }
-            chargingUsers.add(order.getAppUserId());
             chargingUsersByDay.computeIfAbsent(order.getEndTime().toLocalDate(), key -> new HashSet<>())
                     .add(order.getAppUserId());
         }
+        return calculateByUserDays(chargingUsersByDay, relations, start, end);
+    }
+
+    /**
+     * 加盟商看板入口:每日去重充电用户集合已由 SQL 聚合得到
+     * (t_charging_order GROUP BY app_user_id, DATE(end_time),避免全量订单拉回 JVM)。
+     */
+    public static Result calculateByUserDays(Map<LocalDate, Set<Long>> chargingUsersByDay,
+                                             List<TPartnerAppUser> relations,
+                                             LocalDateTime start,
+                                             LocalDateTime end) {
+        Map<LocalDate, Set<Long>> safeByDay = chargingUsersByDay == null ? Collections.emptyMap() : chargingUsersByDay;
+        List<TPartnerAppUser> safeRelations = relations == null ? Collections.emptyList() : relations;
+
+        Set<Long> chargingUsers = new HashSet<>();
+        safeByDay.values().forEach(chargingUsers::addAll);
 
         Map<Long, LocalDateTime> firstBindingByUser = new HashMap<>();
         for (TPartnerAppUser relation : safeRelations) {
@@ -68,7 +83,7 @@
         List<Long> newSeries = new ArrayList<>();
         for (LocalDate day = firstDay; day.isBefore(exclusiveEndDay); day = day.plusDays(1)) {
             categories.add(String.format("%02d-%02d", day.getMonthValue(), day.getDayOfMonth()));
-            chargingSeries.add((long) chargingUsersByDay.getOrDefault(day, Collections.emptySet()).size());
+            chargingSeries.add((long) safeByDay.getOrDefault(day, Collections.emptySet()).size());
             newSeries.add((long) newUsersByDay.getOrDefault(day, Collections.emptySet()).size());
         }
 

--
Gitblit v1.7.1