Archived
E04 修到零被拒线,harness 补七刀:跨进程租约与广播桥、原子写、引用墙、对话区按序号排
活动侧(E04 2.1.0 → 2.1.9,I01 1.2.2): - 覆盖闭合成为机检:基座新增 distinct 读数,「计划盖住的客户数 = 候选行数」钉进 S3 收步 / S4 哨兵 / 放行 L2;人加的候选客户不再被整单无视 - 「关键人待识别」占位句式全链退役:查无联系人先发数据录入卡收人;契约新增 refersTo, 计划/回执的 contact_code 只许引用真实存在的联系人(安装期核引用目标) - 台账更新确认摆全落库面:客户档案/联系人档案两张落库预览(touched: 数据源, 正式现值 + 草稿叠加),可补改、可加行(自增主键由基座续号);姓名升必填 - 更新明细:update_key 位置键 + 「同一处只留一条」L2;依据写人话不带机器键; 标题旁不摆单号;判据与文案不夹字段名;行标识去掉单标识那一段 - 回执骨架 = 计划行数钉进 S3 收步与 S4 哨兵;重做分支不许删计划凑数 - 阶段刻度对齐文档 7 步;起单样例预填满 基座侧: - 两个后端连同一个库:task-claim 跨进程租约(迁移 0030)+ Postgres LISTEN/NOTIFY 广播桥;对话区按任务内记忆序号排,不按墙上时钟;并卡「刚说过话」按记忆序列判紧邻 - 多行 write 整批先验后写(dryRun),被拒 = 一行都没落 - 决策卡意见与本单草稿字面比对,归属以观察进轨迹(note-anchors) - 括号栈补「补闭括号」两形(少一个 } / 行对象没关直接跟下一行) - 件上加行:空着的自增主键直进续号,不从别的行借号;未落下的行点名回给前端 - 人答复落库那一刻就把 runtime 翻 running(task.wake),两块同帧变脸 - 试跑单可落真库(land_master,迁移 0031,默认开);数据域按活动分组; JSON 列不再是 [object Object];按钮键感 + 在办进度条 + 防抖 - 报价链 A1–A7 从系统卸载(只卸不删源码),种子只装 E04/I01 契约变更(api-report 已刷新):FieldDeclaration.distinct / refersTo, objectDeclaration.file,landMaster,unkeyed,assetFiles,ledgerByActivityRoute。 1700 测 / typecheck / lint / depcruise / api:check 绿。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EEJX8Z7CHejvwmDQyPQuBX
This commit is contained in:
@@ -171,6 +171,11 @@ html.editable .proto-root .jc-tbl-wrap:has(table.on) + .jc-addrow {
|
||||
.proto-root .jc-tag.v-changed { color: var(--danger); }
|
||||
.proto-root .jc-tag.v-unchanged::after { content: "无变动"; }
|
||||
.proto-root .jc-tag.v-unchanged { color: var(--ink-4); }
|
||||
/* 关键人标记(boolean 列):值是 true/false,人读字由这里出 —— 与其余枚举徽同一机制 */
|
||||
.proto-root .jc-tag.v-true::after { content: "是"; }
|
||||
.proto-root .jc-tag.v-true { color: var(--ok); }
|
||||
.proto-root .jc-tag.v-false::after { content: "否"; }
|
||||
.proto-root .jc-tag.v-false { color: var(--ink-4); }
|
||||
/*
|
||||
* **覆盖深度同一坑的另一半**(2026-08-21 用户:「编辑的下拉框是中文,显示是英文」)——
|
||||
* depth 本身不含中文(说明书写死 ASCII deep/standard/light,不撞 classToken 那道墙),
|
||||
@@ -219,7 +224,8 @@ const doc = (input: {
|
||||
tag: string;
|
||||
kicker: string;
|
||||
title: string;
|
||||
titleRef: string;
|
||||
/** 标题旁的单号 —— 2026-08-24 用户定:不摆(页脚已有),留作可选 */
|
||||
titleRef?: string;
|
||||
/** 目标件 side 第二行:静态步骤文案(哪份工单盖哪几步是写清单时定死的) */
|
||||
step: string;
|
||||
state: string;
|
||||
@@ -233,7 +239,7 @@ const doc = (input: {
|
||||
<div class="jc-rp-badge">${input.badge}</div>
|
||||
<div class="jc-rp-tit">
|
||||
<em>${input.kicker}</em>
|
||||
<h3>${input.title} <span data-slot="${input.titleRef}"></span></h3>
|
||||
<h3>${input.title}${input.titleRef === undefined ? '' : ` <span data-slot="${input.titleRef}"></span>`}</h3>
|
||||
<div class="jc-rp-sub">收件人:<span data-slot="case:owner"></span> · 关联任务:<span class="jc-rp-taskid" data-slot="case:taskId" data-blank></span></div>
|
||||
</div>
|
||||
<div class="jc-rp-side">
|
||||
@@ -314,7 +320,6 @@ export const COVERAGE_SCOPE = doc({
|
||||
tag: '执行工单',
|
||||
kicker: 'E04 关系覆盖与关键人经营 · 执行工单 1/2',
|
||||
title: '覆盖范围确认',
|
||||
titleRef: 'round_ref',
|
||||
step: '步骤 ① 启动与覆盖范围确认',
|
||||
state: `<span class="jc-rp-wait">共 <b data-slot="${D}_candidate_rows"></b> 家候选</span>`,
|
||||
body:
|
||||
@@ -387,7 +392,6 @@ export const COVERAGE_PLAN = doc({
|
||||
tag: '验收工单',
|
||||
kicker: 'E04 关系覆盖与关键人经营 · 验收工单 1/2',
|
||||
title: '关系经营计划审批',
|
||||
titleRef: 'round_ref',
|
||||
step: '步骤 ②③④ 产出',
|
||||
state: `<span class="jc-rp-wait">共 <b data-slot="${D}_plan_rows"></b> 位关键人 · 按影响力 × 亲密度缺口排序</span>`,
|
||||
body:
|
||||
@@ -461,7 +465,6 @@ export const COVERAGE_RECEIPT = doc({
|
||||
tag: '执行工单',
|
||||
kicker: 'E04 关系覆盖与关键人经营 · 执行工单 2/2',
|
||||
title: '经营计划执行回执',
|
||||
titleRef: 'round_ref',
|
||||
step: '步骤 ⑤⑥ 执行经营动作',
|
||||
state: `<span class="jc-rp-wait warn">待回执 <b data-slot="${D}_receipt_missing"></b> / <b data-slot="${D}_receipt_rows"></b> 项</span>`,
|
||||
body:
|
||||
@@ -517,6 +520,84 @@ const LEDGER_UPDATE_TABLE = `<div class="jc-tbl-wrap"><table class="jc-tbl-in">
|
||||
</tbody>
|
||||
</table></div>`;
|
||||
|
||||
|
||||
/*
|
||||
* ==================== 落库预览两张表(2026-08-24 用户定)====================
|
||||
* 「没有把要更新的台账展示全」:更新明细是模型写的**摘要**,而真正落库的是
|
||||
* customer.profile / customer.contact 的整行 —— 签字的人要看的是**将要写进正式表的
|
||||
* 东西本身**,不是转述。两张表直接摆本单将落的行,且**可编辑**:AI 分析填不出的
|
||||
* 字段(行业/区域)人在这儿补,AI 没建上的联系人人在这儿加一行(联系人编码留空,
|
||||
* 由系统按「客户编码-两位序号」续号 —— 自增列不问人,件上同规)。
|
||||
*/
|
||||
const PROFILE_LANDING_TABLE = `<div class="jc-tbl-wrap"><table class="jc-tbl-in">
|
||||
<thead><tr>
|
||||
<th style="width:36px;min-width:36px"></th>
|
||||
<th style="min-width:100px">客户编号</th>
|
||||
<th class="req" style="min-width:150px">客户名称</th>
|
||||
<th class="sug" style="min-width:110px">客户类型</th>
|
||||
<th class="sug" style="min-width:120px">所属行业</th>
|
||||
<th class="sug" style="min-width:110px">区域</th>
|
||||
<th style="width:90px;min-width:90px">覆盖度</th>
|
||||
</tr></thead>
|
||||
<tbody data-rows="touched:customer.profile" data-edit="customer.profile"><tr>
|
||||
<td class="jc-rn"></td>
|
||||
<td data-h="客户编号"><span class="jc-vcell mono" data-slot="customer_code" data-col="customer_code" data-blank></span></td>
|
||||
<td class="req" data-h="客户名称"><span class="jc-vcell cust" data-slot="name" data-col="name" data-blank></span></td>
|
||||
<td class="sug" data-h="客户类型"><span class="jc-vcell" data-slot="cust_type" data-col="cust_type" data-blank></span></td>
|
||||
<td class="sug" data-h="所属行业"><span class="jc-vcell" data-slot="industry" data-col="industry" data-blank></span></td>
|
||||
<td class="sug" data-h="区域"><span class="jc-vcell" data-slot="region" data-col="region" data-blank></span></td>
|
||||
<td class="dimempty" data-h="覆盖度"><span class="jc-vcell mono" data-slot="coverage_score" data-blank></span></td>
|
||||
</tr></tbody>
|
||||
</table></div>`;
|
||||
|
||||
const CONTACT_LANDING_TABLE = `<div class="jc-tbl-wrap"><table class="jc-tbl-in">
|
||||
<thead><tr>
|
||||
<th style="width:36px;min-width:36px"></th>
|
||||
<th style="min-width:96px">客户编号</th>
|
||||
<th style="min-width:104px">联系人编码</th>
|
||||
<th class="req" style="min-width:120px">姓名</th>
|
||||
<th class="sug" style="min-width:100px">职务</th>
|
||||
<th class="sug" style="width:150px;min-width:150px">决策链节点</th>
|
||||
<th class="req" style="width:96px;min-width:96px">影响力</th>
|
||||
<th class="req" style="width:96px;min-width:96px">亲密度</th>
|
||||
<th class="req" style="width:96px;min-width:96px">关键人</th>
|
||||
</tr></thead>
|
||||
<tbody data-rows="touched:customer.contact" data-edit="customer.contact"><tr>
|
||||
<td class="jc-rn"><button type="button" class="jc-rowdel" data-edit-del="customer.contact" title="撤掉这一行">×</button></td>
|
||||
<td data-h="客户编号"><span class="jc-vcell mono" data-slot="customer_code" data-col="customer_code" data-blank></span></td>
|
||||
<td class="dimempty" data-h="联系人编码"><span class="jc-vcell mono" data-slot="contact_code" data-col="contact_code" data-blank></span></td>
|
||||
<td class="req" data-h="姓名"><span class="jc-vcell cust" data-slot="name" data-col="name" data-blank></span></td>
|
||||
<td class="sug" data-h="职务"><span class="jc-vcell" data-slot="title" data-col="title" data-blank></span></td>
|
||||
<td class="sug" data-h="决策链节点">
|
||||
<select class="jc-cell" data-col="decision_node">
|
||||
<option value=""></option>
|
||||
<option value="bt-01">BT-01 · 采购/供应链</option>
|
||||
<option value="bt-02">BT-02 · 技术</option>
|
||||
<option value="bt-03">BT-03 · 高层</option>
|
||||
</select>
|
||||
<span class="jc-tag" data-class-of="decision_node"></span>
|
||||
</td>
|
||||
<td class="req" data-h="影响力">
|
||||
<select class="jc-cell" data-col="influence" required>
|
||||
<option value=""></option>
|
||||
<option value="high">高</option>
|
||||
<option value="medium">中</option>
|
||||
<option value="low">低</option>
|
||||
</select>
|
||||
<span class="jc-tag" data-class-of="influence"></span>
|
||||
</td>
|
||||
<td class="req" data-h="亲密度"><span class="jc-vcell mono" data-slot="relationship" data-col="relationship" data-blank></span></td>
|
||||
<td class="req" data-h="关键人">
|
||||
<select class="jc-cell" data-col="key_person" required>
|
||||
<option value=""></option>
|
||||
<option value="true">是</option>
|
||||
<option value="false">否</option>
|
||||
</select>
|
||||
<span class="jc-tag" data-class-of="key_person"></span>
|
||||
</td>
|
||||
</tr></tbody>
|
||||
</table></div>`;
|
||||
|
||||
/*
|
||||
* 「字段」格里多一行「依据」、「台账」格里多一行编码(有意偏离目标件):三条 L4 判据
|
||||
* 让签字的人核「有没有依据 / 有没有张冠李戴」,而 evidence_ref / customer_code 从前
|
||||
@@ -528,24 +609,57 @@ export const COVERAGE_LEDGER_UPDATE = doc({
|
||||
tag: '验收工单',
|
||||
kicker: 'E04 关系覆盖与关键人经营 · 验收工单 2/2',
|
||||
title: '关系台账更新确认',
|
||||
titleRef: 'round_ref',
|
||||
step: '步骤 ⑥⑦ 更新台账',
|
||||
state: `<span class="jc-rp-wait">共 <b data-slot="${D}_ledger_update_rows"></b> 项更新</span>`,
|
||||
body:
|
||||
part('AI 结论说明', 'AI 收到回执后做了哪些更新') +
|
||||
`<div class="jc-derive">
|
||||
<p><b>AI 已完成</b>:收到执行回执后,重算关系覆盖度(coverage_score)、更新决策链地图(decision_chain)、
|
||||
<p><b>AI 已完成</b>:收到执行回执后,重算关系覆盖度、更新决策链地图、
|
||||
更新 L-08 联系人档案(角色 / 影响力 / 亲密度 / 关键人标记)、追加互动时间线。
|
||||
本轮覆盖结论:<span data-slot="summary" data-blank></span></p>
|
||||
</div>` +
|
||||
part('验收判据', '你据此判断「通过 / 驳回」') +
|
||||
criteria('判断这次台账更新是否无误,请逐项核对', [
|
||||
'<b>更新是否有依据</b>:每条更新是否都能在「执行回执」里找到对应事实(如 coverage_score 上升对应哪几次拜访);',
|
||||
'<b>数值是否合理</b>:coverage_score、亲密度等数值变化幅度与回执是否吻合;',
|
||||
'<b>有无漏更或误更</b>:该更新的字段都更新了、不该动的没动。',
|
||||
'<b>更新是否有依据</b>:每条更新是否都能在「执行回执」里找到对应事实(如关系覆盖度上升对应哪几次拜访);',
|
||||
'<b>数值是否合理</b>:关系覆盖度、亲密度等数值变化幅度与回执是否吻合;',
|
||||
'<b>有无漏更或误更</b>:对照下方「将写入的客户档案 / 联系人档案」两张落库预览 —— 该更新的都在、不该动的没动;缺的字段、漏建的联系人可直接在表上补。',
|
||||
]) +
|
||||
part('拟更新的台账', '只读展示') +
|
||||
part('更新明细', 'AI 的更新摘要,逐条带依据') +
|
||||
LEDGER_UPDATE_TABLE +
|
||||
flow('<b>审批:</b>本工单只承载内容;「通过入库 / 驳回」请在对话区的【验收卡】中进行。'),
|
||||
part('将写入的客户档案', '落库预览 · 字段可就地补改') +
|
||||
`<div class="jc-gapbar" data-class-of="customer_profile_missing">
|
||||
<span><b>客户档案还差 <span data-slot="customer_profile_missing"></span> 行必填没齐</b>
|
||||
—— <span data-slot="customer_profile_missing_keys"></span>。补齐了这一单才放行得了。</span>
|
||||
</div>` +
|
||||
editGate(
|
||||
'customer.profile',
|
||||
`<b>本轮将写入 <span data-slot="customer_profile_rows"></span> 行客户档案</b>,点「编辑」补改字段`,
|
||||
) +
|
||||
`<div class="jc-editbar">
|
||||
<span>这就是签字后要进正式表的行。<b>客户名称</b>必填;<b>客户类型 / 行业 / 区域</b>是建议档
|
||||
—— AI 从来件里推得出的已经填上,推不出的橘胶囊留给你。覆盖度是算出来的数,改不了。
|
||||
改动只落任务草稿层,<b>保存不等于放行</b>。</span>
|
||||
</div>` +
|
||||
PROFILE_LANDING_TABLE +
|
||||
part('将写入的联系人档案', '落库预览 · 可补改,也可加行') +
|
||||
`<div class="jc-gapbar" data-class-of="customer_contact_missing">
|
||||
<span><b>联系人档案还差 <span data-slot="customer_contact_missing"></span> 行必填没齐</b>
|
||||
—— <span data-slot="customer_contact_missing_keys"></span>。补齐了这一单才放行得了。</span>
|
||||
</div>` +
|
||||
editGate(
|
||||
'customer.contact',
|
||||
`<b>本轮将写入 <span data-slot="customer_contact_rows"></span> 行联系人档案</b>,点「编辑」补改或加行`,
|
||||
) +
|
||||
`<div class="jc-editbar">
|
||||
<span><b>姓名 / 影响力 / 亲密度 / 关键人</b>是必填;执行中结识了新的关键人而 AI 没建上档的,
|
||||
在这儿<b>加一行</b>——联系人编码留空,由系统按「客户编码-两位序号」续号,不用你编。
|
||||
改动只落任务草稿层,<b>保存不等于放行</b>。</span>
|
||||
</div>` +
|
||||
CONTACT_LANDING_TABLE +
|
||||
`<div class="jc-addrow">
|
||||
<button type="button" class="jc-egbtn ghost" data-edit-add="customer.contact">+ 加一行(补录联系人)</button>
|
||||
<em>新加行填客户编号与姓名(必填);联系人编码留空由系统续号。</em>
|
||||
</div>` +
|
||||
flow('<b>审批:</b>本工单只承载内容;「通过入库 / 驳回」请在对话区的【验收卡】中进行。上面三张表就是签字后落库的全部内容。'),
|
||||
foot: sign('E04 关系覆盖与关键人经营 · 验收工单 2/2 · 关系台账更新确认', '工单类型:验收 → 完结'),
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user