report_info.dart 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  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/input_image_info.dart';
  14. import 'package:fis_lib_report/report_info/input_image_list_info.dart';
  15. import 'package:fis_lib_report/report_info/paragraph_info.dart';
  16. import 'package:fis_lib_report/report_info/rt_table_info.dart';
  17. class ReportInfo {
  18. static ReportInfo? _reportInfo;
  19. List<IBlockElementInfo> blocks = [];
  20. List<IBlockElementInfo> headers = [];
  21. List<IBlockElementInfo> footers = [];
  22. /// Gets the author of the report template.
  23. String? author;
  24. /// Gets or sets the value to indicate whether the report template is created by user.
  25. bool? isCustom;
  26. /// Gets the report template name.
  27. String? name;
  28. /// Gets the custom input element tags of the report template.
  29. Map<String, ElementTag>? tags;
  30. /// Gets or sets the update time.
  31. DateTime? updateTime;
  32. ///version
  33. String? version;
  34. /// Gets the id.
  35. String? id;
  36. ReportInfo._internal();
  37. RTPageSize? pageSize;
  38. double currentHeight = 0;
  39. String? reporter;
  40. DateTime? reportDate;
  41. ReportTemplateDocument? reportTemplate;
  42. FEventHandler<ReportEventArgs> onReload = FEventHandler();
  43. static ReportInfo get instance {
  44. _reportInfo ??= ReportInfo._internal();
  45. return _reportInfo!;
  46. }
  47. void init(ReportTemplateDocument reportTemplate, DateTime reportDate,
  48. String reporter) {
  49. try {
  50. this.reportTemplate = reportTemplate;
  51. this.reportDate = reportDate;
  52. this.reporter = reporter;
  53. isCustom = reportTemplate.isCustom;
  54. name = reportTemplate.name;
  55. updateTime = reportTemplate.updateTime;
  56. version = reportTemplate.version;
  57. id = reportTemplate.id;
  58. for (var element in reportTemplate.header!) {
  59. headers.add(_initBlockElement(element));
  60. }
  61. for (var element in reportTemplate.blocks!) {
  62. blocks.add(_initBlockElement(element));
  63. }
  64. for (var element in reportTemplate.footer!) {
  65. footers.add(_initBlockElement(element));
  66. }
  67. pageSize = reportTemplate.pageSize;
  68. } catch (e) {
  69. print(e);
  70. }
  71. }
  72. ///重新渲染UI&重构reportInfo
  73. void reload(String reporter, DateTime reportDate, String jsonStr,
  74. FEventHandler<String> onSelect) {
  75. _reportInfo = null;
  76. onReload.emit(
  77. this, ReportEventArgs(reportDate, reporter, jsonStr, onSelect));
  78. }
  79. IBlockElementInfo? getBlockElement(IBlockElement block) {
  80. final id = block.id;
  81. for (var element in headers) {
  82. if (element.id == id) {
  83. return element;
  84. }
  85. }
  86. for (var element in blocks) {
  87. if (element.id == id) {
  88. return element;
  89. }
  90. }
  91. for (var element in footers) {
  92. if (element.id == id) {
  93. return element;
  94. }
  95. }
  96. }
  97. IBlockElementInfo _initBlockElement(IBlockElement element) {
  98. final _type = element.elementType!;
  99. if (_type.name == ElementType.rtTable!.name) {
  100. final table = element as RTTable;
  101. return RTTableInfo.fromElement(table);
  102. } else if (_type.name == ElementType.paragraph!.name) {
  103. final paragraph = element as Paragraph;
  104. return ParagraphInfo.fromElement(paragraph);
  105. } else {
  106. final inputImageList = element as InputImageList;
  107. return InputImageListInfo.fromElement(inputImageList);
  108. }
  109. }
  110. void selectedInputImage(String imageUrl) {
  111. for (var element in headers) {
  112. if (_checkImageisSelected(element, imageUrl)) {
  113. return;
  114. }
  115. }
  116. for (var element in blocks) {
  117. if (_checkImageisSelected(element, imageUrl)) {
  118. return;
  119. }
  120. }
  121. for (var element in footers) {
  122. if (_checkImageisSelected(element, imageUrl)) {
  123. return;
  124. }
  125. }
  126. }
  127. ElementInfo? getElementInfo(IElement element) {
  128. try {
  129. for (var e in headers) {
  130. final elementInfo = _getBaseElementInfo(e, element);
  131. if (elementInfo != null) {
  132. return elementInfo;
  133. }
  134. }
  135. for (var e in blocks) {
  136. final elementInfo = _getBaseElementInfo(e, element);
  137. if (elementInfo != null) {
  138. return elementInfo;
  139. }
  140. }
  141. for (var e in footers) {
  142. final elementInfo = _getBaseElementInfo(e, element);
  143. if (elementInfo != null) {
  144. return elementInfo;
  145. }
  146. }
  147. } catch (e) {
  148. print(e);
  149. }
  150. return null;
  151. }
  152. bool _checkImageisSelected(IBlockElementInfo block, String url) {
  153. if (block is InputImageListInfo) {
  154. final inputImage = block;
  155. if (inputImage.isSelected ?? false) {
  156. inputImage.addImage(url);
  157. return true;
  158. }
  159. } else if (block is ParagraphInfo) {
  160. for (var el in block.elementInfos!) {
  161. if (el is InputImageInfo) {
  162. final image = el;
  163. if (image.isSelected!) {
  164. image.addImage(url);
  165. return true;
  166. }
  167. }
  168. }
  169. }
  170. return false;
  171. }
  172. ElementInfo? _getBaseElementInfo(IBlockElementInfo block, IElement element) {
  173. ElementInfo? result;
  174. final type = block.elementType;
  175. if (type!.name == ElementType.paragraph!.name) {
  176. final paragraph = block as ParagraphInfo;
  177. for (var el in paragraph.elementInfos!) {
  178. if (el.id == element.id) {
  179. result = el;
  180. break;
  181. }
  182. }
  183. }
  184. if (result == null) {
  185. if (type.name == ElementType.rtTable!.name) {
  186. final table = block as RTTableInfo;
  187. final cells = table.cells!;
  188. for (var cell in cells.values) {
  189. for (var b in cell.blocks!) {
  190. final info = _getBaseElementInfo(b, element);
  191. if (info != null) {
  192. result = info;
  193. break;
  194. }
  195. }
  196. }
  197. }
  198. }
  199. return result;
  200. }
  201. }
  202. class ReportEventArgs {
  203. final FEventHandler<String> onSelect;
  204. final String jsonStr;
  205. final String reporter;
  206. final DateTime reportDate;
  207. ReportEventArgs(this.reportDate, this.reporter, this.jsonStr, this.onSelect);
  208. }