test: cover clerk performance date ranges

This commit is contained in:
irving
2025-11-10 22:33:27 -05:00
parent 984e33bd94
commit b9250566fb

View File

@@ -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<PlayClerkUserInfoEntity> clerks = Arrays.asList(alpha, beta, gamma);
when(playPersonnelGroupInfoService.getValidClerkIdList(any(), any()))
.thenReturn(Arrays.asList(alpha.getId(), beta.getId(), gamma.getId()));
when(clerkUserInfoService.list((Wrapper<PlayClerkUserInfoEntity>) 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<String, List<PlayOrderInfoEntity>> 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<ClerkPerformanceSnapshotVo> 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<ClerkPerformanceSnapshotVo> 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);