ADR-0003:硬鎖定不自動解除
- 狀態:已採用
- 日期:2026-07
背景
一筆單據被「確認」後,使用者仍然可能需要修改(打錯字、上游資料更新)。
早期行為是:編輯已確認的資料 → 自動解除確認狀態。 表面上很方便,實際上出過事。
選項
| 選項 | 說明 |
|---|---|
| A. 完全不能改 | 打錯字只能開沖銷單,實務上不可行 |
| B. 能改,改了自動解除確認 | 方便,但使用者不知道自己剛剛做了什麼 |
| C. 能改,但必須先明確「取消確認」 | 多一步,但每一步都是有意識的 |
決定
採 C:確認 = 資料凍結。要改,必須先明確解除確認。
三層守衛:
- 資料層:所有寫入操作檢查鎖定狀態,已鎖定就 no-op
- UI 預攔:按下去之前就擋,並說明「需先取消確認」
- 視覺:鎖定欄位顯示鎖頭,且仍可聚焦(報讀器要唸得到原因)
理由
選項 B 的實際災難:
使用者只是想看看某個欄位能不能改,點了一下——整筆單據退回未確認狀態, 而且沒有任何提示。下游流程(已排程的作業、已送出的請款)跟著全部回捲, 而沒有人知道是誰、什麼時候觸發的。
選項 C 的多一步是故意的:它把「我要改一筆已核准的東西」 從一次不小心的點擊,變成一個需要刻意做的決定。
影響
- 解除確認要連帶處理衍生資料(刪除該期凍結快照),重新確認時再重建。 只改狀態旗標會留下「狀態是未確認但報表還是舊數字」的鬼故事。
- 「回復」(稽核還原)也受鎖定守衛約束,不是繞過鎖定的後門。
- 需要一支測試:對已鎖定資料呼叫每一個 mutation,斷言狀態完全不變。