Просмотр исходного кода

fix: 日统计汇总活跃用户改为跨天去重计算

aggregateDailyStat 中活跃用户不再对 t_daily_stat.active_user_count 做 SUM,
改为从 t_wash_order 源表 GROUP BY station_id, user_id 后计数,
避免同一用户在多个日期活跃时被重复累加。

Co-Authored-By: Claude <noreply@anthropic.com>
skyline 1 месяц назад
Родитель
Сommit
adffc38109

+ 5 - 0
car-wash-service/src/main/java/com/kym/service/WashOrderService.java

@@ -58,6 +58,11 @@ public interface WashOrderService extends MyBaseService<WashOrder> {
 
     Map<String, Integer> countMonthActiveUsers(LocalDate statDay);
 
+    /**
+     * 统计时间段内站点活跃用户(去重),用于跨天汇总
+     */
+    Map<String, Integer> countDistinctActiveUsers(LocalDate startDate, LocalDate endDate);
+
     WashOrder getOrderInProgressByUserId(long userId);
 
     List<StationTrendVo> stationTrend(StatQueryParam params);

+ 8 - 1
car-wash-service/src/main/java/com/kym/service/impl/DailyStatServiceImpl.java

@@ -215,10 +215,17 @@ public class DailyStatServiceImpl extends MyBaseServiceImpl<DailyStatMapper, Dai
         var totalConsumption = list.stream().filter(s -> s.getConsumption() != null).mapToInt(DailyStat::getConsumption).sum();
         var ordersCount = list.stream().filter(s -> s.getOrdersCount() != null).mapToInt(DailyStat::getOrdersCount).sum();
         var registrations = list.stream().filter(s -> s.getRegistrations() != null).mapToInt(DailyStat::getRegistrations).sum();
-        var activeUserCount = list.stream().filter(s -> s.getActiveUserCount() != null).mapToInt(DailyStat::getActiveUserCount).sum();
         var rechargeCount = list.stream().filter(s -> s.getRechargeCount() != null).mapToInt(DailyStat::getRechargeCount).sum();
         var refundCount = list.stream().filter(s -> s.getRefundCount() != null).mapToInt(DailyStat::getRefundCount).sum();
 
+        // 活跃用户:跨天需要去重,不能简单 SUM 日统计值,改为从订单源表 GROUP BY station_id, user_id 后计数
+        var activeStartDate = params.getStartDate() != null ? params.getStartDate() : LocalDate.of(2020, 1, 1);
+        var activeEndDate = params.getEndDate() != null ? params.getEndDate() : LocalDate.now();
+        var activeUserMap = washOrderService.countDistinctActiveUsers(activeStartDate, activeEndDate);
+        var activeUserCount = CommUtil.isNotEmptyAndNull(params.getStationId())
+                ? activeUserMap.getOrDefault(params.getStationId(), 0)
+                : activeUserMap.values().stream().mapToInt(Integer::intValue).sum();
+
         return new DailyStatSummaryVo()
                 .setTotalIncome(totalIncome)
                 .setTotalConsumption(totalConsumption)

+ 11 - 0
car-wash-service/src/main/java/com/kym/service/impl/WashOrderServiceImpl.java

@@ -494,6 +494,17 @@ public class WashOrderServiceImpl extends MyBaseServiceImpl<WashOrderMapper, Was
                 .collect(Collectors.groupingBy(WashOrder::getStationId, Collectors.summingInt(o -> 1)));
     }
 
+    @Override
+    public Map<String, Integer> countDistinctActiveUsers(LocalDate startDate, LocalDate endDate) {
+        LambdaQueryWrapper<WashOrder> wrapper = new LambdaQueryWrapper<>();
+        wrapper.select(WashOrder::getUserId, WashOrder::getStationId);
+        wrapper.ge(WashOrder::getStartTime, LocalDateTime.of(startDate, LocalTime.MIN));
+        wrapper.lt(WashOrder::getStartTime, LocalDateTime.of(endDate.plusDays(1), LocalTime.MIN));
+        wrapper.groupBy(WashOrder::getStationId, WashOrder::getUserId);
+        return list(wrapper).stream()
+                .collect(Collectors.groupingBy(WashOrder::getStationId, Collectors.summingInt(o -> 1)));
+    }
+
     @Override
     public WashOrder getOrderInProgressByUserId(long userId) {
         return lambdaQuery()