Browse Source

Update 优化页面,增加619按键双击事件(用于触发扫码),超时时间设置为120分钟

Yue 3 days ago
parent
commit
fd90cfd902

+ 32 - 4
UI/CF.APP/chicken_farm/android/app/src/main/java/com/vber/chicken_farm/MainActivity.java

@@ -22,6 +22,11 @@ public class MainActivity extends FlutterActivity {
     private ScanMethodCallHandler scanMethodCallHandler;
     private RfidMethodCallHandler rfidMethodCallHandler;
     
+    // 双击检测相关变量
+    private static final long DOUBLE_CLICK_TIME_DELTA = 300; // 双击时间间隔阈值,单位毫秒
+    private long lastKeyDownTime = 0; // 上次按键按下的时间
+    private int lastKeyCode = -1; // 上次按下的按键码
+    
     @Override
     public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
         super.configureFlutterEngine(flutterEngine);
@@ -98,11 +103,34 @@ public class MainActivity extends FlutterActivity {
                 return true; // 表示事件已被处理
             }
         }
-        // 处理619按键事件
+        // 处理619按键事件(包括双击检测)
         if (keyCode == 619) {
-            if (rfidMethodCallHandler != null) {
-                rfidMethodCallHandler.onKeyEvent(keyCode);
-                return true; // 表示事件已被处理
+            long currentTime = System.currentTimeMillis();
+            // 检查是否为双击(相同按键且在时间阈值内)
+            if (lastKeyCode == keyCode && (currentTime - lastKeyDownTime) < DOUBLE_CLICK_TIME_DELTA) {
+                // 双击事件
+                lastKeyCode = -1; 
+                Log.d(TAG, "按键双击: " + keyCode);
+                if (scanMethodCallHandler != null) {
+                    scanMethodCallHandler.onDoubleKeyEvent(keyCode);
+                    return true; // 表示事件已被处理
+                }
+            } else {
+                // 单击事件,记录按键信息用于下次判断
+                lastKeyCode = keyCode;
+                lastKeyDownTime = currentTime;
+                new android.os.Handler().postDelayed(() -> {
+                    // 如果是双击,lastKeyCode改为-1,不会触发单击事件
+                    // 检查lastKeyCode 是否为keyCode
+                    if (lastKeyCode == keyCode) {
+                        // 确认为单击事件
+                        Log.d(TAG, "按键单击: " + keyCode);
+                        if (rfidMethodCallHandler != null) {
+                            rfidMethodCallHandler.onKeyEvent(keyCode);
+                        }
+                    }
+                }, DOUBLE_CLICK_TIME_DELTA);
+                return true;
             }
         }        
         // 其他按键处理

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

@@ -41,8 +41,8 @@ public final class RfidConstants {
     // 默认连接重试次数
     public static final int DEFAULT_CONNECT_RETRY_TIMES = 3;
 
-    // 扫描空闲超时时间(5分钟)
-    public static final long SCAN_IDLE_TIMEOUT_MS = 5 * 60 * 1000L;
+    // 扫描空闲超时时间(120分钟)
+    public static final long SCAN_IDLE_TIMEOUT_MS = 120 * 60 * 1000L;
 
 
     private RfidConstants() {

+ 10 - 2
UI/CF.APP/chicken_farm/android/app/src/main/java/com/vber/chicken_farm/scan/ScanMethodCallHandler.java

@@ -160,7 +160,7 @@ public class ScanMethodCallHandler implements MethodCallHandler, ScanCallback {
         channel.invokeMethod("onScanError", errorMsg);
     }
 
-    // 新增方法:处理按键事件并通知Flutter
+    // 处理按键事件并通知Flutter
     public void onKeyEvent(int keyCode) {
         if (keyCode == 622) {
             // 向Flutter发送按键622事件
@@ -169,7 +169,15 @@ public class ScanMethodCallHandler implements MethodCallHandler, ScanCallback {
             // 向Flutter发送按键623事件
             channel.invokeMethod("onKeyPress", "KEY_623");
         }
-        
+    }
+
+    // 处理按键事件并通知Flutter
+    public void onDoubleKeyEvent(int keyCode) {
+        if (keyCode == 619) {
+            // 向Flutter发送按键619事件
+            Log.d(TAG, "双击按键619事件");
+            channel.invokeMethod("onDoubleKeyPress", "KEY_619");
+        }
     }
 
     /**

+ 1 - 1
UI/CF.APP/chicken_farm/android/app/src/main/java/com/vber/chicken_farm/scan/ScanService.java

@@ -28,7 +28,7 @@ public class ScanService extends Service {
     /** 单次扫码超时时间(毫秒):无结果则停止解码,保留扫描头 */
     public static final long SCAN_SINGLE_TIMEOUT_MS = 5000;
     /** 扫描头闲置超时时间(毫秒):打开后无扫码请求则关闭 */
-    public static final long SCAN_IDLE_TIMEOUT_MS = 5 * 60 * 1000L; // 5分钟
+    public static final long SCAN_IDLE_TIMEOUT_MS = 120 * 60 * 1000L; // 120分钟
     /** 默认灯光模式:开启照明+瞄准 */
     public static final int DEFAULT_LIGHT_MODE = ScanConstants.LIGHT_MODE_BOTH;
     

+ 1 - 1
UI/CF.APP/chicken_farm/lib/components/vb_rfid_field.dart

@@ -77,7 +77,7 @@ class _VberRfidFieldState extends State<VberRfidField> {
   }
 
   void _handleRfidsScanned(List<RfidModel> rfidList) {
-    logger.d('识别成功,已识别电子编号:$rfidList');
+    logger.d('识别成功,已识别枚${rfidList.length}电子编号');
     setState(() {
       _isScanning = false;
     });

+ 9 - 11
UI/CF.APP/chicken_farm/lib/core/services/pda/scan_channel.dart

@@ -11,7 +11,7 @@ class ScanChannel {
   static void initScanListener({
     required Function(String) onScanResult,
     required Function(String) onScanError,
-    Function(int)? onKeyPress,
+    Function(bool, String)? onKeyPress,
   }) {
     _channel.setMethodCallHandler((MethodCall call) async {
       switch (call.method) {
@@ -22,17 +22,15 @@ class ScanChannel {
           onScanError(call.arguments);
           break;
         case 'onKeyPress': // 处理按键事件
+          logger.d("前端单击按键:${call.arguments}");
           if (onKeyPress != null) {
-            onKeyPress(call.arguments);
-          } else {
-            logger.d("前端扫码按键:${call.arguments}");
-            if (call.arguments == 'KEY_622') {
-              startScan();
-            } else if (call.arguments == 'KEY_623') {
-              startScan();
-            } else {
-              logger.d("未注册[${call.arguments}]按键事件");
-            }
+            onKeyPress(false, call.arguments);
+          }
+          break;
+        case 'onDoubleKeyPress': // 处理按键事件
+          logger.d("前端双击按键:${call.arguments}");
+          if (onKeyPress != null) {
+            onKeyPress(true, call.arguments);
           }
           break;
         default:

+ 2 - 2
UI/CF.APP/chicken_farm/lib/core/utils/toast.dart

@@ -10,7 +10,7 @@ class ToastUtil {
   static void success(
     String message, [
     Toast? toastLength = Toast.LENGTH_SHORT,
-    ToastGravity? gravity = ToastGravity.TOP,
+    ToastGravity? gravity = ToastGravity.CENTER,
     Color? textColor = Colors.white,
     double? fontSize = 16.0,
   ]) => show(message, Colors.green, toastLength, gravity, textColor, fontSize);
@@ -239,7 +239,7 @@ class ToastUtil {
 
     // 添加消息到集合中
     _recentMessages.add(message);
-    
+
     // 设置定时器,在一定时间后移除消息记录
     Future.delayed(_deduplicationDuration, () {
       _recentMessages.remove(message);

+ 37 - 22
UI/CF.APP/chicken_farm/lib/pages/breeding/batch_create_page.dart

@@ -2,6 +2,7 @@ import 'package:chicken_farm/apis/index.dart';
 import 'package:chicken_farm/components/vb_rfid_field.dart';
 import 'package:chicken_farm/components/vb_search_select.dart';
 import 'package:chicken_farm/components/vb_select.dart';
+import 'package:chicken_farm/core/utils/logger.dart';
 import 'package:chicken_farm/modes/breeding/batch.dart';
 import 'package:chicken_farm/modes/breeding/family.dart';
 import 'package:chicken_farm/modes/rfid/rfid_model.dart';
@@ -64,9 +65,19 @@ class _BatchCreatePageState extends State<BatchCreatePage> {
             const SizedBox(height: 20),
             // 已识别的电子编号列表
             if (_rfids.isNotEmpty) ...[
-              const Text(
-                '已识别的电子编号',
-                style: TextStyle(fontWeight: FontWeight.bold),
+              Row(
+                mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                children: [
+                  const Text(
+                    '已识别的电子编号',
+                    style: TextStyle(fontWeight: FontWeight.bold),
+                  ),
+                  IconButton(
+                    icon: const Icon(Icons.clear, size: 18),
+                    onPressed: _clearRfids,
+                    tooltip: '清空编号',
+                  ),
+                ],
               ),
               const SizedBox(height: 10),
               Expanded(
@@ -209,21 +220,21 @@ class _BatchCreatePageState extends State<BatchCreatePage> {
           setState(() {
             // 将新的RFID添加到列表中
             for (var rfid in newRfids) {
-              _rfids.add(rfid.uid);
+              _rfids.insert(0, rfid.uid);
             }
           });
-          if (newRfids.length == scannedRfids.length) {
-            // 全都是新添加的
-            ToastUtil.success("成功添加 ${newRfids.length} 枚新的电子编号");
-          } else {
-            // 部分是重复的
-            ToastUtil.info(
-              "新增 ${newRfids.length} 枚电子编号,${scannedRfids.length - newRfids.length} 枚已存在",
-            );
-          }
+          ToastUtil.success("新增 ${newRfids.length} 枚电子编号");
+          // if (newRfids.length == scannedRfids.length) {
+          //   // 全都是新添加的
+          //   ToastUtil.success("成功添加 ${newRfids.length} 枚新的电子编号");
+          // } else {
+          //   // 部分是重复的
+          //   ToastUtil.info("新增 ${newRfids.length} 枚电子编号");
+          //   // ,${scannedRfids.length - newRfids.length} 枚已存在
+          // }
         } else {
           // 所有RFID都已存在
-          ToastUtil.info("所有电子编号已存在");
+          ToastUtil.info("电子编号已存在");
         }
       },
       multiple: true,
@@ -233,14 +244,6 @@ class _BatchCreatePageState extends State<BatchCreatePage> {
     );
   }
 
-  // // 清空所有已识别的电子编号
-  // void _clearRfids() {
-  //   setState(() {
-  //     _rfids.clear();
-  //   });
-  //   ToastUtil.info('已清空所有电子编号');
-  // }
-
   // 移除指定索引的电子编号
   void _removeRfid(int index) {
     setState(() {
@@ -248,6 +251,14 @@ class _BatchCreatePageState extends State<BatchCreatePage> {
     });
   }
 
+  // 清空所有已识别的电子编号
+  void _clearRfids() {
+    setState(() {
+      _rfids.clear();
+    });
+    ToastUtil.info('已清空所有电子编号');
+  }
+
   // 提交数据
   void _handleSubmit() {
     // 在实际应用中,这里会发送数据到服务器
@@ -258,6 +269,10 @@ class _BatchCreatePageState extends State<BatchCreatePage> {
       ),
     );
 
+    for (var rfid in _rfids) {
+      logger.d('提交电子编号: $rfid');
+    }
+
     // 提交后重置表单
     setState(() {
       _rfids.clear();

+ 29 - 22
UI/CF.APP/chicken_farm/lib/pages/breeding/batch_culling_page.dart

@@ -1,4 +1,5 @@
 import 'package:chicken_farm/components/vb_rfid_field.dart';
+import 'package:chicken_farm/core/utils/logger.dart';
 import 'package:chicken_farm/modes/rfid/rfid_model.dart';
 import 'package:flutter/material.dart';
 import 'package:chicken_farm/components/vb_app_bar.dart';
@@ -60,9 +61,19 @@ class _BatchCullingPageState extends State<BatchCullingPage> {
             const SizedBox(height: 20),
             // 已识别的电子编号列表
             if (_rfids.isNotEmpty) ...[
-              const Text(
-                '已识别的电子编号',
-                style: TextStyle(fontWeight: FontWeight.bold),
+              Row(
+                mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                children: [
+                  const Text(
+                    '已识别的电子编号',
+                    style: TextStyle(fontWeight: FontWeight.bold),
+                  ),
+                  IconButton(
+                    icon: const Icon(Icons.clear, size: 18),
+                    onPressed: _clearRfids,
+                    tooltip: '清空编号',
+                  ),
+                ],
               ),
               const SizedBox(height: 10),
               Expanded(
@@ -117,21 +128,13 @@ class _BatchCullingPageState extends State<BatchCullingPage> {
           setState(() {
             // 将新的RFID添加到列表中
             for (var rfid in newRfids) {
-              _rfids.add(rfid.uid);
+              _rfids.insert(0, rfid.uid);
             }
           });
-          if (newRfids.length == scannedRfids.length) {
-            // 全都是新添加的
-            ToastUtil.success("成功添加 ${newRfids.length} 枚新的电子编号");
-          } else {
-            // 部分是重复的
-            ToastUtil.info(
-              "新增 ${newRfids.length} 枚电子编号,${scannedRfids.length - newRfids.length} 枚已存在",
-            );
-          }
+          ToastUtil.success("新增 ${newRfids.length} 枚电子编号");
         } else {
           // 所有RFID都已存在
-          ToastUtil.info("所有电子编号已存在");
+          ToastUtil.info("电子编号已存在");
         }
       },
       multiple: true,
@@ -197,14 +200,6 @@ class _BatchCullingPageState extends State<BatchCullingPage> {
     );
   }
 
-  // // 清空所有已识别的电子编号
-  // void _clearRfids() {
-  //   setState(() {
-  //     _rfids.clear();
-  //   });
-  //   ToastUtil.info('已清空所有电子编号');
-  // }
-
   // 移除指定索引的电子编号
   void _removeRfid(int index) {
     setState(() {
@@ -212,6 +207,14 @@ class _BatchCullingPageState extends State<BatchCullingPage> {
     });
   }
 
+  // 清空所有已识别的电子编号
+  void _clearRfids() {
+    setState(() {
+      _rfids.clear();
+    });
+    ToastUtil.info('已清空所有电子编号');
+  }
+
   // 提交数据
   void _handleSubmit() {
     // 在实际应用中,这里会发送数据到服务器
@@ -221,11 +224,15 @@ class _BatchCullingPageState extends State<BatchCullingPage> {
         backgroundColor: Colors.green,
       ),
     );
+    for (var rfid in _rfids) {
+      logger.d('提交电子编号: $rfid');
+    }
 
     // 提交后重置表单
     setState(() {
       _rfids.clear();
       _disposalMethod = null;
+      _cullReason = null;
     });
   }
 }

+ 37 - 5
UI/CF.APP/chicken_farm/lib/pages/breeding/cage_change_page.dart

@@ -57,7 +57,6 @@ class _CageChangePageState extends State<CageChangePage> {
     // 初始化监听
     ScanChannel.initScanListener(
       onScanResult: (result) {
-        logger.d("扫码结果:$result tag: $_scanTag");
         if (_scanTag == 1) {
           // 源笼号
           setState(() {
@@ -87,6 +86,16 @@ class _CageChangePageState extends State<CageChangePage> {
           _isScanningSource = false;
         });
       },
+      onKeyPress: (bool isDouble, String keyCode) {
+        if (isDouble && keyCode == "KEY_619") {
+          _sourceCageController.clear();
+          _targetCageController.clear();
+          _scanTag = 1;
+          ScanChannel.startScan();
+        } else {
+          logger.d("按键:$isDouble $keyCode");
+        }
+      },
     );
     _scanTag = 1;
 
@@ -159,9 +168,19 @@ class _CageChangePageState extends State<CageChangePage> {
               const SizedBox(height: 20),
               // 已识别的电子编号列表
               if (_rfids.isNotEmpty) ...[
-                const Text(
-                  '已识别的电子编号',
-                  style: TextStyle(fontWeight: FontWeight.bold),
+                Row(
+                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                  children: [
+                    const Text(
+                      '已识别的电子编号',
+                      style: TextStyle(fontWeight: FontWeight.bold),
+                    ),
+                    IconButton(
+                      icon: const Icon(Icons.clear, size: 18),
+                      onPressed: _clearRfids,
+                      tooltip: '清空编号',
+                    ),
+                  ],
                 ),
                 const SizedBox(height: 10),
                 Container(
@@ -243,6 +262,7 @@ class _CageChangePageState extends State<CageChangePage> {
                 child: TextField(
                   focusNode: focusNode,
                   controller: controller,
+                  enabled: controller.text.isEmpty,
                   decoration: InputDecoration(
                     border: InputBorder.none,
                     hintText: controller.text.isNotEmpty ? null : '未扫描',
@@ -307,7 +327,7 @@ class _CageChangePageState extends State<CageChangePage> {
           setState(() {
             _rfids.insert(0, rfid);
           });
-          ToastUtil.success("添加新的电子编号");
+          ToastUtil.success("成功添加新的电子编号");
         }
       },
       multiple: true,
@@ -364,6 +384,14 @@ class _CageChangePageState extends State<CageChangePage> {
     });
   }
 
+  // 清空所有已识别的电子编号
+  void _clearRfids() {
+    setState(() {
+      _rfids.clear();
+    });
+    ToastUtil.info('已清空所有电子编号');
+  }
+
   // 提交数据
   void _handleSubmit() {
     // 在实际应用中,这里会发送数据到服务器
@@ -371,6 +399,10 @@ class _CageChangePageState extends State<CageChangePage> {
       const SnackBar(content: Text('换笼操作提交成功'), backgroundColor: Colors.green),
     );
 
+    for (var rfid in _rfids) {
+      logger.d('提交电子编号: $rfid');
+    }
+
     // 提交后重置表单
     setState(() {
       _sourceCageController.clear();