report_info.dart 12 KB

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