资料文件真产出来了;E04/I01 补到验收线,顺手填了几个「墙拦住却不给路」的坑

**资料文件全链**(用户:审核资料这一步要真产出 word/excel/md/html,前端能渲、点资料名能开)
接手时这一步一个文件都产不出来 —— S3 剧本白纸黑字写着「file_ref 本 MVP 阶段可留空」。
文件是台账那一行的投影,不另存一份:
· 声明 `file:{titleColumn,bodyColumn,formatColumn}`,它同时是授权面(没声明就点不开)
· 现造真字节 —— docx/xlsx 是自己打的 OOXML 包(zip-write:store+CRC32,零依赖)
· 读回来渲 —— 解的就是造出来那份字节,渲得出来才证明文件是真的
· 件上 `data-file-of` → 工作区二级界面(Word 纸面/Excel 网格/渲好的 md/沙箱 html)+ 下载原件
放行落地前把每一份冻进 `sys.task_asset_file`(迁移 0029):归档件点开的必须是签字那一刻
那一份,而资料落在主数据上、试跑单不落正式表 —— 不存这一份,收工后一个都点不开。
工作成果里「产出的资料」自成一摞。Markdown 富文本渲染顺带销账(仍零依赖)。

**Harness**
· 画面按「这一拍办完之后」在办的那一步挑 —— 从前拿拍首的局面决定拍尾的事:
  收掉 S4、发出 S5 的卡,而屏上还摆着 S4 的只读件,人无处可填(墙要配路第四次现形)
· 验收「重做」真能退回重做,且打回后台账没动就不许再提交(软硬两段,不锁死单子)
· 立监听的授权面是清单声明;发卡的授权面是调人预算,不是计划项
· 读工具同参重调有兜底;空转写身后还有行动就不废串;finish 的 doneWhen 按写完后的草稿算

**界面**
· 翻件与翻页各归各位(从前二选一,多卡多页时页翻不动);没得翻写「—」不写 0/0
· 工作成果详情能翻份;表宽超出能横滑(E04/I01 抄版式时把 overflow-x 抄丢了)
· 查看面灰底滚过一屏变白 —— 两条独立的路都治了(沙箱内不同色 / 弹性子项不长个)
· 测试台「取不到」不再当成「还活着」

**活动**
E04 关系覆盖、I01 品牌内容各自补到验收线:判据全读基座数、判据指向的东西摆上卡面、
样例满载且名字 ≤14 字;提交前要裁的判据搬进说明书(模型会压拍,压过之后只有说明书还在)。

验收:e2e i01 4/4、e04 3/3 全部 released,资料在办中渲得出、放行后存了档点得开;
门禁 typecheck/lint/depcruise/1628 测全绿。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EEJX8Z7CHejvwmDQyPQuBX
This commit is contained in:
xcs
2026-08-24 10:26:45 +08:00
co-authored by Claude Opus 5
parent 70e83d0b09
commit 0aa2fc11b0
92 changed files with 13984 additions and 370 deletions
@@ -0,0 +1,197 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>执行工单 1 · 覆盖范围确认 · E04 关系覆盖与关键人经营</title>
<style>
:root{
--ink:#1f2329; --ink-2:#41464e; --ink-3:#646a73; --ink-4:#8f959e;
--line:#dee0e3; --line-soft:#e8eaed; --soft:#f8f9fb;
--brand:#3370ff; --brand-deep:#245bdb; --brand-soft:#e1eaff; --brand-wash:#f0f4ff;
--human:#a9711e; --human-soft:#f6ecd8; --human-line:#e6d3a8;
--ok:#278717; --ok-soft:#e8f8e4; --danger:#d83931; --danger-soft:#feeae9;
--mono:"SF Mono",Menlo,Consolas,monospace;
}
*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;background:#eef1f6;color:var(--ink);font-size:14px;line-height:1.7;-webkit-font-smoothing:antialiased}
.page{margin:0;padding:0}
.card{background:#fff;overflow:hidden;border:0;border-radius:0;box-shadow:none}
.card-head{display:flex;align-items:center;gap:14px;padding:18px 22px;border-bottom:2px solid var(--ink);background:linear-gradient(120deg,#fffaf1 0%,#fff 55%,#fbf6ea 100%)}
.badge{flex:none;width:44px;height:44px;border-radius:10px;display:grid;place-items:center;background:var(--human);color:#fff;font-weight:800;font-size:13px;box-shadow:0 6px 16px rgba(169,113,30,.25)}
.tit{flex:1;min-width:0}
.tit .kick{font-size:11px;letter-spacing:.08em;color:var(--ink-4);font-weight:700}
.tit h1{margin:2px 0 0;font-size:19px;font-weight:800;line-height:1.3}
.tit .sub{font-size:12px;color:var(--ink-3);margin-top:3px}
.side{display:flex;flex-direction:column;align-items:flex-end;gap:6px;flex:none}
.tag{font-size:11px;font-weight:800;padding:2px 10px;border-radius:999px;color:var(--human);background:var(--human-soft);border:1px solid var(--human-line)}
.step{font-size:12px;color:var(--ink-3)}
.deadline{font-size:12px;color:var(--ink-3)}
.deadline b{color:var(--danger)}
.card-bd{padding:20px 22px}
.zone{font-size:11px;font-weight:800;letter-spacing:.12em;color:var(--ink-4);margin:0 0 8px}
.zone b{color:var(--ink-3)}
.note{border:1px solid var(--line);border-left:3px solid var(--human);border-radius:8px;background:var(--soft);padding:14px 16px;margin-bottom:16px}
.note p{margin:0;font-size:13px;color:var(--ink-2)}
.note b{color:var(--ink)}
.note .done{color:var(--ok);font-weight:700}
.note .need{color:var(--human);font-weight:700}
.jc-editgate{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:14px 0 10px;padding:9px 12px;border-radius:9px;background:var(--soft);border:1px solid var(--line-soft);font-size:12px;color:var(--ink-3)}
.jc-editgate-t{flex:1 1 auto;min-width:0}
.jc-editgate-t b{color:var(--ink-2);font-weight:700}
.jc-egbtn{flex:none;display:inline-flex;align-items:center;gap:5px;cursor:pointer;border:1px solid var(--line);border-radius:7px;padding:6px 13px;font:inherit;font-size:12px;font-weight:700;color:var(--ink-2);background:#fff;transition:border-color .16s,color .16s,background .16s}
.jc-egbtn:hover{border-color:var(--brand);color:var(--brand)}
.jc-egbtn.save{color:#fff;background:var(--human);border-color:var(--human)}
.jc-egbtn.save:hover{filter:brightness(1.06);color:#fff}
.jc-editgate .eg-cancel,.jc-editgate .eg-save{display:none}
.jc-editgate.on{background:var(--human-soft);border-color:var(--human-line);color:#7c4a12}
.jc-editgate.on .eg-open{display:none}
.jc-editgate.on .eg-cancel,.jc-editgate.on .eg-save{display:inline-flex}
.tbl-wrap{border:1px solid var(--line-soft);border-radius:10px;overflow:hidden}
table{width:100%;border-collapse:collapse;font-size:12.5px}
th{text-align:left;background:var(--soft);font-size:11px;letter-spacing:.03em;font-weight:800;color:var(--ink-3);padding:9px 10px;border-bottom:1px solid var(--line)}
th.req::after{content:" *";color:var(--danger);font-size:11px}
td{padding:8px 10px;border-bottom:1px solid var(--line-soft);vertical-align:middle}
tr:last-child td{border-bottom:0}
td.rn{position:relative;width:38px;white-space:nowrap;font-family:var(--mono);font-size:11px;color:var(--ink-4);text-align:center}
.jc-vcell{display:block;font-size:12.5px;color:var(--ink);line-height:1.5;overflow-wrap:anywhere}
.jc-vcell.mono{font-family:var(--mono);font-size:11.5px;color:var(--ink-2)}
.jc-cell{display:none;width:100%;min-width:60px;border:1px solid var(--line);border-radius:6px;padding:6px 8px;font:inherit;font-size:12.5px;color:var(--ink);background:#fff}
.jc-cell.mono{font-family:var(--mono);font-size:11.5px}
.jc-cell:focus{border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-wash);outline:none}
table.on td>.jc-vcell{display:none}
table.on td>.jc-cell{display:block}
td.rn .jc-rowdel{display:none;width:22px;height:22px;margin:0 auto;cursor:pointer;border:1px solid var(--line);border-radius:6px;padding:0;font:inherit;font-size:14px;line-height:1;color:var(--ink-3);background:#fff}
td.rn .jc-rowdel:hover{border-color:var(--danger);color:var(--danger);background:var(--danger-soft)}
table.on td.rn .jc-rn-num{display:none}
table.on td.rn .jc-rowdel{display:block}
.jc-addrow{display:none;margin:8px 0 0;padding:8px 12px;border-radius:9px;background:var(--soft);border:1px dashed var(--line);font-size:12px;color:var(--ink-3)}
.jc-addrow.show{display:flex;align-items:center;gap:8px}
.jc-addrow button{cursor:pointer;border:1px solid var(--brand-soft);border-radius:7px;padding:5px 12px;font:inherit;font-size:12px;font-weight:700;color:var(--brand-deep);background:var(--brand-wash)}
.jc-addrow button:hover{background:var(--brand-soft)}
.jc-addrow em{font-style:normal;font-size:11.5px;color:var(--ink-4)}
.flow{margin-top:16px;padding:9px 12px;border-radius:8px;background:var(--soft);border:1px dashed var(--line);font-size:12px;color:var(--ink-3)}
.flow b{color:var(--ink)}
.card-foot{padding:13px 22px;border-top:1px solid var(--line-soft);font-size:11.5px;color:var(--ink-4);display:flex;justify-content:space-between;flex-wrap:wrap;gap:8px}
@media(max-width:600px){.card-head{flex-wrap:wrap}.side{align-items:flex-start}}
</style>
</head>
<body>
<div class="page">
<div class="card">
<header class="card-head">
<div class="badge">执行</div>
<div class="tit">
<div class="kick">E04 关系覆盖与关键人经营 · 执行工单 1/2</div>
<h1>覆盖范围确认</h1>
<div class="sub">收件人:<span data-slot="meta.task.owner">AM Lead(负责人)</span> · 关联任务:<span data-slot="meta.task.id">TASK-xxx</span></div>
</div>
<div class="side">
<span class="tag">执行工单</span>
<span class="step" data-slot="meta.phase">步骤 ① 启动与覆盖范围确认</span>
<span class="deadline">最迟交回:<b data-slot="card.deadline">1 个工作日</b></span>
</div>
</header>
<div class="card-bd">
<p class="zone"><b>【做什么】</b>—— 确认本轮覆盖范围</p>
<div class="note">
<p><span class="done">AI 已完成</span>:按台账规则识别本轮触发口径与覆盖范围,产出下方客户清单(<b>候选基线</b>)。</p>
<p><span class="need">需要你查漏补缺</span>:点「编辑」直接在清单上增删改——<b>加一行 = 额外纳入</b>(AI 未识别但你有价值判断的客户)、<b>删一行 = 排除</b>(AI 纳入但实际应排除)、<b>改单元格 = 修正</b> AI 识别的内容。没有要补的直接在对话区卡里提交。</p>
</div>
<p class="zone"><b>【交回什么】</b>—— 核对后的覆盖范围客户清单(*为必填)</p>
<div class="jc-editgate" id="editgate">
<span class="jc-editgate-t"><b data-slot="sd.customer_count">AI 已识别 2 个客户</b>,点「编辑」增删改</span>
<button class="jc-egbtn eg-open" type="button">编辑</button>
<button class="jc-egbtn eg-cancel" type="button">取消</button>
<button class="jc-egbtn eg-save" type="button">保存</button>
</div>
<div class="tbl-wrap">
<table id="tbl">
<thead>
<tr>
<th style="width:38px">#</th>
<th class="req" data-h="客户编号">客户编号</th>
<th class="req" data-h="客户名称">客户名称</th>
<th data-h="客户类型">客户类型</th>
<th data-h="BT 层级">BT 层级</th>
<th data-h="状态">状态</th>
<th data-h="识别依据">识别依据 / 纳入原因</th>
<th data-h="覆盖深度">覆盖深度</th>
</tr>
</thead>
<tbody data-rows="out.customer_list">
<tr>
<td class="rn"><span class="jc-rn-num">1</span><button class="jc-rowdel" type="button" title="删除此行">×</button></td>
<td data-field="customer_id"><span class="jc-vcell mono">CUS-2025-0012</span><input class="jc-cell mono" value="CUS-2025-0012"></td>
<td data-field="customer_name"><span class="jc-vcell">AvtoKom 汽车电子</span><input class="jc-cell" value="AvtoKom 汽车电子"></td>
<td data-field="cust_type"><span class="jc-vcell mono">Tier1 OEM</span><input class="jc-cell mono" value="Tier1 OEM"></td>
<td data-field="bt_level"><span class="jc-vcell mono">BT-02</span><input class="jc-cell mono" value="BT-02"></td>
<td data-field="status"><span class="jc-vcell">正式</span><input class="jc-cell" value="正式"></td>
<td data-field="basis"><span class="jc-vcell">月度例行 + T04 攻坚联动</span><input class="jc-cell" value="月度例行 + T04 攻坚联动"></td>
<td data-field="coverage_depth"><span class="jc-vcell">决策链全节点</span><input class="jc-cell" value="决策链全节点"></td>
</tr>
<tr>
<td class="rn"><span class="jc-rn-num">2</span><button class="jc-rowdel" type="button" title="删除此行">×</button></td>
<td><span class="jc-vcell mono">CUS-2025-0027</span><input class="jc-cell mono" value="CUS-2025-0027"></td>
<td><span class="jc-vcell">Boreas 工业控制</span><input class="jc-cell" value="Boreas 工业控制"></td>
<td><span class="jc-vcell mono">模组厂</span><input class="jc-cell mono" value="模组厂"></td>
<td><span class="jc-vcell mono">BT-02</span><input class="jc-cell mono" value="BT-02"></td>
<td><span class="jc-vcell">正式</span><input class="jc-cell" value="正式"></td>
<td><span class="jc-vcell">月度例行</span><input class="jc-cell" value="月度例行"></td>
<td><span class="jc-vcell">维持性覆盖</span><input class="jc-cell" value="维持性覆盖"></td>
</tr>
</tbody>
</table>
</div>
<div class="jc-addrow" id="addrow">
<button type="button">+ 加一行(额外纳入客户)</button>
<em>新加行的「客户编号」「客户名称」为必填;「识别依据」栏填你纳入它的原因</em>
</div>
<div class="flow"><b>审批 / 提交:</b>本工单只承载内容;「提交回执」请在对话区的【执行卡】中进行。</div>
</div>
<footer class="card-foot">
<span>E04 关系覆盖与关键人经营 · 执行工单 1/2 · 覆盖范围确认</span>
<span style="font-family:'SF Mono',Menlo,Consolas,monospace">工单类型:执行 · <span data-slot="card.id">WO-E04-01</span></span>
</footer>
</div>
</div>
<script>
(function(){
var gate = document.getElementById('editgate');
var tbl = document.getElementById('tbl');
var addrow = document.getElementById('addrow');
var tbody = tbl.querySelector('tbody');
function setEdit(on){ gate.classList.toggle('on',on); tbl.classList.toggle('on',on); addrow.classList.toggle('show',on); }
gate.querySelector('.eg-open').addEventListener('click', function(){ setEdit(true); });
gate.querySelector('.eg-cancel').addEventListener('click', function(){
tbody.querySelectorAll('tr').forEach(function(tr){ tr.querySelectorAll('td').forEach(function(td){ var v=td.querySelector('.jc-vcell'),c=td.querySelector('.jc-cell'); if(v&&c){c.value=v.textContent;} }); });
setEdit(false);
});
gate.querySelector('.eg-save').addEventListener('click', function(){
tbody.querySelectorAll('tr').forEach(function(tr){ tr.querySelectorAll('td').forEach(function(td){ var v=td.querySelector('.jc-vcell'),c=td.querySelector('.jc-cell'); if(v&&c){v.textContent=c.value;} }); });
renumber(); setEdit(false);
});
addrow.querySelector('button').addEventListener('click', function(){
var tr=document.createElement('tr');
tr.innerHTML='<td class="rn"><span class="jc-rn-num"></span><button class="jc-rowdel" type="button" title="删除此行">×</button></td>'+'<td><span class="jc-vcell mono"></span><input class="jc-cell mono" placeholder="客户编号"></td>'+'<td><span class="jc-vcell"></span><input class="jc-cell" placeholder="客户名称"></td>'+'<td><span class="jc-vcell mono"></span><input class="jc-cell mono" placeholder="客户类型"></td>'+'<td><span class="jc-vcell mono"></span><input class="jc-cell mono" placeholder="BT 层级"></td>'+'<td><span class="jc-vcell"></span><input class="jc-cell" placeholder="状态"></td>'+'<td><span class="jc-vcell"></span><input class="jc-cell" placeholder="纳入原因"></td>'+'<td><span class="jc-vcell"></span><input class="jc-cell" placeholder="覆盖深度"></td>';
tbody.appendChild(tr); renumber();
});
tbody.addEventListener('click', function(e){ if(e.target.classList.contains('jc-rowdel')){ e.target.closest('tr').remove(); renumber(); } });
function renumber(){ tbody.querySelectorAll('tr').forEach(function(tr,i){ tr.querySelector('.jc-rn-num').textContent=i+1; }); }
})();
</script>
</body>
</html>
@@ -0,0 +1,150 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>执行工单 2 · 经营计划执行回执 · E04 关系覆盖与关键人经营</title>
<style>
:root{
--ink:#1f2329; --ink-2:#41464e; --ink-3:#646a73; --ink-4:#8f959e;
--line:#dee0e3; --line-soft:#e8eaed; --soft:#f8f9fb;
--brand:#3370ff; --brand-deep:#245bdb; --brand-soft:#e1eaff; --brand-wash:#f0f4ff;
--human:#a9711e; --human-soft:#f6ecd8; --human-line:#e6d3a8;
--ok:#278717; --ok-soft:#e8f8e4; --danger:#d83931; --danger-soft:#feeae9;
--mono:"SF Mono",Menlo,Consolas,monospace;
}
*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;background:#eef1f6;color:var(--ink);font-size:14px;line-height:1.7;-webkit-font-smoothing:antialiased}
.page{margin:0;padding:0}
.card{background:#fff;overflow:hidden;border:0;border-radius:0;box-shadow:none}
.card-head{display:flex;align-items:center;gap:14px;padding:18px 22px;border-bottom:2px solid var(--ink);background:linear-gradient(120deg,#fffaf1 0%,#fff 55%,#fbf6ea 100%)}
.badge{flex:none;width:44px;height:44px;border-radius:10px;display:grid;place-items:center;background:var(--human);color:#fff;font-weight:800;font-size:13px;box-shadow:0 6px 16px rgba(169,113,30,.25)}
.tit{flex:1;min-width:0}
.tit .kick{font-size:11px;letter-spacing:.08em;color:var(--ink-4);font-weight:700}
.tit h1{margin:2px 0 0;font-size:19px;font-weight:800;line-height:1.3}
.tit .sub{font-size:12px;color:var(--ink-3);margin-top:3px}
.side{display:flex;flex-direction:column;align-items:flex-end;gap:6px;flex:none}
.tag{font-size:11px;font-weight:800;padding:2px 10px;border-radius:999px;color:var(--human);background:var(--human-soft);border:1px solid var(--human-line)}
.step{font-size:12px;color:var(--ink-3)}
.deadline{font-size:12px;color:var(--ink-3)}
.deadline b{color:var(--danger)}
.card-bd{padding:20px 22px}
.zone{font-size:11px;font-weight:800;letter-spacing:.12em;color:var(--ink-4);margin:0 0 8px}
.zone b{color:var(--ink-3)}
.note{border:1px solid var(--line);border-left:3px solid var(--human);border-radius:8px;background:var(--soft);padding:14px 16px;margin-bottom:16px}
.note p{margin:0;font-size:13px;color:var(--ink-2)}
.note b{color:var(--ink)}
.note .need{color:var(--human);font-weight:700}
.tbl-wrap{border:1px solid var(--line-soft);border-radius:10px;overflow:hidden}
table{width:100%;border-collapse:collapse;font-size:13px}
th{text-align:left;background:var(--soft);font-size:11px;letter-spacing:.05em;font-weight:800;color:var(--ink-3);padding:9px 12px;border-bottom:1px solid var(--line)}
th.req::after{content:" *";color:var(--danger);font-size:11px}
th.opt::after{content:" 选填";color:var(--ink-4);font-size:10px;font-weight:600}
td{padding:10px 12px;border-bottom:1px solid var(--line-soft);vertical-align:top}
tr:last-child td{border-bottom:0}
.num{font-family:var(--mono);color:var(--ink-4);white-space:nowrap}
.cust{font-weight:700}
input[type=text],textarea,select{font:inherit;font-size:12.5px;border:1px solid var(--line);border-radius:6px;padding:6px 8px;background:#fff;color:var(--ink);width:100%}
input:focus,textarea:focus,select:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-wash)}
textarea{min-height:40px;resize:vertical}
.fixed{font-size:12.5px;color:var(--ink-2)}
.flow{margin-top:16px;padding:9px 12px;border-radius:8px;background:var(--soft);border:1px dashed var(--line);font-size:12px;color:var(--ink-3)}
.flow b{color:var(--ink)}
.card-foot{padding:13px 22px;border-top:1px solid var(--line-soft);font-size:11.5px;color:var(--ink-4);display:flex;justify-content:space-between;flex-wrap:wrap;gap:8px}
@media(max-width:600px){.card-head{flex-wrap:wrap}.side{align-items:flex-start}}
</style>
</head>
<body>
<div class="page">
<div class="card">
<header class="card-head">
<div class="badge">执行</div>
<div class="tit">
<div class="kick">E04 关系覆盖与关键人经营 · 执行工单 2/2</div>
<h1>经营计划执行回执</h1>
<div class="sub">收件人:<span data-slot="meta.task.owner">AM(执行)</span> · 关联任务:<span data-slot="meta.task.id">TASK-xxx</span></div>
</div>
<div class="side">
<span class="tag">执行工单</span>
<span class="step" data-slot="meta.phase">步骤 ⑤⑥ 执行经营动作</span>
<span class="deadline">最迟交回:<b data-slot="card.deadline">2026-08-28</b></span>
</div>
</header>
<div class="card-bd">
<p class="zone"><b>【做什么】</b>—— 执行计划动作</p>
<div class="note">
<p><b>经营计划已验收通过</b>。以下是需要你<b class="need">到场执行</b>的动作(物理拜访、技术交流、递送实物——都是 AI 做不到、需要人去干的)。每项动作执行后,在下方回执。</p>
</div>
<p class="zone"><b>【交回什么】</b>—— 逐项回执(*为必填)</p>
<div class="tbl-wrap">
<table>
<thead>
<tr>
<th style="width:36px">#</th>
<th style="width:140px" data-h="计划动作">计划动作</th>
<th style="width:120px" data-h="对象">对象</th>
<th class="req" style="width:100px" data-h="完成状态">完成状态</th>
<th class="req" data-h="结果摘要">结果摘要</th>
<th class="opt" data-h="客户反馈">客户反馈</th>
<th class="req" style="width:90px" data-h="关键人变动">关键人变动</th>
</tr>
</thead>
<tbody data-rows="out.plan">
<tr>
<td class="num">1</td>
<td data-field="action" class="fixed">拜访 + 方案交流</td>
<td data-field="target" class="cust">AvtoKom · 产品 VP</td>
<td data-field="status"><select><option>完成</option><option>部分完成</option><option>未完成</option></select></td>
<td><textarea placeholder="见到的关键人、谈了什么、达成什么"></textarea></td>
<td><textarea placeholder="客户态度 / 诉求 / 下一步信号"></textarea></td>
<td><select><option>否</option><option>是</option></select></td>
</tr>
<tr>
<td class="num">2</td>
<td class="fixed">技术交流</td>
<td class="cust">AvtoKom · 质量负责人</td>
<td><select><option>完成</option><option>部分完成</option><option>未完成</option></select></td>
<td><textarea placeholder="见到的关键人、谈了什么、达成什么"></textarea></td>
<td><textarea placeholder="客户态度 / 诉求 / 下一步信号"></textarea></td>
<td><select><option>否</option><option>是</option></select></td>
</tr>
<tr>
<td class="num">3</td>
<td class="fixed">价值传递(递样品)</td>
<td class="cust">AvtoKom · 研发负责人</td>
<td><select><option>完成</option><option>部分完成</option><option>未完成</option></select></td>
<td><textarea placeholder="见到的关键人、谈了什么、达成什么"></textarea></td>
<td><textarea placeholder="客户态度 / 诉求 / 下一步信号"></textarea></td>
<td><select><option>否</option><option>是</option></select></td>
</tr>
<tr>
<td class="num">4</td>
<td class="fixed">维持性经营</td>
<td class="cust">Boreas · 采购经理</td>
<td><select><option>完成</option><option>部分完成</option><option>未完成</option></select></td>
<td><textarea placeholder="见到的关键人、谈了什么、达成什么"></textarea></td>
<td><textarea placeholder="客户态度 / 诉求 / 下一步信号"></textarea></td>
<td><select><option>否</option><option>是</option></select></td>
</tr>
</tbody>
</table>
</div>
<div class="flow"><b>审批 / 提交:</b>本工单只承载内容;「提交回执」请在对话区的【执行卡】中进行。若「关键人变动」标「是」,将触发 E02 写 change_log。</div>
</div>
<footer class="card-foot">
<span>E04 关系覆盖与关键人经营 · 执行工单 2/2 · 经营计划执行回执</span>
<span style="font-family:'SF Mono',Menlo,Consolas,monospace">工单类型:执行 · <span data-slot="card.id">WO-E04-03</span></span>
</footer>
</div>
</div>
</body>
</html>
@@ -0,0 +1,177 @@
# E04 关系覆盖与关键人经营 · 活动流程与工单说明
> 所属子系统:SS01 客户与市场 | 优先级:P0 | 类型:关系经营型活动
> 本说明总结 E04 活动的整体流程、工单产出的设计逻辑,以及每一步做了什么。配套工单 HTML 见本目录。
---
## 一、活动定位
**E04 关系覆盖与关键人经营**是围绕客户关系网络的持续经营活动:关键人识别与覆盖、关系亲密度维护、决策链更新、影响力经营。核心理念是「你还没开口,你想要的我已经给你了」——关系覆盖是预判需求的前提。
**消费的台账**(读):L-02 客户主台账(画像/决策链/覆盖度)、L-08 联系人台账(角色/影响力/亲密度)。
**产出的台账**(写):L-02 的 coverage_score / decision_chain / interaction_timeline、L-08 的角色标注 / 影响力 / 亲密度 / 关键人标记。
**触发方式**:① 月度例行(每月对重点客户做一轮覆盖维护);② 事件驱动(新客户建档 / 关键人变动 / 重大商机启动 / 攻坚项目 T04 立项)。
---
## 二、整体流程(7 步)
E04 的完整工作链条共 7 步,AI 与人的分工原则是:**AI 承担信息汇总、记录与初稿生成,人负责判断与决策**。
| 步骤 | 名称 | 谁在做 | 干什么 |
|---|---|---|---|
| ① | 启动与覆盖范围确认 | AM Lead(审) | 确认本轮覆盖哪些客户、场景类型、覆盖深度 |
| ② | 读取覆盖现状 | AI 汇总 | 调出客户画像、决策链地图、覆盖度、联系人清单,形成覆盖全景 |
| ③ | 覆盖缺口分析 | AM Lead(审) | 对照决策链识别空白节点,按 BT 层级确定需覆盖的角色 |
| ④ | 制定关系经营计划 | AM Lead(审) | 按「影响力 × 亲密度缺口」排序,草拟每个关键人的经营动作 |
| ⑤ | 执行经营动作 | AM(执行) | 拜访 / 技术交流 / 价值传递等线下动作(AI 做不到) |
| ⑥ | 更新关系台账 | AM(办理) | 重算 coverage_score、更新决策链、更新联系人档案 |
| ⑦ | 复盘与完结(门禁) | AM Lead(审) | 覆盖度达标检查,输出更新后的关系覆盖地图 |
---
## 三、为什么这样产出工单(核心设计逻辑)
7 步不是 7 个工单。按「AI 能不能独立完成」把 7 步收敛成 **2 张执行工单 + 2 张验收工单**:
| 工单 | 覆盖步骤 | 类型 | 依据 |
|---|---|---|---|
| 执行工单 1 | ① | 执行 | AI 识别出了覆盖范围,但「规则之外」的信息需要人来补 |
| 验收工单 1 | ②③④ | 验收 | AI 算出了经营计划,需要人判断计划是否合理 |
| 执行工单 2 | ⑤⑥ | 执行 | 计划要人去线下执行(AI 做不到),执行完要回执 |
| 验收工单 2 | ⑥⑦ | 验收 | AI 收到回执后更新台账,需要人确认无误后入库 |
### 两条工单的本质区别
**执行工单 = AI 产出 + 人填内容**
- AI 先列出它产出的结论(候选基线),人在这基础上**查漏补缺 / 填写内容**(可以不填)。
- 用于「AI 做不到、需要人去做」的事——如物理拜访、线下交流、补充 AI 识别规则之外的信息。
**验收工单 = AI 结论展示 + 人只做审批**
- AI 展示它计算出的结论(只读),人**只做「通过 / 驳回」**,不能修改结论;驳回带意见,AI 重做。
- 用于「AI 算出了结论、需要人拍板」的事——如经营计划是否合理、台账更新是否无误。
### 三条硬约束
1. **工单不承载审批动作**:工单里不放「提交回执 / 通过 / 驳回」按钮,审批动作统一放在对话区的卡(执行卡 / 验收卡)里。
2. **工单要完整**:每个工单必须包含「做什么 / 交回什么 / 期限 / 判据(验收工单)/ 提交后去向」。
3. **交回内容可校验**:执行工单的回执字段标注必填(*)/ 选填,验收工单给明确的判据清单,让人知道凭什么通过或驳回。
---
## 四、每个工单详细说明
### 执行工单 1 · 覆盖范围确认(步骤 ①)
- **做什么**:确认本轮覆盖范围。
- **AI 产出**:按台账规则识别出的候选客户清单(如 AvtoKom、Boreas)+ 场景类型、覆盖深度。
- **人填什么(查漏补缺)**:在 AI 清单上直接增删改——加一行 = 额外纳入(AI 没识别但人了解有价值)、删一行 = 排除(AI 纳入了但实际应排除)、改单元格 = 修正 AI 识别内容。
- **为什么是执行工单**:AI 只能按台账规则判断,有些「数据里没有、但人线下知道」的信息(如某贸易商掌握关键渠道)需要人补充录入。
- **交回**:核对后的覆盖范围客户清单(客户编号、客户名称必填)。
### 验收工单 1 · 关系经营计划审批(步骤 ②③④)
- **做什么**:审批 AI 制定的关系经营计划。
- **AI 产出**:经过「读覆盖现状 → 缺口分析 → 制定计划」三步计算,得出经营计划(经营哪些关键人、建议动作、建议优先级、理由),按「影响力 × 亲密度缺口」排序。
- **人怎么审**:只读展示,不可修改。按判据核对后「通过」或「驳回+意见」(驳回 AI 重做)。
- **验收判据**:① 关键人覆盖是否完整;② 优先级排序是否合理;③ 动作是否可执行、有时间点。
- **为什么是验收工单**:计划是 AI 算出来的结论,人对结论只做肯定或否定,不自己改。
### 执行工单 2 · 经营计划执行回执(步骤 ⑤⑥)
- **做什么**:执行已验收通过的计划动作。
- **AI 产出**:验收通过后的计划动作清单(拜访谁、做什么)。
- **人填什么(回执)**:逐项填完成状态(必填)、结果摘要(必填)、客户反馈(选填)、关键人变动(必填)。
- **为什么是执行工单**:拜访、技术交流、递送实物都是 AI 做不到、需要人到场执行的事;人执行后把回执填回来。
- **交回**:每项计划动作的执行回执。
### 验收工单 2 · 关系台账更新确认(步骤 ⑥⑦)
- **做什么**:确认 AI 拟更新的台账,无误后入库。
- **AI 产出**:收到执行回执后,重算 coverage_score、更新决策链、更新 L-08 联系人档案、追加互动时间线,产出「更新前 → 更新后」明细。
- **人怎么审**:只读展示,不可修改。按判据核对后「通过入库」或「驳回+意见」。
- **验收判据**:① 更新是否有依据(每条更新能否在回执里找到对应事实);② 数值是否合理;③ 有无漏更或误更。
- **为什么是验收工单**:台账更新是 AI 的落账动作,人确认无误后入库,是「终局唯放行」的最后一道确认。
---
## 五、文件对应关系
| 工单文件 | 类型 | 覆盖步骤 | 一句话 |
|---|---|---|---|
| `E04-执行工单-01-覆盖范围确认.html` | 执行 | ① | 人补充 AI 覆盖范围结论之外的信息 |
| `E04-验收工单-01-关系经营计划.html` | 验收 | ②③④ | 人审批 AI 的经营计划(通过/驳回) |
| `E04-执行工单-02-执行回执.html` | 执行 | ⑤⑥ | 人执行计划并填回执 |
| `E04-验收工单-02-台账更新确认.html` | 验收 | ⑥⑦ | 人确认 AI 的台账更新后入库 |
**完整闭环**:
```
① 覆盖范围确认 ──执行工单1(人补信息)──▶ ②③④ AI 制定计划 ──验收工单1(通过/驳回)──▶
⑤⑥ 人去执行计划 ──执行工单2(人填回执)──▶ AI 更新台账 ──验收工单2(确认入库)──▶ 完结
```
---
## 六、动态数据标注(模板绑定位置)
> 这 4 个工单 HTML 是**模板**——里面的数据会根据实例(不同任务 / 客户 / 轮次)加载不同内容。本表标注每个工单里「动态数据」的位置及其绑定地址(命名空间)。设计态示例数据在运行时会被注水器替换。
### 6.1 绑定命名空间速查
| 命名空间 | 含义 | 本活动用到 |
|---|---|---|
| `meta.*` | 任务与活动元数据 | 收件人、任务编号、步骤、活动名 |
| `card.*` | 工单身份专属 | 期限、工单编号、验收判据、回执字段 |
| `out.*` | 输出表单 / 台账映射行集 | 客户清单、经营计划、台账更新明细 |
| `sd.*` | 状态数据读数 | 客户计数、触发口径、覆盖度 |
### 6.2 四个工单共用的动态位置(每个工单头部都有)
| HTML 位置 | 动态数据 | 绑定地址 |
|---|---|---|
| 卡头「收件人」 | 负责人 | `meta.task.owner` |
| 卡头「关联任务」 | 任务编号 | `meta.task.id` |
| 卡头「步骤」 | 当前节点 | `meta.phase` |
| 卡头「最迟交回」 | 期限 | `card.deadline` |
| 页脚「工单编号」 | 工单 ID | `card.id` |
### 6.3 执行工单 1 · 覆盖范围确认
| HTML 位置 | 动态数据 | 绑定地址 | 类型 |
|---|---|---|---|
| 【做什么】里「触发口径与覆盖范围」结论 | 本轮触发场景 | `sd.trigger_scene` | 单值 |
| 编辑闸「AI 已识别 2 个客户」 | 识别客户数 | `sd.customer_count` | 单值 |
| 【交回什么】客户清单表 | 候选客户清单 | `out.customer_list` | 行集 |
| └ 客户编号 / 名称 / 类型 / BT层级 / 状态 / 依据 / 覆盖深度 | 各列字段 | `out.customer_list.*` | 字段 |
### 6.4 验收工单 1 · 关系经营计划
| HTML 位置 | 动态数据 | 绑定地址 | 类型 |
|---|---|---|---|
| 【验收判据】清单 | 判据项 | `card.criteria[]` | 列表 |
| 【AI 产出的经营计划】表 | 计划行 | `out.plan` | 行集 |
| └ 客户 / 关键人 / 建议动作 / 优先级 / 理由 | 各列字段 | `out.plan.*` | 字段 |
| └ 优先级「高/中」颜色 | 状态着色 | `data-class-of` | 状态类 |
### 6.5 执行工单 2 · 执行回执
| HTML 位置 | 动态数据 | 绑定地址 | 类型 |
|---|---|---|---|
| 【交回什么】计划动作回执表 | 计划动作(AI 产出) | `out.plan` | 行集 |
| └ 计划动作 / 对象 | AI 产出的计划 | `out.plan.action / target` | 字段(只读) |
| └ 完成状态 / 结果摘要 / 客户反馈 / 关键人变动 | 人填回执 | `card.fields.*` | 字段(可填) |
### 6.6 验收工单 2 · 台账更新确认
| HTML 位置 | 动态数据 | 绑定地址 | 类型 |
|---|---|---|---|
| 【验收判据】清单 | 判据项 | `card.criteria[]` | 列表 |
| 【拟更新的台账】表 | 更新明细行 | `out.ledger_update` | 行集 |
| └ 台账 / 字段 / 更新前 / 更新后 | 各列字段 | `out.ledger_update.*` | 字段 |
---
(完)E04 一个活动,七个步骤,四张工单:**执行工单让人补内容、验收工单让人拍结论**——AI 做得出的算出来给人审,AI 做不到的派出去让人干。数据由服务注水,工单只是模板。
@@ -0,0 +1,148 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>验收工单 1 · 关系经营计划审批 · E04 关系覆盖与关键人经营</title>
<style>
:root{
--ink:#1f2329; --ink-2:#41464e; --ink-3:#646a73; --ink-4:#8f959e;
--line:#dee0e3; --line-soft:#e8eaed; --soft:#f8f9fb;
--brand:#3370ff; --brand-deep:#245bdb; --brand-soft:#e1eaff; --brand-wash:#f0f4ff;
--ledger:#b23a2e; --ledger-soft:#f7e4e0; --ledger-line:#ecc5bd;
--ok:#278717; --ok-soft:#e8f8e4; --danger:#d83931; --danger-soft:#feeae9;
--mono:"SF Mono",Menlo,Consolas,monospace;
}
*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;background:#eef1f6;color:var(--ink);font-size:14px;line-height:1.7;-webkit-font-smoothing:antialiased}
.page{margin:0;padding:0}
.card{background:#fff;overflow:hidden;border:0;border-radius:0;box-shadow:none}
.card-head{display:flex;align-items:center;gap:14px;padding:18px 22px;border-bottom:2px solid var(--ink);background:linear-gradient(120deg,#fdf3f1 0%,#fff 55%,#fbf2f0 100%)}
.badge{flex:none;width:44px;height:44px;border-radius:10px;display:grid;place-items:center;background:var(--ledger);color:#fff;font-weight:800;font-size:13px;box-shadow:0 6px 16px rgba(178,58,46,.25)}
.tit{flex:1;min-width:0}
.tit .kick{font-size:11px;letter-spacing:.08em;color:var(--ink-4);font-weight:700}
.tit h1{margin:2px 0 0;font-size:19px;font-weight:800;line-height:1.3}
.tit .sub{font-size:12px;color:var(--ink-3);margin-top:3px}
.side{display:flex;flex-direction:column;align-items:flex-end;gap:6px;flex:none}
.tag{font-size:11px;font-weight:800;padding:2px 10px;border-radius:999px;color:var(--ledger);background:var(--ledger-soft);border:1px solid var(--ledger-line)}
.step{font-size:12px;color:var(--ink-3)}
.deadline{font-size:12px;color:var(--ink-3)}
.deadline b{color:var(--danger)}
.card-bd{padding:20px 22px}
.zone{font-size:11px;font-weight:800;letter-spacing:.12em;color:var(--ink-4);margin:0 0 8px}
.zone b{color:var(--ink-3)}
.note{border:1px solid var(--line);border-left:3px solid var(--ledger);border-radius:8px;background:var(--soft);padding:14px 16px;margin-bottom:16px}
.note p{margin:0;font-size:13px;color:var(--ink-2)}
.note b{color:var(--ink)}
.criteria{border:1px solid var(--ledger-line);border-radius:10px;background:var(--ledger-soft);padding:13px 16px;margin-bottom:18px}
.criteria .c-title{font-size:11px;font-weight:800;letter-spacing:.08em;color:var(--ledger);margin-bottom:7px}
.criteria ul{margin:0;padding-left:18px;font-size:12.5px;color:var(--ink-2)}
.criteria li{margin:4px 0}
.criteria b{color:var(--ink)}
.tbl-wrap{border:1px solid var(--line-soft);border-radius:10px;overflow:hidden}
table{width:100%;border-collapse:collapse;font-size:13px}
th{text-align:left;background:var(--soft);font-size:11px;letter-spacing:.05em;font-weight:800;color:var(--ink-3);padding:9px 12px;border-bottom:1px solid var(--line)}
td{padding:11px 12px;border-bottom:1px solid var(--line-soft);vertical-align:top}
tr:last-child td{border-bottom:0}
.num{font-family:var(--mono);color:var(--ink-4);white-space:nowrap}
.cust{font-weight:700}
.prio{font-family:var(--mono);font-weight:800}
.prio.hi{color:var(--danger)}
.prio.mid{color:var(--ink-2)}
.reason{font-size:12.5px;color:var(--ink-2)}
.flow{margin-top:16px;padding:9px 12px;border-radius:8px;background:var(--soft);border:1px dashed var(--line);font-size:12px;color:var(--ink-3)}
.flow b{color:var(--ink)}
.card-foot{padding:13px 22px;border-top:1px solid var(--line-soft);font-size:11.5px;color:var(--ink-4);display:flex;justify-content:space-between;flex-wrap:wrap;gap:8px}
@media(max-width:600px){.card-head{flex-wrap:wrap}.side{align-items:flex-start}}
</style>
</head>
<body>
<div class="page">
<div class="card">
<header class="card-head">
<div class="badge">验收</div>
<div class="tit">
<div class="kick">E04 关系覆盖与关键人经营 · 验收工单 1/2</div>
<h1>关系经营计划审批</h1>
<div class="sub">收件人:<span data-slot="meta.task.owner">AM Lead(负责人)</span> · 关联任务:<span data-slot="meta.task.id">TASK-xxx</span></div>
</div>
<div class="side">
<span class="tag">验收工单</span>
<span class="step" data-slot="meta.phase">步骤 ②③④ 产出</span>
<span class="deadline">最迟交回:<b data-slot="card.deadline">1 个工作日</b></span>
</div>
</header>
<div class="card-bd">
<p class="zone"><b>【AI 结论说明】</b>—— 结论是怎么算出来的</p>
<div class="note">
<p><b>AI 已完成的计算</b>:读取 L-02 客户画像、决策链地图、关系覆盖度,读取 L-08 联系人角色 / 影响力 / 亲密度;对照决策链识别空白节点,按「影响力 × 亲密度缺口」排序,得出本轮<b>关系经营计划</b>。</p>
</div>
<p class="zone"><b>【验收判据】</b>—— 你据此判断「通过 / 驳回」</p>
<div class="criteria">
<div class="c-title">判断这份计划是否合理,请逐项核对</div>
<ul>
<li><b>关键人覆盖是否完整</b>:该经营的决策链关键人(BT-01 / BT-02 / BT-03)有没有漏掉;</li>
<li><b>优先级排序是否合理</b>:是否符合「影响力 × 亲密度缺口」的排序逻辑,有没有高优的客户被排低了;</li>
<li><b>动作是否可执行</b>:建议动作是否明确、有没有时间点、可不可落地。</li>
</ul>
</div>
<p class="zone"><b>【AI 产出的经营计划】</b>—— 只读展示</p>
<div class="tbl-wrap">
<table>
<thead><tr><th style="width:40px">#</th><th style="width:150px" data-h="客户">客户</th><th style="width:130px" data-h="关键人">关键人</th><th style="width:150px" data-h="建议动作">建议动作</th><th style="width:70px" data-h="优先级">优先级</th><th data-h="理由">AI 给出的理由</th></tr></thead>
<tbody data-rows="out.plan">
<tr>
<td class="num">1</td>
<td data-field="customer" class="cust">AvtoKom 汽车电子</td>
<td data-field="key_person">产品 VP</td>
<td data-field="action">拜访 + 方案交流</td>
<td data-field="priority" class="prio hi">高</td>
<td data-field="reason" class="reason">BT-03 高层为空白节点,且 T04 攻坚联动,需优先建立直接关系</td>
</tr>
<tr>
<td class="num">2</td>
<td class="cust">AvtoKom 汽车电子</td>
<td>质量负责人</td>
<td>技术交流</td>
<td class="prio hi">高</td>
<td class="reason">质量节点空白,BT-02 技术层需加深</td>
</tr>
<tr>
<td class="num">3</td>
<td class="cust">AvtoKom 汽车电子</td>
<td>研发负责人</td>
<td>价值传递(样品)</td>
<td class="prio mid">中</td>
<td class="reason">研发关系尚浅,递样品推进测试</td>
</tr>
<tr>
<td class="num">4</td>
<td class="cust">Boreas 工业控制</td>
<td>采购经理</td>
<td>维持性经营</td>
<td class="prio mid">中</td>
<td class="reason">关系稳定,覆盖度 82 / 100,维持即可</td>
</tr>
</tbody>
</table>
</div>
<div class="flow"><b>审批:</b>本工单只承载内容;「通过 / 驳回」请在对话区的【验收卡】中进行。</div>
</div>
<footer class="card-foot">
<span>E04 关系覆盖与关键人经营 · 验收工单 1/2 · 关系经营计划审批</span>
<span style="font-family:'SF Mono',Menlo,Consolas,monospace">工单类型:验收 · <span data-slot="card.id">WO-E04-02</span></span>
</footer>
</div>
</div>
</body>
</html>
@@ -0,0 +1,150 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>验收工单 2 · 关系台账更新确认 · E04 关系覆盖与关键人经营</title>
<style>
:root{
--ink:#1f2329; --ink-2:#41464e; --ink-3:#646a73; --ink-4:#8f959e;
--line:#dee0e3; --line-soft:#e8eaed; --soft:#f8f9fb;
--brand:#3370ff; --brand-deep:#245bdb; --brand-soft:#e1eaff; --brand-wash:#f0f4ff;
--ledger:#b23a2e; --ledger-soft:#f7e4e0; --ledger-line:#ecc5bd;
--ok:#278717; --ok-soft:#e8f8e4; --danger:#d83931; --danger-soft:#feeae9;
--mono:"SF Mono",Menlo,Consolas,monospace;
}
*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;background:#eef1f6;color:var(--ink);font-size:14px;line-height:1.7;-webkit-font-smoothing:antialiased}
.page{margin:0;padding:0}
.card{background:#fff;overflow:hidden;border:0;border-radius:0;box-shadow:none}
.card-head{display:flex;align-items:center;gap:14px;padding:18px 22px;border-bottom:2px solid var(--ink);background:linear-gradient(120deg,#fdf3f1 0%,#fff 55%,#fbf2f0 100%)}
.badge{flex:none;width:44px;height:44px;border-radius:10px;display:grid;place-items:center;background:var(--ledger);color:#fff;font-weight:800;font-size:13px;box-shadow:0 6px 16px rgba(178,58,46,.25)}
.tit{flex:1;min-width:0}
.tit .kick{font-size:11px;letter-spacing:.08em;color:var(--ink-4);font-weight:700}
.tit h1{margin:2px 0 0;font-size:19px;font-weight:800;line-height:1.3}
.tit .sub{font-size:12px;color:var(--ink-3);margin-top:3px}
.side{display:flex;flex-direction:column;align-items:flex-end;gap:6px;flex:none}
.tag{font-size:11px;font-weight:800;padding:2px 10px;border-radius:999px;color:var(--ledger);background:var(--ledger-soft);border:1px solid var(--ledger-line)}
.step{font-size:12px;color:var(--ink-3)}
.deadline{font-size:12px;color:var(--ink-3)}
.deadline b{color:var(--danger)}
.card-bd{padding:20px 22px}
.zone{font-size:11px;font-weight:800;letter-spacing:.12em;color:var(--ink-4);margin:0 0 8px}
.zone b{color:var(--ink-3)}
.note{border:1px solid var(--line);border-left:3px solid var(--ledger);border-radius:8px;background:var(--soft);padding:14px 16px;margin-bottom:16px}
.note p{margin:0;font-size:13px;color:var(--ink-2)}
.note b{color:var(--ink)}
.criteria{border:1px solid var(--ledger-line);border-radius:10px;background:var(--ledger-soft);padding:13px 16px;margin-bottom:18px}
.criteria .c-title{font-size:11px;font-weight:800;letter-spacing:.08em;color:var(--ledger);margin-bottom:7px}
.criteria ul{margin:0;padding-left:18px;font-size:12.5px;color:var(--ink-2)}
.criteria li{margin:4px 0}
.criteria b{color:var(--ink)}
.tbl-wrap{border:1px solid var(--line-soft);border-radius:10px;overflow:hidden}
table{width:100%;border-collapse:collapse;font-size:13px}
th{text-align:left;background:var(--soft);font-size:11px;letter-spacing:.05em;font-weight:800;color:var(--ink-3);padding:9px 12px;border-bottom:1px solid var(--line)}
td{padding:11px 12px;border-bottom:1px solid var(--line-soft);vertical-align:top}
tr:last-child td{border-bottom:0}
.num{font-family:var(--mono);color:var(--ink-4);white-space:nowrap}
.ledger{font-family:var(--mono);font-weight:700;white-space:nowrap}
.fld{font-family:var(--mono);font-size:12px;color:var(--ink-2)}
.before{color:var(--ink-4);text-decoration:line-through}
.after{font-weight:800;color:var(--ok)}
.flow{margin-top:16px;padding:9px 12px;border-radius:8px;background:var(--soft);border:1px dashed var(--line);font-size:12px;color:var(--ink-3)}
.flow b{color:var(--ink)}
.card-foot{padding:13px 22px;border-top:1px solid var(--line-soft);font-size:11.5px;color:var(--ink-4);display:flex;justify-content:space-between;flex-wrap:wrap;gap:8px}
@media(max-width:600px){.card-head{flex-wrap:wrap}.side{align-items:flex-start}}
</style>
</head>
<body>
<div class="page">
<div class="card">
<header class="card-head">
<div class="badge">验收</div>
<div class="tit">
<div class="kick">E04 关系覆盖与关键人经营 · 验收工单 2/2</div>
<h1>关系台账更新确认</h1>
<div class="sub">收件人:<span data-slot="meta.task.owner">AM Lead(负责人)</span> · 关联任务:<span data-slot="meta.task.id">TASK-xxx</span></div>
</div>
<div class="side">
<span class="tag">验收工单</span>
<span class="step" data-slot="meta.phase">步骤 ⑥⑦ 更新台账</span>
<span class="deadline">最迟交回:<b data-slot="card.deadline">1 个工作日</b></span>
</div>
</header>
<div class="card-bd">
<p class="zone"><b>【AI 结论说明】</b>—— AI 收到回执后做了哪些更新</p>
<div class="note">
<p><b>AI 已完成</b>:收到执行回执后,重算关系覆盖度(coverage_score)、更新决策链地图(decision_chain)、更新 L-08 联系人档案(角色 / 影响力 / 亲密度 / 关键人标记)、追加互动时间线。</p>
</div>
<p class="zone"><b>【验收判据】</b>—— 你据此判断「通过 / 驳回」</p>
<div class="criteria">
<div class="c-title">判断这次台账更新是否无误,请逐项核对</div>
<ul>
<li><b>更新是否有依据</b>:每条更新是否都能在「执行回执」里找到对应事实(如 coverage_score 上升对应哪几次拜访);</li>
<li><b>数值是否合理</b>:coverage_score、亲密度等数值变化幅度与回执是否吻合;</li>
<li><b>有无漏更或误更</b>:该更新的字段都更新了、不该动的没动。</li>
</ul>
</div>
<p class="zone"><b>【拟更新的台账】</b>—— 只读展示</p>
<div class="tbl-wrap">
<table>
<thead><tr><th style="width:36px">#</th><th style="width:150px" data-h="台账">台账</th><th style="width:200px" data-h="字段">字段</th><th style="width:140px" data-h="更新前">更新前</th><th data-h="更新后">更新后</th></tr></thead>
<tbody data-rows="out.ledger_update">
<tr>
<td class="num">1</td>
<td data-field="ledger" class="ledger">L-02 客户主台账</td>
<td data-field="field" class="fld">coverage_score</td>
<td data-field="before" class="before">61 / 100</td>
<td data-field="after" class="after">78 / 100</td>
</tr>
<tr>
<td class="num">2</td>
<td class="ledger">L-02 客户主台账</td>
<td class="fld">decision_chain(产品 VP)</td>
<td class="before">空白节点</td>
<td class="after">已建立直接关系</td>
</tr>
<tr>
<td class="num">3</td>
<td class="ledger">L-02 客户主台账</td>
<td class="fld">interaction_timeline</td>
<td class="before">—</td>
<td class="after">追加 3 次互动记录</td>
</tr>
<tr>
<td class="num">4</td>
<td class="ledger">L-08 联系人台账</td>
<td class="fld">质量负责人 · 亲密度</td>
<td class="before">0 / 5</td>
<td class="after">2 / 5</td>
</tr>
<tr>
<td class="num">5</td>
<td class="ledger">L-08 联系人台账</td>
<td class="fld">质量负责人 · 关键人标记</td>
<td class="before">否</td>
<td class="after">是</td>
</tr>
</tbody>
</table>
</div>
<div class="flow"><b>审批:</b>本工单只承载内容;「通过入库 / 驳回」请在对话区的【验收卡】中进行。</div>
</div>
<footer class="card-foot">
<span>E04 关系覆盖与关键人经营 · 验收工单 2/2 · 关系台账更新确认</span>
<span style="font-family:'SF Mono',Menlo,Consolas,monospace">工单类型:验收 · <span data-slot="card.id">WO-E04-04</span></span>
</footer>
</div>
</div>
</body>
</html>