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