Răsfoiți Sursa

实现黑台数据导入和上传

loki.wu 11 luni în urmă
părinte
comite
57fa031f44

+ 109 - 22
lib/managers/csvDataManager.dart → lib/managers/excel_data_manager.dart

@@ -7,22 +7,64 @@ import 'package:get/get.dart';
 import 'package:excel/excel.dart';
 import 'package:vitalapp/rpc.dart';
 import 'package:vitalapp/store/store.dart';
-import 'interfaces/csvData.dart';
-import 'interfaces/models/csv_data.dart';
+import 'interfaces/excelData.dart';
+import 'interfaces/models/excel_data.dart';
 import 'interfaces/template.dart';
 
-class CsvDataManager implements ICsvDataManager {
+class ExcelDataManager implements IExcelDataManager {
+  final List<String> _bloodRoutineKeys = [
+    "Blood_Hgb",
+    "Blood_Wbc",
+    "ALC",
+    "AMC",
+    "ANC",
+    "AEC",
+    "Blood_Neutrophils",
+    "Blood_LymphocyteRatio",
+    "Blood_MonocyteRatio",
+    "EOS%",
+    "Urea",
+    "Blood_Hematocrit",
+    "Blood_McV",
+    "Blood_Mch",
+    "Blood_Rlt",
+    "Blood_MeanPlateletVolume",
+    "Blood_PlateletDW",
+    "Blood_PlateletPct"
+  ];
+  final List<String> _biochemicalKeys = [
+    "Liver_Alt",
+    "Liver_Ast",
+    "Total_Protein",
+    "Liver_Alb",
+    "Liver_Tbil",
+    "directBili",
+    "GGT",
+    "Renal_Cr",
+    "UricAcid",
+    "Urea",
+    "BCH_Glu",
+    "Lipid_Cho",
+    "Lipid_Tg",
+    "Lipid_Ldl",
+    "Lipid_Hdl",
+    "AGratio",
+    "ALP",
+    "UB",
+    "Globulin",
+  ];
+
   ///将csv中的数据解析成结构化数据
   @override
-  Future<List<CsvRevord>> CsvDataConvert(
+  Future<List<ExcelDataRecord>> CsvDataConvert(
       List<List<dynamic>> datas, String key) async {
     var json = await Get.find<ITemplateManager>()
         .getTemplateByKey("BiochemicalValues");
-    List<CsvRevord> csvRevords = [];
+    List<ExcelDataRecord> csvRevords = [];
     List<dynamic> items = jsonDecode(json);
     List<List<List<dynamic>>> result = _splitIntoChunks(datas);
     for (List<List<dynamic>> chunkDatas in result) {
-      List<CsvData> csvDatas = [];
+      List<ExcelDataItem> csvDatas = [];
       for (var item in items) {
         try {
           if (item is Map) {
@@ -44,7 +86,7 @@ class CsvDataManager implements ICsvDataManager {
             } else {
               continue;
             }
-            csvDatas.add(CsvData(
+            csvDatas.add(ExcelDataItem(
               key: key,
               value: value,
               des: des,
@@ -57,22 +99,21 @@ class CsvDataManager implements ICsvDataManager {
           logger.e("CsvDataManager csvDataConvert ex:", e);
         }
       }
-      csvRevords.add(CsvRevord(csvDatas));
+      csvRevords.add(ExcelDataRecord(csvDatas));
     }
     return csvRevords;
   }
 
   @override
-  Future<List<CsvRevord>> ExcelDataConvert(
+  Future<List<ExcelDataRecord>> ExcelDataConvert(
       List<List<Data?>> rows, String key) async {
     ///首行是标题
     rows.removeAt(0);
-    List<CsvRevord> records = [];
-    var json = await Get.find<ITemplateManager>()
-        .getTemplateByKey("BiochemicalValues_HT");
+    List<ExcelDataRecord> records = [];
+    var json = await Get.find<ITemplateManager>().getTemplateByKey(key);
     List<dynamic> items = jsonDecode(json);
     for (List<Data?> rowData in rows) {
-      List<CsvData> csvDatas = [];
+      List<ExcelDataItem> csvDatas = [];
       for (var item in items) {
         try {
           if (item is Map) {
@@ -93,7 +134,7 @@ class CsvDataManager implements ICsvDataManager {
               } else {
                 value = data.value.toString();
               }
-              csvDatas.add(CsvData(
+              csvDatas.add(ExcelDataItem(
                 key: key,
                 value: value,
                 des: des,
@@ -107,18 +148,64 @@ class CsvDataManager implements ICsvDataManager {
           logger.e("CsvDataManager ExcelDataConvert ex:", e);
         }
       }
-      records.add(CsvRevord(csvDatas));
+      records.add(ExcelDataRecord(csvDatas));
     }
     return records;
   }
 
-  Future<void> uploadDatas(List<CsvRevord> datas, String templateKey) async {
-    List<AddExamDTO> examInfos = [];
-
-    await rpc.vitalExam.batchAddExamAsync(BatchAddExamRequest(
-      examInfos: [],
-      token: Store.user.token,
-    ));
+  @override
+  Future<bool> uploadDatas(
+      List<ExcelDataRecord> datas, String templateKey) async {
+    try {
+      List<AddExamDTO> examInfos = [];
+      for (ExcelDataRecord data in datas) {
+        List<ExcelDataItem> items = data.excelDatas;
+        var physicalExamNumber =
+            items.firstWhere((element) => element.key == "sampleBarcode").value;
+        List<String> keys = [];
+        if (templateKey.contains("BloodRoutine")) {
+          keys = _bloodRoutineKeys;
+        } else if (templateKey.contains("Biochemical")) {
+          keys = _biochemicalKeys;
+        }
+        var examDTO = AddExamDTO(
+          key: templateKey,
+          physicalExamNumber: physicalExamNumber,
+          examData: data.toJson(keys),
+        );
+        examInfos.add(examDTO);
+      }
+      if (examInfos.length <= 200) {
+        await rpc.vitalExam.batchAddExamAsync(BatchAddExamRequest(
+          examInfos: examInfos,
+          token: Store.user.token,
+        ));
+      } else {
+        // 计算需要拆分成多少个小组
+        int groupCount = (examInfos.length / 200).ceil();
+        // 遍历并拆分列表
+        for (int i = 0; i < groupCount; i++) {
+          // 计算当前小组的起始索引和结束索引
+          int startIndex = i * 200;
+          int endIndex = (i + 1) * 200;
+          // 如果已经到达列表的末尾,设置结束索引为列表的长度
+          if (endIndex > examInfos.length) {
+            endIndex = examInfos.length;
+          }
+          // 使用 getRange 方法获取当前小组的数据
+          List<AddExamDTO> group =
+              examInfos.getRange(startIndex, endIndex).toList();
+          await rpc.vitalExam.batchAddExamAsync(BatchAddExamRequest(
+            examInfos: group,
+            token: Store.user.token,
+          ));
+        }
+      }
+    } catch (e) {
+      logger.e("ExcelDataManager uploadDatas ex:", e);
+      return false;
+    }
+    return true;
   }
 
   List<List<List<dynamic>>> _splitIntoChunks(List<List<dynamic>> datas) {

+ 3 - 3
lib/managers/index.dart

@@ -12,6 +12,7 @@ import 'package:vitalapp/managers/doctor.dart';
 import 'package:vitalapp/managers/entry_manager.dart';
 import 'package:vitalapp/managers/exam.dart';
 import 'package:vitalapp/managers/follow_up.dart';
+import 'package:vitalapp/managers/excel_data_manager.dart';
 import 'package:vitalapp/managers/health_check_record.dart';
 import 'package:vitalapp/managers/interfaces/account.dart';
 import 'package:vitalapp/managers/interfaces/ai_manager.dart';
@@ -52,14 +53,13 @@ import 'package:vitalapp/managers/upgrade.dart';
 import 'application.dart';
 import 'appointment.dart';
 import 'cache.dart';
-import 'csvDataManager.dart';
 import 'data_convert.dart';
 import 'interfaces/application.dart';
 import 'interfaces/appointment.dart';
 import 'interfaces/base.dart';
 import 'interfaces/cache.dart';
 import 'interfaces/contract_template.dart';
-import 'interfaces/csvData.dart';
+import 'interfaces/excelData.dart';
 import 'interfaces/language.dart';
 import 'interfaces/record_data_cache.dart';
 import 'interfaces/report.dart';
@@ -85,7 +85,7 @@ abstract class ManagerCenter {
     Get.put<IServicePackManager>(ServicePackManager());
     Get.put<IContractTemplateManager>(ContractTemplateManager());
     Get.put<IContractManager>(ContractManager());
-    Get.put<ICsvDataManager>(CsvDataManager());
+    Get.put<IExcelDataManager>(ExcelDataManager());
     Get.put<IExamManager>(ExamManager());
     Get.put<IFollowUpManager>(FollowUpManager());
     Get.put<ITemplateManager>(TemplateManager());

+ 0 - 9
lib/managers/interfaces/csvData.dart

@@ -1,9 +0,0 @@
-import 'base.dart';
-import 'models/csv_data.dart';
-import 'package:excel/excel.dart';
-
-abstract class ICsvDataManager implements IManager {
-  Future<List<CsvRevord>> CsvDataConvert(List<List<dynamic>> datas, String key);
-
-  Future<List<CsvRevord>> ExcelDataConvert(List<List<Data?>> rows, String key);
-}

+ 16 - 0
lib/managers/interfaces/excelData.dart

@@ -0,0 +1,16 @@
+import 'base.dart';
+import 'models/excel_data.dart';
+import 'package:excel/excel.dart';
+
+abstract class IExcelDataManager implements IManager {
+  ///CSV数据解析
+  Future<List<ExcelDataRecord>> CsvDataConvert(
+      List<List<dynamic>> datas, String key);
+
+  ///Excel数据解析
+  Future<List<ExcelDataRecord>> ExcelDataConvert(
+      List<List<Data?>> rows, String key);
+
+  ///数据上传
+  Future<bool> uploadDatas(List<ExcelDataRecord> datas, String templateKey);
+}

+ 0 - 28
lib/managers/interfaces/models/csv_data.dart

@@ -1,28 +0,0 @@
-class CsvData {
-  String value;
-
-  String key;
-
-  String? des;
-
-  String? unit;
-
-  String? identifier;
-
-  String? referenceRange;
-
-  CsvData({
-    required this.value,
-    required this.key,
-    this.des,
-    this.unit,
-    this.identifier,
-    this.referenceRange,
-  });
-}
-
-class CsvRevord {
-  List<CsvData> csvDatas;
-
-  CsvRevord(this.csvDatas);
-}

+ 42 - 0
lib/managers/interfaces/models/excel_data.dart

@@ -0,0 +1,42 @@
+import 'dart:convert';
+
+class ExcelDataItem {
+  String value;
+
+  String key;
+
+  String? des;
+
+  String? unit;
+
+  String? identifier;
+
+  String? referenceRange;
+
+  ExcelDataItem({
+    required this.value,
+    required this.key,
+    this.des,
+    this.unit,
+    this.identifier,
+    this.referenceRange,
+  });
+}
+
+class ExcelDataRecord {
+  ///一条记录中的所有项,包含:值、单位、参考范围、描述等
+  List<ExcelDataItem> excelDatas;
+
+  ExcelDataRecord(this.excelDatas);
+
+  String toJson(List<String> keys) {
+    Map<String, String> formValues = {};
+
+    var datas =
+        excelDatas.where((element) => keys.contains(element.key)).toList();
+    for (var d in datas) {
+      formValues[d.key] = d.value;
+    }
+    return jsonEncode(formValues);
+  }
+}

+ 2 - 0
lib/managers/template.dart

@@ -79,6 +79,7 @@ class TemplateManager implements ITemplateManager {
         );
         var key = syncSettingsDTO.biochemicalTemplate!.key!;
         currentTemplateIndex[key] = code;
+        Store.user.biochemicalTemplateKey = key;
         await template.save(jsonEncode(syncSettingsDTO.biochemicalTemplate));
         logger
             .i("TemplateManager saveTemplate  template Code:$code , key:$key.");
@@ -94,6 +95,7 @@ class TemplateManager implements ITemplateManager {
         );
         var key = syncSettingsDTO.bloodRoutineTemplate!.key!;
         currentTemplateIndex[key] = code;
+        Store.user.bloodRoutineTemplateKey = key;
         await template.save(jsonEncode(syncSettingsDTO.bloodRoutineTemplate));
         logger
             .i("TemplateManager saveTemplate  template Code:$code , key:$key.");

+ 114 - 0
lib/pages/medical/widgets/health_check/health_check_left/index.dart

@@ -1,13 +1,25 @@
 // ignore_for_file: must_be_immutable
 
+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/components/button.dart';
 import 'package:vitalapp/components/search_input.dart';
+import 'package:vitalapp/pages/home/controller.dart';
 import 'package:vitalapp/pages/medical/widgets/health_check/health_check_list/controller.dart';
 import 'package:vitalapp/pages/medical/widgets/health_check/health_check_list/view.dart';
 import 'package:vitalapp/pages/medical_checkup_station/registration/state/list.dart';
 import 'package:vitalapp/pages/medical_checkup_station/registration/widgets/filter/filter_time.dart';
+import 'package:vitalapp/store/store.dart';
+import 'dart:async';
+import 'dart:convert';
+import 'package:excel/excel.dart';
+import 'package:vitalapp/architecture/utils/prompt_box.dart';
+import 'package:universal_html/html.dart' as html;
+import 'package:csv/csv.dart';
+import 'package:vitalapp/managers/interfaces/excelData.dart';
+import 'package:vitalapp/pages/patient/csv_datas/excel_datas_view.dart';
 
 class HealthCheckLeft extends GetView<HealthCheckListController> {
   HealthCheckLeft({
@@ -82,7 +94,109 @@ class HealthCheckLeft extends GetView<HealthCheckListController> {
           ),
         ),
         Expanded(child: SizedBox()),
+        if (Store.user.biochemicalTemplateKey.isNotNullOrEmpty &&
+            Get.find<HomeController>().state.currentSelectMenu ==
+                "/biochemistryTest") ...[
+          Container(
+            width: 120,
+            height: 50,
+            child: VButton(
+              child: Text("数据导入"),
+              onTap: () {
+                _importClick(Store.user.biochemicalTemplateKey);
+              },
+            ),
+          ),
+        ] else if (Store.user.bloodRoutineTemplateKey.isNotNullOrEmpty &&
+            Get.find<HomeController>().state.currentSelectMenu ==
+                "/bloodTest") ...[
+          Container(
+            width: 120,
+            height: 50,
+            child: VButton(
+              child: Text("数据导入"),
+              onTap: () {
+                _importClick(Store.user.bloodRoutineTemplateKey);
+              },
+            ),
+          )
+        ],
+        SizedBox(width: 10),
       ],
     );
   }
+
+  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;
+  }
 }

+ 34 - 22
lib/pages/patient/csv_datas/csv_datas_view.dart → lib/pages/patient/csv_datas/excel_datas_view.dart

@@ -1,25 +1,28 @@
 import 'package:fis_common/index.dart';
 import 'package:flutter/material.dart';
 import 'package:get/get.dart';
+import 'package:vitalapp/architecture/utils/prompt_box.dart';
 import 'package:vitalapp/components/appbar.dart';
 import 'package:vitalapp/components/search_input.dart';
-import 'package:vitalapp/managers/interfaces/models/csv_data.dart';
+import 'package:vitalapp/managers/interfaces/excelData.dart';
+import 'package:vitalapp/managers/interfaces/models/excel_data.dart';
 
-class CSVDatasView extends StatefulWidget {
-  final List<CsvRevord> records;
+class ExcelDatasView extends StatefulWidget {
+  final List<ExcelDataRecord> records;
+  final String templateKey;
 
-  CSVDatasView(this.records);
+  ExcelDatasView(this.records, this.templateKey);
 
   @override
   State<StatefulWidget> createState() {
-    return CSVDatasViewState();
+    return ExcelDatasViewState();
   }
 }
 
-class CSVDatasViewState extends State<CSVDatasView> {
+class ExcelDatasViewState extends State<ExcelDatasView> {
   final _searchController = TextEditingController();
-  List<CsvRevord> _pendingUploadDatas = [];
-  List<CsvRevord> _errorDatas = [];
+  List<ExcelDataRecord> _pendingUploadDatas = [];
+  List<ExcelDataRecord> _errorDatas = [];
   List<String> _selectedCsvDataCodes = [];
   bool _isShowErrorData = false;
   bool _isSelectedAll = true;
@@ -29,7 +32,7 @@ class CSVDatasViewState extends State<CSVDatasView> {
     //sampleBarcode对应的就是体检系统的条码
     _pendingUploadDatas = widget.records
         .where((element) =>
-            element.csvDatas
+            element.excelDatas
                 .firstWhereOrNull((element) => element.key == "sampleBarcode")
                 ?.value
                 .isNotNullOrEmpty ??
@@ -37,7 +40,7 @@ class CSVDatasViewState extends State<CSVDatasView> {
         .toList();
     _errorDatas = widget.records
         .where((element) =>
-            element.csvDatas
+            element.excelDatas
                 .firstWhereOrNull((element) => element.key == "sampleBarcode")
                 ?.value
                 .isNullOrEmpty ??
@@ -59,7 +62,16 @@ class CSVDatasViewState extends State<CSVDatasView> {
         actions: [
           if (!_isShowErrorData)
             TextButton.icon(
-              onPressed: () async {},
+              onPressed: () async {
+                var result = await Get.find<IExcelDataManager>()
+                    .uploadDatas(_pendingUploadDatas, widget.templateKey);
+                if (result) {
+                  PromptBox.toast('上传成功');
+                  Get.back();
+                } else {
+                  PromptBox.toast('上传失败');
+                }
+              },
               label: Text(
                 '提交',
                 style: TextStyle(fontSize: 20, color: Colors.white),
@@ -95,8 +107,8 @@ class CSVDatasViewState extends State<CSVDatasView> {
     );
   }
 
-  Widget _buildRecord(CsvRevord e) {
-    List<CsvData> csvDatas = e.csvDatas;
+  Widget _buildRecord(ExcelDataRecord e) {
+    List<ExcelDataItem> csvDatas = e.excelDatas;
     List<Widget> children = [];
     for (var c in csvDatas) {
       children.add(_buildItem(c));
@@ -139,7 +151,7 @@ class CSVDatasViewState extends State<CSVDatasView> {
     );
   }
 
-  Widget _buildItem(CsvData c) {
+  Widget _buildItem(ExcelDataItem c) {
     if (c.value.isEmpty) {
       return SizedBox();
     }
@@ -193,7 +205,7 @@ class CSVDatasViewState extends State<CSVDatasView> {
         SizedBox(width: 20),
         _buildTips(),
         SizedBox(width: 10),
-        _buildSwichButton(),
+        if (_errorDatas.isNotEmpty) _buildSwichButton(),
         if (_isShowErrorData) ...[
           SizedBox(width: 10),
           Icon(
@@ -201,7 +213,7 @@ class CSVDatasViewState extends State<CSVDatasView> {
             color: Colors.orange,
           ),
           Text(
-            "请检查样本条码是否正确!",
+            "请检查样本是否正确!",
             style: TextStyle(color: Colors.orange),
           ),
         ],
@@ -211,7 +223,7 @@ class CSVDatasViewState extends State<CSVDatasView> {
 
   void _selectedAll() {
     for (var data in _pendingUploadDatas) {
-      var code = data.csvDatas
+      var code = data.excelDatas
               .firstWhereOrNull((element) => element.key == "sampleBarcode")
               ?.value ??
           '';
@@ -230,7 +242,7 @@ class CSVDatasViewState extends State<CSVDatasView> {
           if (_isShowErrorData) {
             var errorDatas = widget.records
                 .where((element) =>
-                    element.csvDatas
+                    element.excelDatas
                         .firstWhereOrNull(
                             (element) => element.key == "sampleBarcode")
                         ?.value
@@ -239,7 +251,7 @@ class CSVDatasViewState extends State<CSVDatasView> {
                 .toList();
             _errorDatas = errorDatas
                 .where((element) =>
-                    element.csvDatas
+                    element.excelDatas
                         .firstWhereOrNull(
                             (element) => element.key == "patientName")
                         ?.value
@@ -249,7 +261,7 @@ class CSVDatasViewState extends State<CSVDatasView> {
           } else {
             var pendingUploadDatas = widget.records
                 .where((element) =>
-                    element.csvDatas
+                    element.excelDatas
                         .firstWhereOrNull(
                             (element) => element.key == "sampleBarcode")
                         ?.value
@@ -258,7 +270,7 @@ class CSVDatasViewState extends State<CSVDatasView> {
                 .toList();
             _pendingUploadDatas = pendingUploadDatas
                 .where((element) =>
-                    element.csvDatas
+                    element.excelDatas
                         .firstWhereOrNull(
                             (element) => element.key == "patientName")
                         ?.value
@@ -268,7 +280,7 @@ class CSVDatasViewState extends State<CSVDatasView> {
             if (_isSelectedAll) {
               _selectedCsvDataCodes.clear();
               for (var data in _pendingUploadDatas) {
-                var code = data.csvDatas
+                var code = data.excelDatas
                         .firstWhereOrNull(
                             (element) => element.key == "sampleBarcode")
                         ?.value ??

+ 14 - 13
lib/pages/patient/csv_datas/import_datas_view.dart

@@ -8,8 +8,8 @@ import 'package:vitalapp/architecture/utils/prompt_box.dart';
 import 'package:vitalapp/pages/widgets/function_button.dart';
 import 'package:universal_html/html.dart' as html;
 import 'package:csv/csv.dart';
-import 'package:vitalapp/managers/interfaces/csvData.dart';
-import 'package:vitalapp/pages/patient/csv_datas/csv_datas_view.dart';
+import 'package:vitalapp/managers/interfaces/excelData.dart';
+import 'package:vitalapp/pages/patient/csv_datas/excel_datas_view.dart';
 import 'package:vitalapp/store/store.dart';
 
 class ImportDataView extends StatelessWidget {
@@ -24,8 +24,8 @@ class ImportDataView extends StatelessWidget {
         FunctionButton(
           label: "生化数据",
           icon: Icon(
-            Icons.abc,
-            size: 40,
+            Icons.hub,
+            size: 50,
           ),
           onTap: () {
             _importClick("BiochemicalValues_CQZY");
@@ -34,8 +34,8 @@ class ImportDataView extends StatelessWidget {
         FunctionButton(
           label: "黑台生化",
           icon: Icon(
-            Icons.abc,
-            size: 40,
+            Icons.hub,
+            size: 50,
           ),
           onTap: () {
             _importClick("BiochemicalValues_HT");
@@ -44,7 +44,7 @@ class ImportDataView extends StatelessWidget {
         FunctionButton(
           label: "黑台血常规",
           icon: Icon(
-            Icons.abc,
+            Icons.bloodtype,
             size: 40,
           ),
           onTap: () {
@@ -70,9 +70,9 @@ class ImportDataView extends StatelessWidget {
       try {
         List<List<dynamic>> csvData = await readCSVFile(file!);
         var records =
-            await Get.find<ICsvDataManager>().CsvDataConvert(csvData, key);
+            await Get.find<IExcelDataManager>().CsvDataConvert(csvData, key);
         if (records.isNotEmpty) {
-          Get.to(CSVDatasView(records));
+          Get.to(ExcelDatasView(records, key));
         } else {
           PromptBox.toast('无可上传数据');
         }
@@ -82,25 +82,26 @@ class ImportDataView extends StatelessWidget {
       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<ICsvDataManager>()
+          var records = await Get.find<IExcelDataManager>()
               .ExcelDataConvert(excel.tables[table]!.rows, key);
+          Store.app.busy = false;
           if (records.isNotEmpty) {
-            Get.to(CSVDatasView(records));
+            Get.to(ExcelDatasView(records, key));
           } else {
             PromptBox.toast('无可上传数据');
           }
         }
-        var content = excel.tables.keys.first;
+        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;

+ 4 - 4
lib/pages/patient/detail/widgets/functions_panel.dart

@@ -8,7 +8,7 @@ import 'package:get/get.dart';
 import 'package:vitalapp/architecture/utils/prompt_box.dart';
 import 'package:vitalapp/architecture/values/features.dart';
 import 'package:vitalapp/consts/styles.dart';
-import 'package:vitalapp/managers/interfaces/csvData.dart';
+import 'package:vitalapp/managers/interfaces/excelData.dart';
 import 'package:vitalapp/managers/interfaces/models/crowd_labels.dart';
 import 'package:vitalapp/pages/check/prescription/Iodine_deficiency_disorder.dart';
 import 'package:vitalapp/pages/check/prescription/blood_sugar_disorder.dart';
@@ -22,14 +22,14 @@ import 'package:vitalapp/pages/check/prescription/trichomoniasis_vaginitis.dart'
 import 'package:vitalapp/pages/check/prescription/psychiatric_prescription.dart';
 import 'package:vitalapp/pages/check/prescription/tuberculosis_prescription.dart';
 import 'package:vitalapp/pages/check/prescription/under_fiveMalnutrition_prescription.dart';
-import 'package:vitalapp/pages/patient/csv_datas/csv_datas_view.dart';
+import 'package:vitalapp/pages/patient/csv_datas/excel_datas_view.dart';
 import 'package:vitalapp/pages/widgets/function_button.dart';
 import 'package:vitalapp/store/store.dart';
 import 'package:universal_html/html.dart' as html;
 import '../controller.dart';
 import 'package:csv/csv.dart';
-import 'package:vitalapp/managers/interfaces/csvData.dart';
-import 'package:vitalapp/pages/patient/csv_datas/csv_datas_view.dart';
+import 'package:vitalapp/managers/interfaces/excelData.dart';
+import 'package:vitalapp/pages/patient/csv_datas/excel_datas_view.dart';
 import 'package:vitalapp/store/store.dart';
 
 /// 功能入口面板

+ 18 - 0
lib/store/modules/user.dart

@@ -77,6 +77,12 @@ class UserState extends StateModuleBase {
   /// 医生签名
   String get signature => _userInfo?.signature ?? "";
 
+  ///生化模板Key
+  String biochemicalTemplateKey = "";
+
+  ///血常规模板Key
+  String bloodRoutineTemplateKey = "";
+
   ///头像
   String get headImageToken => _headImageToken.value;
   set headImageToken(String val) => _headImageToken.value = val;
@@ -192,6 +198,16 @@ class UserState extends StateModuleBase {
         }
       },
     );
+    map.pickPersistentProp('biochemicalTemplateKey', (x) {
+      if (x != null) {
+        biochemicalTemplateKey = x;
+      }
+    });
+    map.pickPersistentProp('bloodRoutineTemplateKey', (x) {
+      if (x != null) {
+        bloodRoutineTemplateKey = x;
+      }
+    });
     map.pickPersistentProp('selectPatientInfo', (x) {
       if (x != null) {
         _updateSelectPatientInfo(PatientDTO.fromJson(x));
@@ -224,6 +240,8 @@ class UserState extends StateModuleBase {
       "selectPatientInfo": _currentSelectPatientInfo,
       "menuPermissionList": _menuPermissionList,
       "operationPermissionList": _operationPermissionList,
+      "biochemicalTemplateKey": biochemicalTemplateKey,
+      "bloodRoutineTemplateKey": bloodRoutineTemplateKey,
     };
   }