fix(moldinsight): 方案预览契约断裂——工艺参数面板全 N/A + 备选方案预览无法切换

多方案重构后 cavity_data 与可视化端字段契约断裂,两处收口:

- 契约桥接:CalculationService.attach_scheme_info_contract 把方案级
  key_info 内嵌回 cavity_data(mold_cavities.cavity_key_info / cavity_count /
  manufacturing_info 展示字段),multi_scheme_planner._build_scheme 生成后
  立即接线——3D 预览"关键工艺参数"面板此前 10 项 8 项恒 N/A,
  前端型腔数恒回退 1 腔
- 方案级预览恢复:_attach_scheme_previews 改为每方案生成完整预览
  (HTML + 摘要/数据 JSON 直传 RustFS)并写 scheme["html_file"],
  前端切方案即切 iframe(此前仅最优方案一份,备选永远显示推荐预览);
  删除零消费的 summary_file 死产物;任务级 HTML 复用推荐方案不再重复生成
- 前端 3D 预览标题栏加"当前:方案名"标识

已知取舍:报告键存储随方案数线性增长(记 TECH_DEBT D11 追记);
历史任务不回填,需重新分析。接口面零变化,openapi 不重导出。

测试:193 passed, 13 skipped(净增契约桥接回归测试 1 项,OCC-free);
vue-tsc 通过;本地无 pythonocc,planner 运行时路径待 conda 环境补跑。

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
2026-09-27 00:46:16 +08:00
parent f87cd8a68e
commit cf65ceed1c
7 changed files with 139 additions and 36 deletions
+46
View File
@@ -78,6 +78,52 @@ def test_calculation_service_attaches_injection_system_summary():
assert "injection_system" in result
def test_calculation_service_bridges_scheme_info_contract():
"""多方案 cavity_data 必须自包含可视化面板依赖的 legacy 字段。
3D 预览"关键工艺参数"面板只拿得到 cavity_data;key_info 不内嵌回去则
面板整片 N/A、前端型腔数恒为 1(2026-09 事故根因)。
"""
key_info = {
"mold_parameters": {
"shrinkage_rate": "0.50%",
"draft_angle": "2.0°",
"parting_line_length": 620.0,
},
"geometric_characteristics": {
"product_volume": "12.00 cm³",
"product_weight": "12.60 g",
"wall_thickness_range": "1.40 - 2.60 mm",
},
"manufacturing_requirements": {
"cavity_material": "P20钢材",
"hardness": "HRC 28-32",
"surface_finish": "SPI A2",
"estimated_cycle_time": "25 秒",
},
}
cavity_data = {
"metadata": {"shrinkage_rate": 0.005, "draft_angle": 2.0},
"manufacturing_info": {"recommended_material": "P20钢材"},
"mold_cavities": {"cavity": {"vertex_count": 1}, "core": {"vertex_count": 1}},
}
CalculationService.attach_scheme_info_contract(cavity_data, key_info)
mold_cavities = cavity_data["mold_cavities"]
assert mold_cavities["cavity_count"] == 1
assert (
mold_cavities["cavity_key_info"]["geometric_characteristics"]["product_volume"]
== "12.00 cm³"
)
manufacturing = cavity_data["manufacturing_info"]
assert manufacturing["mold_material"] == "P20钢材"
assert manufacturing["mold_hardness"] == "HRC 28-32"
assert manufacturing["surface_finish"] == "SPI A2"
assert manufacturing["estimated_cycle_time"] == "25 秒"
assert manufacturing["parting_line_length"] == 620.0
def test_material_service_falls_back_to_abs_for_unknown_material():
material = MaterialService.get_material("UNKNOWN")
assert material["name"] == "ABS"