Skip to Content

no_overlap 規則

no_overlap 防止同一業務範圍中的區間互相重疊,例如同一會議室不可有重疊預約,或同一員工同一天不可有兩段重疊班次。界線可以來自兩個一般欄位,也可以來自一個 interval cell。

雙欄界線

{ "type": "no_overlap", "name": "同一會議室的預約不可重疊", "start_column": "開始時間", "end_column": "結束時間", "min_gap": 30, "scope_columns": ["會議室"], "date_column": "預約日", "when": [ { "column": "狀態", "op": "neq", "value": "已取消" } ] }

start_columnend_column 必須屬於相同可比較類別:numeric、date、datetime 或 string-like。scope_columns 放一至兩個 link 欄位,用來界定哪些列互相比較;date_column 可省略,提供時可再按 date、datetime、string 或 text 值分組。系統 id 欄位不能作為 start、end 或 date-scope 欄位,因為在不透明主鍵上談區間語意沒有意義。

單一 interval 欄界線

若兩個 datetime 界線存在同一個 cell,改用一個 interval_column

{ "type": "no_overlap", "name": "同一會議室的預約不可重疊", "interval_column": "預約時段", "min_gap": 30, "scope_columns": ["會議室"], "when": [ { "column": "狀態", "op": "neq", "value": "已取消" } ] }

interval_column 必須指向 interval 型別欄位。它與 start_columnend_column 互斥:只能提供單欄形式或雙欄形式,不能兩者並存。由於 interval cell 一律帶有標準 datetime 界線,因此它的 min_gap 單位是分鐘。

最小間隔

min_gap 會在原本不重疊的區間之間再要求一段距離:

界線類別合法 min_gap單位
Numeric 雙欄界線正整數或浮點數欄位本身的純數值單位
Date 雙欄界線至少 1 的整數
Datetime 雙欄界線至少 1 的整數分鐘
單一 interval_column至少 1 的整數分鐘

省略 min_gap 或送出 0,會維持一般 no-overlap 契約。String-like 界線可使用 no_overlap,但不能設定 min_gap

半開區間語意

區間採半開表示 [start, end)。沒有 gap 時,一筆在 10:00 結束,下一筆在 10:00 開始,不算重疊;設定 min_gap: 30 時,下一筆恰好在 10:30 開始也合法,剛好等於必要間隔仍算允許。兩種形式都要求 end 大於 start

Bound、interval cell 或 scope anchor 缺值時,該列對本規則豁免。若這些值必須存在,請使用 schema-level required 或合適的 policy contract;interval cell 支援的 presence contract 是 required: true

前端日曆可以先提示衝突。rules.preview 會驗證候選規則 shape,但不會掃描既有列中的一般 no_overlap 衝突;請另外查詢相關區間,並以實際寫入回應為準。完整設定由 rules.set 整份取代。

Last updated on