Browse Source

Merge branch 'master' of http://git.ius.plus/Project-Vital/VitalApp

loki.wu 11 months ago
parent
commit
5fbb36401e

+ 2 - 0
lib/global.dart

@@ -7,6 +7,7 @@ import 'package:flutter/services.dart';
 import 'package:get/get.dart';
 import 'package:vitalapp/consts/devices.dart';
 import 'package:vitalapp/database/db.dart';
+import 'package:vitalapp/js_platform/listener.dart';
 import 'package:vitalapp/pages/admin/usb_state.dart';
 import 'package:vnote_device_plugin/events/global_event_handler.dart';
 import 'package:vnote_device_plugin/vnote_device_plugin_platform_interface.dart';
@@ -138,6 +139,7 @@ abstract class Global {
 
     Get.put(RPCBridge(rpc, Store.user.token ?? ''));
 
+    JsPlatformListener().run();
     logger.i("Global init finish...");
   }
 

+ 9 - 0
lib/js_platform/handlers/base.dart

@@ -0,0 +1,9 @@
+import 'package:vitalapp/js_platform/methods.dart';
+
+abstract class MethodHandlerBase {
+  final TargetMethodName methodName;
+
+  MethodHandlerBase(this.methodName);
+
+  void execute(List<String> args);
+}

+ 15 - 0
lib/js_platform/handlers/idcard_handler.dart

@@ -0,0 +1,15 @@
+import 'package:vitalapp/js_platform/handlers/base.dart';
+import 'package:vitalapp/js_platform/methods.dart';
+import 'package:vnote_device_plugin/events/event_type.dart';
+
+class OpenIDCardPageHandler extends MethodHandlerBase {
+  static FEventHandler<String> onIDCardRead = FEventHandler<String>();
+  OpenIDCardPageHandler() : super(TargetMethodName.OnIDCardRead);
+  @override
+  Future<void> execute(List<String> args) async {
+    args.forEach((element) {
+      print(element);
+    });
+    onIDCardRead.emit(this, args[0]);
+  }
+}

+ 55 - 0
lib/js_platform/listener.dart

@@ -0,0 +1,55 @@
+import 'package:fis_common/js_plateform/js_platform.dart';
+import 'package:fis_common/logger/logger.dart';
+import 'package:fis_ui/index.dart';
+import 'package:fis_ui/interface/interactive_container.dart';
+import 'package:flutter/material.dart';
+import 'handlers/base.dart';
+import 'handlers/idcard_handler.dart';
+import 'methods.dart';
+
+class JsPlatformListener {
+  final Map<TargetMethodName, MethodHandlerBase> _handlers = {};
+
+  JsPlatformListener() {
+    _init();
+  }
+
+  void run() {
+    JSPlateForm.setJsPlatForm(_handleMessage);
+  }
+
+  void _init() {
+    //IDCardReader
+    _register(OpenIDCardPageHandler());
+  }
+
+  void _handleMessage(String method, String arguments) {
+    try {
+      final enumIdx = int.parse(method);
+      final enumVal = TargetMethodName.values[enumIdx];
+
+      if (!_handlers.containsKey(enumVal)) return;
+      final args = arguments.split('&');
+      _handlers[enumVal]!.execute(args);
+    } catch (e) {
+      logger.e(
+        "[PlatformListener] handle message error: method-$method not found.",
+        e,
+      );
+    }
+  }
+
+  void _register<T extends MethodHandlerBase>(T handler) {
+    _handlers[handler.methodName] = handler;
+  }
+}
+
+class JsListener extends FStatelessWidget implements FInteractiveContainer {
+  @override
+  FWidget build(BuildContext context) {
+    return FSizedBox();
+  }
+
+  @override
+  String get pageName => 'JsListener';
+}

+ 4 - 0
lib/js_platform/methods.dart

@@ -0,0 +1,4 @@
+enum TargetMethodName {
+  //身份证读卡器
+  OnIDCardRead,
+}

+ 19 - 0
lib/pages/home/view.dart

@@ -1,3 +1,4 @@
+import 'package:fis_common/index.dart';
 import 'package:fis_ui/values/icons.dart';
 import 'package:flutter/foundation.dart';
 import 'package:flutter/material.dart';
@@ -16,6 +17,7 @@ import 'widgets/menus.dart';
 import 'widgets/navigator.dart';
 import 'widgets/patient.dart';
 import 'widgets/status_bar.dart';
+import 'widgets/title_bar_buttons.dart';
 
 class HomePage extends GetView<HomeController> {
   const HomePage({super.key});
@@ -431,6 +433,23 @@ class HomePage extends GetView<HomeController> {
             ),
           ),
         ),
+        if (FPlatform.isWindows) ...[
+          Padding(
+            padding: EdgeInsets.symmetric(horizontal: 8),
+            child: VerticalDivider(
+              indent: 12,
+              endIndent: 12,
+              color: Colors.white,
+            ),
+          ),
+          TitleBarButtons(
+            controller.onMinimize,
+            controller.onWindowClose,
+            controller.onMaximize,
+            Colors.white,
+            Colors.transparent,
+          ),
+        ]
       ],
     );
   }

+ 2 - 1
lib/pages/medical_checkup_station/registration/controller/list.dart

@@ -1,4 +1,5 @@
 import 'package:fis_common/event/event_type.dart';
+import 'package:fis_common/index.dart';
 import 'package:fis_common/logger/logger.dart';
 import 'package:fis_jsonrpc/rpc.dart';
 import 'package:flutter/foundation.dart';
@@ -289,7 +290,7 @@ class RegistrationListController {
           child: Row(
             mainAxisAlignment: MainAxisAlignment.center,
             children: [
-              if (!kIsWeb && !isIntegralDesk) ...[
+              if (!FPlatform.isPureWeb && !isIntegralDesk) ...[
                 _buildPrint(context, rowData),
               ],
               _buildEditRegistration(rowData),

+ 24 - 4
lib/pages/medical_checkup_station/registration/widgets/card_reader/controller.dart

@@ -1,10 +1,15 @@
+import 'dart:convert';
+
+import 'package:fis_common/env/env.dart';
 import 'package:fis_jsonrpc/rpc.dart';
 import 'package:get/get.dart';
 import 'package:idread/model/id_card_info_model.dart';
 import 'package:vitalapp/architecture/utils/prompt_box.dart';
 import 'package:idread/idread.dart';
+import 'package:vitalapp/js_platform/handlers/idcard_handler.dart';
 import 'package:vitalapp/managers/interfaces/device.dart';
 import 'package:vitalapp/managers/interfaces/models/device.dart';
+import 'package:vitalapp/rpc.dart';
 
 class RegistrationCardReaderController extends GetxController {
   RegistrationCardReaderController();
@@ -13,15 +18,27 @@ class RegistrationCardReaderController extends GetxController {
   bool isCardReaderBinding = false; //是否绑定读卡器
 
   _initData() async {
+    if (FPlatform.isWindows) {
+      Idread.isShell = true;
+      Idread.shellRead = rpc.platform.startIDCardReader;
+      Idread.shellStopRead = rpc.platform.stopIDCardReader;
+    }
     bool result = await Idread.init();
     if (result) {
       bool start = await Idread.startRead();
       if (start) {
-        Idread.dataStreamListen((data) {
-          if (data is IdCardInfoModel) {
+        if (FPlatform.isWindows) {
+          OpenIDCardPageHandler.onIDCardRead.addListener((sender, e) {
+            var data = IdCardInfoModel.fromJson(jsonDecode(e));
             onReadInfo(data);
-          }
-        });
+          });
+        } else {
+          Idread.dataStreamListen((data) {
+            if (data is IdCardInfoModel) {
+              onReadInfo(data);
+            }
+          });
+        }
       }
     }
     isCardReaderConnected = result;
@@ -40,6 +57,9 @@ class RegistrationCardReaderController extends GetxController {
   }
 
   void checkReader() async {
+    if (FPlatform.isWindows) {
+      return;
+    }
     bool result = await Idread.init();
     if (result) {
       bool start = await Idread.startRead();

+ 5 - 2
lib/pages/medical_checkup_station/registration/widgets/filter/index.dart

@@ -1,3 +1,4 @@
+import 'package:fis_common/index.dart';
 import 'package:fis_common/logger/logger.dart';
 import 'package:fis_jsonrpc/rpc.dart';
 import 'package:flutter/material.dart';
@@ -57,7 +58,8 @@ class RegistrationFilter extends GetView<RegistrationController> {
                       );
                     },
                   ),
-                if (Store.user.hasFeature(FeatureKeys.IdCardPhotoOCR))
+                if (!FPlatform.isWindows &&
+                    Store.user.hasFeature(FeatureKeys.IdCardPhotoOCR))
                   VIconButton(
                     iconData: Icons.perm_contact_cal_rounded,
                     textString: '拍照识别',
@@ -67,7 +69,8 @@ class RegistrationFilter extends GetView<RegistrationController> {
                       );
                     },
                   ),
-                if (Store.user.hasFeature(FeatureKeys.FaceRecognition))
+                if (!FPlatform.isWindows &&
+                    Store.user.hasFeature(FeatureKeys.FaceRecognition))
                   VIconButton(
                     iconData: Icons.sensor_occupied,
                     textString: '人脸识别',

+ 1 - 1
lib/pages/medical_checkup_station/registration/widgets/report/report_preview.dart

@@ -65,7 +65,7 @@ class ReportPreview extends StatelessWidget {
               customAction: [],
               webSideShare: shareReport,
               allowPrinting: true,
-              allowSharing: false,
+              allowSharing: true,
               dpi: null,
               loadingWidget: Column(
                 mainAxisAlignment: MainAxisAlignment.center,

+ 63 - 1
lib/pages/patient/card_reader/controller.dart

@@ -1,10 +1,49 @@
+import 'dart:convert';
+
+import 'package:fis_common/index.dart';
 import 'package:fis_jsonrpc/rpc.dart';
 import 'package:get/get.dart';
 import 'package:idread/model/id_card_info_model.dart';
 import 'package:vitalapp/architecture/utils/prompt_box.dart';
 import 'package:idread/idread.dart';
+import 'package:vitalapp/js_platform/handlers/idcard_handler.dart';
 import 'package:vitalapp/managers/interfaces/device.dart';
 import 'package:vitalapp/managers/interfaces/models/device.dart';
+import 'package:vitalapp/rpc.dart';
+
+class IDInformation {
+  String? name;
+  String? sex;
+  String? id;
+  String? nation;
+  String? birthday;
+  String? address;
+
+  IDInformation(
+      {this.name, this.sex, this.id, this.nation, this.birthday, this.address});
+
+  factory IDInformation.fromJson(Map<String, dynamic> json) {
+    return IDInformation(
+      name: json['Name'],
+      sex: json['Sex'],
+      id: json['ID'],
+      nation: json['Nation'],
+      birthday: json['Birthday'],
+      address: json['Address'],
+    );
+  }
+
+  Map<String, dynamic> toJson() {
+    final Map<String, dynamic> data = new Map<String, dynamic>();
+    data['Name'] = this.name;
+    data['Sex'] = this.sex;
+    data['ID'] = this.id;
+    data['Nation'] = this.nation;
+    data['Birthday'] = this.birthday;
+    data['Address'] = this.address;
+    return data;
+  }
+}
 
 class CardReaderController extends GetxController {
   CardReaderController();
@@ -13,10 +52,29 @@ class CardReaderController extends GetxController {
   bool isCardReaderBinding = false; //是否绑定读卡器
 
   _initData() async {
+    if (FPlatform.isWindows) {
+      Idread.isShell = true;
+      Idread.shellRead = rpc.platform.startIDCardReader;
+      Idread.shellStopRead = rpc.platform.stopIDCardReader;
+    }
     bool result = await Idread.init();
     if (result) {
       bool start = await Idread.startRead();
-      if (start) {
+      if (FPlatform.isWindows) {
+        OpenIDCardPageHandler.onIDCardRead.addListener((sender, e) {
+          var jsonOBJ = jsonDecode(e);
+          var shellIDData = IDInformation.fromJson(jsonOBJ);
+          var data = IdCardInfoModel(
+            people: shellIDData.nation!,
+            peopleName: shellIDData.name!,
+            sex: shellIDData.sex!,
+            birthDay: shellIDData.birthday!,
+            address: shellIDData.address!,
+            idCard: shellIDData.id!,
+          );
+          onReadInfo(data);
+        });
+      } else {
         Idread.dataStreamListen((data) {
           if (data is IdCardInfoModel) {
             onReadInfo(data);
@@ -40,6 +98,9 @@ class CardReaderController extends GetxController {
   }
 
   void checkReader() async {
+    if (FPlatform.isWindows) {
+      return;
+    }
     bool result = await Idread.init();
     if (result) {
       bool start = await Idread.startRead();
@@ -59,6 +120,7 @@ class CardReaderController extends GetxController {
 
   /// 读取到数据的回调
   void onReadInfo(IdCardInfoModel data) {
+    print(data.toJson().toString());
     final result = CardReaderResult(
       success: true,
       cardNo: data.idCard,

+ 27 - 3
packages/idread/lib/idread.dart

@@ -1,26 +1,42 @@
 import 'dart:async';
-
 import 'package:flutter/services.dart';
 import 'model/id_card_info_model.dart';
 
+typedef AsyncVoidFunction = Future<void> Function();
+
 class Idread {
-  static const MethodChannel _methodChannel = const MethodChannel('com.hs.flutter.idRead/MethodChannel');
-  static const EventChannel _eventChannel = const EventChannel('com.hs.flutter.idRead/EventChannel');
+  static const MethodChannel _methodChannel =
+      const MethodChannel('com.hs.flutter.idRead/MethodChannel');
+  static const EventChannel _eventChannel =
+      const EventChannel('com.hs.flutter.idRead/EventChannel');
+
+  static AsyncVoidFunction shellRead = () async => {};
+  static AsyncVoidFunction shellStopRead = () async => {};
+  static bool isShell = false;
 
   /// 检测扫码结果数据
   static void dataStreamListen(dynamic success, {dynamic error}) {
+    if (isShell) {
+      return;
+    }
     _eventChannel.receiveBroadcastStream().listen((data) {
       success(IdCardInfoModel.fromJson(data));
     }, onError: error);
   }
 
   static Future<bool> init() async {
+    if (isShell) {
+      return true;
+    }
     final bool result = await _methodChannel.invokeMethod('init');
     return result;
   }
 
   static Future<void> unInit() async {
     try {
+      if (isShell) {
+        return;
+      }
       await _methodChannel.invokeMethod('unInit');
     } catch (e) {
       print(e.toString());
@@ -28,11 +44,19 @@ class Idread {
   }
 
   static Future<bool> startRead() async {
+    if (isShell) {
+      shellRead.call();
+      return true;
+    }
     bool result = await _methodChannel.invokeMethod('startRead');
     return result;
   }
 
   static Future<void> stopRead() async {
+    if (isShell) {
+      shellStopRead.call();
+      return;
+    }
     await _methodChannel.invokeMethod('stopRead');
   }
 }

+ 1 - 1
pubspec.yaml

@@ -48,7 +48,7 @@ dependencies:
   fis_jsonrpc:
     git:
       url: http://git.ius.plus:88/Project-Wing/fis_lib_jsonrpc.git
-      ref: 37206ea
+      ref: f0c9b872ba
   vnote_device_plugin:
     git:
       url: http://git.ius.plus/Project-Vital/FlutterDevicePlugin.git