粗排引擎 (Rough-Cut Scheduler) Functional Spec

來源:rough-cut-scheduler(含 2026-06-03 素材 #4、2026-06-04 收斂) 下游:OOA 共用物件:domain-modelVSM投產單可用產能/Freeze 的定義在此;本 spec 僅就粗排所需投影、不重述定義) 狀態:已簽核 驗證:rough-cut-scheduler.fp.validate.py(I/O 範例自洽性檢核,已通過;.py 不上站)→ 執行結果 rough-cut-scheduler.fp.validate-output.md


概述

提供一個快速、純試算的粗排引擎:給定一批投產單與既有 VSM可用產能,為每個 VSM 節點算出 LSD最晚開工日)、LeanPlay 交期與投產順序,作為細排引擎的 input 之一。顆粒度到「天」,不寫回/不鎖定產能。

兩個方向、各算一個輸出(2026-06-03 收斂;2026-06-04 修正上游 JIT 拉動):

  • LeanPlay 交期=以節拍點為節奏點求「最早可完工」:

    1. 自起排日(參數,預設今天+1)正推,求節拍點的最早可開工日(這步只為定出「第一個日期」);
    2. 節拍點有限產能堆疊、不足往後一天,定下節拍點的當日;
    3. 節拍點當日往前拉動上游 N-x(JIT、緊鄰節拍點、不留閒置)、往後推動下游 N+y;末站完工=產品 LeanPlay 交期

    為什麼要先正推?因為一開始沒有任何錨點,得先用「自前站往後推」算出節拍點最早能落在哪天;錨點一旦定下,上游就改由節拍點往前拉、下游往後推。節拍點若被排擠往後(§RCS-FS-2),其上游前製程隨之整段往後(§RCS-FS-15),不會停在原地空等。

  • LSD=自投產單交期「反推」(最晚開工,純 leadtime、不看產能)。

兩者一前一後夾出餘裕:LeanPlay 告訴你「最早何時能完工」、LSD 告訴你「最晚何時得開工,否則必逾期」。

本次範圍=核心粗排引擎(細排 input)。產銷協調互動入口(確認時間/確認影響)明確不做、留下一期(見 §requirement 覆蓋對照)。 Freeze 看板產能在引擎外就已決定,引擎只把它當「可用產能」的一部分讀入,不在引擎內設定。 多單搶節拍點產能時,處理先後依投產單prioritySeq(進入順序)、非交期(#15)。注意 prioritySeq(輸入處理順序)與「投產順序」(輸出、依 LeanPlay 完工日排序)是兩個不同概念。 節拍點多機台(棋盤)+ eligibility(2026-06-09 新增,對應 #17):一個節拍點(製程-工作站)對應多台機台,每台帶工作能力與每日可用;某 VSMNode 只能用工作能力涵蓋其製程-工作站的 eligible 機台(如 LASR-L2 只有 LA02 能做)。粗排不安排實際機台與時間,僅為尊重能力限制而在內部以「機台×日」記產能扣減;輸出仍只有 {LSD, LeanPlay, 投產順序}、不含機台。多 eligible 機台分配本期用固定機台序(§RCS-FS-18)、最佳化與純機台硬綁延後(見 §待裁定)。原「節拍點一次只做一張單」為此模型 N=1 的退化。


Use Cases

UC A1: 觸發粗排排單

  • Actor:生管
  • 前置條件VSM節拍點 VSMNode 帶製程-工作站)、可用產能(下沉到「機台×日」、各機台帶工作能力;已含外部決定的 Freeze)、投產單(含交期與 prioritySeq)、x-y 設定檔(本期固定 CT×數量+CO)、起排日參數(預設今天+1)皆已備妥。 (Freeze 的時間範圍、x-y 的最終策略選定、機台分配最佳化、純機台硬綁:本期保留、不在此設計。)
  • 觸發條件:一批投產單就緒,生管要產出粗排結果
  • 行為
    1. 生管啟動粗排(前端顯示 loading)
    2. (系統黑箱:依 prioritySeq 逐張處理;每張單先正推定錨求節拍點最早日 → 在節拍點eligible 機台(工作能力 match 該 VSMNode 製程-工作站)中找有 L 連續可用日者佔用該台;所有 eligible 機台皆不足才往後一天;再由節拍點往前拉動上游/往後推動下游得 LeanPlay 交期;另由交期反推得各節點 LSD,內部處理見 §流程圖 圖 1)
    3. 系統回傳整包粗排結果
    4. 生管取得結果,其中投產順序交付現場參考整批投產節奏;整包亦可供下游細排取用(UC A2)
  • 預期結果:每個 VSM 節點 = {LSD, LeanPlay 交期, 投產順序};純試算、不寫回/鎖定產能;顆粒度到天;輸出不含機台指派(機台×日僅為內部 eligibility 記帳)
  • 例外路徑:無節拍點 §RCS-FS-1節拍點 eligible 機台全滿 §RCS-FS-2§RCS-FS-16、交期早於當日 §RCS-FS-3、空批次 §RCS-FS-8、eligibility 限制可用機台子集 §RCS-FS-17、多 eligible 機台分配 §RCS-FS-18eligible 空集拋例外 §RCS-FS-19(除 §RCS-FS-19 中止外,皆在黑箱內發生,對生管表現為結果中的標註)

UC A2: 細排引擎取用粗排結果

  • Actor細排引擎(程式消費方)
  • 觸發條件:一次粗排完成、結果已產出
  • 行為
    1. 讀取整包粗排結果(每個 VSM 節點的 LSDLeanPlay 交期/投產順序)
    2. 當作細排自身排程的 input 之一
  • 預期結果細排取得粗排輸出作為輸入;介面輪廓為「整包 VSM 節點標記」(欄位細節留 Stage 3)
  • 例外路徑:空粗排結果 §RCS-FS-8

流程圖 / 資料結構

圖 1:UC A1 系統處理流程(黑箱內部)

生管只見 啟動 → loading → 取得結果;下圖為中間黑箱的系統處理。決策節點各對應一條 §邊界條件。 LeanPlay 以節拍點為節奏點:先正推求節拍點最早可開工日(定錨)→ 有限產能堆疊定下節拍點當日 → 由節拍點往前拉動上游(N-x,JIT)、往後推動下游(N+y);LSD 另以交期反推、不看產能。 引擎只產出日期(LSD/LeanPlay/投產順序),不比對 LeanPlay 交期 vs 投產單交期、不判 overdue;逾期與否屬下游前端/應用的事(§RCS-FS-7)。

flowchart TD
    Start([生管啟動粗排]) --> Load[載入投產單批次 / VSM / 可用產能(已含外部決定的 Freeze)]
    Load --> Empty{投產單批次為空?}
    Empty -- 是 --> EmptyOut([回傳空粗排結果 ・§RCS-FS-8])
    Empty -- 否 --> Sort[依 prioritySeq 進入順序排序投產單 ・§RCS-FS-12]
    Sort --> Pick[取下一張投產單]
    Pick --> Takt{該 VSM 有節拍點?}
    Takt -- 否 --> Last[以最後一站為節拍點 ・§RCS-FS-1]
    Takt -- 是 --> Use[採用指定節拍點]
    Last --> Anchor
    Use --> Anchor["定錨:前站自起排日(預設今天+1・§RCS-FS-11)正推,求節拍點『最早可開工日』"]
    Anchor --> Elig{節拍點有 eligible 機台?(工作能力 match 製程-工作站)}
    Elig -- 否(空集)--> Throw([拋『無可用資源』例外、中止 ・§RCS-FS-19])
    Elig -- 是 --> Cap{eligible 機台中有一台 連續可用日足夠? ・§RCS-FS-17}
    Cap -- 否(全滿)--> NextDay[所有 eligible 機台皆不足 → 往後一天 ・§RCS-FS-2/§RCS-FS-16]
    NextDay --> Cap
    Cap -- 是 --> Stack["佔用該 eligible 機台 L 連續日(固定機台序・§RCS-FS-18;內部記帳、不輸出機台)"]
    Stack --> Pull["往前拉動上游 N-x:由節拍點當日反推,緊鄰節拍點、JIT 不留閒置(節拍點後移則上游隨之後移 ・§RCS-FS-15)"]
    Pull --> Down[往後推動下游 N+y 至末站(隔天開工)]
    Down --> Lean[末站完工 = 該單 LeanPlay 交期;逐節點記 LeanPlay 完工]
    Lean --> LSD[另由交期反推各節點 LSD:純 leadtime、不看產能 ・§RCS-FS-13]
    LSD --> More{還有投產單?}
    More -- 是 --> Pick
    More -- 否 --> Seq[全單混排:所有節點依 LeanPlay 完工日排序 → 投產順序 ・§RCS-FS-12]
    Seq --> Assemble[彙整每節點 = LSD / LeanPlay 交期 / 投產順序]
    Assemble --> Out([回傳整包粗排結果])

圖 2:VSM 製程樹結構(toy 示意,9 站)

實際 VSM製程樹(多上游匯流)。下列 toy 以兩條不等長上游分支匯流到節拍點 A、A 後接三道下游,I/O 範例與驗證 script 皆以此為準。

flowchart LR
    B1[B1 下料] --> B2[B2 折床]
    C1[C1 下料] --> C2[C2 沖孔] --> C3[C3 去毛邊]
    B2 --> A["A 組裝 ★節拍點 N"]
    C3 --> A
    A --> D1[D1 焊接] --> D2[D2 噴漆] --> D3[D3 包裝出貨]

拉動/推動 = 節拍點前後兩個「區域」的命名(x、y 為其位移參數=各站 leadtime):節拍點前為上游拉動區 N-x(B1、B2、C1、C2、C3),節拍點後為下游推動區 N+y(D1、D2、D3)。 方向說明:在 LeanPlay 中,節拍點是節奏點,上游拉動區由節拍點當日往前拉(JIT),故各上游分支都緊鄰節拍點完工、不留閒置:例如 B 分支(短分支)被拉到 B2 06-05 完工(緊接 A 06-06 開工),而非停在 06-04 空等;C 分支(長分支=關鍵路徑)C3 06-05 完工,兩分支在 A 前對齊。下游推動區則由節拍點當日往後推。節拍點若被排擠後移,整個上游拉動區隨之後移(§RCS-FS-15)。LSD(反推)則另以交期為錨把各站「拉到最晚」,與 LeanPlay 的差即餘裕。選 A(B、C 分支匯流處)為節拍點,可同時示範「對分支拉動」與「對下游推動」。

圖 3:粗排輸出結構(對外觀察,非內部類別)

flowchart TD
    Order["投產單 #5001・產品 P・數量 100・交期 2026-06-15・prioritySeq 1"] --> VSM[VSM 製程樹 9 節點]
    VSM --> UB["上游 B 分支:B1 下料 / B2 折床"]
    VSM --> UC["上游 C 分支:C1 下料 / C2 沖孔 / C3 去毛邊"]
    VSM --> NA["★節拍點 A 組裝"]
    VSM --> DN["下游 D:D1 焊接 / D2 噴漆 / D3 包裝出貨"]
    UB --> Mark["每節點掛:LSD / LeanPlay 交期 / 投產順序"]
    UC --> Mark
    NA --> Mark
    DN --> Mark

I/O 範例

共用物件投影:本節 input 的 投產單 / VSM / 可用產能 / Freeze 為跨 feature 共用物件,定義見 domain-model,此處不重述,僅給粗排所需投影 + 具體情境值。粗排投影:投產單{poNo, product, qty, dueDate, prioritySeq}VSM製程樹拓樸 + 各節點 CTCO可用產能用各節點每日可用(含 Freeze 預佔日)。

Toy 參數(一次定死,所有數字由此推導)。約定:工作日=480 分;Leadtime = ceil((CT×數量+CO)/480);節點佔 L 連續日、完工日=最後一日;下游隔天開工;節拍點 A 一次只做一張單、需 L 連續可用日,最早可開工日被佔→往後一天(§RCS-FS-2);今天=2026-06-02;起排日(正推起點)=今天+1=2026-06-03;toy 忽略週末(行事曆屬可用產能輸入)。

角色CT(分/件)CO(分)Leadtime(qty=100)
§RCS-FS-1 下料上游(拉動 N-x)2401 天
§RCS-FS-2 折床上游(拉動 N-x)4801 天
C1 下料上游(拉動 N-x)2401 天
C2 沖孔上游(拉動 N-x)2601 天
C3 去毛邊上游(拉動 N-x)1401 天
A 組裝節拍點 N61202 天
D1 焊接下游(推動 N+y)3601 天
D2 噴漆下游(推動 N+y)2801 天
D3 包裝出貨下游(推動 N+y)101 天

LSD vs LeanPlay:兩者各有錨點,LeanPlay 以節拍點為錨(正推求節拍點最早日 → 上游往前拉、下游往後推,得最早可完工)、LSD 以交期為錨(純反推,得最晚可開工)。兩者之差即各節點餘裕。完整逐節點表與甘特圖見 §驗證執行結果(由 script 自動產出)。

UC A1

正常值(單張、產能充足)

  • input:
    投產單 = [ { poNo: 5001, product: P, qty: 100, dueDate: 2026-06-15, prioritySeq: 1 } ]
    可用產能 = 節拍點 A 全部日皆空(外部 Freeze 未佔用)
    起排日 = 2026-06-03(今天+1);x/y設定檔 = CT×數量+CO
    
  • output:(節拍點 A 最早可開工日 06-06、占 06-06~06-07;上游由 A 往前 JIT 拉動,下游往後推動)
    節點          LSD(交期反推)  LeanPlay完工(節拍點錨定)  序
    C1 下料       2026-06-08    2026-06-03               1
    B1 下料       2026-06-09    2026-06-04               2
    C2 沖孔       2026-06-09    2026-06-04               3
    B2 折床       2026-06-10    2026-06-05               4
    C3 去毛邊     2026-06-10    2026-06-05               5
    A 組裝 ★N     2026-06-11    2026-06-07               6
    D1 焊接       2026-06-13    2026-06-08               7
    D2 噴漆       2026-06-14    2026-06-09               8
    D3 包裝出貨   2026-06-15    2026-06-10               9
    產品LeanPlay交期 = 2026-06-10(最早可完工日,早於交期 06-15;引擎不判 overdue,比對由下游做)
    

    上游 JIT 拉動:B 分支(短)被拉到緊鄰節拍點完工(B2 06-05、B1 06-04),不停在 06-04/06-03 空等;C 分支(長=關鍵路徑)C3 06-05,兩分支在 A 06-06 開工前對齊。 「序」的定義:投產順序=該節點 LeanPlay 完工日在整批(全單混排)中的名次,連續編號 1..N。單張單即 1..9;多張單時所有單所有節點混成單一排序(見邊界值,1..18)。同一完工日的節點先後不具意義(如 B1、C2 同為 06-04,序 2/3 可互換)。

[邊界值(早交期但 prioritySeq 在後 → 被排擠、LeanPlay 晚於交期,§RCS-FS-2 + §RCS-FS-12 + §RCS-FS-15)](rough-cut-scheduler.fp.validate-output.md#邊界值早交期但-priorityseq-在後—被排擠leanplay-晚於交期rcs-fs-2—rcs-fs-12—rcs-fs-15)

  • input:
    投產單 = [
      { poNo: 5001, product: P, qty: 100, dueDate: 2026-06-20, prioritySeq: 1 },
      { poNo: 5002, product: P, qty: 100, dueDate: 2026-06-11, prioritySeq: 2 }
    ]
    處理先後:依 prioritySeq(5001 先於 5002)——注意 5002 交期較早卻排在後
    
  • output:
    5001(prioritySeq 1,A 占 06-06~06-07):
      產品LeanPlay交期=2026-06-10(早於交期 06-20)
    5002(prioritySeq 2,被排擠):
      節拍點最早可開工 06-06 被 5001 佔 → §RCS-FS-2 A 推到 06-08~06-09
      §RCS-FS-15 上游隨節拍點整段往後:5002 上游由 06-03~05 改排到 06-05~07(JIT、不空等)
      產品LeanPlay交期=2026-06-12(較交期 06-11 晚 1 天;引擎只給日期、不判 overdue)
    全單混排序(18 節點依 LeanPlay 完工日連續編號 1..18):
      5001 取 {1,2,3,4,5,9,12,13,15}、5002 取 {6,7,8,10,11,14,16,17,18};節拍點 A:5001=序 9、5002=序 14
    

    這就是 prioritySeq 決策的後果:5002 交期較早,但因 prioritySeq 在後而被排擠,使其 LeanPlay 交期晚於交期。若改用「交期排序」則 5002 會先佔產能、LeanPlay 早於交期;引擎只忠實輸出日期(§RCS-FS-7),是否算逾期、是否調整 prioritySeq 都由下游/人決定。 上游隨節拍點後移(§RCS-FS-15):5002 的節拍點被推到 06-08,其前製程不停在原地空等,而是整段往後到 06-05~07 緊鄰節拍點;甘特圖可見 5002 的上游條整段右移。逐節點表 + 甘特圖見 §驗證執行結果

異常值

  • [(a) 空批次(§RCS-FS-8)](rough-cut-scheduler.fp.validate-output.md#異常值-a空批次rcs-fs-8):
    input:  投產單 = []
    output: 粗排結果 = []   (不報錯,合法空輸入)
    
  • [(b) 投產單交期早於今日(§RCS-FS-3、未解 #10)](rough-cut-scheduler.fp.validate-output.md#異常值-b投產單交期早於今日rcs-fs-3未解-10):
    input:  投產單 = [ { poNo: 5005, product: P, qty: 100, dueDate: 2026-06-01, prioritySeq: 1 } ]  // < 今日 06-02
    output: LeanPlay 排程仍落在未來(06-03~06-10)——節拍點由起排日正推定錨、永不夾到過去;
            只有 LSD 反推落於過去(05-25 等、視為無意義);產品 LeanPlay 06-10 晚於交期 06-01
            引擎照樣產出日期、不判 overdue、不擋下(是否逾期由下游比對,容忍)
    

    正推定錨的副產品:節拍點當日由起排日正推求得(§RCS-FS-11),上游再由節拍點往前拉、但關鍵路徑葉站不早於起排日,故交期早於今日的投產單其 LeanPlay 排程不會落在過去;落在過去的只有 LSD 反推值。引擎不對此下逾期判定;若日後要對「交期早於今日」做別的處理,屬 §RCS-FS-3 規則變更,需另開討論。

UC A1 — eligibility 場景(節拍點多機台「棋盤」)

專用 toy(聚焦節拍點一站,與上方 9 站 toy 獨立):工作站 L 兩台機台,LA01 工作能力 {LASR-L}、LA02 工作能力 {LASR-L, LASR-L2}。各單在節拍點 L=1 天、最早可開工日皆 2026-06-03、06-03 起兩台全空、分配用固定機台序(§RCS-FS-18,id 小先)。機台僅內部記帳、輸出不含機台。

正常值(棋盤並行)

  • input:
    投產單 = [ {poNo:5201, 節拍點製程-工作站:LASR-L, prioritySeq:1},
              {poNo:5202, 節拍點製程-工作站:LASR-L, prioritySeq:2} ]   // 兩單 eligible = {LA01, LA02}
    
  • output:
    5201 節拍點 = 2026-06-03(內部佔 LA01)
    5202 節拍點 = 2026-06-03(內部佔 LA02,與 5201 並行)
    

    對照木桶(N=1):5202 會被擠到 06-04;棋盤兩台並行、同日完工。

邊界值(eligibility 排擠 ── 對照「總產能」高估)

  • input:
    投產單 = [ {poNo:5301, 節拍點製程-工作站:LASR-L2, prioritySeq:1},
              {poNo:5302, 節拍點製程-工作站:LASR-L2, prioritySeq:2} ]   // 兩單 eligible = {LA02} only
    
  • output:
    5301 節拍點 = 2026-06-03(內部佔 LA02)
    5302 節拍點 = 2026-06-04(LA02 於 06-03 已滿、LA01 不可用 → §RCS-FS-16 推一天);LA01 於 06-03 整天空著
    

    這就是 #17 的核心:「總產能」視角=06-03 有 2 台空位 → 誤判兩單都能 06-03 完工;eligibility 實況=LASR-L2 只有 LA02 能做 → 第二單必擠到 06-04。總產能高估了受限零件的可用量。

異常值(eligible 空集 → 拋例外)

  • input:
    投產單 = [ {poNo:5401, 節拍點製程-工作站:LASR-L9, prioritySeq:1} ]   // 無任何機台有 LASR-L9 能力
    
  • output:
    拋「無可用資源」例外、中止該次粗排(§RCS-FS-19;視為資料/設定錯誤,fail-fast)
    

UC A2

  • input:
    整包粗排結果(UC A1 的 output:每節點 LSD / LeanPlay 交期 / 投產順序)
    
  • output:
    細排引擎將其納為自身排程的 input 之一(本層只定介面輪廓,欄位細節留 Stage 3)
    

邊界條件 / 異常情境

  • §RCS-FS-1
  • §RCS-FS-2
    • 條件:節拍點自最早可開工日起連續可用日不足
    • 結果:往後推一天再找連續可用日堆疊;可能使 LeanPlay 交期晚於投產單交期(排擠)
  • §RCS-FS-3
    • 條件:投產單交期早於當日
    • 結果:LeanPlay 仍由節拍點正推定錨(落未來、不夾到過去);LSD 反推落於過去、視為無意義;引擎照常產出日期、不判 overdue、不擋下(是否逾期由下游比對,對應 #10)
  • §RCS-FS-4
    • 條件:節拍點站別含多製程(生管認知模糊)
    • 結果:初期僅支援單一「工作站-製程」;多製程節拍點超出本期範圍(對應 #8)。註:此為對 domain-model VSM identity「工單-料號-工作站-製程-工序」的階段範圍收斂、非定義衝突
  • §RCS-FS-5
    • 條件:物料到料時點未知
    • 結果:初期不考慮到料功能,僅保留「需要哪些料」(對應 #4)
  • §RCS-FS-6
    • 條件:x-y 參數來源
    • 結果:本期固定 CT×數量+CO(ERP);方案 2「CT×數量」、方案 3「生管固定天數」為保留切換策略(計算前讀當前策略),本期不展開(對應 #9)
  • §RCS-FS-7
    • 條件:LeanPlay 交期 vs 投產單交期/生管期待
    • 結果:引擎只輸出 LeanPlay 日期、不做比對、不判 overdue;是否逾期、如何反應、如何呈現皆屬下游前端/應用(對應 #11,已釐清)
  • §RCS-FS-8
    • 條件:投產單批次為空
    • 結果:回傳空粗排結果,不報錯
  • §RCS-FS-9
    • 條件:Freeze 看板產能(引擎外決定)
    • 結果:視為「可用產能」中節拍點的預佔用日讀入;其佔用使後續排單依 §RCS-FS-2 機制往後推。引擎不設定、不修改 Freeze
  • §RCS-FS-10
    • 條件:節拍點起排日=JIT 目標開工日(= 交期 − 節拍點到成品前置時間)
    • 結果:保留為可替換的計算介面 → 廢棄(2026-06-04):2026-06-03 收斂改為 LeanPlay 自起排日正推(ASAP),節拍點不再以交期反推錨定。改見 §RCS-FS-11LSD 的反推則由 §RCS-FS-13 承接。
  • §RCS-FS-11
    • 條件:起排日(LeanPlay 正推起點)
    • 結果:參數,預設=今天+1;葉站自起排日開工往後排(對應 #14)
  • §RCS-FS-12
    • 條件:多單搶節拍點產能的處理先後
    • 結果:依投產單 prioritySeq(進入順序)、非交期;與輸出「投產順序」(依 LeanPlay 完工日排序)為兩個概念(對應 #15)
  • §RCS-FS-13
    • 條件:LSD 計算
    • 結果:自投產單交期反推、純 leadtime、不看產能(即使在節拍點亦不看);與 LeanPlay 正推方向相反(對應 #13)
  • §RCS-FS-14
    • 條件:集批控制
    • 結果:不支援;LSD 是以工廠最壞(最麻煩)狀況排出的單一日期,不額外輸出容忍窗/可集批區間;集批與否由細排/現場依此日期自行判斷(對應 #16)
  • §RCS-FS-15
    • 條件:節拍點當日確定後的上游排程
    • 結果:上游拉動區 N-x 由節拍點當日往前 JIT 拉動(緊鄰節拍點、不留閒置);節拍點§RCS-FS-2 被排擠後移時,其上游前製程隨之整段往後,不停在原地空等。正推(§RCS-FS-11)僅用於求節拍點最早可開工日這個錨點(2026-06-04 修正)
  • §RCS-FS-16
    • 條件:節拍點多機台(棋盤)
    • 結果:節拍點(製程-工作站)對應 N 台機台、各自每日產能;同日可並行 up to N 單(不同機台)。§RCS-FS-2「連續可用日不足」改判在 eligible 機台子集上,所有 eligible 機台都湊不出 L 連續可用日才往後一天。N=1 退化為 §RCS-FS-2 原木桶模型(對應 #17)
  • §RCS-FS-17
    • 條件:eligibility(可用機台子集)
    • 結果:VSMNode 在節拍點只能用工作能力涵蓋其製程-工作站的 eligible 機台(如 LASR-L2 僅 LA02);可能某單被擠到後一天時、別台機台仍空著卻不可用。粗排不安排實際機台/時間,機台×日僅為 eligibility 內部記帳(對應 #17)
  • §RCS-FS-18
    • 條件:多 eligible 機台的分配
    • 結果:抽象為 ResourceAllocationStrategy 介面(OCP、與既有 LeadTimeStrategy 同模式)。本期 default=IdAscendingStrategy(machine id 小者先佔,=現行行為、悲觀下界);MostConstrainedFirstStrategy(通用機台留給受限零件、減少不必要排擠)為已登記、Stage 3 才實作的策略;純機台硬綁(能力全同仍綁特定台)延後(對應 #17,見 §待裁定)
  • §RCS-FS-19
    • 條件:節拍點 eligible 空集(無機台 match 製程-工作站)
    • 結果:拋「無可用資源」例外、中止該次粗排(fail-fast,視為資料/設定錯誤);與 §RCS-FS-8 空批次(容忍回空)不同(對應 #17)

編號為 append-only。新條件加新編號,廢棄條件用 刪除線 + 廢棄原因,不重編號。


驗證 Script

路徑:rough-cut-scheduler.fp.validate.py.py 不上站;結果見下方 validate-output)

  • 用途:以 day 顆粒度、一般化樹狀拓樸模型化 §流程圖 圖 1 的核心(LeanPlay 以節拍點為錨:正推定錨求節拍點最早日 → 有限產能堆疊 → 上游 JIT 拉動/下游推動;LSD 自交期反推不看產能;依 prioritySeq 逐張處理;投產順序全域排序),餵入上方 §I/O 範例的 toy 輸入,assert 輸出與 spec 一致。
  • 跑法:python rough-cut-scheduler.fp.validate.py → 已通過全部 assertion(正常/邊界排擠/空批次/交期早於今日)。
  • 輸出:執行時另存一份人類可讀結果 → rough-cut-scheduler.fp.validate-output.md(自動產生、deterministic、請勿手改;spec 由此連結過去看實算結果)。
  • 定位:只驗證 I/O 範例自洽,非實作雛形(Stage 5 的 code 不照抄);跑得通 ≠ 設計正確。

requirement 覆蓋對照

requirement 需求點對應 Use Case / 邊界條件狀態
需求一(產銷協調:確認時間 / 確認影響)明確不做(下一期;引擎入口)
需求二(細排 input:每節點 LSD / LeanPlay / 投產順序)UC A1 + UC A2已涵蓋
素材 #4(三輸出計算方向:LeanPlay 節拍點錨定 / LSD 反推 / 投產順序依 LeanPlay)UC A1 行為 + 圖 1 + B11~B13、B15已涵蓋
#5(評估是否寫回 / 鎖定產能)引擎語意=純試算不落地已釐清(記錄於 UC A1 預期結果)
#6(同引擎、不同入口 / 參數)UC A1(生管)/ UC A2(細排)共用引擎已涵蓋
#8節拍點站別模糊)B4(初期單一工作站-製程)已涵蓋(初期範圍)
#9(x-y 參數三策略)B6(鎖 CT×數量+CO,2/3 保留切換策略)已涵蓋(本期鎖方案1,最終選定待裁定)
#10(交期早於當日)B3(容忍、不判 overdue,引擎只給日期)已涵蓋
#11LeanPlay 交期 vs 生管期待交期落差)B7(引擎只給日期、不判逾期;比對與反應屬下游)已釐清
#13LSD 反推是否看產能)B13(反推、不看產能)已涵蓋
#14(起排日定義與 +1)B11(參數,預設今天+1)已涵蓋
#15(處理順序 vs 投產順序)B12(prioritySeq 處理;投產順序另算)已涵蓋
#16(集批控制)B14(不支援、LSD 單一日期)已涵蓋
#17節拍點多機台 + eligibility)UC A1 + 圖 1 + B16~B19 + eligibility I/O 場景已涵蓋(棋盤、固定機台序;最佳化/硬綁延後)
#12(Freeze 時間範圍規則)B9(引擎外輸入);I/O 約定部分(範圍規則由生管決定,待裁定)
#7(引擎拆解方法論)暫緩(聚焦本引擎 I/O/Process)

待裁定 / 未解問題

  • Q1(= 未解 #7:多引擎拆解方法論/拆解準則 → 狀態:暫緩,關係人表示先聚焦粗排模組 Input/Output/Process,本 spec 不展開。
  • Q2(= 未解 #12:排單前 Freeze 的「時間範圍」長度與決定方式(方向:由生管決定,引擎外)→ 狀態:部分釐清,規則待裁定。
  • Q3(= 未解 #9 殘留):x-y 三策略最終採用哪一個、方案 3「固定天數如何給」→ 狀態:本期鎖方案 1(CT×數量+CO)、三策略並存可切換,最終選定與方案 3 輸入待補。
  • Q4(= 未解 #5 殘留):評估是否真實寫回/鎖定產能 → 狀態:本期語意=純試算不落地;是否落地待裁定。
  • Q5(= 未解 #4 殘留):輸入清單是否齊全(行事曆/班別已併可用產能、BOM 已併 VSM、到料初期不納入)→ 狀態:大致收斂,完整盤點待 Stage 2 定稿前確認。
  • Q6(= 未解 #17 殘留):多 eligible 機台的分配最佳化(把通用機台留給受限零件,減少不必要排擠)→ 狀態:§RCS-FS-18 已抽為 ResourceAllocationStrategy 介面;本期 default IdAscendingStrategy(悲觀下界),最佳化策略 MostConstrainedFirstStrategy 介面已就位、實作延後 Stage 3。
  • Q7(= 未解 #17 殘留):純機台硬綁(兩台工作能力全同、仍要綁特定台,matching 之外那層)→ 狀態:本期不做、延後。

簽核

  • 編輯者:Alan / 日期:2026/06/05
  • Reviewer:Alan / 日期:2026/06/05
  • 修訂(eligibility/棋盤,2026-06-09):編輯者 Alan / 日期 2026/06/09;Reviewer Alan / 日期 2026/06/09
  • 簽核完成後,請把上方「狀態」欄改為「已簽核」。