跳至主要内容
💬 回報這一頁

ADR-0003:硬鎖定不自動解除

  • 狀態:已採用
  • 日期:2026-07

背景

一筆單據被「確認」後,使用者仍然可能需要修改(打錯字、上游資料更新)。

早期行為是:編輯已確認的資料 → 自動解除確認狀態。 表面上很方便,實際上出過事。

選項

選項說明
A. 完全不能改打錯字只能開沖銷單,實務上不可行
B. 能改,改了自動解除確認方便,但使用者不知道自己剛剛做了什麼
C. 能改,但必須先明確「取消確認」多一步,但每一步都是有意識的

決定

採 C:確認 = 資料凍結。要改,必須先明確解除確認。

三層守衛:

  1. 資料層:所有寫入操作檢查鎖定狀態,已鎖定就 no-op
  2. UI 預攔:按下去之前就擋,並說明「需先取消確認」
  3. 視覺:鎖定欄位顯示鎖頭,且仍可聚焦(報讀器要唸得到原因)

理由

選項 B 的實際災難:

使用者只是想看看某個欄位能不能改,點了一下——整筆單據退回未確認狀態, 而且沒有任何提示。下游流程(已排程的作業、已送出的請款)跟著全部回捲, 而沒有人知道是誰、什麼時候觸發的。

選項 C 的多一步是故意的:它把「我要改一筆已核准的東西」 從一次不小心的點擊,變成一個需要刻意做的決定。

影響

  • 解除確認要連帶處理衍生資料(刪除該期凍結快照),重新確認時再重建。 只改狀態旗標會留下「狀態是未確認但報表還是舊數字」的鬼故事。
  • 「回復」(稽核還原)也受鎖定守衛約束,不是繞過鎖定的後門。
  • 需要一支測試:對已鎖定資料呼叫每一個 mutation,斷言狀態完全不變。