|
|
@@ -2079,6 +2079,7 @@
|
|
|
.qr-hint { color:#888; font-size:12px; margin-left:4px; }
|
|
|
.qr-thr-lab { color:#666; font-size:12px; }
|
|
|
.qr-thr { width:46px; padding:3px 5px; border:1px solid #ddd; border-radius:6px; font-size:12px; }
|
|
|
+ #qr-score:disabled { opacity:.6; cursor:wait; }
|
|
|
.qr-dims { padding:8px 20px 10px; max-height:32vh; overflow:auto; border-bottom:1px solid #f0f0f0; }
|
|
|
.qr-row { display:flex; align-items:flex-start; gap:10px; padding:4px 0; }
|
|
|
.qr-row + .qr-row { border-top:1px solid #f6f6f6; }
|
|
|
@@ -3667,7 +3668,7 @@
|
|
|
/* ════ 任务面板(✕ 只隐藏;「操作日志」按钮可随时唤回)════ */
|
|
|
let pollTimer = null,
|
|
|
hasTask = false;
|
|
|
- function showTask(title, taskId, onDone) {
|
|
|
+ function showTask(title, taskId, onDone, onSettled) {
|
|
|
hasTask = true;
|
|
|
$("#task-panel").hidden = false;
|
|
|
$("#task-title").textContent = title;
|
|
|
@@ -3680,6 +3681,7 @@
|
|
|
t = await api("/api/task_status?task_id=" + encodeURIComponent(taskId));
|
|
|
} catch (e) {
|
|
|
$("#task-log").textContent = "状态查询失败";
|
|
|
+ if (onSettled) onSettled("error"); // 轮询出错也算结束,让调用方恢复按钮等
|
|
|
return;
|
|
|
}
|
|
|
const log = $("#task-log");
|
|
|
@@ -3692,6 +3694,7 @@
|
|
|
$("#task-dot").className = "dot " + t.status;
|
|
|
$("#task-title").textContent = title + (t.status === "done" ? " · 完成" : " · 失败");
|
|
|
if (t.status === "done" && onDone) onDone();
|
|
|
+ if (onSettled) onSettled(t.status); // done / failed 都触发
|
|
|
};
|
|
|
poll();
|
|
|
}
|
|
|
@@ -3896,13 +3899,21 @@
|
|
|
if (qrState.scores) { qrClosePop(); renderQrTable(); qrRefreshKeep(); }
|
|
|
});
|
|
|
$("#qr-score").onclick = async () => {
|
|
|
- renderQrTable(); // 先按当前 chips 刷新拼词
|
|
|
+ const btn = $("#qr-score");
|
|
|
+ if (btn.disabled) return; // 评分进行中:防重复点击(避免重复起任务/花钱)
|
|
|
+ const orig = btn.textContent;
|
|
|
+ btn.disabled = true; btn.textContent = "评估中…";
|
|
|
+ const restore = () => { btn.disabled = false; btn.textContent = orig; };
|
|
|
+ renderQrTable(); // 先按当前 chips 刷新拼词
|
|
|
$("#qr-hint").textContent = "提交评分…";
|
|
|
let r;
|
|
|
try { r = await api("/api/query_score", { method: "POST", body: JSON.stringify(qrSelBody()) }); }
|
|
|
- catch (e) { return toast("评分启动失败:" + (e.body?.error || e.status), "error"); }
|
|
|
- if (r.cached) { await qrLoadScores(r.sel); return; }
|
|
|
- showTask("Query 评分 · 643 格", r.task_id, async () => { await qrLoadScores(r.sel); });
|
|
|
+ catch (e) { toast("评分启动失败:" + (e.body?.error || e.status), "error"); return restore(); }
|
|
|
+ if (r.cached) { try { await qrLoadScores(r.sel); } finally { restore(); } return; }
|
|
|
+ // 后台任务:完成→载入结果;成功/失败/查询出错 都恢复按钮(onSettled)
|
|
|
+ showTask("Query 评分 · 643 格", r.task_id,
|
|
|
+ async () => { await qrLoadScores(r.sel); },
|
|
|
+ (status) => { if (status !== "done") toast("评分任务" + (status === "failed" ? "失败" : "状态异常") + ",可重试", "warn"); restore(); });
|
|
|
};
|
|
|
async function qrRunSearch(query, label) {
|
|
|
const body = { query, platforms: "xhs,gzh", max_count: 20 }; // 用改写词搜索,方向无关
|