# 开发提示词:参数化选型引擎(一期:选型数据参数化) > 交付对象:Claude Code。实现前请先通读本提示词 + 项目根 `项目总览.md`(需求定稿/踩坑清单)+ `docs\维护手册.md`。 > 实施命令以用户说"开工"为准;本文档只定义"做什么、边界在哪、怎么验收"。 ## 1. 背景与目标 **问题**:直线气缸类别变种数量巨大。现状 CSV 已枚举 52,154 行(M 单系列 14,400 行),若把行程连续档、附件/磁性开关/杆端形式全枚举,将达到几十万行;且每个变种配一个 STEP 文件将导致发布包爆炸(几十万 × 1MB ≈ 数百 GB),参数表也无法浏览。Airtac 原系统用 CADENAS `.tab` 参数表 + `.3db` 参数化几何按需实例化,一个系列只有几个模板文件。 **目标(一期)**:把选型**数据层**参数化—— 1. CSV 从"全枚举表"降级为"**标准档位网格**"(可控量级:每系列几百~几千行) 2. 系列规则包定义**参数域**(枚举 / 连续区间+步长)+ 组合约束 + **型号编码模板** 3. 选型时由规则引擎**实时生成**任意合法组合的参数行 + 型号编码(含非标准档位组合) 4. **两端一致**:同一份规则 JSON,C#(桌面)与 JS(网页)各写一个解释器,用同一份测试向量对拍 5. 非标准档位的 STEP 下载/3D 预览按一期降级策略处理(见 §6) **二期(另行立项,不在本提示词范围)**:几何参数化——行程类变形引擎(OCP 切分/平移/融合),客户机按需生成非标 STEP。 ## 2. 范围与边界 **做**: - meta.json 增加参数化字段(mode/参数域/编码模板/步长等,见 §3) - C# 与 JS 各一个规则解释器(共享语义,共享测试向量) - 选型面板支持连续参数输入(标准档位快捷选 + 自定义值) - 非标组合:参数行生成、编码生成、下载/预览降级(§6) - 构建期校验 + selftest 新项 + 网页无头对拍(§8) - 试点系列迁移:KC(2,628 行 → 网格化),验证后推广 **不做(一期明确排除)**: - 几何变形引擎 / 按需生成 STEP(二期) - 缸径类参数化变形(永远走标准档位,见二期边界) - 删除现有 CSV 结构或重写搜索/平替/购物车主流程(它们继续以网格行为数据源) - 维护向导的参数化规则可视化编辑器(一期手工编辑 meta.json,向导只做校验;编辑器列二期) ## 3. 数据模型(meta.json 扩展) 在现有 series.meta.json 的 `series` 块上扩展,**缺省字段 = 现行为,老系列零影响**: ```json { "series": { "code": "KC", "mode": "parametric", // 缺省/其他值 = 现有枚举模式,行为不变 "modelCodeTemplate": "KC{type:pad2}{bore}-{stroke}{mount}", "stepNameTemplate": "KC-{type}-{bore}x{stroke}.step", "parameters": [ { "code": "bore", "type": "enum", "values": [32, 40, 50, 63, 80, 100, 125] }, { "code": "stroke", "type": "range", "min": 10, "max": 200, "step": 1, "unit": "mm", "gridValues": [10, 20, 30, 50, 75, 100] }, { "code": "mount", "type": "enum", "values": ["", "FA", "FB"] } ], "rules": [ /* 现有 If/Then 规则,语义不变 */ ] } } ``` **语义约定**: 1. **mode**:`parametric` 启动参数化引擎;缺失即现有枚举模式(CSV 行驱动选型),现有 11 个直线缸系列等全部老系列不受影响。 2. **参数域**:`enum`(现有)+ 新增 `range`(min/max/step,全部为整数,step≥1;min/max 必须满足 `max ≥ min`)。 3. **gridValues**:该参数的"标准档位"取值列表,仅用于 UI 快捷选择与网格判定辅助;**网格真源仍是 CSV**(见 §4 判定规则)。 4. **modelCodeTemplate**:型号编码模板。语法 `{字段[:padN]}`,padN = 前补零到 N 位;空枚举值(如 mount="")输出空串。示例:`KC{type:pad2}{bore}-{stroke}{mount}` 对 type=00、bore=32、stroke=10、mount="" 生成 `KC0032-10`;mount=FA 生成 `KC0032-10FA`。 5. **stepNameTemplate**:同语法,生成网格内 STEP 文件名(与 `step\` 目录现有命名对齐);非标组合无此文件。 6. **rules**:沿用现有 If/Then(Op: eq/ne/in/range…),解释器对 range 参数同样生效(Then 可把 range 参数修剪为子区间或枚举子集——实现时给出与现有枚举引擎等价的最小扩展)。 7. **组合合法性**:所有规则同时满足,且每个参数取值在其域内。网格判定见 §4。 **构建期校验(FullCatalogBuilder 新增)**: - 模板中的每个 `{字段}` 必须存在于 parameters;padN 必须是正整数 - range 参数:min/max/step 合法;gridValues ⊆ [min,max] 且按 step 对齐 - parametric 系列的 CSV 中每个现有编码,必须能被模板重新生成且结果一致(**试点对拍门禁**,见 §8) ## 4. 网格判定与生成行语义 - **标准档位(isStandard=true)**:生成的型号编码命中本系列 CSV 行 → 该行数据即参数行,step_file 照常(网格行不动,搜索/平替/参数表/下载全部沿用老逻辑,**回归零差异**) - **非标档位(isStandard=false)**:编码不在 CSV → 由引擎实时生成参数行: - model_code = 模板生成;各参数值 = 当前组合;step_file = null;isStandard = false - 数量类参数展示带单位(unit 字段) - **非标编码不出现在任何静态表**:搜索只索引网格编码 + 系列关键词;crossref 的 our_model 只允许网格编码(构建校验);非标组合的**唯一入口是选型面板** ## 5. 两端功能需求(桌面 / 网页逐项一致) **选型面板**: - enum 参数:现有下拉,不变 - range 参数:**可编辑下拉**(WPF ComboBox IsEditable / HTML input+datalist)——下拉列出 gridValues(标注"标准"),允许输入任意 [min,max] 内按 step 对齐的值;非法输入(越界/非整数/不齐 step)红框 + 统一文案,不生成型号 - 联动:任一参数变化 → 解释器重算其余参数可选集(枚举过滤 + range 修剪);生成行实时刷新 - **组合上限保护**:合法组合数 > 2000 时,UI 不生成结果行,显示"可选组合过多,请先选择更多参数"(两端同阈值同文案) **结果行**:显示生成型号编码 + 参数摘要 + isStandard 标记(非标显示"非标档位(无标准数模)"徽标,两端同样式) **下载(STEP / PDF)**: - 标准档位:现有逻辑不变 - 非标档位:下载按钮**置灰**,悬停/点击显示"非标档位暂不支持数模下载,请联系销售或选择标准档位"(PDF 照常可下) **3D 预览**: - 标准档位:现有四级链不变 - 非标档位:展示**最近标准档位**(按 gridValues 各维距离最近、平局取小)几何,视图顶部加提示条"当前为非标档位,展示最近标准档位 <编码> 的近似几何" **参数表 / 搜索 / 平替 / 购物车**:全部以网格行为数据源,逻辑不变(回归项): - 参数表:仍浏览网格行;parametric 系列不新增行 - 购物车:非标组合可加入(参数摘要同标准行),条目标注"非标档位(打包时无 STEP)";下载 zip 跳过其 STEP、清单.txt 中注明 - 平替:非标编码不参与对照(对照只认网格编码) **维护向导**:parametric 系列仅做校验(域/模板/对拍门禁结果展示),编辑仍手工改 meta.json(同 UGP 手工规则先例) ## 6. 双端一致性架构(红线) - **一份规则数据**:meta.json 即唯一规则源,随 .opc / web 数据发布 - **两个解释器**:C#(net48,桌面)+ JS(网页 app.js),只读同一份 JSON,语义以 §3 约定为准 - **同一份测试向量**:`onebot-data\catalog\parametric-vectors.json`(固定输入组合 → 期望编码/参数行/isStandard),C# selftest 读它断言;网页用 playwright 无头脚本读同一文件断言(沿用购物车 E2E 先例),发布门禁两端都要过 - 数值全部用整数;枚举值字符串两端统一 trim;空值语义统一("" 显示"(无)",不得出现 null/undefined 差异) ## 7. 试点与迁移 1. **试点 KC 系列**(type/bore/stroke/magnet/mount,2,628 行):补 meta 参数化字段 + 模板,CSV 保持原样作为网格 2. **对拍门禁**:构建期对 KC.csv 全部 2,628 个编码执行"模板重生成",任何一个不一致即构建失败——这是本功能最硬的门禁 3. 试点验收通过(§8)后,同法推广 KCB/KS/KSB/KSU/KCS → M/MS/MSC/MAL/MALC(action/rod/cap 多字段模板由用户确认补零与组合规则后再切换) 4. 规则细化:按真实产品手册补充规则(如 type=03 仅限大缸径),一期试点可先放通域+网格、规则渐进补 ## 8. 验收标准(8 条,全部通过才可发布) 1. **对拍门禁**:KC 全部 2,628 个现有编码模板重生成 100% 一致(含 pad 规则),构建不通过即失败 2. **回归零差异**:KC 标准档位组合的选型行为、下载、预览、搜索、参数表与切换前完全一致 3. **非标档位**:输入 stroke=87 等非网格值 → 编码正确生成、参数行正确、下载置灰+统一文案、3D 预览降级最近标准档位+提示条(两端一致) 4. **双端向量对拍**:桌面 selftest 与网页无头脚本对同一向量表全通过,纳入发布门禁 5. **老系列零影响**:其余 16 个系列(enum 模式)全部行为不变;原 selftest 31 项全过 + 新增项通过 6. **存储与性能**:试点后 KC 数据规模仍 ≤ 2,628 行(网格未膨胀);网页首屏、参数表打开、选型联动无明显卡顿 7. **组合爆炸保护**:构造 >2000 组合的域,两端均显示"可选组合过多"提示而非渲染 8. **发布三产物**:客户 exe / 增量包 / 网页站构建发布正常;老客户增量包替换 .opc 后软件正常启动且老系列可用 ## 9. 陷阱清单(12 条,实现前先读) 1. **PowerShell 5.1 编码**:编辑含中文的 .ps1/.cs/.vb 后必须跑 `sample-data\tools\fix-bom.ps1` 再编译(GBK 乱码坑) 2. **两端解释器分歧**:JS 与 C# 对空值/类型/字符串处理不同(undefined vs null、NaN 比较)——全部收敛为整数 + trim 后字符串,向量表里放边界用例(空枚举值、pad 超长、min=max) 3. **补零/模板歧义**:pad 规则、空值拼接顺序必须靠对拍门禁锁死,不要靠人眼 4. **"网格"与"域"是两个概念**:gridValues 只是快捷选择,域才定义合法性——stroke=87 合法但非网格,勿混淆 5. **组合爆炸**:阈值两端一致(2000),且必须只算一次(解释器结果缓存) 6. **非标编码流入静态表**:搜索/crossref/参数表必须只认网格——构建期校验 crossref.our_model ∈ CSV 编码 7. **购物车打包静默丢文件**:非标条目跳过 STEP 时必须在清单.txt 显式注明,禁止静默 8. **老逻辑深度绑定 CSV 行**:选型面板现从行数据推选项,parametric 模式要改走 meta 域——改动集中在选型面板入口,其他模块不动 9. **发布被占用**:publish.ps1 前必须先关客户 exe 和 serve-web(老红线) 10. **增量包兼容**:老客户 exe 读到含新字段的 meta 必须忽略未知字段正常启动(发布前用旧 exe + 新 .opc 验证一次) 11. **无头对拍依赖**:playwright + Edge 路径(`C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe`),纳入发布门禁脚本 12. **预览降级提示条**:两端同文案同位置(视图顶部),不弹窗打断 ## 10. 两端统一文案表(zh / en 同源,走 _lang.T/t 双语文案) | 场景 | 中文 | English | |---|---|---| | 非标档位徽标 | 非标档位(无标准数模) | Non-standard (no standard model) | | 下载按钮置灰 | 非标档位暂不支持数模下载,请联系销售或选择标准档位 | STEP download unavailable for non-standard config. Contact sales or choose a standard config. | | 3D 降级提示条 | 当前为非标档位,展示最近标准档位 {code} 的近似几何 | Non-standard config — showing nearest standard model {code} as approximation. | | 输入非法 | 输入超出范围({min}–{max} {unit})或与步长 {step} 不符 | Out of range ({min}–{max} {unit}) or not aligned to step {step}. | | 组合过多 | 可选组合过多,请先选择更多参数 | Too many combinations — please select more parameters first. | | 购物车非标条目 | 非标档位(打包时无 STEP) | Non-standard (no STEP in package) | | 快捷下拉"标准"标记 | 标准 | Std | ## 11. 交付物 1. C# 参数化解释器(构建期校验 + 运行时生成)+ meta.json 字段扩展 2. JS 解释器 + 网页选型面板 range 控件 + 降级提示条/徽标 3. `parametric-vectors.json` 测试向量 + 桌面 selftest 新项 + 网页无头对拍脚本 4. KC 系列试点 meta 更新(模板/域/规则初版) 5. `docs\维护手册.md` 增补"参数化选型引擎"章节 + `项目总览.md` 回写进展