task-280(验收反馈): 重复检测对齐reference P0(分组筛选生效/抽屉聚合+汇总徽章/台账计数预载/total_dup计数/矩阵表头吸顶;后端含工作区在途console化代码)

This commit is contained in:
2026-09-06 02:41:44 +08:00
parent 3dd39bba44
commit ab787ceff7
8 changed files with 1350 additions and 0 deletions
@@ -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();
}
}