dcdc8d1ddd
全栈知识治理平台首次入库(P1-P10 + 发布链路模拟验证闭环): - 治理核心:源目录/变更集/人工审核/发布批次/发布执行(fail-closed 闸口) - 测试通道:WeKnora 测试 KB 上传/轮询/验收;poll 完成时写入 parser_generation/index_generation,修复 manual/seed 路径发布闸口永久拦截 - 发布适配器 v071(本地 source=测试角色 / 云端 target=生产角色 模拟验证通过): * ES 导出/导入 mapping 自适应(.keyword 子字段、可选 tenant_id) * OSS locator 支持嵌套 scheme;chunks.seq_id 由目标序列分配 * bundle 归档同身份重试原子替换;verifier 按 bundle chunk_type 计数 * 回滚 job payload 支持 prior_execution_id(strict 解码) - 三通道发布+回滚演练实测:publish 4/4 verified,检索命中, rollback 4/4 rolled_back,目标端 PG is_enabled=false、ES is_enabled=false - 前端 A·Data-console 风格全站统一,120 用例通过 - 门禁:go vet / go test 全包通过,gofmt 干净
149 lines
9.2 KiB
HTML
149 lines
9.2 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="zh-CN">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<title>解析监控 · 方向B 任务收件箱版 [预览稿·模拟数据]</title>
|
||
<style>
|
||
:root{--line:#e5e7eb;--ink:#111827;--sub:#6b7280;--bg:#f7f8fa;--fail:#b91c1c;--ok:#0b6e4f;--warn:#b45309;--run:#1d4ed8}
|
||
*{box-sizing:border-box}
|
||
body{margin:0;background:var(--bg);color:var(--ink);font:14px/1.5 "PingFang SC","Microsoft YaHei",sans-serif}
|
||
header{display:flex;align-items:center;gap:14px;padding:12px 20px;background:#fff;border-bottom:1px solid var(--line)}
|
||
header h1{font-size:17px;margin:0}
|
||
.meta{color:var(--sub);font-size:12px}
|
||
button{font:inherit;padding:5px 12px;border:1px solid var(--line);border-radius:6px;background:#fff;cursor:pointer}
|
||
button.primary{background:#111827;color:#fff;border-color:#111827}
|
||
button.danger{color:var(--fail)}
|
||
.preview-tag{margin-left:auto;background:#fef3c7;color:#92400e;border:1px solid #fcd34d;font-size:12px;padding:2px 10px;border-radius:999px}
|
||
main{max-width:1400px;margin:0 auto;padding:14px 20px;display:grid;grid-template-columns:250px 1fr;gap:14px;align-items:start}
|
||
nav.inbox{background:#fff;border:1px solid var(--line);border-radius:8px;position:sticky;top:14px}
|
||
nav.inbox h2{font-size:13px;margin:0;padding:10px 14px;border-bottom:1px solid var(--line);color:var(--sub)}
|
||
nav.inbox a{display:flex;justify-content:space-between;align-items:center;padding:9px 14px;border-bottom:1px solid #f1f3f6;text-decoration:none;color:var(--ink);font-size:13px}
|
||
nav.inbox a.active{background:#eef2ff;border-left:3px solid #111827;padding-left:11px;font-weight:600}
|
||
nav.inbox .n{font-size:12px;padding:0 8px;border-radius:999px;background:#f3f4f6;color:var(--sub)}
|
||
nav.inbox a.blocked .n{background:#fee2e2;color:var(--fail)}
|
||
nav.inbox a.okall .n{background:#dcfce7;color:var(--ok)}
|
||
.work{display:flex;flex-direction:column;gap:14px}
|
||
section{background:#fff;border:1px solid var(--line);border-radius:8px}
|
||
.shead{display:flex;align-items:center;gap:10px;padding:10px 14px;border-bottom:1px solid var(--line)}
|
||
.shead h3{font-size:14px;margin:0}
|
||
.shead .spacer{flex:1}
|
||
.task{display:grid;grid-template-columns:28px 1fr auto;gap:12px;padding:12px 14px;border-bottom:1px solid #f1f3f6;align-items:start}
|
||
.task:last-child{border-bottom:none}
|
||
.task input{margin-top:4px}
|
||
.task h4{margin:0;font-size:14px}
|
||
.task .why{font-size:12px;color:var(--sub);margin-top:2px}
|
||
.task .chain{margin-top:8px;display:flex;gap:4px;align-items:center;font-size:11px;color:var(--sub)}
|
||
.step{padding:2px 8px;border-radius:4px;border:1px solid var(--line);background:#fafbfc}
|
||
.step.done{background:#f0fdf4;border-color:#bbf7d0;color:var(--ok)}
|
||
.step.bad{background:#fef2f2;border-color:#fecaca;color:var(--fail);font-weight:600}
|
||
.arrow{color:#d1d5db}
|
||
.act{display:flex;flex-direction:column;gap:6px;align-items:flex-end}
|
||
.badge{font-size:12px;padding:1px 8px;border-radius:4px;border:1px solid var(--line);white-space:nowrap}
|
||
.badge.add{color:var(--ok)}.badge.update{color:var(--run)}.badge.move_scope{color:var(--warn)}.badge.delete{color:var(--fail)}
|
||
.badge.in{background:#eef6ff;border-color:#bfdbfe}.badge.out{background:#f0fdf4;border-color:#bbf7d0}
|
||
.errline{margin-top:6px;font-size:12px;color:var(--fail)}
|
||
code{font:12px ui-monospace,Consolas,monospace;color:var(--sub)}
|
||
.tiny{font-size:12px;color:var(--sub)}
|
||
input[type=text]{font:inherit;padding:5px 8px;border:1px solid var(--line);border-radius:6px;width:110px}
|
||
footer{display:flex;overflow-x:auto;background:#fff;border:1px solid var(--line);border-radius:8px;font-size:12px}
|
||
footer div{padding:8px 16px;border-right:1px solid var(--line);white-space:nowrap}
|
||
footer div:last-child{border-right:none}
|
||
footer .bad{color:var(--fail)}footer .good{color:var(--ok)}
|
||
.empty{padding:26px;text-align:center;color:var(--sub);font-size:13px}
|
||
</style>
|
||
</head>
|
||
<body>
|
||
<header>
|
||
<h1>解析监控 · 收件箱</h1>
|
||
<span class="meta">快照 2026-09-12 08:00</span>
|
||
<span class="meta">活跃 Worker <b>2</b> · 队列 等待3/运行4/失败2</span>
|
||
<button style="margin-left:auto">刷新</button>
|
||
<span class="preview-tag">预览稿 · 模拟数据 · 方向B</span>
|
||
</header>
|
||
<main>
|
||
<nav class="inbox">
|
||
<h2>今天需要我做什么(3)</h2>
|
||
<a class="active blocked" href="#">需人工处理<span class="n">2</span></a>
|
||
<a href="#">等待我确认的差异<span class="n">1</span></a>
|
||
<a href="#">处理中<span class="n">4</span></a>
|
||
<a class="okall" href="#">今日完成<span class="n">38</span></a>
|
||
<a href="#">死信(不可自动重试)<span class="n">1</span></a>
|
||
</nav>
|
||
|
||
<div class="work">
|
||
<section>
|
||
<div class="shead"><h3>1 个任务需要你出手</h3><span class="spacer"></span><span class="tiny">操作人</span><input type="text" value="姚工"><button class="danger">批量重试所选</button></div>
|
||
|
||
<div class="task">
|
||
<input type="checkbox" checked>
|
||
<div>
|
||
<h4>CR20A.pdf <span class="badge out">对外</span> <span class="badge update">更新</span></h4>
|
||
<div class="why">为什么失败:文档解析返回 422(切片数量=0)· 错误码 <code>validation_failed</code> · 第2次尝试 · 停留164秒。同类文件今天已成功 12 个,可能是该文件本身问题。</div>
|
||
<div class="chain"><span class="step done">下载 ✓</span><span class="arrow">→</span><span class="step done">Hash ✓</span><span class="arrow">→</span><span class="step done">OSS ✓</span><span class="arrow">→</span><span class="step bad">文档解析 ✗</span><span class="arrow">→</span><span class="step">上传</span><span class="arrow">→</span><span class="step">索引</span><span class="arrow">→</span><span class="step">完成</span></div>
|
||
<div class="errline">建议:先在 WeKnora 手动解析该文件确认格式,再决定是否重试。</div>
|
||
</div>
|
||
<div class="act"><button>详情/时间线</button><button class="primary">重试</button></div>
|
||
</div>
|
||
|
||
<div class="task">
|
||
<input type="checkbox" checked>
|
||
<div>
|
||
<h4>MG400碰撞检测笔记.pdf <span class="badge in">对内</span> <span class="badge add">新增</span></h4>
|
||
<div class="why">为什么失败:索引增强被远端永久拒绝 <code>remote_permanent</code>(5/5 次尝试耗尽,已进入死信)。原因多为 MinerU 容量持续 429。</div>
|
||
<div class="chain"><span class="step done">下载 ✓</span><span class="arrow">→</span><span class="step done">上传 ✓</span><span class="arrow">→</span><span class="step done">解析 ✓</span><span class="arrow">→</span><span class="step bad">索引 ✗ 429×5</span></div>
|
||
<div class="errline">资源状态:MinerU 当前容量已满 —— 恢复接单后此任务可一键重新入队。</div>
|
||
</div>
|
||
<div class="act"><button>详情/时间线</button><button class="primary">重新入队</button></div>
|
||
</div>
|
||
</section>
|
||
|
||
<section>
|
||
<div class="shead"><h3>等待我确认的差异(1)</h3><span class="spacer"></span><span class="tiny">国内工业 09-08 → 09-12 · 共 5 项变化,3 项自动可处理</span></div>
|
||
<div class="task">
|
||
<input type="checkbox" checked>
|
||
<div>
|
||
<h4>越疆售后FAQ.xlsx <span class="badge in">对内</span>→<span class="badge out">对外</span> <span class="badge move_scope">范围变化</span></h4>
|
||
<div class="why">内容Hash未变,仅标注范围升级;确认后进入发布流程。历史审核:09-02 姚工 标记对内。</div>
|
||
</div>
|
||
<div class="act"><button>预览文件</button><button class="primary">确认</button><button>驳回</button></div>
|
||
</div>
|
||
<div class="task">
|
||
<span></span>
|
||
<div>
|
||
<h4>安装指南.pdf <span class="badge move">移动(改名/换目录)</span></h4>
|
||
<div class="why">同名同Hash证据充分 → 自动更新路径,不重解析。无需操作。</div>
|
||
</div>
|
||
<div class="act"><span class="tiny">已自动处理</span></div>
|
||
</div>
|
||
<div class="task">
|
||
<span></span>
|
||
<div>
|
||
<h4>旧手册.pdf <span class="badge delete">删除</span></h4>
|
||
<div class="why">来源侧消失;将随本批差异确认后从测试知识库移除(不删来源文件)。</div>
|
||
</div>
|
||
<div class="act"><span class="tiny">随批次确认</span></div>
|
||
</div>
|
||
</section>
|
||
|
||
<section>
|
||
<div class="shead"><h3>处理中(4)</h3><span class="spacer"></span><span class="tiny">无需操作,仅供查看</span></div>
|
||
<div class="task"><span></span><div><h4>XVision标定手册.pdf</h4><div class="chain"><span class="step done">下载 ✓</span><span class="arrow">→</span><span class="step done">上传 ✓</span><span class="arrow">→</span><span class="step bad" style="color:var(--run);border-color:#bfdbfe;background:#eff6ff">文档解析中 6分钟</span></div></div><div class="act"><button>详情</button></div></div>
|
||
<div class="empty">其余 3 个任务正常排队/处理中…</div>
|
||
</section>
|
||
|
||
<footer>
|
||
<div>10s <b class="good">100%</b></div>
|
||
<div>1小时·成功 <b class="good">88.9%</b></div>
|
||
<div>24小时·成功 <b class="good">96.4%</b></div>
|
||
<div>p50 30秒 · p95 30分钟</div>
|
||
<div>CPU 42% · 内存 18.6/32GB</div>
|
||
<div>WeKnora <b class="good">可达</b></div>
|
||
<div>MinerU <b class="bad">429 容量满</b></div>
|
||
<div>PostgreSQL <b class="good">可接单</b></div>
|
||
</footer>
|
||
</div>
|
||
</main>
|
||
</body>
|
||
</html>
|