jpc_cross_tab.js 56 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890
  1. let JV = require("./jpc_value_define");
  2. let JE = require("./jpc_rte");
  3. let JpcFieldHelper = require("./helper/jpc_helper_field");
  4. let JpcBandHelper = require("./helper/jpc_helper_band");
  5. let JpcBand = require("./jpc_band");
  6. let JpcCrossTabHelper = require("./helper/jpc_helper_cross_tab");
  7. let JpcCommonHelper = require("./helper/jpc_helper_common");
  8. let JpcDiscreteHelper = require("./helper/jpc_helper_discrete");
  9. let JpcTextHelper = require("./helper/jpc_helper_text");
  10. let JpcCommonOutputHelper = require("./helper/jpc_helper_common_output");
  11. let JpcAreaHelper = require("./helper/jpc_helper_area");
  12. let JpcCrossTabSrv = function () {};
  13. JpcCrossTabSrv.prototype.createNew = function () {
  14. function private_addTabValue(
  15. tabValuedIdxLst,
  16. sortedSequence,
  17. segIdx,
  18. preRec,
  19. nextRec,
  20. dispSerialIdxLst,
  21. sorted_sum_value_Lst,
  22. rst_sum_value_Lst
  23. ) {
  24. if (tabValuedIdxLst) {
  25. let serial1stTier = null;
  26. if (dispSerialIdxLst) serial1stTier = [];
  27. let pgseg1stTier = [];
  28. let sumVal = [];
  29. let sumValL = 1;
  30. if (sortedSequence) {
  31. let arrDupVals = sortedSequence[segIdx];
  32. let arrDupSumVals = null;
  33. if (sorted_sum_value_Lst !== null) {
  34. arrDupSumVals = sorted_sum_value_Lst[segIdx];
  35. sumValL = arrDupSumVals[0].length;
  36. }
  37. for (let i = 0; i < nextRec; i++) {
  38. if (arrDupVals.length <= preRec + i) {
  39. pgseg1stTier[i] = JV.BLANK_VALUE_INDEX;
  40. sumVal[i] = [];
  41. for (let ei = 0; ei < sumValL; ei++) {
  42. sumVal[i][ei] = null;
  43. }
  44. if (serial1stTier !== null) {
  45. serial1stTier[i] = JV.BLANK_VALUE_INDEX;
  46. }
  47. continue;
  48. }
  49. let duplicateValueArr = arrDupVals[preRec + i];
  50. pgseg1stTier[i] = duplicateValueArr[0];
  51. if (arrDupSumVals !== null) sumVal[i] = arrDupSumVals[preRec + i];
  52. if (serial1stTier !== null) {
  53. serial1stTier[i] = preRec + i;
  54. }
  55. }
  56. tabValuedIdxLst.push(pgseg1stTier);
  57. if (dispSerialIdxLst !== null) {
  58. dispSerialIdxLst.push(serial1stTier);
  59. }
  60. if (sorted_sum_value_Lst !== null && rst_sum_value_Lst !== null) {
  61. rst_sum_value_Lst.push(sumVal);
  62. }
  63. } else {
  64. //should push blank value index rather than null
  65. for (let i = 0; i < nextRec; i++) {
  66. pgseg1stTier[i] = JV.BLANK_VALUE_INDEX;
  67. sumVal[i] = null;
  68. if (serial1stTier !== null) {
  69. serial1stTier[i] = JV.BLANK_VALUE_INDEX;
  70. }
  71. }
  72. tabValuedIdxLst.push(pgseg1stTier);
  73. if (dispSerialIdxLst !== null) {
  74. dispSerialIdxLst.push(serial1stTier);
  75. }
  76. if (sorted_sum_value_Lst !== null && rst_sum_value_Lst !== null) {
  77. rst_sum_value_Lst.push(sumVal);
  78. }
  79. }
  80. }
  81. }
  82. function private_addContentValue(
  83. dispValueIdxLst_Content,
  84. sortedContentSequence,
  85. segIdx,
  86. counterRowRec,
  87. maxRowRec,
  88. counterColRec,
  89. maxColRec,
  90. page_seg_map,
  91. pageIdx
  92. ) {
  93. if (dispValueIdxLst_Content !== null) {
  94. page_seg_map.push([pageIdx, segIdx]);
  95. let arrContents = [];
  96. if (sortedContentSequence !== null) {
  97. let arrAllContent = sortedContentSequence[segIdx];
  98. for (let i = 0; i < maxRowRec; i++) {
  99. arrContents.push([]);
  100. for (let j = 0; j < maxColRec; j++) {
  101. if (
  102. arrAllContent.length <= counterRowRec + i ||
  103. arrAllContent[counterRowRec + i].length <= counterColRec + j
  104. ) {
  105. arrContents[i][j] = JV.BLANK_VALUE_INDEX;
  106. } else {
  107. arrContents[i][j] =
  108. arrAllContent[counterRowRec + i][counterColRec + j];
  109. }
  110. }
  111. }
  112. dispValueIdxLst_Content.push(arrContents);
  113. } else {
  114. //should push blank value index rather than null
  115. for (let i = 0; i < maxRowRec; i++) {
  116. arrContents.push([]);
  117. for (let j = 0; j < maxColRec; j++) {
  118. arrContents[i][j] = JV.BLANK_VALUE_INDEX;
  119. }
  120. }
  121. dispValueIdxLst_Content.push(arrContents);
  122. }
  123. }
  124. }
  125. function private_SortAndOptimize(
  126. rptTpl,
  127. dataObj,
  128. dataSeq,
  129. sortTab,
  130. rstFieldsIdx,
  131. $CURRENT_RPT
  132. ) {
  133. let result = [];
  134. let tab = rptTpl[JV.NODE_CROSS_INFO][sortTab];
  135. if (tab) {
  136. let sIDX = 0;
  137. //1. prepare and sort by tab-field
  138. let fields = [];
  139. JpcFieldHelper.findAndPutDataFieldIdx(
  140. rptTpl,
  141. tab[JV.PROP_CROSS_FIELDS],
  142. fields,
  143. rstFieldsIdx
  144. );
  145. let data_details = dataObj[JV.DATA_DETAIL_DATA];
  146. JpcCrossTabHelper.sortTabFields(
  147. fields,
  148. rstFieldsIdx,
  149. data_details,
  150. dataSeq,
  151. $CURRENT_RPT
  152. );
  153. //2. distinguish sort tab fields value
  154. let b1 = false;
  155. for (let i = 0; i < dataSeq.length; i++) {
  156. sIDX = 0;
  157. let segArr = [];
  158. if (dataSeq[i].length === 1) {
  159. JpcCrossTabHelper.pushToSeg(segArr, dataSeq, i, 0, 1);
  160. } else {
  161. for (let j = 1; j < dataSeq[i].length; j++) {
  162. b1 = false;
  163. for (let k = 0; k < rstFieldsIdx.length; k++) {
  164. if (fields[k].hasOwnProperty(JV.TAB_FIELD_PROP_SORT)) {
  165. //只有被选择了作为排序字段的才进入排序及优化
  166. if (typeof rstFieldsIdx[k] === "object") {
  167. let map_data_field = JE.F(
  168. rstFieldsIdx[k][JV.PROP_ID],
  169. $CURRENT_RPT
  170. );
  171. if (
  172. map_data_field[JV.PROP_AD_HOC_DATA][dataSeq[i][j - 1]] !==
  173. map_data_field[JV.PROP_AD_HOC_DATA][dataSeq[i][j]]
  174. ) {
  175. b1 = true;
  176. break;
  177. }
  178. } else {
  179. if (
  180. data_details[rstFieldsIdx[k]][dataSeq[i][j - 1]] !==
  181. data_details[rstFieldsIdx[k]][dataSeq[i][j]]
  182. ) {
  183. b1 = true;
  184. break;
  185. }
  186. }
  187. }
  188. }
  189. if (b1) {
  190. JpcCrossTabHelper.pushToSeg(segArr, dataSeq, i, sIDX, j);
  191. sIDX = j;
  192. if (j === dataSeq[i].length - 1) {
  193. JpcCrossTabHelper.pushToSeg(
  194. segArr,
  195. dataSeq,
  196. i,
  197. j,
  198. dataSeq[i].length
  199. );
  200. }
  201. } else if (j === dataSeq[i].length - 1) {
  202. JpcCrossTabHelper.pushToSeg(
  203. segArr,
  204. dataSeq,
  205. i,
  206. sIDX,
  207. dataSeq[i].length
  208. );
  209. }
  210. }
  211. }
  212. if (segArr.length > 0) result.push(segArr);
  213. }
  214. }
  215. return result;
  216. }
  217. function private_SortForDisplayContent(rptTpl, rowSeq, colSeq, rstFieldsIdx) {
  218. let result = [];
  219. let tab = rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_CONTENT];
  220. if (tab) {
  221. JpcFieldHelper.findAndPutDataFieldIdx(
  222. rptTpl,
  223. tab[JV.PROP_CROSS_FIELDS],
  224. null,
  225. rstFieldsIdx
  226. );
  227. }
  228. for (let i = 0; i < rowSeq.length; i++) {
  229. let rl = rowSeq[i],
  230. cl = colSeq[i];
  231. let ds = [];
  232. //1. initialize to blank value index
  233. for (let j = 0; j < rl.length; j++) {
  234. ds.push([]);
  235. for (let k = 0; k < cl.length; k++) {
  236. ds[j].push(JV.BLANK_VALUE_INDEX);
  237. }
  238. }
  239. //2. then fill up the right index
  240. for (let j = 0; j < rl.length; j++) {
  241. let ra = rl[j];
  242. for (let k = 0; k < ra.length; k++) {
  243. let colIdx = JpcCrossTabHelper.getColIDX(cl, ra[k]);
  244. if (colIdx >= 0) {
  245. ds[j][colIdx] = ra[k];
  246. }
  247. }
  248. }
  249. result.push(ds);
  250. }
  251. return result;
  252. }
  253. let JpcCrossTabResult = {};
  254. JpcCrossTabResult.initialize = function () {
  255. let me = this;
  256. me.dispValueIdxLst_Row = [];
  257. me.dispValueIdxLst_Col = [];
  258. me.dispValueIdxLst_Content = [];
  259. me.dispSerialIdxLst_Row = [];
  260. me.col_sum_fields_idx = [];
  261. me.col_sum_fields_value_total = [];
  262. me.dispSumValueLst_Col = [];
  263. me.page_seg_map = [];
  264. me.row_fields_idx = [];
  265. me.row_fields_adhoc_idx = [];
  266. me.col_fields_idx = [];
  267. me.content_fields_idx = [];
  268. me.row_extension_fields_idx = [];
  269. me.row_sum_extension_fields_idx = [];
  270. me.crsOrient = JV.PAGE_ORIENTATION_V_FIRST;
  271. me.pageStatusLst = [];
  272. me.paging_option = JV.PAGING_OPTION_NORMAL;
  273. };
  274. JpcCrossTabResult.sorting = function (
  275. rptTpl,
  276. dataObj,
  277. dataSeq,
  278. $CURRENT_RPT
  279. ) {
  280. let me = this;
  281. //IMPORTANT: the data should be sorted in SQL/NoSQL level!
  282. me.sortedRowSequence = private_SortAndOptimize(
  283. rptTpl,
  284. dataObj,
  285. dataSeq,
  286. JV.NODE_CROSS_ROW,
  287. me.row_fields_idx,
  288. $CURRENT_RPT
  289. );
  290. private_SortAndOptimize(
  291. rptTpl,
  292. dataObj,
  293. dataSeq,
  294. JV.NODE_CROSS_ROW_AD_HOC,
  295. me.row_fields_adhoc_idx,
  296. $CURRENT_RPT
  297. );
  298. me.sortedColSequence = private_SortAndOptimize(
  299. rptTpl,
  300. dataObj,
  301. dataSeq,
  302. JV.NODE_CROSS_COL,
  303. me.col_fields_idx,
  304. $CURRENT_RPT
  305. );
  306. me.sortedContentSequence = private_SortForDisplayContent(
  307. rptTpl,
  308. me.sortedRowSequence,
  309. me.sortedColSequence,
  310. me.content_fields_idx
  311. );
  312. JpcFieldHelper.findAndPutDataFieldIdx(
  313. rptTpl,
  314. rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL_SUM][JV.PROP_CROSS_FIELDS],
  315. null,
  316. me.col_sum_fields_idx
  317. );
  318. JpcFieldHelper.findAndPutDataFieldIdx(
  319. rptTpl,
  320. rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_SUM][JV.PROP_CROSS_FIELDS],
  321. null,
  322. me.col_sum_fields_idx
  323. );
  324. //pre-sum the data(for col sum display)
  325. let data_details = dataObj[JV.DATA_DETAIL_DATA],
  326. data_fields = [];
  327. for (let i = 0; i < me.col_sum_fields_idx.length; i++) {
  328. let data_field = null;
  329. if (typeof me.col_sum_fields_idx[i] === "object") {
  330. let exField = JE.F(me.col_sum_fields_idx[i][JV.PROP_ID], $CURRENT_RPT);
  331. if (exField) {
  332. data_field = exField[JV.PROP_AD_HOC_DATA];
  333. }
  334. } else {
  335. data_field = data_details[me.col_sum_fields_idx[i]];
  336. }
  337. data_fields.push(data_field);
  338. }
  339. for (let i = 0; i < me.sortedRowSequence.length; i++) {
  340. //seg level
  341. if (me.sortedRowSequence[i].length > 0) {
  342. me.col_sum_fields_value_total.push([]);
  343. for (let j = 0; j < me.sortedRowSequence[i].length; j++) {
  344. let rowGrandTotal = [];
  345. for (let di = 0; di < data_fields.length; di++) {
  346. rowGrandTotal.push(0.0);
  347. for (let k = 0; k < me.sortedRowSequence[i][j].length; k++) {
  348. //3. start to sum
  349. rowGrandTotal[di] =
  350. rowGrandTotal[di] +
  351. 1.0 *
  352. JpcFieldHelper.getValue(
  353. data_fields[di],
  354. me.sortedRowSequence[i][j][k]
  355. );
  356. }
  357. }
  358. me.col_sum_fields_value_total[i].push(rowGrandTotal);
  359. }
  360. }
  361. }
  362. };
  363. JpcCrossTabResult.preSetupPages = function (rptTpl, defProperties, option) {
  364. let me = this,
  365. rst = 0;
  366. me.paging_option = option || JV.PAGING_OPTION_NORMAL;
  367. //1. original initialize
  368. let maxRowRec = 1,
  369. maxColRec = 1,
  370. counterRowRec = 0,
  371. counterColRec = 0,
  372. pageIdx = 0,
  373. segCnt = me.sortedContentSequence.length;
  374. let pageStatus = [true, true, false, true, false, false, false, false];
  375. //2. calculate the page info one by one
  376. let bands = JpcBand.createNew(rptTpl, defProperties);
  377. function private_resetBandArea() {
  378. JpcBandHelper.setBandArea(bands, rptTpl, pageStatus);
  379. maxRowRec = JpcCrossTabHelper.getMaxRowsPerPage(bands, rptTpl);
  380. maxColRec = JpcCrossTabHelper.getMaxColsPerPage(bands, rptTpl);
  381. }
  382. JpcFieldHelper.findAndPutDataFieldIdx(
  383. rptTpl,
  384. rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_EXT][JV.PROP_CROSS_FIELDS],
  385. null,
  386. me.row_extension_fields_idx
  387. );
  388. JpcFieldHelper.findAndPutDataFieldIdx(
  389. rptTpl,
  390. rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_SUM_EXT][
  391. JV.PROP_CROSS_FIELDS
  392. ],
  393. null,
  394. me.row_sum_extension_fields_idx
  395. );
  396. if (me.paging_option === JV.PAGING_OPTION_INFINITY) {
  397. /*
  398. rst = segCnt;
  399. pageStatus[JV.STATUS_SEGMENT_START] = true;
  400. pageStatus[JV.STATUS_SEGMENT_END] = true;
  401. pageStatus[JV.STATUS_CROSS_ROW_END] = true;
  402. pageStatus[JV.STATUS_CROSS_COL_END] = true;
  403. for (let segIdx = 0; segIdx < segCnt; segIdx++) {
  404. if (segIdx === segCnt - 1) {
  405. pageStatus[JV.STATUS_REPORT_END] = true;
  406. }
  407. if (segIdx > 0) {
  408. pageStatus[JV.STATUS_REPORT_START] = false;
  409. }
  410. me.pageStatusLst.push(pageStatus.slice(0));
  411. pageIdx++;
  412. private_addTabValue(me.dispValueIdxLst_Row, me.sortedRowSequence, segIdx, 0, me.sortedRowSequence[segIdx].length, me.dispSerialIdxLst_Row, me.col_sum_fields_value_total, me.dispSumValueLst_Col);
  413. private_addTabValue(me.dispValueIdxLst_Col, me.sortedColSequence, segIdx, 0, me.sortedColSequence[segIdx].length, null, null, null);
  414. private_addContentValue(me.dispValueIdxLst_Content, me.sortedContentSequence, segIdx, 0, me.sortedRowSequence[segIdx].length, 0, me.sortedColSequence[segIdx].length, me.page_seg_map, pageIdx);
  415. }
  416. //*/
  417. } else {
  418. for (let segIdx = 0; segIdx < segCnt; segIdx++) {
  419. //2.1. seg level initialize
  420. private_resetBandArea();
  421. let orgMaxRowRec = maxRowRec,
  422. orgMaxColRec = maxColRec;
  423. let rowSplitCnt = Math.ceil(
  424. (1.0 * me.sortedRowSequence[segIdx].length) / maxRowRec
  425. );
  426. let colSplitCnt = Math.ceil(
  427. (1.0 * me.sortedColSequence[segIdx].length) / maxColRec
  428. );
  429. pageStatus[JV.STATUS_CROSS_ROW_END] = true;
  430. private_resetBandArea();
  431. let hasAdHocRow = !JpcCrossTabHelper.chkTabEnd(
  432. JV.NODE_CROSS_ROW_SUM,
  433. rptTpl,
  434. bands,
  435. me.sortedRowSequence,
  436. segIdx,
  437. (rowSplitCnt - 1) * orgMaxRowRec,
  438. maxRowRec
  439. );
  440. if (hasAdHocRow) {
  441. hasAdHocRow = !JpcCrossTabHelper.chkTabEnd(
  442. JV.NODE_CROSS_ROW_EXT,
  443. rptTpl,
  444. bands,
  445. me.sortedRowSequence,
  446. segIdx,
  447. (rowSplitCnt - 1) * orgMaxRowRec,
  448. maxRowRec
  449. );
  450. }
  451. pageStatus[JV.STATUS_CROSS_ROW_END] = false;
  452. pageStatus[JV.STATUS_CROSS_COL_END] = true;
  453. private_resetBandArea();
  454. let hasAdHocCol = !JpcCrossTabHelper.chkTabEnd(
  455. JV.NODE_CROSS_COL_SUM,
  456. rptTpl,
  457. bands,
  458. me.sortedColSequence,
  459. segIdx,
  460. (colSplitCnt - 1) * orgMaxColRec,
  461. maxColRec
  462. );
  463. pageStatus[JV.STATUS_CROSS_COL_END] = false;
  464. private_resetBandArea();
  465. if (hasAdHocRow) rowSplitCnt++;
  466. if (hasAdHocCol) colSplitCnt++;
  467. //2.2
  468. if (
  469. rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][
  470. JV.PROP_CROSS_DISPLAY_ORDER
  471. ] === JV.PAGE_ORIENTATION_H_FIRST
  472. ) {
  473. for (let rowIdx = 0; rowIdx < rowSplitCnt; rowIdx++) {
  474. pageStatus[JV.STATUS_CROSS_ROW_END] = rowIdx === rowSplitCnt - 1;
  475. private_resetBandArea();
  476. counterRowRec = orgMaxRowRec * rowIdx;
  477. let currentSortedRowSequence = me.sortedRowSequence;
  478. let currentSortedContentSequence = me.sortedContentSequence;
  479. if (hasAdHocRow && rowIdx === rowSplitCnt - 1) {
  480. currentSortedRowSequence = null;
  481. currentSortedContentSequence = null;
  482. counterRowRec = 0;
  483. }
  484. for (let colIdx = 0; colIdx < colSplitCnt; colIdx++) {
  485. pageStatus[JV.STATUS_CROSS_COL_END] = colIdx === colSplitCnt - 1;
  486. private_resetBandArea();
  487. counterColRec = orgMaxColRec * colIdx;
  488. let currentSortedColSequence = me.sortedColSequence;
  489. if (hasAdHocCol && colIdx === colSplitCnt - 1) {
  490. currentSortedColSequence = null;
  491. currentSortedContentSequence = null;
  492. counterColRec = 0;
  493. }
  494. me.pageStatusLst.push(pageStatus.slice(0));
  495. pageIdx++;
  496. private_addTabValue(
  497. me.dispValueIdxLst_Row,
  498. currentSortedRowSequence,
  499. segIdx,
  500. counterRowRec,
  501. maxRowRec,
  502. me.dispSerialIdxLst_Row,
  503. me.col_sum_fields_value_total,
  504. me.dispSumValueLst_Col
  505. );
  506. private_addTabValue(
  507. me.dispValueIdxLst_Col,
  508. currentSortedColSequence,
  509. segIdx,
  510. counterColRec,
  511. maxColRec,
  512. null,
  513. null,
  514. null
  515. );
  516. private_addContentValue(
  517. me.dispValueIdxLst_Content,
  518. currentSortedContentSequence,
  519. segIdx,
  520. counterRowRec,
  521. maxRowRec,
  522. counterColRec,
  523. maxColRec,
  524. me.page_seg_map,
  525. pageIdx
  526. );
  527. }
  528. }
  529. } else {
  530. for (let colIdx = 0; colIdx < colSplitCnt; colIdx++) {
  531. pageStatus[JV.STATUS_CROSS_COL_END] = colIdx === colSplitCnt - 1;
  532. private_resetBandArea();
  533. counterColRec = orgMaxColRec * colIdx;
  534. let currentSortedContentSequence = me.sortedContentSequence;
  535. let currentSortedColSequence = me.sortedColSequence;
  536. if (hasAdHocCol && colIdx === colSplitCnt - 1) {
  537. currentSortedColSequence = null;
  538. currentSortedContentSequence = null;
  539. counterColRec = 0;
  540. }
  541. for (let rowIdx = 0; rowIdx < rowSplitCnt; rowIdx++) {
  542. pageStatus[JV.STATUS_CROSS_ROW_END] = rowIdx === rowSplitCnt - 1;
  543. private_resetBandArea();
  544. me.pageStatusLst.push(pageStatus.slice(0));
  545. pageIdx++;
  546. counterRowRec = orgMaxRowRec * rowIdx;
  547. let currentSortedRowSequence = me.sortedRowSequence;
  548. if (hasAdHocRow && rowIdx === rowSplitCnt - 1) {
  549. currentSortedRowSequence = null;
  550. currentSortedContentSequence = null;
  551. counterRowRec = 0;
  552. }
  553. private_addTabValue(
  554. me.dispValueIdxLst_Row,
  555. currentSortedRowSequence,
  556. segIdx,
  557. counterRowRec,
  558. maxRowRec,
  559. me.dispSerialIdxLst_Row,
  560. me.col_sum_fields_value_total,
  561. me.dispSumValueLst_Col
  562. );
  563. private_addTabValue(
  564. me.dispValueIdxLst_Col,
  565. currentSortedColSequence,
  566. segIdx,
  567. counterColRec,
  568. maxColRec,
  569. null,
  570. null,
  571. null
  572. );
  573. private_addContentValue(
  574. me.dispValueIdxLst_Content,
  575. currentSortedContentSequence,
  576. segIdx,
  577. counterRowRec,
  578. maxRowRec,
  579. counterColRec,
  580. maxColRec,
  581. me.page_seg_map,
  582. pageIdx
  583. );
  584. }
  585. }
  586. }
  587. JpcCrossTabHelper.initialPageStatus(pageStatus);
  588. }
  589. //3. set pageSeq and return the result
  590. rst = pageIdx;
  591. }
  592. bands = null;
  593. return rst;
  594. };
  595. JpcCrossTabResult.outputAsPreviewPage = function (
  596. rptTpl,
  597. bands,
  598. controls,
  599. $CURRENT_RPT,
  600. customizeCfg
  601. ) {
  602. let me = this,
  603. rst = [];
  604. let pageStatus = [true, true, true, true, true, true, true, true];
  605. me.pageStatusLst.push(pageStatus);
  606. // JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_CONTENT][JV.PROP_FLOW_FIELDS], null, me.disp_fields_idx, false);
  607. JpcBandHelper.setBandArea(bands, rptTpl, pageStatus, true, false);
  608. let maxRowRec = JpcCrossTabHelper.getMaxRowsPerPage(bands, rptTpl);
  609. let maxColRec = JpcCrossTabHelper.getMaxColsPerPage(bands, rptTpl);
  610. let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
  611. //1. 交叉行
  612. rst = rst.concat(
  613. me.outputPreviewRowTab(
  614. rptTpl,
  615. bands,
  616. controls,
  617. $CURRENT_RPT,
  618. customizeCfg,
  619. maxRowRec,
  620. unitFactor
  621. )
  622. );
  623. //2. 交叉列
  624. rst = rst.concat(
  625. me.outputPreviewColTab(
  626. rptTpl,
  627. bands,
  628. controls,
  629. $CURRENT_RPT,
  630. customizeCfg,
  631. maxColRec,
  632. unitFactor
  633. )
  634. );
  635. //3. 交叉数据
  636. rst = rst.concat(
  637. me.outputPreviewContent(
  638. rptTpl,
  639. bands,
  640. controls,
  641. $CURRENT_RPT,
  642. customizeCfg,
  643. maxRowRec,
  644. maxColRec,
  645. unitFactor
  646. )
  647. );
  648. //4. 交叉行拓展
  649. rst = rst.concat(
  650. me.outputPreviewTabExt(
  651. rptTpl,
  652. bands,
  653. controls,
  654. $CURRENT_RPT,
  655. customizeCfg,
  656. maxColRec,
  657. unitFactor
  658. )
  659. );
  660. //5. 交叉行拓展合计
  661. rst = rst.concat(
  662. me.outputPreviewSumTabExt(
  663. rptTpl,
  664. bands,
  665. controls,
  666. $CURRENT_RPT,
  667. customizeCfg,
  668. unitFactor
  669. )
  670. );
  671. //6. 交叉列合计
  672. rst = rst.concat(
  673. me.outputPreviewTabSum(
  674. rptTpl,
  675. bands,
  676. controls,
  677. $CURRENT_RPT,
  678. customizeCfg,
  679. maxRowRec,
  680. JV.NODE_CROSS_COL_SUM,
  681. unitFactor
  682. )
  683. );
  684. //7. 交叉行合计
  685. rst = rst.concat(
  686. me.outputPreviewRowTabSum(
  687. rptTpl,
  688. bands,
  689. controls,
  690. $CURRENT_RPT,
  691. customizeCfg,
  692. maxRowRec,
  693. maxColRec,
  694. unitFactor
  695. )
  696. );
  697. //8. 离散
  698. rst = rst.concat(
  699. JpcDiscreteHelper.outputPreviewDiscreteInfo(
  700. rptTpl[JV.NODE_CROSS_INFO][JV.NODE_DISCRETE_INFO],
  701. bands,
  702. unitFactor,
  703. pageStatus
  704. )
  705. );
  706. return rst;
  707. };
  708. JpcCrossTabResult.outputPreviewRowTab = function (
  709. rptTpl,
  710. bands,
  711. controls,
  712. $CURRENT_RPT,
  713. customizeCfg,
  714. maxRowRec,
  715. unitFactor
  716. ) {
  717. let rst = this.private_OutputPreviewCommon(
  718. rptTpl,
  719. bands,
  720. controls,
  721. $CURRENT_RPT,
  722. customizeCfg,
  723. maxRowRec,
  724. 1,
  725. rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW],
  726. unitFactor
  727. );
  728. rst = rst.concat(
  729. this.private_OutputPreviewCommon(
  730. rptTpl,
  731. bands,
  732. controls,
  733. $CURRENT_RPT,
  734. customizeCfg,
  735. maxRowRec,
  736. 1,
  737. rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_AD_HOC],
  738. unitFactor
  739. )
  740. );
  741. return rst;
  742. };
  743. JpcCrossTabResult.outputPreviewColTab = function (
  744. rptTpl,
  745. bands,
  746. controls,
  747. $CURRENT_RPT,
  748. customizeCfg,
  749. maxColRec,
  750. unitFactor
  751. ) {
  752. return this.private_OutputPreviewCommon(
  753. rptTpl,
  754. bands,
  755. controls,
  756. $CURRENT_RPT,
  757. customizeCfg,
  758. 1,
  759. maxColRec,
  760. rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL],
  761. unitFactor
  762. );
  763. };
  764. JpcCrossTabResult.outputPreviewContent = function (
  765. rptTpl,
  766. bands,
  767. controls,
  768. $CURRENT_RPT,
  769. customizeCfg,
  770. maxRowRec,
  771. maxColRec,
  772. unitFactor
  773. ) {
  774. return this.private_OutputPreviewCommon(
  775. rptTpl,
  776. bands,
  777. controls,
  778. $CURRENT_RPT,
  779. customizeCfg,
  780. maxRowRec,
  781. maxColRec,
  782. rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_CONTENT],
  783. unitFactor
  784. );
  785. };
  786. JpcCrossTabResult.outputPreviewTabSum = function (
  787. rptTpl,
  788. bands,
  789. controls,
  790. $CURRENT_RPT,
  791. customizeCfg,
  792. maxRowRec,
  793. tabNodeName,
  794. unitFactor
  795. ) {
  796. return this.private_OutputPreviewCommon(
  797. rptTpl,
  798. bands,
  799. controls,
  800. $CURRENT_RPT,
  801. customizeCfg,
  802. maxRowRec,
  803. 1,
  804. rptTpl[JV.NODE_CROSS_INFO][tabNodeName],
  805. unitFactor
  806. );
  807. };
  808. // 交叉行合计
  809. JpcCrossTabResult.outputPreviewRowTabSum = function (
  810. rptTpl,
  811. bands,
  812. controls,
  813. $CURRENT_RPT,
  814. customizeCfg,
  815. maxRowRec,
  816. maxColRec,
  817. unitFactor
  818. ) {
  819. return this.private_OutputPreviewCommon(
  820. rptTpl,
  821. bands,
  822. controls,
  823. $CURRENT_RPT,
  824. customizeCfg,
  825. 1,
  826. maxColRec,
  827. rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_SUM],
  828. unitFactor
  829. );
  830. };
  831. JpcCrossTabResult.outputPreviewTabExt = function (
  832. rptTpl,
  833. bands,
  834. controls,
  835. $CURRENT_RPT,
  836. customizeCfg,
  837. maxColRec,
  838. unitFactor
  839. ) {
  840. //交叉行拓展
  841. return this.private_OutputPreviewCommon(
  842. rptTpl,
  843. bands,
  844. controls,
  845. $CURRENT_RPT,
  846. customizeCfg,
  847. 1,
  848. maxColRec,
  849. rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_EXT],
  850. unitFactor
  851. );
  852. };
  853. JpcCrossTabResult.outputPreviewSumTabExt = function (
  854. rptTpl,
  855. bands,
  856. controls,
  857. $CURRENT_RPT,
  858. customizeCfg,
  859. unitFactor
  860. ) {
  861. //交叉行拓展合计
  862. return this.private_OutputPreviewCommon(
  863. rptTpl,
  864. bands,
  865. controls,
  866. $CURRENT_RPT,
  867. customizeCfg,
  868. 1,
  869. 1,
  870. rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_SUM_EXT],
  871. unitFactor
  872. );
  873. };
  874. JpcCrossTabResult.private_OutputPreviewCommon = function (
  875. rptTpl,
  876. bands,
  877. controls,
  878. $CURRENT_RPT,
  879. customizeCfg,
  880. maxRowRec,
  881. maxColRec,
  882. tab,
  883. unitFactor
  884. ) {
  885. let me = this,
  886. rst = [];
  887. let band = tab ? bands[tab[JV.PROP_BAND_NAME]] : null;
  888. if (band) {
  889. let tab_fields = tab[JV.PROP_CROSS_FIELDS];
  890. for (let rowIdx = 0; rowIdx < maxRowRec; rowIdx++) {
  891. for (let i = 0; i < tab_fields.length; i++) {
  892. let tab_field = tab_fields[i];
  893. if (!tab_field[JV.PROP_HIDDEN]) {
  894. for (let colIdx = 0; colIdx < maxColRec; colIdx++) {
  895. if (tab_field[JV.PROP_IS_SERIAL]) {
  896. rst.push(
  897. me.outputTabField(
  898. band,
  899. tab_field,
  900. [rowIdx + 1],
  901. 0,
  902. -1,
  903. maxRowRec,
  904. rowIdx,
  905. maxColRec,
  906. colIdx,
  907. unitFactor,
  908. false,
  909. controls
  910. )
  911. );
  912. } else {
  913. rst.push(
  914. me.outputTabField(
  915. band,
  916. tab_field,
  917. null,
  918. -1,
  919. -1,
  920. maxRowRec,
  921. rowIdx,
  922. maxColRec,
  923. colIdx,
  924. unitFactor,
  925. false,
  926. controls
  927. )
  928. );
  929. }
  930. }
  931. }
  932. }
  933. if (tab[JV.PROP_TEXTS]) {
  934. for (let j = 0; j < tab[JV.PROP_TEXTS].length; j++) {
  935. for (let colIdx = 0; colIdx < maxColRec; colIdx++) {
  936. rst.push(
  937. JpcTextHelper.outputText(
  938. tab[JV.PROP_TEXTS][j],
  939. band,
  940. unitFactor,
  941. maxRowRec,
  942. rowIdx,
  943. maxColRec,
  944. colIdx,
  945. 1,
  946. 0
  947. )
  948. );
  949. }
  950. }
  951. }
  952. }
  953. }
  954. return rst;
  955. };
  956. JpcCrossTabResult.outputAsSimpleJSONPage = function (
  957. rptTpl,
  958. dataObj,
  959. page,
  960. bands,
  961. controls,
  962. $CURRENT_RPT,
  963. customizeCfg
  964. ) {
  965. let me = this,
  966. rst = [],
  967. tabRstLst = [];
  968. let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
  969. if (me.paging_option === JV.PAGING_OPTION_INFINITY) {
  970. /*
  971. let segIdx = page - 1;
  972. //1 calculate the band position
  973. JpcBandHelper.setBandArea(bands, rptTpl, me.pageStatusLst[page - 1]);
  974. //2. then reset the band height
  975. let tab = rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_CONTENT];
  976. let crossContentBand = bands[tab[JV.PROP_BAND_NAME]];
  977. let actH = JpcCrossTabHelper.getActualRowsHeight(bands, rptTpl, me.sortedRowSequence, page);
  978. let actW = JpcCrossTabHelper.getActualColsWidth(bands, rptTpl, me.sortedColSequence, page);
  979. let offsetY = actH - (crossContentBand.Bottom - crossContentBand.Top);
  980. let offsetX = actW - (crossContentBand.Right - crossContentBand.Left);
  981. JpcBandHelper.resetBandPos(rptTpl[JV.NODE_BAND_COLLECTION], bands, crossContentBand, offsetX, offsetY);
  982. //2.1 Row-Tab
  983. tabRstLst.push(me.outputRowTab(rptTpl, dataObj, page, bands, unitFactor, controls));
  984. //2.2 Col-Tab
  985. tabRstLst.push(me.outputColTab(rptTpl, dataObj, page, bands, unitFactor, controls));
  986. //2.3 Content-Tab
  987. tabRstLst.push(me.outputContent(rptTpl, dataObj, page, bands, unitFactor, controls));
  988. //2.4 Sum-Tab Row
  989. //2.4 Sum-tab Col
  990. tabRstLst.push(me.outputTabSum(rptTpl, dataObj, page, bands, unitFactor, JV.NODE_CROSS_COL_SUM, controls));
  991. //2.x row tab ext
  992. tabRstLst.push(me.outputTabExt(rptTpl, dataObj, page, bands, unitFactor, controls));
  993. tabRstLst.push(me.outputSumTabExt(rptTpl, dataObj, page, bands, unitFactor, segIdx, controls));
  994. //2.5 Discrete
  995. tabRstLst.push(JpcDiscreteHelper.outputDiscreteInfo(rptTpl[JV.NODE_CROSS_INFO][JV.NODE_DISCRETE_INFO], bands, dataObj, unitFactor, me.pageStatusLst[page - 1], segIdx, 1, 0, $CURRENT_RPT, customizeCfg));
  996. //*/
  997. } else {
  998. let segIdx = JpcCommonHelper.getSegIdxByPageIdx(page, me.page_seg_map);
  999. //1 calculate the band position
  1000. JpcBandHelper.setBandArea(bands, rptTpl, me.pageStatusLst[page - 1]);
  1001. //2. start to output detail-part
  1002. //2.1 Row-Tab
  1003. //tabRstLst.push(me.outputRowTab(rptTpl, dataObj, page, bands, unitFactor, controls, $CURRENT_RPT, customizeCfg));
  1004. tabRstLst.push(
  1005. me.outputRowTabCommon(
  1006. rptTpl,
  1007. dataObj,
  1008. page,
  1009. bands,
  1010. JV.NODE_CROSS_ROW,
  1011. me.row_fields_idx,
  1012. unitFactor,
  1013. controls,
  1014. $CURRENT_RPT,
  1015. customizeCfg
  1016. )
  1017. );
  1018. tabRstLst.push(
  1019. me.outputRowTabCommon(
  1020. rptTpl,
  1021. dataObj,
  1022. page,
  1023. bands,
  1024. JV.NODE_CROSS_ROW_AD_HOC,
  1025. me.row_fields_adhoc_idx,
  1026. unitFactor,
  1027. controls,
  1028. $CURRENT_RPT,
  1029. customizeCfg
  1030. )
  1031. );
  1032. //2.2 Col-Tab
  1033. tabRstLst.push(
  1034. me.outputColTab(
  1035. rptTpl,
  1036. dataObj,
  1037. page,
  1038. bands,
  1039. unitFactor,
  1040. controls,
  1041. $CURRENT_RPT,
  1042. customizeCfg
  1043. )
  1044. );
  1045. //2.3 Content-Tab
  1046. tabRstLst.push(
  1047. me.outputContent(
  1048. rptTpl,
  1049. dataObj,
  1050. page,
  1051. bands,
  1052. unitFactor,
  1053. controls,
  1054. $CURRENT_RPT,
  1055. customizeCfg
  1056. )
  1057. );
  1058. //2.4 Sum-Tab Row
  1059. // 新增的交叉行合计
  1060. tabRstLst.push(
  1061. me.outputTabSum(
  1062. rptTpl,
  1063. dataObj,
  1064. page,
  1065. bands,
  1066. unitFactor,
  1067. JV.NODE_CROSS_ROW_SUM,
  1068. controls,
  1069. $CURRENT_RPT,
  1070. customizeCfg
  1071. )
  1072. );
  1073. //2.4 Sum-tab Col
  1074. tabRstLst.push(
  1075. me.outputTabSum(
  1076. rptTpl,
  1077. dataObj,
  1078. page,
  1079. bands,
  1080. unitFactor,
  1081. JV.NODE_CROSS_COL_SUM,
  1082. controls,
  1083. $CURRENT_RPT,
  1084. customizeCfg
  1085. )
  1086. );
  1087. //2.x row tab ext
  1088. tabRstLst.push(
  1089. me.outputTabExt(
  1090. rptTpl,
  1091. dataObj,
  1092. page,
  1093. bands,
  1094. unitFactor,
  1095. controls,
  1096. $CURRENT_RPT,
  1097. customizeCfg
  1098. )
  1099. );
  1100. tabRstLst.push(
  1101. me.outputSumTabExt(
  1102. rptTpl,
  1103. dataObj,
  1104. page,
  1105. bands,
  1106. unitFactor,
  1107. segIdx,
  1108. controls,
  1109. $CURRENT_RPT,
  1110. customizeCfg
  1111. )
  1112. );
  1113. //2.5 Discrete
  1114. tabRstLst.push(
  1115. JpcDiscreteHelper.outputDiscreteInfo(
  1116. rptTpl[JV.NODE_CROSS_INFO][JV.NODE_DISCRETE_INFO],
  1117. bands,
  1118. dataObj,
  1119. unitFactor,
  1120. me.pageStatusLst[page - 1],
  1121. segIdx,
  1122. 1,
  1123. 0,
  1124. $CURRENT_RPT,
  1125. customizeCfg
  1126. )
  1127. );
  1128. }
  1129. for (let i = 0; i < tabRstLst.length; i++) {
  1130. rst = rst.concat(tabRstLst[i]);
  1131. tabRstLst[i] = null;
  1132. }
  1133. return rst;
  1134. };
  1135. JpcCrossTabResult.outputRowTabCommon = function (
  1136. rptTpl,
  1137. dataObj,
  1138. page,
  1139. bands,
  1140. tabStr,
  1141. rowFieldsIdxArr,
  1142. unitFactor,
  1143. controls,
  1144. $CURRENT_RPT,
  1145. customizeCfg
  1146. ) {
  1147. let me = this,
  1148. rst = [];
  1149. let tab = rptTpl[JV.NODE_CROSS_INFO][tabStr];
  1150. let band = tab ? bands[tab[JV.PROP_BAND_NAME]] : null;
  1151. if (band) {
  1152. let pageStatus = me.pageStatusLst[page - 1];
  1153. if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true) {
  1154. let tab_fields = tab[JV.PROP_CROSS_FIELDS];
  1155. let data_details = dataObj[JV.DATA_DETAIL_DATA];
  1156. let valuesIdx = me.dispValueIdxLst_Row[page - 1];
  1157. let serialsIdx = me.dispSerialIdxLst_Row[page - 1];
  1158. let flexiblePrecisionRefObj = null,
  1159. flexibleRefField = null,
  1160. precision_ref_data = null;
  1161. for (let i = 0; i < rowFieldsIdxArr.length; i++) {
  1162. let tab_field = tab_fields[i];
  1163. if (!tab_field[JV.PROP_HIDDEN]) {
  1164. let data_field = null;
  1165. let map_data_field = JE.F(
  1166. tab_field[JV.PROP_FIELD_ID],
  1167. $CURRENT_RPT
  1168. );
  1169. if (typeof rowFieldsIdxArr[i] !== "object") {
  1170. data_field = data_details[rowFieldsIdxArr[i]];
  1171. } else {
  1172. if (map_data_field) {
  1173. data_field = map_data_field[JV.PROP_AD_HOC_DATA];
  1174. }
  1175. }
  1176. let rows = valuesIdx.length;
  1177. for (let rowIdx = 0; rowIdx < rows; rowIdx++) {
  1178. if (
  1179. map_data_field &&
  1180. map_data_field[JV.PROP_PRECISION] &&
  1181. map_data_field.flexiblePrecisionRefObj
  1182. ) {
  1183. if (flexiblePrecisionRefObj === null) {
  1184. flexiblePrecisionRefObj = {};
  1185. flexibleRefField = JE.F(
  1186. map_data_field[JV.PROP_PRECISION][
  1187. JV.PROP_FLEXIBLE_REF_FILED_ID
  1188. ],
  1189. $CURRENT_RPT
  1190. );
  1191. precision_ref_data =
  1192. dataObj[map_data_field.DataNodeName][
  1193. flexibleRefField.DataSeq
  1194. ];
  1195. for (let decimalObj of map_data_field.flexiblePrecisionRefObj) {
  1196. flexiblePrecisionRefObj["refUnit_" + decimalObj.unit] =
  1197. decimalObj.decimal;
  1198. }
  1199. }
  1200. JpcFieldHelper.resetFlexibleFormat(
  1201. tab_field,
  1202. precision_ref_data,
  1203. flexiblePrecisionRefObj,
  1204. valuesIdx[rowIdx],
  1205. customizeCfg
  1206. );
  1207. } else {
  1208. if (rowIdx === 0)
  1209. JpcFieldHelper.resetFormat(
  1210. tab_field,
  1211. map_data_field,
  1212. customizeCfg
  1213. );
  1214. }
  1215. rst.push(
  1216. me.outputTabField(
  1217. band,
  1218. tab_field,
  1219. data_field,
  1220. valuesIdx[rowIdx],
  1221. serialsIdx[rowIdx],
  1222. rows,
  1223. rowIdx,
  1224. 1,
  1225. 0,
  1226. unitFactor,
  1227. true,
  1228. controls
  1229. )
  1230. );
  1231. }
  1232. }
  1233. }
  1234. }
  1235. }
  1236. return rst;
  1237. };
  1238. JpcCrossTabResult.outputColTab = function (
  1239. rptTpl,
  1240. dataObj,
  1241. page,
  1242. bands,
  1243. unitFactor,
  1244. controls,
  1245. $CURRENT_RPT,
  1246. customizeCfg
  1247. ) {
  1248. let me = this,
  1249. rst = [],
  1250. firstTextOutput = true;
  1251. let tab = rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL];
  1252. let band = bands[tab[JV.PROP_BAND_NAME]];
  1253. if (band) {
  1254. let pageStatus = me.pageStatusLst[page - 1];
  1255. if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true) {
  1256. let tab_fields = tab[JV.PROP_CROSS_FIELDS];
  1257. let data_details = dataObj[JV.DATA_DETAIL_DATA];
  1258. let valuesIdx = me.dispValueIdxLst_Col[page - 1];
  1259. let flexiblePrecisionRefObj = null,
  1260. flexibleRefField = null,
  1261. precision_ref_data = null;
  1262. for (let i = 0; i < me.col_fields_idx.length; i++) {
  1263. let tab_field = tab_fields[i];
  1264. if (!tab_field[JV.PROP_HIDDEN]) {
  1265. let mergedRst = [];
  1266. let data_field = null;
  1267. let map_data_field = JE.F(
  1268. tab_field[JV.PROP_FIELD_ID],
  1269. $CURRENT_RPT
  1270. );
  1271. if (typeof me.col_fields_idx[i] !== "object") {
  1272. data_field = data_details[me.col_fields_idx[i]];
  1273. } else {
  1274. if (map_data_field) {
  1275. data_field = map_data_field[JV.PROP_AD_HOC_DATA];
  1276. }
  1277. }
  1278. let cols = valuesIdx.length;
  1279. for (let colIdx = 0; colIdx < cols; colIdx++) {
  1280. if (
  1281. map_data_field &&
  1282. map_data_field[JV.PROP_PRECISION] &&
  1283. map_data_field.flexiblePrecisionRefObj
  1284. ) {
  1285. if (flexiblePrecisionRefObj === null) {
  1286. flexiblePrecisionRefObj = {};
  1287. flexibleRefField = JE.F(
  1288. map_data_field[JV.PROP_PRECISION][
  1289. JV.PROP_FLEXIBLE_REF_FILED_ID
  1290. ],
  1291. $CURRENT_RPT
  1292. );
  1293. precision_ref_data =
  1294. dataObj[map_data_field.DataNodeName][
  1295. flexibleRefField.DataSeq
  1296. ];
  1297. for (let decimalObj of map_data_field.flexiblePrecisionRefObj) {
  1298. flexiblePrecisionRefObj["refUnit_" + decimalObj.unit] =
  1299. decimalObj.decimal;
  1300. }
  1301. }
  1302. JpcFieldHelper.resetFlexibleFormat(
  1303. tab_field,
  1304. precision_ref_data,
  1305. flexiblePrecisionRefObj,
  1306. valuesIdx[colIdx],
  1307. customizeCfg
  1308. );
  1309. } else {
  1310. if (colIdx === 0)
  1311. JpcFieldHelper.resetFormat(
  1312. tab_field,
  1313. map_data_field,
  1314. customizeCfg
  1315. );
  1316. }
  1317. mergedRst.push(
  1318. me.outputTabField(
  1319. band,
  1320. tab_field,
  1321. data_field,
  1322. valuesIdx[colIdx],
  1323. -1,
  1324. 1,
  1325. 0,
  1326. cols,
  1327. colIdx,
  1328. unitFactor,
  1329. false,
  1330. controls
  1331. )
  1332. );
  1333. //rst.push(me.outputTabField(band, tab_field, data_field, valuesIdx[colIdx], -1, 1, 0, cols, colIdx, unitFactor, false, controls));
  1334. //2. output texts
  1335. if (firstTextOutput) {
  1336. if (tab[JV.PROP_TEXT]) {
  1337. // mergedRst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXT], band, unitFactor, 1, 0, cols, colIdx, 1, 0));
  1338. rst.push(
  1339. JpcTextHelper.outputText(
  1340. tab[JV.PROP_TEXT],
  1341. band,
  1342. unitFactor,
  1343. 1,
  1344. 0,
  1345. cols,
  1346. colIdx,
  1347. 1,
  1348. 0
  1349. )
  1350. );
  1351. }
  1352. if (tab[JV.PROP_TEXTS]) {
  1353. for (let j = 0; j < tab[JV.PROP_TEXTS].length; j++) {
  1354. // mergedRst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXTS][j], band, unitFactor, 1, 0, cols, colIdx, 1, 0));
  1355. rst.push(
  1356. JpcTextHelper.outputText(
  1357. tab[JV.PROP_TEXTS][j],
  1358. band,
  1359. unitFactor,
  1360. 1,
  1361. 0,
  1362. cols,
  1363. colIdx,
  1364. 1,
  1365. 0
  1366. )
  1367. );
  1368. }
  1369. }
  1370. }
  1371. }
  1372. firstTextOutput = false;
  1373. //判断是否需要合并
  1374. if (tab_field[JV.PROP_IS_MERGE] && mergedRst.length > 1) {
  1375. let lastCell = mergedRst[mergedRst.length - 1];
  1376. for (
  1377. let mergeIdx = mergedRst.length - 2;
  1378. mergeIdx >= 0;
  1379. mergeIdx--
  1380. ) {
  1381. if (
  1382. lastCell[JV.PROP_VALUE] === mergedRst[mergeIdx][JV.PROP_VALUE]
  1383. ) {
  1384. mergedRst[mergeIdx][JV.PROP_AREA][JV.PROP_RIGHT] =
  1385. lastCell[JV.PROP_AREA][JV.PROP_RIGHT];
  1386. mergedRst.splice(mergeIdx + 1, 1);
  1387. }
  1388. lastCell = mergedRst[mergeIdx];
  1389. }
  1390. }
  1391. rst = rst.concat(mergedRst);
  1392. }
  1393. }
  1394. }
  1395. }
  1396. return rst;
  1397. };
  1398. JpcCrossTabResult.outputContent = function (
  1399. rptTpl,
  1400. dataObj,
  1401. page,
  1402. bands,
  1403. unitFactor,
  1404. controls,
  1405. $CURRENT_RPT,
  1406. customizeCfg
  1407. ) {
  1408. let me = this,
  1409. rst = [];
  1410. let tab = rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_CONTENT];
  1411. let band = bands[tab[JV.PROP_BAND_NAME]];
  1412. if (band) {
  1413. let pageStatus = me.pageStatusLst[page - 1];
  1414. if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true) {
  1415. let tab_fields = tab[JV.PROP_CROSS_FIELDS];
  1416. let data_details = dataObj[JV.DATA_DETAIL_DATA];
  1417. let contentValuesIdx = me.dispValueIdxLst_Content[page - 1];
  1418. let flexiblePrecisionRefObj = null,
  1419. flexibleRefField = null,
  1420. precision_ref_data = null;
  1421. for (let i = 0; i < tab_fields.length; i++) {
  1422. let tab_field = tab_fields[i];
  1423. let data_field = null;
  1424. let map_data_field = JE.F(tab_field[JV.PROP_FIELD_ID], $CURRENT_RPT);
  1425. if (typeof me.content_fields_idx[i] !== "object") {
  1426. data_field = data_details[me.content_fields_idx[i]];
  1427. } else {
  1428. if (map_data_field) {
  1429. data_field = map_data_field[JV.PROP_AD_HOC_DATA];
  1430. }
  1431. }
  1432. if (!tab_field[JV.PROP_HIDDEN]) {
  1433. let rows = contentValuesIdx.length;
  1434. for (let rowIdx = 0; rowIdx < rows; rowIdx++) {
  1435. let cols = contentValuesIdx[rowIdx].length;
  1436. for (let colIdx = 0; colIdx < cols; colIdx++) {
  1437. if (
  1438. map_data_field &&
  1439. map_data_field[JV.PROP_PRECISION] &&
  1440. map_data_field.flexiblePrecisionRefObj
  1441. ) {
  1442. if (flexiblePrecisionRefObj === null) {
  1443. flexiblePrecisionRefObj = {};
  1444. flexibleRefField = JE.F(
  1445. map_data_field[JV.PROP_PRECISION][
  1446. JV.PROP_FLEXIBLE_REF_FILED_ID
  1447. ],
  1448. $CURRENT_RPT
  1449. );
  1450. precision_ref_data =
  1451. dataObj[map_data_field.DataNodeName][
  1452. flexibleRefField.DataSeq
  1453. ];
  1454. for (let decimalObj of map_data_field.flexiblePrecisionRefObj) {
  1455. flexiblePrecisionRefObj["refUnit_" + decimalObj.unit] =
  1456. decimalObj.decimal;
  1457. }
  1458. }
  1459. JpcFieldHelper.resetFlexibleFormat(
  1460. tab_field,
  1461. precision_ref_data,
  1462. flexiblePrecisionRefObj,
  1463. contentValuesIdx[rowIdx][colIdx],
  1464. customizeCfg
  1465. );
  1466. } else {
  1467. if (colIdx === 0)
  1468. JpcFieldHelper.resetFormat(
  1469. tab_field,
  1470. map_data_field,
  1471. customizeCfg
  1472. );
  1473. }
  1474. rst.push(
  1475. me.outputTabField(
  1476. band,
  1477. tab_field,
  1478. data_field,
  1479. contentValuesIdx[rowIdx][colIdx],
  1480. -1,
  1481. rows,
  1482. rowIdx,
  1483. cols,
  1484. colIdx,
  1485. unitFactor,
  1486. true,
  1487. controls
  1488. )
  1489. );
  1490. }
  1491. }
  1492. }
  1493. }
  1494. }
  1495. }
  1496. return rst;
  1497. };
  1498. JpcCrossTabResult.outputTabSum = function (
  1499. rptTpl,
  1500. dataObj,
  1501. page,
  1502. bands,
  1503. unitFactor,
  1504. tabNodeName,
  1505. controls,
  1506. $CURRENT_RPT,
  1507. customizeCfg
  1508. ) {
  1509. let me = this,
  1510. rst = [],
  1511. tab = rptTpl[JV.NODE_CROSS_INFO][tabNodeName],
  1512. band = bands[tab[JV.PROP_BAND_NAME]];
  1513. if (band) {
  1514. let pageStatus = me.pageStatusLst[page - 1];
  1515. if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true) {
  1516. let tab_fields = tab[JV.PROP_CROSS_FIELDS];
  1517. for (let i = 0; i < me.dispSumValueLst_Col[page - 1].length; i++) {
  1518. if (i === 0) {
  1519. for (let tfIdx = 0; tfIdx < tab_fields.length; tfIdx++) {
  1520. let map_data_field = JE.F(
  1521. tab_fields[tfIdx][JV.PROP_FIELD_ID],
  1522. $CURRENT_RPT
  1523. );
  1524. JpcFieldHelper.resetFormat(
  1525. tab_fields[tfIdx],
  1526. map_data_field,
  1527. customizeCfg
  1528. );
  1529. }
  1530. }
  1531. if (me.dispSumValueLst_Col[page - 1][i] !== null) {
  1532. for (
  1533. let j = 0;
  1534. j < me.dispSumValueLst_Col[page - 1][i].length;
  1535. j++
  1536. ) {
  1537. let tab_field = tab_fields[j];
  1538. let val = me.dispSumValueLst_Col[page - 1][i][j];
  1539. let cellItem = JpcCommonOutputHelper.createCommonOutput(
  1540. tab_field,
  1541. val,
  1542. controls
  1543. );
  1544. cellItem[JV.PROP_AREA] = JpcAreaHelper.outputArea(
  1545. tab_field[JV.PROP_AREA],
  1546. band,
  1547. unitFactor,
  1548. me.dispSumValueLst_Col[page - 1].length,
  1549. i,
  1550. 1,
  1551. 0,
  1552. 1,
  1553. 0,
  1554. true,
  1555. false
  1556. );
  1557. rst.push(cellItem);
  1558. }
  1559. } else {
  1560. let sumL = 1;
  1561. for (let si = 0; si < me.dispSumValueLst_Col.length; si++) {
  1562. if (me.dispSumValueLst_Col[si][0] !== null) {
  1563. sumL = me.dispSumValueLst_Col[si][0].length;
  1564. break;
  1565. }
  1566. }
  1567. for (let j = 0; j < sumL; j++) {
  1568. let tab_field = tab_fields[j];
  1569. let val = null;
  1570. let cellItem = JpcCommonOutputHelper.createCommonOutput(
  1571. tab_field,
  1572. val,
  1573. controls
  1574. );
  1575. cellItem[JV.PROP_AREA] = JpcAreaHelper.outputArea(
  1576. tab_field[JV.PROP_AREA],
  1577. band,
  1578. unitFactor,
  1579. me.dispSumValueLst_Col[page - 1].length,
  1580. i,
  1581. 1,
  1582. 0,
  1583. 1,
  1584. 0,
  1585. true,
  1586. false
  1587. );
  1588. rst.push(cellItem);
  1589. }
  1590. }
  1591. }
  1592. }
  1593. }
  1594. return rst;
  1595. };
  1596. JpcCrossTabResult.outputTabExt = function (
  1597. rptTpl,
  1598. dataObj,
  1599. page,
  1600. bands,
  1601. unitFactor,
  1602. controls,
  1603. $CURRENT_RPT,
  1604. customizeCfg
  1605. ) {
  1606. let me = this,
  1607. rst = [],
  1608. firstTextOutput = true,
  1609. tab = rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_EXT];
  1610. let band = bands[tab[JV.PROP_BAND_NAME]];
  1611. if (band) {
  1612. let pageStatus = me.pageStatusLst[page - 1];
  1613. if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true) {
  1614. let tab_fields = tab[JV.PROP_CROSS_FIELDS],
  1615. data_details = dataObj[JV.DATA_DETAIL_DATA],
  1616. valuesIdx = me.dispValueIdxLst_Col[page - 1];
  1617. for (let i = 0; i < me.row_extension_fields_idx.length; i++) {
  1618. let tab_field = tab_fields[i];
  1619. let data_field = null;
  1620. let map_data_field = JE.F(tab_field[JV.PROP_FIELD_ID], $CURRENT_RPT);
  1621. if (typeof me.row_extension_fields_idx[i] !== "object") {
  1622. data_field = data_details[me.row_extension_fields_idx[i]];
  1623. } else {
  1624. if (map_data_field) {
  1625. data_field = map_data_field[JV.PROP_AD_HOC_DATA];
  1626. }
  1627. }
  1628. if (!tab_field[JV.PROP_HIDDEN]) {
  1629. let cols = valuesIdx.length;
  1630. for (let colIdx = 0; colIdx < cols; colIdx++) {
  1631. if (colIdx === 0)
  1632. JpcFieldHelper.resetFormat(
  1633. tab_field,
  1634. map_data_field,
  1635. customizeCfg
  1636. );
  1637. rst.push(
  1638. me.outputTabField(
  1639. band,
  1640. tab_field,
  1641. data_field,
  1642. valuesIdx[colIdx],
  1643. -1,
  1644. 1,
  1645. 0,
  1646. cols,
  1647. colIdx,
  1648. unitFactor,
  1649. false,
  1650. controls
  1651. )
  1652. );
  1653. //2. output texts if has
  1654. if (firstTextOutput) {
  1655. if (tab[JV.PROP_TEXT]) {
  1656. rst.push(
  1657. JpcTextHelper.outputText(
  1658. tab[JV.PROP_TEXT],
  1659. band,
  1660. unitFactor,
  1661. 1,
  1662. 0,
  1663. cols,
  1664. colIdx,
  1665. 1,
  1666. 0
  1667. )
  1668. );
  1669. }
  1670. if (tab[JV.PROP_TEXTS]) {
  1671. for (let j = 0; j < tab[JV.PROP_TEXTS].length; j++) {
  1672. rst.push(
  1673. JpcTextHelper.outputText(
  1674. tab[JV.PROP_TEXTS][j],
  1675. band,
  1676. unitFactor,
  1677. 1,
  1678. 0,
  1679. cols,
  1680. colIdx,
  1681. 1,
  1682. 0
  1683. )
  1684. );
  1685. }
  1686. }
  1687. }
  1688. }
  1689. firstTextOutput = false;
  1690. }
  1691. }
  1692. }
  1693. }
  1694. return rst;
  1695. };
  1696. JpcCrossTabResult.outputSumTabExt = function (
  1697. rptTpl,
  1698. dataObj,
  1699. page,
  1700. bands,
  1701. unitFactor,
  1702. segIdx,
  1703. controls,
  1704. $CURRENT_RPT,
  1705. customizeCfg
  1706. ) {
  1707. let me = this,
  1708. rst = [],
  1709. tab = rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_SUM_EXT];
  1710. let band = bands[tab[JV.PROP_BAND_NAME]];
  1711. if (band) {
  1712. let pageStatus = me.pageStatusLst[page - 1];
  1713. if (
  1714. pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true &&
  1715. pageStatus[JV.STATUS_CROSS_ROW_END] === true
  1716. ) {
  1717. let tab_fields = tab[JV.PROP_CROSS_FIELDS],
  1718. data_details = dataObj[JV.DATA_DETAIL_DATA],
  1719. data_fields = [];
  1720. for (let i = 0; i < me.row_sum_extension_fields_idx.length; i++) {
  1721. // let data_field = data_details[me.row_sum_extension_fields_idx[i]];
  1722. let tab_field = tab_fields[i];
  1723. let data_field = null;
  1724. let map_data_field = JE.F(tab_field[JV.PROP_FIELD_ID], $CURRENT_RPT);
  1725. if (typeof me.row_sum_extension_fields_idx[i] !== "object") {
  1726. data_field = data_details[me.row_sum_extension_fields_idx[i]];
  1727. } else {
  1728. if (map_data_field) {
  1729. data_field = map_data_field[JV.PROP_AD_HOC_DATA];
  1730. }
  1731. }
  1732. JpcFieldHelper.resetFormat(tab_field, map_data_field, customizeCfg);
  1733. data_fields.push(data_field);
  1734. }
  1735. //2. initialize grand total value
  1736. let rowGrandTotal = [];
  1737. for (let di = 0; di < data_fields.length; di++) {
  1738. rowGrandTotal[di] = 0.0;
  1739. //3. start to sum
  1740. for (let i = 0; i < me.sortedColSequence[segIdx].length; i++) {
  1741. //me.sortedColSequence[segIdx][i][0] //this is the data field value index!
  1742. rowGrandTotal[di] =
  1743. rowGrandTotal[di] +
  1744. 1.0 *
  1745. JpcFieldHelper.getValue(
  1746. data_fields[di],
  1747. me.sortedColSequence[segIdx][i][0]
  1748. );
  1749. }
  1750. }
  1751. //4. output
  1752. for (let di = 0; di < tab_fields.length; di++) {
  1753. let tab_field = tab_fields[di];
  1754. if (!tab_field[JV.PROP_HIDDEN]) {
  1755. let val = rowGrandTotal[di];
  1756. let cellItem = JpcCommonOutputHelper.createCommonOutput(
  1757. tab_field,
  1758. val,
  1759. controls
  1760. );
  1761. cellItem[JV.PROP_AREA] = JpcAreaHelper.outputArea(
  1762. tab_field[JV.PROP_AREA],
  1763. band,
  1764. unitFactor,
  1765. 1,
  1766. 0,
  1767. 1,
  1768. 0,
  1769. 1,
  1770. 0,
  1771. false,
  1772. false
  1773. );
  1774. rst.push(cellItem);
  1775. }
  1776. }
  1777. //output texts if has
  1778. if (tab[JV.PROP_TEXT]) {
  1779. rst.push(
  1780. JpcTextHelper.outputText(
  1781. tab[JV.PROP_TEXT],
  1782. band,
  1783. unitFactor,
  1784. 1,
  1785. 0,
  1786. 1,
  1787. 0,
  1788. 1,
  1789. 0
  1790. )
  1791. );
  1792. }
  1793. if (tab[JV.PROP_TEXTS]) {
  1794. for (let j = 0; j < tab[JV.PROP_TEXTS].length; j++) {
  1795. rst.push(
  1796. JpcTextHelper.outputText(
  1797. tab[JV.PROP_TEXTS][j],
  1798. band,
  1799. unitFactor,
  1800. 1,
  1801. 0,
  1802. 1,
  1803. 0,
  1804. 1,
  1805. 0
  1806. )
  1807. );
  1808. }
  1809. }
  1810. }
  1811. }
  1812. return rst;
  1813. };
  1814. JpcCrossTabResult.outputTabField = function (
  1815. band,
  1816. tab_field,
  1817. data_field,
  1818. valueIdx,
  1819. serialIdx,
  1820. rows,
  1821. rowIdx,
  1822. cols,
  1823. colIdx,
  1824. unitFactor,
  1825. isRow,
  1826. controls
  1827. ) {
  1828. let rst = null;
  1829. if (
  1830. isRow === true &&
  1831. tab_field[JV.PROP_IS_SERIAL] &&
  1832. tab_field[JV.PROP_IS_SERIAL] === true
  1833. ) {
  1834. if (serialIdx >= 0) {
  1835. rst = JpcCommonOutputHelper.createCommonOutput(
  1836. tab_field,
  1837. serialIdx + 1
  1838. );
  1839. } else
  1840. rst = JpcCommonOutputHelper.createCommonOutput(tab_field, "", controls);
  1841. } else {
  1842. rst = JpcCommonOutputHelper.createCommonOutput(
  1843. tab_field,
  1844. JpcFieldHelper.getValue(data_field, valueIdx),
  1845. controls
  1846. );
  1847. }
  1848. //position
  1849. if (isRow === true) {
  1850. rst[JV.PROP_AREA] = JpcAreaHelper.outputArea(
  1851. tab_field[JV.PROP_AREA],
  1852. band,
  1853. unitFactor,
  1854. rows,
  1855. rowIdx,
  1856. cols,
  1857. colIdx,
  1858. 1,
  1859. 0,
  1860. true,
  1861. false
  1862. );
  1863. } else {
  1864. rst[JV.PROP_AREA] = JpcAreaHelper.outputArea(
  1865. tab_field[JV.PROP_AREA],
  1866. band,
  1867. unitFactor,
  1868. rows,
  1869. rowIdx,
  1870. cols,
  1871. colIdx,
  1872. 1,
  1873. 0,
  1874. false,
  1875. false
  1876. );
  1877. }
  1878. return rst;
  1879. };
  1880. return JpcCrossTabResult;
  1881. };
  1882. module.exports = new JpcCrossTabSrv();