measure_data_helper.dart 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  1. // ignore_for_file: constant_identifier_names
  2. import 'dart:convert';
  3. import 'package:fis_common/logger/logger.dart';
  4. import 'package:fis_jsonrpc/rpc.dart';
  5. import 'package:fis_measure/process/workspace/measure_handler.dart';
  6. import 'package:fis_measure/process/workspace/rpc_bridge.dart';
  7. import 'package:fis_i18n/i18n.dart';
  8. import 'package:flutter/foundation.dart';
  9. class MeasureDataHelper {
  10. // static VidImageSource source = VidImageSource.Remedical;
  11. static get source => RPCBridge.ins.source;
  12. // 获取图像列表
  13. static Future<List<RemedicalItemList>> getRemedicalList(
  14. String patientCode, String recordCode) async {
  15. try {
  16. // 初始化为空列表
  17. List<RemedicalItemList> remedicalItems = [];
  18. // 当数据来源是 Consultation 时
  19. if (source == VidImageSource.Consultation) {
  20. // 获取咨询图片
  21. var images = await getConsultationImages(recordCode);
  22. // 遍历图片列表,将非空的 imageInfos 添加到 remedicalItems 中
  23. images.forEach((imageInfo) {
  24. var imageInfos = imageInfo.ultrasoundImageList ?? [];
  25. if (imageInfos.isNotEmpty) {
  26. remedicalItems.add(RemedicalItemList(
  27. remedicalList: imageInfos,
  28. ));
  29. }
  30. });
  31. }
  32. // 当数据来源是 Laboratory 时
  33. else if (source == VidImageSource.Laboratory) {
  34. // 获取患者的文件列表
  35. var getRecordsPage =
  36. await RPCBridge.ins.rpc.lab.getFileListByFolderAsync(
  37. GetFileListByFolderRequest(
  38. token: RPCBridge.ins.userToken,
  39. pageIndex: 1,
  40. pageSize: 100,
  41. folderCode: patientCode,
  42. ),
  43. );
  44. remedicalItems.add(RemedicalItemList(
  45. remedicalList: getRecordsPage.pageData,
  46. ));
  47. }
  48. // 当数据来源为ai结果编辑的
  49. else if (source == VidImageSource.AiResultModifier) {
  50. var result =
  51. await RPCBridge.ins.rpc.remedical.getPatientAISelectedInfosAsync(
  52. GetPatientAISelectedInfosRequest(
  53. token: RPCBridge.ins.userToken,
  54. recordCode: recordCode,
  55. ),
  56. );
  57. List<RemedicalInfoDTO> remedicalInfoList = [];
  58. result.forEach((element) {
  59. remedicalInfoList.add(RemedicalInfoDTO(
  60. recordCode: element.recordCode,
  61. remedicalCode: element.remedicalAISelectedInfoCode,
  62. terminalImages: TerminalImageDTO(
  63. previewUrl: element.previewFileToken,
  64. imageUrl: element.cdnFileToken,
  65. coverImageUrl: element.previewFileToken,
  66. originImageUrl: element.orginalFileToken,
  67. recommendedDownloadMode: element.recommendedDownloadMode,
  68. ),
  69. diagnosisConclusion: element.diagnosisConclusion,
  70. diagnosisOrgans: element.diagnosisOrgans,
  71. ));
  72. });
  73. remedicalItems.add(RemedicalItemList(
  74. remedicalList: remedicalInfoList,
  75. ));
  76. } else if (source == VidImageSource.RemoteUS) {
  77. // 获取患者的病历记录
  78. PageResult<RemedicalListResult> result =
  79. PageResult<RemedicalListResult>();
  80. result.pageData = [];
  81. try {
  82. result = await RPCBridge.ins.rpc.remoteUltrasound
  83. .vitalGetRemedicalListPagesAsync(
  84. GetRecordsPageRequest(
  85. token: RPCBridge.ins.userToken,
  86. pageIndex: 1,
  87. pageSize: 100,
  88. patientCode: patientCode,
  89. ),
  90. );
  91. } catch (e) {
  92. logger.e('MeasureDataHelper vitalGetRemedicalListPagesAsync ex:$e');
  93. }
  94. // 遍历病历记录列表,当某条记录的 recordCode 与传入的 recordCode 相同时,将其 remedicalItemList 添加到 remedicalItems 中
  95. if (result.pageData!.isNotEmpty) {
  96. var recordInfo = result.pageData!.firstWhere(
  97. (element) => element.recordCode == recordCode,
  98. orElse: () => RemedicalListResult());
  99. remedicalItems = recordInfo.remedicalItemList ?? [];
  100. }
  101. }
  102. // 当数据来源为其他情况时
  103. else {
  104. // 获取患者的病历记录
  105. PageResult<RemedicalListResult> result =
  106. PageResult<RemedicalListResult>();
  107. result.pageData = [];
  108. try {
  109. result = await RPCBridge.ins.rpc.remedical.getRemedicalListPagesAsync(
  110. GetRecordsPageRequest(
  111. token: RPCBridge.ins.userToken,
  112. pageIndex: 1,
  113. pageSize: 100,
  114. patientCode: patientCode,
  115. ),
  116. );
  117. } catch (e) {
  118. logger.e('MeasureDataHelper getRemedicalListPagesAsync ex:$e');
  119. }
  120. // 遍历病历记录列表,当某条记录的 recordCode 与传入的 recordCode 相同时,将其 remedicalItemList 添加到 remedicalItems 中
  121. if (result.pageData!.isNotEmpty) {
  122. var recordInfo = result.pageData!.firstWhere(
  123. (element) => element.recordCode == recordCode,
  124. orElse: () => RemedicalListResult());
  125. remedicalItems = recordInfo.remedicalItemList ?? [];
  126. }
  127. }
  128. // 返回最终的 remedicalItems 列表
  129. return remedicalItems;
  130. } catch (e) {
  131. logger.e('MeasureHomeController getRemedicalList ex:', e);
  132. // 出现异常时返回空列表
  133. return [];
  134. }
  135. }
  136. ///获取会诊图像
  137. static Future<List<ConsultationImagesDTO>> getConsultationImages(
  138. String consultationCode) async {
  139. try {
  140. if (consultationCode.isEmpty) {
  141. return [];
  142. }
  143. var realTimeConsultationImageList =
  144. await RPCBridge.ins.rpc.liveConsultation.getConsultationFilesAsync(
  145. FindConsultationDetailRequest(
  146. consultationCode: consultationCode, token: RPCBridge.ins.userToken),
  147. );
  148. return realTimeConsultationImageList;
  149. } catch (e) {
  150. logger.e('RealTimeConsultationImageController getConsultationImages ex:' +
  151. e.toString());
  152. }
  153. return [];
  154. }
  155. ///获取图像详情
  156. static Future<RemedicalInfoDTO?> getImageInfo(
  157. String remedicalCode,
  158. String? remedicalAISelectedInfoCode,
  159. ) async {
  160. try {
  161. RemedicalInfoDTO result;
  162. print(source);
  163. if (source == VidImageSource.AiResultModifier) {
  164. final remedicalAISelectedInfo =
  165. await RPCBridge.ins.rpc.remedical.getRemedicalAISelectedInfoAsync(
  166. GetRemedicalAISelectedInfoRequest(
  167. token: RPCBridge.ins.userToken,
  168. code: remedicalAISelectedInfoCode,
  169. ),
  170. );
  171. result = RemedicalInfoDTO(
  172. diagnosisResult: jsonEncode(
  173. [
  174. {
  175. 'DiagResultsForEachOrgan':
  176. jsonDecode(remedicalAISelectedInfo.diagnosisData ?? '')[
  177. 'DiagResultsForEachOrgan'],
  178. 'Index': jsonDecode(
  179. remedicalAISelectedInfo.diagnosisData ?? '')['Index'],
  180. 'PriorityScore':
  181. jsonDecode(remedicalAISelectedInfo.diagnosisData ?? '')[
  182. 'PriorityScore'],
  183. }
  184. ],
  185. ),
  186. terminalImages: TerminalImageDTO(
  187. previewUrl: remedicalAISelectedInfo.previewFileToken,
  188. imageUrl: remedicalAISelectedInfo.cdnFileToken,
  189. coverImageUrl: remedicalAISelectedInfo.previewFileToken,
  190. originImageUrl: remedicalAISelectedInfo.orginalFileToken,
  191. recommendedDownloadMode:
  192. remedicalAISelectedInfo.recommendedDownloadMode,
  193. ),
  194. diagnosisConclusion: DiagnosisConclusionEnum.Benign,
  195. );
  196. } else if (source == VidImageSource.RemoteUS) {
  197. result = await RPCBridge.ins.rpc.remoteUltrasound
  198. .vitalFindRemedicalByCodeAsync(
  199. FindRemedicalByCodeRequest(
  200. token: RPCBridge.ins.userToken,
  201. remedicalCode: remedicalCode,
  202. existDiagnosisResult: true,
  203. ),
  204. );
  205. } else {
  206. result = await RPCBridge.ins.rpc.remedical.findRemedicalByCodeAsync(
  207. FindRemedicalByCodeRequest(
  208. token: RPCBridge.ins.userToken,
  209. remedicalCode: remedicalCode,
  210. existDiagnosisResult: true,
  211. ),
  212. );
  213. }
  214. return result;
  215. } catch (e) {
  216. logger.e('MeasureHomeController getRemedicalInfo ex:', e);
  217. return null;
  218. }
  219. }
  220. ///获取测量项
  221. static Future<MeasureApplicationDTO?> getMeasureApplication(
  222. MeasureModeSelection args) async {
  223. try {
  224. final result =
  225. await RPCBridge.ins.rpc.remedical.getMeasureApplicationAsync(
  226. GetMeasureApplicationRequest(
  227. token: RPCBridge.ins.userToken,
  228. applicationName: args.applicationName,
  229. categoryName: args.categoryName,
  230. measureModes: args.measureModes,
  231. ),
  232. );
  233. return result;
  234. } catch (e) {
  235. print(e);
  236. logger.e('MeasureHomeController getMeasureApplication ex: ', e);
  237. return null;
  238. }
  239. }
  240. /// 保存测量的方法
  241. static Future<bool> saveUserDefinedMeasureApplicationAsync(
  242. MeasureModeSubmit args) async {
  243. var result = false;
  244. try {
  245. result = await RPCBridge.ins.rpc.remedical
  246. .saveUserDefinedMeasureApplicationAsync(
  247. SaveUserDefinedMeasureApplicationRequest(
  248. token: RPCBridge.ins.userToken,
  249. version: args.version,
  250. applicationName: args.applicationName,
  251. categoryName: args.categoryName,
  252. workingMode: args.workingMode,
  253. ),
  254. );
  255. } catch (e) {
  256. logger.e(
  257. 'MeasureHomeController saveUserDefinedMeasureApplicationAsync ex: ',
  258. e);
  259. }
  260. return result;
  261. }
  262. /// 保存样式
  263. static Future<void> saveMeasureSystemSettingAsync(
  264. MeasureSystemSettingDTO measureSystemSetting,
  265. ) async {
  266. await RPCBridge.ins.rpc.remedical.saveMeasureSystemSettingAsync(
  267. SaveMeasureSystemSettingRequest(
  268. systemSetting: measureSystemSetting,
  269. token: RPCBridge.ins.userToken,
  270. ),
  271. );
  272. }
  273. /// 获取样式
  274. static Future<MeasureSystemSettingDTO> getMeasureSystemSettingAsync() async {
  275. final result =
  276. await RPCBridge.ins.rpc.remedical.getMeasureSystemSettingAsync(
  277. GetMeasureSystemSettingRequest(
  278. token: RPCBridge.ins.userToken,
  279. ),
  280. );
  281. return result;
  282. }
  283. /// 分享vid
  284. static Future<String> shareImage(
  285. String examFile,
  286. ) async {
  287. try {
  288. final result = await RPCBridge.ins.rpc.remedical.queryShareExamPageAsync(
  289. QueryShareExamPageRequest(
  290. examFileToken: examFile,
  291. token: RPCBridge.ins.userToken,
  292. languageCode: i18nBook.locale.toCodeString('-'),
  293. ),
  294. );
  295. return result.shareExamPageUrl ?? '';
  296. } catch (e) {
  297. logger.e("queryShareExamPageAsync exception:", e);
  298. }
  299. return '';
  300. }
  301. /// 获取注释
  302. static Future<CommentItemResultDTO?> getCommentsByApplicationAsync(
  303. String applicationName, String categoryName) async {
  304. try {
  305. final result =
  306. await RPCBridge.ins.rpc.remedical.getCommentsByApplicationAsync(
  307. GetCommentsByApplicationRequest(
  308. token: RPCBridge.ins.userToken,
  309. applicationName: applicationName,
  310. categoryName: categoryName,
  311. languageCode: i18nBook.locale.toCodeString('-'),
  312. // Store.app.systemLocale.languageCode.toLowerCase(),
  313. ),
  314. );
  315. return result;
  316. } catch (e) {
  317. logger.e('MeasureHomeController getCommentsByApplicationAsync ex: ', e);
  318. return null;
  319. }
  320. }
  321. /// 保存注释
  322. static Future<bool?> saveUserDefinedCommentsAsync(
  323. String applicationName,
  324. String categoryName,
  325. List<CommentItemDTO>? addCommentItems,
  326. List<CommentItemDTO>? deleteCommentItems,
  327. List<UpdateCommentItemDTO>? updateCommentItems,
  328. ) async {
  329. try {
  330. final result =
  331. await RPCBridge.ins.rpc.remedical.saveUserDefinedCommentsAsync(
  332. SaveUserDefinedCommentsRequest(
  333. token: RPCBridge.ins.userToken,
  334. applicationName: applicationName,
  335. categoryName: categoryName,
  336. languageCode: i18nBook.locale.toCodeString('-'),
  337. // Store.app.systemLocale.languageCode.toLowerCase(),
  338. addCommentItems: addCommentItems,
  339. deletedCommentItems: deleteCommentItems,
  340. updateCommentItems: updateCommentItems),
  341. );
  342. return result;
  343. } catch (e) {
  344. logger.e('MeasureHomeController getCommentsByApplicationAsync ex: ', e);
  345. return null;
  346. }
  347. }
  348. /// 重置注释
  349. static Future<bool?> resetUserCommentsAsync(
  350. String applicationName,
  351. String categoryName,
  352. ) async {
  353. try {
  354. final result = await RPCBridge.ins.rpc.remedical.resetUserCommentsAsync(
  355. ResetUserCommentsRequest(
  356. token: RPCBridge.ins.userToken,
  357. applicationName: applicationName,
  358. categoryName: categoryName,
  359. ),
  360. );
  361. return result;
  362. } catch (e) {
  363. logger.e('MeasureHomeController resetUserCommentsAsync ex: ', e);
  364. return null;
  365. }
  366. }
  367. /// 获取预置的注释项
  368. static Future<PresetCommentItemResultDTO?> getPresetCommentsAsync() async {
  369. try {
  370. final result = await RPCBridge.ins.rpc.remedical.getPresetCommentsAsync(
  371. GetPresetCommentsRequest(
  372. token: RPCBridge.ins.userToken,
  373. languageCode: i18nBook.locale.toCodeString('-'),
  374. // Store.app.systemLocale.languageCode.toLowerCase(),
  375. ),
  376. );
  377. return result;
  378. } catch (e) {
  379. logger.e('MeasureHomeController getPresetCommentsAsync ex: ', e);
  380. return null;
  381. }
  382. }
  383. static Future<RemedicalInfoDTO?> getImageInfoByIndex(
  384. String recordCode, String token, String patientCode, int index) async {
  385. var imageList = await getRemedicalList(patientCode, recordCode);
  386. int imageIndex = 0;
  387. for (RemedicalItemList r in imageList) {
  388. for (RemedicalInfoDTO i in r.remedicalList ?? []) {
  389. imageIndex++;
  390. if (imageIndex == index) {
  391. return i;
  392. }
  393. }
  394. }
  395. return null;
  396. }
  397. }