package com.ruoyi.order.support; import com.ruoyi.chargingPile.api.model.TPartnerAppUser; import com.ruoyi.order.api.model.TChargingOrder; import org.junit.jupiter.api.Test; import java.time.LocalDateTime; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; import static org.junit.jupiter.api.Assertions.assertEquals; class FranchiseeUserStatisticsTest { private static final LocalDateTime START = LocalDateTime.of(2026, 7, 1, 0, 0); private static final LocalDateTime END = LocalDateTime.of(2026, 7, 4, 0, 0); @Test void countsDistinctChargingUsersAndBucketsBindingsOnTheirExactDate() { List orders = Arrays.asList( order(1L, LocalDateTime.of(2026, 7, 1, 8, 0)), order(1L, LocalDateTime.of(2026, 7, 1, 18, 0)), order(1L, LocalDateTime.of(2026, 7, 2, 8, 0)), order(2L, LocalDateTime.of(2026, 7, 2, 9, 0)) ); List relations = Arrays.asList( relation(1L, LocalDateTime.of(2026, 6, 30, 23, 59)), relation(2L, LocalDateTime.of(2026, 7, 2, 10, 0)), relation(3L, LocalDateTime.of(2026, 7, 2, 11, 0)), relation(3L, LocalDateTime.of(2026, 7, 2, 12, 0)) ); FranchiseeUserStatistics.Result result = FranchiseeUserStatistics.calculate(orders, relations, START, END); assertEquals(2L, result.getSummary().get("chargeUserCount")); assertEquals(2L, result.getSummary().get("newUserCount")); assertEquals(Arrays.asList("07-01", "07-02", "07-03"), result.getTrend().get("categories")); assertEquals(Arrays.asList(1L, 2L, 0L), seriesData(result.getTrend(), 0)); assertEquals(Arrays.asList(0L, 2L, 0L), seriesData(result.getTrend(), 1)); } @Test void returnsZeroFilledSeriesWhenThereIsNoActivity() { FranchiseeUserStatistics.Result result = FranchiseeUserStatistics.calculate( Collections.emptyList(), Collections.emptyList(), START, END); assertEquals(0L, result.getSummary().get("chargeUserCount")); assertEquals(0L, result.getSummary().get("newUserCount")); assertEquals(Arrays.asList(0L, 0L, 0L), seriesData(result.getTrend(), 0)); assertEquals(Arrays.asList(0L, 0L, 0L), seriesData(result.getTrend(), 1)); } @SuppressWarnings("unchecked") private List seriesData(Map trend, int index) { List> series = (List>) trend.get("series"); return (List) series.get(index).get("data"); } private TChargingOrder order(Long appUserId, LocalDateTime endTime) { TChargingOrder order = new TChargingOrder(); order.setAppUserId(appUserId); order.setEndTime(endTime); return order; } private TPartnerAppUser relation(Long appUserId, LocalDateTime createTime) { TPartnerAppUser relation = new TPartnerAppUser(); relation.setAppUserId(appUserId); relation.setCreateTime(createTime); return relation; } }