ACT-WORK-05:标准化参数集改子表 parts.parameter,与目标件页面结构对齐

用户核对实跑页面后指出:P-08 数据工单做出来的页面结构必须与目标件
《数据工单-01-芯片主数据创建》一致——目标件本就是两张表(表 1 主记录 /
表 2 标准化参数子表),而实现把参数集塞成了表 1 的一个文本列,违反
《SS02-SS03-SS04_Demo台账字段细化与统一方案》§六「重复明细用子表承载,
不在单一文本字段堆叠」。

五处联动改齐:
- 平台基线新增 parts.parameter 主数据表(内部料号+参数名复合主键),
  两颗样例料的参数集从 normalized_parameter_set 文本列拆成 7 行子表数据
  (数值原样搬,一个字未改);parts.profile 物理列保留、不再赋值。
- 活动清单:parts.profile 撤掉该字段声明,新增 parts.parameter 声明
  (internal_pn 引用墙、param_value/constraint_type 必填);版本号
  1.1.1 → 1.2.0。
- 案例模型:S0d_p08_master/S1_input_confirm/S2_normalize 的读写面与
  guide 全部改指向新子表;顺带修正候选计数措辞歧义(实测样例0一张该发
  的决策卡被跳过——"候选absent且候选数≥2"被模型读成"不在库的候选≥2颗",
  改成先分别数"候选总数"与"不在库的候选数"两个数、显式说清楚判据认哪个)。
- caseFileModel 补 parts_parameter_missing 读数,两条哨兵(s_p08_created /
  s_pns_resolved)一并要求这一列不缺必填。
- 报告模版补齐表 2(逐块搬自目标件),主键列挂 data-col,约束类型走
  data-class-of 徽标。
- e2e 套件加性支持"一张卡填两张表"(stage.extraTables),buildEdits
  的 rowKey 泛化支持复合主键数组形态(不破坏既有八套件)。

验证:vitest 413 passed(活动包+平台种子测试全绿)、typecheck/lint/
depcruise 三绿、activities:install 零静态审发现、SQL 核对
parts.parameter 主键与行数(两颗料各7行)。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FJcX8A6TWp4GRs41TYryEh
This commit is contained in:
xcs
2026-08-27 02:19:39 +08:00
co-authored by Claude Opus 5
parent 02ef572470
commit c6b02dfd39
9 changed files with 324 additions and 141 deletions
@@ -4,7 +4,9 @@
* 五个局面各一张,版面语言**逐块搬自** `docs/SS02-ACT-WORK-05-html/` 的四份目标件
* (《HTML报告生成规范》§7:有目标件时「搬」,不要「照着做」——样式表整段搬,标记逐块搬,
* 只把写死的数据换成绑定):
* · `p08-master-create` —— S0d 摆,数据工单(P-08 芯片主数据),搬自「数据工单-01」;
* · `p08-master-create` —— S0d 摆,数据工单(P-08 芯片主数据),搬自「数据工单-01」
* (2026-08-27:补齐目标件里原本就有、之前漏搬的【创建什么 · 表 2】标准化参数子表 `parts.parameter`
* —— 用户核对实跑页面后指出「页面结构必须与目标件一致」,目标件本就是两张表);
* · `p10-document-create` —— S0d 摆,数据工单(P-10 原厂技术资料),**没有自己的目标件**
* (规格里数据工单是「一个统一模板按目标台账实例化」),复用「数据工单-01」的样式表与版面骨架;
* · `eval-input-list` —— S0/S1 摆,评估输入清单,搬自「执行工单-01」;
@@ -108,6 +110,16 @@ ${badgeCss('.stx', [
['pending', '待核实', AMBER],
['void', '作废', MUTED],
])}
/*
* 表 2(标准化参数集)的约束类型(硬/软)—— 目标件里这一格是字面类名 .ct.hard / .ct.soft
* (P08_CSS 已带这两条颜色声明,.ct 基座形状也在);平台的 data-class-of 走的是
* v-<token> 别名机制,不是字面枚举值,这里用 badgeCss 生成 .ct.v-hard / .ct.v-soft,
* 颜色原样照抄目标件那两条声明的数值(DANGER/MUTED 与 .ct.hard / .ct.soft 同一份值)。
*/
${badgeCss('.ct', [
['hard', '硬约束', DANGER],
['soft', '软约束', MUTED],
])}
`;
/* ==================== 执行工单(评估输入清单):徽标别名 ==================== */
@@ -315,7 +327,6 @@ const P08_TABLE = `<div class="jc-tbl-wrap"><table id="tbl1">
<th data-h="Datasheet引用">Datasheet 引用 datasheet_ref</th>
<th data-h="Datasheet版本">Datasheet 版本 datasheet_version<span class="thd">与引用成对</span></th>
<th data-h="适配应用场景">适配场景 application_scenarios<span class="thd">判断实际适用性</span></th>
<th class="req" data-h="标准化参数集">标准化参数集 normalized_parameter_set<span class="thd">一行一参数:参数名|值|单位|hard/soft|说明</span></th>
</tr></thead>
<tbody data-rows="mine:parts.profile" data-edit="parts.profile"><tr>
<td class="rn"><span class="jc-rn-num"></span><button class="jc-rowdel" type="button" title="删除此行" data-edit-del="parts.profile">×</button></td>
@@ -330,7 +341,34 @@ const P08_TABLE = `<div class="jc-tbl-wrap"><table id="tbl1">
<td>${cell('datasheet_ref', 'mono')}</td>
<td>${cell('datasheet_version')}</td>
<td>${cell('application_scenarios')}</td>
<td><span class="jc-vcell mono" data-slot="normalized_parameter_set" data-blank></span><textarea class="jc-cell mono" data-col="normalized_parameter_set" placeholder="输入电压范围 | 4.5~40 | V | hard | 客户上限 40V&#10;输出电压 | 5.0 | V | hard | 固定版&#10;使能阈值 | 未披露 | V | hard | 原厂未给"></textarea></td>
</tr></tbody>
</table></div>`;
/*
* 表 2 · 标准化参数集(P-08 子表 `parts.parameter`)—— 粒度与表 1 不同(一个参数一行,
* 行数不固定),不能塞进表 1 的一格(《统一方案》§六:重复明细用子表承载),
* 逐块搬自目标件《数据工单-01》的【创建什么 · 表 2】,`id="tbl2"` 沿用目标件自己的
* 列宽声明(P08_CSS 里 `#tbl2 th:nth-child(n)` 那几条,不必在这里重复)。
* 「说明」列是系统只读注释(目标件原话:「说明列为系统注释,无需填写」),不给 data-col。
*/
const P08_PARAMS_TABLE = `<div class="jc-tbl-wrap"><table id="tbl2">
<thead><tr>
<th style="width:38px">#</th>
<th class="req" data-h="所属料号">所属料号 internal_pn<span class="thd">归属表 1 哪条记录</span></th>
<th class="req" data-h="参数名">参数名</th>
<th class="req" data-h="值">值</th>
<th data-h="单位">单位</th>
<th class="req" data-h="约束类型">约束(硬/软)</th>
<th data-h="说明">说明</th>
</tr></thead>
<tbody data-rows="mine:parts.parameter" data-edit="parts.parameter"><tr>
<td class="rn"><span class="jc-rn-num"></span><button class="jc-rowdel" type="button" title="删除此行" data-edit-del="parts.parameter">×</button></td>
<td>${cell('internal_pn', 'mono')}</td>
<td>${cell('param_name')}</td>
<td>${cell('param_value', 'mono')}</td>
<td>${cell('param_unit')}</td>
<td>${badge('ct', 'constraint_type', true)}${select('constraint_type', [['hard', '硬约束'], ['soft', '软约束']], true)}</td>
<td class="desc">${ro('param_note')}</td>
</tr></tbody>
</table></div>`;
@@ -347,16 +385,21 @@ export const P08_MASTER_CREATE = doc({
body:
zone('做什么', '批量创建 P-08 主数据记录', ZIC_TASK) +
note([
'<span class="need">模板定位</span>:本单是「数据工单」统一模板的实例——<b>一单一类(可多条)</b>:目标台账 = <b>芯片主数据(P-08)</b>;<b>字段即表头、每行一条新记录</b>;标准化参数集是这条记录的一个字段(一行一参数)。',
'<span class="need">模板定位</span>:本单是「数据工单」统一模板的实例——<b>一单一类(可多条)</b>:目标台账 = <b>芯片主数据(P-08)</b>;<b>字段即表头、每行一条新记录</b>;标准化参数集是它的结构子表(表 2,一行一参数,按所属料号归属)。',
'<span class="need">触发原因</span>:系统按内部料号查芯片主数据<b>查无记录</b>——是「完全没有」,不是字段缺失(那归执行工单)。',
'<span class="done">AI 预填</span>:上传了 datasheet 的料号 AI 已按资料预填,标着值的格子请核对;没上传的料号全部手填,同为合法路径。',
'<span class="need">纪律</span>:必填列全齐才允许确认;确认后这批记录进本单草稿,放行时并入正式库并留痕(确认人 = 数据责任人);只建主数据,验证记录等事实类不在此建。',
]) +
zone('创建什么', '主数据记录(每行一条,*为必填列)', ZIC_TABLE) +
zone('创建什么 · 表 1', '主数据记录(每行一条,*为必填列)', ZIC_TABLE) +
gapbar('parts_profile', '必填') +
editGate('parts.profile', `<b>待建 <span data-slot="parts_profile_rows"></span> 条记录</b>,点「编辑」核对预填、补齐空缺;「+ 加一行」= 再建一条`) +
P08_TABLE +
addrow('parts.profile', '+ 加一行(再建一条记录)', '新行的内部料号必须写(它是这一行的钥匙);其余必填列全部填写后才允许确认;删一行 = 该记录不建') +
`<p class="zone tbl-gap">${ZIC_TABLE}<b>【创建什么 · 表 2】</b>—— 标准化参数集(每行一个参数,按所属料号归属,*必填)</p>` +
gapbar('parts_parameter', '必填') +
editGate('parts.parameter', `<b>已铺 <span data-slot="parts_parameter_rows"></span> 行参数</b>(有 datasheet 的已按资料预填),点「编辑」核对修正;「+ 加一行」补充未列出的参数`) +
P08_PARAMS_TABLE +
addrow('parts.parameter', '+ 加一行(补充参数)', '所属料号 / 参数名 / 值 / 单位 / 约束类型齐全;「未披露」请直接写未披露,将进入 UNKNOWN 并挂验证任务;「说明」列为系统注释,无需填写') +
flow('<b>提交 / 确认:</b>本工单只承载内容;确认请在对话区的【执行卡】中进行。确认后活动自动从「等待数据」唤醒。'),
});