Browse Source

实现报告打印和导出功能

loki.wu 9 months ago
parent
commit
ee7d249b7c
6 changed files with 161 additions and 21 deletions
  1. 1 1
      .vscode/launch.json
  2. 9 5
      lib/ecg_list/controller.dart
  3. 70 3
      lib/ecg_list/widgets/build_record_view.dart
  4. 1 1
      lib/main.dart
  5. 73 8
      pubspec.lock
  6. 7 3
      pubspec.yaml

+ 1 - 1
.vscode/launch.json

@@ -9,7 +9,7 @@
             "request": "launch",
             "type": "dart",
             "args": [
-                "--web-port=8082",
+                "--web-port=8083",
                 "--web-hostname=127.0.0.1",
                 "--dart-define=FLUTTER_WEB_CANVASKIT_URL=\"/canvaskit/\"",
             ]

+ 9 - 5
lib/ecg_list/controller.dart

@@ -10,7 +10,7 @@ import 'package:fis_common/index.dart';
 
 class EcgListController extends GetxController {
   RecordProcessStateEnum typeFilter = RecordProcessStateEnum.All;
-  ExamStateEnum? state;
+  List<ExamStateEnum>? states;
   EcgListController();
 
   //右侧选中的Tab
@@ -64,7 +64,7 @@ class EcgListController extends GetxController {
         startTime: startTime?.toUtc(),
         endTime: endTime?.toUtc(),
         isQuerySubordinate: showLowerDatas,
-        state: state,
+        states: states,
       ),
     );
 
@@ -192,11 +192,15 @@ class EcgListController extends GetxController {
   Future<void> changeTypeFilter(RecordProcessStateEnum value) async {
     typeFilter = value;
     if (value == RecordProcessStateEnum.All) {
-      state = null;
+      states = null;
     } else if (value == RecordProcessStateEnum.Done) {
-      state = ExamStateEnum.Reported;
+      states = [ExamStateEnum.Reported];
     } else {
-      state = ExamStateEnum.Unchecked;
+      states = [
+        ExamStateEnum.Unchecked,
+        ExamStateEnum.Invalid,
+        ExamStateEnum.Inspected
+      ];
     }
     await getDatas();
     update(["ecg_list"]);

+ 70 - 3
lib/ecg_list/widgets/build_record_view.dart

@@ -1,3 +1,5 @@
+import 'dart:convert';
+
 import 'package:ecg_list_view/rpc/rpc_bridge.dart';
 import 'package:fis_common/index.dart';
 import 'package:fis_jsonrpc/rpc.dart';
@@ -6,9 +8,14 @@ import 'package:fis_ui/index.dart';
 import 'package:fis_ui/usual/hover_text_button.dart';
 import 'package:fis_ui/values/paddings.dart';
 import 'package:fis_ui/values/spacings.dart';
+import 'package:flutter/foundation.dart';
 import 'package:flutter/material.dart';
 import 'package:get/get.dart';
 import 'package:intl/intl.dart';
+import 'package:fis_common/js_plateform/js_platform.dart';
+import 'package:http/http.dart' as http;
+import 'package:universal_html/html.dart' as html;
+import 'package:fis_lib_print/src/printing.dart';
 
 class ReportRecord extends StatelessWidget {
   /// 当前报告的数据
@@ -209,11 +216,71 @@ class ReportRecord extends StatelessWidget {
         const SizedBox(
           width: 15,
         ),
-        textButton('打印', () {
-          //TODO(Loki):删除报告
-          //  RPCBridge.ins.rpc.report.
+        textButton('打印', () async {
+          if (currReport.reportPreviewList?.any(
+                  (element) => element.fileType == UploadFileTypeEnum.PDF) ??
+              false) {
+            var url = currReport.reportPreviewList
+                ?.firstWhere(
+                    (element) => element.fileType == UploadFileTypeEnum.PDF)
+                .fileToken;
+            var bytes = await downloadData(url!);
+            if (kIsWeb) {
+              var base64 = base64Encode(bytes);
+              JSPlateForm.printPdf(base64);
+            } else {
+              await Printing.layoutPdf(
+                onLayout: (format) async => bytes,
+              );
+            }
+          } else {
+            print("获取打印pdf失败");
+            return;
+          }
         }),
+        const SizedBox(
+          width: 15,
+        ),
+        if (kIsWeb)
+          textButton('导出', () async {
+            if (currReport.reportPreviewList?.any(
+                    (element) => element.fileType == UploadFileTypeEnum.PDF) ??
+                false) {
+              var url = currReport.reportPreviewList
+                  ?.firstWhere(
+                      (element) => element.fileType == UploadFileTypeEnum.PDF)
+                  .fileToken;
+              downloadPdf(url!);
+            } else {
+              print("获取pdf失败");
+              return;
+            }
+          }),
       ],
     );
   }
+
+  void downloadPdf(String url) {
+    final anchor = html.AnchorElement(href: url)
+      ..style.display = 'none'
+      ..download = 'downloaded.pdf'; // 设置下载文件的默认名称
+
+    // 将链接添加到 DOM 中,以便触发下载
+    html.document.body!.append(anchor);
+
+    // 模拟点击链接以开始下载
+    anchor.click();
+
+    // 下载完成后移除链接
+    html.document.body!.children.remove(anchor);
+  }
+
+  Future<Uint8List> downloadData(String url) async {
+    final response = await http.get(Uri.parse(url));
+    if (response.statusCode == 200) {
+      return response.bodyBytes; // 直接返回 Uint8List
+    } else {
+      throw Exception('Failed to load data: ${response.statusCode}');
+    }
+  }
 }

+ 1 - 1
lib/main.dart

@@ -18,7 +18,7 @@ class Global {
     await logger.init();
     var rpc = JsonRpcProxy(host: "platform.xinglinghui.com:9308");
     rpc.setServerHost("platform.xinglinghui.com:9308", true);
-    Get.put(RPCBridge(rpc, "55393FC2DB164C7BA9F6AA162386167D"));
+    Get.put(RPCBridge(rpc, "7DDD32D4B4124671AD88ACB560454B0B"));
   }
 }
 

+ 73 - 8
pubspec.lock

@@ -33,6 +33,14 @@ packages:
       url: "https://pub.flutter-io.cn"
     source: hosted
     version: "2.10.0"
+  barcode:
+    dependency: transitive
+    description:
+      name: barcode
+      sha256: ab180ce22c6555d77d45f0178a523669db67f95856e3378259ef2ffeb43e6003
+      url: "https://pub.flutter-io.cn"
+    source: hosted
+    version: "2.2.8"
   boolean_selector:
     dependency: transitive
     description:
@@ -90,13 +98,13 @@ packages:
     source: hosted
     version: "3.0.3"
   csslib:
-    dependency: transitive
+    dependency: "direct main"
     description:
       name: csslib
-      sha256: "831883fb353c8bdc1d71979e5b342c7d88acfbc643113c14ae51e2442ea0f20f"
+      sha256: b36c7f7e24c0bdf1bf9a3da461c837d1de64b9f8beb190c9011d8c72a3dfd745
       url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "0.17.3"
+    version: "0.17.2"
   cupertino_icons:
     dependency: "direct main"
     description:
@@ -182,11 +190,20 @@ packages:
     dependency: "direct overridden"
     description:
       path: "."
-      ref: "8ca4c53e2c057ff5631163403f19a5491ddc16ec"
-      resolved-ref: "8ca4c53e2c057ff5631163403f19a5491ddc16ec"
+      ref: "8b8b2af8715e019df802897b30ca89294715d48d"
+      resolved-ref: "8b8b2af8715e019df802897b30ca89294715d48d"
       url: "http://git.ius.plus:88/Project-Wing/fis_lib_jsonrpc.git"
     source: git
     version: "0.0.1"
+  fis_lib_print:
+    dependency: "direct overridden"
+    description:
+      path: "."
+      ref: d23341a
+      resolved-ref: d23341a0f245a32eb355cba6b326a12edb743c82
+      url: "http://git.ius.plus/Project-Wing/fis_lib_print.git"
+    source: git
+    version: "5.9.1"
   fis_theme:
     dependency: "direct overridden"
     description:
@@ -332,6 +349,14 @@ packages:
       url: "https://pub.flutter-io.cn"
     source: hosted
     version: "4.0.2"
+  image:
+    dependency: transitive
+    description:
+      name: image
+      sha256: "8e9d133755c3e84c73288363e6343157c383a0c6c56fc51afcc5d4d7180306d6"
+      url: "https://pub.flutter-io.cn"
+    source: hosted
+    version: "3.3.0"
   intl:
     dependency: "direct main"
     description:
@@ -388,6 +413,14 @@ packages:
       url: "https://pub.flutter-io.cn"
     source: hosted
     version: "1.8.2"
+  path_parsing:
+    dependency: transitive
+    description:
+      name: path_parsing
+      sha256: e3e67b1629e6f7e8100b367d3db6ba6af4b1f0bb80f64db18ef1fbabd2fa9ccf
+      url: "https://pub.flutter-io.cn"
+    source: hosted
+    version: "1.0.1"
   path_provider:
     dependency: transitive
     description:
@@ -436,6 +469,22 @@ packages:
       url: "https://pub.flutter-io.cn"
     source: hosted
     version: "2.2.1"
+  pdf:
+    dependency: transitive
+    description:
+      name: pdf
+      sha256: "10659b915e65832b106f6d1d213e09b789cc1f24bf282ee911e49db35b96be4d"
+      url: "https://pub.flutter-io.cn"
+    source: hosted
+    version: "3.8.4"
+  petitparser:
+    dependency: transitive
+    description:
+      name: petitparser
+      sha256: "49392a45ced973e8d94a85fdb21293fbb40ba805fc49f2965101ae748a3683b4"
+      url: "https://pub.flutter-io.cn"
+    source: hosted
+    version: "5.1.0"
   platform:
     dependency: transitive
     description:
@@ -468,6 +517,14 @@ packages:
       url: "https://pub.flutter-io.cn"
     source: hosted
     version: "3.7.3"
+  qr:
+    dependency: transitive
+    description:
+      name: qr
+      sha256: "64957a3930367bf97cc211a5af99551d630f2f4625e38af10edd6b19131b64b3"
+      url: "https://pub.flutter-io.cn"
+    source: hosted
+    version: "3.0.1"
   sky_engine:
     dependency: transitive
     description: flutter
@@ -538,13 +595,13 @@ packages:
     source: hosted
     version: "1.3.2"
   universal_html:
-    dependency: transitive
+    dependency: "direct main"
     description:
       name: universal_html
-      sha256: f2e0ff0c4af8e4bbda4d273ca4a11be4055414f478fad5c161609b74790ff696
+      sha256: "5ff50b7c14d201421cf5230ec389a0591c4deb5c817c9d7ccca3b26fe5f31e34"
       url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "2.2.2"
+    version: "2.0.8"
   universal_io:
     dependency: transitive
     description:
@@ -642,6 +699,14 @@ packages:
       url: "https://pub.flutter-io.cn"
     source: hosted
     version: "1.0.3"
+  xml:
+    dependency: transitive
+    description:
+      name: xml
+      sha256: "979ee37d622dec6365e2efa4d906c37470995871fe9ae080d967e192d88286b5"
+      url: "https://pub.flutter-io.cn"
+    source: hosted
+    version: "6.2.2"
 sdks:
   dart: ">=2.19.0 <4.0.0"
   flutter: ">=3.7.0"

+ 7 - 3
pubspec.yaml

@@ -35,13 +35,13 @@ dependencies:
   cupertino_icons: ^1.0.2
   get: 4.6.1
   intl: 0.17.0
-
-
+  universal_html: 2.0.8
+  csslib: 0.17.2
 dependency_overrides:
   fis_jsonrpc:
     git:
       url: http://git.ius.plus:88/Project-Wing/fis_lib_jsonrpc.git
-      ref: 8ca4c53e2c057ff5631163403f19a5491ddc16ec
+      ref: 8b8b2af8715e019df802897b30ca89294715d48d
   fis_common:
     git:
       url: http://git.ius.plus:88/Project-Wing/fis_lib_common.git
@@ -58,6 +58,10 @@ dependency_overrides:
     git:
       url: http://git.ius.plus/Project-Vital/FlutterDevicePlugin.git
       ref: d0ac3d5
+  fis_lib_print:
+    git:
+      url: http://git.ius.plus/Project-Wing/fis_lib_print.git
+      ref: d23341a
 dev_dependencies:
   flutter_test:
     sdk: flutter