Interface BusinessCalendar
public interface BusinessCalendar
營業行事曆——日期可選性的單一事實來源(ADR-012)
核心抽象是「日期 → DayStatus」的函數。應用層以 Calendars 組合子宣告具名
行事曆(如「配送行事曆」= 政府行事曆 + 週一店休 + 非過去),同一個實例同時服務
兩個消費點,前後端日期限制語意因此不可能漂移:
resolve(LocalDate, LocalDate)— 解算範圍為DayStatus[],經應用 endpoint 下行給前端日期元件渲染(wire format 即DayStatus的序列化)validate(LocalDate)— 提交時的後端權威驗證,不可選 →DateNotSelectableException→ 400
「事件行事曆」(會議室 / 個人排程:時段粒度、重複規則、衝突偵測)是不同 domain、
不在本抽象範圍;其可與本抽象橋接——把「當天已無空檔」投影成
DayStatus(selectable=false, reasonCode="FULLY_BOOKED") 供日期選擇消費。
- Since:
- 4.0
-
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final intplusSelectableDays(LocalDate, long)的掃描上限(天),防止「前方再無可選日」 的行事曆造成無窮迴圈(約 20 年) -
Method Summary
Modifier and TypeMethodDescriptiondefault booleanisSelectable(LocalDate date) 指定日期是否可選default LocalDateplusSelectableDays(LocalDate from, long days) 自基準日往後(或往前)數 N 個可選日解算日期範圍的可選性(前端渲染用)取得指定日期的可選性狀態default void驗證日期可選(提交時的後端權威驗證)
-
Field Details
-
MAX_SCAN_DAYS
static final int MAX_SCAN_DAYSplusSelectableDays(LocalDate, long)的掃描上限(天),防止「前方再無可選日」 的行事曆造成無窮迴圈(約 20 年)- See Also:
-
-
Method Details
-
statusOf
-
isSelectable
-
resolve
解算日期範圍的可選性(前端渲染用)- Parameters:
from- 起日(含)to- 迄日(含)- Returns:
- 範圍內每一天的 DayStatus(依日期排序)
- Throws:
IllegalArgumentException- 若 to 早於 from
-
validate
驗證日期可選(提交時的後端權威驗證)- Parameters:
date- 日期- Throws:
DateNotSelectableException- 日期不可選(由框架錯誤處理映射為 400)
-
plusSelectableDays
自基準日往後(或往前)數 N 個可選日
泛化上一代「工作日加減」運算到任何組合後的行事曆:對純政府行事曆即
plusWorkingDays;對組合了店休的配送行事曆則是「加 N 個可配送日」。days為負數時往前數;days = 0回傳基準日本身(不檢查其可選性)。- Parameters:
from- 基準日(不計入)days- 可選日數(可為負)- Returns:
- 第 N 個可選日
- Throws:
IllegalStateException- 掃描超過MAX_SCAN_DAYS仍未湊滿(前方再無可選日)
-