measure_data_controller.dart 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629
  1. // ignore_for_file: non_constant_identifier_names
  2. import 'dart:typed_data';
  3. import 'package:fis_common/event/event_type.dart';
  4. import 'package:fis_jsonrpc/rpc.dart';
  5. import 'package:fis_measure/interfaces/process/items/item_metas.dart';
  6. import 'package:fis_measure/interfaces/process/workspace/application.dart';
  7. import 'package:fis_measure/process/workspace/measure_data_helper.dart';
  8. import 'package:fis_measure/process/workspace/rpc_bridge.dart';
  9. import 'package:fis_measure/values/colors.dart';
  10. import 'package:fis_measure/view/measure/measure_config/measure_configuation_page.dart';
  11. import 'package:fis_measure/view/measure/measure_config/widgets/measure_configuration_style.dart';
  12. import 'package:fis_measure/view/measure/measure_config/widgets/measure_configuration_unit.dart';
  13. import 'package:flutter/material.dart';
  14. import 'package:vid/us/vid_us_mode.dart';
  15. class MeasureInfoData {
  16. final String? patientCode;
  17. final String? remedicalCode;
  18. final String? recordCode;
  19. final String? remedicalAISelectedInfoCode;
  20. MeasureInfoData({
  21. this.patientCode,
  22. this.recordCode,
  23. this.remedicalCode,
  24. this.remedicalAISelectedInfoCode,
  25. });
  26. }
  27. /// 图片信息数据
  28. abstract class IMeasureDataController {
  29. late FEventHandler<String> aiResultsInfoChanged;
  30. late FEventHandler<String> measureApplicationVersionChanged;
  31. late FEventHandler<String> measureLanguageChanged;
  32. late FEventHandler<DiagnosisConclusionEnum> diagnosisConclusionChanged;
  33. late FEventHandler<List<RemedicalInfoDTO>> remedicalListResultChanged;
  34. late FEventHandler<String> itemCurrentImageChanged;
  35. late FEventHandler<List<ItemMeta>> itemMetaListChanged;
  36. late FEventHandler<List<String>> getMeasureApplicationChanged;
  37. late FEventHandler<MeasureInfoData> measureInfoDataChanged;
  38. late FEventHandler<MeasureSystemSettingDTO> measureSystemSettingChanged;
  39. late FEventHandler<List<VidUsMode>> applicationModesChanged;
  40. late FEventHandler<List<ItemMeta>> curItemMetaListChanged;
  41. late FEventHandler<List<String>> annotationListChanged;
  42. late FEventHandler<bool> showItemTransStateChanged;
  43. /// 切换至另一个病人的图像集
  44. late FEventHandler<Map<String, String>> curMeasureDataChanged;
  45. /// 该图像下面的应用
  46. List<ItemMeta> get itemMetaList;
  47. set itemMetaList(List<ItemMeta> value);
  48. /// 测量的翻译
  49. String get measureLanguage;
  50. set measureLanguage(String value);
  51. /// 测量应用的版本号
  52. String get measureApplicationVersion;
  53. set measureApplicationVersion(String value);
  54. ///当前选择图像
  55. String get itemCurrentImage;
  56. set itemCurrentImage(String value);
  57. /// 测量图片的ai结果
  58. String get aiResults;
  59. set aiResults(String value);
  60. /// 良恶性 用来判断是否存在ai结果
  61. DiagnosisConclusionEnum get diagnosisConclusion;
  62. set diagnosisConclusion(DiagnosisConclusionEnum value);
  63. /// 测量图片集
  64. List<RemedicalInfoDTO> get remedicalList;
  65. set remedicalList(List<RemedicalInfoDTO> value);
  66. /// 测量方式集
  67. List<String> get getMeasureApplicationList;
  68. set getMeasureApplicationList(List<String> value);
  69. /// 当前载入的测量项列表
  70. List<ItemMeta> get curItemMetaList;
  71. set curItemMetaList(List<ItemMeta> value);
  72. /// 当前所有的注释项
  73. List<String> get annotationList;
  74. set annotationList(List<String> value);
  75. /// 所有的预置的注释项
  76. PresetCommentItemResultDTO get allPresetAnnotationList;
  77. set allPresetAnnotationList(PresetCommentItemResultDTO value);
  78. /// 当前模式下预置的注释项
  79. List<String> get currPresetAnnotationList;
  80. set currPresetAnnotationList(List<String> value);
  81. /// 注释List
  82. List<CommentItemDTO> get measureCommentItemResult;
  83. set measureCommentItemResult(List<CommentItemDTO> value);
  84. /// 测量图片数据
  85. MeasureInfoData get measureInfoData;
  86. set measureInfoData(MeasureInfoData value);
  87. /// 测量样式数据
  88. MeasureSystemSettingDTO get measureSystemSetting;
  89. set measureSystemSetting(MeasureSystemSettingDTO value);
  90. /// 测量当前图片所有模式
  91. List<VidUsMode> get applicationModes;
  92. set applicationModes(List<VidUsMode> value);
  93. /// 测量图片当前模式下所有测量项数据
  94. List<MeasureModeDTO> get availableModes;
  95. set availableModes(List<MeasureModeDTO> value);
  96. List<ItemMetaGroup> get itemMetaListGroup;
  97. set itemMetaListGroup(List<ItemMetaGroup> itemMetaListGroup);
  98. String get currentMode;
  99. set currentMode(String value);
  100. /// 卡尺线画笔
  101. Paint get paintLinePan;
  102. set paintLinePan(Paint value);
  103. /// 标记点画笔
  104. Paint get paintPointPan;
  105. set paintPointPan(Paint value);
  106. // int index = 0;
  107. // int totalCount = 0;
  108. }
  109. class MeasureDataController implements IMeasureDataController {
  110. String _aiResults = '';
  111. String _itemCurrentImage = '';
  112. String _measureLanguage = '';
  113. String _currentMode = '';
  114. String _measureApplicationVersion = '';
  115. List<RemedicalInfoDTO> _remedicalList = [];
  116. List<ItemMeta> _itemMetaList = [];
  117. List<String> _getMeasureApplicationList = [];
  118. DiagnosisConclusionEnum _diagnosisConclusion =
  119. DiagnosisConclusionEnum.NotRequired;
  120. MeasureInfoData _measureInfoData = MeasureInfoData();
  121. MeasureSystemSettingDTO _measureSystemSetting = MeasureSystemSettingDTO();
  122. List<VidUsMode> _applicationModes = [];
  123. List<MeasureModeDTO> _availableModes = [];
  124. List<ItemMeta> _curItemMetaList = [];
  125. List<String> _annotationList = [];
  126. List<String> _presetAnnotationList = [];
  127. PresetCommentItemResultDTO _allPresetAnnotationList =
  128. PresetCommentItemResultDTO();
  129. List<CommentItemDTO> _measureCommentItemResult = [];
  130. List<ItemMetaGroup> _itemMetaListGroup = [];
  131. ///index和totalCount是用于手机端切换图像展示的
  132. // int index = 0;
  133. // int totalCount = 0;
  134. /// 新增的
  135. List<ItemMetaDTO> itemMetaListConfig = [];
  136. Paint _paintLinePan = Paint()
  137. ..color = MeasureColors.Primary
  138. ..isAntiAlias = true
  139. ..strokeWidth = 2
  140. ..style = PaintingStyle.stroke;
  141. Paint _paintPointPan = Paint()
  142. ..color = MeasureColors.Primary
  143. ..isAntiAlias = true
  144. ..strokeWidth = 2
  145. ..style = PaintingStyle.stroke;
  146. @override
  147. var remedicalListResultChanged = FEventHandler<List<RemedicalInfoDTO>>();
  148. @override
  149. var aiResultsInfoChanged = FEventHandler<String>();
  150. @override
  151. var measureLanguageChanged = FEventHandler<String>();
  152. @override
  153. var measureApplicationVersionChanged = FEventHandler<String>();
  154. @override
  155. var diagnosisConclusionChanged = FEventHandler<DiagnosisConclusionEnum>();
  156. @override
  157. var itemMetaListChanged = FEventHandler<List<ItemMeta>>();
  158. @override
  159. var showItemTransStateChanged = FEventHandler<bool>();
  160. @override
  161. var itemCurrentImageChanged = FEventHandler<String>();
  162. @override
  163. var getMeasureApplicationChanged = FEventHandler<List<String>>();
  164. @override
  165. var measureInfoDataChanged = FEventHandler<MeasureInfoData>();
  166. @override
  167. var measureSystemSettingChanged = FEventHandler<MeasureSystemSettingDTO>();
  168. @override
  169. var applicationModesChanged = FEventHandler<List<VidUsMode>>();
  170. @override
  171. var curItemMetaListChanged = FEventHandler<List<ItemMeta>>();
  172. @override
  173. var annotationListChanged = FEventHandler<List<String>>();
  174. @override
  175. var curMeasureDataChanged = FEventHandler<Map<String, String>>();
  176. @override
  177. List<ItemMeta> get curItemMetaList => _curItemMetaList;
  178. @override
  179. set curItemMetaList(List<ItemMeta> value) {
  180. if (value != _curItemMetaList) {
  181. _curItemMetaList = value;
  182. _onCurItemMetaListChanged();
  183. }
  184. }
  185. @override
  186. List<String> get annotationList => _annotationList;
  187. @override
  188. set annotationList(List<String> value) {
  189. if (value != _annotationList) {
  190. _annotationList = value;
  191. _onGetCommentsListChanged();
  192. }
  193. }
  194. @override
  195. List<String> get currPresetAnnotationList => _presetAnnotationList;
  196. @override
  197. set currPresetAnnotationList(List<String> value) {
  198. if (value != _presetAnnotationList) {
  199. _presetAnnotationList = value;
  200. }
  201. }
  202. @override
  203. PresetCommentItemResultDTO get allPresetAnnotationList =>
  204. _allPresetAnnotationList;
  205. @override
  206. set allPresetAnnotationList(PresetCommentItemResultDTO value) {
  207. if (value != _allPresetAnnotationList) {
  208. _allPresetAnnotationList = value;
  209. }
  210. }
  211. @override
  212. List<CommentItemDTO> get measureCommentItemResult =>
  213. _measureCommentItemResult;
  214. @override
  215. set measureCommentItemResult(List<CommentItemDTO> value) {
  216. if (value != _measureCommentItemResult) {
  217. _measureCommentItemResult = value;
  218. }
  219. }
  220. @override
  221. List<MeasureModeDTO> get availableModes => _availableModes;
  222. @override
  223. set availableModes(List<MeasureModeDTO> value) {
  224. if (value != _availableModes) {
  225. _availableModes = value;
  226. }
  227. }
  228. @override
  229. MeasureSystemSettingDTO get measureSystemSetting => _measureSystemSetting;
  230. @override
  231. set measureSystemSetting(MeasureSystemSettingDTO value) {
  232. if (value != _measureSystemSetting) {
  233. _measureSystemSetting = value;
  234. setGuideline(value.showCursorLine);
  235. _onMeasureSystemSettingChanged();
  236. }
  237. }
  238. /// 错误单位校验
  239. void checkErrorUnitConfig() {
  240. if (!UnitConfigPage.C_DISTANCE_UNIT_LIST
  241. .contains(_measureSystemSetting.distanceUnit)) {
  242. _measureSystemSetting.distanceUnit = Unit.cm;
  243. }
  244. if (!UnitConfigPage.C_AREA_UNIT_LIST
  245. .contains(_measureSystemSetting.areaUnit)) {
  246. _measureSystemSetting.areaUnit = Unit.cm2;
  247. }
  248. if (!UnitConfigPage.C_VELOCITY_UNIT_LIST
  249. .contains(_measureSystemSetting.velocityUnit)) {
  250. _measureSystemSetting.velocityUnit = Unit.cms;
  251. }
  252. if (!UnitConfigPage.C_TIME_UNIT_LIST
  253. .contains(_measureSystemSetting.timeUnit)) {
  254. _measureSystemSetting.timeUnit = Unit.msec;
  255. }
  256. }
  257. /// 错误样式设置校验
  258. void checkErrorStyleConfig() {
  259. if (!StyleConfigPage.C_MEASURE_CURSOR_SIZE
  260. .contains(_measureSystemSetting.cursorSize)) {
  261. _measureSystemSetting.cursorSize =
  262. StyleConfigPage.C_MEASURE_CURSOR_SIZE[0];
  263. }
  264. if (!StyleConfigPage.C_MEASURE_MARK_SIZE
  265. .contains(_measureSystemSetting.shapeCursorSize)) {
  266. _measureSystemSetting.shapeCursorSize =
  267. StyleConfigPage.C_MEASURE_MARK_SIZE[0];
  268. }
  269. if (!StyleConfigPage.C_RESULT_TEXT_SIZE
  270. .contains(_measureSystemSetting.fontSize)) {
  271. _measureSystemSetting.fontSize = StyleConfigPage.C_RESULT_TEXT_SIZE[0];
  272. }
  273. if (!StyleConfigPage.C_ANNOTATION_TEXT_SIZE
  274. .contains(_measureSystemSetting.annotationFontSize)) {
  275. _measureSystemSetting.annotationFontSize =
  276. StyleConfigPage.C_ANNOTATION_TEXT_SIZE[0];
  277. }
  278. if (!isContainsValue(StyleConfigPage.C_DISTANCE_THRESHOLD,
  279. _measureSystemSetting.autoSnapDistance)) {
  280. _measureSystemSetting.autoSnapDistance =
  281. StyleConfigPage.C_DISTANCE_THRESHOLD[0].value.toString();
  282. }
  283. if (!isContainsValue(StyleConfigPage.C_DISTANCE_THRESHOLD,
  284. _measureSystemSetting.minCursorDistance)) {
  285. _measureSystemSetting.minCursorDistance =
  286. StyleConfigPage.C_DISTANCE_THRESHOLD[0].value.toString();
  287. }
  288. }
  289. bool isContainsValue(List<MeasureSelectModel> list, String? value) {
  290. if (value == null) return false;
  291. for (var item in list) {
  292. if (item.value.toString() == value) {
  293. return true;
  294. }
  295. }
  296. return false;
  297. }
  298. /// 设置是否隐藏卡尺线
  299. void setGuideline(bool isShow) {
  300. if (isShow) {
  301. _paintLinePan.color = MeasureColors.Primary;
  302. } else {
  303. _paintLinePan.color = MeasureColors.Hide;
  304. }
  305. }
  306. // 获取自动闭合卡尺线的检测阈值
  307. double getAutoSnapDistance() {
  308. if (measureSystemSetting.autoSnapDistance == null) return 0.0;
  309. try {
  310. return double.parse(measureSystemSetting.autoSnapDistance!);
  311. } catch (e) {
  312. return 0.0;
  313. }
  314. }
  315. double getMinCursorDistance() {
  316. if (measureSystemSetting.minCursorDistance == null) return 0.0;
  317. try {
  318. return double.parse(measureSystemSetting.minCursorDistance!);
  319. } catch (e) {
  320. return 0.0;
  321. }
  322. }
  323. @override
  324. List<VidUsMode> get applicationModes => _applicationModes;
  325. @override
  326. set applicationModes(List<VidUsMode> value) {
  327. if (value != _applicationModes) {
  328. _applicationModes = value;
  329. _onApplicationModesChanged();
  330. }
  331. }
  332. @override
  333. String get currentMode => _currentMode;
  334. @override
  335. set currentMode(String value) {
  336. if (value != _currentMode) {
  337. _currentMode = value;
  338. }
  339. }
  340. @override
  341. List<String> get getMeasureApplicationList => _getMeasureApplicationList;
  342. @override
  343. set getMeasureApplicationList(List<String> value) {
  344. if (value != _getMeasureApplicationList) {
  345. _getMeasureApplicationList = value;
  346. _onGetMeasureApplicationChanged();
  347. }
  348. }
  349. @override
  350. List<ItemMeta> get itemMetaList => _itemMetaList;
  351. @override
  352. set itemMetaList(List<ItemMeta> value) {
  353. if (value != _itemMetaList) {
  354. _itemMetaList = value;
  355. _onItemMetaListChanged();
  356. }
  357. }
  358. @override
  359. List<ItemMetaGroup> get itemMetaListGroup => _itemMetaListGroup;
  360. @override
  361. set itemMetaListGroup(List<ItemMetaGroup> value) {
  362. if (value != _itemMetaListGroup) {
  363. _itemMetaListGroup = value;
  364. // _onItemMetaListChanged();
  365. }
  366. }
  367. @override
  368. String get itemCurrentImage => _itemCurrentImage;
  369. @override
  370. set itemCurrentImage(String value) {
  371. if (value != _itemCurrentImage) {
  372. _itemCurrentImage = value;
  373. _onItemCurrentImageChanged();
  374. }
  375. }
  376. @override
  377. String get aiResults => _aiResults;
  378. @override
  379. set aiResults(String value) {
  380. if (value != _aiResults) {
  381. _aiResults = value;
  382. _onAIResultsChanged();
  383. }
  384. }
  385. @override
  386. String get measureLanguage => _measureLanguage;
  387. @override
  388. set measureLanguage(String value) {
  389. if (value != _measureLanguage) {
  390. _measureLanguage = value;
  391. _onMeasureLanguageChanged();
  392. }
  393. }
  394. @override
  395. String get measureApplicationVersion => _measureApplicationVersion;
  396. @override
  397. set measureApplicationVersion(String value) {
  398. if (value != _measureApplicationVersion) {
  399. _measureApplicationVersion = value;
  400. _onMeasureApplicationVersion();
  401. }
  402. }
  403. @override
  404. DiagnosisConclusionEnum get diagnosisConclusion => _diagnosisConclusion;
  405. @override
  406. set diagnosisConclusion(DiagnosisConclusionEnum value) {
  407. if (value != _diagnosisConclusion) {
  408. _diagnosisConclusion = value;
  409. _onDiagnosisConclusionChanged();
  410. }
  411. }
  412. @override
  413. MeasureInfoData get measureInfoData => _measureInfoData;
  414. @override
  415. set measureInfoData(MeasureInfoData value) {
  416. _measureInfoData = value;
  417. _onMeasureInfoDataChanged();
  418. }
  419. @override
  420. List<RemedicalInfoDTO> get remedicalList => _remedicalList;
  421. @override
  422. set remedicalList(List<RemedicalInfoDTO> value) {
  423. if (value != _remedicalList) {
  424. _remedicalList = value;
  425. _onRemedicalListChanged();
  426. }
  427. }
  428. @override
  429. Paint get paintLinePan => _paintLinePan;
  430. @override
  431. set paintLinePan(Paint value) {
  432. if (value != _paintLinePan) {
  433. _paintLinePan = value;
  434. }
  435. }
  436. @override
  437. Paint get paintPointPan => _paintPointPan;
  438. @override
  439. set paintPointPan(Paint value) {
  440. if (value != _paintPointPan) {
  441. _paintPointPan = value;
  442. }
  443. }
  444. MeasureDataController(
  445. this.saveImage,
  446. ) {
  447. _init();
  448. }
  449. _init() async {}
  450. ///参数1:imageBytes 图片字节, 参数2: patientCode 病人code,参数3:recordCode 检查code, 参数4:remedicalCode 检查code,参数5: measuredData 测量值
  451. Future<bool?> Function(
  452. Uint8List, String, String, String, String, VidImageSource) saveImage;
  453. /// 添加注释项
  454. Future<bool?> addAnnotation(
  455. IApplication application, String annotationName) async {
  456. final result = await MeasureDataHelper.saveUserDefinedCommentsAsync(
  457. application.applicationName,
  458. application.categoryName,
  459. [CommentItemDTO(text: annotationName)],
  460. null,
  461. null);
  462. return result;
  463. }
  464. /// 删除注释项
  465. Future<bool?> deleteAnnotation(
  466. IApplication application, String annotationName) async {
  467. final result = await MeasureDataHelper.saveUserDefinedCommentsAsync(
  468. application.applicationName,
  469. application.categoryName,
  470. null,
  471. [CommentItemDTO(text: annotationName)],
  472. null);
  473. return result;
  474. }
  475. /// 更新注释项
  476. Future<bool?> updateAnnotation(IApplication application,
  477. String oldAnnotationName, String newAnnotationName) async {
  478. final result = await MeasureDataHelper.saveUserDefinedCommentsAsync(
  479. application.applicationName,
  480. application.categoryName,
  481. null,
  482. null,
  483. [
  484. UpdateCommentItemDTO(
  485. oldText: oldAnnotationName, newText: newAnnotationName)
  486. ],
  487. );
  488. return result;
  489. }
  490. /// 选择Vid图像Url
  491. String chooseImageUrl(TerminalImageDTO dto) {
  492. // 按Server推荐选择CDN/源站
  493. final useOrigin =
  494. dto.recommendedDownloadMode == RecommendedDownloadModeEnum.Origin &&
  495. dto.originImageUrl != null &&
  496. dto.originImageUrl!.isNotEmpty;
  497. final imageUrl = useOrigin ? dto.originImageUrl! : dto.imageUrl!;
  498. return imageUrl;
  499. }
  500. void _onRemedicalListChanged() {
  501. remedicalListResultChanged.emit(this, remedicalList);
  502. }
  503. void _onAIResultsChanged() {
  504. aiResultsInfoChanged.emit(this, aiResults);
  505. }
  506. void _onItemCurrentImageChanged() {
  507. itemCurrentImageChanged.emit(this, itemCurrentImage);
  508. }
  509. void _onItemMetaListChanged() {
  510. itemMetaListChanged.emit(this, itemMetaList);
  511. }
  512. void _onGetMeasureApplicationChanged() {
  513. getMeasureApplicationChanged.emit(this, getMeasureApplicationList);
  514. }
  515. void _onDiagnosisConclusionChanged() {
  516. diagnosisConclusionChanged.emit(this, diagnosisConclusion);
  517. }
  518. void _onMeasureLanguageChanged() {
  519. measureLanguageChanged.emit(this, measureLanguage);
  520. }
  521. void _onMeasureApplicationVersion() {
  522. measureApplicationVersionChanged.emit(this, measureApplicationVersion);
  523. }
  524. void _onMeasureInfoDataChanged() {
  525. measureInfoDataChanged.emit(this, measureInfoData);
  526. }
  527. void _onMeasureSystemSettingChanged() {
  528. measureSystemSettingChanged.emit(this, measureSystemSetting);
  529. }
  530. void _onApplicationModesChanged() {
  531. applicationModesChanged.emit(this, applicationModes);
  532. }
  533. void _onCurItemMetaListChanged() {
  534. curItemMetaListChanged.emit(this, curItemMetaList);
  535. }
  536. void _onGetCommentsListChanged() {
  537. annotationListChanged.emit(this, annotationList);
  538. }
  539. }