Browse Source

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

loki.wu 10 months ago
parent
commit
14c1168aa2

+ 35 - 0
lib/pages/medical/widgets/twelve_ecg.dart

@@ -6,6 +6,7 @@ import 'package:get/get.dart';
 import 'package:vitalapp/architecture/app_parameters.dart';
 import 'package:vitalapp/architecture/utils/prompt_box.dart';
 import 'package:vitalapp/components/button.dart';
+import 'package:vitalapp/components/dialog_input.dart';
 import 'package:vitalapp/global.dart';
 import 'package:vitalapp/managers/device_controller_manager.dart';
 import 'package:vitalapp/managers/interfaces/data_convert.dart';
@@ -227,6 +228,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),
+                  ),
+                ),
+              ),
+            ),
         ],
       ),
     );
@@ -479,4 +497,21 @@ class _HeartRateState extends State<TwelveHeartRate> {
         TwelveHeartResultEntity.fromJson(jsonDecode(_analyse12));
     await ConclusionDialog.show(twelveHeartResult: resultConclusion);
   }
+
+  void _openReportConclusion() async {
+    var result = await VDialogInput(
+      title: "结论编辑",
+      initialValue: _assess,
+      inputHeight: 320,
+      maxLines: 30,
+    ).show();
+    if (result != null) {
+      _assess = result;
+      medicalController.diagnosisDataValue['TwelveHeart']?['ASSESS12'] =
+          _assess;
+      await setEcgData();
+      medicalController.saveCachedRecord();
+      setState(() {});
+    }
+  }
 }

+ 22 - 3
lib/pages/medical/widgets/twelve_ecg_view/controller.dart

@@ -5,6 +5,8 @@ import 'dart:ui';
 import 'package:flutter/foundation.dart';
 import 'package:flutter/material.dart';
 import 'package:get/get.dart';
+import 'package:vitalapp/pages/medical/controller.dart';
+import 'package:vitalapp/pages/medical/widgets/twelve_ecg_view/state.dart';
 import 'package:vitalapp/pages/medical/widgets/twelve_ecg_view/widgets/grid_background_printer_for_five.dart';
 import 'dart:ui' as ui;
 import 'index.dart';
@@ -14,6 +16,8 @@ class TwelveEcgViewController extends GetxController {
     required this.initPoints,
   });
 
+  final state = TwelveEcgState();
+  final MedicalController medicalController = Get.find<MedicalController>();
   List<int> initPoints;
 
   /// 每秒的数据量
@@ -147,7 +151,8 @@ class TwelveEcgViewController extends GetxController {
       allPoints: allPoints,
       yMaxList: yMaxList,
     );
-    final bgPainter = GridBackgroundPainterForAll();
+    final bgPainter =
+        GridBackgroundPainterForAll(rangeValues: state.rangeValues);
     const size = Size(5000, 650);
     // 使用离屏Canvas绘制
     final Uint8List? bytes =
@@ -168,10 +173,24 @@ class TwelveEcgViewController extends GetxController {
     return chunks;
   }
 
+  List<List<int>> splitArrayIntoChunks2() {
+    List<List<int>> chunks = [];
+    var satrtPoint = (allPoints.length * (state.rangeValues.start / 30)).ceil();
+    var dataLength = (allPoints.length *
+            ((state.rangeValues.end - state.rangeValues.start) / 30))
+        .ceil();
+    chunks.add(allPoints.sublist(satrtPoint, satrtPoint + dataLength));
+    return chunks;
+  }
+
+  updateEcgImage() async {
+    medicalController.diagnosisDataValue['TwelveHeart']?['ECG12'] =
+        await getFiveImageBase64();
+  }
+
   /// 获取五秒图心电图的base64(带base64头)
   Future<String> getFiveImageBase64() async {
-    int chunkSize = (allPoints.length / 5).ceil();
-    List<List<int>> chunks = splitArrayIntoChunks(allPoints, chunkSize);
+    List<List<int>> chunks = splitArrayIntoChunks2();
     List<int> lastChunk = chunks.last;
 
     final painter = EcgPainterForAll(

+ 8 - 0
lib/pages/medical/widgets/twelve_ecg_view/state.dart

@@ -0,0 +1,8 @@
+import 'package:flutter/material.dart';
+import 'package:get/get_rx/src/rx_types/rx_types.dart';
+
+class TwelveEcgState {
+  Rx<RangeValues> _rangeValues = Rx<RangeValues>(RangeValues(25, 30));
+  RangeValues get rangeValues => _rangeValues.value;
+  set rangeValues(val) => _rangeValues.value = val;
+}

+ 46 - 8
lib/pages/medical/widgets/twelve_ecg_view/widgets/full_screen_ecg_data_dialog.dart

@@ -15,7 +15,6 @@ class FullScreenEcgDataDialog extends GetView<TwelveEcgViewController> {
     final ScrollController scrollController = ScrollController();
     // 创建一个GlobalKey
     final GlobalKey containerKey = GlobalKey();
-
     return WillPopScope(
       onWillPop: () async {
         return false;
@@ -31,6 +30,39 @@ class FullScreenEcgDataDialog extends GetView<TwelveEcgViewController> {
         child: Column(
           children: [
             _buildHead(),
+            Row(
+              children: [
+                SizedBox(
+                  width: 10,
+                ),
+                Text('0s'),
+                Expanded(
+                  child: Obx(
+                    () => RangeSlider(
+                      values: controller.state.rangeValues,
+                      divisions: 30,
+                      min: 0,
+                      max: 30,
+                      labels: RangeLabels(
+                          "${controller.state.rangeValues.start.toStringAsFixed(0)}s",
+                          "${controller.state.rangeValues.end.toStringAsFixed(0)}s"),
+                      onChanged: (newValues) {
+                        // setState(() {
+                        controller.state.rangeValues = newValues;
+
+                        //   // 根据新的滑块值更新截图区域
+                        //   _updateScreenshotArea();
+                        // });
+                      },
+                    ),
+                  ),
+                ),
+                Text('30s'),
+                SizedBox(
+                  width: 10,
+                ),
+              ],
+            ),
             Expanded(
               child: Scrollbar(
                 thumbVisibility: true,
@@ -69,13 +101,16 @@ class FullScreenEcgDataDialog extends GetView<TwelveEcgViewController> {
                             (localPosition.dy / size.height * 12).floor();
                         openCurrentScreenDialog(areaIndex - 1);
                       },
-                      child: CustomPaint(
-                        foregroundPainter: EcgPainterForAll(
-                          allPoints: controller.allPoints,
-                          yMaxList: controller.yMaxList,
+                      child: Obx(
+                        () => CustomPaint(
+                          foregroundPainter: EcgPainterForAll(
+                            allPoints: controller.allPoints,
+                            yMaxList: controller.yMaxList,
+                          ),
+                          painter: GridBackgroundPainterForAll(
+                              rangeValues: controller.state.rangeValues),
+                          size: const Size(3000, 200),
                         ),
-                        painter: GridBackgroundPainterForAll(),
-                        size: const Size(3000, 200),
                       ),
                     ),
                   ),
@@ -110,7 +145,10 @@ class FullScreenEcgDataDialog extends GetView<TwelveEcgViewController> {
         mainAxisAlignment: MainAxisAlignment.end,
         children: [
           IconButton(
-            onPressed: () => Get.back(),
+            onPressed: () {
+              controller.updateEcgImage();
+              Get.back();
+            },
             icon: const Icon(
               Icons.close,
               size: 30,

+ 14 - 1
lib/pages/medical/widgets/twelve_ecg_view/widgets/grid_background_painter_for_all.dart

@@ -5,6 +5,9 @@ class GridBackgroundPainterForAll extends CustomPainter {
   final int xGridNums = 750; // 1秒25格,共30秒
 
   final int yGridNumsPerMv; // 多少格是一毫伏特 [暂未用到该参数]
+
+  final RangeValues rangeValues;
+
   List<String> mLeadNames = [
     "I",
     "II",
@@ -19,7 +22,10 @@ class GridBackgroundPainterForAll extends CustomPainter {
     "V5",
     "V6"
   ];
-  GridBackgroundPainterForAll({this.yGridNumsPerMv = 5});
+  GridBackgroundPainterForAll({
+    this.yGridNumsPerMv = 5,
+    required this.rangeValues,
+  });
 
   @override
   void paint(Canvas canvas, Size size) {
@@ -63,6 +69,13 @@ class GridBackgroundPainterForAll extends CustomPainter {
       Offset(size.width - 0.5, size.height),
       gridPaint,
     );
+    Paint paint = Paint()..color = Colors.black.withOpacity(0.5);
+
+    var startPosition = 100 * rangeValues.start;
+    var rectWidth = 100 * (rangeValues.end - rangeValues.start);
+
+    canvas.drawRect(
+        Rect.fromLTWH(startPosition, 0, rectWidth, size.height), paint);
 
     for (int i = 0; i < 12; i++) {
       /// 绘制两根中心线