Sfoglia il codice sorgente

feat(mode_workflow): 评估按钮评分中禁用+「评估中…」loading,防重复点击(showTask 加结束回调,失败也恢复)

刘文武 5 giorni fa
parent
commit
d286ecff6c
1 ha cambiato i file con 16 aggiunte e 5 eliminazioni
  1. 16 5
      examples/mode_workflow/index.html

+ 16 - 5
examples/mode_workflow/index.html

@@ -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 };   // 用改写词搜索,方向无关