task-280(验收反馈): 重复检测对齐reference P0(分组筛选生效/抽屉聚合+汇总徽章/台账计数预载/total_dup计数/矩阵表头吸顶;后端含工作区在途console化代码)
This commit is contained in:
+119
@@ -137,6 +137,113 @@ class ShopDataDuplicateCheckQueryServiceTest {
|
||||
assertThat(list.get("scanned_at")).isEqualTo("");
|
||||
}
|
||||
|
||||
@Test
|
||||
void consoleSuperAdminReturnsDupSetGroupsAndSummary() {
|
||||
Map<String, Object> data = service.consoleData(view, null, noFilter());
|
||||
assertThat(data.get("pending")).isEqualTo(false);
|
||||
assertThat(data.get("total_dup")).isEqualTo(3);
|
||||
@SuppressWarnings("unchecked")
|
||||
List<DuplicateItem> dup = (List<DuplicateItem>) data.get("dup");
|
||||
assertThat(dup).extracting(DuplicateItem::asin)
|
||||
.containsExactlyInAnyOrder("A0000001", "E0000001", "F0000001");
|
||||
assertThat(dup).allSatisfy(item -> assertThat(item.shopCount()).isGreaterThanOrEqualTo(2));
|
||||
DuplicateScanSummary summary = (DuplicateScanSummary) data.get("summary");
|
||||
assertThat(summary.asinTotal()).isEqualTo(6);
|
||||
assertThat(summary.recordTotal()).isEqualTo(10);
|
||||
assertThat(summary.duplicateAsinTotal()).isEqualTo(3);
|
||||
assertThat(summary.siteCount()).isEqualTo(3);
|
||||
@SuppressWarnings("unchecked")
|
||||
List<Map<String, Object>> groups = (List<Map<String, Object>>) data.get("groups");
|
||||
assertThat(groups).extracting(map -> map.get("name"))
|
||||
.containsExactlyInAnyOrder("GroupA", "GroupC", "GroupD");
|
||||
Map<String, Object> groupA = groups.stream()
|
||||
.filter(map -> "GroupA".equals(map.get("name"))).findFirst().orElseThrow();
|
||||
assertThat(groupA.get("shop_count")).isEqualTo(2);
|
||||
assertThat(groupA.get("asin_unique")).isEqualTo(4);
|
||||
assertThat(groupA.get("record_count")).isEqualTo(6);
|
||||
assertThat(groupA.get("dup_count")).isEqualTo(2);
|
||||
}
|
||||
|
||||
@Test
|
||||
void consoleLeaderCropRemovesCrossGroupDupAndKeepsOwnGroups() {
|
||||
Set<String> visible = Set.of("shopa", "shopb");
|
||||
Map<String, Object> data = service.consoleData(view, visible, noFilter());
|
||||
assertThat(data.get("total_dup")).isEqualTo(2);
|
||||
@SuppressWarnings("unchecked")
|
||||
List<DuplicateItem> dup = (List<DuplicateItem>) data.get("dup");
|
||||
assertThat(dup).extracting(DuplicateItem::asin)
|
||||
.containsExactlyInAnyOrder("A0000001", "E0000001");
|
||||
@SuppressWarnings("unchecked")
|
||||
List<Map<String, Object>> groups = (List<Map<String, Object>>) data.get("groups");
|
||||
assertThat(groups).hasSize(1);
|
||||
assertThat(groups.get(0).get("name")).isEqualTo("GroupA");
|
||||
@SuppressWarnings("unchecked")
|
||||
List<DuplicateShop> shops = (List<DuplicateShop>) data.get("shops");
|
||||
assertThat(shops).extracting(DuplicateShop::shopName).containsExactly("ShopA", "ShopB");
|
||||
}
|
||||
|
||||
@Test
|
||||
void consolePendingShapes() {
|
||||
Map<String, Object> data = service.pendingConsole();
|
||||
assertThat(data.get("pending")).isEqualTo(true);
|
||||
assertThat(data.get("dup")).isEqualTo(List.of());
|
||||
assertThat(data.get("groups")).isEqualTo(List.of());
|
||||
assertThat(data.get("summary")).isEqualTo(Map.of());
|
||||
}
|
||||
|
||||
@Test
|
||||
void ledgerSingleAsinRowDerivesStoresGroupsCountriesAndDates() {
|
||||
ShopDataDuplicateCheckQueryService.Filters filters =
|
||||
ShopDataDuplicateCheckQueryService.Filters.clean("E0000001", "", "", "", "", "");
|
||||
Map<String, Object> data = service.ledgerData(view, null, 1, 200, "asin", "asc", filters);
|
||||
assertThat(data.get("total")).isEqualTo(1);
|
||||
@SuppressWarnings("unchecked")
|
||||
List<Map<String, Object>> items = (List<Map<String, Object>>) data.get("items");
|
||||
Map<String, Object> e = items.get(0);
|
||||
assertThat(e.get("asin")).isEqualTo("E0000001");
|
||||
assertThat(e.get("brand")).isEqualTo("BrandE");
|
||||
assertThat(e.get("store_count")).isEqualTo(3);
|
||||
assertThat(e.get("stores")).isEqualTo(List.of("ShopA", "ShopB", "ShopC"));
|
||||
assertThat(e.get("groups")).isEqualTo(List.of("GroupA", "GroupC"));
|
||||
assertThat(e.get("countries")).isEqualTo(List.of("UK", "FR"));
|
||||
assertThat(e.get("record_count")).isEqualTo(3);
|
||||
assertThat(String.valueOf(e.get("earliest"))).startsWith("2026-08-29");
|
||||
assertThat(String.valueOf(e.get("latest"))).startsWith("2026-08-31");
|
||||
}
|
||||
|
||||
@Test
|
||||
void ledgerStoreCountDescPutsThreeShopAsinFirst() {
|
||||
Map<String, Object> data = service.ledgerData(view, null, 1, 200, "store_count", "desc", noFilter());
|
||||
assertThat(data.get("total")).isEqualTo(6);
|
||||
@SuppressWarnings("unchecked")
|
||||
List<Map<String, Object>> items = (List<Map<String, Object>>) data.get("items");
|
||||
assertThat(items.get(0).get("asin")).isEqualTo("E0000001");
|
||||
assertThat(items.get(0).get("store_count")).isEqualTo(3);
|
||||
}
|
||||
|
||||
@Test
|
||||
void ledgerLeaderCropCountsOnlyVisibleStores() {
|
||||
Set<String> visible = Set.of("shopa", "shopb");
|
||||
ShopDataDuplicateCheckQueryService.Filters filters =
|
||||
ShopDataDuplicateCheckQueryService.Filters.clean("E0000001", "", "", "", "", "");
|
||||
Map<String, Object> data = service.ledgerData(view, visible, 1, 200, "", "", filters);
|
||||
@SuppressWarnings("unchecked")
|
||||
List<Map<String, Object>> items = (List<Map<String, Object>>) data.get("items");
|
||||
assertThat(items).hasSize(1);
|
||||
assertThat(items.get(0).get("store_count")).isEqualTo(2);
|
||||
assertThat(items.get(0).get("stores")).isEqualTo(List.of("ShopA", "ShopB"));
|
||||
assertThat(items.get(0).get("record_count")).isEqualTo(2);
|
||||
}
|
||||
|
||||
@Test
|
||||
void ledgerPendingShapes() {
|
||||
Map<String, Object> data = service.pendingLedger(2, 100);
|
||||
assertThat(data.get("pending")).isEqualTo(true);
|
||||
assertThat(data.get("total")).isEqualTo(0);
|
||||
assertThat(data.get("page")).isEqualTo(2);
|
||||
assertThat(data.get("page_size")).isEqualTo(100);
|
||||
}
|
||||
|
||||
@Test
|
||||
void exportCsvBomHeaderAndMonitorRows() throws Exception {
|
||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||
@@ -157,4 +264,16 @@ class ShopDataDuplicateCheckQueryServiceTest {
|
||||
assertThat(text).contains(",法国,");
|
||||
assertThat(lines[1]).doesNotContain(",UK,");
|
||||
}
|
||||
|
||||
@Test
|
||||
void groupFilterNarrowsToGroupMembers() {
|
||||
// 分组筛选:GroupA 只保留 ShopA/ShopB 键。
|
||||
Set<String> keys = service.withGroupFilter(null, view, "GroupA");
|
||||
assertThat(keys).containsExactlyInAnyOrder("shopa", "shopb");
|
||||
// 与数据范围交集:可见集只剩 ShopA 时,交集只剩 ShopA。
|
||||
Set<String> cropped = service.withGroupFilter(Set.of("shopa"), view, "GroupA");
|
||||
assertThat(cropped).containsExactly("shopa");
|
||||
// 空分组名不裁剪。
|
||||
assertThat(service.withGroupFilter(null, view, " ")).isNull();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user