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:
@@ -115,7 +115,7 @@
|
||||
</div>
|
||||
<div v-else class="match-zone-scroll">
|
||||
<el-table
|
||||
:data="matchedItems"
|
||||
:data="pagedMatchedItems"
|
||||
:row-key="rowKeyForMatch"
|
||||
:highlight-current-row="false"
|
||||
class="result-table match-table"
|
||||
@@ -168,6 +168,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"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -257,6 +265,8 @@ import { useZiniaoVersion } from "@/shared/utils/ziniao-version";
|
||||
import { formatDateTime } from '@/shared/utils/datetime'
|
||||
import { useHistoryPolling } from '@/shared/composables/useHistoryPolling'
|
||||
import { runBatchDelete } from '@/shared/utils/batch-delete'
|
||||
import { isRecordMissingError, parseTaskStartTimes, removeTaskStartTime, upsertTaskStartTime } from '@/shared/utils/task-queue-state.ts'
|
||||
import { useTablePaging } from '@/shared/composables/useTablePaging.ts'
|
||||
|
||||
const MAX_TRANSIENT_ERRORS = 30;
|
||||
const ziniaoVersion = useZiniaoVersion();
|
||||
@@ -276,6 +286,14 @@ const reservedAmount = ref(0);
|
||||
const candidates = ref<WithdrawCandidateVo[]>([]);
|
||||
const selectedCandidates = ref<WithdrawCandidateVo[]>([]);
|
||||
const matchedItems = ref<WithdrawShopQueueItem[]>([]);
|
||||
|
||||
// F9:匹配结果表分页(只切渲染窗口,不加选择语义)
|
||||
const {
|
||||
page: matchedPage,
|
||||
pageSize: matchedPageSize,
|
||||
total: matchedTotal,
|
||||
paged: pagedMatchedItems,
|
||||
} = useTablePaging(matchedItems)
|
||||
const historyItems = ref<WithdrawHistoryItem[]>([]);
|
||||
const dashboard = ref<WithdrawDashboardVo>({
|
||||
candidateCount: 0,
|
||||
@@ -700,15 +718,7 @@ function loadTaskStartTimes() {
|
||||
typeof window !== "undefined"
|
||||
? window.localStorage.getItem(taskStartTimeStorageKey())
|
||||
: null;
|
||||
const parsed = raw ? JSON.parse(raw) : {};
|
||||
const next: Record<number, string> = {};
|
||||
for (const [taskId, value] of Object.entries(parsed || {})) {
|
||||
const numericTaskId = Number(taskId);
|
||||
if (!Number.isFinite(numericTaskId) || numericTaskId <= 0) continue;
|
||||
if (typeof value !== "string" || !value.trim()) continue;
|
||||
next[numericTaskId] = value;
|
||||
}
|
||||
taskStartTimes.value = next;
|
||||
taskStartTimes.value = parseTaskStartTimes(raw);
|
||||
} catch {
|
||||
taskStartTimes.value = {};
|
||||
}
|
||||
@@ -716,18 +726,13 @@ function loadTaskStartTimes() {
|
||||
|
||||
function setTaskStartTime(taskId: number, startedAt = new Date().toISOString()) {
|
||||
if (!Number.isFinite(taskId) || taskId <= 0) return;
|
||||
taskStartTimes.value = {
|
||||
...taskStartTimes.value,
|
||||
[taskId]: startedAt,
|
||||
};
|
||||
taskStartTimes.value = upsertTaskStartTime(taskStartTimes.value, taskId, startedAt);
|
||||
saveTaskStartTimes();
|
||||
}
|
||||
|
||||
function clearTaskStartTime(taskId?: number | null) {
|
||||
if (!taskId || !(taskId in taskStartTimes.value)) return;
|
||||
const next = { ...taskStartTimes.value };
|
||||
delete next[taskId];
|
||||
taskStartTimes.value = next;
|
||||
taskStartTimes.value = removeTaskStartTime(taskStartTimes.value, taskId);
|
||||
saveTaskStartTimes();
|
||||
}
|
||||
|
||||
@@ -753,11 +758,6 @@ function resetQueueWorkerIfIdle() {
|
||||
saveQueueState();
|
||||
}
|
||||
|
||||
function isRecordMissingError(error: unknown) {
|
||||
const message = error instanceof Error ? error.message : String(error || "");
|
||||
return /记录不存在|任务不存在|不存在|已删除|not\s*found|404/i.test(message);
|
||||
}
|
||||
|
||||
function removeHistoryItemLocally(item: WithdrawHistoryItem) {
|
||||
historyItems.value = historyItems.value.filter((row) => {
|
||||
if (item.resultId != null && row.resultId === item.resultId) return false;
|
||||
|
||||
Reference in New Issue
Block a user