import 'dart:convert'; import 'package:fis_common/helpers/encrypt.dart'; import 'package:fis_common/index.dart'; import 'package:fis_common/logger/logger.dart'; import 'package:fis_jsonrpc/rpc.dart'; import 'package:fis_lib_report/report_info/element_tag_names.dart'; import 'package:fis_lib_report/report_info/input_text_info.dart'; import 'package:fis_lib_report/report_info/report_info.dart'; import 'package:get/get.dart'; import 'package:intl/intl.dart'; import 'package:universal_html/html.dart' as html; import 'package:vitalapp/architecture/services/entity/report_editor_setting.dart'; import 'package:vitalapp/architecture/services/report_editor_configuration.dart'; import 'package:vitalapp/architecture/storage/file_storage.dart'; import 'package:vitalapp/architecture/values/features.dart'; import 'package:vitalapp/pages/report_edit/controller.dart'; import 'package:vitalapp/pages/report_edit/state.dart'; import 'package:vitalapp/pages/report_preview/controller.dart'; import 'package:vitalapp/routes/nav_ids.dart'; import 'package:vitalapp/rpc.dart'; import 'package:vitalapp/store/store.dart'; import 'package:fis_lib_pdf/pdf_helper.dart'; class ReportOperateController { late final ReportEditController controller; late final ReportEditState state; late final ReportPreviewController reportPreviewController = Get.put(ReportPreviewController()); /// 本地报告编辑器持久化缓存服务 late final LocalReportEditorService localReportEditorService = Get.find(); late final ReportEditorSetting reportEditorSetting = ReportEditorSetting.ins; ReportDataPipe get fileStorage => ReportDataPipe( cacheGet: reportPreviewController.fileStorage.read, cacheSave: reportPreviewController.fileStorage.save); String get reportName => _getReportName(); Future Function(List data, String fileName)? get shellExporter => TextMediaFileExporterForShell.exportFile; ReportOperateController(ReportEditController controller) { this.controller = controller; this.state = controller.state; } ///跟据reportCode获取报告详情 Future findReportByCodeAsync() async { final reportInfo = await rpc.ultrasoundReport .vitalFindReportByCodeAsync(FindReportByCodeRequest( token: Store.user.token, reportCode: state.reportCode, )); return reportInfo; } //提交报告 Future submitReport() async { try { final reportInfo = FReportInfo.instance; reportInfo.toJson(); ///noTagIdItems:测量数据 var noTagIdItems = reportInfo.jsonItems .where((element) => element['TagId'] == null || element['TagId'].toString().isNullOrEmpty) .toList(); var normalItems = reportInfo.jsonItems .where((element) => element['TagId'] != null && element['TagId'].toString().isNotEmpty) .toList(); final reportInfoJson = jsonEncode(normalItems); final reportMeasureDatasJson = jsonEncode(noTagIdItems); final templateJson = (state.selectedTemplate.reportTemplateJson); String recordCode = state.recordCode; if (recordCode.isEmpty) { recordCode = state.consultationCode; } final patientNameElementInfo = FReportInfo.instance .getElementInfoByTagName(TagNames.PATIENT_NAME_TAG); var name = ''; if (patientNameElementInfo != null) { final patientNameInfo = patientNameElementInfo as InputTextInfo; name = patientNameInfo.text; } bool result = false; if (state.reportCode.isNotEmpty) { result = await modifyReport( recordCode, templateJson ?? '', name, reportInfoJson, reportMeasureDatasJson, ); } else { final addResult = await addReport( recordCode, templateJson ?? '', name, reportInfoJson, reportMeasureDatasJson, ); if (addResult.isNotEmpty) { result = true; state.reportCode = addResult; } } if (result) { /// 提交则清空缓存 reportEditorSetting.setReportDraft("", ""); localReportEditorService.save(); // if (Store.user.hasFeature(FeatureKeys.DiagnosisEditReport) // ) await controller.openAddReportTag(); controller.updateReportCacheByRecordCode(recordCode); controller.back(); Get.back(); } } catch (e) { logger.e('ReportOperateController submitReport ex:', e); } } ///修改报告请求 Future modifyReport( String recordCode, String templateJson, String name, String reportInfoJson, String? reportMeasureDatasJson, ) async { var reportInfo = await findReportByCodeAsync(); final updateRequest = ModifyReportRequest( reportCode: state.reportCode, token: Store.user.token, recordCode: recordCode, reportType: state.consultationCode.isNotEmpty ? ReportTypeEnum.LiveConsultation : ReportTypeEnum.RemoteDiagnosis, reportTemplateJson: templateJson, platformLabels: ["Flyinsono", "PC", "RemoteDiagnosis"], patientName: FEncryptHelper.encodeBase64(name), reportDatasJson: reportInfoJson, reportMeasureDatasJson: reportMeasureDatasJson, reportOrgan: reportInfo.reportOrgan, ); if (state.referralRecordCode.isNotEmpty) { updateRequest.referralRecordCode = state.referralRecordCode; } return await rpc.ultrasoundReport.vitalModifyReportAsync(updateRequest); } /// 打开报告预览页面 Future openReportPreviewer() async { try { ReportPreviewController.isFromEditor = true; print( 'reportCode:' + state.reportCode + ' recordCode:' + state.recordCode); bool needBackToHome = true; // await router.to(RouteNames.Remedical.ReportPreview, // parameters: { // 'reportCode': state.reportCode, // 'recordCode': state.recordCode // }, // id: needBackToHome ? NavIds.HOME : null); } catch (e) { printError(info: "preview report error:" + e.toString()); logger.e("preview report error:", e); } } /// 直接打印报告 Future printReportDirectly() async { try { PDFHelper.printPDF(reportName, fileStorage); } catch (e) { logger.e("print report error:", e); } } /// 直接导出报告 Future exportReportDirectly() async { try { PDFHelper.downloadPDF( reportName, fileStorage, shellExporter, ); } catch (e) { logger.e("export report error:", e); } } ///获取病人信息 Future getPatientInfo(String patientCode) async { try { if (patientCode.isNullOrEmpty) { return ClientPatientInfoDTO(); } final patientInfo = await rpc.remoteUltrasound.vitalFindPatientByCodeAsync( FindPatientByCodeRequest( code: patientCode, token: Store.user.token, ), ); return patientInfo; } catch (e) { logger.e('ReportEditController getPatientInfo ex:', e); return null; } } ///新增报告请求 Future addReport( String recordCode, String templateJson, String name, String reportDatasJson, String? reportMeasureDatasJson, ) async { final addRequest = AddReportRequest( token: Store.user.token, recordCode: recordCode, reportType: state.consultationCode.isNotEmpty ? ReportTypeEnum.LiveConsultation : ReportTypeEnum.RemoteDiagnosis, reportTemplateJson: templateJson, isReferral: state.referralRecordCode.isNotEmpty, reportDatasJson: reportDatasJson, reportMeasureDatasJson: reportMeasureDatasJson, platformLabels: [ "Flyinsono", FPlatform.isPureWeb ? "Web" : "PC", "RemoteDiagnosis" ], patientName: FEncryptHelper.encodeBase64(name), ); return await rpc.ultrasoundReport.vitalAddReportAsync(addRequest); } String _getReportName() { var reportInfo = FReportInfo.instance; var inputTextInfo; String patientName = ''; var patientElement = reportInfo.getElementInfoByTagName(TagNames.PATIENT_NAME_TAG); if (patientElement != null) { inputTextInfo = patientElement as InputTextInfo; patientName = inputTextInfo.text; } else { patientName = ""; } var creatTime = reportInfo.reportDate ?? DateTime.now(); var reportCode = reportInfo.id ?? ''; DateFormat format = DateFormat("yyyMMddHHmmss"); var dateStr = format.format(creatTime); return "[$patientName]-[$dateStr]-[$reportCode].pdf"; } }