From d02d9d5fee49123a1507e609cadc2b0077dc4434 Mon Sep 17 00:00:00 2001 From: "z.zhang" Date: Fri, 9 Oct 2026 20:41:43 +0800 Subject: [PATCH] =?UTF-8?q?fix(rush):=20=E8=AF=95=E6=8E=92=E4=B8=96?= =?UTF-8?q?=E7=95=8C=E6=80=A5=E5=8D=95=E5=85=A8=E9=87=8F=E9=87=8D=E6=8E=92?= =?UTF-8?q?=E6=94=B9=E8=B5=B0=E6=9F=94=E6=80=A7=E5=BC=95=E6=93=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit rush.apply 升级/直接采用路径此前固定用主轨 RULE 引擎;试排世界 (planningContext.trialOnly)的主数据都在 flex* 表,RULE 引擎只能产出 0 工单的空壳 V 版本,导致「急单已加入订单池,但排产推演/查看排产结果 看不到」。现按世界形态分流:trialOnly 世界先 sync_sales_orders_to_flex 桥接急单进柔性订单池,再用 PoolEngine 重排生成 FV 草稿版本; 正式世界保持原 RULE 全量重排不变。 新增 _FlexSolveResultView 把 PoolEngine 的 dict 结果适配为回复文案 所需的属性读取口径。golden:rush/flex/order/workflow 196 项全过。 --- server/aps_domain/rush.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) 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