123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261 |
- 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>(ReportPreviewController());
- /// 本地报告编辑器持久化缓存服务
- late final LocalReportEditorService localReportEditorService =
- Get.find<LocalReportEditorService>();
- late final ReportEditorSetting reportEditorSetting = ReportEditorSetting.ins;
- ReportDataPipe get fileStorage => ReportDataPipe(
- cacheGet: reportPreviewController.fileStorage.read,
- cacheSave: reportPreviewController.fileStorage.save);
- String get reportName => _getReportName();
- Future<bool> Function(List<int> data, String fileName)? get shellExporter =>
- TextMediaFileExporterForShell.exportFile;
- ReportOperateController(ReportEditController controller) {
- this.controller = controller;
- this.state = controller.state;
- }
- ///跟据reportCode获取报告详情
- Future<ReportDTO> findReportByCodeAsync() async {
- final reportInfo = await rpc.ultrasoundReport
- .vitalFindReportByCodeAsync(FindReportByCodeRequest(
- token: Store.user.token,
- reportCode: state.reportCode,
- ));
- return reportInfo;
- }
- //提交报告
- Future<void> 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<bool> 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<void> 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<void> printReportDirectly() async {
- try {
- PDFHelper.printPDF(reportName, fileStorage);
- } catch (e) {
- logger.e("print report error:", e);
- }
- }
- /// 直接导出报告
- Future<void> exportReportDirectly() async {
- try {
- PDFHelper.downloadPDF(
- reportName,
- fileStorage,
- shellExporter,
- );
- } catch (e) {
- logger.e("export report error:", e);
- }
- }
- ///获取病人信息
- Future<ClientPatientInfoDTO?> 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<String> 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";
- }
- }
|