perf(frontend): 工具页分页/历史截断/轻量轮询/共享纯逻辑(审查 F5/F6/F9/F12/G3)
- F9 新增 useTablePaging composable 并接入 7 个工具页"匹配结果"表(只切渲染窗口, 不加选择语义;每页 100 条)+ 深色分页样式 - F6 历史任务抽屉渲染截断(默认 50 条 + "显示全部/收起"),全选口径改为当前可见条目 - F5 新增 task-progress-polling 适配器:等待任务终态的紧循环走 /tasks/progress/light, 异常或空响应回退重型 batch;已接入跟价/定时匹配的 waitForTaskTerminal - F12 背景图 bg.jpg 251KB → 166KB(1920 宽 + quality 80,image-set 仍优先 webp) - G3 抽出共享纯逻辑 task-queue-state(开始时间表序列化校验 + 记录缺失错误判定), 5 个工具页删除逐字重复实现 - 新增 4 个单测文件(分页切片/历史截断/轻量轮询归一/任务队列纯逻辑)
This commit is contained in:
@@ -164,7 +164,7 @@
|
||||
<template #cards-extra>
|
||||
<div class="subsection-title">匹配结果</div>
|
||||
<div v-if="!matchedItems.length" class="match-empty">完成「匹配店铺」后,在此展示匹配结果,确认无误后再启动任务。</div>
|
||||
<el-table v-else :data="matchedItems" :row-key="rowKeyForMatch" :highlight-current-row="false"
|
||||
<el-table v-else :data="pagedMatchedItems" :row-key="rowKeyForMatch" :highlight-current-row="false"
|
||||
class="result-table match-table">
|
||||
<el-table-column prop="shopName" label="店铺名" min-width="100" />
|
||||
<el-table-column label="匹配" width="72" align="center">
|
||||
@@ -187,6 +187,14 @@
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<el-pagination
|
||||
v-if="matchedTotal > matchedPageSize"
|
||||
class="matched-pagination"
|
||||
layout="total, prev, pager, next"
|
||||
:total="matchedTotal"
|
||||
:page-size="matchedPageSize"
|
||||
v-model:current-page="matchedPage"
|
||||
/>
|
||||
</template>
|
||||
<template #item-actions="{ item }">
|
||||
<button v-if="canDownload(itemSource(item))" type="button" class="download"
|
||||
@@ -257,9 +265,12 @@ import {
|
||||
type PriceTrackShopQueueItem,
|
||||
type PriceTrackTaskDetailVo,
|
||||
} from '@/shared/api/java-modules'
|
||||
import { getPollingProgressBatch } from '@/shared/api/task-progress-polling.ts'
|
||||
import { formatDateTime } from '@/shared/utils/datetime'
|
||||
import { uploadPathsToJava } from '@/shared/utils/upload-to-java'
|
||||
import { runBatchDelete } from '@/shared/utils/batch-delete'
|
||||
import { isRecordMissingError } from '@/shared/utils/task-queue-state.ts'
|
||||
import { useTablePaging } from '@/shared/composables/useTablePaging.ts'
|
||||
|
||||
const ziniaoVersion = useZiniaoVersion()
|
||||
|
||||
@@ -277,6 +288,14 @@ const shopInput = ref('')
|
||||
const candidates = ref<PriceTrackCandidateVo[]>([])
|
||||
const selectedCandidates = ref<PriceTrackCandidateVo[]>([])
|
||||
const matchedItems = ref<PriceTrackShopQueueItem[]>([])
|
||||
|
||||
// F9:匹配结果表分页(只切渲染窗口,不加选择语义)
|
||||
const {
|
||||
page: matchedPage,
|
||||
pageSize: matchedPageSize,
|
||||
total: matchedTotal,
|
||||
paged: pagedMatchedItems,
|
||||
} = useTablePaging(matchedItems)
|
||||
const adding = ref(false)
|
||||
const matching = ref(false)
|
||||
const pushing = ref(false)
|
||||
@@ -809,11 +828,6 @@ function rowKeyForMatch(row: { shopName?: string; shopId?: number | string | nul
|
||||
return `${(row.shopName || '').trim()}\u0001${row.shopId ?? ''}`
|
||||
}
|
||||
|
||||
function isRecordMissingError(error: unknown) {
|
||||
const message = error instanceof Error ? error.message : String(error || '')
|
||||
return /记录不存在|不存在|已删除|not\s*found|404/i.test(message)
|
||||
}
|
||||
|
||||
function priceTrackModeForAppClient() {
|
||||
return statusModeEnabled.value ? 'status' : 'asin'
|
||||
}
|
||||
@@ -1006,7 +1020,10 @@ async function waitForTaskTerminal(taskId: number) {
|
||||
while (true) {
|
||||
if (disposed) return 'STOPPED'
|
||||
try {
|
||||
const batch = await getPriceTrackTaskProgressBatch([taskId])
|
||||
// F5:等待终态的紧循环只读 status(轻量白名单覆盖),走 light 端点减小轮询响应体,异常回退重型 batch
|
||||
const batch = await getPollingProgressBatch('priceTrack', [taskId], {
|
||||
fallback: () => getPriceTrackTaskProgressBatch([taskId]),
|
||||
})
|
||||
if (transientErrorCount > 0) {
|
||||
queuePushResult.value = `任务 ${taskId} 服务已恢复,继续等待执行结果...`
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user