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:
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user