diff --git a/app/src/main/java/com/unibuy/smartdevice/ui/devs/vmc/RecyclerVmcBuyListAdpter.java b/app/src/main/java/com/unibuy/smartdevice/ui/devs/vmc/RecyclerVmcBuyListAdpter.java index c3d79ed..248d8ec 100644 --- a/app/src/main/java/com/unibuy/smartdevice/ui/devs/vmc/RecyclerVmcBuyListAdpter.java +++ b/app/src/main/java/com/unibuy/smartdevice/ui/devs/vmc/RecyclerVmcBuyListAdpter.java @@ -4,9 +4,11 @@ import android.app.AlertDialog; import android.content.Context; import android.os.Handler; import android.os.Looper; +import android.util.TypedValue; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; @@ -38,6 +40,7 @@ public class RecyclerVmcBuyListAdpter extends RecyclerView.Adapter SlotList; private FragmentAbstract fragment; private boolean haveThings, doorError; + private volatile boolean isCheckingSlot = false; // 點擊鎖:防止非同步檢查期間重複點擊 public RecyclerVmcBuyListAdpter(FragmentAbstract fragment, List slotList) { this.logs = new Logs(this.getClass()); @@ -155,6 +158,9 @@ public class RecyclerVmcBuyListAdpter extends RecyclerView.Adapter { + isCheckingSlot = false; + BuyStructure buyProduct = new BuyStructure(slotProduct.getField(), slotProduct.getSlot(), + slotProduct.getProduct(), 1); + MyApp.getInstance().getBuyList().add(buyProduct); + fragment.getSrcHandlerMain().start(getClass().getSimpleName(), + FontendActivity.Option.STOP_COUNTDOWN.getOption(), "stop countdown"); + new MemberCardPickupDialog(context, fragment.getSrcHandlerMain()).show(); + }); } } - public void checkSlotHaveProduct(int slotnum, int slotcount) { + public void checkSlotHaveProduct(int slotnum, int slotcount, Runnable onSafe) { + haveThings = false; + doorError = false; + + java.util.concurrent.atomic.AtomicBoolean isHandled = new java.util.concurrent.atomic.AtomicBoolean(false); + + // 設定 3000ms 超時機制:如果機器沒反應,視為正常並繼續,避免程式卡住 + if (onSafe != null) { + new Handler(Looper.getMainLooper()).postDelayed(() -> { + if (!isHandled.getAndSet(true)) { + logs.info("VMC Check Slot Timeout - Approving Safe (Timeout Safeguard)"); + onSafe.run(); + } + }, 3000); + } + logs.info("RecyclerDialogBuyListAdpter 111111111111111" + slotnum); - // MyApp.getInstance().getDevXinYuanController().getReadBufferByNow(new - // DevCheckSlotByVMC(handlerMain)); logs.info("RecyclerDialogBuyListAdpter 222222222222222" + slotcount); MyApp.getInstance().getDevXinYuanController().addSendBuffer( MyApp.getInstance().getDevXinYuanController().getDevXinYuan().checkSlotPre(slotnum, slotcount)); @@ -191,13 +215,19 @@ public class RecyclerVmcBuyListAdpter extends RecyclerView.Adapter { AlertDialog dialog = new AlertDialog.Builder(context) @@ -239,6 +271,7 @@ public class RecyclerVmcBuyListAdpter extends RecyclerView.Adapter { d.dismiss(); + isCheckingSlot = false; handlerMain.start(getClass().getSimpleName(), BuyDialog.Option.FORCE_CLOSE.getOption(), "force close"); }) @@ -246,16 +279,24 @@ public class RecyclerVmcBuyListAdpter extends RecyclerView.Adapter { if (dialog.isShowing()) { dialog.dismiss(); + isCheckingSlot = false; handlerMain.start(getClass().getSimpleName(), BuyDialog.Option.FORCE_CLOSE.getOption(), "force close"); } }, 10_000); // 10 秒(10000 毫秒) }); } else if (doorError) { + if (isHandled.getAndSet(true)) return; // 取貨口門未關閉,提示使用者並阻止後續購買流程 doorError = false; handlerMain.start("RecycleFlowerBuyListAdpter", "取貨口門未正常關閉,請先確認門已關好"); @@ -267,6 +308,7 @@ public class RecyclerVmcBuyListAdpter extends RecyclerView.Adapter { d.dismiss(); + isCheckingSlot = false; handlerMain.start(getClass().getSimpleName(), BuyDialog.Option.FORCE_CLOSE.getOption(), "force close"); }) @@ -274,15 +316,29 @@ public class RecyclerVmcBuyListAdpter extends RecyclerView.Adapter { if (dialog.isShowing()) { dialog.dismiss(); + isCheckingSlot = false; handlerMain.start(getClass().getSimpleName(), BuyDialog.Option.FORCE_CLOSE.getOption(), "force close"); } }, 10_000); // 10 秒(10000 毫秒) }); + } else { + // 狀態安全且無異常,執行購買回呼 + if (!isHandled.getAndSet(true)) { + if (onSafe != null) { + new Handler(Looper.getMainLooper()).post(onSafe); + } + } } } } diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index 6c0c0b4..fb68171 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -387,7 +387,7 @@ Abnormal response, message error For product delivery issues, please contact the counter window! Abnormal reminder - There is something at the pickup port, please contact the service staff to handle it! + There is something at the pickup port, please remove it first knew Input Vehicle Reload Products diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 48d67bd..d7ffc21 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -387,7 +387,7 @@ 異常応答、メッセージエラー 商品配送に関するトラブルはカウンター窓口までお問い合わせください! 異常なリマインダー - ピックアップポートに何かある場合は、サービススタッフに連絡して対応してください! + 受取口に物があります、先に取り出してください 知っていた スマホバーコード への入力 商品データを同期 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e32feab..7a83c6a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -297,7 +297,7 @@ 回應異常,電文錯誤 商品出貨問題,請洽櫃台窗口! 異常提醒 - 取貨口有東西,請聯繫服務人員處理! + 取貨口有東西,請先取出 知道了 輸入載具 領取確認