fix(rush): 试排世界急单全量重排改走柔性引擎

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 项全过。
This commit is contained in:
z.zhang 2026-10-09 20:41:43 +08:00
parent 323eeb353c
commit d02d9d5fee
1 changed files with 26 additions and 0 deletions

View File

@ -308,11 +308,37 @@ def _strategy_cn(s: str) -> str:
}.get(s, s) }.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]: def apply_rush(world: World, next_id, payload: dict[str, Any]) -> dict[str, Any]:
"""采用插单:写主干订单池 + 生成 DRAFT 排产版本。调用方负责 checkpoint/审计。""" """采用插单:写主干订单池 + 生成 DRAFT 排产版本。调用方负责 checkpoint/审计。"""
rush = resolve_rush_payload(world, payload.get("payload") or payload) rush = resolve_rush_payload(world, payload.get("payload") or payload)
strategy = str(payload.get("strategy") or "DELIVERY_FIRST").upper() strategy = str(payload.get("strategy") or "DELIVERY_FIRST").upper()
order = inject_rush_trunk(world, next_id, rush) 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.constraints import engine_constraint_flags
from server.aps_domain.params import get_schedule_params from server.aps_domain.params import get_schedule_params