[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:
parent
317dec1084
commit
9bfb429392
@ -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);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user