rpt_tpl_preview_util.js 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  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, resolution= [96,96], size = null, shrinkFactor = 1;
  42. if (!(rptTpl)) return;
  43. me.clearCanvas(canvas);
  44. let ctx = canvas.getContext("2d");
  45. let pageSize = rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE];
  46. let sizeIdx = JV.PAGES_SIZE_STR.indexOf(pageSize);
  47. if (sizeIdx >= 0) {
  48. size = JV.PAGES_SIZE[sizeIdx].concat([]);
  49. } else {
  50. size = JV.PAGES_SIZE[0].concat([]);
  51. }
  52. if (rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] === JV.ORIENTATION_LANDSCAPE || rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] === JV.ORIENTATION_LANDSCAPE_CHN) {
  53. let ts = size[0];
  54. size[0] = size[1];
  55. size[1] = ts;
  56. }
  57. if (size[0] > size[1]) {
  58. shrinkFactor = 1.0 * canvas.width / (size[0] * resolution[0]);
  59. } else {
  60. shrinkFactor = 1.0 * canvas.height / (size[1] * resolution[1]);
  61. }
  62. let private_translateUnit = function(unitStr) {
  63. let rst = 1.0;
  64. if (unitStr) {
  65. if (JV.MEASUREMENT.PIXEL.indexOf(unitStr) >= 0) {
  66. rst = 1.0;
  67. } else if (JV.MEASUREMENT.CM.indexOf(unitStr) >= 0) {
  68. rst = resolution[0] / 2.54;
  69. } else if (JV.MEASUREMENT.INCH.indexOf(unitStr) >= 0) {
  70. rst = resolution[0];
  71. }
  72. }
  73. return rst;
  74. };
  75. let private_getReportArea = function(rptTpl, unitFactor) {
  76. let rst = [];
  77. rst.push(unitFactor * rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_LEFT]);
  78. rst.push(unitFactor * rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_TOP]);
  79. rst.push(size[0] * resolution[0] - unitFactor * rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_RIGHT]);
  80. rst.push(size[1] * resolution[0] - unitFactor * rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_BOTTOM]);
  81. return rst;
  82. };
  83. let private_setupBandArea = function(band, parentArea) {
  84. let rstArea = [].concat(parentArea);
  85. switch (JV.LAYOUT.indexOf(band[JV.BAND_PROP_ALIGNMENT])) {
  86. case JV.LAYOUT_TOP:
  87. if (band[JV.PROP_CALCULATION] === JV.CAL_TYPE_ABSTRACT) {
  88. rstArea[JV.IDX_BOTTOM] = rstArea[JV.IDX_TOP] + unitFactor * parseFloat(band[JV.BAND_PROP_HEIGHT]);
  89. } else {
  90. rstArea[JV.IDX_BOTTOM] = rstArea[JV.IDX_TOP] + (rstArea[JV.IDX_BOTTOM] - rstArea[JV.IDX_TOP]) * parseFloat(band[JV.BAND_PROP_HEIGHT]) / 100;
  91. }
  92. parentArea[JV.IDX_TOP] = rstArea[JV.IDX_BOTTOM];
  93. break;
  94. case JV.LAYOUT_BOTTOM:
  95. if (band[JV.PROP_CALCULATION] === JV.CAL_TYPE_ABSTRACT) {
  96. rstArea[JV.IDX_TOP] = rstArea[JV.IDX_BOTTOM] - unitFactor * parseFloat(band[JV.BAND_PROP_HEIGHT]);
  97. } else {
  98. rstArea[JV.IDX_TOP] = rstArea[JV.IDX_BOTTOM] - (rstArea[JV.IDX_BOTTOM] - rstArea[JV.IDX_TOP]) * parseFloat(band[JV.BAND_PROP_HEIGHT]) / 100;
  99. }
  100. parentArea[JV.IDX_BOTTOM] = rstArea[JV.IDX_TOP];
  101. break;
  102. case JV.LAYOUT_LEFT:
  103. if (band[JV.PROP_CALCULATION] === JV.CAL_TYPE_ABSTRACT) {
  104. rstArea[JV.IDX_RIGHT] = rstArea[JV.IDX_LEFT] + unitFactor * parseFloat(band[JV.BAND_PROP_WIDTH]);
  105. } else {
  106. rstArea[JV.IDX_RIGHT] = rstArea[JV.IDX_LEFT] + (rstArea[JV.IDX_RIGHT] - rstArea[JV.IDX_LEFT]) * parseFloat(band[JV.BAND_PROP_WIDTH]) / 100;
  107. }
  108. parentArea[JV.IDX_LEFT] = rstArea[JV.IDX_RIGHT];
  109. break;
  110. case JV.LAYOUT_RIGHT:
  111. if (band[JV.PROP_CALCULATION] === JV.CAL_TYPE_ABSTRACT) {
  112. rstArea[JV.IDX_LEFT] = rstArea[JV.IDX_RIGHT] - unitFactor * parseFloat(band[JV.BAND_PROP_WIDTH]);
  113. } else {
  114. rstArea[JV.IDX_LEFT] = rstArea[JV.IDX_RIGHT] - (rstArea[JV.IDX_RIGHT] - rstArea[JV.IDX_LEFT]) * parseFloat(band[JV.BAND_PROP_WIDTH]) / 100;
  115. }
  116. parentArea[JV.IDX_RIGHT] = rstArea[JV.IDX_LEFT];
  117. break;
  118. }
  119. return rstArea;
  120. };
  121. let private_showBand = function (band, myArea, onlyMe, isHighlight) {
  122. //1. draw band border
  123. ctx.save();
  124. ctx.beginPath();
  125. ctx.translate(0.5,0.5);
  126. ctx.lineWidth = 1;
  127. if (isHighlight) {
  128. ctx.strokeStyle="#0000ff";
  129. } else {
  130. ctx.setLineDash([3, 6]);
  131. }
  132. ctx.moveTo((me.offsetX + myArea[JV.IDX_LEFT]) * shrinkFactor, (me.offsetY + myArea[JV.IDX_TOP]) * shrinkFactor );
  133. ctx.lineTo((me.offsetX + myArea[JV.IDX_RIGHT]) * shrinkFactor, (me.offsetY + myArea[JV.IDX_TOP]) * shrinkFactor);
  134. ctx.lineTo((me.offsetX + myArea[JV.IDX_RIGHT]) * shrinkFactor, (me.offsetY + myArea[JV.IDX_BOTTOM]) * shrinkFactor);
  135. ctx.lineTo((me.offsetX + myArea[JV.IDX_LEFT]) * shrinkFactor, (me.offsetY + myArea[JV.IDX_BOTTOM]) * shrinkFactor);
  136. ctx.lineTo((me.offsetX + myArea[JV.IDX_LEFT]) * shrinkFactor, (me.offsetY + myArea[JV.IDX_TOP]) * shrinkFactor);
  137. ctx.stroke();
  138. ctx.restore();
  139. //2. then draw sub bands border if have.
  140. if (band[JV.BAND_PROP_SUB_BANDS] && !onlyMe) {
  141. for (let subBand of band[JV.BAND_PROP_SUB_BANDS]) {
  142. if (!(subBand[JV.PROP_CALCULATION])) subBand[JV.PROP_CALCULATION] = JV.CAL_TYPE_ABSTRACT;
  143. let area = private_setupBandArea(band, myArea);
  144. private_showBand(subBand, area, false, false);
  145. }
  146. }
  147. };
  148. let unitFactor = private_translateUnit(rptTpl[JV.NODE_MAIN_INFO][JV.PROP_UNITS]),
  149. orgArea = private_getReportArea(rptTpl, unitFactor);
  150. for (let band of rptTpl[JV.NODE_BAND_COLLECTION]) {
  151. if (!(band[JV.PROP_CALCULATION])) band[JV.PROP_CALCULATION] = JV.CAL_TYPE_ABSTRACT;
  152. let area = private_setupBandArea(band, orgArea);
  153. //bandTreeOprObj.reportCfg.styles
  154. private_showBand(band, area, false, false);
  155. }
  156. if (bandTreeOprObj.currentNode) {
  157. //need to high-light the band?
  158. }
  159. },
  160. getPreviewPage: function(canvas) {
  161. if (zTreeOprObj.currentNode.refId) {
  162. let params = {}, me = this;
  163. params.rpt_tpl_id = zTreeOprObj.currentNode.refId;
  164. let pageSize = zTreeOprObj.currentNode.rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE];
  165. if (!pageSize) pageSize = 'A4';
  166. params.pageSize = pageSize;
  167. CommonAjax.postEx("report_api/getPreviewPage", params, 10000, true, function(result){
  168. if (result) {
  169. if (pageSize === 'A4') {
  170. if (zTreeOprObj.currentNode.rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] === JV.ORIENTATION_PORTRAIT) {
  171. canvas.width = 825;
  172. canvas.height = 1150;
  173. } else {
  174. canvas.width = 1150;
  175. canvas.height = 825;
  176. }
  177. } else {
  178. if (zTreeOprObj.currentNode.rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] === JV.ORIENTATION_PORTRAIT) {
  179. canvas.width = 1150;
  180. canvas.height = 1650;
  181. } else {
  182. canvas.width = 1650;
  183. canvas.height = 1150;
  184. }
  185. }
  186. JpcCanvasOutput.cleanCanvas(canvas);
  187. JpcCanvasOutput.drawPageBorder(result, canvas, [96,96]);
  188. JpcCanvasOutput.highlightConflictArea(result, 1);
  189. JpcCanvasOutput.drawToCanvas(result, canvas, 1);
  190. } else {
  191. alert('preview error!');
  192. }
  193. }, null, null
  194. );
  195. }
  196. }
  197. };