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_column 與 end_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_column/end_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 整份取代。