[FIX] 修復刷卡機交易成功卻不繼續出貨流程

1. 修正 DevNFCPayController.execute():刷卡機(NFC/悠遊卡/手機/信用卡)回傳的 404 byte 電文本身已含 responseCode(成功為 0000),直接以 devNFCPay.read() 解析該段並送出 RESPONSE。
2. 移除先前誤加的「再以 readListen 等待第二段電文」邏輯:刷卡機僅送一段,等不到第二段導致倒數逾時、RESPONSE 從未送達對話框、changeDispatch() 無法觸發,造成「刷卡機顯示成功卻不出貨」。
3. 保留 isShowDialog / isShuttingDown 生命週期防護;此 controller 為所有感應付款共用,一次修復全部感應類付款。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
sky121113 2026-06-16 08:54:19 +08:00
parent 317dec1084
commit 9bfb429392

View File

@ -151,30 +151,17 @@ public class DevNFCPayController extends HandlerMainScheduler {
getLogs().info("電文接收:" + readData);
MyApp.getInstance().getReportFlowInfoData().setFlowRequestInfo(readData);
while (isRun() && MyApp.getInstance().isShowDialog()) { // 增加狀態檢查
byte[] buffer = comPort2.readListen(30, 200);
// 修復 付款成功卻不出貨交易結果 responseCode就在這段 404 byte 電文裡
// 直接解析本段即可先前版本誤改成再用 readListen 第二段電文才解析
// 但刷卡機只送這一段第二段永遠等不到 倒數逾時 RESPONSE 從未送出 不出貨
HashMap<String, String> readMap = devNFCPay.read(readData);
String code = readMap.get("code");
getLogs().info("交易完成,回傳代碼: " + code);
if (buffer.length > 0) {
getLogs().debug("NFC 收到資料: " + PortTools.showHex(buffer));
String rxData = new String(buffer, StandardCharsets.UTF_8);
if (rxData.contains(String.valueOf((char) 0x03))) { // ETX
HashMap<String, String> response = devNFCPay.read(rxData);
String code = response.get("code");
if (isRun() && !isShuttingDown && MyApp.getInstance().isShowDialog()) { // 最後回報前的檢查
getHandlerMain().start(getClass().getSimpleName(), Option.RESPONSE.getOption(), code);
} else {
getLogs().info("🚫 控制器已停止或對話框已關閉,捨棄 NFC 回傳結果");
}
break;
}
}
if (!isRun() || isShuttingDown || !MyApp.getInstance().isShowDialog()) {
getLogs().info("NFC 讀取中斷: 控制器關閉或對話框消失");
break;
}
if (isRun() && !isShuttingDown && MyApp.getInstance().isShowDialog()) { // 回報前的生命週期檢查
getHandlerMain().start(getClass().getSimpleName(), Option.RESPONSE.getOption(), code);
} else {
getLogs().info("🚫 控制器已停止或對話框已關閉,捨棄 NFC 回傳結果");
}
} catch (LogsParseException | LogsIOException e) {
getLogs().warning(e);