diff --git a/activities/part-substitution-assessment/__tests__/activity.test.ts b/activities/part-substitution-assessment/__tests__/activity.test.ts index b5f04e0..60bfd6c 100644 --- a/activities/part-substitution-assessment/__tests__/activity.test.ts +++ b/activities/part-substitution-assessment/__tests__/activity.test.ts @@ -451,7 +451,8 @@ describe('报告模版:编辑面与只读面各就各位', () => { it('每个可编辑格子的 data-col 都在对应台账对象的声明里(input-supplement 一屏四张表,四张台账对象的声明并起来看;difference-review 一张表)', () => { const cases: Array<[string, Array<[string, string]>]> = [ ['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) { 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"'); }); - 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']) { - expect(html).toContain(`data-slot="${col}"`); - expect(html).not.toContain(`data-col="${col}"`); + expect(html, col).toContain(`data-slot="${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(/