# ============================================================ # 默认空世界:不造演示厂假数据;SQL 投影到主数据页 # ============================================================ from __future__ import annotations import os from server.state.seed import build_demo_world, empty_world, purge_demo_residue, seed_world def test_seed_world_default_empty(monkeypatch): monkeypatch.delenv("APS_SEED_DEMO", raising=False) monkeypatch.delenv("APS_SEED_PACK", raising=False) w = seed_world() assert w["materials"] == [] assert w["routings"] == [] assert w["flexOrders"] == [] assert (w.get("flexParams") or {}).get("demoDataCleared") is True assert not any(m.get("code") == "CTRL-A" for m in w["materials"]) def test_purge_demo_residue_strips_controllers(): w = build_demo_world() assert any(m["code"] == "CTRL-A" for m in w["materials"]) assert purge_demo_residue(w) is True assert w["materials"] == [] assert w["routings"] == [] assert w["factories"] == [] assert (w.get("flexParams") or {}).get("demoDataCleared") is True def test_purge_keeps_site_flex_when_classic_is_demo(): """经典表是演示控制器,但 flex 已是现场订单时,不得清空 flex。""" w = build_demo_world() w["flexOrders"] = [{ "id": 1, "orderNo": "SYS202309210001", "productCode": "030129001", "quantity": 10, "dueDate": "2026-08-01", "status": "RELEASED", }] w["flexMaterials"] = [{ "id": 1, "code": "030129001", "name": "支重轮", "type": "FINISHED_PRODUCT", "unit": "件", "stock": 0, "inTransit": 0, "safetyStock": 0, "procurementLeadTime": 0, }] w["flexRoutings"] = [{ "productCode": "030129001", "seq": 10, "operationCode": "NZ0011", "operationName": "粗车", "stdTimePerUnit": 30, }] assert purge_demo_residue(w) is True assert w["materials"] == [] # 演示经典已剥 assert len(w["flexOrders"]) == 1 assert w["flexOrders"][0]["orderNo"] == "SYS202309210001" assert w["flexMaterials"][0]["code"] == "030129001" def test_sql_projects_to_classic_master(): from server.importers.sql_pack import apply_sql_pack_to_world, sql_pack_to_flex flex = sql_pack_to_flex({ "rowsByTable": { "pl_order": [{ "code": "ORD1", "material_code": "FG001", "material_name": "成品A", "quantity": 10, "planned_end_time": "2026-08-01", "is_delete": "0", "craftl_code": "CRAFT-9", "level": 5, }], "md_craftl": [{"code": "CRAFT-9", "product_code": "FG001"}], "r_production_craftl": [{ "craftl_code": "CRAFT-9", "procedure_code": "OP10", "procedure_name": "粗车", "output_material_code": "WIP-X", "sort_no": 10, "working_hours": 0.5, "is_delete": "0", }], "md_material": [], "md_equipment": [{"code": "EQ1", "name": "车床", "is_delete": "0"}], }, "counts": {}, }) world = empty_world() # 先塞演示垃圾,确认会被替换掉 world["materials"] = [{ "id": 1, "code": "CTRL-A", "name": "智能控制器A型", "type": "FINISHED_PRODUCT", "unit": "件", "stock": 1, "inTransit": 0, "safetyStock": 0, "procurementLeadTime": 0, }] apply_sql_pack_to_world(world, flex, replace=True) codes = {m["code"] for m in world["materials"]} assert "CTRL-A" not in codes assert "FG001" in codes assert any(r.get("productId") for r in world["routings"]) assert len(world["routingSteps"]) >= 1