Archived
W05 在途修订:差异评估结论审核件一个候选一张表 · 关键台账数据看板件(ledger-board)· S1 清单不再把人刚填的参数摆成缺口
活动包 `part-substitution-assessment`(case-model / manifest / report / target-style / badge / ledger-board 与两份包内测试)、 目标件「验收工单-01-差异评估结论审核」、`docs/ss02-act-05` 关键台账数据两份、端到端测试记录、e2e 脚本。 逐条口径见同批 CLAUDE.md 快照。2026-08-27 另一会话做的,一直留在工作树没入库;与同批另两条提交互相依赖。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0167qWjeyBwvfdGovd7FWbCu
This commit is contained in:
@@ -140,6 +140,14 @@ ${badgeCss('.ct', [
|
||||
|
||||
/* ==================== 执行工单(评估输入清单):徽标别名 ==================== */
|
||||
const BIND_EXEC = `
|
||||
/* 候选参数现值(只读参考块):一颗料一张,复用 .jc-tbl-wrap;块头摆料号 / 角色 / 在库状态 */
|
||||
.prefs { display: block; }
|
||||
.pref { border: 1px solid var(--line-soft); border-radius: 10px; overflow: hidden; margin-bottom: 12px; }
|
||||
.pref:last-of-type { margin-bottom: 0; }
|
||||
.pref-head { display: flex; align-items: center; gap: 10px; padding: 9px 14px; background: var(--soft); border-bottom: 1px solid var(--line); }
|
||||
.pref-head b { font-size: 13.5px; }
|
||||
.pref .jc-tbl-wrap { border: 0; border-radius: 0; }
|
||||
|
||||
/* 存在性核对的两列(角色 / 在库状态)与评估输入清单的状态列共用目标件自己的 .st 徽标基座 ——
|
||||
取值域互不重叠(found/absent/created/abandoned 与 gap/default/ok 没有一个词撞车)。
|
||||
四档配色**原样照抄目标件自己的 .st.bound / .st.ok / .st.miss / .st.def 那四条声明**,只换成 v- 版。 */
|
||||
@@ -181,14 +189,21 @@ ${badgeCss('.st.dst', [
|
||||
['match', 'MATCH', OK],
|
||||
['mismatch', 'MISMATCH', DANGER],
|
||||
['unknown', 'UNKNOWN', AMBER],
|
||||
['conditional', 'CONDITIONAL', 'color: var(--ledger); background: var(--ledger-soft); border-color: var(--ledger-line);'],
|
||||
// 目标件 2026-08-27 改版:CONDITIONAL 从题头红改成品牌蓝(.st.cond),原样照抄
|
||||
['conditional', 'CONDITIONAL', 'color: var(--brand-deep); background: var(--brand-wash); border-color: var(--brand-soft);'],
|
||||
])}
|
||||
${badgeCss('.st.rec', [
|
||||
/* 推荐程度 pill —— 目标件 .rec.yes / .rec.cond / .rec.no 三条声明原样照抄;台账是四档(备选借条件推荐那档琥珀) */
|
||||
${badgeCss('.rec', [
|
||||
['recommended', '推荐', OK],
|
||||
['conditional', '条件推荐', 'color: var(--ledger); background: var(--ledger-soft); border-color: var(--ledger-line);'],
|
||||
['alternate', '备选', AMBER],
|
||||
['conditional', '有条件推荐', 'color: var(--amber); background: var(--amber-soft); border-color: var(--amber-line);'],
|
||||
['alternate', '备选', 'color: var(--amber); background: var(--amber-soft); border-color: var(--amber-line);'],
|
||||
['not_recommended', '不推荐', DANGER],
|
||||
])}
|
||||
/* 候选块序号(目标件 .cand-idx 写死 1/2)—— 交给 CSS 计数器;块头的风险级别前缀「风险 」也在目标件里 */
|
||||
.card-bd { counter-reset: cand; }
|
||||
.cand { counter-increment: cand; }
|
||||
.cand-idx::before { content: counter(cand); }
|
||||
.cand-con .risk::before { content: "风险 "; }
|
||||
/*
|
||||
* 风险等级(原样照抄目标件 .risk.low/.mid/.hi 三条声明)——加 critical 一档:这一屏「各候选
|
||||
* 推荐等级」摘要读的是 substitution.relation.risk_level(声明了 low/medium/high/critical
|
||||
@@ -196,7 +211,7 @@ ${badgeCss('.st.rec', [
|
||||
*/
|
||||
${badgeCss('.risk', [
|
||||
['low', '低', 'color: var(--ok);'],
|
||||
['medium', '中', 'color: #8f6a12;'],
|
||||
['medium', '中', 'color: var(--amber, #8f6a12);'],
|
||||
['high', '高', 'color: var(--danger);'],
|
||||
['critical', '危急', 'color: var(--danger); font-weight: 900;'],
|
||||
])}
|
||||
@@ -246,7 +261,7 @@ ${badgeCss('.st', [
|
||||
/* 风险等级比验收 01 多一档 critical(P-11 主记录的 risk_level 声明了它,差异明细没有) */
|
||||
${badgeCss('.risk', [
|
||||
['low', '低', 'color: var(--ok);'],
|
||||
['medium', '中', 'color: #8f6a12;'],
|
||||
['medium', '中', 'color: var(--amber, #8f6a12);'],
|
||||
['high', '高', 'color: var(--danger);'],
|
||||
['critical', '危急', 'color: var(--danger); font-weight: 900;'],
|
||||
])}
|
||||
@@ -496,6 +511,25 @@ const PN_CHECK_TABLE = `<div class="jc-tbl-wrap"><table>
|
||||
</tr></tbody>
|
||||
</table></div>`;
|
||||
|
||||
/** 候选参数现值 —— **只读参考,基座从台账现读**(2026-08-27,用户三次指出「库里明明有值,清单还要填一遍」):
|
||||
* 从前「待确认」行由模型判「哪个参数原厂未披露」再写进清单 —— 参数值有没有是台账里的事实,不该由模型宣布;
|
||||
* 现在每颗料一张小表(外层按核对表逐颗复制,里层 `data-by="internal_pn"` 只列它名下的参数行),
|
||||
* 人看得见现值;未披露的由差异评估判成 UNKNOWN 并挂验证任务。 */
|
||||
const PARAM_REF = `<article class="prefs" data-rows="mine:${D}.pn_check"><section class="pref">
|
||||
<div class="pref-head"><b class="mono" data-slot="internal_pn" data-blank></b><span class="rl" data-class-of="role"></span>${badge('st', 'exists_status')}</div>
|
||||
<div class="jc-tbl-wrap"><table>
|
||||
<thead><tr><th style="width:38px">#</th><th data-h="参数名">参数名</th><th data-h="值">值</th><th data-h="单位">单位</th><th data-h="约束类型">约束类型</th><th data-h="说明">说明</th></tr></thead>
|
||||
<tbody data-rows="parts.parameter" data-by="internal_pn"><tr>
|
||||
<td class="rn"><span class="jc-rn-num"></span></td>
|
||||
<td>${ro('param_name')}</td>
|
||||
<td>${ro('param_value', 'mono')}</td>
|
||||
<td>${ro('param_unit')}</td>
|
||||
<td><span class="jc-vcell ro"><span class="ct" data-class-of="constraint_type"></span></span></td>
|
||||
<td>${ro('param_note')}</td>
|
||||
</tr></tbody>
|
||||
</table></div>
|
||||
</section></article>`;
|
||||
|
||||
const GAP_TABLE = `<div class="jc-tbl-wrap"><table id="tbl">
|
||||
<thead><tr>
|
||||
<th style="width:38px">#</th>
|
||||
@@ -530,13 +564,16 @@ export const EVAL_INPUT_LIST = doc({
|
||||
zone('做什么', '启动 4 项已绑定,其余信息在工单里补齐') +
|
||||
note([
|
||||
'<span class="done">AI 已完成</span>:系统已按启动传入的 <b>4 项</b>完成绑定——客户、客户需求(新建 P-01 · 版本 V1)、原 PN、候选 PN(数组,逐个评估)——并生成输入快照。',
|
||||
'<span class="need">需要你补齐</span>:启动时未收的信息(应用场景、BOM 位)<b>直接在下表补</b>;默认值(替代类型 / 规则版本 / 负责人期限)可确认可改。本单缺口只覆盖「<b>有而不全</b>」;「完全没有」(料号不在库)已由数据工单创建。未补齐的缺口项将按 <b>UNKNOWN</b> 进入差异评估。',
|
||||
'<span class="need">需要你补齐</span>:启动时未收的信息(应用场景、BOM 位)<b>直接在下表补</b>;默认值(替代类型 / 规则版本 / 负责人期限)可确认可改。「完全没有」(料号不在库)已由数据工单创建;每颗料的参数现值摆在「候选参数现值」里,写着「未披露」的参数将按 <b>UNKNOWN</b> 进入差异评估并挂验证任务,不用在这里补。',
|
||||
]) +
|
||||
zone('料号存在性核对', '只读参考 · 与下表「补充内容」互不冲突') +
|
||||
PN_CHECK_TABLE +
|
||||
zone('候选参数现值', '只读参考 · P-08 标准化参数集,一颗料一张,基座从台账现读;写着「未披露」的由差异评估判成 UNKNOWN 并挂验证任务') +
|
||||
PARAM_REF +
|
||||
zone('交回什么', '评估输入清单(已绑定项照实核对,缺口项补齐,*为必填)') +
|
||||
gapbar(`${D}_input_gap`, '补充内容') +
|
||||
editGate(`${D}.input_gap`, `<b>还有 <span data-slot="${D}_input_gap_missing"></span> 项待补 / 待确认</b>,点「编辑」在「补充内容」列填入 —— 已绑定那几行的「输入项/来源/绑定值」抄的是启动入参,发现记录本身有误请退回触发方重新启动,不要在这里改`) +
|
||||
// 红带说「必填格」不说「补充内容」:缺的可能是 AI 该写的输入项(2026-08-27 实测),写死列名会把人指向错的格子
|
||||
gapbar(`${D}_input_gap`, '必填格') +
|
||||
editGate(`${D}.input_gap`, `<b>还有 <span data-slot="${D}_input_gap_missing"></span> 项待补</b>,点「编辑」在「补充内容」列填入 —— 已绑定那几行的「输入项/来源/绑定值」抄的是启动入参,发现记录本身有误请退回触发方重新启动,不要在这里改`) +
|
||||
GAP_TABLE +
|
||||
addrow(`${D}.input_gap`, '+ 加一行(补充资料项)', '新行的「键」必须写(它是这一行的钥匙,写一个英文短名,如 thermal_note);「输入项」与「补充内容」也是必填;删一行 = 该输入项不适用;补不了的写「留 UNKNOWN」或「挂验证任务」') +
|
||||
flow(
|
||||
@@ -546,42 +583,59 @@ export const EVAL_INPUT_LIST = doc({
|
||||
|
||||
/* ==================== 局面 2 · 差异评估结论审核(搬自「验收工单-01」)==================== */
|
||||
|
||||
const RELATION_SUMMARY_TABLE = `<div class="tbl-wrap"><table>
|
||||
/** 候选 PN 结论汇总 —— 目标件 2026-08-27 改版:一个候选一条结论(P-11 主表草稿)。
|
||||
* 品牌不在 relation 上:用嵌套行模版 `data-by` 从 `parts.profile` 整表里挑这一颗料那一行(取值,不是算)。
|
||||
* 「差异统计(四态)」绑 difference_summary —— S3 剧本让模型按「7 项比对:4 MATCH / 1 MISMATCH / …」的形写它,
|
||||
* 模版不数四态(数出来的画面一律不做假)。 */
|
||||
const RELATION_SUMMARY_TABLE = `<div class="tbl-wrap" style="margin-bottom:20px"><table>
|
||||
<thead><tr>
|
||||
<th style="width:40px">#</th>
|
||||
<th data-h="候选料号">候选料号</th>
|
||||
<th data-h="替代类型">替代类型</th>
|
||||
<th data-h="推荐等级">推荐等级</th>
|
||||
<th data-h="风险等级">风险等级</th>
|
||||
<th data-h="推荐理由">推荐理由</th>
|
||||
<th data-h="差异摘要">差异摘要</th>
|
||||
<th data-h="候选PN">候选 PN</th>
|
||||
<th data-h="品牌">品牌</th>
|
||||
<th data-h="推荐程度">推荐程度</th>
|
||||
<th data-h="风险级别">风险级别</th>
|
||||
<th data-h="差异统计">差异统计(四态)</th>
|
||||
<th data-h="结论摘要">结论摘要</th>
|
||||
</tr></thead>
|
||||
<tbody data-rows="mine:substitution.relation"><tr>
|
||||
<td class="num"></td>
|
||||
<td class="mono" data-slot="candidate_internal_pn" data-blank></td>
|
||||
<td><span class="enumtxt" data-class-of="substitution_type"></span></td>
|
||||
<td>${badge('st rec', 'recommendation_level')}</td>
|
||||
<td class="cust mono" data-slot="candidate_internal_pn" data-blank></td>
|
||||
<td><span data-rows="parts.profile" data-by="internal_pn=candidate_internal_pn"><i data-slot="brand_name" data-blank></i></span></td>
|
||||
<td>${badge('rec', 'recommendation_level')}</td>
|
||||
<td>${badge('risk', 'risk_level')}</td>
|
||||
<td class="stat" data-slot="difference_summary" data-blank></td>
|
||||
<td class="reason" data-slot="recommendation_reason" data-blank></td>
|
||||
<td class="reason" data-slot="difference_summary" data-blank></td>
|
||||
</tr></tbody>
|
||||
</table></div>`;
|
||||
|
||||
const DIFFERENCE_ITEM_TABLE = `<div class="tbl-wrap"><table>
|
||||
<thead><tr><th style="width:40px">#</th><th data-h="参数项">参数项</th><th data-h="原PN值">原 PN 值</th><th data-h="候选PN值">候选 PN 值</th><th data-h="单位">单位</th><th data-h="约束类型">约束类型</th><th data-h="结论">结论</th><th data-h="风险等级">风险等级</th><th data-h="证据引用">证据引用</th><th data-h="AI置信度">AI 置信度</th></tr></thead>
|
||||
<tbody data-rows="mine:substitution.difference_item"><tr>
|
||||
<td class="num"></td>
|
||||
<td class="cust" data-slot="parameter_name" data-blank></td>
|
||||
<td class="mono" data-slot="original_value" data-blank></td>
|
||||
<td class="mono" data-slot="candidate_value" data-blank></td>
|
||||
<td data-slot="parameter_unit" data-blank></td>
|
||||
<td><span class="con" data-class-of="constraint_type"></span></td>
|
||||
<td>${badge('st dst', 'difference_status')}</td>
|
||||
<td>${badge('risk', 'risk_level')}</td>
|
||||
<td class="mono" data-slot="evidence_ref" data-blank></td>
|
||||
<td class="mono" data-slot="confidence" data-blank></td>
|
||||
</tr></tbody>
|
||||
</table></div>`;
|
||||
/** 差异明细 · 按候选 PN 分组 —— 目标件 2026-08-27 改版:**一个候选一张表**(用户:「存在多个替代 PN 要对比差异时看不清楚」)。
|
||||
* 外层容器 <article> 按 relation 逐个复制行模版 <section class="cand">,里层 <tbody data-by="substitution_relation_id">
|
||||
* 只列该候选名下的明细(渲染器 2026-08-27 补的嵌套 + 父键过滤)。容器标签名不得在行模版内部再出现:
|
||||
* <article> 里是 section / div / table,不撞。 */
|
||||
const CANDIDATE_SECTIONS = `<article class="cands" data-rows="mine:substitution.relation"><section class="cand">
|
||||
<div class="cand-head">
|
||||
<span class="cand-idx"></span>
|
||||
<span class="cand-name mono" data-slot="candidate_internal_pn" data-blank></span>
|
||||
<span class="cand-brand" data-rows="parts.profile" data-by="internal_pn=candidate_internal_pn"><i data-slot="brand_name" data-blank></i></span>
|
||||
<span class="cand-vs">vs 原 PN · <i data-slot="original_internal_pn" data-blank></i></span>
|
||||
<span class="cand-con">${badge('rec', 'recommendation_level')}${badge('risk', 'risk_level')}</span>
|
||||
</div>
|
||||
<div class="tbl-wrap"><table>
|
||||
<thead><tr><th style="width:40px">#</th><th data-h="参数项">参数项</th><th data-h="原PN值">原 PN 值</th><th data-h="候选PN值">候选 PN 值</th><th data-h="单位">单位</th><th data-h="约束类型">约束类型</th><th data-h="结论">结论</th><th data-h="风险等级">风险等级</th><th data-h="证据引用">证据引用</th><th data-h="AI置信度">AI 置信度</th></tr></thead>
|
||||
<tbody data-rows="mine:substitution.difference_item" data-by="substitution_relation_id"><tr>
|
||||
<td class="num"></td>
|
||||
<td class="cust" data-slot="parameter_name" data-blank></td>
|
||||
<td class="mono" data-slot="original_value" data-blank></td>
|
||||
<td class="mono" data-slot="candidate_value" data-blank></td>
|
||||
<td data-slot="parameter_unit" data-blank></td>
|
||||
<td><span class="con" data-class-of="constraint_type"></span></td>
|
||||
<td>${badge('st dst', 'difference_status')}</td>
|
||||
<td>${badge('risk', 'risk_level')}</td>
|
||||
<td class="mono" data-slot="evidence_ref" data-blank></td>
|
||||
<td class="mono" data-slot="confidence" data-blank></td>
|
||||
</tr></tbody>
|
||||
</table></div>
|
||||
</section></article>`;
|
||||
|
||||
export const DIFFERENCE_REVIEW = doc({
|
||||
css: ACC1_CSS,
|
||||
@@ -595,18 +649,18 @@ export const DIFFERENCE_REVIEW = doc({
|
||||
body:
|
||||
zone('AI 结论说明', '结论是怎么算出来的') +
|
||||
note([
|
||||
'<b>AI 已完成的计算</b>:按 GOV 评估规则(锁定版本 <b class="mono" data-slot="rule_version" data-blank></b>),对原 PN <b class="mono" data-slot="original_internal_pn" data-blank></b> 与每个候选逐项比对,产出四态结论——<b>MATCH / MISMATCH / UNKNOWN / CONDITIONAL</b>,并给出风险等级、证据引用与置信度。差异明细 = <b>P-11 差异明细子表</b>(一条参数差异一条记录);当前为 AI 草稿,<b>FAE 审核通过前不落账</b>。评估参数可能含本次数据工单创建的主数据(确认人背书;未附 datasheet 的参数项会显式标注「人工录入」)。',
|
||||
'<b>AI 已完成的计算</b>:按 GOV 评估规则(锁定版本 <b class="mono" data-slot="rule_version" data-blank></b>),以原 PN <b class="mono" data-slot="original_internal_pn" data-blank></b> 为基准,对 <b data-slot="substitution_relation_rows"></b> 个候选 PN 分别逐项比对,每项产出四态结论——<b>MATCH / MISMATCH / UNKNOWN / CONDITIONAL</b>,并给出风险等级、证据引用与置信度;再按候选汇总出下方的【候选 PN 结论汇总】(一个候选一条结论)。差异明细 = <b>P-11 差异明细子表</b>(一条参数差异一条记录,按候选分组);结论汇总 = <b>P-11 主表草稿</b>。当前均为 AI 草稿,<b>FAE 审核通过前不落账</b>。评估参数可能含本次数据工单创建的主数据(确认人背书;未附 datasheet 的参数项会显式标注「人工录入」)。',
|
||||
]) +
|
||||
criteria('判断这份差异评估结论是否可信,请逐项核对', [
|
||||
'<b>关键参数差异均有明确状态</b>:逐项结论无漏项,每个参数都有四态之一的判定;',
|
||||
'<b>汇总结论与明细一致</b>:结论表中每个候选的推荐程度 / 风险级别,与其下方差异明细表的四态分布吻合(存在 MISMATCH 硬约束或悬空 UNKNOWN 的候选不得给「推荐」);',
|
||||
'<b>关键参数差异均有明确状态</b>:每个候选的逐项结论无漏项,每个参数都有四态之一的判定;',
|
||||
'<b>UNKNOWN 项均有去向</b>:每个 UNKNOWN 都挂了验证任务或补来源动作,不允许悬空;',
|
||||
'<b>证据链完整</b>:每项结论可追溯至 P-08 / P-10 / P-06 的具体记录,或本单数据工单的创建记录(标注:人工录入);',
|
||||
'<b>硬约束项未被自动判 MATCH</b>:封装 / 工艺等硬约束未经证据支持不得判 MATCH。',
|
||||
'<b>证据链完整</b>:每项结论可追溯至 P-08 / P-10 / P-06 的具体记录,或本单数据工单的创建记录(标注:人工录入);硬约束项未经证据支持不得判 MATCH。',
|
||||
]) +
|
||||
zone('各候选推荐等级', '只读展示(P-11 主记录草稿,一个候选一条)') +
|
||||
zone('候选 PN 结论汇总', '每个候选一条结论,内容 = 对应下方明细表的汇总判定(P-11 主表草稿)') +
|
||||
RELATION_SUMMARY_TABLE +
|
||||
zone('AI 产出的差异明细', '只读展示(P-11 差异明细子表草稿 · 一条参数一条记录 difference_item_id)') +
|
||||
DIFFERENCE_ITEM_TABLE +
|
||||
zone('差异明细 · 按候选 PN 分组', '每个候选一张表,与原 PN 逐项对比(P-11 差异明细子表草稿 · 一条参数一条记录 difference_item_id)') +
|
||||
CANDIDATE_SECTIONS +
|
||||
flow(
|
||||
'<b>审批:</b>本工单只承载内容;「通过 / 驳回」请在对话区的【验收卡】中进行。审核意见与补充条件写入 P-06(验证要求 verification_requirement);<b>通过后去向:</b>进入步骤 5 · 评审放行与落账确认。',
|
||||
),
|
||||
|
||||
Reference in New Issue
Block a user