import 'dart:convert'; 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/storage/storage.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/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'; import 'package:vitalapp/managers/interfaces/cachedRecord.dart'; import 'package:vitalapp/managers/interfaces/device.dart'; import 'package:vitalapp/managers/interfaces/diagnosis.dart'; import 'package:vitalapp/managers/interfaces/models/device.dart'; import 'package:vitalapp/pages/medical/models/item.dart'; import 'package:vitalapp/pages/medical/state.dart'; import 'package:vitalapp/store/store.dart'; import 'package:vnote_device_plugin/events/event_type.dart'; class MedicalController extends FControllerBase { String patientCode = ''; Map diagnosisDataValue = {}; String appDataId = ""; final state = MedicalState(); final recordDataCacheManager = Get.find(); static final typeConvertMap = { DeviceTypes.TEMP: "Temp", DeviceTypes.WEIGHT: "BMI", DeviceTypes.SPO2: "SpO2", DeviceTypes.NIBP: "NIBP", DeviceTypes.SUGAR: "GLU", DeviceTypes.URINE: "Urine", DeviceTypes.IC_READER: "ICReader", DeviceTypes.HEART: "HEART", }; final changePatient = FEventHandler(); final _diagnosisManager = Get.find(); final _cachedRecordManager = Get.find(); final _deviceManager = Get.find(); final _medicalMenus = [ MedicalItem(key: DeviceTypes.TEMP, diagnosticItem: '体温'), MedicalItem(key: DeviceTypes.SUGAR, diagnosticItem: '血糖'), MedicalItem(key: DeviceTypes.NIBP, diagnosticItem: '血压'), MedicalItem(key: DeviceTypes.SPO2, diagnosticItem: '血氧'), MedicalItem(key: DeviceTypes.WEIGHT, diagnosticItem: 'BMI'), MedicalItem(key: DeviceTypes.URINE, diagnosticItem: '尿常规'), MedicalItem(key: DeviceTypes.HEART, diagnosticItem: '心电'), ]; @override void onReady() { initData(); getAccessTypes(); super.onReady(); } Future initData() async { patientCode = Store.user.currentSelectPatientInfo?.code ?? ''; if (patientCode.isNotEmpty) { var cachedAppDataId = await readCachedAppDataId(); if (cachedAppDataId != null) { appDataId = cachedAppDataId; } else { await saveCachedAppDataId(); } await initReadCached(); } } Future getAccessTypes() async { List medicalItemList = []; List accessTypes = await _deviceManager.getAccessTypes(); for (var element in _medicalMenus) { if (accessTypes.contains(element.key)) { medicalItemList.add(element); } } state.medicalMenuList = medicalItemList; } Future getDevice(String type) async { List devices = await _deviceManager.getDeviceList(); return devices.firstWhereOrNull((element) => element.type == type); } Future initReadCached() async { if (patientCode.isNotEmpty) { TextStorage cachedRecord = TextStorage( fileName: 'JKJC', directory: "patient/$patientCode", ); String? value = await cachedRecord.read(); if (value == null) { diagnosisDataValue = {}; Store.resident.handleSaveMedicalData(jsonEncode(diagnosisDataValue)); return; } Store.resident.handleSaveMedicalData(value); diagnosisDataValue = jsonDecode(value); } } Future readCachedRecord() async { if (patientCode.isNotEmpty) { // TextStorage cachedRecord = TextStorage( // fileName: 'JKJC', // directory: "patient/$patientCode", // ); String? value = Store.resident.residentMedicalData; print('🍖'); print(value); print('🍖'); if (value == null) { diagnosisDataValue = {}; return; } diagnosisDataValue = jsonDecode(value); } } Future saveCachedAppDataId() async { appDataId = const Uuid().v4().replaceAll('-', ''); TextStorage cachedRecord = TextStorage( fileName: 'appDataId', directory: "patient/$patientCode", ); Get.back(); return cachedRecord.save(appDataId); } Future readCachedAppDataId() async { TextStorage cachedRecord = TextStorage( fileName: 'appDataId', directory: "patient/$patientCode", ); return cachedRecord.read(); } Future saveCachedRecord() async { try { return await recordDataCacheManager.saveRecordData( appDataId, patientCode, diagnosisDataValue, ); } catch (e) { print(e); return false; } } Future deleteDirectory() async { TextStorage cachedRecord = TextStorage( fileName: 'JKJC', directory: "patient/$patientCode", ); return cachedRecord.deleteDirectory(); } Future submitDiagnosis(List diagnosisItems) async { state.currentTab = '-1'; SubmitDiagnosisRequest submitDiagnosisRequest = SubmitDiagnosisRequest( appDataId: appDataId, patientCode: patientCode, diagnosisItems: diagnosisItems, diagnosisTime: DateTime.now().toUtc(), ); print(submitDiagnosisRequest.toJson()); final result = await _diagnosisManager.submitDiagnosisAsync(submitDiagnosisRequest); if (result) { PromptBox.toast('提交成功'); await saveCachedAppDataId(); await deleteDirectory(); await readCachedRecord(); Future.delayed(const Duration(milliseconds: 10), () { state.currentTab = state.medicalMenuList[0].key; }); } else { PromptBox.toast('提交失败'); } } Future createDiagnosis() async { if (Store.user.teamName.isEmpty) { PromptBox.toast('未设置团队无法提交检测数据'); return; } if (patientCode.isEmpty || patientCode != Store.user.currentSelectPatientInfo?.code) { initData(); } List diagnosisItems = []; for (var entry in diagnosisDataValue.entries) { var key = entry.key; var value = entry.value; if (value != null) { if (key == 'Heart' && value is Map) { if (value.isEmpty) { return; } String allPoint = value['ECG_POINT']; String imageBase64 = value['ECG']; /// 点集地址 Uint8List bytes = Uint8List.fromList(jsonDecode(allPoint).cast()); final ecgPointBase64 = base64Encode(bytes); final ecgPointFile = UploadUtils.convertBase64ToXFile(ecgPointBase64); String? ecgPointUrl = await rpc.storage.upload(ecgPointFile!); /// 图片地址 final imageFile = UploadUtils.convertBase64ToXFile(imageBase64); String? imageUrl = await rpc.storage.upload(imageFile!); value['ECG_POINT'] = ecgPointUrl ?? ''; value['ECG'] = imageUrl ?? ''; } diagnosisItems.add( DiagnosisItem( key: key, diagnosisData: jsonEncode(value), ), ); } print('$key: $value'); } if (diagnosisItems.isEmpty) { PromptBox.toast('不能提交空数据'); return; } if (state.medicalMenuList.length > diagnosisDataValue.length) { Get.dialog( VAlertDialog( title: '提示', content: Container( margin: const EdgeInsets.only(bottom: 20), child: const Text( '当前检测项目未完成,请确定是否提交本次检测', style: TextStyle(fontSize: 20), textAlign: TextAlign.center, ), ), showCancel: true, onConfirm: () { submitDiagnosis(diagnosisItems); }, onCanceled: () {}, ), ); return; } } @override void dispose() { print('MedicalController dispose'); super.dispose(); } }