=== MacroPlanner 优化器运行日志 ===
=== 运行时间: 2026-08-17 15:49:44 ===

=== 开始构建 MacroPlanner 优化模型 ===

  [警告] ========== 数据检查: 4 个警告 ==========
  [警告]   ⚠️ 工序 OP_R1 leadTimeDays=1 天, 但第一个周期前无对应生产周期, 第1周期该产品无到货
  [警告]   ⚠️ 工序 OP_R1_Alt leadTimeDays=2 天, 但第一个周期前无对应生产周期, 第1周期该产品无到货
  [警告]   ⚠️ 工序 OP_R2 leadTimeDays=1 天, 但第一个周期前无对应生产周期, 第1周期该产品无到货
  [警告]   ⚠️ 工序 OP_R2_Alt leadTimeDays=3 天, 但第一个周期前无对应生产周期, 第1周期该产品无到货
  [信息] ✅ 数据检查通过: 无错误, 4 个警告
  [OK] 数据检查通过

  [OK] 决策变量创建完成
  [信息] ========== 开始构建约束 ==========
  [信息] [1. 物料平衡] 确保每个 PISPIP 流入 = 流出 | +15约束
  [信息] [2. BOM依赖需求] OperationDemandQty = PTQty × BOM因子 | +27约束
  [信息] [3. 需求满足量汇总] DemandFulfillment = SalesDemandQty + OperationDemandQty | +15约束
  [信息] [4. 需求缺口联动] SalesDemandQty + DemandSlack >= DemandQuantity | +6约束
  [警告] [4.5 工序产量一致] Routing 内相邻工序 PTQty 相等, 防止 WIP 堆积 → 未创建任何约束或变量! (可能数据为空)
  [信息] [库存规格] 构建完成: 0 个使用安全库存天数, 45 个使用绝对数量
  [信息] [5. 库存规格] InvQty + Slack ≥ Min/Max/Target (支持天数模式) | +45约束
  [信息] [6. 产能约束] Σ(PTQty×coeff) ∈ [MinCapacity, MaxCapacity] | +9约束
  [信息] [7. 供应规格] ΣPTQty + Slack ≥ Target/Min/Max | +14约束
  [信息] [8. 批次大小] PTQty×QTPFactor + Slack ∈ [LotSize] | +24约束
  [信息] [9. KPI汇总] TotalKPI = Σ 松弛变量 (12个KPI) | +10约束 | +12变量
  [信息] ========== 约束构建完成: 总计 165 约束, 218 变量 ==========
  [OK] 约束与KPI汇总创建完成
  [OK] 目标函数创建完成
  [OK] LP模型文件已导出: F:\product\MES\hyh.apsj\mp\lp\model.lp

模型统计: 变量=218, 约束=165

=== 开始分层求解 ===

--- 第 1/4 层: 需求满足 (松弛=0%) ---
  SCIP Status        : OPTIMAL
  Solving Time (sec) : 0.01
  Primal Bound       : +1.950000e+04
    需求缺口: 195.00 (系数=100.0, 惩罚=19500.00)
  已添加边界约束: 上层目标 ≤ 19500.00

--- 第 2/4 层: 产能约束 (松弛=0%) ---
  SCIP Status        : OPTIMAL
  Solving Time (sec) : 0.01
  Primal Bound       : +0.000000e+00
    产能超载: 0.00 (系数=20.0, 惩罚=0.00)
  已添加边界约束: 上层目标 ≤ 0.00

--- 第 3/4 层: 业务KPI (松弛=5%) ---
  SCIP Status        : OPTIMAL
  Solving Time (sec) : 0.01
  Primal Bound       : +6.405000e+03
    批次偏差: 466.67 (系数=10.0, 惩罚=4666.67)
    目标库存偏差: 195.00 (系数=8.0, 惩罚=1560.00)
    供应目标偏差: 81.67 (系数=8.0, 惩罚=653.33)
    销售优先级: 475.00 (系数=-1.0, 惩罚=-475.00)
  已添加边界约束: 上层目标 ≤ 6725.25

--- 第 4/4 层: 软约束 (松弛=10%) ---
  SCIP Status        : OPTIMAL
  Solving Time (sec) : 0.01
  Primal Bound       : +1.900000e+02
    超库存: 0.00 (系数=5.0, 惩罚=0.00)
    欠库存: 38.00 (系数=5.0, 惩罚=190.00)
    最小供应不足: 0.00 (系数=5.0, 惩罚=0.00)
    最大供应超出: 0.00 (系数=5.0, 惩罚=0.00)

📋 BOM关系验证:
  P1 → 消耗: [S1@WH_Semi×2, R1@WH_RM×3], 被消耗于: []
  P2 → 消耗: [S1@WH_Semi×1], 被消耗于: []
  S1 → 消耗: [R2@WH_RM×2], 被消耗于: [P1@WH_FG×2, P2@WH_FG×1]
  R1 → 消耗: [], 被消耗于: [P1@WH_FG×3]
  R2 → 消耗: [], 被消耗于: [S1@WH_Semi×2]

========== 网状BOM + MRP 排产求解 ==========
成品(根节点) 2 种：P1 P2
生产品 5 种：P1 P2 S1 R1 R2
周期 3 天


═══════════════════ 第 1 天 ═══════════════════
  ▶ 产线视图（按产线分组）
    【L1】产能10h 
      Make-P1(P1): 40件 (耗时4.0h) 
      利用率: 4/10 h (40%)
    【L2】产能10h 
      Make-S1(S1): 50件 (耗时1.7h) 
      利用率: 2/10 h (17%)
    【L3】产能10h 
      Make-P2(P2): 20件 (耗时3.3h) 
      利用率: 3/10 h (33%)
    【SuA】产能无限 (供应商)
      Procure-R1(R1): 200件 (耗时24.0h)
    【SuB】产能无限 (供应商)
      Procure-R1-Alt(R1): 150件 (耗时36.0h)
    【Su1】产能无限 (供应商)
      Procure-R2(R2): 446件 (耗时71.4h)
    【Su2】产能无限 (供应商)
      Procure-R2-Alt(R2): 150件 (耗时45.0h)
  ▶ 产品视图（汇总各产线产量）
    P1@WH_FG: 期初库存20件 → 期末库存0件 [目标20/最小5/最大150] | 到货共40件 [L1(到货40件)] 生产中40件 ⚠需求缺口195件 | 销售255/450件 ⚠未满足195件 [库存耗尽(可用60件, 需求450件)]
    P2@WH_FG: 期初库存10件 → 期末库存0件 [目标15/最小3/最大120] | 到货共20件 [L3(到货20件)] 生产中20件 | 销售30/30件
    S1@WH_Semi: 期初库存50件 → 期末库存0件 [目标30/最小10/最大200] | 到货共50件 [L2(到货50件)] 生产中50件 | 销售0/0件
    R1@WH_RM: 期初库存200件 → 期末库存80件 [目标80/最小50/最大500] | 无到货 | 销售0/0件
    R2@WH_RM: 期初库存100件 → 期末库存0件 [目标40/最小20/最大400] | 无到货 | 销售0/0件
  ▶ 物料需求展开（按BOM逐级展开）
    Make-P1(P1)生产40件 →
    ─── 物料需求汇总 ───
    S1(生产): 期初库存50件, 今日生产50件, 今日需求80件, 期末库存0件
      └ S1需求80件(由P1×2系数)
    ─── 物料需求汇总 ───
    R1(采购): 期初库存200件, 今日生产350件, 今日需求120件, 期末库存80件
      └ R1需求120件(由P1×3系数)
    Make-P2(P2)生产20件 →
    ─── 物料需求汇总 ───
    S1(生产): 期初库存50件, 今日生产50件, 今日需求20件, 期末库存0件
      └ S1需求20件(由P2×1系数)
    Make-S1(S1)生产50件 →
    ─── 物料需求汇总 ───
    R2(采购): 期初库存100件, 今日生产596件, 今日需求100件, 期末库存0件
      └ R2需求100件(由S1×2系数)
    Procure-R1(R1)生产200件 →
    Procure-R1-Alt(R1)生产150件 →
    Procure-R2(R2)生产446件 →
    Procure-R2-Alt(R2)生产150件 →
  ▶ 期末库存    P1@WH_FG=0  P2@WH_FG=0  S1@WH_Semi=0  R1@WH_RM=80  R2@WH_RM=0

═══════════════════ 第 2 天 ═══════════════════
  ▶ 产线视图（按产线分组）
    【L1】产能10h 
      Make-P1(P1): 67件 (耗时6.7h) 
      利用率: 7/10 h (67%)
      Make-P2(P2): 27件 (耗时3.3h) 
      利用率: 3/10 h (33%)
    【L2】产能10h 
      Make-S1(S1): 203件 (耗时6.8h) 
      利用率: 7/10 h (68%)
    【L3】产能10h 
      Make-P2(P2): 16件 (耗时2.7h) 
      利用率: 3/10 h (27%)
    【SuA】产能无限 (供应商)
      （休息）
    【SuB】产能无限 (供应商)
      Procure-R1-Alt(R1): 150件 (耗时36.0h)
    【Su1】产能无限 (供应商)
      Procure-R2(R2): 266件 (耗时42.6h)
    【Su2】产能无限 (供应商)
      Procure-R2-Alt(R2): 150件 (耗时45.0h)
  ▶ 产品视图（汇总各产线产量）
    P1@WH_FG: 上期库存0件 → 期末库存7件 [目标20/最小5/最大150] | 到货共66.7件 [L1(到货67件)] 生产中66.7件 | 销售60/60件
    P2@WH_FG: 上期库存0件 → 期末库存3件 [目标15/最小3/最大120] | 到货共43件 [L1(到货27件), L3(到货16件)] 生产中43件 | 销售40/40件
    S1@WH_Semi: 上期库存0件 → 期末库存27件 [目标30/最小10/最大200] | 到货共203.1件 [L2(到货203件)] 生产中203.1件 | 销售0/0件
    R1@WH_RM: 上期库存80件 → 期末库存80件 [目标80/最小50/最大500] | 到货共200件 [SuA(到货200件)] 生产中150件 | 销售0/0件
    R2@WH_RM: 上期库存0件 → 期末库存40件 [目标40/最小20/最大400] | 到货共446.2件 [Su1(到货446件)] 生产中416.3件 | 销售0/0件
  ▶ 物料需求展开（按BOM逐级展开）
    Make-P1(P1)生产67件 →
    ─── 物料需求汇总 ───
    S1(生产): 期初库存0件, 今日生产203件, 今日需求133件, 期末库存27件
      └ S1需求133件(由P1×2系数)
    ─── 物料需求汇总 ───
    R1(采购): 期初库存80件, 今日生产150件, 今日需求200件, 期末库存80件
      └ R1需求200件(由P1×3系数)
    Make-P2(P2)生产43件 →
    ─── 物料需求汇总 ───
    S1(生产): 期初库存0件, 今日生产203件, 今日需求43件, 期末库存27件
      └ S1需求43件(由P2×1系数)
    Make-S1(S1)生产203件 →
    ─── 物料需求汇总 ───
    R2(采购): 期初库存0件, 今日生产416件, 今日需求406件, 期末库存40件
      └ R2需求406件(由S1×2系数)
    Procure-R1-Alt(R1)生产150件 →
    Procure-R2(R2)生产266件 →
    Procure-R2-Alt(R2)生产150件 →
  ▶ 期末库存    P1@WH_FG=7  P2@WH_FG=3  S1@WH_Semi=27  R1@WH_RM=80  R2@WH_RM=40

═══════════════════ 第 3 天 ═══════════════════
  ▶ 产线视图（按产线分组）
    【L1】产能10h 
      Make-P1(P1): 50件 (耗时5.0h) 
      利用率: 5/10 h (50%)
    【L2】产能10h 
      Make-S1(S1): 143件 (耗时4.8h) 
      利用率: 5/10 h (48%)
    【L3】产能10h 
      Make-P2(P2): 60件 (耗时10.0h) 
      利用率: 10/10 h (100%)
    【SuA】产能无限 (供应商)
      Procure-R1(R1): 200件 (耗时24.0h)
    【SuB】产能无限 (供应商)
      Procure-R1-Alt(R1): 150件 (耗时36.0h)
    【Su1】产能无限 (供应商)
      Procure-R2(R2): 200件 (耗时32.0h)
    【Su2】产能无限 (供应商)
      Procure-R2-Alt(R2): 150件 (耗时45.0h)
  ▶ 产品视图（汇总各产线产量）
    P1@WH_FG: 上期库存7件 → 期末库存17件 [目标20/最小5/最大150] | 到货共50件 [L1(到货50件)] 生产中50件 | 销售40/40件
    P2@WH_FG: 上期库存3件 → 期末库存13件 [目标15/最小3/最大120] | 到货共59.9件 [L3(到货60件)] 生产中59.9件 | 销售50/50件
    S1@WH_Semi: 上期库存27件 → 期末库存10件 [目标30/最小10/最大200] | 到货共143.1件 [L2(到货143件)] 生产中143.1件 | 销售0/0件
    R1@WH_RM: 上期库存80件 → 期末库存80件 [目标80/最小50/最大500] | 到货共150件 [SuB(到货150件)] 生产中350件 | 销售0/0件
    R2@WH_RM: 上期库存40件 → 期末库存20件 [目标40/最小20/最大400] | 到货共266.3件 [Su1(到货266件)] 生产中350件 | 销售0/0件
  ▶ 物料需求展开（按BOM逐级展开）
    Make-P1(P1)生产50件 →
    ─── 物料需求汇总 ───
    S1(生产): 期初库存27件, 今日生产143件, 今日需求100件, 期末库存10件
      └ S1需求100件(由P1×2系数)
    ─── 物料需求汇总 ───
    R1(采购): 期初库存80件, 今日生产350件, 今日需求150件, 期末库存80件
      └ R1需求150件(由P1×3系数)
    Make-P2(P2)生产60件 →
    ─── 物料需求汇总 ───
    S1(生产): 期初库存27件, 今日生产143件, 今日需求60件, 期末库存10件
      └ S1需求60件(由P2×1系数)
    Make-S1(S1)生产143件 →
    ─── 物料需求汇总 ───
    R2(采购): 期初库存40件, 今日生产350件, 今日需求286件, 期末库存20件
      └ R2需求286件(由S1×2系数)
    Procure-R1(R1)生产200件 →
    Procure-R1-Alt(R1)生产150件 →
    Procure-R2(R2)生产200件 →
    Procure-R2-Alt(R2)生产150件 →
  ▶ 期末库存    P1@WH_FG=17  P2@WH_FG=13  S1@WH_Semi=10  R1@WH_RM=80  R2@WH_RM=20

═══════════════════ KPI 汇总 ═══════════════════
目标函数值 (最小总惩罚): 190.00
需求缺口惩罚:   19500.00 (权重100 × 195.00)
批次偏差惩罚:   5124.27 (权重10 × 512.43)
超库存惩罚:     0.00 (权重5 × 0.00)
欠库存惩罚:     190.00 (权重5 × 38.00)
目标库存偏差:   1432.35 (权重8 × 179.04)
产能超载惩罚:   0.00 (权重20 × 0.00)
供应目标偏差:   643.62 (权重8 × 80.45)
最小供应不足:   0.00 (权重5 × 0.00)
最大供应超出:   0.00 (权重5 × 0.00)
销售优先级(负): 475.00 (权重1 × 475.00)

⚠ 注意：存在需求缺口，部分订单未满足。

═══════════════════ 求解统计 ═══════════════════
变量数：218
约束数：168
耗时：0.085 秒


═══════════════════ 分层优化汇总 ═══════════════════
层级     名称             松弛比例         最优值          包含KPI
1      需求满足           0%           19500.00     需求缺口
2      产能约束           0%           0.00         产能超载
3      业务KPI          5%           6405.00      批次偏差, 目标库存偏差, 供应目标偏差, 销售优先级
4      软约束            10%          190.00       超库存, 欠库存, 最小供应不足, 最大供应超出

--- 最终 KPI 值 (加权总惩罚) ---
  加权总惩罚: 26415.25
  需求缺口:   19500.00 (权重100 × 195.00)
  产能超载:   0.00 (权重20 × 0.00)
  批次偏差:   5124.27 (权重10 × 512.43)
  目标库存偏差: 1432.35 (权重8 × 179.04)
  供应目标偏差: 643.62 (权重8 × 80.45)
  超库存:     0.00 (权重5 × 0.00)
  欠库存:     190.00 (权重5 × 38.00)
  最小供应不足: 0.00 (权重5 × 0.00)
  最大供应超出: 0.00 (权重5 × 0.00)
  销售优先级(负): 475.00 (权重1 × 475.00)
15:49:47.930 [main] INFO com.aps.service.plan.SceneService - 保存成功，场景ID: 1, 文件: F:\product\MES\hyh.apsj\mp\result\optimization_result_1.json

[OK] 优化结果JSON已导出: true
=== 运行结束 ===
