資源篩選 (Resource Selection) Functional Spec

來源:resource-selection 下游:OOA(草稿) 性質:跨 feature 共用模組(Published Language);被 粗排 rough-cut-scheduler細排 fine-grain-schedule 消費;消費 產能模組 capacity-module 驗證:resource-selection.fp.validate.py(I/O 範例自洽性檢核,已通過;.py 不上站)→ 執行結果 resource-selection.fp.validate-output.md 狀態:已簽核


概述

給一個 VSMNode(料號+製程+工作站),這個模組算出該節點真正的候選資源有哪些,整包回給呼叫方。能力自然推導、資源指派限定、限制關聯這三件事,只有它清楚;呼叫方(粗排細排)只接結果,不碰指派參數、也不碰跨資源耦合。產出到「已排序的合格資源序列」為止,不做任何產能計算(§RS-UR-11)。

每一種「節點有宣告」的資源型別,模組各回一條序列:機台一定有,模具/操作員/技師要有宣告才有,不靠物理反推。每條序列都已套上該走的約束(能力路徑走能力過濾、指派路徑走韌性放行、機台再經 操作員→機台 耦合過濾),並帶明確順序值。


Use Cases

Actor 一律是呼叫方粗排節拍點細排=每一 VSMNode),非人。四個 UC 是「同一套兩層篩選」套在不同情境/型別上的切面。

UC-A:能力匹配(VSMNode 無指派限定)

  • Actor:呼叫方
  • 觸發條件:給定一個 VSMNode,且其(對某資源型別)無指派限定
  • 行為
    1. 取 VSMNode 的 (製程, 工作站) 為能力鍵(料號識別 VSM;工序不參與匹配)
    2. 掃資源池,篩出工作能力涵蓋該 (製程,工作站) 的資源(消費 capacity-module 能力)
    3. 依能力順序值排序
  • 預期結果:一條「已排序的合格資源序列」(每元素帶順序值)
  • 例外路徑:候選為空 → 見 UC-D / §RS-FS-5

UC-B:指派覆寫(VSMNode 有指派限定)

  • Actor:呼叫方(細排為主;粗排不走此路徑,只用能力匹配層,§RS-UR-8
  • 觸發條件:給定一個 VSMNode,且其(對某資源型別)有指派限定(外部設定檔已載入於模組內)
  • 行為
    1. 取該型別的指派資源集(配對 1 VSM→機台+順序值 / 配對 2 VSM→模具)
    2. 以指派資源集為準、依其順序值排序,不與能力匹配取交集
    3. 韌性放行:指派資源即使能力不符或耦合不相容,仍保留、不在此擋(完整規則與例見 BR-1)
  • 預期結果:以指派為準的「已排序合格序列」
  • 例外路徑:(無)。指派路徑韌性放行、永不為空、永不拋 Exception(連耦合剔光也整批放行,§RS-FS-3/5)

BR-1(韌性放行)— 本模組最反直覺的設計,禁止下游「修正」回交集:

白話:現場若已硬指派某型別的資源(例如指定某幾台機台),模組就照單全收。就算那台機台能力上做不了這道製程、或配的操作員根本跑不了那台機台,模組都不擋,原樣放行。

精確規則

  • 指派優先:VSMNode 對某資源型別有指派限定時,以指派清單為準,不與能力匹配結果取交集
  • 不合理也放行:指派清單中的資源,即使能力不符、或耦合不相容(操作員跑不了該機台),一律保留、不在本模組排除。
  • 耦合過濾只縮減、不清空:跨型別耦合(操作員→機台)只有在「還剩相容的替代資源」時才排除不相容者;若排到一個不剩,則整批放行、不清空
  • 能力匹配是 fallback:只有在「無指派」時才改用能力匹配挑資源(UC-A)。

例(耦合剔光仍放行):料號 Bz 指派機台 {M3}、需 OP1,但 OP1 只跑得了 {M1,M2}(跑不了 M3)→ 模組仍回 機台序列 = [(M3,序1)],不拋 Exception、不清空。

  • 為何:現場可能不顧能力正確性強行指派;與其在資訊層阻擋,不如放行以強化軟體韌性§RS-UR-3)。資料正確性由模組外前置檢查負責,非本模組職責。
  • 推論:指派路徑因此永不為空、永不拋 Exception;唯一的 Exception 在「能力路徑(無指派)能力空集」(§RS-FS-5、UC-D)。

UC-C:限制資源的篩選與耦合過濾

  • Actor:呼叫方(細排
  • 觸發條件:VSMNode 涉及限制資源(需某模具,或執行受操作人員/技師限制)
  • 行為
    1. 對每一種節點明確宣告的限制資源型別(模具/操作員/技師),各跑 UC-A 或 UC-B 同一套兩層篩選,產出該型別序列
    2. 模組內依單向限制關聯(操作員→機台,§CAP-UR-6)做跨型別耦合過濾:把機台序列中所需操作員跑不了的機台排除(排除規則見 BR-1)。例:料號 C 指派 {M1,M2,M3}、需 OP1,OP1 跑不了 M3 → 排除 M3 得 [M1,M2]
    3. 有宣告才回:節點未宣告的資源型別不回序列,且不靠物理事實反推(如料號 B 需 MOLD1 但未宣告技師 → 不回技師)
  • 預期結果:{有宣告的資源型別 → 已排序合格序列} 的對應
  • 例外路徑:(無)。指派路徑剔光則韌性放行、不為空(§RS-FS-3/4)

UC-D:能力路徑空集 → Exception

  • Actor:呼叫方
  • 觸發條件:**能力路徑(無指派)**下無任何資源能力涵蓋該 (製程,工作站)(能力空集)。指派路徑因韌性放行永不為空、不走此 UC§RS-FS-3、BR-1)
  • 行為
    1. 偵測能力路徑候選為空
    2. 拋出 Exception(不回半套、不把空序列當正常結果)
  • 預期結果:明確 Exception,中止該節點篩選
  • 設計前提:資料正不正確,由模組外的前置檢查把關,不是本模組的職責。本模組只做一道防禦:能力路徑真的找不到任何資源時,就當場拋 Exception、中止該節點,不把空結果當正常往下傳(呼應 §RCS-FS-19粗排遇空集中止排單)。此前提是 2026-06-11 Stage 2 對 §RS-UR-4 的修訂結論:「指派韌性放行、Exception 僅限能力空集」。

流程圖

對「單一資源型別」的篩選流程;模組對每個有參與的型別各跑一次,最後彙整。

flowchart TD
    Start[呼叫方給一個 VSMNode] --> PerType[取一個有宣告的資源型別]
    PerType --> HasAssign{該型別有指派限定?}
    HasAssign -- 有 --> Assign[指派覆寫·依指派順序值\n能力/耦合不符也放行 韌性 BR-1]
    HasAssign -- 無 --> Cap[能力匹配·依製程-工作站推導\n依能力順序值]
    Assign --> Prune[耦合過濾 操作員→機台\n排除規則見 BR-1]
    Cap --> Prune
    Prune --> Empty{能力路徑且候選為空?}
    Empty -- 是 --> Ex[拋 Exception 中止]
    Empty -- 否 --> Out[輸出一條已排序合格序列]
    Out --> More{還有其他有宣告型別?}
    More -- 有 --> PerType
    More -- 否 --> Done[彙整各型別序列回傳呼叫方]

I/O 範例

共用樣本資料(capacity-module):機台能力(某 (製程,工作站))涵蓋資源 = {M1, M2};限制關聯 OP1→{M1,M2}、MOP1→{MOLD1}。順序值欄位 = resourceSelectionPriority§RS-FS-9),以下以 序N 簡記。 下列為摘要;完整逐案計算結果由 script 自動產出、結果固定(每次跑都一樣)§驗證執行結果

UC-A(能力匹配 fallback)

正常值

  • input:VSMNode 料號E@(P5,W5),無任何指派/限制;能力涵蓋資源 = {M1,M2}
  • output:機台序列 = [(M1,序1),(M2,序2)]

邊界值

  • input:能力僅 {M2} 涵蓋該 (製程,工作站)
  • output:機台序列 = [(M2,序1)]

異常值

  • input:無任何資源能力涵蓋該 (製程,工作站)
  • output:Exception(必要型別「機台」候選為空,§RS-FS-5

UC-B(指派覆寫,含韌性放行)

正常值(料號 D)

  • input:機台指派 {M1,M2,M3},無其他限制
  • output:機台序列 = [(M1,序1),(M2,序2),(M3,序3)]

邊界值①(韌性放行・能力不符)

  • input:機台指派 {M1,M2,MX},其中 MX 能力不符該 (製程,工作站)
  • output:機台序列 = [(M1,序1),(M2,序2),(MX,序3)](MX 仍放行,BR-1)

邊界值②(韌性放行・耦合剔光不空)

  • input:機台指派 {M3}、需 OP1(OP1→{M1,M2} 跑不了 M3)
  • output:機台序列 = [(M3,序1)]操作員序列 = [(OP1,序1)](剔光 → 整批放行,不拋 Exception)

UC-C(限制資源篩選與耦合過濾)

正常值(料號 C:指派 {M1,M2,M3}、需 OP1;OP1→{M1,M2})

  • input:機台指派 {M1,M2,M3};該節點需操作員 OP1
  • output:
    機台序列   = [(M1,序1),(M2,序2)]    # M3 已剔(OP1 跑不了 M3)
    操作員序列 = [(OP1,序1)]
    

邊界值(料號 A:能力機台 {M1,M2}、宣告需 MOLD1 + 技師 MOP1)

  • input:無機台指派(能力 fallback);節點宣告需 MOLD1、且宣告 MOLD1 由 MOP1 換
  • output:
    機台序列 = [(M1,序1),(M2,序2)]
    模具序列 = [(MOLD1,序1)]
    技師序列 = [(MOP1,序1)]
    

補充(料號 B:指派 {M1,M2,M3}、需 MOLD1,未宣告技師

  • input:機台指派 {M1,M2,M3};宣告需 MOLD1(未提技師)
  • output:
    機台序列 = [(M1,序1),(M2,序2),(M3,序3)]
    模具序列 = [(MOLD1,序1)]
    (無技師序列 ← 未宣告,不靠物理反推,§RS-FS-6)
    

UC-D(能力路徑空集 Exception)

異常值

  • input:**能力路徑(無指派)**無任何資源涵蓋該 (製程,工作站)(能力空集)
  • output:Exception,中止該節點篩選。(指派路徑因韌性放行不會到此)

邊界條件 / 異常情境

「編號」欄即全域碼 §RS-FS-{N}RSspec-codes.md。append-only,不重編。

  • §RS-FS-1
    • 條件:VSMNode(對某型別)無指派限定
    • 結果:走能力匹配 fallback,依能力順序值排序(UC-A)
  • §RS-FS-2
    • 條件:VSMNode(對某型別)有指派限定
    • 結果:指派覆寫能力,依指派順序值排序(UC-B)
  • §RS-FS-3
    • 條件:指派資源能力不符、或耦合不相容(操作員跑不了該機台)
    • 結果:仍放行、不擋(韌性放行;完整規則與例見 BR-1)
  • §RS-FS-4
    • 條件:節點宣告限制資源(模具/操作員/技師)
    • 結果:各有宣告的型別各回一條序列;機台序列另依 操作員→機台§CAP-UR-6)排除所需操作員跑不了的機台,排除規則可見 §RS-FS-3
  • §RS-FS-5
    • 條件:**能力路徑(無指派)**無資源涵蓋 (製程,工作站) = 能力空集
    • 結果:拋 Exception、中止(UC-D;呼應 §RCS-FS-19)。指派路徑韌性放行、永不為空、不拋 Exception
  • §RS-FS-6
    • 條件:某資源型別節點未宣告(如料號 D 無操作員、料號 B 未宣告技師)
    • 結果:不回該型別序列;有宣告才回,不靠物理事實反推
  • §RS-FS-7
  • §RS-FS-8
    • 條件:限制資源型別被指定時
    • 結果:前提假設:不出現「同型別多選、且跨型別交叉耦合至不可行組合」(路 3)。此前提下各型別獨立序列即保證可組出可行解;跨型別組合不在模組職責
  • §RS-FS-9
    • 條件:—
    • 結果:每個輸出元素帶一個明確順序值,欄名 = resourceSelectionPriority(刻意避開既有 RCS prioritySeq 命名碰撞);型別/放置 OOA 定

requirement 覆蓋對照

  • §RS-UR-1 抽成共用模組
    • 對應:整份 spec
    • 狀態:已涵蓋
  • §RS-UR-2 兩層(能力 / 指派限定)
    • 對應:UC-A、UC-B
    • 狀態:已涵蓋
  • §RS-UR-3 覆寫式 cascade + 韌性放行
    • 對應:UC-B、BR-1、§RS-FS-2/3
    • 狀態:已涵蓋
  • §RS-UR-4 指派門檻例外行為
    • 對應:UC-D、§RS-FS-3/5
    • 狀態:已修訂:Stage 2 拍板「甲」,指派韌性放行、不拋 Exception,Exception 僅「能力空集」;requirement §RS-UR-4 已同步更新(2026-06-11)
  • §RS-UR-5 限制資源=獨立資源
    • 對應:概述、UC-C
    • 狀態:已涵蓋
  • §RS-UR-6 key=VSMNode(料號+製程+工作站)
    • 對應:UC 前提、UC-A 步驟1
    • 狀態:已涵蓋
  • §RS-UR-7 配對 3/4=消費限制關聯
    • 對應:UC-C、§RS-FS-4
    • 狀態:已涵蓋
  • §RS-UR-8 消費契約(誰用哪層)
    • 對應:概述、UC-A/B Actor
    • 狀態:已涵蓋
  • §RS-UR-9 粗排前向註記、不動 tag/code
    • 對應:—
    • 狀態:不在 FS 範圍(屬 RCS 演進,已於 RCS pseudo §7 註記)
  • §RS-UR-10 不 spec 外部設定檔格式/維護
    • 對應:—
    • 狀態:明確不做(scope 邊界)
  • §RS-FS-7
    • requirement 需求點:§RS-UR-11 不做產能計算
    • 狀態:已涵蓋
  • §RS-UR-12粗排共用同一機制
    • 對應:概述
    • 狀態:已涵蓋

待裁定 / 未解問題

  • Q1(已定,2026-06-11 Alan):輸出順序值欄名 = resourceSelectionPriority,刻意避開既有 RCS prioritySeq投產單順序)的同名兩義碰撞。型別/放置細節 → Stage 3 OOA。§RS-FS-9
  • Q2(OOA 時自動對齊,無需裁定):本 spec 用「VSMNode=料號+製程+工作站、工序不參與匹配」;[細排 §FGS-UR-5](../../requirement/fine-grain-schedule/index.md#q5) 措辭為「工序-製程-工作站節點」。兩者 substance 一致(工序是欄位、非匹配維度),純措辭差異,OOA 統一即可。
  • Q3(不在本 spec,留 FGS 自行拍)細排是否一併消費本模組第 2 層(資源指派限定)=細排 scope 是否納入第 2 種匹配,屬 FGS 自己的 Stage 2,已於 [FGS §FGS-UR-4](../../requirement/fine-grain-schedule/index.md) 加註。本模組無論如何兩層都完整 spec,故不卡本 spec。

驗證 Script

  • 路徑:resource-selection.fp.validate.py.py 不上站;結果見下方 validate-output)
  • 跑法:python resource-selection.fp.validate.py → 已通過全部 assertion。
  • 輸出:執行時另存一份人類可讀結果 → resource-selection.fp.validate-output.md自動產生、結果固定、請勿手改;spec 由此連結過去看實算結果)。
  • 涵蓋:UC-A 能力 fallback(正常/邊界/能力空集)、UC-B 純指派/韌性(能力不符)/韌性(操作員不符仍回 M3)、UC-C 耦合排除/模具技師宣告/未宣告技師不回,外加順序值連續性。
  • 定位:只驗證 I/O 範例自洽,非實作雛形(Stage 5 不照抄);跑得通 ≠ 設計正確。

簽核

  • 編輯者:Alan / 日期:2026-06-12
  • Reviewer:Alan / 日期:2026-06-12
  • 簽核完成後,請把上方「狀態」欄改為「已簽核」。