feat(admin): 店铺数据记录卡片改一行4个;卡片任务号改为任务id(file_task.id,与桌面端推送/心跳/回传同一id)——taskId优先,taskNo/resultId兜底;删除确认同步;更新对齐测试

This commit is contained in:
2026-09-07 15:34:35 +08:00
parent 6d6cfcb6ff
commit b575059726
3 changed files with 14 additions and 9 deletions
@@ -34,7 +34,7 @@ const totalShops = ref(0)
const page = ref(1) const page = ref(1)
// 店铺级一次全载(>200 家店铺时后端按页截断,可上调或恢复底部店铺级分页)。 // 店铺级一次全载(>200 家店铺时后端按页截断,可上调或恢复底部店铺级分页)。
const pageSize = ref(200) const pageSize = ref(200)
// 卡片宫格分页:一行 3 个、一页 10 张卡片(在店铺分页的结果文件内翻页)。 // 卡片宫格分页:一行 4 个、一页 10 张卡片(在店铺分页的结果文件内翻页)。
const cardPage = ref(1) const cardPage = ref(1)
const cardPageSize = ref(10) const cardPageSize = ref(10)
const cardJump = ref('') const cardJump = ref('')
@@ -217,14 +217,14 @@ async function downloadBatch() {
async function removeRowByRow(row: ShopDataResultRow) { async function removeRowByRow(row: ShopDataResultRow) {
// 对齐旧版:原生 confirm。 // 对齐旧版:原生 confirm。
if (!window.confirm(`确认删除店铺“${row.shopName}”的任务 ${row.taskNo || row.resultId} 及结果文件?`)) return if (!window.confirm(`确认删除店铺“${row.shopName}”的任务 ${row.taskId || row.taskNo || row.resultId} 及结果文件?`)) return
deletingKey.value = row.resultId deletingKey.value = row.resultId
try { try {
await deleteShopDataResultHistory(row.resultId) await deleteShopDataResultHistory(row.resultId)
ElMessage.success('删除成功') ElMessage.success('删除成功')
await load() await load()
} catch (error) { } catch (error) {
ElMessage.error(error instanceof Error ? error.message : `正在删除任务 ${row.taskNo || row.resultId}...`) ElMessage.error(error instanceof Error ? error.message : `正在删除任务 ${row.taskId || row.taskNo || row.resultId}...`)
} finally { } finally {
deletingKey.value = '' deletingKey.value = ''
} }
@@ -335,7 +335,7 @@ onMounted(load)
</header> </header>
<div class="sd-card-select-row"> <div class="sd-card-select-row">
<input type="checkbox" :checked="rowSelected(row)" :disabled="!isUsableShopDataResult(row)" @change="toggleRow(row)" /> <input type="checkbox" :checked="rowSelected(row)" :disabled="!isUsableShopDataResult(row)" @change="toggleRow(row)" />
<span class="shop-card-task-no">任务 {{ row.taskNo || row.resultId }}</span> <span class="shop-card-task-no">任务 {{ row.taskId || row.taskNo || row.resultId }}</span>
<span class="st-pill" :class="`is-${statusType(row.status)}`">{{ statusLabel(row.status) }}</span> <span class="st-pill" :class="`is-${statusType(row.status)}`">{{ statusLabel(row.status) }}</span>
</div> </div>
<div class="sd-card-row" v-if="row.groupName"> <div class="sd-card-row" v-if="row.groupName">
@@ -604,7 +604,7 @@ h3 {
} }
.shop-card-grid { .shop-card-grid {
display: grid; display: grid;
grid-template-columns: repeat(3, 1fr); grid-template-columns: repeat(4, 1fr);
gap: 14px; gap: 14px;
} }
.sd-card { .sd-card {
@@ -734,6 +734,11 @@ h3 {
align-items: center; align-items: center;
gap: 6px; gap: 6px;
} }
@media (max-width: 1400px) {
.shop-card-grid {
grid-template-columns: repeat(3, 1fr);
}
}
@media (max-width: 1100px) { @media (max-width: 1100px) {
.shop-card-grid { .shop-card-grid {
grid-template-columns: repeat(2, 1fr); grid-template-columns: repeat(2, 1fr);
@@ -9,8 +9,8 @@ test('align_shop_data_cards_per_task', () => {
// 每任务一张卡:以 resultRow 迭代渲染卡片(宫格分页后绑定 pagedResultRows),不再按店铺聚合。 // 每任务一张卡:以 resultRow 迭代渲染卡片(宫格分页后绑定 pagedResultRows),不再按店铺聚合。
assert.match(page, /v-for="row in pagedResultRows"/, '逐任务卡片渲染') assert.match(page, /v-for="row in pagedResultRows"/, '逐任务卡片渲染')
assert.doesNotMatch(page, /v-for="group in groups"/, '去掉按店铺聚合卡片') assert.doesNotMatch(page, /v-for="group in groups"/, '去掉按店铺聚合卡片')
// 卡片结构:店铺名头 + 任务/状态 + 分组/最新/国家/文件 信息行 + 下载文件/删除。 // 卡片结构:店铺名头 + 任务 id/状态 + 分组/最新/国家/文件 信息行 + 下载文件/删除。
assert.match(page, /任务 {{ row\.taskNo \|\| row\.resultId }}|任务 {{ row\.taskNo/, '卡片含任务号') assert.match(page, /任务 {{ row\.taskId \|\| row\.taskNo \|\| row\.resultId }}/, '卡片含任务 id(桌面端 taskid)')
assert.match(page, />分组</, '卡片含分组行') assert.match(page, />分组</, '卡片含分组行')
assert.match(page, />最新</, '卡片含最新行') assert.match(page, />最新</, '卡片含最新行')
assert.match(page, />国家</, '卡片含国家行') assert.match(page, />国家</, '卡片含国家行')
@@ -2,13 +2,13 @@ import test from 'node:test'
import assert from 'node:assert/strict' import assert from 'node:assert/strict'
import { readSource } from './helpers.ts' import { readSource } from './helpers.ts'
// 验收反馈:店铺数据记录卡片用宫格排(一行 3 个、一页 9 张卡片)+ 分页组件翻页。 // 验收反馈:店铺数据记录卡片用宫格排(一行 4 个、一页 9 张卡片)+ 分页组件翻页。
const PAGE = 'src/pages/tasks/ShopDataTasksPage.vue' const PAGE = 'src/pages/tasks/ShopDataTasksPage.vue'
test('align_shop_data_grid_normal_primary_path', () => { test('align_shop_data_grid_normal_primary_path', () => {
const src = readSource(PAGE) const src = readSource(PAGE)
assert.match(src, /grid-template-columns:\s*repeat\(3,\s*1fr\)/, '卡片容器应为 3 列宫格') assert.match(src, /grid-template-columns:\s*repeat\(4,\s*1fr\)/, '卡片容器应为 4 列宫格')
}) })
test('align_shop_data_grid_normal_variant_input', () => { test('align_shop_data_grid_normal_variant_input', () => {