[FIX] DispatchDialog 關閉未結案補送 MQTT Finalize,修正多品項部分出貨不上報

1. 問題:出貨流程若走 dialogCancel() 收場(倒數結束 / dispatchIndex 越界 /
   中途中止),整筆交易完全不上報。批次 MQTT Finalize 僅在「成功完成」與
   「ERROR_PROCESS_GOODS 失敗」兩條路送出,dialogCancel 這條共通關閉路徑漏掉。
   此缺口於 main 既存,因通用版原無多品項出貨、Cmuh 失敗都走 ERROR_PROCESS_GOODS
   而未被觸發;多品項 basic 出貨為首次暴露。

2. 修正:在 dialogCancel() 開頭、buyList.clear() 之前加安全網——
   若出貨已開始(dispatchList 非空)且尚未結案(!isFinalizing),
   補呼叫既有 finalizeFailedDispatch() 送出一筆含全部明細的部分/未完成結案。

3. 守門:以 isFinalizing 擋住正常成功(:946)/錯誤(:1062)路徑,零重複上報;
   通行碼 flowType=5 仍由 publishFinalizeUnlessPassCode 自動略過,
   對晟崴/中國醫現行行為零影響。

雙硬體編譯綠。實機驗證待硬體(多品項第2件失敗→後台收到一筆部分出貨)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
sky121113 2026-06-10 16:47:10 +08:00
parent 1d4c4ab071
commit 42947dce0c

View File

@ -443,6 +443,15 @@ public class DispatchDialog extends DialogAbstract {
}
public void dialogCancel() {
// 安全網出貨流程已開始dispatchList 非空但尚未結案既非成功 finalize也非錯誤 finalize
// 在關閉前補送一次 MQTT Finalize部分出貨/未完成避免走倒數結束 / dispatchIndex 越界 / 中止
// 等非錯誤關閉路徑時整筆交易完全不上報isFinalizing 擋住正常成功/錯誤路徑不會重複上報
// 注意須在下方 buyList.clear() 之前執行 finalizeBuilder.build() 會讀 buyList 組出商品明細
if (!isFinalizing && finalizeBuilder != null && dispatchList != null && !dispatchList.isEmpty()) {
getLogs().info("dialogCancel偵測到尚未結案的出貨流程補送 MQTT Finalize部分/未完成)");
finalizeFailedDispatch("出貨流程關閉前補送結案");
}
closeDialogCountdown.shutdown();
int buyListSize = MyApp.getInstance().getBuyList().size();
MyApp.getInstance().getBuyList().clear();