From f46dbe0b5135c0667eebfa21fac63ef93b6e1aa0 Mon Sep 17 00:00:00 2001 From: sky121113 Date: Fri, 26 Jun 2026 17:54:05 +0800 Subject: [PATCH] =?UTF-8?q?[FEAT]=20=E5=8F=96=E8=B2=A8=E7=A2=BC=E6=94=B9?= =?UTF-8?q?=E7=B6=81=E5=95=86=E5=93=81=EF=BC=9AApp=20=E5=88=B7=E7=A2=BC?= =?UTF-8?q?=E4=BE=9D=E5=8D=B3=E6=99=82=E5=BA=AB=E5=AD=98=E8=87=AA=E6=8C=91?= =?UTF-8?q?=E5=8F=AF=E5=87=BA=E8=B2=A8=E9=81=93=EF=BC=88=E5=8D=87=E7=89=88?= =?UTF-8?q?=E8=99=9F=20verPatch=2029=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. StarCloudAPI.verifyPickupCode 解析 B660 回傳的 product_id(數字且可能為 JSON null,改用 optInt 避免 optString 把 null 轉成 "null" 字串),PickupVerificationCallback.onSuccess 新增 productId 參數。 2. FontendPickupCodeDialog.onSuccess 依回傳分流:有 product_id(綁商品碼)→ getSlotDataByPid 取代表貨道 + allocateBuyStructures 自挑可出貨道(已濾 count>0 && !lock && !expired,壞一條自動換同商品下一條);無 product_id(舊綁貨道碼)→ 沿用原 slot_no 路徑,向後相容。 3. 綁商品碼若挑不到可出貨道(全缺貨/鎖定/過期)→ 提示缺貨並取消。 4. 升 verPatch 26→29(S9XYU OTA:versionName 21_02_29、versionCode 210229)。 --- app/build.gradle | 2 +- .../smartdevice/external/StarCloudAPI.java | 13 +++-- .../ui/dialog/FontendPickupCodeDialog.java | 52 ++++++++++++------- 3 files changed, 45 insertions(+), 22 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d1c6a4d..6270505 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,7 +10,7 @@ plugins { // 避免不同尺寸機台間版本號產生衝突。 // ========================================================================= def verMinor = 2 -def verPatch = 26 +def verPatch = 29 diff --git a/app/src/main/java/com/unibuy/smartdevice/external/StarCloudAPI.java b/app/src/main/java/com/unibuy/smartdevice/external/StarCloudAPI.java index 4ba6ceb..eca7f13 100644 --- a/app/src/main/java/com/unibuy/smartdevice/external/StarCloudAPI.java +++ b/app/src/main/java/com/unibuy/smartdevice/external/StarCloudAPI.java @@ -646,9 +646,13 @@ public class StarCloudAPI { void onFailure(String message); } - /** 取貨碼驗證回呼:成功時回傳 code_id 與要出貨的貨道 slot_no。 */ + /** + * 取貨碼驗證回呼:成功時回傳 code_id。 + * 綁商品碼 → productId 有值(App 依即時庫存自挑可出貨道),slotNo 為 -1; + * 綁貨道碼(舊) → slotNo 有值、productId 為空字串。 + */ public interface PickupVerificationCallback { - void onSuccess(String codeId, int slotNo); + void onSuccess(String codeId, int slotNo, String productId); void onFailure(String message); } @@ -832,7 +836,10 @@ public class StarCloudAPI { JSONObject data = res.optJSONObject("data"); String codeId = data != null ? data.optString("code_id", "") : ""; int slotNo = data != null ? data.optInt("slot_no", -1) : -1; - callback.onSuccess(codeId, slotNo); + // product_id 為數字且可能為 JSON null;用 optInt 避免 optString 把 null 轉成 "null" 字串 + int pid = data != null ? data.optInt("product_id", 0) : 0; + String productId = pid > 0 ? String.valueOf(pid) : ""; + callback.onSuccess(codeId, slotNo, productId); } else { callback.onFailure(res.optString("message", "取貨碼驗證失敗")); } diff --git a/app/src/main/java/com/unibuy/smartdevice/ui/dialog/FontendPickupCodeDialog.java b/app/src/main/java/com/unibuy/smartdevice/ui/dialog/FontendPickupCodeDialog.java index 3db4304..355195a 100644 --- a/app/src/main/java/com/unibuy/smartdevice/ui/dialog/FontendPickupCodeDialog.java +++ b/app/src/main/java/com/unibuy/smartdevice/ui/dialog/FontendPickupCodeDialog.java @@ -434,27 +434,43 @@ public class FontendPickupCodeDialog extends DialogAbstract { new com.unibuy.smartdevice.external.StarCloudAPI(getHandlerMain(), getHandlerMain()) .verifyPickupCode(code, new com.unibuy.smartdevice.external.StarCloudAPI.PickupVerificationCallback() { @Override - public void onSuccess(String codeId, int slotNo) { + public void onSuccess(String codeId, int slotNo, String productId) { try { - SlotStructure slotProduct = MyApp.getInstance().getSlotData(SlotField.VMC.getField(), slotNo); - if (slotProduct == null) { - setStatusText(getContext().getString(R.string.product_not_found)); - openBarcode = true; - return; - } - if (slotProduct.isLock()) { - getSrcHandlerMain().start("FontendPickupCodeDialog", "@" + getContext().getString(R.string.product_sales_suspended)); - dialogCancel(); - return; - } - if (slotProduct.getCount() == 0) { - getSrcHandlerMain().start("FontendPickupCodeDialog", "@" + getContext().getString(R.string.product_out_of_stock)); - dialogCancel(); - return; + java.util.List buys; + if (productId != null && !productId.isEmpty()) { + // 綁商品碼:後台只給商品,App 依本機即時庫存/鎖定/效期自挑可出貨道 + // (allocateBuyStructures 已濾 count>0 && !lock && !expired,壞一條會換同商品下一條) + SlotStructure rep = MyApp.getInstance().getSlotDataByPid(productId); + buys = MyApp.getInstance().allocateBuyStructures(rep, 1); + if (buys.isEmpty()) { + getSrcHandlerMain().start("FontendPickupCodeDialog", "@" + getContext().getString(R.string.product_out_of_stock)); + dialogCancel(); + return; + } + } else { + // 綁貨道碼(舊):後台指定貨道,沿用原行為,向後相容 + SlotStructure slotProduct = MyApp.getInstance().getSlotData(SlotField.VMC.getField(), slotNo); + if (slotProduct == null) { + setStatusText(getContext().getString(R.string.product_not_found)); + openBarcode = true; + return; + } + if (slotProduct.isLock()) { + getSrcHandlerMain().start("FontendPickupCodeDialog", "@" + getContext().getString(R.string.product_sales_suspended)); + dialogCancel(); + return; + } + if (slotProduct.getCount() == 0) { + getSrcHandlerMain().start("FontendPickupCodeDialog", "@" + getContext().getString(R.string.product_out_of_stock)); + dialogCancel(); + return; + } + buys = new java.util.ArrayList<>(); + buys.add(new BuyStructure(slotProduct.getField(), slotProduct.getSlot(), slotProduct.getProduct(), 1)); } + MyApp.getInstance().getBuyList().clear(); - MyApp.getInstance().getBuyList().add( - new BuyStructure(slotProduct.getField(), slotProduct.getSlot(), slotProduct.getProduct(), 1)); + MyApp.getInstance().getBuyList().addAll(buys); MyApp.getInstance().getReportFlowInfoData().setFlowType(6); // 取貨碼 → payment_type 6 MyApp.getInstance().getReportFlowInfoData().setFlowBarCode(code);