123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269 |
- 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<String, dynamic> diagnosisDataValue = {};
- String appDataId = "";
- final state = MedicalState();
- final recordDataCacheManager = Get.find<IRecordDataCacheManager>();
- static final typeConvertMap = <String, String>{
- 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<String>();
- final _diagnosisManager = Get.find<IDiagnosisManager>();
- final _cachedRecordManager = Get.find<ICachedRecordManager>();
- final _deviceManager = Get.find<IDeviceManager>();
- 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<void> 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<void> getAccessTypes() async {
- List<MedicalItem> medicalItemList = [];
- List<String> accessTypes = await _deviceManager.getAccessTypes();
- for (var element in _medicalMenus) {
- if (accessTypes.contains(element.key)) {
- medicalItemList.add(element);
- }
- }
- state.medicalMenuList = medicalItemList;
- }
- Future<DeviceModel?> getDevice(String type) async {
- List<DeviceModel> devices = await _deviceManager.getDeviceList();
- return devices.firstWhereOrNull((element) => element.type == type);
- }
- Future<void> 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<void> 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<bool?> saveCachedAppDataId() async {
- appDataId = const Uuid().v4().replaceAll('-', '');
- TextStorage cachedRecord = TextStorage(
- fileName: 'appDataId',
- directory: "patient/$patientCode",
- );
- Get.back();
- return cachedRecord.save(appDataId);
- }
- Future<String?> readCachedAppDataId() async {
- TextStorage cachedRecord = TextStorage(
- fileName: 'appDataId',
- directory: "patient/$patientCode",
- );
- return cachedRecord.read();
- }
- Future<bool?> saveCachedRecord() async {
- try {
- return await recordDataCacheManager.saveRecordData(
- appDataId,
- patientCode,
- diagnosisDataValue,
- );
- } catch (e) {
- print(e);
- return false;
- }
- }
- Future<bool?> deleteDirectory() async {
- TextStorage cachedRecord = TextStorage(
- fileName: 'JKJC',
- directory: "patient/$patientCode",
- );
- return cachedRecord.deleteDirectory();
- }
- Future<void> submitDiagnosis(List<DiagnosisItem> 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<void> createDiagnosis() async {
- if (Store.user.teamName.isEmpty) {
- PromptBox.toast('未设置团队无法提交检测数据');
- return;
- }
- if (patientCode.isEmpty ||
- patientCode != Store.user.currentSelectPatientInfo?.code) {
- initData();
- }
- List<DiagnosisItem> 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<int>());
- 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();
- }
- }
|