Archived
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:
@@ -19,10 +19,11 @@ describe('主数据四域', () => {
|
||||
expect([...new Set(MASTER_OBJECTS.map((o) => o.domain))].sort()).toEqual([...MASTER_DOMAINS].sort());
|
||||
});
|
||||
|
||||
it('SS02 差异评估要读写的六张主数据表都在基线里,主键照《统一方案》', () => {
|
||||
it('SS02 差异评估要读写的七张主数据表都在基线里,主键照《统一方案》', () => {
|
||||
const pk = (domain: string, object: string) =>
|
||||
MASTER_OBJECTS.find((o) => o.domain === domain && o.object === object)?.fields.filter((f) => f.primaryKey).map((f) => f.name);
|
||||
expect(pk('parts', 'profile')).toEqual(['internal_pn']);
|
||||
expect(pk('parts', 'parameter')).toEqual(['internal_pn', 'param_name']);
|
||||
expect(pk('parts', 'document')).toEqual(['internal_pn', 'doc_seq']);
|
||||
expect(pk('demand', 'request')).toEqual(['request_id']);
|
||||
expect(pk('substitution', 'relation')).toEqual(['substitution_relation_id']);
|
||||
@@ -36,6 +37,21 @@ describe('主数据四域', () => {
|
||||
expect(parts).not.toContain('XL2596S-5.0');
|
||||
});
|
||||
|
||||
it('样例料号的标准化参数集是独立子表 parts.parameter:两颗料各 7 行,主键是 (internal_pn, param_name)', () => {
|
||||
const params = MASTER_SAMPLE_ROWS.filter((r) => r.address.domain === 'parts' && r.address.object === 'parameter');
|
||||
const byPn = (pn: string) => params.filter((r) => r.key['internal_pn'] === pn);
|
||||
expect(byPn('LM2596S-5.0')).toHaveLength(7);
|
||||
expect(byPn('LM2596S-ADJ')).toHaveLength(7);
|
||||
for (const row of params) {
|
||||
expect(Object.keys(row.key).sort()).toEqual(['internal_pn', 'param_name']);
|
||||
expect(row.values['param_value'], JSON.stringify(row.key)).toBeTruthy();
|
||||
expect(row.values['constraint_type']).toMatch(/^(hard|soft)$/);
|
||||
}
|
||||
// parts.profile 不再声明这一列的值 —— 两行样例主记录里它应为空(物理列留在基线,不再写)
|
||||
const profiles = MASTER_SAMPLE_ROWS.filter((r) => r.address.domain === 'parts' && r.address.object === 'profile');
|
||||
for (const row of profiles) expect(row.values['normalized_parameter_set']).toBeUndefined();
|
||||
});
|
||||
|
||||
it('四个域各自都有表 —— 空占位也得立得住', () => {
|
||||
for (const d of MASTER_DOMAINS) {
|
||||
expect(MASTER_OBJECTS.filter((o) => o.domain === d).length, `${d} 域一张表都没有`).toBeGreaterThan(0);
|
||||
|
||||
@@ -143,17 +143,22 @@ export const MASTER_OBJECTS: readonly ObjectDeclaration[] = [
|
||||
f('trend', 'text', '走势'),
|
||||
]),
|
||||
|
||||
/* ── 料件:P-08 芯片主数据 / P-10 原厂技术资料库(SS02 差异评估 2026-08-26 加)──
|
||||
/* ── 料件:P-08 芯片主数据 / P-10 原厂技术资料库(SS02 差异评估 2026-08-26 加,2026-08-27 结构改)──
|
||||
字段名与《SS02-SS03-SS04_Demo台账字段细化与统一方案》§4.2 一字不差;全链路只认 internal_pn。
|
||||
参数集是 P-08 的一个字段(用户定:一张表,不建子表),一行一参数:
|
||||
`参数名 | 值 | 单位 | hard/soft | 说明`。老的 market.part(主键 pn)不复用,记 debt 待并。 */
|
||||
标准化参数集**改为独立子表 `parts.parameter`**(2026-08-27 用户当场核对实跑页面后指出:
|
||||
「做出来的页面结构必须与目标件一致」——目标件《ACT-WORK-05-数据工单-01》本就是两张表,
|
||||
表 1 一个料一行(主记录)、表 2 一个参数一行(子表,按所属料号归属);塞进主记录的一个文本
|
||||
列违反《统一方案》§六「重复明细用子表承载,不在单一文本字段堆叠」,§4.2 里
|
||||
`normalized_parameter_set` 的数据类型本就写的是 `Structure`。物理列 `parts.profile.
|
||||
normalized_parameter_set` 仍留在基线里(不删列),只是活动清单不再声明它、不再写它。
|
||||
老的 market.part(主键 pn)不复用,记 debt 待并。 */
|
||||
master('parts', 'profile', '芯片主数据(P-08)', [
|
||||
f('internal_pn', 'text', '内部料号', true),
|
||||
f('customer_pn', 'text', '客户料号'),
|
||||
f('brand_name', 'text', '品牌名称'),
|
||||
f('manufacturer_name', 'text', '制造商名称'),
|
||||
f('specification_description', 'text', '规格描述'),
|
||||
f('normalized_parameter_set', 'text', '标准化参数集(一行一参数:参数名 | 值 | 单位 | hard/soft | 说明)'),
|
||||
f('normalized_parameter_set', 'text', '标准化参数集(已改子表 parts.parameter,这一列不再声明/不再写)'),
|
||||
f('package', 'text', '封装'),
|
||||
f('process_technology', 'text', '工艺'),
|
||||
f('lifecycle_status', 'text', '生命周期状态'),
|
||||
@@ -163,6 +168,15 @@ export const MASTER_OBJECTS: readonly ObjectDeclaration[] = [
|
||||
f('application_scenarios', 'text', '适配应用场景'),
|
||||
f('pin_to_pin_relation_ref', 'text', 'Pin-to-Pin 关系引用'),
|
||||
]),
|
||||
/* P-08 子表:标准化参数集,一行一参数,按 internal_pn 归属主记录(《统一方案》§六:重复明细用子表) */
|
||||
master('parts', 'parameter', '标准化参数集(P-08 子表)', [
|
||||
f('internal_pn', 'text', '所属料号', true),
|
||||
f('param_name', 'text', '参数名', true),
|
||||
f('param_value', 'text', '值'),
|
||||
f('param_unit', 'text', '单位'),
|
||||
f('constraint_type', 'text', '约束类型'),
|
||||
f('param_note', 'text', '说明'),
|
||||
]),
|
||||
master('parts', 'document', '原厂技术资料库(P-10)', [
|
||||
f('internal_pn', 'text', '关联内部料号', true),
|
||||
f('doc_seq', 'text', '资料序号(同一料号下 01/02…)', true),
|
||||
@@ -462,10 +476,11 @@ export const MASTER_SAMPLE_ROWS: readonly { address: LedgerAddress; key: LedgerK
|
||||
},
|
||||
},
|
||||
/*
|
||||
* ── SS02 差异评估的样例料号(2026-08-26)──
|
||||
* ── SS02 差异评估的样例料号(2026-08-26,2026-08-27 参数集改子表)──
|
||||
* 只播**原 PN**与**同族可调版**两颗:「都在库」那条路靠它们;候选 XL2596S-5.0 与国产 DCDC
|
||||
* **刻意不播** —— 「候选缺库 → 派数据工单」「硬约束不推荐」两条路要试得出来,库里得真没有。
|
||||
* 参数集一行一参数(参数名 | 值 | 单位 | hard/soft | 说明),与 P-08 声明的行语法同一份。
|
||||
* 标准化参数集是独立子表 `parts.parameter`,一颗料 7 行(与目标件《数据工单-01》的
|
||||
* 表 2 示例预填同形);数值照旧版 `normalized_parameter_set` 文本行逐条搬,一个字不改。
|
||||
*/
|
||||
{
|
||||
address: { domain: 'parts', object: 'profile' },
|
||||
@@ -475,15 +490,6 @@ export const MASTER_SAMPLE_ROWS: readonly { address: LedgerAddress; key: LedgerK
|
||||
brand_name: 'TI',
|
||||
manufacturer_name: 'Texas Instruments',
|
||||
specification_description: '降压型 DCDC 稳压器,3A,固定 5.0V,150kHz',
|
||||
normalized_parameter_set: [
|
||||
'输入电压范围 | 4.5~40 | V | hard | 客户输入上限 40V',
|
||||
'输出电压 | 5.0 | V | hard | 固定版',
|
||||
'输出电流 | 3 | A | hard | 满载能力',
|
||||
'开关频率 | 150 | kHz | hard | 影响外围电感/电容',
|
||||
'静态电流 | 5 | mA | soft | 待机功耗',
|
||||
'工作温度 | -40~+85 | ℃ | hard | 工业温域',
|
||||
'使能阈值 | 1.4 | V | hard | ON/OFF 引脚阈值',
|
||||
].join('\n'),
|
||||
package: 'TO-263-5',
|
||||
process_technology: 'BCD',
|
||||
lifecycle_status: 'nrnd',
|
||||
@@ -493,6 +499,13 @@ export const MASTER_SAMPLE_ROWS: readonly { address: LedgerAddress; key: LedgerK
|
||||
application_scenarios: '工业电源;消费电源',
|
||||
},
|
||||
},
|
||||
{ address: { domain: 'parts', object: 'parameter' }, key: { internal_pn: 'LM2596S-5.0', param_name: '输入电压范围' }, values: { internal_pn: 'LM2596S-5.0', param_name: '输入电压范围', param_value: '4.5~40', param_unit: 'V', constraint_type: 'hard', param_note: '客户输入上限 40V' } },
|
||||
{ address: { domain: 'parts', object: 'parameter' }, key: { internal_pn: 'LM2596S-5.0', param_name: '输出电压' }, values: { internal_pn: 'LM2596S-5.0', param_name: '输出电压', param_value: '5.0', param_unit: 'V', constraint_type: 'hard', param_note: '固定版' } },
|
||||
{ address: { domain: 'parts', object: 'parameter' }, key: { internal_pn: 'LM2596S-5.0', param_name: '输出电流' }, values: { internal_pn: 'LM2596S-5.0', param_name: '输出电流', param_value: '3', param_unit: 'A', constraint_type: 'hard', param_note: '满载能力' } },
|
||||
{ address: { domain: 'parts', object: 'parameter' }, key: { internal_pn: 'LM2596S-5.0', param_name: '开关频率' }, values: { internal_pn: 'LM2596S-5.0', param_name: '开关频率', param_value: '150', param_unit: 'kHz', constraint_type: 'hard', param_note: '影响外围电感/电容' } },
|
||||
{ address: { domain: 'parts', object: 'parameter' }, key: { internal_pn: 'LM2596S-5.0', param_name: '静态电流' }, values: { internal_pn: 'LM2596S-5.0', param_name: '静态电流', param_value: '5', param_unit: 'mA', constraint_type: 'soft', param_note: '待机功耗' } },
|
||||
{ address: { domain: 'parts', object: 'parameter' }, key: { internal_pn: 'LM2596S-5.0', param_name: '工作温度' }, values: { internal_pn: 'LM2596S-5.0', param_name: '工作温度', param_value: '-40~+85', param_unit: '℃', constraint_type: 'hard', param_note: '工业温域' } },
|
||||
{ address: { domain: 'parts', object: 'parameter' }, key: { internal_pn: 'LM2596S-5.0', param_name: '使能阈值' }, values: { internal_pn: 'LM2596S-5.0', param_name: '使能阈值', param_value: '1.4', param_unit: 'V', constraint_type: 'hard', param_note: 'ON/OFF 引脚阈值' } },
|
||||
{
|
||||
address: { domain: 'parts', object: 'profile' },
|
||||
key: { internal_pn: 'LM2596S-ADJ' },
|
||||
@@ -501,15 +514,6 @@ export const MASTER_SAMPLE_ROWS: readonly { address: LedgerAddress; key: LedgerK
|
||||
brand_name: 'TI',
|
||||
manufacturer_name: 'Texas Instruments',
|
||||
specification_description: '降压型 DCDC 稳压器,3A,可调输出 1.23~37V,150kHz(LM2596 同族)',
|
||||
normalized_parameter_set: [
|
||||
'输入电压范围 | 4.5~40 | V | hard | 与固定版同',
|
||||
'输出电压 | 1.23~37 | V | hard | 可调版,靠外围反馈网络定',
|
||||
'输出电流 | 3 | A | hard | 满载能力',
|
||||
'开关频率 | 150 | kHz | hard | 影响外围电感/电容',
|
||||
'静态电流 | 5 | mA | soft | 待机功耗',
|
||||
'工作温度 | -40~+85 | ℃ | hard | 工业温域',
|
||||
'使能阈值 | 1.4 | V | hard | ON/OFF 引脚阈值',
|
||||
].join('\n'),
|
||||
package: 'TO-263-5',
|
||||
process_technology: 'BCD',
|
||||
lifecycle_status: 'active',
|
||||
@@ -518,6 +522,13 @@ export const MASTER_SAMPLE_ROWS: readonly { address: LedgerAddress; key: LedgerK
|
||||
application_scenarios: '工业电源;消费电源',
|
||||
},
|
||||
},
|
||||
{ address: { domain: 'parts', object: 'parameter' }, key: { internal_pn: 'LM2596S-ADJ', param_name: '输入电压范围' }, values: { internal_pn: 'LM2596S-ADJ', param_name: '输入电压范围', param_value: '4.5~40', param_unit: 'V', constraint_type: 'hard', param_note: '与固定版同' } },
|
||||
{ address: { domain: 'parts', object: 'parameter' }, key: { internal_pn: 'LM2596S-ADJ', param_name: '输出电压' }, values: { internal_pn: 'LM2596S-ADJ', param_name: '输出电压', param_value: '1.23~37', param_unit: 'V', constraint_type: 'hard', param_note: '可调版,靠外围反馈网络定' } },
|
||||
{ address: { domain: 'parts', object: 'parameter' }, key: { internal_pn: 'LM2596S-ADJ', param_name: '输出电流' }, values: { internal_pn: 'LM2596S-ADJ', param_name: '输出电流', param_value: '3', param_unit: 'A', constraint_type: 'hard', param_note: '满载能力' } },
|
||||
{ address: { domain: 'parts', object: 'parameter' }, key: { internal_pn: 'LM2596S-ADJ', param_name: '开关频率' }, values: { internal_pn: 'LM2596S-ADJ', param_name: '开关频率', param_value: '150', param_unit: 'kHz', constraint_type: 'hard', param_note: '影响外围电感/电容' } },
|
||||
{ address: { domain: 'parts', object: 'parameter' }, key: { internal_pn: 'LM2596S-ADJ', param_name: '静态电流' }, values: { internal_pn: 'LM2596S-ADJ', param_name: '静态电流', param_value: '5', param_unit: 'mA', constraint_type: 'soft', param_note: '待机功耗' } },
|
||||
{ address: { domain: 'parts', object: 'parameter' }, key: { internal_pn: 'LM2596S-ADJ', param_name: '工作温度' }, values: { internal_pn: 'LM2596S-ADJ', param_name: '工作温度', param_value: '-40~+85', param_unit: '℃', constraint_type: 'hard', param_note: '工业温域' } },
|
||||
{ address: { domain: 'parts', object: 'parameter' }, key: { internal_pn: 'LM2596S-ADJ', param_name: '使能阈值' }, values: { internal_pn: 'LM2596S-ADJ', param_name: '使能阈值', param_value: '1.4', param_unit: 'V', constraint_type: 'hard', param_note: 'ON/OFF 引脚阈值' } },
|
||||
{
|
||||
address: { domain: 'parts', object: 'document' },
|
||||
key: { internal_pn: 'LM2596S-5.0', doc_seq: '01' },
|
||||
|
||||
Reference in New Issue
Block a user