controller.dart 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. import 'package:get/get.dart';
  2. import 'package:fis_jsonrpc/rpc.dart';
  3. import 'package:vitalapp/managers/interfaces/language.dart';
  4. import 'package:vitalapp/managers/interfaces/models/image_report_list_params.dart';
  5. import 'package:vitalapp/managers/interfaces/remedical.dart';
  6. import 'package:vitalapp/managers/interfaces/report.dart';
  7. const String MainViewId = 'mainView';
  8. class ImagereportinnerviewController extends GetxController {
  9. ImagereportinnerviewController(this.args);
  10. final languageConfigManager = Get.find<ILanguageConfigManager>();
  11. final reportManager = Get.find<IReportManager>();
  12. final remedicalManager = Get.find<IRemedicalManager>();
  13. bool isExpandMeasureImages = true;
  14. //页面入参
  15. ImageReportListParams args;
  16. ///检查记录Code
  17. String get recordCode => args.recordCode;
  18. ///病人Code
  19. String get patientCode => recordInfo?.patientCode ?? '';
  20. ///是否转诊
  21. bool get isReferral => recordInfo?.isReferral ?? false;
  22. ///是否可写报告
  23. bool get isCanWriteReport => args.isShowWriteReportButton;
  24. ///是否展开AI图像
  25. bool isExpandAIImages = true;
  26. ///当前选中的Tab
  27. int selectedTabIndex = 0;
  28. ///云端图像列表的集合
  29. RemedicalListResult? remedicalListResult;
  30. ///左右颈
  31. CarotidScanTypeEnum? carotidVAS;
  32. ///测量图像
  33. List<RemedicalMeasuredInfoDTO> measureImages = [];
  34. ///AI图像
  35. List<RemedicalAISelectedInfoDTO> aiImages = [];
  36. ///报告列表
  37. List<ReportDTO> reports = [];
  38. ///检查详情
  39. QueryRecordResult? recordInfo;
  40. ///切换记录
  41. Future<void> changeRecord(ImageReportListParams args) async {
  42. if (args.recordCode.isEmpty) {
  43. return;
  44. }
  45. this.args = args;
  46. if (args.index != null) {
  47. this.selectedTabIndex = args.index!;
  48. }
  49. recordInfo = await remedicalManager.queryRecordInfoAsync(recordCode);
  50. if (selectedTabIndex <= 1) {
  51. loadImages();
  52. } else {
  53. loadReports();
  54. }
  55. }
  56. void clear() {
  57. args = ImageReportListParams(recordCode: '');
  58. remedicalListResult = null;
  59. measureImages = [];
  60. aiImages = [];
  61. reports = [];
  62. update([MainViewId]);
  63. }
  64. ///所有云端图像集合
  65. List<RemedicalInfoDTO> get allCloudImages {
  66. List<RemedicalInfoDTO> imageInfos = [];
  67. for (RemedicalItemList info
  68. in remedicalListResult?.remedicalItemList ?? []) {
  69. ///左颈动脉图像集合
  70. var carotidLeftImages = info.remedicalList
  71. ?.where((element) =>
  72. element.carotidResult?.carotidScanType ==
  73. CarotidScanTypeEnum.CarotidLeft)
  74. .toList() ??
  75. [];
  76. imageInfos.addAll(carotidLeftImages);
  77. ///右颈动脉图像集合
  78. var carotidRightImages = info.remedicalList
  79. ?.where((element) =>
  80. element.carotidResult?.carotidScanType ==
  81. CarotidScanTypeEnum.CarotidRight)
  82. .toList() ??
  83. [];
  84. imageInfos.addAll(carotidRightImages);
  85. ///非颈动脉(或未识别左右颈)图像集合
  86. var notCarotidImages = info.remedicalList
  87. ?.where(
  88. (element) => ![
  89. CarotidScanTypeEnum.CarotidRight,
  90. CarotidScanTypeEnum.CarotidLeft
  91. ].contains(element.carotidResult?.carotidScanType),
  92. )
  93. .toList() ??
  94. [];
  95. imageInfos.addAll(notCarotidImages);
  96. }
  97. return imageInfos;
  98. }
  99. //String get patientCode => recordInfo?.patientCode
  100. /// 在 widget 内存中分配后立即调用。
  101. @override
  102. void onInit() {
  103. _initData();
  104. super.onInit();
  105. }
  106. /// 在 onInit() 之后调用 1 帧。这是进入的理想场所
  107. @override
  108. void onReady() {
  109. super.onReady();
  110. }
  111. /// 在 [onDelete] 方法之前调用。
  112. @override
  113. void onClose() {
  114. super.onClose();
  115. }
  116. /// dispose 释放内存
  117. @override
  118. void dispose() {
  119. super.dispose();
  120. }
  121. Future<void> loadImages() async {
  122. if (recordCode.isEmpty) {
  123. return;
  124. }
  125. if (selectedTabIndex == 0) {
  126. await _loadCloudImages();
  127. } else if (selectedTabIndex == 1) {
  128. await _loadMeasureImages();
  129. await _loadAIImages();
  130. }
  131. update([MainViewId]);
  132. }
  133. Future<void> loadReports() async {
  134. if (recordCode.isEmpty) {
  135. return;
  136. }
  137. reports = await remedicalManager.findExamReports(recordCode);
  138. update([MainViewId]);
  139. }
  140. Future<void> _loadCloudImages() async {
  141. var result =
  142. await reportManager.getRemedicalListByRecordInfoAsync(recordCode);
  143. remedicalListResult = result;
  144. if (remedicalListResult!.remedicalItemList?.any((e) =>
  145. e.remedicalList?.any((element) =>
  146. element.carotidResult?.carotidScanType ==
  147. CarotidScanTypeEnum.CarotidLeft) ??
  148. false) ??
  149. false) {
  150. ///如果存在颈动脉左颈
  151. carotidVAS = CarotidScanTypeEnum.CarotidLeft;
  152. } else if (remedicalListResult!.remedicalItemList?.any((e) =>
  153. e.remedicalList?.any((element) =>
  154. element.carotidResult?.carotidScanType ==
  155. CarotidScanTypeEnum.CarotidRight) ??
  156. false) ??
  157. false) {
  158. ///如果存在颈动脉右颈
  159. carotidVAS = CarotidScanTypeEnum.CarotidRight;
  160. }
  161. }
  162. Future<void> _loadMeasureImages() async {
  163. var result =
  164. await remedicalManager.findRemedicalMeasuredInfoAsync(recordCode);
  165. measureImages = result;
  166. }
  167. Future<void> _loadAIImages() async {
  168. var result = await remedicalManager.findAIImages(recordCode, patientCode);
  169. aiImages = result;
  170. }
  171. Future<void> _initData() async {
  172. changeRecord(args);
  173. }
  174. }