# ============================================================ # 工程目录试排(trial)只走 PoolEngine,不改变默认闭环路径 # ============================================================ from __future__ import annotations from server.aps_domain.flex import run_flex_schedule from server.state.seed import empty_world class _MemStore: def __init__(self, data): self.data = data def next_id(self, kind: str) -> int: key = f"_c_{kind}" self.data[key] = self.data.get(key, 1000) + 1 return self.data[key] def save(self): pass def _site_world() -> dict: world = empty_world() world["flexOrders"] = [{ "id": 1, "orderNo": "SO-TRIAL", "productCode": "FG", "productName": "成品", "quantity": 2, "dueDate": "2026-08-20", "priority": 5, "status": "RELEASED", }] world["flexMaterials"] = [{ "id": 1, "code": "FG", "name": "成品", "type": "FINISHED_PRODUCT", "unit": "件", "stock": 0, "inTransit": 0, "safetyStock": 0, "procurementLeadTime": 0, "sourcingType": "MAKE", }] world["flexOperations"] = [{"id": 1, "code": "CUT", "name": "下料", "changeoverMin": 10}] world["flexRoutings"] = [{ "id": 1, "productCode": "FG", "productName": "成品", "seq": 1, "operationCode": "CUT", "operationName": "下料", "stdTimePerUnit": 5.0, }] world["flexEquipment"] = [{ "id": 1, "code": "EQ-1", "name": "切割机", "status": "RUNNING", "capabilities": ["CUT"], "availabilityRate": 1.0, }] return world def test_trial_pool_schedule_produces_virtual_lines(): store = _MemStore(_site_world()) result = run_flex_schedule(store, sort_mode="BOTTLENECK", actor="test", trial=True) assert result["executionMode"] == "POOL_TRIAL" assert result["vlCount"] == 1 assert result["woCount"] == 1 version_id = result["versionId"] assert len([ row for row in store.data["flexVirtualLines"] if row.get("versionId") == version_id ]) == 1 def test_default_run_keeps_closed_loop_mode(): store = _MemStore(_site_world()) result = run_flex_schedule(store, sort_mode="BOTTLENECK", actor="test") assert result["executionMode"] == "CLOSED_LOOP_V1"