From b9250566fbb7fd7f486be56ecfeb1efd0bf7b6e5 Mon Sep 17 00:00:00 2001 From: irving Date: Mon, 10 Nov 2025 22:33:27 -0500 Subject: [PATCH] test: cover clerk performance date ranges --- .../PlayClerkPerformanceServiceImplTest.java | 120 ++++++++++++++++++ 1 file changed, 120 insertions(+) diff --git a/play-admin/src/test/java/com/starry/admin/modules/statistics/service/PlayClerkPerformanceServiceImplTest.java b/play-admin/src/test/java/com/starry/admin/modules/statistics/service/PlayClerkPerformanceServiceImplTest.java index c86d05f..8b1b5a3 100644 --- a/play-admin/src/test/java/com/starry/admin/modules/statistics/service/PlayClerkPerformanceServiceImplTest.java +++ b/play-admin/src/test/java/com/starry/admin/modules/statistics/service/PlayClerkPerformanceServiceImplTest.java @@ -25,13 +25,17 @@ import com.starry.admin.modules.statistics.module.vo.ClerkPerformanceSnapshotVo; import com.starry.admin.modules.statistics.module.vo.PlayClerkPerformanceInfoReturnVo; import com.starry.admin.modules.statistics.service.impl.PlayClerkPerformanceServiceImpl; import com.starry.admin.modules.withdraw.mapper.EarningsLineMapper; +import com.starry.admin.utils.DateRangeUtils; import java.math.BigDecimal; import java.time.LocalDateTime; import java.time.Month; import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -318,6 +322,106 @@ class PlayClerkPerformanceServiceImplTest { Arrays.asList(o1.getId(), o2.getId(), o3.getId(), o4.getId(), o5.getId()))); } @Test + @DisplayName("queryOverview filters completed orders according to complex date/time ranges") + void queryOverviewHonorsDateRangesForMultipleClerks() { + PlayClerkUserInfoEntity alpha = buildClerk("c-alpha", "Alpha", "g-alpha", "l-alpha"); + PlayClerkUserInfoEntity beta = buildClerk("c-beta", "Beta", "g-beta", "l-beta"); + PlayClerkUserInfoEntity gamma = buildClerk("c-gamma", "Gamma", "g-gamma", "l-gamma"); + List clerks = Arrays.asList(alpha, beta, gamma); + + when(playPersonnelGroupInfoService.getValidClerkIdList(any(), any())) + .thenReturn(Arrays.asList(alpha.getId(), beta.getId(), gamma.getId())); + when(clerkUserInfoService.list((Wrapper) any())).thenReturn(clerks); + when(playClerkLevelInfoService.selectAll()).thenReturn(Arrays.asList( + level(alpha.getLevelId(), "铂金"), + level(beta.getLevelId(), "黄金"), + level(gamma.getLevelId(), "白银"))); + when(playPersonnelGroupInfoService.selectAll()).thenReturn(Arrays.asList( + group(alpha.getGroupId(), "一组"), + group(beta.getGroupId(), "二组"), + group(gamma.getGroupId(), "三组"))); + + Map> ordersByClerk = new HashMap<>(); + ordersByClerk.put(alpha.getId(), Arrays.asList( + order(alpha.getId(), "userA1", "1", "0", "0", new BigDecimal("100.00"), new BigDecimal("70.00"), + LocalDateTime.of(2024, Month.JULY, 1, 10, 0)), + order(alpha.getId(), "userA2", "0", "0", "0", new BigDecimal("210.00"), new BigDecimal("120.00"), + LocalDateTime.of(2024, Month.JULY, 3, 15, 30)), + order(alpha.getId(), "userA3", "0", "0", "0", new BigDecimal("150.00"), new BigDecimal("80.00"), + LocalDateTime.of(2024, Month.JULY, 7, 9, 15)), + order(alpha.getId(), "userA4", "0", "0", "0", new BigDecimal("130.00"), new BigDecimal("75.00"), + LocalDateTime.of(2024, Month.JULY, 10, 18, 45)))); + ordersByClerk.put(beta.getId(), Arrays.asList( + order(beta.getId(), "userB1", "1", "0", "0", new BigDecimal("95.00"), new BigDecimal("50.00"), + LocalDateTime.of(2024, Month.JULY, 2, 11, 30)), + order(beta.getId(), "userB2", "0", "0", "0", new BigDecimal("120.00"), new BigDecimal("65.00"), + LocalDateTime.of(2024, Month.JULY, 4, 13, 0)), + order(beta.getId(), "userB3", "0", "0", "0", new BigDecimal("85.00"), new BigDecimal("40.00"), + LocalDateTime.of(2024, Month.JULY, 8, 16, 0)), + order(beta.getId(), "userB4", "0", "0", "0", new BigDecimal("150.00"), new BigDecimal("85.00"), + LocalDateTime.of(2024, Month.JULY, 10, 19, 0)))); + ordersByClerk.put(gamma.getId(), Arrays.asList( + order(gamma.getId(), "userC1", "1", "0", "0", new BigDecimal("70.00"), new BigDecimal("35.00"), + LocalDateTime.of(2024, Month.JULY, 1, 8, 0)), + order(gamma.getId(), "userC2", "0", "0", "0", new BigDecimal("135.00"), new BigDecimal("70.00"), + LocalDateTime.of(2024, Month.JULY, 5, 17, 20)), + order(gamma.getId(), "userC3", "0", "0", "0", new BigDecimal("75.00"), new BigDecimal("45.00"), + LocalDateTime.of(2024, Month.JULY, 6, 14, 50)), + order(gamma.getId(), "userC4", "0", "0", "0", new BigDecimal("160.00"), new BigDecimal("90.00"), + LocalDateTime.of(2024, Month.JULY, 9, 21, 10)))); + + when(playOrderInfoService.clerkSelectOrderInfoList(anyString(), anyString(), anyString())) + .thenAnswer(invocation -> { + String clerkId = invocation.getArgument(0); + String startStr = invocation.getArgument(1); + String endStr = invocation.getArgument(2); + LocalDateTime start = LocalDateTime.parse(startStr, DateRangeUtils.DATE_TIME_FORMATTER); + LocalDateTime end = LocalDateTime.parse(endStr, DateRangeUtils.DATE_TIME_FORMATTER); + return ordersByClerk.getOrDefault(clerkId, Collections.emptyList()).stream() + .filter(order -> !order.getPurchaserTime().isBefore(start) + && !order.getPurchaserTime().isAfter(end)) + .collect(Collectors.toList()); + }); + + setAuthentication(); + try { + ClerkPerformanceOverviewResponseVo fullRange = + service.queryOverview(buildOverviewVo("2024-07-01", "2024-07-10")); + ClerkPerformanceOverviewSummaryVo fullSummary = fullRange.getSummary(); + assertEquals(new BigDecimal("1480.00"), fullSummary.getTotalGmv()); + assertEquals(12, fullSummary.getTotalOrderCount()); + assertEquals(new BigDecimal("590.00"), snapshotFor(fullRange.getRankings(), alpha.getId()).getGmv()); + assertEquals(new BigDecimal("450.00"), snapshotFor(fullRange.getRankings(), beta.getId()).getGmv()); + assertEquals(new BigDecimal("440.00"), snapshotFor(fullRange.getRankings(), gamma.getId()).getGmv()); + + ClerkPerformanceOverviewResponseVo midRange = + service.queryOverview(buildOverviewVo("2024-07-04", "2024-07-08")); + ClerkPerformanceOverviewSummaryVo midSummary = midRange.getSummary(); + assertEquals(5, midSummary.getTotalOrderCount()); + assertEquals(new BigDecimal("565.00"), midSummary.getTotalGmv()); + List midRankings = midRange.getRankings(); + assertEquals("c-gamma", midRankings.get(0).getClerkId()); + assertEquals(new BigDecimal("210.00"), midRankings.get(0).getGmv()); + assertEquals("c-beta", midRankings.get(1).getClerkId()); + assertEquals(new BigDecimal("205.00"), midRankings.get(1).getGmv()); + assertEquals("c-alpha", midRankings.get(2).getClerkId()); + assertEquals(new BigDecimal("150.00"), midRankings.get(2).getGmv()); + + ClerkPerformanceOverviewResponseVo shortRange = service.queryOverview( + buildOverviewVo("2024-07-10 18:30:00", "2024-07-10 18:59:59")); + ClerkPerformanceOverviewSummaryVo shortSummary = shortRange.getSummary(); + assertEquals(1, shortSummary.getTotalOrderCount()); + assertEquals(new BigDecimal("130.00"), shortSummary.getTotalGmv()); + ClerkPerformanceSnapshotVo alphaSnapshot = snapshotFor(shortRange.getRankings(), alpha.getId()); + assertEquals(new BigDecimal("130.00"), alphaSnapshot.getGmv()); + assertEquals(1, alphaSnapshot.getOrderCount()); + assertEquals(BigDecimal.ZERO, snapshotFor(shortRange.getRankings(), beta.getId()).getGmv()); + assertEquals(BigDecimal.ZERO, snapshotFor(shortRange.getRankings(), gamma.getId()).getGmv()); + } finally { + clearAuthentication(); + } + } + @Test @DisplayName("getClerkPerformanceInfo should ignore non-completed orders when aggregating GMV") void getClerkPerformanceInfoSkipsNonCompletedOrders() { PlayClerkUserInfoEntity clerk = buildClerk("c9", "Nine", "gX", "lX"); @@ -348,6 +452,22 @@ class PlayClerkPerformanceServiceImplTest { assertTrue(idCaptor.getValue().contains(completed.getId())); } + private ClerkPerformanceOverviewQueryVo buildOverviewVo(String start, String end) { + ClerkPerformanceOverviewQueryVo vo = new ClerkPerformanceOverviewQueryVo(); + vo.setEndOrderTime(Arrays.asList(start, end)); + vo.setIncludeSummary(true); + vo.setIncludeRankings(true); + vo.setLimit(10); + return vo; + } + + private ClerkPerformanceSnapshotVo snapshotFor(List snapshots, String clerkId) { + return snapshots.stream() + .filter(snapshot -> clerkId.equals(snapshot.getClerkId())) + .findFirst() + .orElseThrow(() -> new AssertionError("Snapshot not found for clerk " + clerkId)); + } + private PlayClerkUserInfoEntity buildClerk(String id, String name, String groupId, String levelId) { PlayClerkUserInfoEntity entity = new PlayClerkUserInfoEntity(); entity.setId(id);