controller.dart 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629
  1. import 'dart:async';
  2. import 'dart:convert';
  3. import 'package:fis_common/helpers/encrypt.dart';
  4. import 'package:fis_common/index.dart';
  5. import 'package:fis_common/logger/logger.dart';
  6. import 'package:fis_i18n/i18n.dart';
  7. import 'package:fis_jsonrpc/rpc.dart';
  8. import 'package:fis_lib_report/converts/event_type.dart';
  9. import 'package:fis_lib_report/report_info/element_tag_names.dart';
  10. import 'package:fis_lib_report/report_info/input_image_info.dart';
  11. import 'package:fis_lib_report/report_info/input_image_list_info.dart';
  12. import 'package:fis_lib_report/report_info/input_text_info.dart';
  13. import 'package:fis_lib_report/report_info/report_info.dart';
  14. import 'package:fis_lib_report/report_info/single_selected_info.dart';
  15. import 'package:flutter/foundation.dart';
  16. import 'package:flutter/widgets.dart';
  17. import 'package:get/get.dart';
  18. import 'package:fis_ui/index.dart';
  19. import 'package:vitalapp/architecture/defines.dart';
  20. import 'package:vitalapp/architecture/memory_cache/report.dart';
  21. import 'package:vitalapp/architecture/services/entity/report_editor_setting.dart';
  22. import 'package:vitalapp/architecture/services/report_editor_configuration.dart';
  23. import 'package:vitalapp/architecture/utils/prompt_box.dart';
  24. import 'package:vitalapp/managers/interfaces/models/report_edit_source.dart';
  25. import 'package:vitalapp/managers/interfaces/report.dart';
  26. import 'package:vitalapp/managers/interfaces/report_template.dart';
  27. import 'package:vitalapp/pages/report_edit/state.dart';
  28. import 'package:vitalapp/rpc.dart';
  29. import 'package:vitalapp/store/store.dart';
  30. import 'package:fis_measure/process/workspace/rpc_bridge.dart';
  31. import 'controllers/add_report_tag.dart';
  32. import 'controllers/remedicals_controller.dart';
  33. import 'controllers/report_cache_controller.dart';
  34. import 'controllers/report_operate_controller.dart';
  35. import 'controllers/thesaurus_controller.dart';
  36. import 'widgets/speech_input.dart';
  37. class ReportEditController extends FControllerBase {
  38. static const String aiRporterName = "VAid";
  39. late final AddReportTagController addreportTagController;
  40. late final RemedicalsController remedicalsController;
  41. late final ThesaurusController thesaurusController;
  42. late final ReportCacheController reportCacheController;
  43. late final ReportOperateController reportOperateController;
  44. final reportTemplateManager = Get.find<IReportTemplateManager>();
  45. final labelInputController = TextEditingController();
  46. final state = ReportEditState();
  47. final reportManager = Get.find<IReportManager>();
  48. ///图像选择时通知报告
  49. final FEventHandler<String> onSelect = new FEventHandler<String>();
  50. QueryRecordResult? _recordInfo;
  51. ///选中图像选择框时事件通知
  52. FEventHandler<List<String>> onSelectedInputChange =
  53. FEventHandler<List<String>>();
  54. /// 本地报告编辑器持久化缓存服务
  55. LocalReportEditorService localReportEditorService =
  56. Get.find<LocalReportEditorService>();
  57. ReportEditorSetting reportEditorSetting = ReportEditorSetting.ins;
  58. /// 是否需要加载本地未完成的编辑缓存
  59. bool get isReloadFromLocalCache =>
  60. reportEditorSetting.reportDraft.isNotEmpty &&
  61. reportEditorSetting.reportDraftRecordCode ==
  62. (state.recordCode.isNotEmpty
  63. ? state.recordCode
  64. : state.consultationCode);
  65. ///图像选择框是否选中
  66. bool inputImagesIsSelected = false;
  67. ReportEditController() {
  68. remedicalsController = RemedicalsController(this);
  69. thesaurusController = ThesaurusController(this);
  70. reportCacheController = ReportCacheController(this);
  71. addreportTagController = AddReportTagController(this);
  72. reportOperateController = ReportOperateController(this);
  73. }
  74. @override
  75. void onReady() {
  76. super.onReady();
  77. _initData();
  78. }
  79. @override
  80. void onClose() {
  81. super.onClose();
  82. reportCacheController.removeScheduledCacheReport();
  83. reportCacheController.dispose();
  84. FReportInfo.instance.onSpeechInput.removeListener(_openSpeechInput);
  85. RPCBridge.ins.source = VidImageSource.Remedical;
  86. labelInputController.dispose();
  87. }
  88. ///跟据reportCode获取报告详情
  89. Future<ReportDTO> findReportByCodeAsync() async {
  90. return reportOperateController.findReportByCodeAsync();
  91. }
  92. //提交报告
  93. Future<void> submitReport() async {
  94. await busyHandle(
  95. () async {
  96. await reportOperateController.submitReport();
  97. },
  98. text: i18nBook.common.submitting.t,
  99. );
  100. Future.delayed(Duration(milliseconds: 1000), () {
  101. PromptBox.toast(i18nBook.remedical.submitSuccessToCompleteList.t);
  102. });
  103. }
  104. ///打开报告预览页面
  105. Future<void> openReportPreviewer() async {
  106. return reportOperateController.openReportPreviewer();
  107. }
  108. ///不打开报告预览页面,直接调起打印
  109. Future<void> printReportDirectly() async {
  110. return reportOperateController.printReportDirectly();
  111. }
  112. ///查找AI图像
  113. Future<void> findAiImagesAsync() async {
  114. return remedicalsController.findAiImagesAsync();
  115. }
  116. ///不打开报告预览页面,直接导出
  117. Future<void> exportReportDirectly() async {
  118. return reportOperateController.exportReportDirectly();
  119. }
  120. /// 刷新图像列表
  121. Future<void> refreshImages() async {
  122. getRemedicalList();
  123. }
  124. ///返回上级页面
  125. void back() {
  126. reportCacheController.back();
  127. }
  128. /// 初始化词条数据
  129. Future<void> getDefaultThesaurus(String defaultThesaurus) async {
  130. return thesaurusController.getDefaultThesaurus(defaultThesaurus);
  131. }
  132. ///初始化报告模板
  133. Future<void> initUserDefaultTemplate() async {
  134. final defaultTemplateInfo = await _getDefaultTemplateCode();
  135. if (defaultTemplateInfo == null) {
  136. PromptBox.toast(i18nBook.errorCodes.errorCode5002.t);
  137. logger.e(
  138. 'ReportEditController _initTemplate error: defaultTemplateInfo is null');
  139. } else {
  140. state.selectedTemplate = defaultTemplateInfo;
  141. }
  142. }
  143. ///获取默认模板
  144. Future<ReportTemplateDTO?> _getDefaultTemplateCode() async {
  145. try {
  146. final result =
  147. await rpc.ultrasoundReport.vitalGetDefaultReportTemplateContentAsync(
  148. GetDefaultReportTemplateContentRequest(
  149. token: Store.user.token,
  150. languageCode: i18nBook.locale.toCodeString('-'),
  151. ),
  152. );
  153. return result;
  154. } catch (e) {
  155. logger.e('ReportTemplateController getDefaultTemplateCode', e);
  156. return null;
  157. }
  158. }
  159. ///初始化报告模板、报告缓存、报告编辑器缓存
  160. void _initData({bool isReload = false}) async {
  161. try {
  162. busy = true;
  163. FReportInfo.instance.isASROn = true;
  164. await initParameters();
  165. initReportEditorCache();
  166. thesaurusController.initDefaultThesaurus();
  167. await _initTemplates();
  168. await _initPatientInfo();
  169. String createrName = await _getCreateName();
  170. if (state.reportCode.isNotEmpty) {
  171. await reportCacheController.initServerReport();
  172. _initExamDoctorInfo(createrName);
  173. } else {
  174. if (!isReload) {
  175. await initUserDefaultTemplate();
  176. /// 从本地缓存中恢复未编辑完的报告
  177. if (isReloadFromLocalCache) {
  178. final reportDraftJsonStr =
  179. jsonDecode(reportEditorSetting.reportDraft) as List<dynamic>;
  180. // var reportTemplateJsonStr =
  181. // state.selectedTemplate.reportTemplateJson;
  182. bool checkIsSameTemplate =
  183. reportEditorSetting.reportDraftTemplateCode ==
  184. state.selectedTemplate.reportTemplateCode;
  185. // _checkIsSameTemplate(reportTemplateJsonStr, reportDraftJsonStr);
  186. // 检查报告模板是否一致
  187. if (checkIsSameTemplate) {
  188. Future.delayed(Duration(milliseconds: 500), () {
  189. PromptBox.toast(i18nBook.remedical.restoreCache.t);
  190. FReportInfo.instance.fromJson(reportDraftJsonStr);
  191. });
  192. } else {
  193. if (state.templates.isNotEmpty) {
  194. // 遍历模板列表,查找是否存在该模板
  195. var template = state.templates.firstWhereOrNull((element) =>
  196. element.value ==
  197. reportEditorSetting.reportDraftTemplateCode);
  198. if (template != null) {
  199. ReportTemplateDTO reportTemplate =
  200. await reportTemplateManager.findReportTemplateByCode(
  201. code: reportEditorSetting.reportDraftTemplateCode);
  202. FConfirmAlert.show(
  203. context: Get.context!,
  204. title: i18nBook.common.tip.t,
  205. subTitle: i18nBook.remedical.restoreCacheAlert.t,
  206. confrimLabel: i18nBook.common.confirm.t,
  207. cancelLabel: i18nBook.common.cancel.t,
  208. businessParent: FVirtualPageWidget('report editor'),
  209. onConfirm: () async {
  210. await changeTemplate(reportTemplate);
  211. Future.delayed(Duration(milliseconds: 500), () {
  212. FReportInfo.instance.fromJson(reportDraftJsonStr);
  213. Future.delayed(Duration(milliseconds: 500), () {
  214. PromptBox.toast(i18nBook.remedical.restoreCache.t);
  215. });
  216. });
  217. },
  218. );
  219. }
  220. }
  221. }
  222. } else {
  223. reportCacheController.initReportCache();
  224. }
  225. }
  226. var devicePatientId = state.devicePatientId;
  227. _initReportInfo(createrName, state.patientSex, devicePatientId);
  228. }
  229. _initImageInputChangeListener();
  230. await getRemedicalList();
  231. _autoFillCurrentUserSignature();
  232. _addReportInfoListen();
  233. } catch (e) {
  234. logger.e('ReportEditController initData:', e);
  235. }
  236. reportCacheController.setScheduledCacheReport();
  237. busy = false;
  238. }
  239. ///查询检查详情
  240. Future<QueryRecordResult?> queryRecordInfoAsync(String recordCode) async {
  241. return await remedicalsController.queryRecordInfoAsync(recordCode);
  242. }
  243. ///获取病人信息
  244. Future<ClientPatientInfoDTO?> getPatientInfo(String patientCode) async {
  245. return reportOperateController.getPatientInfo(patientCode);
  246. }
  247. //根据缓存实例化报告信息
  248. void initReportInfoFromJson(ReportInfoItem reportCache) {
  249. reportCacheController.initReportInfoFromJson(reportCache);
  250. }
  251. ///初始化入参
  252. Future<void> initParameters() async {
  253. var parameters = Get.arguments;
  254. print(parameters);
  255. if (parameters.containsKey('token')) {
  256. thesaurusController.initAllThesaurus();
  257. }
  258. if (parameters.containsKey('patientCode')) {
  259. state.patientId = parameters['patientCode'] ?? '';
  260. }
  261. if (parameters.containsKey('reportEditSource')) {
  262. state.reportEditSource = ReportEditSource.values.firstWhere(
  263. (element) => element.name == parameters['reportEditSource']);
  264. }
  265. if (parameters.containsKey('recordCode')) {
  266. state.recordCode = parameters['recordCode'] ?? '';
  267. if (state.recordCode.isNotEmpty) {
  268. _recordInfo = await queryRecordInfoAsync(state.recordCode);
  269. }
  270. }
  271. if (parameters.containsKey('referralRecordCode')) {
  272. state.referralRecordCode = parameters['referralRecordCode'] ?? '';
  273. }
  274. if (parameters.containsKey('reportCode')) {
  275. state.reportCode = parameters['reportCode'] ?? '';
  276. }
  277. }
  278. /// 初始化报告编辑器本地缓存
  279. void initReportEditorCache() async {
  280. final localReportEditorService = Get.find<LocalReportEditorService>();
  281. await localReportEditorService.init();
  282. }
  283. ///获取图像列表
  284. Future<void> getRemedicalList() async {
  285. remedicalsController.getRemedicalList();
  286. if (state.recordCode.isNotEmpty) {
  287. remedicalsController.findRemedicalMeasuredInfoAsync();
  288. }
  289. }
  290. /// 自动填充当前用户的电子签名
  291. void _autoFillCurrentUserSignature() {
  292. try {
  293. final signature = Store.user.signature;
  294. if (signature.isEmpty) return;
  295. Future.delayed(Duration(seconds: 1), () {
  296. final signatureElement = FReportInfo.instance
  297. .getElementInfoByTagName(TagNames.DIGITALSIGNATURE);
  298. if (signatureElement != null) {
  299. final signatureArea = signatureElement as InputImageInfo;
  300. signatureArea.selectedImage = signature;
  301. }
  302. });
  303. } catch (e) {
  304. logger.e('ReportEditController _autoFillCurrentUserSignature ex:', e);
  305. }
  306. }
  307. ///打开添加报告标签弹窗
  308. Future<void> openAddReportTag() async {
  309. await addreportTagController.openAddReportTag();
  310. }
  311. ///跟据检查Code更新报告缓存
  312. void updateReportCacheByRecordCode(String recordCode) {
  313. return reportCacheController.updateReportCacheByRecordCode(recordCode);
  314. }
  315. //初始化报告信息
  316. void _initReportInfo(String createName, String gender, String patientId) {
  317. Future.delayed(
  318. Duration(milliseconds: 800),
  319. () async {
  320. //国家脑卒中项目,掌超上传医院
  321. var customOrganzation = _recordInfo?.customOrganzation ?? '';
  322. //国家脑卒中项目,掌超上传医生
  323. var customDoctor = _recordInfo?.customDoctor ?? '';
  324. final hospitalInput =
  325. FReportInfo.instance.getElementInfoByTagName(TagNames.HOSPITALNAME);
  326. if (hospitalInput != null) {
  327. final hospital = hospitalInput as InputTextInfo;
  328. if (customOrganzation.isNotEmpty) {
  329. hospital.text = customOrganzation;
  330. } else {
  331. if (Store.user.organizationName.isNullOrEmpty) {
  332. hospital.text = _recordInfo?.deviceOrganzationName ?? '';
  333. } else {
  334. hospital.text = Store.user.organizationName;
  335. }
  336. }
  337. }
  338. final examDoctorInput =
  339. FReportInfo.instance.getElementInfoByTagName(TagNames.INSPHYSICIAN);
  340. if (examDoctorInput != null) {
  341. final examDoctor = examDoctorInput as InputTextInfo;
  342. if (customDoctor.isNotNullOrEmpty) {
  343. examDoctor.text = customDoctor;
  344. } else {
  345. examDoctor.text = createName;
  346. }
  347. }
  348. final patientIdInputElement = FReportInfo.instance
  349. .getElementInfoByTagName(TagNames.PATIENT_ID_TAG);
  350. if (patientIdInputElement != null) {
  351. final patientIdInput = patientIdInputElement as InputTextInfo;
  352. patientIdInput.text = patientId;
  353. }
  354. final genderSelect = FReportInfo.instance
  355. .getElementInfoByTagName(TagNames.PATIENT_SEX_TAG);
  356. if (genderSelect != null && genderSelect is SingleSelectedInfo) {
  357. final items = genderSelect.items ?? [];
  358. if (gender == 'AnimalInfoMale' || gender == 'Male') {
  359. if (items.contains('男')) {
  360. genderSelect.selectedItem = '男';
  361. } else if (items.contains('雄性')) {
  362. genderSelect.selectedItem = '雄性';
  363. } else if (items.contains('Male')) {
  364. genderSelect.selectedItem = 'Male';
  365. }
  366. } else if (gender == 'AnimalInfoFemale' || gender == 'Female') {
  367. if (items.contains('女')) {
  368. genderSelect.selectedItem = '女';
  369. } else if (items.contains('Female')) {
  370. genderSelect.selectedItem = 'Female';
  371. } else if (items.contains('雌性')) {
  372. genderSelect.selectedItem = '雌性';
  373. }
  374. }
  375. } else {
  376. print('null genderSelect');
  377. }
  378. },
  379. );
  380. }
  381. ///测量图像单击事件
  382. void onMersureImageTap(String token, int index) {
  383. return remedicalsController.onMersureImageTap(token, index);
  384. }
  385. //初始化报告信息
  386. void _initExamDoctorInfo(String createName) {
  387. if (Store.user.organizationName.isNotEmpty) {
  388. Future.delayed(
  389. Duration(milliseconds: 1000),
  390. () {
  391. //国家脑卒中项目,掌超上传医院
  392. var customOrganzation = _recordInfo?.customOrganzation ?? '';
  393. //国家脑卒中项目,掌超上传医生
  394. var customDoctor = _recordInfo?.customDoctor ?? '';
  395. final examDoctorInput = FReportInfo.instance
  396. .getElementInfoByTagName(TagNames.INSPHYSICIAN);
  397. if (examDoctorInput != null) {
  398. final examDoctor = examDoctorInput as InputTextInfo;
  399. if (examDoctor.text == aiRporterName ||
  400. examDoctor.text.isNullOrEmpty) {
  401. examDoctor.text = createName;
  402. }
  403. }
  404. final reportPhysicianInput =
  405. FReportInfo.instance.getElementInfoByTagName(TagNames.RPHYSICIAN);
  406. if (reportPhysicianInput != null) {
  407. final doctor = reportPhysicianInput as InputTextInfo;
  408. if (customDoctor.isNotNullOrEmpty) {
  409. doctor.text = customDoctor;
  410. } else if (doctor.text != createName ||
  411. doctor.text == aiRporterName) {
  412. doctor.text = createName;
  413. }
  414. }
  415. final hospitalInput = FReportInfo.instance
  416. .getElementInfoByTagName(TagNames.HOSPITALNAME);
  417. if (hospitalInput != null) {
  418. final hospital = hospitalInput as InputTextInfo;
  419. if (hospital.text.isEmpty) {
  420. if (customOrganzation.isNotNullOrEmpty) {
  421. hospital.text = customOrganzation;
  422. } else {
  423. if (Store.user.organizationName.isEmpty) {
  424. hospital.text = _recordInfo?.deviceOrganzationName ?? '';
  425. } else {
  426. hospital.text = Store.user.organizationName;
  427. }
  428. }
  429. }
  430. }
  431. },
  432. );
  433. }
  434. }
  435. /// 【报告编辑】选中 vid 图像进入测量页
  436. void enterVidMeasurePage(
  437. String imageUrl,
  438. int imageindex,
  439. String remedicalCode,
  440. String? remedicalAISelectedInfoCode,
  441. ) async {
  442. final patientCode = state.patientId;
  443. final recordCode = state.recordCode;
  444. reportManager.enterVidMeasurePage(
  445. imageUrl: imageUrl,
  446. imageindex: imageindex,
  447. remedicalCode: remedicalCode,
  448. patientCode: patientCode,
  449. recordCode: recordCode,
  450. remedicalAISelectedInfoCode: remedicalAISelectedInfoCode,
  451. needRouterBack: true,
  452. reportPageEnter: true,
  453. );
  454. }
  455. void _initImageInputChangeListener() {
  456. Future.delayed(Duration(milliseconds: 1000), () {
  457. final imagesInput =
  458. FReportInfo.instance.getElementInfoByTagName(TagNames.SELECTIMAGES);
  459. if (imagesInput != null) {
  460. var imagesInfo = imagesInput as InputImageListInfo;
  461. imagesInfo.onRemove.addListener((sender, e) {
  462. final selectedImages = state.selectedImages;
  463. if (selectedImages.contains(e)) {
  464. state.selectedImages.remove(e);
  465. onSelectedInputChange.emit(this, state.selectedImages);
  466. }
  467. });
  468. imagesInfo.onSelectedInputChange.addListener((sender, e) {
  469. inputImagesIsSelected = e;
  470. if (e) {
  471. state.selectedImages = [];
  472. state.selectedImages.addAll(imagesInfo.selectedImages);
  473. } else {
  474. state.selectedImages = [];
  475. }
  476. onSelectedInputChange.emit(this, state.selectedImages);
  477. });
  478. }
  479. });
  480. }
  481. void _addReportInfoListen() {
  482. FReportInfo.instance.onSpeechInput.addListener(_openSpeechInput);
  483. }
  484. void _openSpeechInput(sender, e) async {
  485. await Get.dialog(
  486. SpeechInput(e),
  487. );
  488. }
  489. void onConsultationImageSelected(String coverImageUrl) {
  490. remedicalsController.onConsultationImageSelected(coverImageUrl);
  491. }
  492. Future<String> _getCreateName() async {
  493. return Store.user.displayName;
  494. }
  495. Future<void> _initPatientInfo() async {
  496. final patientInfo = await getPatientInfo(state.patientId);
  497. var devicePatientIDs = patientInfo?.devicePatientIDs ?? [];
  498. var devicePatientId = devicePatientIDs.isNotEmpty
  499. ? patientInfo?.devicePatientIDs?.first ?? ''
  500. : '';
  501. state.devicePatientId = devicePatientId;
  502. if (patientInfo != null) {
  503. state.patientName =
  504. FEncryptHelper.decryptBase64(patientInfo.encryptFullName ?? '');
  505. var patientData = patientInfo.patientData ?? [];
  506. if (patientData.isNotEmpty) {
  507. var ageInfo =
  508. patientData.firstWhereOrNull((element) => element.key == 'AgeYear');
  509. state.patientAge = ageInfo == null ? '' : ageInfo.value ?? '';
  510. var patientSexInfo = patientData.firstWhereOrNull((element) =>
  511. element.key == 'Sex' || element.key == 'AnimalInfoSex');
  512. state.patientSex =
  513. patientSexInfo == null ? '' : patientSexInfo.value ?? '';
  514. }
  515. }
  516. }
  517. //校验草稿中的所有组件是否都存在,不存在则不加载草稿
  518. bool _checkIsSameTemplate(String? reportTemplateJsonStr, List json) {
  519. if (reportTemplateJsonStr != null) {
  520. for (var item in json) {
  521. var tag = item['Key'] ?? '';
  522. if (!reportTemplateJsonStr.contains(tag)) {
  523. return false;
  524. }
  525. }
  526. }
  527. return true;
  528. }
  529. Future<void> _initTemplates() async {
  530. var templatePage = await reportTemplateManager.getReportTemplatePage();
  531. state.templates = templatePage.pageData
  532. ?.map(
  533. (e) => FSelectOptionModel(
  534. title: e.reportTemplateName ?? '',
  535. value: e.reportTemplateCode,
  536. ),
  537. )
  538. .toList() ??
  539. [];
  540. }
  541. Future<void> onSelectedTemplateChange(String? value) async {
  542. var reportTemplate =
  543. await reportTemplateManager.findReportTemplateByCode(code: value ?? '');
  544. state.selectedTemplate = reportTemplate;
  545. FReportInfo.instance.reload(
  546. Store.user.displayName,
  547. DateTime.now(),
  548. reportTemplate.reportTemplateJson ?? '',
  549. onSelect,
  550. i18nBook.common.revoke.t,
  551. i18nBook.remedical.selectWord.t,
  552. '',
  553. isASROn: true,
  554. );
  555. state.selectedImages = [];
  556. _initData(
  557. isReload: true,
  558. );
  559. thesaurusController.initDefaultThesaurus();
  560. }
  561. Future<void> changeTemplate(ReportTemplateDTO reportTemplate) async {
  562. state.selectedTemplate = reportTemplate;
  563. FReportInfo.instance.reload(
  564. Store.user.displayName,
  565. DateTime.now(),
  566. reportTemplate.reportTemplateJson ?? '',
  567. onSelect,
  568. i18nBook.common.revoke.t,
  569. i18nBook.remedical.selectWord.t,
  570. '',
  571. isASROn: true,
  572. );
  573. state.selectedImages = [];
  574. _initData(
  575. isReload: true,
  576. );
  577. await thesaurusController.initDefaultThesaurus();
  578. }
  579. }