=== MacroPlanner 优化器运行日志 ===
=== 运行时间: 2026-08-11 16:47:50 ===

=== 开始构建 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] | +21约束
  [信息] [7. 供应规格] ΣPTQty + Slack ≥ Target/Min/Max | +14约束
  [信息] [8. 批次大小] PTQty×QTPFactor + Slack ∈ [LotSize] | +24约束
  [信息] [9. KPI汇总] TotalKPI = Σ 松弛变量 (12个KPI) | +10约束 | +12变量
  [信息] ========== 约束构建完成: 总计 177 约束, 242 变量 ==========
  [OK] 约束与KPI汇总创建完成
  [OK] 目标函数创建完成
  [OK] LP模型文件已导出: F:\product\MES\hyh.apsj\mp\lp\model.lp

模型统计: 变量=242, 约束=177

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

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

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

--- 第 3/4 层: 业务KPI (松弛=5%) ---
  SCIP Status        : OPTIMAL
  Solving Time (sec) : 0.01
  Primal Bound       : +8.430000e+03
    批次偏差: 570.00 (系数=10.0, 惩罚=5700.00)
    目标库存偏差: 255.00 (系数=8.0, 惩罚=2040.00)
    供应目标偏差: 120.00 (系数=8.0, 惩罚=960.00)
    销售优先级: 270.00 (系数=-1.0, 惩罚=-270.00)
  已添加边界约束: 上层目标 ≤ 8851.50

--- 第 4/4 层: 软约束 (松弛=10%) ---
  SCIP Status        : OPTIMAL
  Solving Time (sec) : 0.01
  Primal Bound       : +3.550000e+02
    超库存: 0.00 (系数=5.0, 惩罚=0.00)
    欠库存: 71.00 (系数=5.0, 惩罚=355.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%)
      Make-P2(P2): 20件 (耗时2.5h) 
      利用率: 3/10 h (25%)
    【L2】产能10h 
      Make-S1(S1): 50件 (耗时1.7h) 
      利用率: 2/10 h (17%)
    【L3】产能10h 
      （休息）
    【SuA】产能24h 
      Procure-R1(R1): 165件 (耗时19.8h) , 批次200
      利用率: 20/24 h (83%)
    【SuB】产能24h 
      Procure-R1-Alt(R1): 100件 (耗时24.0h) , 批次150
      利用率: 24/24 h (100%)
    【Su1】产能24h 
      Procure-R2(R2): 346件 (耗时55.4h) , 批次200
      利用率: 55/24 h (231%)
    【Su2】产能100h 
      Procure-R2-Alt(R2): 150件 (耗时45.0h) , 批次150
      利用率: 45/100 h (45%)
  ▶ 产品视图（汇总各产线产量）
    P1@WH_FG: 期初库存20件 → 期末库存10件 [目标20/最小5/最大150] | 到货共40件 [L1(到货40件)] 生产中40件 | 销售50/50件
    P2@WH_FG: 期初库存10件 → 期末库存0件 [目标15/最小3/最大120] | 到货共20件 [L1(到货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件, 今日生产265件, 今日需求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件, 今日生产496件, 今日需求100件, 期末库存0件
      └ R2需求100件(由S1×2系数)
    Procure-R1(R1)生产165件 →
    Procure-R1-Alt(R1)生产100件 →
    Procure-R2(R2)生产346件 →
    Procure-R2-Alt(R2)生产150件 →
  ▶ 期末库存    P1@WH_FG=10  P2@WH_FG=0  S1@WH_Semi=0  R1@WH_RM=80  R2@WH_RM=0

═══════════════════ 第 2 天 ═══════════════════
  ▶ 产线视图（按产线分组）
    【L1】产能10h 
      Make-P2(P2): 24件 (耗时3.0h) 
      利用率: 3/10 h (30%)
    【L2】产能10h 
      Make-S1(S1): 163件 (耗时5.4h) 
      利用率: 5/10 h (54%)
    【L3】产能10h 
      Make-P1(P1): 55件 (耗时6.9h) 
      利用率: 7/10 h (69%)
      Make-P2(P2): 19件 (耗时3.1h) 
      利用率: 3/10 h (31%)
    【SuA】产能24h 
      Procure-R1(R1): 5件 (耗时0.6h) , 批次200
      利用率: 1/24 h (3%)
    【SuB】产能24h 
      Procure-R1-Alt(R1): 100件 (耗时24.0h) , 批次150
      利用率: 24/24 h (100%)
    【Su1】产能24h 
      Procure-R2(R2): 194件 (耗时31.0h) , 批次200
      利用率: 31/24 h (129%)
    【Su2】产能100h 
      Procure-R2-Alt(R2): 150件 (耗时45.0h) , 批次150
      利用率: 45/100 h (45%)
  ▶ 产品视图（汇总各产线产量）
    P1@WH_FG: 上期库存10件 → 期末库存5件 [目标20/最小5/最大150] | 到货共55件 [L3(到货55件)] 生产中55件 | 销售60/60件
    P2@WH_FG: 上期库存0件 → 期末库存3件 [目标15/最小3/最大120] | 到货共43件 [L1(到货24件), L3(到货19件)] 生产中43件 | 销售40/40件
    S1@WH_Semi: 上期库存0件 → 期末库存10件 [目标30/最小10/最大200] | 到货共163件 [L2(到货163件)] 生产中163件 | 销售0/0件
    R1@WH_RM: 上期库存80件 → 期末库存80件 [目标80/最小50/最大500] | 到货共165件 [SuA(到货165件)] 生产中105件 | 销售0/0件
    R2@WH_RM: 上期库存0件 → 期末库存20件 [目标40/最小20/最大400] | 到货共346件 [Su1(到货346件)] 生产中344件 | 销售0/0件
  ▶ 物料需求展开（按BOM逐级展开）
    Make-P1(P1)生产55件 →
    ─── 物料需求汇总 ───
    S1(生产): 期初库存0件, 今日生产163件, 今日需求110件, 期末库存10件
      └ S1需求110件(由P1×2系数)
    ─── 物料需求汇总 ───
    R1(采购): 期初库存80件, 今日生产105件, 今日需求165件, 期末库存80件
      └ R1需求165件(由P1×3系数)
    Make-P2(P2)生产43件 →
    ─── 物料需求汇总 ───
    S1(生产): 期初库存0件, 今日生产163件, 今日需求43件, 期末库存10件
      └ S1需求43件(由P2×1系数)
    Make-S1(S1)生产163件 →
    ─── 物料需求汇总 ───
    R2(采购): 期初库存0件, 今日生产344件, 今日需求326件, 期末库存20件
      └ R2需求326件(由S1×2系数)
    Procure-R1(R1)生产5件 →
    Procure-R1-Alt(R1)生产100件 →
    Procure-R2(R2)生产194件 →
    Procure-R2-Alt(R2)生产150件 →
  ▶ 期末库存    P1@WH_FG=5  P2@WH_FG=3  S1@WH_Semi=10  R1@WH_RM=80  R2@WH_RM=20

═══════════════════ 第 3 天 ═══════════════════
  ▶ 产线视图（按产线分组）
    【L1】产能10h 
      Make-P1(P1): 35件 (耗时3.5h) 
      利用率: 4/10 h (35%)
      Make-P2(P2): 47件 (耗时5.9h) 
      利用率: 6/10 h (59%)
    【L2】产能10h 
      Make-S1(S1): 107件 (耗时3.6h) 
      利用率: 4/10 h (36%)
    【L3】产能10h 
      （休息）
    【SuA】产能24h 
      Procure-R1(R1): 200件 (耗时24.0h) , 批次200
      利用率: 24/24 h (100%)
    【SuB】产能24h 
      Procure-R1-Alt(R1): 100件 (耗时24.0h) , 批次150
      利用率: 24/24 h (100%)
    【Su1】产能24h 
      Procure-R2(R2): 150件 (耗时24.0h) , 批次200
      利用率: 24/24 h (100%)
    【Su2】产能100h 
      Procure-R2-Alt(R2): 150件 (耗时45.0h) , 批次150
      利用率: 45/100 h (45%)
  ▶ 产品视图（汇总各产线产量）
    P1@WH_FG: 上期库存5件 → 期末库存0件 [目标20/最小5/最大150] | 到货共35件 [L1(到货35件)] 生产中35件 | 销售40/40件
    P2@WH_FG: 上期库存3件 → 期末库存0件 [目标15/最小3/最大120] | 到货共47件 [L1(到货47件)] 生产中47件 | 销售50/50件
    S1@WH_Semi: 上期库存10件 → 期末库存0件 [目标30/最小10/最大200] | 到货共107件 [L2(到货107件)] 生产中107件 | 销售0/0件
    R1@WH_RM: 上期库存80件 → 期末库存80件 [目标80/最小50/最大500] | 到货共105件 [SuA(到货5件), SuB(到货100件)] 生产中300件 | 销售0/0件
    R2@WH_RM: 上期库存20件 → 期末库存0件 [目标40/最小20/最大400] | 到货共194件 [Su1(到货194件)] 生产中300件 | 销售0/0件
  ▶ 物料需求展开（按BOM逐级展开）
    Make-P1(P1)生产35件 →
    ─── 物料需求汇总 ───
    S1(生产): 期初库存10件, 今日生产107件, 今日需求70件, 期末库存0件
      └ S1需求70件(由P1×2系数)
    ─── 物料需求汇总 ───
    R1(采购): 期初库存80件, 今日生产300件, 今日需求105件, 期末库存80件
      └ R1需求105件(由P1×3系数)
    Make-P2(P2)生产47件 →
    ─── 物料需求汇总 ───
    S1(生产): 期初库存10件, 今日生产107件, 今日需求47件, 期末库存0件
      └ S1需求47件(由P2×1系数)
    Make-S1(S1)生产107件 →
    ─── 物料需求汇总 ───
    R2(采购): 期初库存20件, 今日生产300件, 今日需求214件, 期末库存0件
      └ R2需求214件(由S1×2系数)
    Procure-R1(R1)生产200件 →
    Procure-R1-Alt(R1)生产100件 →
    Procure-R2(R2)生产150件 →
    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

═══════════════════ KPI 汇总 ═══════════════════
目标函数值 (最小总惩罚): 355.00
需求缺口惩罚:   0.00 (权重100 × 0.00)
批次偏差惩罚:   5820.00 (权重10 × 582.00)
超库存惩罚:     0.00 (权重5 × 0.00)
欠库存惩罚:     355.00 (权重5 × 71.00)
目标库存偏差:   2136.00 (权重8 × 267.00)
产能超载惩罚:   768.00 (权重20 × 38.40)
供应目标偏差:   1165.50 (权重8 × 145.69)
最小供应不足:   0.00 (权重5 × 0.00)
最大供应超出:   0.00 (权重5 × 0.00)
销售优先级(负): 270.00 (权重1 × 270.00)

═══════════════════ 求解统计 ═══════════════════
变量数：242
约束数：180
耗时：0.131 秒


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

--- 最终 KPI 值 (加权总惩罚) ---
  加权总惩罚: 9974.50
  需求缺口:   0.00 (权重100 × 0.00)
  产能超载:   768.00 (权重20 × 38.40)
  批次偏差:   5820.00 (权重10 × 582.00)
  目标库存偏差: 2136.00 (权重8 × 267.00)
  供应目标偏差: 1165.50 (权重8 × 145.69)
  超库存:     0.00 (权重5 × 0.00)
  欠库存:     355.00 (权重5 × 71.00)
  最小供应不足: 0.00 (权重5 × 0.00)
  最大供应超出: 0.00 (权重5 × 0.00)
  销售优先级(负): 270.00 (权重1 × 270.00)
16:47:54.837 [main] INFO com.aps.service.plan.SceneService - 保存成功，场景ID: 1, 文件: F:\product\MES\hyh.apsj\mp\result\optimization_result_1.json

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