Browse Source

心电列表UI调整,报告支持打印和导出

loki.wu 8 months ago
parent
commit
db80b00ace

+ 49 - 47
.vscode/launch.json

@@ -1,48 +1,50 @@
 {
-
-  // 使用 IntelliSense 了解相关属性。
-  // 悬停以查看现有属性的描述。
-  // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
-  "version": "0.2.0",
-  "configurations": [
-    {
-      "name": "vital_app",
-      "request": "launch",
-      "type": "dart",
-      "args": ["--web-port=8081", "--web-hostname=127.0.0.1","--dart-define=FLUTTER_WEB_CANVASKIT_URL=\"/canvaskit/\"",]
-      
-    },
-    {
-      "name": "vital_app (profile mode)",
-      "request": "launch",
-      "type": "dart",
-      "flutterMode": "profile"
-    },
-    {
-      "name": "vital_app (release mode)",
-      "request": "launch",
-      "type": "dart",
-      "flutterMode": "release"
-    },
-    {
-      "name": "idread",
-      "cwd": "packages\\idread",
-      "request": "launch",
-      "type": "dart"
-    },
-    {
-      "name": "idread (profile mode)",
-      "cwd": "packages\\idread",
-      "request": "launch",
-      "type": "dart",
-      "flutterMode": "profile"
-    },
-    {
-      "name": "idread (release mode)",
-      "cwd": "packages\\idread",
-      "request": "launch",
-      "type": "dart",
-      "flutterMode": "release"
-    }
-  ]
-}
+    // 使用 IntelliSense 了解相关属性。
+    // 悬停以查看现有属性的描述。
+    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
+    "version": "0.2.0",
+    "configurations": [
+        {
+            "name": "vital_app",
+            "request": "launch",
+            "type": "dart",
+            "args": [
+                "--web-port=8081",
+                "--web-hostname=127.0.0.1",
+                "--dart-define=FLUTTER_WEB_CANVASKIT_URL=\"/canvaskit/\"",
+            ]
+        },
+        {
+            "name": "vital_app (profile mode)",
+            "request": "launch",
+            "type": "dart",
+            "flutterMode": "profile"
+        },
+        {
+            "name": "vital_app (release mode)",
+            "request": "launch",
+            "type": "dart",
+            "flutterMode": "release"
+        },
+        {
+            "name": "idread",
+            "cwd": "packages\\idread",
+            "request": "launch",
+            "type": "dart"
+        },
+        {
+            "name": "idread (profile mode)",
+            "cwd": "packages\\idread",
+            "request": "launch",
+            "type": "dart",
+            "flutterMode": "profile"
+        },
+        {
+            "name": "idread (release mode)",
+            "cwd": "packages\\idread",
+            "request": "launch",
+            "type": "dart",
+            "flutterMode": "release"
+        }
+    ]
+}

+ 18 - 0
lib/managers/exam.dart

@@ -13,6 +13,7 @@ import 'package:fis_common/logger/logger.dart';
 class ExamManager implements IExamManager {
   String? get userCode => Store.user.userCode;
 
+  ///废弃
   @override
   Future<bool?> createExam(CreateExamRequest examRequest) async {
     try {
@@ -33,6 +34,23 @@ class ExamManager implements IExamManager {
     }
   }
 
+  @override
+  Future<bool> createExamDatas(String code, String examData) async {
+    try {
+      return await rpc.vitalElectrocardiogram
+          .updateElectrocardiogramExamInfoRecordAsync(
+        UpdateElectrocardiogramExamInfoRecordRequest(
+          token: Store.user.token,
+          code: code,
+          examData: examData,
+        ),
+      );
+    } catch (e) {
+      logger.e("ExamManager createExamDatas error.", e);
+      return false;
+    }
+  }
+
   @override
   Future<bool?> editExam(UpdateExamRequest examRequest) async {
     try {

+ 2 - 0
lib/managers/interfaces/exam.dart

@@ -24,4 +24,6 @@ abstract class IExamManager implements IManager {
   ///
   /// [code] 记录code
   Future<bool> checkRecordOfflineCached(String code);
+
+  Future<bool> createExamDatas(String code, String examData);
 }

+ 37 - 21
lib/pages/ecg/ecg_result_view.dart

@@ -8,7 +8,11 @@ import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 import 'package:vitalapp/components/appbar.dart';
 import 'package:vitalapp/components/no_data_view.dart';
+import 'package:vitalapp/pages/medical/models/worker.dart';
+import 'package:vitalapp/pages/medical/widgets/device_status_position.dart';
+import 'package:vitalapp/pages/medical/widgets/twelve_ecg.dart';
 import 'package:vitalapp/pages/medical/widgets/twelve_ecg_view/view.dart';
+import 'package:vitalapp/pages/medical/widgets/twelve_ecg_view/widgets/ecg_device_status.dart';
 import 'package:vnote_device_plugin/models/exams/twelve_heart.dart';
 
 import 'ecg_term_selection.dart';
@@ -91,12 +95,24 @@ class EcgResultViewState extends State<EcgResultView> {
         titleText: "体检心电",
         actions: [
           Container(
-            margin: EdgeInsets.only(right: 10),
-            child: Text(
-              widget.recordInfo.patientName ?? '',
-              style: TextStyle(color: Colors.white, fontSize: 24),
-            ),
-          ),
+              margin: EdgeInsets.only(right: 10),
+              child: Row(
+                children: [
+                  Text(
+                    widget.recordInfo.patientName ?? '',
+                    style: TextStyle(color: Colors.white, fontSize: 24),
+                  ),
+                  SizedBox(width: 38),
+                  ElevatedButton(
+                      onPressed: () {},
+                      child: Text(
+                        "提交",
+                        style: TextStyle(
+                          fontSize: 20,
+                        ),
+                      ))
+                ],
+              )),
         ],
       ),
       drawer: Drawer(
@@ -175,6 +191,7 @@ class EcgResultViewState extends State<EcgResultView> {
               SizedBox(height: gapHeight),
               Row(
                 children: [
+                  SizedBox(width: 15),
                   SizedBox(width: 15),
                   _buildKeyValue("走速:", "25 mm/s"),
                   SizedBox(width: 15),
@@ -182,20 +199,20 @@ class EcgResultViewState extends State<EcgResultView> {
                 ],
               ),
               SizedBox(height: gapHeight),
-              Row(
-                children: [
-                  SizedBox(width: 15),
-                  _buildKeyValue("基线滤波:", "1.6-2.0 Hz"),
-                  SizedBox(width: 15),
-                  _buildKeyValue("肌电滤波:", "53 Hz"),
-                  SizedBox(width: 15),
-                  _buildKeyValue("AC", ""),
-                  SizedBox(width: 15),
-                  _buildKeyValue("工频滤波:", "50 Hz"),
-                  SizedBox(width: 15),
-                ],
-              ),
-              SizedBox(height: gapHeight),
+              // Row(
+              //   children: [
+              //     SizedBox(width: 15),
+              //     _buildKeyValue("基线滤波:", "1.6-2.0 Hz"),
+              //     SizedBox(width: 15),
+              //     _buildKeyValue("肌电滤波:", "53 Hz"),
+              //     SizedBox(width: 15),
+              //     _buildKeyValue("AC", ""),
+              //     SizedBox(width: 15),
+              //     _buildKeyValue("工频滤波:", "50 Hz"),
+              //     SizedBox(width: 15),
+              //   ],
+              // ),
+              // SizedBox(height: gapHeight),
               Row(
                 children: [
                   SizedBox(width: 15),
@@ -221,7 +238,6 @@ class EcgResultViewState extends State<EcgResultView> {
             ElevatedButton(
               onPressed: () {
                 scaffoldKey.currentState?.openDrawer();
-                // Navigator.pop(context);
               },
               child: Text("词条选择"),
             ),

+ 5 - 5
lib/pages/medical/controller.dart

@@ -407,6 +407,7 @@ class MedicalController extends FControllerBase {
   Future<void> createHeart(
     String physicalExamNumber,
     String? keyValue,
+    String recordCode,
   ) async {
     try {
       Map<String, dynamic> input = diagnosisDataValue;
@@ -441,11 +442,10 @@ class MedicalController extends FControllerBase {
             examData: jsonEncode(output),
             code: currentExam!.code));
       } else {
-        result = await _examManager.createExam(CreateExamRequest(
-          key: keyValue ?? "HEIECG",
-          examData: jsonEncode(output),
-          physicalExamNumber: physicalExamNumber,
-        ));
+        result = await _examManager.createExamDatas(
+          recordCode,
+          jsonEncode(output),
+        );
       }
 
       if (result == true) {

+ 16 - 4
lib/pages/medical/views/heart_check_new.dart

@@ -24,15 +24,26 @@ class HeartCheckNew extends GetView<MedicalController> {
         height: double.maxFinite,
         color: Colors.white,
         child: HeartTableCheck(
-          checkDialog: PhysicalExamElectrocardiogram(
-              _buildDeviceImage(DeviceTypes.TWELVEHEART),
-              _buildMedicalInput(DeviceTypes.TWELVEHEART),
-              _buildSaveButton()),
+          checkDialog: PhysicalExamElectrocardiogramPage(),
           checkKey: "HEIECG",
         ),
       ),
     );
   }
+}
+
+class PhysicalExamElectrocardiogramPage extends GetView<MedicalController> {
+  final String? recordCode;
+
+  PhysicalExamElectrocardiogramPage({this.recordCode});
+
+  @override
+  Widget build(BuildContext context) {
+    return PhysicalExamElectrocardiogram(
+        _buildDeviceImage(DeviceTypes.TWELVEHEART),
+        _buildMedicalInput(DeviceTypes.TWELVEHEART),
+        _buildSaveButton());
+  }
 
   Widget _buildMedicalInput(String? currentTab) {
     return Expanded(
@@ -114,6 +125,7 @@ class HeartCheckNew extends GetView<MedicalController> {
               Store.user.currentSelectRegisterPersonInfo?.physicalExamNumber ??
                   '',
               'HEIECG',
+              recordCode ?? '',
             ),
           );
         },

+ 31 - 17
lib/pages/medical/widgets/twelve_ecg.dart

@@ -229,23 +229,23 @@ class _HeartRateState extends State<TwelveHeartRate> {
                 ),
               ),
             ),
-          const SizedBox(
-            width: 20,
-          ),
-          if (_assess.isNotEmpty)
-            SizedBox(
-              width: 150,
-              height: 50,
-              child: VButton(
-                onTap: () => _openReportConclusion(),
-                child: const Center(
-                  child: Text(
-                    "报告结论",
-                    style: TextStyle(fontSize: 24),
-                  ),
-                ),
-              ),
-            ),
+          // const SizedBox(
+          //   width: 20,
+          // ),
+          // if (_assess.isNotEmpty)
+          //   SizedBox(
+          //     width: 150,
+          //     height: 50,
+          //     child: VButton(
+          //       onTap: () => _openReportConclusion(),
+          //       child: const Center(
+          //         child: Text(
+          //           "报告结论",
+          //           style: TextStyle(fontSize: 24),
+          //         ),
+          //       ),
+          //     ),
+          //   ),
         ],
       ),
     );
@@ -380,6 +380,9 @@ class _HeartRateState extends State<TwelveHeartRate> {
     TwelveEcgViewController ecgViewController =
         Get.find<TwelveEcgViewController>();
     ecgViewController.isPaused = true;
+    if (!medicalController.diagnosisDataValue.containsKey("TwelveHeart")) {
+      medicalController.diagnosisDataValue['TwelveHeart'] = {};
+    }
 
     /// 【TODO】 这边原来是30秒的图,现在改成5秒图
     /// 后面又将30秒和5秒的图都存了,所以这里需要改动
@@ -389,6 +392,16 @@ class _HeartRateState extends State<TwelveHeartRate> {
         await ecgViewController.getFullDataImageBase64();
     medicalController.diagnosisDataValue['TwelveHeart']?['ECG_POINT12'] =
         jsonEncode(ecgViewController.allPoints);
+    medicalController.diagnosisDataValue['TwelveHeart']?['BaselineFiltering'] =
+        "1.6";
+    medicalController.diagnosisDataValue['TwelveHeart']?['EMGFiltering'] =
+        "53Hz";
+    medicalController.diagnosisDataValue['TwelveHeart']?['AC'] = "AC";
+    medicalController.diagnosisDataValue['TwelveHeart']?['PowerLineFiltering'] =
+        "50Hz";
+    medicalController.diagnosisDataValue['TwelveHeart']?['PaperSpeed'] =
+        "25mm/s";
+    medicalController.diagnosisDataValue['TwelveHeart']?['Gain'] = "5mm/mV";
     ecgViewController.updateTwelveEcgView();
   }
 
@@ -410,6 +423,7 @@ class _HeartRateState extends State<TwelveHeartRate> {
 
   void _onSaveSuccess(sender, e) async {
     if (e) {
+      await setEcgData();
       PromptBox.toast("采样结束");
       twelveEcgStatus = TwelveEcgStatus.noSampling;
     }

+ 28 - 7
lib/routes/routes.dart

@@ -1,7 +1,9 @@
 import 'package:ecg_list_view/rpc/rpc_bridge.dart';
+import 'package:fis_jsonrpc/rpc.dart';
 import 'package:flutter/foundation.dart';
 import 'package:get/get.dart';
 import 'package:vitalapp/managers/interfaces/ecg.dart';
+import 'package:vitalapp/managers/interfaces/patient.dart';
 import 'package:vitalapp/pages/admin/controller.dart';
 import 'package:vitalapp/pages/admin/view.dart';
 import 'package:vitalapp/pages/check/maternal_health_management/controller.dart';
@@ -37,6 +39,7 @@ import 'package:vitalapp/pages/medical/views/basic_check.dart';
 import 'package:vitalapp/pages/medical/views/biochemistry_check.dart';
 import 'package:vitalapp/pages/medical/views/blood_check.dart';
 import 'package:vitalapp/pages/medical/views/heart_check_new.dart';
+import 'package:vitalapp/pages/medical/views/table_input_dialog/widgets/physical_exam_electrocardiogram.dart';
 import 'package:vitalapp/pages/medical/views/traditional_chinese_check.dart';
 import 'package:vitalapp/pages/medical/views/urine_check.dart';
 import 'package:vitalapp/pages/medical/widgets/health_check/health_check_list/controller.dart';
@@ -507,13 +510,31 @@ class Routes {
     ),
     VRouteSetting(
       '/electrocardiogram',
-      () => kIsWeb
-          ? HeartCheckNew()
-          : EcgListPage(
-              onEdit: (v) {
-                Get.find<IEcgManager>().editEcgResult(v);
-              },
-            ),
+      () => EcgListPage(
+        onEdit: (recordCode) {
+          Get.find<IEcgManager>().editEcgResult(recordCode);
+        },
+        onExam: (recordCode, physicalExamNumber) async {
+          if (Get.isRegistered<MedicalController>()) {
+            Get.delete<MedicalController>();
+          }
+          Get.lazyPut(() => MedicalController());
+          final _patientManager = Get.find<IPatientManager>();
+          RegisterPersonInfoDTO? registerPersonInfo = await _patientManager
+              .getRegisterPersonInfoByPhysicalExamNumberAsync(
+            physicalExamNumber: physicalExamNumber,
+          );
+          if (registerPersonInfo != null &&
+              registerPersonInfo.physicalExamNumber != null) {
+            Store.user.currentSelectRegisterPersonInfo = registerPersonInfo;
+            await _patientManager
+                .switchCurrentPatientByCode(registerPersonInfo.iDCardNo!);
+          }
+          Get.to(PhysicalExamElectrocardiogramPage(
+            recordCode: recordCode,
+          ));
+        },
+      ),
       binding: BindingsBuilder(
         () {
           if (Get.isRegistered<RPCBridge>()) {

+ 4 - 4
pubspec.lock

@@ -325,8 +325,8 @@ packages:
     dependency: "direct main"
     description:
       path: "."
-      ref: "0b35ab63cab3f9b30d8d98503e01874843903917"
-      resolved-ref: "0b35ab63cab3f9b30d8d98503e01874843903917"
+      ref: "595dcdedca87aa90d5e2debb0d46ce785c1764f3"
+      resolved-ref: "595dcdedca87aa90d5e2debb0d46ce785c1764f3"
       url: "http://git.ius.plus/loki.wu/ecg_list_view.git"
     source: git
     version: "1.0.0+1"
@@ -424,8 +424,8 @@ packages:
     dependency: "direct main"
     description:
       path: "."
-      ref: "15b4c0d4746062ab004aae546bc1a5073ecf479e"
-      resolved-ref: "15b4c0d4746062ab004aae546bc1a5073ecf479e"
+      ref: b3fc3588ebe488a47b07ba9549c540d2625d0b3f
+      resolved-ref: b3fc3588ebe488a47b07ba9549c540d2625d0b3f
       url: "http://git.ius.plus:88/Project-Wing/fis_lib_jsonrpc.git"
     source: git
     version: "0.0.1"

+ 4 - 4
pubspec.yaml

@@ -90,7 +90,7 @@ dependencies:
   ecg_list_view:
     git:
       url: http://git.ius.plus/loki.wu/ecg_list_view.git
-      ref: 8ac15b110f6d327461201d4b2e3489e4de7ed358
+      ref: 595dcdedca87aa90d5e2debb0d46ce785c1764f3
   #   path: ..\FlutterSmartScanPlugin
   # fis_ui:
   #   git:
@@ -167,7 +167,7 @@ dependency_overrides:
   fis_jsonrpc:
     git:
       url: http://git.ius.plus:88/Project-Wing/fis_lib_jsonrpc.git
-      ref: 15b4c0d4746062ab004aae546bc1a5073ecf479e
+      ref: b3fc3588ebe488a47b07ba9549c540d2625d0b3f
     #path: ../fis_lib_jsonrpc
   fis_theme:
     git:
@@ -215,8 +215,8 @@ dependency_overrides:
   ecg_list_view:
     git:
       url: http://git.ius.plus/loki.wu/ecg_list_view.git
-      ref: 0b35ab63cab3f9b30d8d98503e01874843903917
-    #path: ../ecg_list_view
+      ref: 595dcdedca87aa90d5e2debb0d46ce785c1764f3
+    # path: ../ecg_list_view
 dev_dependencies:
   flutter_test:
     sdk: flutter

+ 28 - 51
web/index.html

@@ -1,6 +1,7 @@
 <!DOCTYPE html>
 <html>
-  <head>
+
+<head>
     <!--
     If you are serving your web app in a path other than the root, change the
     href value below to reflect the base path you are serving from.
@@ -17,70 +18,46 @@
     <base href="/" />
 
     <meta charset="UTF-8" />
-    <meta
-      content="IE=Edge"
-      http-equiv="X-UA-Compatible" />
-    <meta
-      name="description"
-      content="A new Flutter project." />
+    <meta content="IE=Edge" http-equiv="X-UA-Compatible" />
+    <meta name="description" content="A new Flutter project." />
 
     <!-- iOS meta tags & icons -->
-    <meta
-      name="apple-mobile-web-app-capable"
-      content="yes" />
-    <meta
-      name="apple-mobile-web-app-status-bar-style"
-      content="black" />
-    <meta
-      name="apple-mobile-web-app-title"
-      content="vital_app" />
-    <link
-      rel="apple-touch-icon"
-      href="icons/Icon-192.png" />
+    <meta name="apple-mobile-web-app-capable" content="yes" />
+    <meta name="apple-mobile-web-app-status-bar-style" content="black" />
+    <meta name="apple-mobile-web-app-title" content="vital_app" />
+    <link rel="apple-touch-icon" href="icons/Icon-192.png" />
 
     <!-- Favicon -->
-    <link
-      rel="icon"
-      type="image/png"
-      href="favicon.png" />
+    <link rel="icon" type="image/png" href="favicon.png" />
     <!-- <link rel="shortcut icon" type="image/x-icon" href="flyinsono.ico?v=202112020857" /> -->
 
     <title>vital_app</title>
-    <link
-      rel="stylesheet"
-      media="screen and (min-width: 600px)"
-      href="style/index.css?v=202112020857" />
-    <link
-      rel="stylesheet"
-      media="screen and (max-width: 600px)"
-      href="style/mobile.css?v=202112020857" />
+    <link rel="stylesheet" media="screen and (min-width: 600px)" href="style/index.css?v=202112020857" />
+    <link rel="stylesheet" media="screen and (max-width: 600px)" href="style/mobile.css?v=202112020857" />
 
-    <link
-      rel="manifest"
-      href="manifest.json" />
+    <link rel="manifest" href="manifest.json" />
 
     <script src="js/pre.js?v=202306272131"></script>
     <script src="js/pdf.min.js"></script>
 
     <!-- This script adds the flutter initialization JS code -->
-    <script
-      src="flutter.js"
-      defer></script>
-  </head>
+    <script src="flutter.js" defer></script>
+</head>
 
-  <body>
+<body>
     <script src="js/index.js?v=202307071648"></script>
-
+    <script src="js/print.min.js"></script>
     <script>
-      window.STATIC_ROOT = "./";
-      window.flutterConfiguration = {
-        canvasKitBaseUrl: window.STATIC_ROOT,
-        canvasKitMaximumSurfaces: 12,
-      };
-
-      var serviceWorkerVersion = null;
-      var scriptLoaded = false;
-      loadService();
+        window.STATIC_ROOT = "./";
+        window.flutterConfiguration = {
+            canvasKitBaseUrl: window.STATIC_ROOT,
+            canvasKitMaximumSurfaces: 12,
+        };
+
+        var serviceWorkerVersion = null;
+        var scriptLoaded = false;
+        loadService();
     </script>
-  </body>
-</html>
+</body>
+
+</html>

File diff suppressed because it is too large
+ 0 - 0
web/js/print.min.js


Some files were not shown because too many files changed in this diff