Archived
feat(w05): 差异评估结论审核的收口四格可就地改 —— 判定归规则,话归人
用户:「差异评估结论审核这个界面的收口结论下面这 4 个字段也需要可以编辑」 这四格(推荐理由 / 差异摘要 / 替代风险 / 验证要求)原本是**故意**只读的,理由写在源码里: 「让人直接改这几格,等于让他给自己没做的判断盖章」。用户改了这个口径 —— 审核人对结论 有最终发言权。原理由留在注释里备查。 **光把格子打开等于没开**:`RELATION_PROJECTION` 每跑一次就按规则把这四列重写一遍, 而人在件上按保存会触发 quiet 拍、quiet 恰恰跑 project —— 人刚写下的话当场被规则值冲掉, 那是「让你改、改完被冲掉」,比不给改更糟(基座不记「谁写的」,配方分不清一格是人改的 还是自己写的,所以只能从配方这一侧下手)。 改法:S3 换用新的 `RELATION_RECOMPUTE` —— 与 `DIFFERENCE_ITEM_RECOMPUTE` 同一手法, **只列主键 + recommendation_level**。patch 是稀疏的、DB 侧是 jsonb 浅合并,没列的列原样 留着,人改过的四格因此保得住。**推荐等级仍然重算且不容手改**:它是规则按四态分布算出来 的判据核心(件② 判据表 / 件③ 落账结论 / 出口谓词都读它),「人改四态 → 等级跟着变」 这条链不能断。分工因此是:**判定归规则,话归人**。 代价说在明处,件上那段说明已改口:改完四态,这四格不会自动跟着改口(否则刚写的话就没了) ——「四态改完,记得回头看看这四格还对不对」。界面不撒谎优先于自动。 件上:三句话走 cell(只读份 + 孪生输入),风险只读态摆徽标、编辑态换 select(枚举列不许 直显 low/medium/high),整块一个宿主一道闸,主键钥匙藏在 .rowkey 里但真挂 data-col。 .summary-box 不是表格 —— setOpen 对非表格容器把 .on 落在 data-edit 元素自身,CSS 按 .summary-box.on 写。 测:件上四格可改 + 一个宿主一道闸 + 钥匙在场;S3 重算笔四列一个都不许出现、判定仍在且 与 S2 共用同一条 when 链。四条变异各红一条(S3 退回用 RELATION_PROJECTION / 混进 difference_summary / 混进 risk_level / 判定不再重算)。pnpm gates 退出码 0(2495 测)。 包版本 2.3.0 -> 2.4.0。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LKMZDwMbyKzjw6Hembwvet
This commit is contained in:
@@ -451,7 +451,8 @@ describe('报告模版:编辑面与只读面各就各位', () => {
|
|||||||
it('每个可编辑格子的 data-col 都在对应台账对象的声明里(input-supplement 一屏四张表,四张台账对象的声明并起来看;difference-review 一张表)', () => {
|
it('每个可编辑格子的 data-col 都在对应台账对象的声明里(input-supplement 一屏四张表,四张台账对象的声明并起来看;difference-review 一张表)', () => {
|
||||||
const cases: Array<[string, Array<[string, string]>]> = [
|
const cases: Array<[string, Array<[string, string]>]> = [
|
||||||
['input-supplement', [['parts', 'profile'], ['parts', 'chip_type'], ['parts', 'type_param'], ['parts', 'parameter']]],
|
['input-supplement', [['parts', 'profile'], ['parts', 'chip_type'], ['parts', 'type_param'], ['parts', 'parameter']]],
|
||||||
['difference-review', [['substitution', 'difference_item']]],
|
/* 件② 2026-08-31 起多一张:收口四格可就地改,写向 substitution.relation */
|
||||||
|
['difference-review', [['substitution', 'difference_item'], ['substitution', 'relation']]],
|
||||||
];
|
];
|
||||||
for (const [view, objects] of cases) {
|
for (const [view, objects] of cases) {
|
||||||
const cols = new Set([...viewHtml(view).matchAll(/data-col="([^"]+)"/g)].map((m) => m[1] ?? ''));
|
const cols = new Set([...viewHtml(view).matchAll(/data-col="([^"]+)"/g)].map((m) => m[1] ?? ''));
|
||||||
@@ -744,12 +745,30 @@ describe('件② 差异评估结论审核', () => {
|
|||||||
expect(html).toContain('data-col="difference_item_id"');
|
expect(html).toContain('data-col="difference_item_id"');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('**推荐理由 / 摘要 / 风险 / 验证要求只读** —— 让人直接改摘要,等于让他给自己没做的判断盖章', () => {
|
/**
|
||||||
|
* **收口四格可就地改**(2026-08-31 用户:「差异评估结论审核这个界面的收口结论下面这 4 个
|
||||||
|
* 字段也需要可以编辑」)。此前是只读的,理由是「让人直接改,等于给自己没做的判断盖章」——
|
||||||
|
* 用户改了这个口径:审核人对结论有最终发言权。
|
||||||
|
*
|
||||||
|
* **配方那一侧必须一起改,否则等于没开**:`RELATION_PROJECTION` 每跑一次就把这四列按规则
|
||||||
|
* 重写一遍,而人在件上按保存会触发 quiet 拍、quiet 恰恰跑 project —— 人改完一保存就被冲掉。
|
||||||
|
* S3 因此换成只重算判定的 `RELATION_RECOMPUTE`(那一组断言在「S3 只重算判定」里)。
|
||||||
|
*/
|
||||||
|
it('**收口四格可就地改**:三句话走 cell(只读份 + 孪生输入)、风险走徽标 + select,整块一个宿主一道闸', () => {
|
||||||
for (const col of ['recommendation_reason', 'difference_summary', 'verification_requirement']) {
|
for (const col of ['recommendation_reason', 'difference_summary', 'verification_requirement']) {
|
||||||
expect(html).toContain(`data-slot="${col}"`);
|
expect(html, col).toContain(`data-slot="${col}"`);
|
||||||
expect(html).not.toContain(`data-col="${col}"`);
|
expect(html, col).toContain(`data-col="${col}"`);
|
||||||
}
|
}
|
||||||
expect(html).not.toContain('data-edit="substitution.relation"');
|
/* 风险是枚举:只读态摆徽标(不裸显 low/medium/high),编辑态换 select */
|
||||||
|
expect(html).toContain('class="risk-badge" data-class-of="risk_level"');
|
||||||
|
expect(html).toMatch(/<select class="jc-cell" data-col="risk_level" required>/);
|
||||||
|
/* 一个地址一个宿主(bodyOf 是单 querySelector),且必须配一道闸 —— 闸不在就打不开(Task 7 那颗按不下去的钮) */
|
||||||
|
expect((html.match(/data-edit="substitution\.relation"/g) ?? []).length).toBe(1);
|
||||||
|
expect(html).toContain('data-edit-for="substitution.relation"');
|
||||||
|
expect(html).toContain('data-edit-open="substitution.relation"');
|
||||||
|
/* 主键钥匙在场且藏起来 —— 漏了钥匙这一行凑不出主键(2026-08-02 栽过) */
|
||||||
|
expect(html).toContain('data-col="substitution_relation_id"');
|
||||||
|
expect(html).toContain('.summary-box .rowkey{display:none}');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('等级与四态用 data-class-of 上色 —— 判断留在样式表,模版不判', () => {
|
it('等级与四态用 data-class-of 上色 —— 判断留在样式表,模版不判', () => {
|
||||||
@@ -771,7 +790,9 @@ describe('件② 差异评估结论审核', () => {
|
|||||||
for (const col of [
|
for (const col of [
|
||||||
'parameter_name', 'parameter_desc', 'constraint_type',
|
'parameter_name', 'parameter_desc', 'constraint_type',
|
||||||
'original_value', 'candidate_value', 'parameter_unit',
|
'original_value', 'candidate_value', 'parameter_unit',
|
||||||
'recommendation_level', 'risk_level',
|
/* 推荐等级**仍然只读**:它是规则按四态分布算出来的判据核心,人改四态即改它,不容手改。
|
||||||
|
风险(risk_level)2026-08-31 起交给人,已从这份名单里移出 —— 见「收口四格可就地改」。 */
|
||||||
|
'recommendation_level',
|
||||||
]) {
|
]) {
|
||||||
expect(html, col).not.toContain(`data-col="${col}"`);
|
expect(html, col).not.toContain(`data-col="${col}"`);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -401,10 +401,35 @@ describe('S3 / S4 配方', () => {
|
|||||||
expect(s3Fields?.['risk_level']).toBe(s2Fields?.['risk_level']);
|
expect(s3Fields?.['risk_level']).toBe(s2Fields?.['risk_level']);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('**S2 与 S3 用的是同一份投影** —— 各写一份早晚分叉', () => {
|
/**
|
||||||
// S2 的 do 数组里 RELATION_PROJECTION 出现两次(acts[1]/acts[3],同一个引用)——
|
* **S3 的关系笔只重算判定,收口四格一个字不碰**(2026-08-31 用户:「差异评估结论审核这个
|
||||||
// 与 S3 比对随便挑一个都行,这里挑 acts[3](紧跟在差异明细之后、值是真的那一次)
|
* 界面的收口结论下面这 4 个字段也需要可以编辑」)。
|
||||||
expect(s3[1]).toBe(s2[3]);
|
*
|
||||||
|
* 此前 S2 与 S3 共用同一份 `RELATION_PROJECTION`(「各写一份早晚分叉」)。件上把四格打开
|
||||||
|
* 之后那条口径不能再照搬:那一笔每跑一次就按规则重写这四列,而人在件上按保存会触发
|
||||||
|
* quiet 拍、quiet 恰恰跑 `project` —— 人刚写下的话当场被冲掉,等于格子白开。
|
||||||
|
*
|
||||||
|
* 现在 S3 换成 `RELATION_RECOMPUTE`:只列主键 + `recommendation_level`。`patch` 是稀疏的、
|
||||||
|
* DB 侧是 jsonb 浅合并,没列的列原样留着 —— **这条断言的要害就是「没列」**,列了就等于没改。
|
||||||
|
* 而 `recommendation_level` 必须仍在(判据核心:件② 判据表 / 件③ 落账结论 / 出口谓词都读它,
|
||||||
|
* 「人改四态 → 等级跟着变」这条链不能断),且与 S2 那份是**同一个 when 链引用**(不许分叉)。
|
||||||
|
*/
|
||||||
|
it('**S3 的关系笔只重算判定** —— 收口四格(理由/摘要/风险/验证要求)一列都不许出现,否则人改完一保存就被冲掉', () => {
|
||||||
|
const relation = s3[1];
|
||||||
|
expect(relation?.kind).toBe('project');
|
||||||
|
const fieldsOf = (act: (typeof s3)[number] | undefined): Readonly<Record<string, unknown>> =>
|
||||||
|
act?.kind === 'project' ? act.fields : {};
|
||||||
|
const fields = fieldsOf(relation);
|
||||||
|
for (const col of ['recommendation_reason', 'difference_summary', 'risk_level', 'verification_requirement']) {
|
||||||
|
expect(Object.keys(fields), col).not.toContain(col);
|
||||||
|
}
|
||||||
|
/* 判定仍要重算,且与 S2 那份共用同一条 when 链 —— 两处各写一份早晚分叉 */
|
||||||
|
const s2Relation = fieldsOf(s2[3]);
|
||||||
|
expect(fields['recommendation_level']).toBeDefined();
|
||||||
|
expect(fields['recommendation_level']).toBe(s2Relation['recommendation_level']);
|
||||||
|
/* 主键带回:同 PK 覆盖,不是新开一行 */
|
||||||
|
expect(fields['substitution_relation_id']).toBeDefined();
|
||||||
|
/* 验证记录那一笔仍与 S2 同一份(它不涉及人可改的格子) */
|
||||||
expect(s3[2]).toBe(s2[4]);
|
expect(s3[2]).toBe(s2[4]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -267,6 +267,37 @@ const RELATION_PROJECTION = {
|
|||||||
},
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* **S3 专用的关系重算笔** —— 只重算「判定」,**收口四格一个字不碰**
|
||||||
|
* (2026-08-31 用户:「差异评估结论审核这个界面的收口结论下面这 4 个字段也需要可以编辑」)。
|
||||||
|
*
|
||||||
|
* 那四格(推荐理由 / 差异摘要 / 替代风险 / 验证要求)此前只读,件上打开可编辑之后,
|
||||||
|
* **光开格子等于没开**:`RELATION_PROJECTION` 每跑一次就按规则把它们重写一遍,而人在件上
|
||||||
|
* 按保存会触发 quiet 拍、quiet 恰恰跑 `project` —— 人刚写下的话当场被规则值冲掉。
|
||||||
|
* 那是「让你改、改完被冲掉」,比不给改更糟。
|
||||||
|
*
|
||||||
|
* 与 `DIFFERENCE_ITEM_RECOMPUTE` 同一手法:**只列要重算的列,一个都不多写**。
|
||||||
|
* `draftWrite` 的 `patch` 是稀疏的(只含显式给出的列),DB 侧 `patch = patch || excluded.patch`
|
||||||
|
* 是 jsonb **浅合并** —— 没列的列原样留着,人改过的四格因此保得住。
|
||||||
|
*
|
||||||
|
* **`recommendation_level` 仍然重算,而且不容手改**:它是规则按四态分布算出来的判据核心,
|
||||||
|
* 「人改四态 → 等级跟着变」这条链不能断(件② 的判据表、件③ 的落账结论、出口谓词都读它)。
|
||||||
|
* 于是这一步的分工是:**判定归规则,话归人**。
|
||||||
|
*
|
||||||
|
* 代价说在明处:人改完四态,这四格**不会**自动跟着改口(否则他刚写的话就没了)——
|
||||||
|
* 件上那段说明已如实写清「四态改完,记得回头看看这四格还对不对」。界面不撒谎优先于自动。
|
||||||
|
*/
|
||||||
|
const RELATION_RECOMPUTE = {
|
||||||
|
kind: 'project' as const,
|
||||||
|
into: 'substitution.relation',
|
||||||
|
from: { once: true as const },
|
||||||
|
fields: {
|
||||||
|
/* 主键原样带回,认的是这一行自己 —— 不是新建,是同 PK 覆盖 */
|
||||||
|
substitution_relation_id: { in: 'relationId' },
|
||||||
|
recommendation_level: RELATION_PROJECTION.fields.recommendation_level,
|
||||||
|
},
|
||||||
|
} as const;
|
||||||
|
|
||||||
/* P-06 **一单固定一条**(用户定)。本活动只写「还得去验什么」,状态一律 `not_started`:它不是实测结果,**不许虚构实测**。 */
|
/* P-06 **一单固定一条**(用户定)。本活动只写「还得去验什么」,状态一律 `not_started`:它不是实测结果,**不许虚构实测**。 */
|
||||||
const VALIDATION_PROJECTION = {
|
const VALIDATION_PROJECTION = {
|
||||||
kind: 'project' as const,
|
kind: 'project' as const,
|
||||||
@@ -742,10 +773,11 @@ export const ASSESSMENT_STEPS = [
|
|||||||
item: 'S3_review' as const,
|
item: 'S3_review' as const,
|
||||||
intent: '把逐条结论摆给人过目,他就地改四态与影响说明,改到没问题为止',
|
intent: '把逐条结论摆给人过目,他就地改四态与影响说明,改到没问题为止',
|
||||||
guide: '',
|
guide: '',
|
||||||
/* Task 8:人核对结论用的验收工单 —— 对决头(原 PN → 候选 PN)+ 四态分布带 + 推荐等级大徽章
|
/* Task 8:人核对结论用的验收工单 —— 对决头(原 PN → 候选 PN)+ 四态分布带只读,
|
||||||
只读,逐条明细可就地改(四态 / 影响说明 / 判断依据 / UNKNOWN 去向),收口四格
|
推荐等级大徽章只读(判据核心,改四态即改它),逐条明细可就地改(四态 / 影响说明 /
|
||||||
(推荐理由 / 差异摘要 / 风险 / 验证要求)只读——它们是配方按规则算的,人改了上面的四态,
|
判断依据 / UNKNOWN 去向);**收口四格(推荐理由 / 差异摘要 / 风险 / 验证要求)
|
||||||
这一步的 auto.do 里那两笔投影(RELATION_PROJECTION / VALIDATION_PROJECTION)会重算它们。 */
|
2026-08-31 起可就地改**,写下的以人为准 —— 这一步因此用 `RELATION_RECOMPUTE`
|
||||||
|
(只重算判定)而不是 `RELATION_PROJECTION`(会把四格按规则重写、冲掉人写的话)。 */
|
||||||
view: 'difference-review',
|
view: 'difference-review',
|
||||||
writes: ['substitution.difference_item', 'substitution.relation', 'validation.record'],
|
writes: ['substitution.difference_item', 'substitution.relation', 'validation.record'],
|
||||||
reads: ['substitution.difference_item', 'substitution.relation'],
|
reads: ['substitution.difference_item', 'substitution.relation'],
|
||||||
@@ -773,7 +805,9 @@ export const ASSESSMENT_STEPS = [
|
|||||||
* 那一笔后面」的又一例 —— 摘要只读,改的是四态。
|
* 那一笔后面」的又一例 —— 摘要只读,改的是四态。
|
||||||
*/
|
*/
|
||||||
DIFFERENCE_ITEM_RECOMPUTE,
|
DIFFERENCE_ITEM_RECOMPUTE,
|
||||||
RELATION_PROJECTION,
|
/* **不是 `RELATION_PROJECTION`** —— 那一笔会把收口四格按规则重写,把人刚改的话冲掉。
|
||||||
|
这一步只重算判定(推荐等级跟着四态走),四格交给人,见 `RELATION_RECOMPUTE` 的头注。 */
|
||||||
|
RELATION_RECOMPUTE,
|
||||||
VALIDATION_PROJECTION,
|
VALIDATION_PROJECTION,
|
||||||
{
|
{
|
||||||
kind: 'card' as const,
|
kind: 'card' as const,
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ export const manifest: ActivityManifest = {
|
|||||||
activityId: ACTIVITY_ID,
|
activityId: ACTIVITY_ID,
|
||||||
name: 'ACT-WORK-05 · 差异评估',
|
name: 'ACT-WORK-05 · 差异评估',
|
||||||
/* 重写不是改 —— 同版重装是 no-op(静默丢失,踩过) */
|
/* 重写不是改 —— 同版重装是 no-op(静默丢失,踩过) */
|
||||||
packageVersion: '2.3.0',
|
packageVersion: '2.4.0',
|
||||||
category: '需求分析与方案匹配',
|
category: '需求分析与方案匹配',
|
||||||
sdkVersion: '0.1.0-m5',
|
sdkVersion: '0.1.0-m5',
|
||||||
checksum: 'dev-checksum-part-substitution-assessment',
|
checksum: 'dev-checksum-part-substitution-assessment',
|
||||||
|
|||||||
@@ -672,6 +672,20 @@ const BIND_ACC1_LAYOUT = `
|
|||||||
.kv span{flex:1 1 auto;color:var(--ink-2);line-height:1.6;overflow-wrap:anywhere}
|
.kv span{flex:1 1 auto;color:var(--ink-2);line-height:1.6;overflow-wrap:anywhere}
|
||||||
.kv span:empty::after{content:"—";color:var(--ink-4)}
|
.kv span:empty::after{content:"—";color:var(--ink-4)}
|
||||||
.summary-box{border:1px solid var(--line-soft);border-radius:10px;background:var(--soft);padding:2px 16px;margin-bottom:4px}
|
.summary-box{border:1px solid var(--line-soft);border-radius:10px;background:var(--soft);padding:2px 16px;margin-bottom:4px}
|
||||||
|
/* **收口四格可就地改**(2026-08-31 用户定):.summary-box 不是表格 —— setOpen 对非表格容器
|
||||||
|
把 .on 落在 data-edit 元素**自身**(A2 对决卡先立此法),所以这几条按 .summary-box.on 写,
|
||||||
|
不是 table.on。注释里不写反引号:这一整段活在 TS 模板字符串里,一个反引号就把串截断
|
||||||
|
(esbuild 当场报在几行之外,本轮踩过一次)。 */
|
||||||
|
.summary-box .jc-cell{display:none;width:100%;border:1px solid var(--line);border-radius:6px;padding:6px 8px;font:inherit;font-size:12.5px;color:var(--ink);background:#fff}
|
||||||
|
.summary-box .jc-cell:focus{border-color:var(--ledger);box-shadow:0 0 0 3px var(--ledger-soft);outline:none}
|
||||||
|
.summary-box.on .kv > .jc-vcell{display:none}
|
||||||
|
.summary-box.on .kv > .jc-cell{display:block}
|
||||||
|
/* 空值那条「—」占位只属于看的那一份:编辑态里输入框旁边再摆一个破折号是噪音 */
|
||||||
|
.summary-box.on .kv .jc-vcell:empty::after{content:none}
|
||||||
|
/* 主键钥匙:不给人看,但真挂 data-col(漏了钥匙,这一行凑不出主键) */
|
||||||
|
.summary-box .rowkey{display:none}
|
||||||
|
/* 行容器 —— data-rows 逐行复制它;不给样式也得有定义(件上每个 class 都要在自己那段 CSS 里找得到) */
|
||||||
|
.sumrow{display:block}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -760,17 +774,34 @@ const DIFF_ITEM_TABLE = `<div class="tbl-wrap"><table>
|
|||||||
</table></div>`;
|
</table></div>`;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 收口四格 —— **只读**。推荐理由 / 差异摘要 / 验证要求三格是自由文本,裸 `data-slot`;
|
* 收口四格 —— **可就地改**(2026-08-31 用户:「差异评估结论审核这个界面的收口结论下面
|
||||||
* 风险走徽标(`data-class-of`,避免直显 `low`/`medium`/`high` 这类英文枚举原值,
|
* 这 4 个字段也需要可以编辑」)。
|
||||||
* 与「陷阱表:枚举列不许 data-slot 直显机器码」同一条纪律)。四格全部读 `substitution.relation`,
|
*
|
||||||
* 但**这一段没有任何 `data-edit`**——它们是配方按 §3.5 规则算出来的,要改就去改上面的四态。
|
* **原来是只读的,理由写在这儿备查**:它们是配方按 §3.5 规则算出来的,「让人直接改这几格,
|
||||||
|
* 等于让他给自己没做的判断盖章」。用户改了这个口径 —— 审核人对结论有最终发言权。
|
||||||
|
*
|
||||||
|
* **光把格子打开不够,配方那一侧必须一起改**:`RELATION_PROJECTION` 每跑一次就把这四列
|
||||||
|
* 按规则重写一遍,而人在件上按保存会触发 quiet 拍、quiet 恰恰跑 `project` —— 不动配方的话,
|
||||||
|
* 人改完一保存,他写的话当场被规则值冲掉,那是「让你改、改完被冲掉」的另一种撒谎。
|
||||||
|
* 治法见 `case-model.ts` 的 `RELATION_RECOMPUTE`:S3 这一步**只重算判定**
|
||||||
|
* (推荐等级跟着四态走 —— 那是判据的核心,不容人手改),**这四格一个字不碰**。
|
||||||
|
* 代价说在明处:改四态之后这三句话不会自动跟着改口 —— 件上那段说明已如实写清。
|
||||||
|
*
|
||||||
|
* 三格自由文本走 `cell()`(只读那一份 + 自动孪生输入);风险是枚举,只读态走徽标
|
||||||
|
* (`data-class-of`,不裸摆 `low`/`medium`/`high`,「枚举列不许 data-slot 直显机器码」),
|
||||||
|
* 编辑态换 `select` —— 与件① 生命周期那一格同款。
|
||||||
|
* 主键 `substitution_relation_id` 挂在 `.rowkey` 里:不给人看(一串内部编号),但必须
|
||||||
|
* **真挂 `data-col`** —— 漏了钥匙,保存的行凑不出主键(2026-08-02 栽过)。
|
||||||
*/
|
*/
|
||||||
const CLOSING_SUMMARY = `<div class="summary-box">
|
const CLOSING_SUMMARY =
|
||||||
<div class="kv"><i>推荐理由</i><span data-slot="recommendation_reason" data-blank></span></div>
|
editGate('substitution.relation', '收口四格是 AI 按规则拟的初稿 —— 点「编辑」就地改,改完保存') +
|
||||||
<div class="kv"><i>差异摘要</i><span data-slot="difference_summary" data-blank></span></div>
|
`<article class="summary-box" data-rows="mine:substitution.relation" data-edit="substitution.relation"><section class="sumrow">
|
||||||
<div class="kv"><i>替代风险</i><span class="risk-badge" data-class-of="risk_level"></span></div>
|
<div class="kv"><i>推荐理由</i>${cell('recommendation_reason')}</div>
|
||||||
<div class="kv"><i>验证要求</i><span data-slot="verification_requirement" data-blank></span></div>
|
<div class="kv"><i>差异摘要</i>${cell('difference_summary')}</div>
|
||||||
</div>`;
|
<div class="kv"><i>替代风险</i><span class="jc-vcell"><span class="risk-badge" data-class-of="risk_level"></span></span>${select('risk_level', [['low', '低'], ['medium', '中'], ['high', '高']], true)}</div>
|
||||||
|
<div class="kv"><i>验证要求</i>${cell('verification_requirement')}</div>
|
||||||
|
<span class="rowkey">${cell('substitution_relation_id', 'mono')}</span>
|
||||||
|
</section></article>`;
|
||||||
|
|
||||||
export const DIFFERENCE_REVIEW = doc({
|
export const DIFFERENCE_REVIEW = doc({
|
||||||
css: ACC1_CSS,
|
css: ACC1_CSS,
|
||||||
@@ -785,7 +816,7 @@ export const DIFFERENCE_REVIEW = doc({
|
|||||||
zone('AI 结论说明', '结论是怎么算出来的', ZIC_TASK) +
|
zone('AI 结论说明', '结论是怎么算出来的', ZIC_TASK) +
|
||||||
note([
|
note([
|
||||||
'<span class="done">AI 已完成的判定</span>:按差异规则(锁定版本 <b data-slot="rule_version" data-blank></b>),对两颗料在同一芯片类型下的每一条核心参数逐一比对,给出 MATCH / MISMATCH / UNKNOWN / CONDITIONAL 四态之一 —— 硬约束不满足即 MISMATCH,证据不足即 UNKNOWN,不会被措辞改判成 MATCH。',
|
'<span class="done">AI 已完成的判定</span>:按差异规则(锁定版本 <b data-slot="rule_version" data-blank></b>),对两颗料在同一芯片类型下的每一条核心参数逐一比对,给出 MATCH / MISMATCH / UNKNOWN / CONDITIONAL 四态之一 —— 硬约束不满足即 MISMATCH,证据不足即 UNKNOWN,不会被措辞改判成 MATCH。',
|
||||||
'<span class="need">系统按规则算出</span>:推荐等级、替代风险、差异摘要、推荐理由、验证要求 —— 这五项不是 AI 编的,是规则按下面四态分布算出来的;你改动下表里任何一条四态,这五项当场重算。',
|
'<span class="need">哪些跟着四态走</span>:<b>推荐等级</b>是规则按下面的四态分布算出来的 —— 你改动下表里任何一条四态,它当场重算,不容手改(那是判据的核心)。<b>收口四格</b>(推荐理由 / 差异摘要 / 替代风险 / 验证要求)是 AI 拟的初稿,<b>可以就地改,写下的以你为准</b> —— 也正因如此,改四态<b>不会</b>把它们自动改写掉(否则你刚写的话会被冲掉);四态改完,记得回头看看这四格还对不对。',
|
||||||
'<span class="need">就地核对</span>:逐条对过原 PN 与候选 PN 的取值、硬约束是否含糊放过、UNKNOWN 是否有验证去向 —— 要改就在下表里改四态、影响说明、判断依据、UNKNOWN 去向,改完保存即生效,不必重新调用 AI。',
|
'<span class="need">就地核对</span>:逐条对过原 PN 与候选 PN 的取值、硬约束是否含糊放过、UNKNOWN 是否有验证去向 —— 要改就在下表里改四态、影响说明、判断依据、UNKNOWN 去向,改完保存即生效,不必重新调用 AI。',
|
||||||
]) +
|
]) +
|
||||||
DUEL +
|
DUEL +
|
||||||
@@ -794,7 +825,7 @@ export const DIFFERENCE_REVIEW = doc({
|
|||||||
editGate('substitution.difference_item', '逐条核对结论、影响说明、判断依据,点「编辑」开表') +
|
editGate('substitution.difference_item', '逐条核对结论、影响说明、判断依据,点「编辑」开表') +
|
||||||
gapbar('substitution_difference_item', '必填') +
|
gapbar('substitution_difference_item', '必填') +
|
||||||
DIFF_ITEM_TABLE +
|
DIFF_ITEM_TABLE +
|
||||||
zone('收口结论', '系统按规则算出,要改就去改上面的四态 —— 让人直接改这几格,等于让他给自己没做的判断盖章', ZIC_TASK) +
|
zone('收口结论', 'AI 按规则拟的初稿 —— 四格都可就地改,你写下的以你为准(改四态不会把它们冲掉,也就不会自动跟着改口)', ZIC_TASK) +
|
||||||
CLOSING_SUMMARY +
|
CLOSING_SUMMARY +
|
||||||
flow('<b>审批:</b>本工单只承载内容;逐条核对无误后,请在对话区的【验收卡】中确认通过。通过后进入落账放行(T_release),签字后正式落账并发口。'),
|
flow('<b>审批:</b>本工单只承载内容;逐条核对无误后,请在对话区的【验收卡】中确认通过。通过后进入落账放行(T_release),签字后正式落账并发口。'),
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user