JpcEx.js 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. var JV = require('./Jpc_ValueDefine');
  2. var JpcBand = require('./Jpc_Band');
  3. var JpcFlowTab = require('./Jpc_FlowTab');
  4. var JpcBillTab = require('./Jpc_BillTab');
  5. var JpcCrossTab = require('./Jpc_CrossTab');
  6. var JpcField = require('./Jpc_Field');
  7. var JpcParam = require('./Jpc_Param');
  8. var JpcFunc = require('./Jpc_Function');
  9. var JpcData = require('./Jpc_Data');
  10. var JpcCommonHelper = require('./helper/Jpc_Helper_Common');
  11. var JE = require('./Jpc_RTE'); //Important: for self-define function execution purpose
  12. var JpcExSrv = function(){};
  13. JpcExSrv.prototype.createNew = function(){
  14. function private_buildDftItems(rptTpl, dftCollection, propArray, nodeName) {
  15. var rst = {};
  16. if (dftCollection) {
  17. for (var i = 0; i < dftCollection.length; i++) {
  18. var item = {};
  19. for (var j = 0; j < propArray.length; j++) {
  20. item[propArray[j]] = dftCollection[i][propArray[j]];
  21. }
  22. rst[dftCollection[i][JV.PROP_ID]] = item;
  23. }
  24. if (rptTpl && rptTpl[nodeName] && rptTpl[nodeName].length > 0) {
  25. for (var i = 0; i < rptTpl[nodeName].length; i++) {
  26. var rptDftItem = rptTpl[nodeName][i];
  27. if (rst[rptDftItem[JV.PROP_ID]] == undefined) {
  28. var item = {};
  29. for (var j = 0; j < propArray.length; j++) {
  30. item[propArray[j]] = rptDftItem[propArray[j]];
  31. }
  32. rst[rptDftItem[JV.PROP_ID]] = item;
  33. }
  34. }
  35. }
  36. }
  37. return rst;
  38. }
  39. function private_buildDftControls(rptTpl, dftControlCollection) {
  40. var rst = private_buildDftItems(rptTpl,dftControlCollection, JV.CONTROL_PROPS, JV.NODE_CONTROL_COLLECTION);
  41. return rst;
  42. }
  43. function private_buildDftFonts(rptTpl, dftFontCollection) {
  44. var rst = private_buildDftItems(rptTpl,dftFontCollection, JV.FONT_PROPS, JV.NODE_FONT_COLLECTION);
  45. return rst;
  46. }
  47. function private_buildDftStyles(rptTpl, dftStyleCollection) {
  48. var rst = {};
  49. if (dftStyleCollection) {
  50. for (var i = 0; i < dftStyleCollection.length; i++) {
  51. var item = {};
  52. if (dftStyleCollection[i][JV.PROP_BORDER_STYLE] && dftStyleCollection[i][JV.PROP_BORDER_STYLE].length > 0) {
  53. for (var j = 0; j < dftStyleCollection[i][JV.PROP_BORDER_STYLE].length; j++) {
  54. var borderItem = {};
  55. for (var k = 0; k < JV.BORDER_STYLE_PROPS.length; k++) {
  56. borderItem[JV.BORDER_STYLE_PROPS[k]] = dftStyleCollection[i][JV.PROP_BORDER_STYLE][j][JV.BORDER_STYLE_PROPS[k]];
  57. }
  58. item[dftStyleCollection[i][JV.PROP_BORDER_STYLE][j][JV.PROP_POSITION]] = borderItem;
  59. }
  60. }
  61. rst[dftStyleCollection[i][JV.PROP_ID]] = item;
  62. }
  63. if (rptTpl && rptTpl[JV.NODE_STYLE_COLLECTION] && rptTpl[JV.NODE_STYLE_COLLECTION].length > 0) {
  64. for (var i = 0; i < rptTpl[JV.NODE_STYLE_COLLECTION].length; i++) {
  65. var rptDftItem = rptTpl[JV.NODE_STYLE_COLLECTION][i];
  66. if (rst[rptDftItem[JV.PROP_ID]] == undefined) {
  67. var item = {};
  68. for (var j = 0; j < rptDftItem[JV.PROP_BORDER_STYLE].length; j++) {
  69. var borderItem = {};
  70. for (var k = 0; k < JV.BORDER_STYLE_PROPS.length; k++) {
  71. borderItem[JV.BORDER_STYLE_PROPS[k]] = rptDftItem[JV.PROP_BORDER_STYLE][j][JV.BORDER_STYLE_PROPS[k]];
  72. }
  73. item[rptDftItem[JV.PROP_BORDER_STYLE][j][JV.PROP_POSITION]] = borderItem;
  74. }
  75. rst[rptDftItem[JV.PROP_ID]] = item;
  76. }
  77. }
  78. }
  79. }
  80. return rst;
  81. }
  82. var JpcResult = {};
  83. //JpcResult.report_title
  84. JpcResult.initialize = function(rptTpl) {
  85. var me = this;
  86. if (rptTpl[JV.NODE_FLOW_INFO]) {
  87. me.flowTab = JpcFlowTab.createNew();
  88. me.flowTab.initialize();
  89. }
  90. if (rptTpl[JV.NODE_BILL_INFO]) {
  91. me.billTab = JpcBillTab.createNew();
  92. me.billTab.initialize();
  93. }
  94. //var dt1 = new Date();
  95. if (rptTpl[JV.NODE_CROSS_INFO]) {
  96. me.crossTab = JpcCrossTab.createNew();
  97. me.crossTab.initialize();
  98. }
  99. me.totalPages = 0;
  100. me.runTimePageData = {};
  101. me.fields = JpcField.createNew(rptTpl);
  102. me.params = JpcParam.createNew(rptTpl);
  103. me.formulas = JpcFunc.createNew(rptTpl);
  104. };
  105. JpcResult.analyzeData = function(rptTpl, dataObj, defProperties) {
  106. var me = this;
  107. //1. data object
  108. var dataHelper = JpcData.createNew();
  109. dataHelper.analyzeData(rptTpl, dataObj);
  110. //2. tab object
  111. //pre-condition: the data should be sorted in SQL/NoSQL level!
  112. //var dt1 = new Date();
  113. if (me.flowTab) {
  114. me.flowTab.sorting(rptTpl, dataObj, dataHelper.dataSeq.slice(0));
  115. }
  116. if (me.crossTab) {
  117. me.crossTab.sorting(rptTpl, dataObj, dataHelper.dataSeq.slice(0));
  118. }
  119. //var dt2 = new Date();
  120. //alert(dt2 - dt1);
  121. //3. formulas
  122. me.executeFormulas(JV.RUN_TYPE_BEFORE_PAGING, rptTpl, dataObj, me);
  123. //4. paging
  124. me.paging(rptTpl, dataObj, defProperties);
  125. //alert('analyzeData was completed!');
  126. //for garbage collection:
  127. dataHelper = null;
  128. };
  129. JpcResult.paging = function(rptTpl, dataObj, defProperties) {
  130. var me = this;
  131. if (me.flowTab) {
  132. me.totalPages = me.flowTab.preSetupPages(rptTpl, dataObj, defProperties);
  133. } else if (me.crossTab) {
  134. me.totalPages = me.crossTab.preSetupPages(rptTpl, defProperties);
  135. } else if (me.billTab) {
  136. //me.totalPages = billTab.paging();
  137. }
  138. };
  139. JpcResult.executeFormulas = function(runType, $CURRENT_TEMPLATE, $CURRENT_DATA, $CURRENT_RPT) {
  140. var me = this;
  141. for (var i = 0; i < me.formulas.length; i++) {
  142. if (me.formulas[i][JV.PROP_RUN_TYPE] === runType) {
  143. var expression = me.formulas[i][JV.PROP_EXPRESSION];
  144. if (expression) {
  145. eval(expression);
  146. }
  147. }
  148. }
  149. };
  150. JpcResult.outputAsSimpleJSONPageArray = function(rptTpl, dataObj, startPage, endPage, defProperties) {
  151. var me = this, rst = {};
  152. if ((startPage > 0) && (startPage <= endPage) && (endPage <= me.totalPages)) {
  153. rst[JV.NODE_CONTROL_COLLECTION] = private_buildDftControls(rptTpl, (defProperties == null)?null:defProperties.ctrls);
  154. rst[JV.NODE_STYLE_COLLECTION] = private_buildDftStyles(rptTpl, (defProperties == null)?null:defProperties.styles);
  155. rst[JV.NODE_FONT_COLLECTION] = private_buildDftFonts(rptTpl, (defProperties == null)?null:defProperties.fonts);
  156. rst[JV.NODE_PAGE_INFO] = JpcCommonHelper.getPageSize(rptTpl);
  157. rst.items = [];
  158. var bands = JpcBand.createNew(rptTpl, defProperties);
  159. try {
  160. for (var page = startPage; page <= endPage; page++) {
  161. me.runTimePageData.currentPage = page;
  162. me.executeFormulas(JV.RUN_TYPE_BEFORE_OUTPUT, rptTpl, dataObj, me);
  163. rst.items.push(me.outputAsSimpleJSONPage(rptTpl, dataObj, bands, page, rst[JV.NODE_CONTROL_COLLECTION]));
  164. }
  165. if (bands[JV.BAND_PROP_MERGE_BAND]) {
  166. var mergedBand = {}, band = bands[JV.BAND_PROP_MERGE_BAND];
  167. mergedBand[JV.PROP_LEFT] = band[JV.PROP_LEFT].toFixed(0);
  168. mergedBand[JV.PROP_RIGHT] = band[JV.PROP_RIGHT].toFixed(0);
  169. mergedBand[JV.PROP_TOP] = band[JV.PROP_TOP].toFixed(0);
  170. mergedBand[JV.PROP_BOTTOM] = band[JV.PROP_BOTTOM].toFixed(0);
  171. mergedBand[JV.BAND_PROP_STYLE] = band[JV.BAND_PROP_STYLE];
  172. rst[JV.BAND_PROP_MERGE_BAND] = mergedBand;
  173. }
  174. } finally {
  175. bands = null;
  176. }
  177. }
  178. return rst;
  179. };
  180. JpcResult.outputAsSimpleJSONPage = function(rptTpl, dataObj, bands, page, controls) {
  181. var me = this, rst = null;
  182. if (me.totalPages >= page) {
  183. rst = {};
  184. rst[JV.PROP_PAGE_SEQ] = page;
  185. //rst.cells = [];
  186. if (me.flowTab) {
  187. rst.cells = me.flowTab.outputAsSimpleJSONPage(rptTpl, dataObj, page, bands, controls, me);
  188. } else if (me.crossTab) {
  189. rst.cells = me.crossTab.outputAsSimpleJSONPage(rptTpl, dataObj, page, bands, controls, me);
  190. } else if (me.billTab) {
  191. //
  192. }
  193. }
  194. return rst;
  195. };
  196. //JpcEx.rte.currentRptObj = JpcResult;
  197. return JpcResult;
  198. }
  199. module.exports = new JpcExSrv();