report_operate_controller.dart 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. import 'dart:convert';
  2. import 'package:fis_common/helpers/encrypt.dart';
  3. import 'package:fis_common/index.dart';
  4. import 'package:fis_common/logger/logger.dart';
  5. import 'package:fis_jsonrpc/rpc.dart';
  6. import 'package:fis_lib_report/report_info/element_tag_names.dart';
  7. import 'package:fis_lib_report/report_info/input_text_info.dart';
  8. import 'package:fis_lib_report/report_info/report_info.dart';
  9. import 'package:get/get.dart';
  10. import 'package:intl/intl.dart';
  11. import 'package:universal_html/html.dart' as html;
  12. import 'package:vitalapp/architecture/services/entity/report_editor_setting.dart';
  13. import 'package:vitalapp/architecture/services/report_editor_configuration.dart';
  14. import 'package:vitalapp/architecture/storage/file_storage.dart';
  15. import 'package:vitalapp/architecture/values/features.dart';
  16. import 'package:vitalapp/pages/report_edit/controller.dart';
  17. import 'package:vitalapp/pages/report_edit/state.dart';
  18. import 'package:vitalapp/pages/report_preview/controller.dart';
  19. import 'package:vitalapp/routes/nav_ids.dart';
  20. import 'package:vitalapp/rpc.dart';
  21. import 'package:vitalapp/store/store.dart';
  22. import 'package:fis_lib_pdf/pdf_helper.dart';
  23. class ReportOperateController {
  24. late final ReportEditController controller;
  25. late final ReportEditState state;
  26. late final ReportPreviewController reportPreviewController =
  27. Get.put<ReportPreviewController>(ReportPreviewController());
  28. /// 本地报告编辑器持久化缓存服务
  29. late final LocalReportEditorService localReportEditorService =
  30. Get.find<LocalReportEditorService>();
  31. late final ReportEditorSetting reportEditorSetting = ReportEditorSetting.ins;
  32. ReportDataPipe get fileStorage => ReportDataPipe(
  33. cacheGet: reportPreviewController.fileStorage.read,
  34. cacheSave: reportPreviewController.fileStorage.save);
  35. String get reportName => _getReportName();
  36. Future<bool> Function(List<int> data, String fileName)? get shellExporter =>
  37. TextMediaFileExporterForShell.exportFile;
  38. ReportOperateController(ReportEditController controller) {
  39. this.controller = controller;
  40. this.state = controller.state;
  41. }
  42. ///跟据reportCode获取报告详情
  43. Future<ReportDTO> findReportByCodeAsync() async {
  44. final reportInfo = await rpc.ultrasoundReport
  45. .vitalFindReportByCodeAsync(FindReportByCodeRequest(
  46. token: Store.user.token,
  47. reportCode: state.reportCode,
  48. ));
  49. return reportInfo;
  50. }
  51. //提交报告
  52. Future<void> submitReport() async {
  53. try {
  54. final reportInfo = FReportInfo.instance;
  55. reportInfo.toJson();
  56. ///noTagIdItems:测量数据
  57. var noTagIdItems = reportInfo.jsonItems
  58. .where((element) =>
  59. element['TagId'] == null ||
  60. element['TagId'].toString().isNullOrEmpty)
  61. .toList();
  62. var normalItems = reportInfo.jsonItems
  63. .where((element) =>
  64. element['TagId'] != null &&
  65. element['TagId'].toString().isNotEmpty)
  66. .toList();
  67. final reportInfoJson = jsonEncode(normalItems);
  68. final reportMeasureDatasJson = jsonEncode(noTagIdItems);
  69. final templateJson = (state.selectedTemplate.reportTemplateJson);
  70. String recordCode = state.recordCode;
  71. if (recordCode.isEmpty) {
  72. recordCode = state.consultationCode;
  73. }
  74. final patientNameElementInfo = FReportInfo.instance
  75. .getElementInfoByTagName(TagNames.PATIENT_NAME_TAG);
  76. var name = '';
  77. if (patientNameElementInfo != null) {
  78. final patientNameInfo = patientNameElementInfo as InputTextInfo;
  79. name = patientNameInfo.text;
  80. }
  81. bool result = false;
  82. if (state.reportCode.isNotEmpty) {
  83. result = await modifyReport(
  84. recordCode,
  85. templateJson ?? '',
  86. name,
  87. reportInfoJson,
  88. reportMeasureDatasJson,
  89. );
  90. } else {
  91. final addResult = await addReport(
  92. recordCode,
  93. templateJson ?? '',
  94. name,
  95. reportInfoJson,
  96. reportMeasureDatasJson,
  97. );
  98. if (addResult.isNotEmpty) {
  99. result = true;
  100. state.reportCode = addResult;
  101. }
  102. }
  103. if (result) {
  104. /// 提交则清空缓存
  105. reportEditorSetting.setReportDraft("", "");
  106. localReportEditorService.save();
  107. // if (Store.user.hasFeature(FeatureKeys.DiagnosisEditReport)
  108. // ) await controller.openAddReportTag();
  109. controller.updateReportCacheByRecordCode(recordCode);
  110. controller.back();
  111. Get.back();
  112. }
  113. } catch (e) {
  114. logger.e('ReportOperateController submitReport ex:', e);
  115. }
  116. }
  117. ///修改报告请求
  118. Future<bool> modifyReport(
  119. String recordCode,
  120. String templateJson,
  121. String name,
  122. String reportInfoJson,
  123. String? reportMeasureDatasJson,
  124. ) async {
  125. var reportInfo = await findReportByCodeAsync();
  126. final updateRequest = ModifyReportRequest(
  127. reportCode: state.reportCode,
  128. token: Store.user.token,
  129. recordCode: recordCode,
  130. reportType: state.consultationCode.isNotEmpty
  131. ? ReportTypeEnum.LiveConsultation
  132. : ReportTypeEnum.RemoteDiagnosis,
  133. reportTemplateJson: templateJson,
  134. platformLabels: ["Flyinsono", "PC", "RemoteDiagnosis"],
  135. patientName: FEncryptHelper.encodeBase64(name),
  136. reportDatasJson: reportInfoJson,
  137. reportMeasureDatasJson: reportMeasureDatasJson,
  138. reportOrgan: reportInfo.reportOrgan,
  139. );
  140. if (state.referralRecordCode.isNotEmpty) {
  141. updateRequest.referralRecordCode = state.referralRecordCode;
  142. }
  143. return await rpc.ultrasoundReport.vitalModifyReportAsync(updateRequest);
  144. }
  145. /// 打开报告预览页面
  146. Future<void> openReportPreviewer() async {
  147. try {
  148. ReportPreviewController.isFromEditor = true;
  149. print(
  150. 'reportCode:' + state.reportCode + ' recordCode:' + state.recordCode);
  151. bool needBackToHome = true;
  152. // await router.to(RouteNames.Remedical.ReportPreview,
  153. // parameters: {
  154. // 'reportCode': state.reportCode,
  155. // 'recordCode': state.recordCode
  156. // },
  157. // id: needBackToHome ? NavIds.HOME : null);
  158. } catch (e) {
  159. printError(info: "preview report error:" + e.toString());
  160. logger.e("preview report error:", e);
  161. }
  162. }
  163. /// 直接打印报告
  164. Future<void> printReportDirectly() async {
  165. try {
  166. PDFHelper.printPDF(reportName, fileStorage);
  167. } catch (e) {
  168. logger.e("print report error:", e);
  169. }
  170. }
  171. /// 直接导出报告
  172. Future<void> exportReportDirectly() async {
  173. try {
  174. PDFHelper.downloadPDF(
  175. reportName,
  176. fileStorage,
  177. shellExporter,
  178. );
  179. } catch (e) {
  180. logger.e("export report error:", e);
  181. }
  182. }
  183. ///获取病人信息
  184. Future<ClientPatientInfoDTO?> getPatientInfo(String patientCode) async {
  185. try {
  186. if (patientCode.isNullOrEmpty) {
  187. return ClientPatientInfoDTO();
  188. }
  189. final patientInfo =
  190. await rpc.remoteUltrasound.vitalFindPatientByCodeAsync(
  191. FindPatientByCodeRequest(
  192. code: patientCode,
  193. token: Store.user.token,
  194. ),
  195. );
  196. return patientInfo;
  197. } catch (e) {
  198. logger.e('ReportEditController getPatientInfo ex:', e);
  199. return null;
  200. }
  201. }
  202. ///新增报告请求
  203. Future<String> addReport(
  204. String recordCode,
  205. String templateJson,
  206. String name,
  207. String reportDatasJson,
  208. String? reportMeasureDatasJson,
  209. ) async {
  210. final addRequest = AddReportRequest(
  211. token: Store.user.token,
  212. recordCode: recordCode,
  213. reportType: state.consultationCode.isNotEmpty
  214. ? ReportTypeEnum.LiveConsultation
  215. : ReportTypeEnum.RemoteDiagnosis,
  216. reportTemplateJson: templateJson,
  217. isReferral: state.referralRecordCode.isNotEmpty,
  218. reportDatasJson: reportDatasJson,
  219. reportMeasureDatasJson: reportMeasureDatasJson,
  220. platformLabels: [
  221. "Flyinsono",
  222. FPlatform.isPureWeb ? "Web" : "PC",
  223. "RemoteDiagnosis"
  224. ],
  225. patientName: FEncryptHelper.encodeBase64(name),
  226. );
  227. return await rpc.ultrasoundReport.vitalAddReportAsync(addRequest);
  228. }
  229. String _getReportName() {
  230. var reportInfo = FReportInfo.instance;
  231. var inputTextInfo;
  232. String patientName = '';
  233. var patientElement =
  234. reportInfo.getElementInfoByTagName(TagNames.PATIENT_NAME_TAG);
  235. if (patientElement != null) {
  236. inputTextInfo = patientElement as InputTextInfo;
  237. patientName = inputTextInfo.text;
  238. } else {
  239. patientName = "";
  240. }
  241. var creatTime = reportInfo.reportDate ?? DateTime.now();
  242. var reportCode = reportInfo.id ?? '';
  243. DateFormat format = DateFormat("yyyMMddHHmmss");
  244. var dateStr = format.format(creatTime);
  245. return "[$patientName]-[$dateStr]-[$reportCode].pdf";
  246. }
  247. }