rpt_tpl_preview_util.js 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. /**
  2. * Created by Tony on 2017/7/3.
  3. * 报表模板预览工具类
  4. */
  5. let preview_util = {
  6. offsetX: 0,
  7. offsetY: 0,
  8. clearCanvas: function (canvas) {
  9. if (canvas) {
  10. let ctx = canvas.getContext("2d");
  11. ctx.save();
  12. ctx.fillStyle = "white";
  13. ctx.clearRect(0, 0, canvas.width, canvas.height);
  14. ctx.restore();
  15. }
  16. },
  17. drawBorder: function (canvas) {
  18. let me = this;
  19. if (canvas) {
  20. let size = [];
  21. size[0] = canvas.width - 1;
  22. size[1] = canvas.height - 1;
  23. let ctx = canvas.getContext("2d");
  24. ctx.save();
  25. ctx.beginPath();
  26. ctx.translate(0.5, 0.5);
  27. ctx.lineWidth = 1;
  28. ctx.moveTo(me.offsetX, me.offsetY);
  29. ctx.lineTo(size[0] + me.offsetX, me.offsetY);
  30. ctx.lineTo(size[0] + me.offsetX, size[1] + me.offsetY);
  31. ctx.lineTo(me.offsetX, size[1] + me.offsetY);
  32. ctx.lineTo(me.offsetX, me.offsetY);
  33. ctx.stroke();
  34. ctx.restore();
  35. ctx.fillStyle = "black";
  36. ctx.fillRect(size[0] + me.offsetX, 10 + me.offsetY, 10, size[1]);
  37. ctx.fillRect(10 + me.offsetX, size[1] + me.offsetY, size[0], 10);
  38. }
  39. },
  40. preview: function (canvas, rptTpl) {
  41. let me = this,
  42. resolution = [96, 96],
  43. size = null,
  44. shrinkFactor = 1;
  45. if (!rptTpl) return;
  46. me.clearCanvas(canvas);
  47. let ctx = canvas.getContext("2d");
  48. let pageSize =
  49. rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE];
  50. let sizeIdx = JV.PAGES_SIZE_STR.indexOf(pageSize);
  51. if (sizeIdx >= 0) {
  52. size = JV.PAGES_SIZE[sizeIdx].concat([]);
  53. } else {
  54. size = JV.PAGES_SIZE[0].concat([]);
  55. }
  56. if (
  57. rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] ===
  58. JV.ORIENTATION_LANDSCAPE ||
  59. rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] ===
  60. JV.ORIENTATION_LANDSCAPE_CHN
  61. ) {
  62. let ts = size[0];
  63. size[0] = size[1];
  64. size[1] = ts;
  65. }
  66. if (size[0] > size[1]) {
  67. shrinkFactor = (1.0 * canvas.width) / (size[0] * resolution[0]);
  68. } else {
  69. shrinkFactor = (1.0 * canvas.height) / (size[1] * resolution[1]);
  70. }
  71. let private_translateUnit = function (unitStr) {
  72. let rst = 1.0;
  73. if (unitStr) {
  74. if (JV.MEASUREMENT.PIXEL.indexOf(unitStr) >= 0) {
  75. rst = 1.0;
  76. } else if (JV.MEASUREMENT.CM.indexOf(unitStr) >= 0) {
  77. rst = resolution[0] / 2.54;
  78. } else if (JV.MEASUREMENT.INCH.indexOf(unitStr) >= 0) {
  79. rst = resolution[0];
  80. }
  81. }
  82. return rst;
  83. };
  84. let private_getReportArea = function (rptTpl, unitFactor) {
  85. let rst = [];
  86. rst.push(
  87. unitFactor * rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_LEFT]
  88. );
  89. rst.push(
  90. unitFactor * rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_TOP]
  91. );
  92. rst.push(
  93. size[0] * resolution[0] -
  94. unitFactor * rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_RIGHT]
  95. );
  96. rst.push(
  97. size[1] * resolution[0] -
  98. unitFactor *
  99. rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_BOTTOM]
  100. );
  101. return rst;
  102. };
  103. let private_setupBandArea = function (band, parentArea) {
  104. let rstArea = [].concat(parentArea);
  105. switch (JV.LAYOUT.indexOf(band[JV.BAND_PROP_ALIGNMENT])) {
  106. case JV.LAYOUT_TOP:
  107. if (band[JV.PROP_CALCULATION] === JV.CAL_TYPE_ABSTRACT) {
  108. rstArea[JV.IDX_BOTTOM] =
  109. rstArea[JV.IDX_TOP] +
  110. unitFactor * parseFloat(band[JV.BAND_PROP_HEIGHT]);
  111. } else {
  112. rstArea[JV.IDX_BOTTOM] =
  113. rstArea[JV.IDX_TOP] +
  114. ((rstArea[JV.IDX_BOTTOM] - rstArea[JV.IDX_TOP]) *
  115. parseFloat(band[JV.BAND_PROP_HEIGHT])) /
  116. 100;
  117. }
  118. parentArea[JV.IDX_TOP] = rstArea[JV.IDX_BOTTOM];
  119. break;
  120. case JV.LAYOUT_BOTTOM:
  121. if (band[JV.PROP_CALCULATION] === JV.CAL_TYPE_ABSTRACT) {
  122. rstArea[JV.IDX_TOP] =
  123. rstArea[JV.IDX_BOTTOM] -
  124. unitFactor * parseFloat(band[JV.BAND_PROP_HEIGHT]);
  125. } else {
  126. rstArea[JV.IDX_TOP] =
  127. rstArea[JV.IDX_BOTTOM] -
  128. ((rstArea[JV.IDX_BOTTOM] - rstArea[JV.IDX_TOP]) *
  129. parseFloat(band[JV.BAND_PROP_HEIGHT])) /
  130. 100;
  131. }
  132. parentArea[JV.IDX_BOTTOM] = rstArea[JV.IDX_TOP];
  133. break;
  134. case JV.LAYOUT_LEFT:
  135. if (band[JV.PROP_CALCULATION] === JV.CAL_TYPE_ABSTRACT) {
  136. rstArea[JV.IDX_RIGHT] =
  137. rstArea[JV.IDX_LEFT] +
  138. unitFactor * parseFloat(band[JV.BAND_PROP_WIDTH]);
  139. } else {
  140. rstArea[JV.IDX_RIGHT] =
  141. rstArea[JV.IDX_LEFT] +
  142. ((rstArea[JV.IDX_RIGHT] - rstArea[JV.IDX_LEFT]) *
  143. parseFloat(band[JV.BAND_PROP_WIDTH])) /
  144. 100;
  145. }
  146. parentArea[JV.IDX_LEFT] = rstArea[JV.IDX_RIGHT];
  147. break;
  148. case JV.LAYOUT_RIGHT:
  149. if (band[JV.PROP_CALCULATION] === JV.CAL_TYPE_ABSTRACT) {
  150. rstArea[JV.IDX_LEFT] =
  151. rstArea[JV.IDX_RIGHT] -
  152. unitFactor * parseFloat(band[JV.BAND_PROP_WIDTH]);
  153. } else {
  154. rstArea[JV.IDX_LEFT] =
  155. rstArea[JV.IDX_RIGHT] -
  156. ((rstArea[JV.IDX_RIGHT] - rstArea[JV.IDX_LEFT]) *
  157. parseFloat(band[JV.BAND_PROP_WIDTH])) /
  158. 100;
  159. }
  160. parentArea[JV.IDX_RIGHT] = rstArea[JV.IDX_LEFT];
  161. break;
  162. }
  163. return rstArea;
  164. };
  165. let private_showBand = function (band, myArea, onlyMe, isHighlight) {
  166. //1. draw band border
  167. ctx.save();
  168. ctx.beginPath();
  169. ctx.translate(0.5, 0.5);
  170. ctx.lineWidth = 1;
  171. if (isHighlight) {
  172. ctx.strokeStyle = "#0000ff";
  173. } else {
  174. ctx.setLineDash([3, 6]);
  175. }
  176. ctx.moveTo(
  177. (me.offsetX + myArea[JV.IDX_LEFT]) * shrinkFactor,
  178. (me.offsetY + myArea[JV.IDX_TOP]) * shrinkFactor
  179. );
  180. ctx.lineTo(
  181. (me.offsetX + myArea[JV.IDX_RIGHT]) * shrinkFactor,
  182. (me.offsetY + myArea[JV.IDX_TOP]) * shrinkFactor
  183. );
  184. ctx.lineTo(
  185. (me.offsetX + myArea[JV.IDX_RIGHT]) * shrinkFactor,
  186. (me.offsetY + myArea[JV.IDX_BOTTOM]) * shrinkFactor
  187. );
  188. ctx.lineTo(
  189. (me.offsetX + myArea[JV.IDX_LEFT]) * shrinkFactor,
  190. (me.offsetY + myArea[JV.IDX_BOTTOM]) * shrinkFactor
  191. );
  192. ctx.lineTo(
  193. (me.offsetX + myArea[JV.IDX_LEFT]) * shrinkFactor,
  194. (me.offsetY + myArea[JV.IDX_TOP]) * shrinkFactor
  195. );
  196. ctx.stroke();
  197. ctx.restore();
  198. //2. then draw sub bands border if have.
  199. if (band[JV.BAND_PROP_SUB_BANDS] && !onlyMe) {
  200. for (let subBand of band[JV.BAND_PROP_SUB_BANDS]) {
  201. if (!subBand[JV.PROP_CALCULATION])
  202. subBand[JV.PROP_CALCULATION] = JV.CAL_TYPE_ABSTRACT;
  203. let area = private_setupBandArea(band, myArea);
  204. private_showBand(subBand, area, false, false);
  205. }
  206. }
  207. };
  208. let unitFactor = private_translateUnit(
  209. rptTpl[JV.NODE_MAIN_INFO][JV.PROP_UNITS]
  210. ),
  211. orgArea = private_getReportArea(rptTpl, unitFactor);
  212. for (let band of rptTpl[JV.NODE_BAND_COLLECTION]) {
  213. if (!band[JV.PROP_CALCULATION])
  214. band[JV.PROP_CALCULATION] = JV.CAL_TYPE_ABSTRACT;
  215. let area = private_setupBandArea(band, orgArea);
  216. //bandTreeOprObj.reportCfg.styles
  217. private_showBand(band, area, false, false);
  218. }
  219. if (bandTreeOprObj.currentNode) {
  220. //need to high-light the band?
  221. }
  222. },
  223. getPreviewPage: function (canvas) {
  224. if (zTreeOprObj.currentNode.refId) {
  225. let params = {},
  226. me = this;
  227. params.rpt_tpl_id = zTreeOprObj.currentNode.refId;
  228. let pageSize =
  229. zTreeOprObj.currentNode.rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][
  230. JV.PROP_PAGE_SIZE
  231. ];
  232. if (!pageSize) pageSize = "A4";
  233. params.pageSize = pageSize;
  234. CommonAjax.postEx(
  235. "report_api/getPreviewPage",
  236. params,
  237. 10000,
  238. true,
  239. function (result) {
  240. if (result) {
  241. if (pageSize === "A4") {
  242. if (
  243. zTreeOprObj.currentNode.rptTpl[JV.NODE_MAIN_INFO][
  244. JV.NODE_PAGE_INFO
  245. ][JV.PROP_ORIENTATION] === JV.ORIENTATION_PORTRAIT
  246. ) {
  247. canvas.width = 825;
  248. canvas.height = 1150;
  249. } else {
  250. canvas.width = 1150;
  251. canvas.height = 825;
  252. }
  253. } else {
  254. if (
  255. zTreeOprObj.currentNode.rptTpl[JV.NODE_MAIN_INFO][
  256. JV.NODE_PAGE_INFO
  257. ][JV.PROP_ORIENTATION] === JV.ORIENTATION_PORTRAIT
  258. ) {
  259. canvas.width = 1150;
  260. canvas.height = 1650;
  261. } else {
  262. canvas.width = 1650;
  263. canvas.height = 1150;
  264. }
  265. }
  266. JpcCanvasOutput.cleanCanvas(canvas);
  267. JpcCanvasOutput.drawPageBorder(result, canvas, [96, 96]);
  268. JpcCanvasOutput.highlightConflictArea(result, 1);
  269. JpcCanvasOutput.drawToCanvas(result, canvas, 1);
  270. } else {
  271. alert("preview error!");
  272. }
  273. },
  274. null,
  275. null
  276. );
  277. }
  278. },
  279. };