// ignore_for_file: constant_identifier_names import 'dart:convert'; import 'package:fis_common/logger/logger.dart'; import 'package:fis_jsonrpc/rpc.dart'; import 'package:fis_measure/process/workspace/measure_handler.dart'; import 'package:fis_measure/process/workspace/rpc_bridge.dart'; import 'package:fis_i18n/i18n.dart'; import 'package:flutter/foundation.dart'; class MeasureDataHelper { // static VidImageSource source = VidImageSource.Remedical; static get source => RPCBridge.ins.source; // 获取图像列表 static Future> getRemedicalList( String patientCode, String recordCode) async { try { // 初始化为空列表 List remedicalItems = []; // 当数据来源是 Consultation 时 if (source == VidImageSource.Consultation) { // 获取咨询图片 var images = await getConsultationImages(recordCode); // 遍历图片列表,将非空的 imageInfos 添加到 remedicalItems 中 images.forEach((imageInfo) { var imageInfos = imageInfo.ultrasoundImageList ?? []; if (imageInfos.isNotEmpty) { remedicalItems.add(RemedicalItemList( remedicalList: imageInfos, )); } }); } // 当数据来源是 Laboratory 时 else if (source == VidImageSource.Laboratory) { // 获取患者的文件列表 var getRecordsPage = await RPCBridge.ins.rpc.lab.getFileListByFolderAsync( GetFileListByFolderRequest( token: RPCBridge.ins.userToken, pageIndex: 1, pageSize: 100, folderCode: patientCode, ), ); remedicalItems.add(RemedicalItemList( remedicalList: getRecordsPage.pageData, )); } // 当数据来源为ai结果编辑的 else if (source == VidImageSource.AiResultModifier) { var result = await RPCBridge.ins.rpc.remedical.getPatientAISelectedInfosAsync( GetPatientAISelectedInfosRequest( token: RPCBridge.ins.userToken, recordCode: recordCode, ), ); List remedicalInfoList = []; result.forEach((element) { remedicalInfoList.add(RemedicalInfoDTO( recordCode: element.recordCode, remedicalCode: element.remedicalAISelectedInfoCode, terminalImages: TerminalImageDTO( previewUrl: element.previewFileToken, imageUrl: element.cdnFileToken, coverImageUrl: element.previewFileToken, originImageUrl: element.orginalFileToken, recommendedDownloadMode: element.recommendedDownloadMode, ), diagnosisConclusion: element.diagnosisConclusion, diagnosisOrgans: element.diagnosisOrgans, )); }); remedicalItems.add(RemedicalItemList( remedicalList: remedicalInfoList, )); } else if (source == VidImageSource.RemoteUS) { // 获取患者的病历记录 PageResult result = PageResult(); result.pageData = []; try { result = await RPCBridge.ins.rpc.remoteUltrasound .vitalGetRemedicalListPagesAsync( GetRecordsPageRequest( token: RPCBridge.ins.userToken, pageIndex: 1, pageSize: 100, patientCode: patientCode, ), ); } catch (e) { logger.e('MeasureDataHelper vitalGetRemedicalListPagesAsync ex:$e'); } // 遍历病历记录列表,当某条记录的 recordCode 与传入的 recordCode 相同时,将其 remedicalItemList 添加到 remedicalItems 中 if (result.pageData!.isNotEmpty) { var recordInfo = result.pageData!.firstWhere( (element) => element.recordCode == recordCode, orElse: () => RemedicalListResult()); remedicalItems = recordInfo.remedicalItemList ?? []; } } // 当数据来源为其他情况时 else { // 获取患者的病历记录 PageResult result = PageResult(); result.pageData = []; try { result = await RPCBridge.ins.rpc.remedical.getRemedicalListPagesAsync( GetRecordsPageRequest( token: RPCBridge.ins.userToken, pageIndex: 1, pageSize: 100, patientCode: patientCode, ), ); } catch (e) { logger.e('MeasureDataHelper getRemedicalListPagesAsync ex:$e'); } // 遍历病历记录列表,当某条记录的 recordCode 与传入的 recordCode 相同时,将其 remedicalItemList 添加到 remedicalItems 中 if (result.pageData!.isNotEmpty) { var recordInfo = result.pageData!.firstWhere( (element) => element.recordCode == recordCode, orElse: () => RemedicalListResult()); remedicalItems = recordInfo.remedicalItemList ?? []; } } // 返回最终的 remedicalItems 列表 return remedicalItems; } catch (e) { logger.e('MeasureHomeController getRemedicalList ex:', e); // 出现异常时返回空列表 return []; } } ///获取会诊图像 static Future> getConsultationImages( String consultationCode) async { try { if (consultationCode.isEmpty) { return []; } var realTimeConsultationImageList = await RPCBridge.ins.rpc.liveConsultation.getConsultationFilesAsync( FindConsultationDetailRequest( consultationCode: consultationCode, token: RPCBridge.ins.userToken), ); return realTimeConsultationImageList; } catch (e) { logger.e('RealTimeConsultationImageController getConsultationImages ex:' + e.toString()); } return []; } ///获取图像详情 static Future getImageInfo( String remedicalCode, String? remedicalAISelectedInfoCode, ) async { try { RemedicalInfoDTO result; print(source); if (source == VidImageSource.AiResultModifier) { final remedicalAISelectedInfo = await RPCBridge.ins.rpc.remedical.getRemedicalAISelectedInfoAsync( GetRemedicalAISelectedInfoRequest( token: RPCBridge.ins.userToken, code: remedicalAISelectedInfoCode, ), ); result = RemedicalInfoDTO( diagnosisResult: jsonEncode( [ { 'DiagResultsForEachOrgan': jsonDecode(remedicalAISelectedInfo.diagnosisData ?? '')[ 'DiagResultsForEachOrgan'], 'Index': jsonDecode( remedicalAISelectedInfo.diagnosisData ?? '')['Index'], 'PriorityScore': jsonDecode(remedicalAISelectedInfo.diagnosisData ?? '')[ 'PriorityScore'], } ], ), terminalImages: TerminalImageDTO( previewUrl: remedicalAISelectedInfo.previewFileToken, imageUrl: remedicalAISelectedInfo.cdnFileToken, coverImageUrl: remedicalAISelectedInfo.previewFileToken, originImageUrl: remedicalAISelectedInfo.orginalFileToken, recommendedDownloadMode: remedicalAISelectedInfo.recommendedDownloadMode, ), diagnosisConclusion: DiagnosisConclusionEnum.Benign, ); } else if (source == VidImageSource.RemoteUS) { result = await RPCBridge.ins.rpc.remoteUltrasound .vitalFindRemedicalByCodeAsync( FindRemedicalByCodeRequest( token: RPCBridge.ins.userToken, remedicalCode: remedicalCode, existDiagnosisResult: true, ), ); } else { result = await RPCBridge.ins.rpc.remedical.findRemedicalByCodeAsync( FindRemedicalByCodeRequest( token: RPCBridge.ins.userToken, remedicalCode: remedicalCode, existDiagnosisResult: true, ), ); } return result; } catch (e) { logger.e('MeasureHomeController getRemedicalInfo ex:', e); return null; } } ///获取测量项 static Future getMeasureApplication( MeasureModeSelection args) async { try { return await RPCBridge.ins.rpc.remoteUltrasound .vitalGetMeasureApplicationAsync( GetMeasureApplicationRequest( token: RPCBridge.ins.userToken, applicationName: args.applicationName, categoryName: args.categoryName, measureModes: args.measureModes, ), ); } catch (e) { print(e); logger.e('MeasureHomeController getMeasureApplication ex: ', e); return null; } } /// 保存测量的方法 static Future saveUserDefinedMeasureApplicationAsync( MeasureModeSubmit args) async { var result = false; try { result = await RPCBridge.ins.rpc.remedical .saveUserDefinedMeasureApplicationAsync( SaveUserDefinedMeasureApplicationRequest( token: RPCBridge.ins.userToken, version: args.version, applicationName: args.applicationName, categoryName: args.categoryName, workingMode: args.workingMode, ), ); } catch (e) { logger.e( 'MeasureHomeController saveUserDefinedMeasureApplicationAsync ex: ', e); } return result; } /// 保存样式 static Future saveMeasureSystemSettingAsync( MeasureSystemSettingDTO measureSystemSetting, ) async { await RPCBridge.ins.rpc.remedical.saveMeasureSystemSettingAsync( SaveMeasureSystemSettingRequest( systemSetting: measureSystemSetting, token: RPCBridge.ins.userToken, ), ); } /// 获取样式 static Future getMeasureSystemSettingAsync() async { final result = await RPCBridge.ins.rpc.remoteUltrasound .vitalGetMeasureSystemSettingAsync( GetMeasureSystemSettingRequest( token: RPCBridge.ins.userToken, ), ); return result; } /// 分享vid static Future shareImage( String examFile, ) async { try { final result = await RPCBridge.ins.rpc.remedical.queryShareExamPageAsync( QueryShareExamPageRequest( examFileToken: examFile, token: RPCBridge.ins.userToken, languageCode: i18nBook.locale.toCodeString('-'), ), ); return result.shareExamPageUrl ?? ''; } catch (e) { logger.e("queryShareExamPageAsync exception:", e); } return ''; } /// 获取注释 static Future getCommentsByApplicationAsync( String applicationName, String categoryName) async { try { if (RPCBridge.ins.source == VidImageSource.RemoteUS) { final result = await RPCBridge.ins.rpc.remoteUltrasound .vitalGetCommentsByApplicationAsync( GetCommentsByApplicationRequest( token: RPCBridge.ins.userToken, applicationName: applicationName, categoryName: categoryName, languageCode: i18nBook.locale.toCodeString('-'), ), ); return result; } else { final result = await RPCBridge.ins.rpc.remedical.getCommentsByApplicationAsync( GetCommentsByApplicationRequest( token: RPCBridge.ins.userToken, applicationName: applicationName, categoryName: categoryName, languageCode: i18nBook.locale.toCodeString('-'), ), ); return result; } } catch (e) { logger.e('MeasureHomeController getCommentsByApplicationAsync ex: ', e); return null; } } /// 保存注释 static Future saveUserDefinedCommentsAsync( String applicationName, String categoryName, List? addCommentItems, List? deleteCommentItems, List? updateCommentItems, ) async { try { final result = await RPCBridge.ins.rpc.remedical.saveUserDefinedCommentsAsync( SaveUserDefinedCommentsRequest( token: RPCBridge.ins.userToken, applicationName: applicationName, categoryName: categoryName, languageCode: i18nBook.locale.toCodeString('-'), // Store.app.systemLocale.languageCode.toLowerCase(), addCommentItems: addCommentItems, deletedCommentItems: deleteCommentItems, updateCommentItems: updateCommentItems), ); return result; } catch (e) { logger.e('MeasureHomeController getCommentsByApplicationAsync ex: ', e); return null; } } /// 重置注释 static Future resetUserCommentsAsync( String applicationName, String categoryName, ) async { try { final result = await RPCBridge.ins.rpc.remedical.resetUserCommentsAsync( ResetUserCommentsRequest( token: RPCBridge.ins.userToken, applicationName: applicationName, categoryName: categoryName, ), ); return result; } catch (e) { logger.e('MeasureHomeController resetUserCommentsAsync ex: ', e); return null; } } /// 获取预置的注释项 static Future getPresetCommentsAsync() async { try { final result = await RPCBridge.ins.rpc.remedical.getPresetCommentsAsync( GetPresetCommentsRequest( token: RPCBridge.ins.userToken, languageCode: i18nBook.locale.toCodeString('-'), // Store.app.systemLocale.languageCode.toLowerCase(), ), ); return result; } catch (e) { logger.e('MeasureHomeController getPresetCommentsAsync ex: ', e); return null; } } static Future getImageInfoByIndex( String recordCode, String token, String patientCode, int index) async { var imageList = await getRemedicalList(patientCode, recordCode); int imageIndex = 0; for (RemedicalItemList r in imageList) { for (RemedicalInfoDTO i in r.remedicalList ?? []) { imageIndex++; if (imageIndex == index) { return i; } } } return null; } }