2026-07-21 11:05:57 +08:00
|
|
|
|
# 排产算法 v1(已落地 · RULE)
|
|
|
|
|
|
|
|
|
|
|
|
> 代码:`server/engines/rule_engine.py`
|
|
|
|
|
|
> 测试:`tests/golden/test_rule_engine.py`
|
|
|
|
|
|
> 定位:构造启发式(策略排序 + 顺排占槽),毫秒级;**不是**最优解求解器。
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 1. 输入 / 输出
|
|
|
|
|
|
|
|
|
|
|
|
| | 内容 |
|
|
|
|
|
|
| --- | --- |
|
2026-07-23 13:38:43 +08:00
|
|
|
|
| 输入 | 世界状态 `world` + `EngineParams`(策略、展望期、起算日、订单子集、引擎类型名;可选 `deliveryBufferRatio` / `freezeWindowHours`) |
|
2026-07-21 11:05:57 +08:00
|
|
|
|
| 写出 | DRAFT `scheduleVersion`、生产订单 PO、工单 WO、`conflicts`、版本 KPI 字段 |
|
|
|
|
|
|
| 权力 | 由工作流以 P1 调用;本引擎只改传入的内存 `world` |
|
|
|
|
|
|
|
2026-07-23 13:38:43 +08:00
|
|
|
|
请求的 `engineType`:`RULE`→规则引擎;`CP`→OR-Tools CP-SAT(见 [scheduling-cp-v1.md](./scheduling-cp-v1.md));`GA`/`HYBRID` 仍由本引擎代跑并留痕。
|
2026-07-21 11:05:57 +08:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 2. 主流程
|
|
|
|
|
|
|
|
|
|
|
|
```text
|
|
|
|
|
|
① 收集待排订单项(过滤 CANCELLED/COMPLETED 订单与 COMPLETED 明细)
|
2026-07-23 13:38:43 +08:00
|
|
|
|
② 按 strategyTemplate 排序(OR-02:综合/均衡以 `-customerLevelWeight` 为第一键;交期优先仍以交期为主)
|
2026-07-21 11:05:57 +08:00
|
|
|
|
③ 创建 DRAFT 版本(版本链 parentVersionId)
|
|
|
|
|
|
④ 逐项:选产线 → 按工艺步骤拆 WO → 在班次窗内找槽(可跨天)→ 齐套检查
|
|
|
|
|
|
⑤ 版本内冲突扫描(产能/维保等只扫本版新 WO,避免历史污染)
|
|
|
|
|
|
⑥ 汇总 KPI(延期、利用率等)
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
与 legacy `aps-frontend` 的刻意偏差(已测固化):
|
|
|
|
|
|
|
|
|
|
|
|
1. 容量/维保冲突只扫**本版**新工单
|
|
|
|
|
|
2. 利用率只按本版工单统计
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 3. 策略模板(排序键)
|
|
|
|
|
|
|
|
|
|
|
|
| strategyTemplate | 排序逻辑(实现) |
|
|
|
|
|
|
| --- | --- |
|
2026-07-23 13:38:43 +08:00
|
|
|
|
| `DELIVERY_FIRST` | `(deliveryDate, -levelWeight, priority)` ≈ EDD 为主 |
|
|
|
|
|
|
| `FIFO` | `(orderDate, -levelWeight, priority)` |
|
|
|
|
|
|
| `CAPACITY_BALANCE` | `(-levelWeight, priority, deliveryDate)`;选线时偏好累计占用少的线 |
|
|
|
|
|
|
| `CHANGEOVER_MIN` | 贪心最近邻:按换型矩阵选下一单;选线偏好同族续排(SC-07) |
|
|
|
|
|
|
| `CAMPAIGN` | 同产品交期窗口合并为战役 PO,再走换型最小化序(SC-08) |
|
|
|
|
|
|
| `COST_FIRST` | 同 `CHANGEOVER_MIN`(以换型分钟为成本代理) |
|
|
|
|
|
|
| 其他 / `COMPREHENSIVE` | `(-levelWeight, priority, deliveryDate)`(OR-02 客户等级权重) |
|
2026-07-21 11:05:57 +08:00
|
|
|
|
|
2026-07-23 13:38:43 +08:00
|
|
|
|
`levelWeight` 来自 `scheduleParams.customerLevelWeights`(默认 VIP=3/A=2/B=1/C=1)。
|
|
|
|
|
|
|
|
|
|
|
|
**纠偏**:`COST_FIRST` 仍**不是**财务成本最优;当前以 MD-06 换型矩阵分钟为代理。真成本目标待后续切片。
|
2026-07-21 11:05:57 +08:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 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. 明确未做(勿在对外材料写成已有)
|
|
|
|
|
|
|
2026-07-23 13:38:43 +08:00
|
|
|
|
- 工序级 CP Interval 全模型 / HYBRID·GA 真管线(产线级 CP 首切片见 [scheduling-cp-v1.md](./scheduling-cp-v1.md))
|
|
|
|
|
|
- 换型全局最优排序(当前为贪心最近邻)
|
|
|
|
|
|
- 战役可配窗口/最大批量与拆批回退
|
2026-07-21 11:05:57 +08:00
|
|
|
|
- 插单 LNS 局部修复 / 全量重排决策表(plan §9.11)
|
2026-07-23 13:38:43 +08:00
|
|
|
|
- 蒙特卡洛鲁棒性 / 参数推荐(Tornado one-at-a-time 已落地,见 SC-06)
|
2026-07-21 11:05:57 +08:00
|
|
|
|
|
|
|
|
|
|
见 [roadmap.md](./roadmap.md)。
|