# 排产算法 v1(已落地 · RULE) > 代码:`server/engines/rule_engine.py` > 测试:`tests/golden/test_rule_engine.py` > 定位:构造启发式(策略排序 + 顺排占槽),毫秒级;**不是**最优解求解器。 --- ## 1. 输入 / 输出 | | 内容 | | --- | --- | | 输入 | 世界状态 `world` + `EngineParams`(策略、展望期、起算日、订单子集、引擎类型名等) | | 写出 | DRAFT `scheduleVersion`、生产订单 PO、工单 WO、`conflicts`、版本 KPI 字段 | | 权力 | 由工作流以 P1 调用;本引擎只改传入的内存 `world` | 请求的 `engineType` 可为 RULE/CP/GA/HYBRID;工厂在 M5 前对非 RULE **仍跑本引擎**,但版本上如实留下请求类型(诚实留痕)。 --- ## 2. 主流程 ```text ① 收集待排订单项(过滤 CANCELLED/COMPLETED 订单与 COMPLETED 明细) ② 按 strategyTemplate 排序 ③ 创建 DRAFT 版本(版本链 parentVersionId) ④ 逐项:选产线 → 按工艺步骤拆 WO → 在班次窗内找槽(可跨天)→ 齐套检查 ⑤ 版本内冲突扫描(产能/维保等只扫本版新 WO,避免历史污染) ⑥ 汇总 KPI(延期、利用率等) ``` 与 legacy `aps-frontend` 的刻意偏差(已测固化): 1. 容量/维保冲突只扫**本版**新工单 2. 利用率只按本版工单统计 --- ## 3. 策略模板(排序键) | strategyTemplate | 排序逻辑(实现) | | --- | --- | | `DELIVERY_FIRST` | `(deliveryDate, priority)` ≈ EDD | | `FIFO` | `(orderDate,)` | | `CAPACITY_BALANCE` | `(priority,)`;选线时偏好累计占用少的线 | | `COST_FIRST` | `(priority,)`(成本目标尚未单独建模,与均衡同序) | | 其他 / `COMPREHENSIVE` | `(priority, deliveryDate)` | **纠偏**:`COST_FIRST` 名称表示产品意图,v1 **没有**真实成本目标函数,勿写成「已实现成本最优」。 --- ## 4. 占槽与资源 - 产线:由产品-产线关系 `find_product_lines`;无可用线 → `NO_LINE` - 工位:工序资格 `find_workstation_for_operation`;无 → `NO_WORKSTATION` - 时间:班次日历内找连续可用分钟;长工单可跨天拼接 - 展望期:默认 `planningHorizonDays`(种子参数 14) - 齐套:BOM vs 库存/在途逻辑;不足 → `MATERIAL_SHORTAGE`(可推迟或标冲突,见代码分支) --- ## 5. 冲突类型(引擎实际产出) | conflictType | 含义 | | --- | --- | | `NO_LINE` | 产品无可用产线 | | `NO_WORKSTATION` | 工序无合格工位 | | `MATERIAL_SHORTAGE` | 齐套不足 | | `DELAY` | 相对交期延误 | | `CAPACITY` | 产线日产能/占用冲突 | | `EQUIPMENT` | 维保等设备不可用 | 前端可高亮超期/冲突;**一键修复工作流未落地**。 --- ## 6. 明确未做(勿在对外材料写成已有) - CP-SAT / GA 真实求解与 optimality gap - 可配置约束注册表(C1–C13 产品化) - 换线矩阵优化排序 - 插单 LNS 局部修复 / 全量重排决策表(plan §9.11) - 影子价、Tornado、蒙特卡洛鲁棒性 见 [roadmap.md](./roadmap.md)。