遷出流程

定義(SA 術語)

術語說明
遷出已晉塔或安奉的往生者遷出原所在位置的異動申請。
底座蓮位的配備,遷出時家屬會帶走,所以已簽的蓮位申請轉讓/繼承時需要檢查並收費。
再度使用遷出後再次發生轉讓、晉塔等異動,系統自動收取「牌位底座」與「牌位代刻」費用。

資產生命週期中的位置:已申購 →(選位)→ 已使用(晉塔)→ 已遷出, 遷出後可再晉塔(BR-AST-03 的前置就是「未使用或已遷出」)。


前置條件(BR-AST-04)

  1. 權狀狀態必須為**「已晉塔」或「已安奉」** (建立端卡控:未晉塔選遷出直接擋「此權狀尚未晉塔/安奉,無法申請遷出」, ModificationValidationManager
  2. 管理費已繳清或已退費(處理存檔端 guard:管理費效期已全數到期會擋 「請先補繳或辦理退費後再辦理遷出」)
  3. 目前版本限制:只支援單一入位列。同權狀多位入位(合葬)辦遷出會擋 「合葬部分遷出尚未支援」

反向關聯(同一套建立端卡控):

  • 已晉塔的權狀不能再選晉塔/換位/換裝 → 要先辦遷出
  • 已晉塔的權狀不能直接退貨作廢(BR-APP-07)→ 要先完成遷出申請再辦退貨

主流程(SA 4.1.6 / UC03)

SA 層面與晉塔共用同一張泳道圖(「遷出流程與晉塔類似」):

客戶提出遷出申請
→ 櫃檯收單
→ 系統產生申請單 [(2.1)申請單總覽]
→ 行政人員確認資料 + 處理存檔
→ 系統建立遷出通報 → 管理處/執行人員現場執行
→ 執行人員回報完成
→ 行政人員輸入實際執行日期 → 點擊完成
→ 資產狀態更新為「已遷出」、通報已完成、申請單歸檔

資料流向:每一步實際寫了什麼

新站實作分三段,寫入點都在 MoveoutApplicationManager

建立申請單(moveout 項目)
  └→ 只建申請單;不動 move_outs / enshrinements
 
處理存檔(申請單詳情儲存 → MaterializeMoveoutAsync)
  └→ 守門:產品存在有權狀號 → 恰好一筆入位列(f_in='1')→ 管理費效期
  └→ move_outs 每位勾選使用者 INSERT 一列
     (f_app_id 為批次鍵,重複存檔冪等:更新既有列、多的軟刪、少的補建)
  └→ 同步建立遷出通報(NotifType=MoveOut,委派通報權威)
  └→ 順手補正該使用者名下管理費的 f_auth_no 關聯鍵
 
申請單完成(ApplyMaterializedMoveoutCompletionAsync)
  └→ 只驗證 move_outs 已由處理存檔建立(沒有就擋「請先完成處理存檔」,不補建)
  └→ 蓮位:position.f_pedestal_count -1(底座被家屬帶走,對應 SA 底座定義)
  └→ 寫 statusLog「遷出完成」
 
遷出通報完成
  └→ 只改通報狀態;不寫 move_outs、不動 f_in
     (FinalizeEnshrinementAsync 對 notifType=moveOut 直接 return)

遷出「不寫」什麼(跟直覺相反,都是刻意設計)

不寫說明
enshrinements.f_in永遠維持 ‘1’,不改成 ‘2’(全表 0 筆 f_in=‘2’)。遷出狀態唯一表示=move_outs 有列
positions.f_rsvStatusproducts.f_capacity完成端不碰位置預約狀態與容量
管理費退費不 auto-settle。退費走既有管理費畫面另案辦理,遷出 executor 只做前置檢查
modifications新流程遷出不寫舊異動表(客戶異動歷史 Tab 查不到是設計結果)

move_outs 欄位語義

欄位來源
f_t_use_fid= enshrinements.f_id(遷出鍵;是入位列主鍵,不是 f_auth_no 粗鍵)
f_auth_nof_position_idf_use_idf_use_idnum抄自入位列
f_use_name詳情頁勾選的使用者(沒勾則 fallback 入位列的 f_useName)
f_plan_d遷出日期(=申請單詳情頁必填的執行日期)
f_acct_d原晉塔日期(抄自入位列,不是遷出日期)
f_app_id來源申請單 id(批次鍵,冪等/作廢連帶都靠它)

「現役晉塔中」的正確判定

現役 = enshrinements.f_in='1' 且該列沒有對應的未刪 move_outs 列
      (move_outs.f_t_use_fid = enshrinements.f_id)

唯一權威是 EnshrinementGuard(含 GetActiveOccupantsAsync), 全系統任何「是否在位/選哪一列辦異動」都必須委派這裡。 自製查詢/報表直接抄裸 f_in='1' 一定會把已遷出者誤算成在位—— 這是本系統踩過最多次的坑(綜合查詢、異動選列都修過一輪)。


管理費連動(SA 4.4.2 異動項目表)

  • 前置:遷出要同步處理管理費——過期的要繳清、未使用的可退費(BR-AST-04)
  • 遷出退費計算:可退管理費=短期管理費計算額 − 應收短期管理費 (從當前期數−1 的期數截止日起算到當天收短期費,退當前期數以後的所有期數)
  • 一次性管理費:不退費;晉塔+遷出算 1 趟,趟數超過納骨量時再晉塔要收規費; 同一人重複晉塔+遷出,管理費效期內不再收
  • 費率權威見 SA 5.7.3.5(ShortTermFeePricingManager

後置效果

遷出完成後說明
資產狀態 → 已遷出綜合查詢使用狀況顯示「遷出」、位置騰空
可再晉塔BR-AST-03 前置=未使用或已遷出
再度使用收費(蓮位)之後轉讓/再晉塔要檢查遷出記錄 → 收「底座+代刻」費,每遷出一次刷新重新記錄,再晉塔時強制檢查
解鎖退貨作廢已晉塔不可直接退貨(BR-APP-07),遷出後才能辦
申請單作廢連帶遷出單作廢 → 軟刪該單未完成的 move_outs 列(SoftDeletePendingMoveoutsAsync,已完成不刪)

完成後去哪查(含管理費統計篩不到的日期軸陷阱)→ 見 異動完成後去哪裡查


已知陷阱(別當 bug 修)

  1. f_in 永不回寫:不是漏寫,是設計。判在位一律委派 EnshrinementGuard
  2. 法會通知仍寄給遷出者:#209 Part B 拍板「仍寄」;曾加排除又明確 revert (28840b11 → 7d0512ce)。寄不寄遷出者是 #211 P5 待寺方決策,盲改=重新引入已 revert 的回歸。
  3. 遷出/安奉登記書要印遷出者:刻意正交(PM 2026-06-08 拍板)——登記書本來就要印遷出資料, f_in 在套印是取數來源不是 gate;只有金流類(FEE_REMINDER)排除遷出者。
  4. 舊站對照:舊站遷出=物理刪除 tb_towerUsed 那一列(備份 h 表 → INSERT tb_towerMoveOut → DELETE)。 新站改成 move_outs 軟記錄+讀取端排除,語義等價:遷出=未使用、異動只作用現役列。
  5. 管理費統計查不到今天的遷出:那頁篩選軸是繳費日期,遷出不寫繳費紀錄。 要看「今天誰遷出」用通報查詢。詳見 異動完成後去哪裡查

程式碼位置

檔案角色
services/DomainServices/Shared/MoveoutApplicationManager.cs遷出 executor:materialize(處理存檔)、完成端驗證、作廢連帶軟刪
services/DomainServices/Shared/EnshrinementGuard.cs現役判定唯一權威
services/DomainServices/ApplicationCreate/ModificationValidationManager.cs建立端卡控(未晉塔擋遷出、已晉塔擋再晉塔/退貨)
EnshrinementNotificationService.cs遷出通報(SyncMoveoutNotificationsAsync);通報完成對 moveOut 不 finalize
ComprehensiveQueryService.cs讀取端已排除有 move_outs 的入位列

相關 DB 表:move_outs(遷出記錄)、enshrinements(入位列,f_in 不回寫)、 tb_enshrinement_notification(NotifType=MoveOut)。


SA 章節索引

章節內容
SA 術語定義遷出、底座、再度使用
SA 4.1.6晉塔與遷出及通報流程(共用泳道圖)
SA 4.3.3 (UC03)辦理晉塔/安奉與通報作業(遷出流程與晉塔類似)
SA 4.4.2異動項目表:遷出需已晉塔/已安奉、要同步處理管理費繳清/退費
BR-AST-03晉塔前置=未使用或已遷出(遷出後可再晉塔的依據)
BR-AST-04遷出前置=已晉塔/已安奉且管理費已繳清或已退費
BR-APP-07已晉塔不可直接退貨作廢,需先遷出

相關概念


本次驗證範圍

本頁於 2026-07-02 對照現行程式碼撰寫:MoveoutApplicationManager(全檔精讀)、 ModificationValidationManager(建立端卡控訊息)、EnshrinementNotificationService.FinalizeEnshrinementAsync (moveOut 不 finalize)、ComprehensiveQueryService(遷出列排除)、SA 系統設計規格書 V1.6 (術語表、4.1.6、UC03、4.4 業務規則)。

沿用而未重新驗證的部分:「全表 0 筆 f_in=‘2’」與陷阱 2/3 的拍板紀錄(#209/#211、 commit 28840b11/7d0512ce、PM 2026-06-08)為 2026-06-24 的稽核與決議紀錄;本次未重新查 grace2。