|
@@ -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) {
|