提交一些更改
This commit is contained in:
@@ -209,6 +209,9 @@
|
||||
<div v-if="item.platform" class="files">
|
||||
平台: {{ item.platform }}
|
||||
</div>
|
||||
<div class="files">
|
||||
开始时间: {{ formatDateTime(taskStartTime(item.taskId)) }}
|
||||
</div>
|
||||
<div class="files">
|
||||
创建时间: {{ formatDateTime(item.createdAt) }}
|
||||
</div>
|
||||
@@ -260,6 +263,9 @@
|
||||
<div v-if="item.platform" class="files">
|
||||
平台: {{ item.platform }}
|
||||
</div>
|
||||
<div class="files">
|
||||
开始时间: {{ formatDateTime(taskStartTime(item.taskId)) }}
|
||||
</div>
|
||||
<div class="files">
|
||||
创建时间: {{ formatDateTime(item.createdAt) }}
|
||||
</div>
|
||||
@@ -358,6 +364,7 @@ const activeTaskId = ref<number | null>(null);
|
||||
const activeQueueItem = ref<QueryAsinShopQueueItem | null>(null);
|
||||
const queueWorkerRunning = ref(false);
|
||||
const autoQueueEnabled = ref(false);
|
||||
const taskStartTimes = ref<Record<number, string>>({});
|
||||
let historyPollTimer: number | null = null;
|
||||
const timers = createCategorizedTimers("query-asin");
|
||||
|
||||
@@ -392,6 +399,10 @@ function queueStateStorageKey() {
|
||||
return `query-asin:queue-state:${uidForStorage()}`;
|
||||
}
|
||||
|
||||
function taskStartTimeStorageKey() {
|
||||
return `query-asin:start-times:${uidForStorage()}`;
|
||||
}
|
||||
|
||||
function rowKeyForMatch(row: QueryAsinShopQueueItem) {
|
||||
return `${(row.shopName || "").trim()}::${row.shopId || ""}`;
|
||||
}
|
||||
@@ -600,6 +611,15 @@ function saveQueueState() {
|
||||
window.localStorage.setItem(queueStateStorageKey(), JSON.stringify(payload));
|
||||
}
|
||||
|
||||
function saveTaskStartTimes() {
|
||||
if (typeof window === "undefined") return;
|
||||
if (!Object.keys(taskStartTimes.value).length) {
|
||||
window.localStorage.removeItem(taskStartTimeStorageKey());
|
||||
return;
|
||||
}
|
||||
window.localStorage.setItem(taskStartTimeStorageKey(), JSON.stringify(taskStartTimes.value));
|
||||
}
|
||||
|
||||
function loadQueueState() {
|
||||
try {
|
||||
const raw =
|
||||
@@ -622,6 +642,48 @@ function loadQueueState() {
|
||||
}
|
||||
}
|
||||
|
||||
function loadTaskStartTimes() {
|
||||
try {
|
||||
const raw =
|
||||
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;
|
||||
} catch {
|
||||
taskStartTimes.value = {};
|
||||
}
|
||||
}
|
||||
|
||||
function setTaskStartTime(taskId: number, startedAt = new Date().toISOString()) {
|
||||
if (!Number.isFinite(taskId) || taskId <= 0) return;
|
||||
taskStartTimes.value = {
|
||||
...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;
|
||||
saveTaskStartTimes();
|
||||
}
|
||||
|
||||
function taskStartTime(taskId?: number | null) {
|
||||
if (!taskId) return "";
|
||||
return taskStartTimes.value[taskId] || "";
|
||||
}
|
||||
|
||||
function clearActiveQueueTask() {
|
||||
activeTaskId.value = null;
|
||||
activeQueueItem.value = null;
|
||||
@@ -1003,6 +1065,7 @@ async function processQueue() {
|
||||
continue;
|
||||
}
|
||||
|
||||
setTaskStartTime(created.taskId);
|
||||
queuePushResult.value =
|
||||
pendingQueue.value.length > 0
|
||||
? `任务 ${created.taskId} 已入队,等待完成后自动继续下一个(剩余 ${pendingQueue.value.length} 条)`
|
||||
@@ -1064,8 +1127,10 @@ async function deleteTaskRecord(item: QueryAsinHistoryItem) {
|
||||
if (activeTaskId.value === item.taskId) {
|
||||
clearActiveQueueTask();
|
||||
}
|
||||
clearTaskStartTime(item.taskId);
|
||||
} else if (item.resultId) {
|
||||
await deleteQueryAsinHistory(item.resultId);
|
||||
clearTaskStartTime(item.taskId);
|
||||
} else {
|
||||
throw new Error("缺少可删除的任务标识");
|
||||
}
|
||||
@@ -1077,6 +1142,7 @@ async function deleteTaskRecord(item: QueryAsinHistoryItem) {
|
||||
if (item.taskId && activeTaskId.value === item.taskId) {
|
||||
clearActiveQueueTask();
|
||||
}
|
||||
clearTaskStartTime(item.taskId);
|
||||
removeHistoryItemLocally(item);
|
||||
await loadCandidates();
|
||||
resetQueueWorkerIfIdle();
|
||||
@@ -1090,6 +1156,7 @@ async function deleteTaskRecord(item: QueryAsinHistoryItem) {
|
||||
onMounted(async () => {
|
||||
loadMatchedItems();
|
||||
loadQueueState();
|
||||
loadTaskStartTimes();
|
||||
await Promise.all([loadCandidates(), loadDashboard(), loadHistory()]);
|
||||
reconcileActiveQueueTaskWithHistory();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user