Kaynağa Gözat

Update 优化PDA读取电子编号

Yue 3 hafta önce
ebeveyn
işleme
c6c188ed9a

+ 3 - 3
UI/CF.APP/chicken_farm/android/app/src/main/java/com/vber/chicken_farm/rfid/RfidService.java

@@ -658,9 +658,9 @@ public class RfidService extends Service {
                 return false;
             }
             Log.d(RfidConstants.TAG, "RFID读卡已启动");
-            // 1 秒后停止读卡
+            // 5 秒后停止读卡
             idleHandler.postDelayed(() -> {
-                Log.d(RfidConstants.TAG, "1秒RFID读卡自动停止");
+                Log.d(RfidConstants.TAG, "5秒RFID读卡自动停止");
                 if (isScanning) {
                     stopScan();
                     if (listener != null
@@ -668,7 +668,7 @@ public class RfidService extends Service {
                         listener.onScanError("未读卡到电子编号");
                     }
                 }
-            }, 1 * 1000);
+            }, 5 * 1000);
         } catch (Exception e) {
             Log.e(RfidConstants.TAG, "读卡失败:", e);
             isScanning = false;

+ 46 - 7
UI/CF.APP/chicken_farm/lib/components/vb_electronic_id_field.dart

@@ -1,3 +1,5 @@
+import 'dart:async';
+
 import 'package:chicken_farm/core/utils/logger.dart';
 import 'package:chicken_farm/modes/rfid/rfid_model.dart';
 import 'package:flutter/material.dart';
@@ -21,6 +23,7 @@ class VberElectronicIdsField extends StatefulWidget {
   final String placeholder; // 未识别时显示的占位符文本
   final String multiplePlaceholder; // 多个模式下未识别时显示的占位符文本
   final String multipleFormat; // 多个模式下有值时的显示格式,包含一个%d占位符表示数量
+  final int scanMilliseconds; // 扫描时间,到达时间后自动停止扫描
 
   const VberElectronicIdsField({
     super.key,
@@ -36,6 +39,7 @@ class VberElectronicIdsField extends StatefulWidget {
     this.placeholder = '未识别',
     this.multiplePlaceholder = '未识别',
     this.multipleFormat = '已识别 %d 枚电子编号',
+    this.scanMilliseconds = 3000,
   });
 
   @override
@@ -45,6 +49,8 @@ class VberElectronicIdsField extends StatefulWidget {
 class _VberElectronicIdsFieldState extends State<VberElectronicIdsField> {
   bool _isScanning = false; // 内部管理识别状态
   bool _isMultiple = false; // 内部管理识别状态
+  Timer? _autoStopTimer; // 自动停止扫描的定时器
+  int _scanMilliseconds = 3000;
 
   @override
   void initState() {
@@ -59,19 +65,24 @@ class _VberElectronicIdsFieldState extends State<VberElectronicIdsField> {
       },
     );
     _isMultiple = widget.multipleScan ?? widget.multiple;
+    _scanMilliseconds = widget.scanMilliseconds;
   }
 
   @override
   void dispose() {
+    // 取消自动停止定时器
+    _autoStopTimer?.cancel();
+    _autoStopTimer = null;
     RfidManager.instance.disposeRfid();
+
     super.dispose();
   }
 
   void _handleRfidScanned(String rfid) {
     logger.d('识别成功,已识别电子编号:$rfid');
-    setState(() {
-      _isScanning = false;
-    });
+    // setState(() {
+    //   _isScanning = false;
+    // });
     if (widget.onIdScanned != null) {
       widget.onIdScanned!(rfid);
     }
@@ -79,9 +90,9 @@ class _VberElectronicIdsFieldState extends State<VberElectronicIdsField> {
 
   void _handleRfidsScanned(List<RfidModel> rfidList) {
     logger.d('识别成功,已识别枚${rfidList.length}电子编号');
-    setState(() {
-      _isScanning = false;
-    });
+    // setState(() {
+    //   _isScanning = false;
+    // });
     if (widget.onIdsScanned != null) {
       widget.onIdsScanned!(rfidList);
     }
@@ -96,7 +107,11 @@ class _VberElectronicIdsFieldState extends State<VberElectronicIdsField> {
 
   void _handleKeyPress(String keyCode) {
     if (keyCode == 'KEY_619') {
-      _scanRfid();
+      if (_isScanning) {
+        _stopScan();
+      } else {
+        _scanRfid();
+      }
     }
   }
 
@@ -116,6 +131,30 @@ class _VberElectronicIdsFieldState extends State<VberElectronicIdsField> {
       setState(() {
         _isScanning = false;
       });
+    } else {
+      _autoStopTimer = Timer(Duration(milliseconds: _scanMilliseconds), () {
+        if (_isScanning) {
+          // 确保仍在扫描状态
+          _stopScan();
+        }
+      });
+    }
+  }
+
+  void _stopScan() async {
+    try {
+      if (_isScanning) {
+        await RfidManager.instance.stopRead();
+      }
+      // 取消自动停止定时器
+      _autoStopTimer?.cancel();
+      _autoStopTimer = null;
+    } catch (e) {
+      // ignore: avoid_print
+    } finally {
+      setState(() {
+        _isScanning = false;
+      });
     }
   }