report_info.dart 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404
  1. import 'package:fis_lib_report/converts/event_type.dart';
  2. import 'package:fis_lib_report/report/element_tag.dart';
  3. import 'package:fis_lib_report/report/element_type.dart';
  4. import 'package:fis_lib_report/report/inputImageList.dart';
  5. import 'package:fis_lib_report/report/interfaces/block_element.dart';
  6. import 'package:fis_lib_report/report/interfaces/element.dart';
  7. import 'package:fis_lib_report/report/paragraph.dart';
  8. import 'package:fis_lib_report/report/report_template_document.dart';
  9. import 'package:fis_lib_report/report/rt_page_size.dart';
  10. import 'package:fis_lib_report/report/rt_table.dart';
  11. import 'package:fis_lib_report/report_info/block_element_info_interface.dart';
  12. import 'package:fis_lib_report/report_info/element_info.dart';
  13. import 'package:fis_lib_report/report_info/element_tag_names.dart';
  14. import 'package:fis_lib_report/report_info/input_image_info.dart';
  15. import 'package:fis_lib_report/report_info/input_image_list_info.dart';
  16. import 'package:fis_lib_report/report_info/input_text_info.dart';
  17. import 'package:fis_lib_report/report_info/paragraph_info.dart';
  18. import 'package:fis_lib_report/report_info/rt_table_info.dart';
  19. import 'package:fis_lib_report/report_info/single_selected_info.dart';
  20. class ReportInfo {
  21. static ReportInfo? _reportInfo;
  22. List<IBlockElementInfo> blocks = [];
  23. List<IBlockElementInfo> headers = [];
  24. List<IBlockElementInfo> footers = [];
  25. /// Gets the author of the report template.
  26. String? author;
  27. /// Gets or sets the value to indicate whether the report template is created by user.
  28. bool? isCustom;
  29. /// Gets the report template name.
  30. String? name;
  31. /// Gets the custom input element tags of the report template.
  32. Map<String, ElementTag>? tags;
  33. /// Gets or sets the update time.
  34. DateTime? updateTime;
  35. ///version
  36. String? version;
  37. /// Gets the id.
  38. String? id;
  39. ReportInfo._internal();
  40. //报告页大小
  41. RTPageSize? pageSize;
  42. //报告者
  43. String? reporter;
  44. //报告病人名
  45. String? patientName;
  46. ///病人Id
  47. String? patinentId;
  48. ///病人年龄
  49. String? patientAge;
  50. ///病人性别
  51. String? patientSex;
  52. ///报告日期
  53. DateTime? reportDate;
  54. ///报告模板
  55. ReportTemplateDocument? reportTemplate;
  56. ///重载
  57. FEventHandler<ReportEventArgs> onReload = FEventHandler();
  58. ///重载完成时触发
  59. FEventHandler onReloadFinsh = FEventHandler();
  60. ///关闭页面,释放监听
  61. FEventHandler onClose = FEventHandler();
  62. ///ReportInfo全局单例
  63. static ReportInfo get instance {
  64. _reportInfo ??= ReportInfo._internal();
  65. return _reportInfo!;
  66. }
  67. ///初始化ReportInfo
  68. void init(
  69. ReportTemplateDocument reportTemplate,
  70. DateTime reportDate,
  71. String reporter, {
  72. String? patientName,
  73. String? patinentId,
  74. String? patientAge,
  75. String? patientSex,
  76. }) {
  77. try {
  78. this.reportTemplate = reportTemplate;
  79. this.reportDate = reportDate;
  80. this.reporter = reporter;
  81. isCustom = reportTemplate.isCustom;
  82. name = reportTemplate.name;
  83. updateTime = reportTemplate.updateTime;
  84. version = reportTemplate.version;
  85. id = reportTemplate.id;
  86. for (var element in reportTemplate.header!) {
  87. headers.add(_initBlockElement(element));
  88. }
  89. for (var element in reportTemplate.blocks!) {
  90. blocks.add(_initBlockElement(element));
  91. }
  92. for (var element in reportTemplate.footer!) {
  93. footers.add(_initBlockElement(element));
  94. }
  95. pageSize = reportTemplate.pageSize;
  96. final nameInputInfo = getElementInfoByTagName(TagNames.PATIENT_NAME_TAG);
  97. if (patientName != null &&
  98. patientName.isNotEmpty &&
  99. nameInputInfo != null) {
  100. final inputInfo = nameInputInfo as InputTextInfo;
  101. inputInfo.text = patientName;
  102. }
  103. final ageInputInfo = getElementInfoByTagName(TagNames.PATIENT_AGE_TAG);
  104. if (patientAge != null && patientAge.isNotEmpty && ageInputInfo != null) {
  105. final inputInfo = ageInputInfo as InputTextInfo;
  106. inputInfo.text = patientAge;
  107. }
  108. final idInputInfo = getElementInfoByTagName(TagNames.PATIENT_ID_TAG);
  109. if (patinentId != null && patinentId.isNotEmpty && idInputInfo != null) {
  110. final inputInfo = idInputInfo as InputTextInfo;
  111. inputInfo.text = patinentId;
  112. }
  113. final sexSelectedInfo = getElementInfoByTagName(TagNames.PATIENT_SEX_TAG);
  114. if (patientSex != null &&
  115. patientSex.isNotEmpty &&
  116. sexSelectedInfo != null) {
  117. final selectedInfo = sexSelectedInfo as SingleSelectedInfo;
  118. selectedInfo.selectedItem = patientSex;
  119. }
  120. } catch (e) {
  121. print(e);
  122. }
  123. }
  124. ///ReportInfo转为Json,用于报告存储至Server
  125. Map<String, dynamic> toJson() {
  126. final map = <String, dynamic>{};
  127. try {
  128. final headInfos = [];
  129. for (var element in headers) {
  130. headInfos.add(_getElementInfo(element));
  131. }
  132. map['HeadInfos'] = headInfos;
  133. final blockInfos = [];
  134. for (var block in blocks) {
  135. blockInfos.add(_getElementInfo(block));
  136. }
  137. map['BlockInfos'] = blockInfos;
  138. final footerInfos = [];
  139. for (var block in footers) {
  140. footerInfos.add(_getElementInfo(block));
  141. }
  142. map['FooterInfos'] = footerInfos;
  143. } catch (e) {
  144. print(e);
  145. }
  146. return map;
  147. }
  148. ///重新渲染UI&重构reportInfo
  149. void reload(String reporter, DateTime reportDate, String jsonStr,
  150. FEventHandler<String> onSelect) {
  151. _reportInfo = null;
  152. onReload.emit(
  153. this, ReportEventArgs(reportDate, reporter, jsonStr, onSelect));
  154. }
  155. ///获取二级ElementInfo(布局组件,非最基础的组件)
  156. IBlockElementInfo? getBlockElement(IBlockElement block) {
  157. final id = block.id;
  158. for (var element in headers) {
  159. if (element.id == id) {
  160. return element;
  161. }
  162. }
  163. for (var element in blocks) {
  164. if (element.id == id) {
  165. return element;
  166. }
  167. }
  168. for (var element in footers) {
  169. if (element.id == id) {
  170. return element;
  171. }
  172. }
  173. }
  174. ///获取报告模板中当前处于选中状态的图像输入框
  175. void selectedInputImage(String imageUrl) {
  176. for (var element in headers) {
  177. if (_checkImageisSelected(element, imageUrl)) {
  178. return;
  179. }
  180. }
  181. for (var element in blocks) {
  182. if (_checkImageisSelected(element, imageUrl)) {
  183. return;
  184. }
  185. }
  186. for (var element in footers) {
  187. if (_checkImageisSelected(element, imageUrl)) {
  188. return;
  189. }
  190. }
  191. }
  192. ///跟据TagName获取Elementnt
  193. ElementInfo? getElementInfoByTagName(String tagName) {
  194. try {
  195. for (var e in headers) {
  196. if (e.tag != null && e.tag!.name == tagName) {
  197. return e;
  198. }
  199. final elementInfo = _getBaseElementInfoByTagName(e, tagName);
  200. if (elementInfo != null) {
  201. return elementInfo;
  202. }
  203. }
  204. for (var e in blocks) {
  205. if (e.tag != null && e.tag!.name == tagName) {
  206. return e;
  207. }
  208. final elementInfo = _getBaseElementInfoByTagName(e, tagName);
  209. if (elementInfo != null) {
  210. return elementInfo;
  211. }
  212. }
  213. for (var e in footers) {
  214. if (e.tag != null && e.tag!.name == tagName) {
  215. return e;
  216. }
  217. final elementInfo = _getBaseElementInfoByTagName(e, tagName);
  218. if (elementInfo != null) {
  219. return elementInfo;
  220. }
  221. }
  222. } catch (e) {
  223. print(e);
  224. }
  225. return null;
  226. }
  227. ///跟据UI组件获取ReportInfo中的组件
  228. ElementInfo? getElementInfo(IElement element) {
  229. try {
  230. for (var e in headers) {
  231. final elementInfo = _getBaseElementInfo(e, element);
  232. if (elementInfo != null) {
  233. return elementInfo;
  234. }
  235. }
  236. for (var e in blocks) {
  237. final elementInfo = _getBaseElementInfo(e, element);
  238. if (elementInfo != null) {
  239. return elementInfo;
  240. }
  241. }
  242. for (var e in footers) {
  243. final elementInfo = _getBaseElementInfo(e, element);
  244. if (elementInfo != null) {
  245. return elementInfo;
  246. }
  247. }
  248. } catch (e) {
  249. print(e);
  250. }
  251. return null;
  252. }
  253. IBlockElementInfo _initBlockElement(IBlockElement element) {
  254. final _type = element.elementType!;
  255. if (_type.name == ElementType.rtTable!.name) {
  256. final table = element as RTTable;
  257. return RTTableInfo.fromElement(table);
  258. } else if (_type.name == ElementType.paragraph!.name) {
  259. final paragraph = element as Paragraph;
  260. return ParagraphInfo.fromElement(paragraph);
  261. } else {
  262. final inputImageList = element as InputImageList;
  263. return InputImageListInfo.fromElement(inputImageList);
  264. }
  265. }
  266. bool _checkImageisSelected(IBlockElementInfo block, String url) {
  267. if (block is InputImageListInfo) {
  268. final inputImage = block;
  269. if (inputImage.isSelected ?? false) {
  270. inputImage.addImage(url);
  271. return true;
  272. }
  273. } else if (block is ParagraphInfo) {
  274. for (var el in block.elementInfos!) {
  275. if (el is InputImageInfo) {
  276. final image = el;
  277. if (image.isSelected!) {
  278. image.addImage(url);
  279. return true;
  280. }
  281. }
  282. }
  283. }
  284. return false;
  285. }
  286. ///获取基础组件信息
  287. ElementInfo? _getBaseElementInfo(IBlockElementInfo block, IElement element) {
  288. ElementInfo? result;
  289. final type = block.elementType;
  290. if (type!.name == ElementType.paragraph!.name) {
  291. final paragraph = block as ParagraphInfo;
  292. for (var el in paragraph.elementInfos!) {
  293. if (el.id == element.id) {
  294. result = el;
  295. break;
  296. }
  297. }
  298. }
  299. if (result == null) {
  300. if (type.name == ElementType.rtTable!.name) {
  301. final table = block as RTTableInfo;
  302. final cells = table.cells!;
  303. for (var cell in cells.values) {
  304. for (var b in cell.blocks!) {
  305. final info = _getBaseElementInfo(b, element);
  306. if (info != null) {
  307. result = info;
  308. break;
  309. }
  310. }
  311. }
  312. }
  313. }
  314. return result;
  315. }
  316. ///获取基础组件信息
  317. ElementInfo? _getBaseElementInfoByTagName(
  318. IBlockElementInfo block, String tagName) {
  319. ElementInfo? result;
  320. final type = block.elementType;
  321. if (type!.name == ElementType.paragraph!.name) {
  322. final paragraph = block as ParagraphInfo;
  323. for (var el in paragraph.elementInfos!) {
  324. if (el.tag != null && el.tag!.name == tagName) {
  325. result = el;
  326. break;
  327. }
  328. }
  329. }
  330. if (result == null) {
  331. if (type.name == ElementType.rtTable!.name) {
  332. final table = block as RTTableInfo;
  333. final cells = table.cells!;
  334. for (var cell in cells.values) {
  335. for (var b in cell.blocks!) {
  336. final info = _getBaseElementInfoByTagName(b, tagName);
  337. if (info != null) {
  338. result = info;
  339. break;
  340. }
  341. }
  342. }
  343. }
  344. }
  345. return result;
  346. }
  347. Map<String, dynamic> _getElementInfo(IBlockElementInfo element) {
  348. final _type = element.elementType!;
  349. if (_type.name == ElementType.rtTable!.name) {
  350. final table = element as RTTableInfo;
  351. return table.toJson();
  352. } else if (_type.name == ElementType.paragraph!.name) {
  353. final paragraph = element as ParagraphInfo;
  354. return paragraph.toJson();
  355. } else {
  356. final inputImageList = element as InputImageListInfo;
  357. return inputImageList.toJson();
  358. }
  359. }
  360. }
  361. class ReportEventArgs {
  362. final FEventHandler<String> onSelect;
  363. final String jsonStr;
  364. final String reporter;
  365. final DateTime reportDate;
  366. ReportEventArgs(this.reportDate, this.reporter, this.jsonStr, this.onSelect);
  367. }