瀏覽代碼

黑太Excel数据导出功能实现

loki.wu 11 月之前
父節點
當前提交
29d7d2014f

+ 1 - 0
assets/app_params.json

@@ -2,5 +2,6 @@
     "server_gateway": "https://platform.xinglinghui.com:9400",
     "local_station": false,
     "pure_software_mode": false,
+    "excel_import_url": "https://platform.xinglinghui.com:9314",
     "server_local_gateway": "http://192.168.3.2:8400"
 }

+ 13 - 4
lib/architecture/app_parameters.dart

@@ -36,13 +36,16 @@ class AppParameterDataModel {
   static const C_HOME_PAGE_URL = "http://192.168.6.80:8408"; // TODO:
   static const C_LOCAL_STATION = false;
   static const C_PURE_SOFTWAREMODE = false;
+  static const C_EXCEL_IMPORTURL = "https://platform.xinglinghui.com:9314";
 
   AppParameterDataModel({
     this.serverGateway = C_DEFAULT_GATEWAY,
     this.homePageUrl = C_HOME_PAGE_URL,
     this.isLocalStation = C_LOCAL_STATION,
     this.isPureSoftwareMode = C_PURE_SOFTWAREMODE,
+    this.excelImportUrl = C_EXCEL_IMPORTURL,
   });
+
   factory AppParameterDataModel.fromJson(Map<String, dynamic> map) {
     final homePageUrl = map['home_page_url'] ?? C_HOME_PAGE_URL;
     final isLocalStation = map['local_station'] ?? C_LOCAL_STATION;
@@ -51,17 +54,23 @@ class AppParameterDataModel {
     final serverGetway = isLocalStation
         ? map['server_local_gateway']
         : map['server_gateway'] ?? C_DEFAULT_GATEWAY;
+    final excelImportUrl = map["excel_import_url"] ?? C_EXCEL_IMPORTURL;
 
     return AppParameterDataModel(
-        serverGateway: serverGetway,
-        homePageUrl: homePageUrl,
-        isLocalStation: isLocalStation,
-        isPureSoftwareMode: isPureSoftwareMode);
+      serverGateway: serverGetway,
+      homePageUrl: homePageUrl,
+      isLocalStation: isLocalStation,
+      isPureSoftwareMode: isPureSoftwareMode,
+      excelImportUrl: excelImportUrl,
+    );
   }
 
   String serverGateway;
   String homePageUrl;
 
+  ///Excel 导入站点
+  String excelImportUrl;
+
   ///是否本地工作站,默认false,如果设置为true,将会在App启动时轮询调用成功Server的接口才会进行登录,否则将会一直处于Splash页面
   bool isLocalStation;
 

+ 5 - 1
lib/managers/excel_data_manager.dart

@@ -6,6 +6,7 @@ import 'package:fis_jsonrpc/rpc.dart';
 import 'package:flutter/services.dart';
 import 'package:get/get.dart';
 import 'package:excel/excel.dart';
+import 'package:intl/intl.dart';
 import 'package:vitalapp/rpc.dart';
 import 'package:vitalapp/store/store.dart';
 import 'interfaces/excelData.dart';
@@ -179,6 +180,9 @@ class ExcelDataManager implements IExcelDataManager {
             items.firstWhere((element) => element.key == "sampleBarcode").value;
         String examTimeStr =
             items.firstWhere((element) => element.key == "samplingTime").value;
+        // 使用DateFormat格式化日期,去除时间部分
+        DateFormat dateOnlyFormat = DateFormat('yyyy-MM-dd');
+        DateTime dateOnlyDateTime = dateOnlyFormat.parse(examTimeStr);
         List<String> keys = [];
         if (templateKey.contains("BloodRoutine")) {
           keys = _bloodRoutineKeys;
@@ -188,7 +192,7 @@ class ExcelDataManager implements IExcelDataManager {
         var examDTO = AddExamDTO(
           key: templateKey,
           examNumber: physicalExamNumber,
-          examTime: DateTime.parse(examTimeStr),
+          examTime: dateOnlyDateTime,
           examData: data.toJson(keys),
         );
         examInfos.add(examDTO);

+ 10 - 0
lib/managers/interfaces/models/exce_keys.dart

@@ -0,0 +1,10 @@
+class ExcelTemplateKeys {
+  //血常规
+  static List<String> AllBloodRoutineKeys = ["BloodRoutine_HT"];
+
+  ///生化
+  static List<String> AllBiochemicalKeys = [
+    "BiochemicalValues_HT",
+    "BiochemicalValues_CQZY"
+  ];
+}

+ 5 - 71
lib/pages/medical/widgets/health_check/health_check_left/index.dart

@@ -4,6 +4,7 @@ import 'package:fis_common/index.dart';
 import 'package:fis_ui/types/widget_builders.dart';
 import 'package:flutter/material.dart';
 import 'package:get/get.dart';
+import 'package:vitalapp/architecture/app_parameters.dart';
 import 'package:vitalapp/components/button.dart';
 import 'package:vitalapp/components/search_input.dart';
 import 'package:vitalapp/pages/home/controller.dart';
@@ -22,6 +23,7 @@ import 'package:vitalapp/managers/interfaces/excelData.dart';
 import 'package:vitalapp/pages/patient/csv_datas/excel_datas_view.dart';
 
 class HealthCheckLeft extends GetView<HealthCheckListController> {
+  final _excelImportUrl = AppParameters.data.excelImportUrl;
   HealthCheckLeft({
     super.key,
     required this.onRowTap,
@@ -127,76 +129,8 @@ class HealthCheckLeft extends GetView<HealthCheckListController> {
   }
 
   Future<void> _importClick(String key) async {
-    final html.FileUploadInputElement uploadInput =
-        html.FileUploadInputElement();
-    uploadInput.accept = '.xls,.xlsx,.csv'; // 设置接受的文件类型
-    uploadInput.click();
-
-    await uploadInput.onChange.first;
-
-    html.File? file = uploadInput.files?.first;
-    String extension = file?.name.split('.').last.toLowerCase() ?? "";
-    Store.app.busy = true;
-    if (extension == "csv") {
-      try {
-        List<List<dynamic>> csvData = await readCSVFile(file!);
-        var records =
-            await Get.find<IExcelDataManager>().CsvDataConvert(csvData, key);
-        if (records.isNotEmpty) {
-          Get.to(ExcelDatasView(records, key));
-        } else {
-          PromptBox.toast('无可上传数据');
-        }
-      } catch (e) {}
-    } else if (extension == "xlsx") {
-      final reader = html.FileReader();
-      reader.onLoadEnd.listen((e) async {
-        var bytes = reader.result as List<int>;
-        var excel = Excel.decodeBytes(bytes);
-        // Assuming the first sheet is what you want to read
-        for (var table in excel.tables.keys) {
-          print(table); // sheet name
-          print(excel.tables[table]?.maxColumns);
-          print(excel.tables[table]?.maxRows);
-          var records = await Get.find<IExcelDataManager>()
-              .ExcelDataConvert(excel.tables[table]!.rows, key);
-          Store.app.busy = false;
-          if (records.isNotEmpty) {
-            Get.to(ExcelDatasView(records, key));
-          } else {
-            PromptBox.toast('无可上传数据');
-          }
-        }
-        Store.app.busy = false;
-      });
-      reader.onError.listen((fileEvent) {
-        print("Some Error occured while reading the file");
-      });
-      Store.app.busy = true;
-      reader.readAsArrayBuffer(file!);
-    }
-    Store.app.busy = false;
-  }
-
-  Future<List<List<dynamic>>> readCSVFile(html.File file) async {
-    final reader = html.FileReader();
-    final completer = Completer<List<List<dynamic>>>();
-
-    reader.onLoadEnd.listen((e) {
-      // 尝试将内容转换为UTF-8编码的字符串
-      String contents;
-      try {
-        contents = utf8.decode(reader.result as List<int>);
-      } catch (e) {
-        // 如果转换失败,可能是因为结果不是List<int>,尝试直接转换为字符串
-        contents = reader.result.toString();
-      }
-      final List<List<dynamic>> csvData =
-          CsvToListConverter().convert(contents);
-      completer.complete(csvData);
-    });
-
-    reader.readAsText(file);
-    return completer.future;
+    html.window.open(
+        "$_excelImportUrl?token=${Store.user.token}&templateKey=$key",
+        "ExcelImport");
   }
 }

+ 9 - 2
lib/pages/medical/widgets/health_check/view.dart

@@ -8,6 +8,7 @@ import 'package:get/get.dart';
 import 'package:vitalapp/architecture/types/index.dart';
 import 'package:vitalapp/components/no_data_view.dart';
 import 'package:vitalapp/managers/interfaces/dictionary.dart';
+import 'package:vitalapp/managers/interfaces/models/exce_keys.dart';
 import 'package:vitalapp/pages/medical/controller.dart';
 import 'package:vitalapp/pages/medical/widgets/health_check/health_check_left/index.dart';
 import 'package:vitalapp/pages/medical/widgets/health_check/health_check_list/controller.dart';
@@ -105,8 +106,14 @@ class _HealthCheckState extends State<HealthCheck> {
     List<ExamDTO>? examList = await controller.registrationManager
         .getExamListByPhysicalExamNumberAsync(
             physicalExamNumber: value.physicalExamNumber ?? '');
-    ExamDTO? currentExam =
-        examList?.firstWhereOrNull((element) => element.key == widget.checkKey);
+    List<String> sourceKeys = [widget.checkKey];
+    if (widget.checkKey == "HEIBiochemical") {
+      sourceKeys.addAll(ExcelTemplateKeys.AllBiochemicalKeys);
+    } else if (widget.checkKey == "HEIBloodRoutine") {
+      sourceKeys.addAll(ExcelTemplateKeys.AllBloodRoutineKeys);
+    }
+    ExamDTO? currentExam = examList
+        ?.firstWhereOrNull((element) => sourceKeys.contains(element.key));
     if (currentExam?.examData != null) {
       medicalController.diagnosisDataValue =
           jsonDecode(currentExam?.examData ?? '');