|
@@ -2077,6 +2077,8 @@
|
|
|
.qr-x:hover { background:#f2f2f2; color:#333; }
|
|
.qr-x:hover { background:#f2f2f2; color:#333; }
|
|
|
.qr-bar { display:flex; align-items:center; gap:10px; padding:11px 20px; border-bottom:1px solid #f0f0f0; background:#fcfcfc; }
|
|
.qr-bar { display:flex; align-items:center; gap:10px; padding:11px 20px; border-bottom:1px solid #f0f0f0; background:#fcfcfc; }
|
|
|
.qr-hint { color:#888; font-size:12px; margin-left:4px; }
|
|
.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-dims { padding:8px 20px 10px; max-height:32vh; overflow:auto; border-bottom:1px solid #f0f0f0; }
|
|
.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 { display:flex; align-items:flex-start; gap:10px; padding:4px 0; }
|
|
|
.qr-row + .qr-row { border-top:1px solid #f6f6f6; }
|
|
.qr-row + .qr-row { border-top:1px solid #f6f6f6; }
|
|
@@ -2468,6 +2470,7 @@
|
|
|
<div class="qr-bar">
|
|
<div class="qr-bar">
|
|
|
<button class="btn seal" id="qr-score">生成正交表 & 评估高亮</button>
|
|
<button class="btn seal" id="qr-score">生成正交表 & 评估高亮</button>
|
|
|
<button class="btn" id="qr-search-all" hidden>搜全部达标</button>
|
|
<button class="btn" id="qr-search-all" hidden>搜全部达标</button>
|
|
|
|
|
+ <label class="qr-thr-lab">达标分 ≥ <input id="qr-thr" class="qr-thr" type="number" min="0" max="10" step="0.5" value="7"></label>
|
|
|
<span id="qr-hint" class="qr-hint"></span>
|
|
<span id="qr-hint" class="qr-hint"></span>
|
|
|
</div>
|
|
</div>
|
|
|
<div id="qr-dims" class="qr-dims"></div>
|
|
<div id="qr-dims" class="qr-dims"></div>
|
|
@@ -3696,6 +3699,8 @@
|
|
|
axisPath: { action: [], type: [] }, // 动作/类型 筛选路径(l1/l2/叶子,来自 matrix,筛表显示)
|
|
axisPath: { action: [], type: [] }, // 动作/类型 筛选路径(l1/l2/叶子,来自 matrix,筛表显示)
|
|
|
matrix: null, // /api/query_matrix
|
|
matrix: null, // /api/query_matrix
|
|
|
scores: null, // 最近一次评分结果 cells
|
|
scores: null, // 最近一次评分结果 cells
|
|
|
|
|
+ threshold: 7, // 达标 = keep 且 综合分≥此值(可在弹层调)
|
|
|
|
|
+ lastCost: null,
|
|
|
};
|
|
};
|
|
|
function qrChip(label, active, on, cls) {
|
|
function qrChip(label, active, on, cls) {
|
|
|
const b = document.createElement("button");
|
|
const b = document.createElement("button");
|
|
@@ -3823,7 +3828,7 @@
|
|
|
const tier = (matrix[ai][ti] || {}).tier || 0;
|
|
const tier = (matrix[ai][ti] || {}).tier || 0;
|
|
|
const q = qrCellQuery(actions[ai].name, t.name);
|
|
const q = qrCellQuery(actions[ai].name, t.name);
|
|
|
const v = sc ? sc[`${ai}_${ti}`] : null;
|
|
const v = sc ? sc[`${ai}_${ti}`] : null;
|
|
|
- const keep = v && v.keep;
|
|
|
|
|
|
|
+ const keep = qrKeep(v);
|
|
|
const cls = `qr-c t${tier}` + (tier === 0 ? " dead" : "") + (keep ? " keep" : "");
|
|
const cls = `qr-c t${tier}` + (tier === 0 ? " dead" : "") + (keep ? " keep" : "");
|
|
|
const badge = keep && v.score != null ? `<i class="qr-bd">${v.score}</i>` : "";
|
|
const badge = keep && v.score != null ? `<i class="qr-bd">${v.score}</i>` : "";
|
|
|
html += `<td class="${cls}" data-ai="${ai}" data-ti="${ti}">${q}${badge}</td>`;
|
|
html += `<td class="${cls}" data-ai="${ai}" data-ti="${ti}">${q}${badge}</td>`;
|
|
@@ -3846,12 +3851,25 @@
|
|
|
const r = await api("/api/query_score?sel=" + encodeURIComponent(sel));
|
|
const r = await api("/api/query_score?sel=" + encodeURIComponent(sel));
|
|
|
if (r && r.pending) return false;
|
|
if (r && r.pending) return false;
|
|
|
qrState.scores = r.cells || {};
|
|
qrState.scores = r.cells || {};
|
|
|
|
|
+ qrState.lastCost = r.cost_usd;
|
|
|
renderQrTable();
|
|
renderQrTable();
|
|
|
- const kept = Object.values(qrState.scores).filter((v) => v.keep).length;
|
|
|
|
|
- $("#qr-hint").textContent = `评估完成:keep ${kept} 格 · $${r.cost_usd ?? "?"}`;
|
|
|
|
|
- $("#qr-search-all").hidden = kept === 0;
|
|
|
|
|
|
|
+ qrRefreshKeep();
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
|
|
|
+ // 达标 = Sonnet keep 且 综合分≥阈值;高亮/计数/搜全部达标 统一口径
|
|
|
|
|
+ function qrKeep(v) { return !!(v && v.keep && v.score != null && v.score >= qrState.threshold); }
|
|
|
|
|
+ function qrRefreshKeep() {
|
|
|
|
|
+ if (!qrState.scores) return;
|
|
|
|
|
+ const k = Object.values(qrState.scores).filter(qrKeep).length;
|
|
|
|
|
+ $("#qr-hint").textContent = `达标(keep 且 ≥${qrState.threshold}):${k} 格`
|
|
|
|
|
+ + (qrState.lastCost != null ? ` · 评分 $${qrState.lastCost}` : "");
|
|
|
|
|
+ $("#qr-search-all").hidden = k === 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ $("#qr-thr").addEventListener("input", () => {
|
|
|
|
|
+ const x = parseFloat($("#qr-thr").value);
|
|
|
|
|
+ qrState.threshold = isNaN(x) ? 0 : x;
|
|
|
|
|
+ if (qrState.scores) { qrClosePop(); renderQrTable(); qrRefreshKeep(); }
|
|
|
|
|
+ });
|
|
|
$("#qr-score").onclick = async () => {
|
|
$("#qr-score").onclick = async () => {
|
|
|
renderQrTable(); // 先按当前 chips 刷新拼词
|
|
renderQrTable(); // 先按当前 chips 刷新拼词
|
|
|
$("#qr-hint").textContent = "提交评分…";
|
|
$("#qr-hint").textContent = "提交评分…";
|
|
@@ -3904,7 +3922,7 @@
|
|
|
});
|
|
});
|
|
|
// 搜全部达标:逐格起任务(朴素循环,失败不阻断)
|
|
// 搜全部达标:逐格起任务(朴素循环,失败不阻断)
|
|
|
$("#qr-search-all").onclick = async () => {
|
|
$("#qr-search-all").onclick = async () => {
|
|
|
- const keeps = Object.entries(qrState.scores || {}).filter(([, v]) => v.keep);
|
|
|
|
|
|
|
+ const keeps = Object.entries(qrState.scores || {}).filter(([, v]) => qrKeep(v));
|
|
|
if (!keeps.length) return;
|
|
if (!keeps.length) return;
|
|
|
if (!confirm(`将对 ${keeps.length} 个达标 query 各起一次搜索(小红书+公众号 各20),确认?`)) return;
|
|
if (!confirm(`将对 ${keeps.length} 个达标 query 各起一次搜索(小红书+公众号 各20),确认?`)) return;
|
|
|
let ok = 0;
|
|
let ok = 0;
|