diff --git a/server/aps_domain/rush.py b/server/aps_domain/rush.py index eb2f952..f25c153 100644 --- a/server/aps_domain/rush.py +++ b/server/aps_domain/rush.py @@ -308,11 +308,37 @@ def _strategy_cn(s: str) -> str: }.get(s, s) +class _FlexSolveResultView: + """PoolEngine 的 dict 结果适配成主轨结果对象的属性读取口径。 + + workflow 的 rush.apply 回复文案按属性读 versionNo/orderCount/conflictCount/ + totalTardiness;柔性引擎返回 dict,这里做一次只读视图转换。 + """ + + def __init__(self, payload: dict[str, Any]) -> None: + self.versionNo = payload.get("versionNo") + self.orderCount = int(payload.get("orderCount") or 0) + self.conflictCount = int(payload.get("conflictCount") or 0) + self.totalTardiness = float(payload.get("totalTardiness") or 0.0) + self.solveStatus = payload.get("solveStatus") + + def apply_rush(world: World, next_id, payload: dict[str, Any]) -> dict[str, Any]: """采用插单:写主干订单池 + 生成 DRAFT 排产版本。调用方负责 checkpoint/审计。""" rush = resolve_rush_payload(world, payload.get("payload") or payload) strategy = str(payload.get("strategy") or "DELIVERY_FIRST").upper() order = inject_rush_trunk(world, next_id, rush) + planning_context = world.get("planningContext") or {} + if planning_context.get("trialOnly"): + # 试排世界必须走柔性能力池引擎:主轨 RULE 引擎读不到 flex* 主数据, + # 全量重排只会产出 0 工单的空壳版本,排产推演/查看排产结果都看不到急单。 + # 改为先把主干急单桥接进柔性订单池,再重跑 PoolEngine 试排(与 run_flex_schedule 同轨)。 + from server.aps_domain.orders import sync_sales_orders_to_flex + from server.engines import PoolEngine + + sync_sales_orders_to_flex(world) + flex_result = PoolEngine().solve(world, next_id, trial=True) + return {"order": order, "result": _FlexSolveResultView(flex_result), "strategy": strategy} # 正式试排写草稿版本 from server.aps_domain.constraints import engine_constraint_flags from server.aps_domain.params import get_schedule_params