-
-
{{ block.shopName }}{{ block.count }} 条
-
分组:{{ block.groupName }}
-
-
- {{ asinCountryLabel(site.country) }} · {{ site.times.length }} 次
-
-
- {{ time }}
-
+
+
+
+
+ 暂无 ≥2 家店铺的分组,无法做分组撞款分析
+
+
+
+
+
{{ activeGroupStat.shopCount }}
组员店铺
+
{{ activeGroupStat.asinUnique.toLocaleString() }}
组内唯一ASIN
+
{{ activeGroupStat.recordCount.toLocaleString() }}
组内上架记录
+
{{ activeGroupStat.dupCount }}
组内撞款ASIN
+
+
+
撞款覆盖矩阵 {{ matrixHint }}
+
+
+
+
+ | ASIN |
+ 品牌 |
+ {{ shop }} |
+
+
+
+
+ | {{ item.asin }} |
+ {{ itemBrand(item) || '—' }} |
+
+
+ {{ cellCount(item, shop) || '' }}
+
+
+ |
+
+
+
+
+
当前范围下没有撞款ASIN
+ 调整筛选条件或切换到其他分组查看
+
+
+
+
撞款详情 同一 ASIN 在多家店铺的上架时间明细
+
+
+
+ {{ item.asin }}
+ {{ item.shopCount }}店在售
+ {{ itemBrand(item) || '未知品牌' }}
+
+
+
+
+
{{ block.shopName }}{{ block.count }} 条
+
分组:{{ block.groupName }}
+
+ {{ asinCountryLabel(site.country) }} · {{ site.times.length }} 次
+ {{ time }}
+
-
-
-
- 当前范围下没有撞款ASIN
- 调整筛选条件或切换到其他分组查看
-
-
-
+
当前范围下没有撞款ASIN
+
共 {{ dupRows.length }} 条{{ scope === 'group' && selectedGroup ? `分组「${selectedGroup}」组内撞款ASIN` : '全店撞款ASIN' }}
+
-
-
-
-
-
-
- {{ row.asin }}
-
-
-
-
-
- {{ (row as LedgerRow).storeCount }} 店
-
-
-
-
- {{ store }}
-
-
-
-
-
- {{ group }}
-
- —
-
-
-
-
- {{ asinCountryLabel(code) }}
-
-
-
-
- {{ displayDate((row as LedgerRow).earliest) }}
-
-
- {{ displayDate((row as LedgerRow).latest) }}
-
-
-
- 明细
-
-
-
-
-
-
-
-
- 撞款
- {{ drawerTitle }} · 品牌:{{ drawerBrand || '未知' }}
-
-
- {{ drawerSummary.shopCount }} 家店铺
- {{ asinCountryLabel(code) }}
- {{ drawerSummary.totalRecords }} 次上架
- 最早上架 {{ drawerSummary.earliest }}
-
-
-
-
- {{ (row as DrawerAggRow).groupName || '—' }}
-
-
- {{ asinCountryLabel((row as DrawerAggRow).country || '') }}
-
-
-
- {{ time }}
-
-
-
- {{ (row as DrawerAggRow).count }}
-
-
-
-
-
-
-
-
-
-
-
- {{ (row as { shopCount: number }).shopCount }}
-
-
-
- {{ shop }}
-
-
-
- {{ (row as { dupCount: number }).dupCount }}
-
-
-
-
diff --git a/admin-frontend-vue/src/pages/tasks/duplicate-console-api.ts b/admin-frontend-vue/src/pages/tasks/duplicate-console-api.ts
index 0ea73361..29c3eab2 100644
--- a/admin-frontend-vue/src/pages/tasks/duplicate-console-api.ts
+++ b/admin-frontend-vue/src/pages/tasks/duplicate-console-api.ts
@@ -55,8 +55,8 @@ export async function fetchDuplicateLedger(
return parseLedgerPage(data)
}
-/** 导出 CSV(撞款 view=monitor / 台账 view=all):GET /duplicate-check-export → Blob。 */
-export async function requestDuplicateCsvBlob(filter: DuplicateFilter, view: string): Promise
{
+/** 导出 Excel(撞款 view=monitor / 台账 view=all):GET /duplicate-check-export → xlsx Blob。 */
+export async function requestDuplicateExportBlob(filter: DuplicateFilter, view: string): Promise {
const { data } = await http.get(`${DUPLICATE_CHECK_ENDPOINT}/duplicate-check-export`, {
params: toDuplicateItemsQuery({ ...filter, view }, 1, 100),
responseType: 'blob',
diff --git a/admin-frontend-vue/tests/align-column-width.test.ts b/admin-frontend-vue/tests/align-column-width.test.ts
index 1cce3364..819dbd97 100644
--- a/admin-frontend-vue/tests/align-column-width.test.ts
+++ b/admin-frontend-vue/tests/align-column-width.test.ts
@@ -47,9 +47,10 @@ test('align_column_width_normal_variant_input', () => {
})
test('align_column_width_boundary_empty_input', () => {
- // 例外页 DuplicateCheckPage 保持自身实现不动。
+ // 例外页 DuplicateCheckPage 已整页复刻 reference 撞款控制台(原生 ledger 表格),不参与 el-table 列宽约定。
const dup = readSource('src/pages/tasks/DuplicateCheckPage.vue')
- assert.match(dup, /el-table-column/, 'DuplicateCheckPage 表格仍在且未被修改')
+ assert.equal(/el-table-column/.test(dup), false, '撞款台账已用 reference 原生表格,不再有 el-table-column')
+ assert.match(dup, /class="ledger"/, '撞款台账仍为表格实现')
})
test('align_column_width_dependency_failure_returns_actionable_message', () => {
diff --git a/admin-frontend-vue/tests/align-dup-console.test.ts b/admin-frontend-vue/tests/align-dup-console.test.ts
index 11cd2fc8..bbaaa23e 100644
--- a/admin-frontend-vue/tests/align-dup-console.test.ts
+++ b/admin-frontend-vue/tests/align-dup-console.test.ts
@@ -42,7 +42,7 @@ test('align_dup_console_drawer_template', () => {
assert.match(page, /drawerAggRows/, '抽屉渲染聚合行')
assert.match(page, /drawerSummary/, '抽屉渲染汇总徽章')
assert.match(page, /次上架/, '汇总含 N 次上架')
- assert.match(page, /label="次数"/, '聚合表含次数列')
+ assert.match(page, /]*>次数<\/th>/, '聚合表含次数列')
})
test('align_dup_console_ledger_total_preload', () => {
|