From f06a4063c9570ddcf5a0f00693950e63ace8d372 Mon Sep 17 00:00:00 2001
From: buhuazhen <hua100783@gmail.com>
Date: 星期二, 03 三月 2026 11:54:04 +0800
Subject: [PATCH] fix(scan): 修复扫码组件重复触发和超时处理问题

---
 src/components/scan/index.vue |   96 ++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 85 insertions(+), 11 deletions(-)

diff --git a/src/components/scan/index.vue b/src/components/scan/index.vue
index 018c202..45dc54b 100644
--- a/src/components/scan/index.vue
+++ b/src/components/scan/index.vue
@@ -4,10 +4,18 @@
   </view>
 </template>
 <script lang="ts" setup>
+declare const plus: any;
+
 const main = ref();
 const receiver = ref();
 const filter = ref();
 const codeQueryTag = ref(false);
+const isInitialized = ref(false);
+const isReceiverRegistered = ref(false);
+const scanTimeoutMs = 3500;
+const scanTimeoutTimer = ref<ReturnType<typeof setTimeout> | null>(null);
+const isWaitingScanResult = ref(false);
+const isScanning = ref(false);
 const props = defineProps({
   emitName: {
     type: String,
@@ -15,7 +23,27 @@
   },
 });
 
+const clearScanTimeout = () => {
+  if (!scanTimeoutTimer.value) return;
+  clearTimeout(scanTimeoutTimer.value);
+  scanTimeoutTimer.value = null;
+};
+
+const startScanTimeoutWatch = () => {
+  clearScanTimeout();
+  isWaitingScanResult.value = true;
+  scanTimeoutTimer.value = setTimeout(() => {
+    if (!isWaitingScanResult.value) return;
+    console.warn("鎵爜瓒呮椂鏈敹鍒板箍鎾�");
+    isWaitingScanResult.value = false;
+    isScanning.value = false;
+    queryCode("");
+    scanTimeoutTimer.value = null;
+  }, scanTimeoutMs);
+};
+
 const initScan = () => {
+  if (isInitialized.value) return;
   main.value = plus.android.runtimeMainActivity(); //鑾峰彇activity
   let IntentFilter: any = plus.android.importClass("android.content.IntentFilter");
   filter.value = new IntentFilter();
@@ -30,36 +58,67 @@
       var banMaSacanInfo = intent.getStringExtra(
         "com.motorolasolutions.emdk.datawedge.data_string"
       );
+      if (!banMaSacanInfo) {
+        banMaSacanInfo =
+          intent.getStringExtra("com.symbol.datawedge.data_string") ||
+          intent.getStringExtra("data");
+      }
       // callback(intent.getStringExtra('com.motorolasolutions.emdk.datawedge.data_string'));
       console.log("鏂戦┈鎵弿缁撴灉", banMaSacanInfo);
       // 浼犲叆鎺ユ敹鍒扮殑鍙傛暟
-      queryCode(banMaSacanInfo);
+      isWaitingScanResult.value = false;
+      isScanning.value = false;
+      clearScanTimeout();
+      if (!banMaSacanInfo) {
+        console.warn("鎵弿杩斿洖涓虹┖");
+      }
+      queryCode(banMaSacanInfo || "");
     },
   });
+  isInitialized.value = true;
 };
 
 // 寮�鍚箍鎾�
 const startScan = () => {
   //  #ifdef APP
+  if (!isInitialized.value) {
+    initScan();
+  }
+  if (!main.value || !receiver.value || !filter.value || isReceiverRegistered.value) return;
   console.log("startScan,寮�鍚箍鎾帴鏀�");
-  main.value.registerReceiver(receiver.value, filter.value);
+  try {
+    main.value.registerReceiver(receiver.value, filter.value);
+    isReceiverRegistered.value = true;
+  } catch (error) {
+    console.error("startScan澶辫触", error);
+  }
   // #endif
 };
 // 鍏抽棴骞挎挱
 const stopScan = () => {
   //  #ifdef APP
+  if (!main.value || !receiver.value || !isReceiverRegistered.value) return;
   console.log("stopScan缁撴潫");
-  main.value.unregisterReceiver(receiver.value);
+  try {
+    main.value.unregisterReceiver(receiver.value);
+  } catch (error) {
+    console.error("stopScan澶辫触", error);
+  } finally {
+    isReceiverRegistered.value = false;
+  }
   // #endif
 };
 
 const queryCode = (code: any) => {
   //  #ifdef APP
-  if (codeQueryTag.value) return false;
+  if (codeQueryTag.value) {
+    console.warn("鐭椂闂村唴閲嶅鍥炶皟琚嫤鎴�");
+    return false;
+  }
   codeQueryTag.value = true;
   setTimeout(function () {
     codeQueryTag.value = false;
-  }, 150);
+  }, 300);
   // console.log('-****--鎵爜code锛� ', code);
   let data = code;
   uni.$emit(props.emitName, {
@@ -70,14 +129,21 @@
 
 const triggerScan = () => {
   console.log("瑙﹀彂鎵弿");
-  // 鑾峰彇Android鎰忓浘绫�
-  let Intent = plus.android.importClass("android.content.Intent");
-  // 瀹炰緥鍖栨剰鍥�
-  let intent = new Intent();
-  // 瀹氫箟鎰忓浘锛岀敱鍘傚晢鎻愪緵(姝ゅ璁剧疆涓轰笢澶х殑锛� 寮�濮嬫壂鎻忓箍鎾璫om.scan.onStartScan锛屽搴旂殑鍋滄鎵弿骞挎挱涓篶om.scan.onEndScan)
+  if (isScanning.value) {
+    console.warn("宸叉湁鎵弿杩涜涓紝蹇界暐鏈瑙﹀彂");
+    return;
+  }
+  isScanning.value = true;
+
+  if (!main.value) return;
+
+  startScanTimeoutWatch();
+
+  const Intent = plus.android.importClass("android.content.Intent");
+  const intent = new Intent();
   intent.setAction("com.symbol.datawedge.api.ACTION");
   intent.putExtra("com.symbol.datawedge.api.SOFT_SCAN_TRIGGER", "START_SCANNING");
-  // 骞挎挱杩欎釜鎰忓浘
+
   main.value.sendBroadcast(intent);
 };
 
@@ -89,11 +155,19 @@
   startScan();
 });
 
+onShow(() => {
+  startScan();
+});
+
 onHide(() => {
+  isWaitingScanResult.value = false;
+  clearScanTimeout();
   stopScan();
 });
 
 onUnmounted(() => {
+  isWaitingScanResult.value = false;
+  clearScanTimeout();
   stopScan();
 });
 

--
Gitblit v1.9.3