瀏覽代碼

1、心电和报告的查看

guanxinyi 1 年之前
父節點
當前提交
8761a5a940

+ 75 - 3
lib/pages/medical/controller.dart

@@ -1,10 +1,12 @@
 import 'dart:convert';
+import 'dart:io';
 import 'package:fis_jsonrpc/rpc.dart';
 import 'package:flutter/foundation.dart';
 import 'package:flutter/material.dart';
 import 'package:get/get.dart';
 import 'package:uuid/uuid.dart';
 import 'package:vitalapp/architecture/utils/prompt_box.dart';
+import 'package:vitalapp/architecture/utils/upload.dart';
 import 'package:vitalapp/components/alert_dialog.dart';
 import 'package:vitalapp/database/db.dart';
 import 'package:vitalapp/database/entities/defines.dart';
@@ -13,6 +15,7 @@ import 'package:vitalapp/global.dart';
 import 'package:vitalapp/managers/interfaces/exam.dart';
 import 'package:vitalapp/managers/interfaces/patient.dart';
 import 'package:vitalapp/managers/interfaces/record_data_cache.dart';
+import 'package:vitalapp/rpc.dart';
 import 'package:vnote_device_plugin/consts/types.dart';
 import 'package:vitalapp/architecture/defines.dart';
 import 'package:vitalapp/architecture/storage/text_storage.dart';
@@ -25,6 +28,7 @@ import 'package:vitalapp/pages/medical/state.dart';
 import 'package:vitalapp/store/store.dart';
 import 'package:vnote_device_plugin/events/event_type.dart';
 import 'package:fis_common/logger/logger.dart';
+import 'package:vitalapp/architecture/storage/storage.dart';
 
 class MedicalController extends FControllerBase {
   String patientCode = '';
@@ -347,12 +351,80 @@ class MedicalController extends FControllerBase {
   }
 
   /// 【TODO 接口需要变更】 心电
-  Future<void> createHeart(String physicalExamNumber) async {
+  Future<void> createHeart(
+    String physicalExamNumber,
+    String? keyValue,
+  ) async {
+    Map<String, dynamic> input = diagnosisDataValue;
+    for (var entry in input.entries) {
+      var key = entry.key;
+      var value = entry.value;
+      if (value != null) {
+        Store.app.setBusy("提交中");
+        if (['Heart', 'TwelveHeart'].contains(key) && value is Map) {
+          value = await uploadData(value);
+        }
+        Store.app.busy = false;
+        // diagnosisItems.add(
+        //   DiagnosisItem(
+        //     key: key,
+        //     diagnosisData: jsonEncode(value),
+        //   ),
+        // );
+      }
+      print('$key: $value');
+    }
+
+    Map<String, dynamic> output = {};
+
+    input.forEach((key, value) {
+      value.forEach((innerKey, innerValue) {
+        output[innerKey] = innerValue;
+      });
+    });
     var result = await _examManager.createExam(CreateExamRequest(
-      key: "TJXD",
-      examData: jsonEncode(diagnosisDataValue),
+      key: keyValue ?? "HEIBasic",
+      examData: jsonEncode(output),
       physicalExamNumber: physicalExamNumber,
     ));
+    if (result == true) {
+      Get.back();
+    }
+  }
+
+  bool isUploaded(String url) {
+    return url.startsWith('https://') || url.startsWith('http://');
+  }
+
+  Future<Map> uploadData(Map data) async {
+    if (data['ECG_POINT'] != null && !isUploaded(data['ECG_POINT'])) {
+      File ecgPointFile =
+          await rpc.storage.writeStringToFile(data['ECG_POINT']);
+      String? ecgPointUrl = await rpc.storage.uploadFile(ecgPointFile);
+      data['ECG_POINT'] = ecgPointUrl ?? '';
+      // ... 上传点集
+    }
+    if (data['ECG'] != null && !isUploaded(data['ECG'])) {
+      // ... 上传图片
+      /// 图片地址
+      final imageFile = UploadUtils.convertBase64ToXFile(data['ECG']);
+      String? imageUrl = await rpc.storage.upload(imageFile!);
+      data['ECG'] = imageUrl ?? '';
+    }
+    if (data['ECG_POINT12'] != null && !isUploaded(data['ECG_POINT12'])) {
+      File ecgPointFile =
+          await rpc.storage.writeStringToFile(data['ECG_POINT12']);
+      String? ecgPointUrl = await rpc.storage.uploadFile(ecgPointFile);
+      data['ECG_POINT12'] = ecgPointUrl ?? '';
+      // ... 上传点集
+    }
+    if (data['ECG12'] != null && !isUploaded(data['ECG12'])) {
+      // ... 上传图片
+      final imageFile = UploadUtils.convertBase64ToXFile(data['ECG12']);
+      String? imageUrl = await rpc.storage.upload(imageFile!);
+      data['ECG12'] = imageUrl ?? '';
+    }
+    return data;
   }
 
   ///  体检  检查提交

+ 3 - 3
lib/pages/medical/views/heart_check_new.dart

@@ -4,7 +4,7 @@ import 'package:flutter/material.dart';
 import 'package:get/get.dart';
 import 'package:vitalapp/architecture/utils/advance_debounce.dart';
 import 'package:vitalapp/components/appbar.dart';
-import 'package:vitalapp/pages/medical/widgets/health_check/view.dart';
+import 'package:vitalapp/pages/medical/widgets/health_heart_check/view.dart';
 import 'package:vitalapp/pages/medical/widgets/twelve_ecg.dart';
 import 'package:vnote_device_plugin/consts/types.dart';
 import 'package:vitalapp/pages/medical/controller.dart';
@@ -20,7 +20,7 @@ class HeartCheckNew extends GetView<MedicalController> {
       body: Container(
         height: double.maxFinite,
         color: Colors.white,
-        child: HealthCheck(
+        child: HeartTableCheck(
           checkDialog: _buildMedical(),
           checkKey: "HEIECG",
         ),
@@ -130,7 +130,7 @@ class HeartCheckNew extends GetView<MedicalController> {
         // backgroundColor: Theme.of(context).primaryColor,
         onPressed: () {
           advanceDebounce(
-            () => controller.createCheckup(
+            () => controller.createHeart(
               Store.user.currentSelectRegisterPersonInfo?.physicalExamNumber ??
                   '',
               'HEIECG',

+ 3 - 3
lib/pages/medical/widgets/health_heart_check/health_check_list/controller.dart

@@ -61,7 +61,7 @@ class HeartCheckListController extends GetxController {
             homeAddress: i.patientAddress,
             age: null,
             physicalExamNumber: i.physicalExamNumber,
-            phone: "11111",
+            // phone: "11111",
           ),
         );
       }
@@ -70,8 +70,8 @@ class HeartCheckListController extends GetxController {
 
     residentList = _residentList;
     tableLoading = false;
-    update(["healthCheck_table"]);
-    update(["healthCheck_table_pagination"]);
+    update(["heartCheck_table"]);
+    update(["heartCheck_table_pagination"]);
   }
 
   /// 登记列表表头

+ 2 - 2
lib/pages/medical/widgets/health_heart_check/health_check_list/view.dart

@@ -26,7 +26,7 @@ class HeartCheckTable extends GetView<HeartCheckListController> {
       children: [
         Expanded(
           child: GetBuilder<HeartCheckListController>(
-            id: "healthCheck_table",
+            id: "heartCheck_table",
             builder: (_) {
               return VitalTable<ResidentModel>(
                 autoHeight: false,
@@ -88,7 +88,7 @@ class HeartCheckTablePagination extends GetView<HeartCheckListController> {
   @override
   Widget build(BuildContext context) {
     return GetBuilder<HeartCheckListController>(
-      id: "healthCheck_table_pagination",
+      id: "heartCheck_table_pagination",
       builder: (_) {
         return Row(
           mainAxisAlignment: MainAxisAlignment.end,

+ 4 - 4
lib/pages/medical/widgets/health_heart_check/view.dart

@@ -11,8 +11,8 @@ import 'package:vitalapp/pages/medical/widgets/health_heart_check/health_check_l
 import 'package:vitalapp/pages/medical/widgets/health_heart_check/health_check_list/controller.dart';
 import 'package:vitalapp/pages/patient/detail/widgets/last_record.dart';
 
-class HealthCheck extends GetView<HeartCheckListController> {
-  HealthCheck({
+class HeartTableCheck extends GetView<HeartCheckListController> {
+  HeartTableCheck({
     super.key,
     this.checkDialog,
     required this.checkKey,
@@ -46,7 +46,7 @@ class HealthCheck extends GetView<HeartCheckListController> {
                 controller.tableData = await getTableData(
                   currentExam.examData ?? '',
                 );
-                controller.update(['health_detail']);
+                controller.update(['heart_detail']);
               }
               // if (examList == null || examList.length == 0) {
               //   Get.dialog(checkDialog ?? Container());
@@ -77,7 +77,7 @@ class HealthCheck extends GetView<HeartCheckListController> {
 
   Widget _buildDetail() {
     return GetBuilder<HeartCheckListController>(
-      id: "health_detail",
+      id: "heart_detail",
       builder: (_) {
         if (controller.tableData == null) return Container();
         return LastRecordTable(

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

@@ -42,7 +42,7 @@ class ReportPreview extends StatelessWidget {
             width: double.infinity,
             height: double.infinity,
             child: FPDFRenderContainer(
-              pdfTypeEnum: PDFTypeEnum.pdfJpeg,
+              pdfTypeEnum: PDFTypeEnum.pdfBytes,
               demoMode: false,
               pdfAccessTypeEnum: PDFAccessTypeEnum.preview,
               fileName: "pdfUrl",

+ 1 - 0
web/index.html

@@ -50,6 +50,7 @@
       href="manifest.json" />
 
     <script src="js/pre.js?v=202306272131"></script>
+    <script src="js/pdf.min.js"></script>
     <script>
       // The value below is injected by flutter build, do not touch.
       var serviceWorkerVersion = null;

文件差異過大導致無法顯示
+ 21 - 0
web/js/pdf.min.js


文件差異過大導致無法顯示
+ 21 - 0
web/js/pdf.worker.min.js


部分文件因文件數量過多而無法顯示