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();