From 4c9fb5e000541a6cca8ff0f0ff3e2a62461620b1 Mon Sep 17 00:00:00 2001 From: sky121113 Date: Fri, 29 May 2026 13:56:21 +0800 Subject: [PATCH] =?UTF-8?q?[FIX]=20=E4=BF=AE=E6=AD=A3=E4=B8=AD=E5=9C=8B?= =?UTF-8?q?=E9=86=AB=20(CMUH)=20=E9=A0=98=E8=97=A5=E7=95=B0=E5=B8=B8?= =?UTF-8?q?=E8=99=95=E7=90=86=E8=88=87=E9=8A=B7=E8=B2=A8=E6=B5=81=E6=B0=B4?= =?UTF-8?q?=E8=99=9F=E9=97=9C=E8=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. build.gradle: 升級修補版號 verPatch 31 -> 33。 2. TransactionFinalizeBuilder.java: 新增 orderNo 欄位並提供 setter。預設 orderNo 同 flowId,若呼叫 setOrderNo 則於組建 OrderPayload 時覆寫 order_no。 3. DispatchDialog.java (CMUH): - 中國醫 (Cmuh) 取物單 SN 序號改為覆寫 order_no,不再覆寫 flow_id、OrderId 與 ReportFlowId,避免機台底層流程因 ID 重複而拋錯。 - 修正領藥失敗的 Memo 寫入邏輯:機台未回應重試逾時,移除 insertDrgnoToMemo()。 - 整單出貨失敗結案時,檢查是否有任何出貨成功紀錄(新增 hasAnySuccessfulDispatch()),僅在有成功出貨時才寫入 Memo,整單未出貨時不寫入,允許使用者重新掃碼領藥。 --- app/build.gradle | 2 +- .../tools/TransactionFinalizeBuilder.java | 11 ++++++++- .../smartdevice/ui/dialog/DispatchDialog.java | 24 ++++++++++++++----- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 8be4b55..1d4925c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,7 +9,7 @@ plugins { // 避免不同尺寸機台間版本號產生衝突。 // ========================================================================= def verMinor = 1 -def verPatch = 31 +def verPatch = 33 android { diff --git a/app/src/main/java/com/unibuy/smartdevice/tools/TransactionFinalizeBuilder.java b/app/src/main/java/com/unibuy/smartdevice/tools/TransactionFinalizeBuilder.java index 9a9d3ff..71885d6 100644 --- a/app/src/main/java/com/unibuy/smartdevice/tools/TransactionFinalizeBuilder.java +++ b/app/src/main/java/com/unibuy/smartdevice/tools/TransactionFinalizeBuilder.java @@ -39,6 +39,9 @@ public class TransactionFinalizeBuilder { /** 機台本地流水號(格式:YYYYMMDDXXXX,例如 202605110001) */ private String flowId; + /** 銷貨紀錄訂單號,預設同 flow_id,特殊流程可覆寫 */ + private String orderNo; + /** 累積的出貨結果清單 */ private final List dispenseRecords = new ArrayList<>(); @@ -48,6 +51,7 @@ public class TransactionFinalizeBuilder { this.orderMachineTime = SDF.format(new Date()); // 在進入出貨流程時立即生成本次交易流水號(一次交易只生成一次) this.flowId = FlowIdGenerator.next(MyApp.getInstance()); + this.orderNo = this.flowId; Log.i(TAG, "TransactionFinalizeBuilder created, flow_id=" + this.flowId); } @@ -55,6 +59,10 @@ public class TransactionFinalizeBuilder { this.flowId = flowId; } + public void setOrderNo(String orderNo) { + this.orderNo = orderNo; + } + public void setCodeId(String codeId) { this.codeId = codeId; } @@ -126,6 +134,7 @@ public class TransactionFinalizeBuilder { payload.setDispense(new ArrayList<>(dispenseRecords)); Log.i(TAG, "TransactionFinalizePayload built: flow_id=" + flowId + + ", order_no=" + order.getOrder_no() + ", items=" + order.getItems().size() + ", dispense=" + dispenseRecords.size()); @@ -159,7 +168,7 @@ public class TransactionFinalizeBuilder { private TransactionFinalizePayload.OrderPayload buildOrderPayload(ReportFlowInfoStructure flowInfo) { TransactionFinalizePayload.OrderPayload order = new TransactionFinalizePayload.OrderPayload(); - order.setOrder_no(flowId); + order.setOrder_no(orderNo != null && !orderNo.isEmpty() ? orderNo : flowId); // 金額資訊 int totalAmount = flowInfo.getTotalPrice(); diff --git a/app/src/main/java/com/unibuy/smartdevice/ui/dialog/DispatchDialog.java b/app/src/main/java/com/unibuy/smartdevice/ui/dialog/DispatchDialog.java index 8832dfc..030fe17 100644 --- a/app/src/main/java/com/unibuy/smartdevice/ui/dialog/DispatchDialog.java +++ b/app/src/main/java/com/unibuy/smartdevice/ui/dialog/DispatchDialog.java @@ -340,12 +340,11 @@ public class DispatchDialog extends DialogAbstract { // 設定到 flowBarCode (會連動到後台 member_barcode 欄位) MyApp.getInstance().getReportFlowInfoData().setFlowBarCode(barcodeInfo); - // 序號是 flow_id,將交易流水號與本地 OrderId / ReportFlowId 覆寫為純藥單序號 SN + // CMUH: flow_id 保留 App 機台流水號;order_no 使用取物單序號 SN 方便後台對藥單。 if (sn != null && !sn.isEmpty()) { - finalizeBuilder.setFlowId(sn); + finalizeBuilder.setOrderNo(sn); MyApp.getInstance().getReportFlowInfoData().setOrderId(sn); - MyApp.getInstance().getReportFlowInfoData().setReportFlowId(sn); - getLogs().info("✅ 交易流水號已成功覆寫為純藥單序號 (SN):" + sn); + getLogs().info("✅ 中國醫銷貨紀錄 order_no 已設定為取物單序號 (SN):" + sn); } } catch (Exception e) { getLogs().warning(e); @@ -514,7 +513,6 @@ public class DispatchDialog extends DialogAbstract { buttonControlCountdown.shutdown(); if (isCmuh) { getLogs().info("機台未回應,已達 Cmuh 最大重試次數 10 次,嘗試重新連線下位機"); - insertDrgnoToMemo(); // 領藥失敗,新增醫令至 Memo 防止雙重領取 MyApp.getInstance().getDevXinYuanController().start(); if (!MyApp.checkAndReconnectDev()) { getLogs().info("無法連線到下位機,出貨作業中止"); @@ -969,8 +967,10 @@ public class DispatchDialog extends DialogAbstract { addFailedDispenseRecordsFromCurrent(); - if ("Cmuh".equalsIgnoreCase(com.unibuy.smartdevice.BuildConfig.FLAVOR_project)) { + if ("Cmuh".equalsIgnoreCase(com.unibuy.smartdevice.BuildConfig.FLAVOR_project) && hasAnySuccessfulDispatch()) { insertDrgnoToMemo(); + } else if ("Cmuh".equalsIgnoreCase(com.unibuy.smartdevice.BuildConfig.FLAVOR_project)) { + getLogs().info("CMUH 整單未出貨成功,不寫入 SN/DRGNO Memo,允許重新掃碼領藥"); } getLogs().info("出貨失敗,發送 MQTT Finalize 結案訊息: " + message); @@ -1015,6 +1015,18 @@ public class DispatchDialog extends DialogAbstract { } } + private boolean hasAnySuccessfulDispatch() { + if (dispatchList == null || dispatchList.isEmpty()) { + return false; + } + + for (DispatchStructure dispatch : dispatchList) { + if (dispatch.getCount() > 0) { + return true; + } + } + return false; + } private void deliverylot(int msgflag){ String productId = dispatchList.get(dispatchIndex).getProduct().getProductID();