let JV = require('./jpc_value_define'); let JE = require('./jpc_rte'); let JpcFieldHelper = require('./helper/jpc_helper_field'); let JpcBandHelper = require('./helper/jpc_helper_band'); let JpcBand = require('./jpc_band'); let JpcFlowTabHelper = require('./helper/jpc_helper_flow_tab'); let JpcCommonHelper = require('./helper/jpc_helper_common'); let JpcDiscreteHelper = require('./helper/jpc_helper_discrete'); let JpcTextHelper = require('./helper/jpc_helper_text'); let JpcCommonOutputHelper = require('./helper/jpc_helper_common_output'); let JpcAreaHelper = require('./helper/jpc_helper_area'); let JpcFlowTabSrv = function(){}; //let grpPageInfo = {"segGrpRecStartIdx": 0, "insertedGrpRecAmt": 0, "preAddPageGrpInfo": null}; JpcFlowTabSrv.prototype.createNew = function(){ function private_addPageValue(ValuedIdxLst, sortedSequence, grpSequenceInfo, startRecIdx, maxRecPerPage,page_seg_map, segIdx, pageIdx, grpPageInfo, isFollow) { let vIdx = [], preAmt = 0, insertedGrpAmt = 0, grp_lines = 0; if (grpSequenceInfo && grpPageInfo) { //grpPageInfo[JV.PROP_INSERTED_GRP_REC] = 0; if (grpPageInfo[JV.PROP_PRE_ADD_GRP_REC_INFO].length > 0) { for (let grpLineIdx of grpPageInfo[JV.PROP_PRE_ADD_GRP_REC_INFO]) { vIdx.push([(isFollow)?JV.TYPE_FOLLOW_MODE:-1, JV.DISPLAY_VAL_TYPE_GROUP, grpPageInfo[JV.PROP_SEG_GRP_IDX], grpLineIdx]); } grpPageInfo[JV.PROP_SEG_GRP_IDX]++; } preAmt = grpPageInfo[JV.PROP_PRE_ADD_GRP_REC_INFO].length; grpPageInfo[JV.PROP_PRE_ADD_GRP_REC_INFO] = []; grp_lines = grpPageInfo[JV.PROP_GRP_LINES]; } for (let vi = 0; (vi + insertedGrpAmt * grp_lines) < maxRecPerPage - preAmt; vi++) { if (grpSequenceInfo && grpPageInfo) { if ((startRecIdx + vi) === grpSequenceInfo[grpPageInfo[JV.PROP_SEG_GRP_IDX]]) { //表示这里要插入grouping信息啦! //1. 首先push正常的记录 vIdx.push([(isFollow)?JV.TYPE_FOLLOW_MODE:-1, JV.DISPLAY_VAL_TYPE_NORMAL, sortedSequence[startRecIdx + vi]]); //2. 然后就要push grouping记录了 let hasFullGrp = true; for (let i = 0; i < grp_lines; i++) { if ( ((vi + insertedGrpAmt * grp_lines) + i + 1) >= (maxRecPerPage - preAmt)) { for (let j = i; j < grp_lines; j++) { grpPageInfo[JV.PROP_PRE_ADD_GRP_REC_INFO].push(j); } //准备要跳出去了 hasFullGrp = false; break; } else { vIdx.push([(isFollow)?JV.TYPE_FOLLOW_MODE:-1, JV.DISPLAY_VAL_TYPE_GROUP, grpPageInfo[JV.PROP_SEG_GRP_IDX], i]); } } //3. 进位下一个group信息所在位置 if (hasFullGrp) { grpPageInfo[JV.PROP_INSERTED_GRP_REC]++; insertedGrpAmt++; grpPageInfo[JV.PROP_SEG_GRP_IDX]++; } else { break; } } else { if (sortedSequence.length > startRecIdx + vi) { vIdx.push([(isFollow)?JV.TYPE_FOLLOW_MODE:-1, JV.DISPLAY_VAL_TYPE_NORMAL, sortedSequence[startRecIdx + vi]]); } else { vIdx.push([(isFollow)?JV.TYPE_FOLLOW_MODE:-1, JV.DISPLAY_VAL_TYPE_NORMAL, JV.BLANK_VALUE_INDEX]); } } } else { if (sortedSequence.length > startRecIdx + vi) { vIdx.push([(isFollow)?JV.TYPE_FOLLOW_MODE:-1, JV.DISPLAY_VAL_TYPE_NORMAL, sortedSequence[startRecIdx + vi]]); } else { vIdx.push([(isFollow)?JV.TYPE_FOLLOW_MODE:-1, JV.DISPLAY_VAL_TYPE_NORMAL, JV.BLANK_VALUE_INDEX]); } } } page_seg_map.push([pageIdx, segIdx]); ValuedIdxLst.push(vIdx); } let JpcFlowTabResult = {}; JpcFlowTabResult.initialize = function(isEx) { let me = this; me.isEx = isEx; me.paging_option = JV.PAGING_OPTION_NORMAL; me.segments = []; me.dispValueIdxLst = []; me.page_seg_map = []; me.disp_fields_idx = []; me.seg_sum_fields_idx = []; me.seg_sum_tab_fields = []; me.page_sum_fields_idx = []; me.page_sum_tab_fields = []; me.group_fields = []; me.group_sum_fields = []; me.group_sum_values = null; me.group_node_info = null; //记录在哪个seg及到哪条记录后有group sum信息 me.group_lines_amt = 0; //每group一次占用多少行,计算page信息会用到 me.pageStatusLst = []; me.groupSumValLst = []; me.segSumValLst = []; me.pageSumValLst = []; me.multiCols = 1; me.pagesAmt = 0; }; JpcFlowTabResult.sorting = function(rptTpl, dataObj, dataSeq) { let me = this; let FLOW_NODE_STR = me.isEx?JV.NODE_FLOW_INFO_EX:JV.NODE_FLOW_INFO; JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_SEG_SUM][JV.PROP_SUM_FIELDS], me.seg_sum_tab_fields, me.seg_sum_fields_idx, me.isEx); JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_PAGE_SUM][JV.PROP_SUM_FIELDS], me.page_sum_tab_fields, me.page_sum_fields_idx, me.isEx); JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_GROUP][JV.PROP_GROUP_FIELDS], me.group_fields, null, me.isEx); JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_GROUP][JV.PROP_SUM_FIELDS], me.group_sum_fields, null, me.isEx); for (let si = 0; si < dataSeq.length; si++) { me.segments.push(dataSeq[si].slice(0)); } //pre-sum the data(for seg sum display) let data_details = me.isEx?dataObj[JV.DATA_DETAIL_DATA_EX]:dataObj[JV.DATA_DETAIL_DATA], data_fields = []; for (let i = 0; i < me.seg_sum_fields_idx.length; i++) { let data_field = data_details[me.seg_sum_fields_idx[i]]; data_fields.push(data_field); } for (let i = 0; i < me.segments.length; i++) { //seg level if (me.segments[i].length > 0) { let rowGrandTotal = []; for (let di = 0; di < data_fields.length; di++) { rowGrandTotal.push(0.0); for (let j = 0; j < me.segments[i].length; j++) { //3. start to sum rowGrandTotal[di] = rowGrandTotal[di] + 1.0 * JpcFieldHelper.getValue(data_fields[di], me.segments[i][j]); } } me.segSumValLst.push(rowGrandTotal); } } }; JpcFlowTabResult.sumUpGrp = function ($CURRENT_RPT, dataObj, segIdx, preGrpIdx, nexGrpIdx) { let me = this, segDataIdx = me.segments[segIdx]; for (let j = 0; j < me.group_sum_fields.length; j++) { let sum_field = JE.F(me.group_sum_fields[j][JV.PROP_FIELD_ID], $CURRENT_RPT); if (sum_field) { let data_field = null; if (sum_field[JV.PROP_AD_HOC_DATA]) { data_field = sum_field[JV.PROP_AD_HOC_DATA] } else { data_field = dataObj[sum_field.DataNodeName][sum_field.DataSeq]; } let sumV = 0; for (let si = preGrpIdx; si <= nexGrpIdx; si++) { sumV += JpcFieldHelper.getValue(data_field, segDataIdx[si]); } // me.group_sum_values[segIdx][j].push(sumV); me.group_sum_values[segIdx][me.group_sum_fields[j][JV.PROP_SUM_KEY]].push(sumV); } } me.group_node_info[segIdx].push(nexGrpIdx); }; JpcFlowTabResult.setupGroupingData = function (rptTpl, dataObj, $CURRENT_RPT) { let me = this; if (me.group_fields.length > 0 && me.group_sum_fields.length > 0) { me.group_sum_values = []; me.group_node_info = []; let CURRENT_FLOW_INFO = (me.isEx)?JV.NODE_FLOW_INFO_EX:JV.NODE_FLOW_INFO; me.group_lines_amt = rptTpl[CURRENT_FLOW_INFO][JV.NODE_FLOW_GROUP][JV.PROP_GROUP_LINES].length; // let preGrpIdx = 0, nexGrpIdx = 0; for (let segIdx = 0; segIdx < me.segments.length; segIdx++) { let segDataIdx = me.segments[segIdx]; // me.group_sum_values.push([]); me.group_sum_values.push({}); me.group_node_info.push([]); for (let j = 0; j < me.group_sum_fields.length; j++) { // me.group_sum_values[segIdx].push([]); me.group_sum_values[segIdx][me.group_sum_fields[j][JV.PROP_SUM_KEY]] = []; // me.group_node_info[segIdx].push([]); } for (let di = 0; di < segDataIdx.length; di++) { let hasDiff = false; if (di > 1) { for (let i = 0; i < me.group_fields.length; i++) { let grp_field = JE.F(me.group_fields[i][JV.PROP_FIELD_ID], $CURRENT_RPT); if (grp_field) { let data_field = null; if (grp_field[JV.PROP_AD_HOC_DATA]) { data_field = grp_field[JV.PROP_AD_HOC_DATA] } else { data_field = dataObj[grp_field.DataNodeName][grp_field.DataSeq]; } let v1 = JpcFieldHelper.getValue(data_field, segDataIdx[di]), v2 = JpcFieldHelper.getValue(data_field, segDataIdx[di - 1]); if (v1 !== v2) { hasDiff = true; break; } } } } if (hasDiff) { //then sum up the fields me.sumUpGrp($CURRENT_RPT, dataObj, segIdx, preGrpIdx, nexGrpIdx); nexGrpIdx = di; preGrpIdx = di; if (di === segDataIdx.length - 1) { me.sumUpGrp($CURRENT_RPT, dataObj, segIdx, preGrpIdx, nexGrpIdx); } } else if (di === segDataIdx.length - 1) { me.sumUpGrp($CURRENT_RPT, dataObj, segIdx, preGrpIdx, di); } else { nexGrpIdx = di; } } } } }; JpcFlowTabResult.preSetupPages = function (rptTpl, dataObj, defProperties, option, $CURRENT_RPT, followTabEx) { //换一种思路来整理流水式数据 let me = this, rst = 1, counterRowRec = 0, counterRowRecEx = 0, maxRowRec = 1, pageIdx = 0, currentRecAmt = 0; me.setupGroupingData(rptTpl, dataObj, $CURRENT_RPT); if (followTabEx) { followTabEx.setupGroupingData(rptTpl, dataObj, $CURRENT_RPT); } me.paging_option = option||JV.PAGING_OPTION_NORMAL; let CURRENT_FLOW_INFO = (me.isEx)?JV.NODE_FLOW_INFO_EX:JV.NODE_FLOW_INFO; JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[CURRENT_FLOW_INFO][JV.NODE_FLOW_CONTENT][JV.PROP_FLOW_FIELDS], null, me.disp_fields_idx, me.isEx); if (me.paging_option === JV.PAGING_OPTION_INFINITY) { rst = me.segments.length; let pageStatus = [true, true, false, true, true, true, false, false]; for (let segIdx = 0; segIdx < me.segments.length; segIdx++) { if (segIdx === me.segments.length - 1) { pageStatus[JV.STATUS_REPORT_END] = true; } if (segIdx > 0) { pageStatus[JV.STATUS_REPORT_START] = false; } me.pageStatusLst.push(pageStatus.slice(0)); pageIdx++; let grpSeqInfo = (me.group_node_info)?me.group_node_info[segIdx]:null; private_addPageValue(me.dispValueIdxLst, me.segments[segIdx], grpSeqInfo, 0, me.segments[segIdx].length, me.page_seg_map, segIdx, pageIdx, null, false); } //目前不支持flowTabEx } else { let bands = JpcBand.createNew(rptTpl, defProperties); let pageStatus = [true, true, false, true, false, false, false, false]; if (me.isEx) { pageStatus[JV.STATUS_REPORT_START] = false; } if (rptTpl[CURRENT_FLOW_INFO][JV.PROP_MULTI_COLUMN]) { me.multiCols = 1 * rptTpl[CURRENT_FLOW_INFO][JV.PROP_MULTI_COLUMN]; } let grpPageInfo = {}; function private_resetBandArea() { JpcBandHelper.setBandArea(bands, rptTpl, pageStatus, !me.isEx, me.isEx); maxRowRec = JpcFlowTabHelper.getMaxRowsPerPage(bands, rptTpl, me.isEx); } function private_addPage(segIdx, grpSeqInfo, isFollow, isMix, mixSplitPoint) { private_resetBandArea(); me.pageStatusLst.push(pageStatus.slice(0)); currentRecAmt += maxRowRec; pageIdx++; if (isMix) { //先处理上半部分 private_addPageValue(me.dispValueIdxLst, me.segments[segIdx], grpSeqInfo, counterRowRec, mixSplitPoint,me.page_seg_map, segIdx, pageIdx, grpPageInfo, false); for (let dv of me.dispValueIdxLst[me.dispValueIdxLst.length - 1]) { if (dv[1] === JV.DISPLAY_VAL_TYPE_NORMAL) counterRowRec++; } //再处理下半部分 private_addPageValue(me.dispValueIdxLst, followTabEx.segments[segIdx], null, counterRowRecEx, maxRowRec - mixSplitPoint, me.page_seg_map, segIdx, pageIdx, null, true); for (let dv of me.dispValueIdxLst[me.dispValueIdxLst.length - 1]) { if (dv[1] === JV.DISPLAY_VAL_TYPE_NORMAL) counterRowRecEx++; } //合并到一页中 me.page_seg_map.splice(me.page_seg_map.length - 1, 1); let vl = me.dispValueIdxLst[me.dispValueIdxLst.length - 2]; for (let item of me.dispValueIdxLst[me.dispValueIdxLst.length - 1]) { vl.push(item); } me.dispValueIdxLst.splice(me.dispValueIdxLst.length - 1, 1); } else if (isFollow) { private_addPageValue(me.dispValueIdxLst, followTabEx.segments[segIdx], null, counterRowRecEx, maxRowRec, me.page_seg_map, segIdx, pageIdx, null, true); for (let dv of me.dispValueIdxLst[me.dispValueIdxLst.length - 1]) { if (dv[1] === JV.DISPLAY_VAL_TYPE_NORMAL) counterRowRecEx++; } } else { private_addPageValue(me.dispValueIdxLst, me.segments[segIdx], grpSeqInfo, counterRowRec, maxRowRec,me.page_seg_map, segIdx, pageIdx, grpPageInfo, false); for (let dv of me.dispValueIdxLst[me.dispValueIdxLst.length - 1]) { if (dv[1] === JV.DISPLAY_VAL_TYPE_NORMAL) counterRowRec++; } } } for (let segIdx = 0; segIdx < me.segments.length; segIdx++) { let grpSeqInfo = (me.group_node_info)?me.group_node_info[segIdx]:null; let grpRecAmt = (grpSeqInfo)?(grpSeqInfo.length*me.group_lines_amt):0; let grpRecAmtEx = 0; if (followTabEx && followTabEx.group_node_info) { grpRecAmtEx = followTabEx.group_node_info.length * followTabEx.group_lines_amt; } grpPageInfo[JV.PROP_SEG_GRP_IDX] = 0; grpPageInfo[JV.PROP_INSERTED_GRP_REC] = 0; grpPageInfo[JV.PROP_PRE_ADD_GRP_REC_INFO] = []; grpPageInfo[JV.PROP_GRP_LINES] = me.group_lines_amt; pageStatus[JV.STATUS_SEGMENT_START] = true; private_resetBandArea(); let threshold = 0; currentRecAmt = 0; counterRowRec = 0; counterRowRecEx = 0; let ttlSegRecAmtNormal = me.segments[segIdx].length + grpRecAmt; let ttlSegRecAmt = (followTabEx)?(me.segments[segIdx].length + grpRecAmt + followTabEx.segments[segIdx].length + grpRecAmtEx):(me.segments[segIdx].length + grpRecAmt); while (true) { if (currentRecAmt > 0) pageStatus[JV.STATUS_SEGMENT_START] = false; if (pageIdx > 0) pageStatus[JV.STATUS_REPORT_START] = false; //开始判断各种scenarios if (ttlSegRecAmtNormal < ttlSegRecAmt) { if (currentRecAmt + maxRowRec > ttlSegRecAmtNormal) { if (currentRecAmt >= ttlSegRecAmtNormal) { //纯 followTabEx 数据 if (currentRecAmt + maxRowRec >= ttlSegRecAmt) { pageStatus[JV.STATUS_SEGMENT_END] = true; private_resetBandArea(); let hasAdHocRow = !JpcFlowTabHelper.chkSegEnd(bands, rptTpl, ttlSegRecAmt, currentRecAmt, maxRowRec, me.isEx); if (hasAdHocRow) { //add page info(pre segment end) pageStatus[JV.STATUS_SEGMENT_END] = false; private_addPage(segIdx, null, true, false, -1); } //add page info pageStatus[JV.STATUS_SEGMENT_END] = true; private_addPage(segIdx, null, true, false, -1); } else { private_addPage(segIdx, null, true, false, -1); } } else { //混合数据 if (currentRecAmt + maxRowRec >= ttlSegRecAmt) { pageStatus[JV.STATUS_SEGMENT_END] = true; private_resetBandArea(); let hasAdHocRow = !JpcFlowTabHelper.chkSegEnd(bands, rptTpl, ttlSegRecAmt, currentRecAmt, maxRowRec, me.isEx); if (hasAdHocRow) { //add page info(pre segment end) pageStatus[JV.STATUS_SEGMENT_END] = false; private_addPage(segIdx, grpSeqInfo, false, true, ttlSegRecAmtNormal); } //add page info pageStatus[JV.STATUS_SEGMENT_END] = true; if (currentRecAmt >= ttlSegRecAmtNormal) { //纯 followTabEx 数据啦 private_addPage(segIdx, null, true, false, -1); } else { private_addPage(segIdx, grpSeqInfo, false, true, ttlSegRecAmtNormal); } } else { private_addPage(segIdx, grpSeqInfo, false, true, ttlSegRecAmtNormal); } } } else { //纯followTab数据 private_addPage(segIdx, grpSeqInfo, false, false, -1); } } else { if (currentRecAmt + maxRowRec >= ttlSegRecAmt) { pageStatus[JV.STATUS_SEGMENT_END] = true; pageStatus[JV.STATUS_REPORT_END] = true; private_resetBandArea(); let hasAdHocRow = !JpcFlowTabHelper.chkSegEnd(bands, rptTpl, ttlSegRecAmt, currentRecAmt, maxRowRec, me.isEx); if (hasAdHocRow) { //add page info(pre segment end) pageStatus[JV.STATUS_SEGMENT_END] = false; pageStatus[JV.STATUS_REPORT_END] = false; private_addPage(segIdx, grpSeqInfo, false, false, -1); } //add page info pageStatus[JV.STATUS_SEGMENT_END] = true; pageStatus[JV.STATUS_REPORT_END] = true; private_addPage(segIdx, grpSeqInfo, false, false, -1); } else { private_addPage(segIdx, grpSeqInfo, false, false, -1); } } //检测是否可退出 if ((currentRecAmt >= ttlSegRecAmt) && (pageIdx % me.multiCols === 0)) { //备注:这里必须得考虑多栏的情况,否则会造成pageStatus出界的问题 break; } //控制阀值,超过阀值则强制退出,防止死循环 threshold++; if (threshold > 500) { console.log("Hey! There may be a dead loop here!!!"); break; } } } // console.log(me.dispValueIdxLst); rst = Math.ceil(pageIdx / me.multiCols); } me.pagesAmt = rst; return rst; }; JpcFlowTabResult.preSetupPages_Org = function (rptTpl, dataObj, defProperties, option, $CURRENT_RPT, followTabEx) { let me = this, rst = 1, counterRowRec = 0, maxRowRec = 1, pageIdx = 0; me.setupGroupingData(rptTpl, dataObj, $CURRENT_RPT); if (followTabEx) { followTabEx.setupGroupingData(rptTpl, dataObj, $CURRENT_RPT); } //console.log(me.group_sum_values); me.paging_option = option||JV.PAGING_OPTION_NORMAL; let CURRENT_FLOW_INFO = (me.isEx)?JV.NODE_FLOW_INFO_EX:JV.NODE_FLOW_INFO; JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[CURRENT_FLOW_INFO][JV.NODE_FLOW_CONTENT][JV.PROP_FLOW_FIELDS], null, me.disp_fields_idx, me.isEx); if (me.paging_option === JV.PAGING_OPTION_INFINITY) { rst = me.segments.length; let pageStatus = [true, true, false, true, true, true, false, false]; for (let segIdx = 0; segIdx < me.segments.length; segIdx++) { if (segIdx === me.segments.length - 1) { pageStatus[JV.STATUS_REPORT_END] = true; } if (segIdx > 0) { pageStatus[JV.STATUS_REPORT_START] = false; } me.pageStatusLst.push(pageStatus.slice(0)); pageIdx++; let grpSeqInfo = (me.group_node_info)?me.group_node_info[segIdx]:null; private_addPageValue(me.dispValueIdxLst, me.segments[segIdx], grpSeqInfo, 0, me.segments[segIdx].length, me.page_seg_map, segIdx, pageIdx, null, false); if (followTabEx) { // } } } else { let bands = JpcBand.createNew(rptTpl, defProperties); let pageStatus = [true, true, false, true, false, false, false, false]; if (me.isEx) { pageStatus[JV.STATUS_REPORT_START] = false; } if (rptTpl[CURRENT_FLOW_INFO][JV.PROP_MULTI_COLUMN]) { me.multiCols = 1 * rptTpl[CURRENT_FLOW_INFO][JV.PROP_MULTI_COLUMN]; } function private_resetBandArea() { JpcBandHelper.setBandArea(bands, rptTpl, pageStatus, !me.isEx, me.isEx); maxRowRec = JpcFlowTabHelper.getMaxRowsPerPage(bands, rptTpl, me.isEx); } let grpPageInfo = {}; for (let segIdx = 0; segIdx < me.segments.length; segIdx++) { let grpSeqInfo = (me.group_node_info)?me.group_node_info[segIdx]:null; grpPageInfo[JV.PROP_SEG_GRP_IDX] = 0; grpPageInfo[JV.PROP_INSERTED_GRP_REC] = 0; grpPageInfo[JV.PROP_PRE_ADD_GRP_REC_INFO] = []; grpPageInfo[JV.PROP_GRP_LINES] = me.group_lines_amt; private_resetBandArea(); let orgMaxRowRec = maxRowRec; let grpRecAmt = (grpSeqInfo)?(grpSeqInfo.length*me.group_lines_amt):0; let grpRecAmtEx = 0; let rowSplitCnt = Math.ceil(1.0 * (me.segments[segIdx].length + grpRecAmt) / orgMaxRowRec); let rowSplitCntEx = rowSplitCnt; if (followTabEx) { rowSplitCntEx = Math.ceil(1.0 * (me.segments[segIdx].length + grpRecAmt + followTabEx.segments[segIdx].length + grpRecAmtEx) / orgMaxRowRec); } pageStatus[JV.STATUS_SEGMENT_END] = true; private_resetBandArea(); let len = (followTabEx)?(me.segments[segIdx].length + grpRecAmt + followTabEx.segments[segIdx].length + grpRecAmtEx):(me.segments[segIdx].length + grpRecAmt); //let hasAdHocRow = !JpcFlowTabHelper.chkSegEnd(bands, rptTpl, me.segments[segIdx].length, (rowSplitCntEx - 1) * orgMaxRowRec, maxRowRec, me.isEx); let hasAdHocRow = !JpcFlowTabHelper.chkSegEnd(bands, rptTpl, len, (rowSplitCntEx - 1) * orgMaxRowRec, maxRowRec, me.isEx); if (hasAdHocRow) rowSplitCntEx++; if (rowSplitCntEx % me.multiCols > 0) { rowSplitCntEx++ } counterRowRec = 0; for (let segPageIdx = 0; segPageIdx < rowSplitCntEx; segPageIdx++) { pageStatus[JV.STATUS_SEGMENT_END] = (segPageIdx === (rowSplitCntEx - 1)); if (pageIdx > 0) pageStatus[JV.STATUS_REPORT_START] = false; private_resetBandArea(); me.pageStatusLst.push(pageStatus.slice(0)); pageIdx++; if (followTabEx) { // } else { // } private_addPageValue(me.dispValueIdxLst, me.segments[segIdx], grpSeqInfo, counterRowRec, maxRowRec,me.page_seg_map, segIdx, pageIdx, grpPageInfo, false); //备注: 考虑到分组数据是临时融入的,所以需要知道这一页的数据融入了多少条group数据,并且得考虑边界条件情况(group数据可能跨页!) for (let dv of me.dispValueIdxLst[me.dispValueIdxLst.length - 1]) { if (dv[1] === JV.DISPLAY_VAL_TYPE_NORMAL) counterRowRec++; } } pageStatus[JV.STATUS_SEGMENT_END] = false; pageStatus[JV.STATUS_REPORT_START] = false; } // console.log(me.dispValueIdxLst); rst = Math.ceil(pageIdx / me.multiCols); } me.pagesAmt = rst; return rst; }; JpcFlowTabResult.outputAsSimpleJSONPage = function (rptTpl, dataObj, page, bands, controls, adHocMergePos, $CURRENT_RPT) { let me = this, rst = [], tabRstLst = []; let FLOW_NODE_STR = me.isEx?JV.NODE_FLOW_INFO_EX:JV.NODE_FLOW_INFO; let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl); if (me.paging_option === JV.PAGING_OPTION_INFINITY) { let segIdx = page - 1; //1 calculate the band position JpcBandHelper.setBandArea(bands, rptTpl, me.pageStatusLst[page - 1], !me.isEx, me.isEx); //2. then reset the band height let tab = rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_CONTENT]; let flowContentBand = bands[tab[JV.PROP_BAND_NAME]]; let actH = JpcFlowTabHelper.getActualContentAreaHeight(bands, rptTpl, me.segments, page, me.isEx); let offsetY = actH - (flowContentBand.Bottom - flowContentBand.Top); JpcBandHelper.resetBandPos(rptTpl[JV.NODE_BAND_COLLECTION], bands, flowContentBand, 0, offsetY); // 2.1 Content-Tab tabRstLst.push(me.outputContent(rptTpl, dataObj, page, bands, unitFactor, controls, 0, $CURRENT_RPT)); // 2.2 Column tab tabRstLst.push(me.outputColumn(rptTpl, dataObj, page, segIdx, bands, unitFactor, controls, 0)); // 2.3 Sum Seg tabRstLst.push(me.outputSegSum(rptTpl, dataObj, page, segIdx, bands, unitFactor, controls)); // 2.4 Sum Page tabRstLst.push(me.outputPageSum(rptTpl, dataObj, page, segIdx, bands, unitFactor, controls)); // 2.5 Group // 2.6 Discrete tabRstLst.push(JpcDiscreteHelper.outputDiscreteInfo(rptTpl[FLOW_NODE_STR][JV.NODE_DISCRETE_INFO], bands, dataObj, unitFactor, me.pageStatusLst[page - 1], segIdx, 1, 0, $CURRENT_RPT)); //3. reset merge band position if (bands[JV.BAND_PROP_MERGE_BAND] && adHocMergePos) { let mergedBand = bands[JV.BAND_PROP_MERGE_BAND]; let arr = []; arr.push(parseInt(mergedBand[JV.PROP_LEFT].toFixed(0))); adHocMergePos[JV.PROP_LEFT] = arr; arr = []; arr.push(parseInt(mergedBand[JV.PROP_RIGHT].toFixed(0))); adHocMergePos[JV.PROP_RIGHT] = arr; arr = []; arr.push(parseInt(mergedBand[JV.PROP_TOP].toFixed(0))); adHocMergePos[JV.PROP_TOP] = arr; arr = []; arr.push(parseInt((mergedBand[JV.PROP_BOTTOM]).toFixed(0))); adHocMergePos[JV.PROP_BOTTOM] = arr; } } else { let segIdx = JpcCommonHelper.getSegIdxByPageIdx(page, me.page_seg_map); //1 calculate the band position JpcBandHelper.setBandArea(bands, rptTpl, me.pageStatusLst[page - 1], !me.isEx, me.isEx); //2. start to output detail-part for (let pi = 0; pi < me.multiCols; pi++) { let actualPage = (page - 1) * me.multiCols + pi + 1; // 2.1 Content-Tab tabRstLst.push(me.outputContent(rptTpl, dataObj, actualPage, bands, unitFactor, controls, pi, $CURRENT_RPT)); // 2.2 Column tab tabRstLst.push(me.outputColumn(rptTpl, dataObj, actualPage, segIdx, bands, unitFactor, controls, pi)); // 2.3 Sum Seg tabRstLst.push(me.outputSegSum(rptTpl, dataObj, actualPage, segIdx, bands, unitFactor, controls)); // 2.4 Sum Page tabRstLst.push(me.outputPageSum(rptTpl, dataObj, actualPage, segIdx, bands, unitFactor, controls)); // 2.5 Group // 2.6 Discrete if (pi === 0) { tabRstLst.push(JpcDiscreteHelper.outputDiscreteInfo(rptTpl[FLOW_NODE_STR][JV.NODE_DISCRETE_INFO], bands, dataObj, unitFactor, me.pageStatusLst[actualPage - 1], segIdx, 1, pi, $CURRENT_RPT)); } } } for (let i = 0; i < tabRstLst.length; i++) { rst = rst.concat(tabRstLst[i]); tabRstLst[i] = null; } return rst; }; JpcFlowTabResult.outputContent = function(rptTpl, dataObj, page, bands, unitFactor, controls, multiColIdx, $CURRENT_RPT) { let me = this, rst = []; let FLOW_NODE_STR = me.isEx?JV.NODE_FLOW_INFO_EX:JV.NODE_FLOW_INFO; let tab = rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_CONTENT]; let tabEx = (rptTpl[JV.NODE_FLOW_INFO_EX])?rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_FLOW_CONTENT]:null; let band = bands[tab[JV.PROP_BAND_NAME]]; if (band) { let pageStatus = me.pageStatusLst[page - 1]; if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]]) { let tab_fields = tab[JV.PROP_FLOW_FIELDS]; let tab_fields_ex = tabEx?tabEx[JV.PROP_FLOW_FIELDS]:null; let data_details = me.isEx?dataObj[JV.DATA_DETAIL_DATA_EX]:dataObj[JV.DATA_DETAIL_DATA]; let data_details_ex = $CURRENT_RPT.isFollowMode?dataObj[JV.DATA_DETAIL_DATA_EX]:null; let contentValuesIdx = me.dispValueIdxLst[page - 1]; let page_sum_data_fields = []; for (let i = 0; i < me.page_sum_fields_idx.length; i++) { let data_field = data_details[me.page_sum_fields_idx[i]]; page_sum_data_fields.push(data_field); } let rowGrandTotal = []; for (let di = 0; di < page_sum_data_fields.length; di++) { rowGrandTotal.push(0.0); } //normal content for (let rowIdx = 0; rowIdx < contentValuesIdx.length; rowIdx++) { for (let i = 0; i < tab_fields.length; i++) { let tab_field = tab_fields[i]; let data_field = null; if (me.disp_fields_idx[i] !== JV.BLANK_FIELD_INDEX) { data_field = data_details[me.disp_fields_idx[i]]; } else { data_field = JE.F(tab_field[JV.PROP_FIELD_ID], $CURRENT_RPT); if (data_field) { data_field = data_field[JV.PROP_AD_HOC_DATA]; } } if (!(tab_field[JV.PROP_HIDDEN])) { // rst.push(me.outputTabField(band, tab_field, data_field, contentValuesIdx[rowIdx], -1, contentValuesIdx.length, rowIdx, 1, 0, unitFactor, true, controls, multiColIdx)); //测试中 if (contentValuesIdx[rowIdx][0] !== JV.TYPE_FOLLOW_MODE && contentValuesIdx[rowIdx][1] === JV.DISPLAY_VAL_TYPE_NORMAL) { rst.push(me.outputTabField(band, tab_field, data_field, contentValuesIdx[rowIdx][2], -1, contentValuesIdx.length, rowIdx, 1, 0, unitFactor, true, controls, multiColIdx)); } } } if (contentValuesIdx[rowIdx][0] === JV.TYPE_FOLLOW_MODE) { for (let i = 0; i < tab_fields_ex.length; i++) { let tab_field = tab_fields_ex[i]; let data_field = null; if (me.disp_fields_idx[i] !== JV.BLANK_FIELD_INDEX) { data_field = data_details_ex[me.disp_fields_idx[i]]; } else { data_field = JE.F(tab_field[JV.PROP_FIELD_ID], $CURRENT_RPT); if (data_field) { data_field = data_field[JV.PROP_AD_HOC_DATA]; } } if (!(tab_field[JV.PROP_HIDDEN])) { if (contentValuesIdx[rowIdx][0] === JV.TYPE_FOLLOW_MODE && contentValuesIdx[rowIdx][1] === JV.DISPLAY_VAL_TYPE_NORMAL) { rst.push(me.outputTabField(band, tab_field, data_field, contentValuesIdx[rowIdx][2], -1, contentValuesIdx.length, rowIdx, 1, 0, unitFactor, true, controls, multiColIdx)); } } } } //page sum content for (let di = 0; di < page_sum_data_fields.length; di++) { rowGrandTotal[di] = rowGrandTotal[di] + 1.0 * JpcFieldHelper.getValue(page_sum_data_fields[di], contentValuesIdx[rowIdx][2]); } } me.pageSumValLst.push(rowGrandTotal); //grouping content for (let rowIdx = 0; rowIdx < contentValuesIdx.length; rowIdx++) { if (contentValuesIdx[rowIdx][1] === JV.DISPLAY_VAL_TYPE_GROUP) { for (let grpIdx = 0; grpIdx < rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_GROUP][JV.PROP_GROUP_LINES].length; grpIdx++) { if (contentValuesIdx[rowIdx][3] === grpIdx) { let grp_line = rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_GROUP][JV.PROP_GROUP_LINES][grpIdx]; let lineRst = me.outputTabGrpLine(band, grp_line, page, contentValuesIdx[rowIdx], contentValuesIdx.length, rowIdx, 1, 0, unitFactor, true, controls, multiColIdx) rst = rst.concat(lineRst); } } } } } } return rst; }; JpcFlowTabResult.outputColumn = function (rptTpl, dataObj, page, segIdx, bands, unitFactor, controls, multiColIdx) { let me = this, rst = []; let FLOW_NODE_STR = me.isEx?JV.NODE_FLOW_INFO_EX:JV.NODE_FLOW_INFO; let tab = rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_COLUMN]; let band = bands[tab[JV.PROP_BAND_NAME]]; if (band) { let pageStatus = me.pageStatusLst[page - 1]; if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]]) { if (tab[JV.PROP_TEXT]) { rst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXT], band, unitFactor, 1, 0, 1, 0, me.multiCols, multiColIdx)); } if (tab[JV.PROP_TEXTS]) { for (let j = 0; j < tab[JV.PROP_TEXTS].length; j++) { rst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXTS][j], band, unitFactor, 1, 0, 1, 0, me.multiCols, multiColIdx)); } } if (tab[JV.NODE_DISCRETE_INFO]) { rst = rst.concat(JpcDiscreteHelper.outputDiscreteInfo(tab[JV.NODE_DISCRETE_INFO], bands, dataObj, unitFactor, me.pageStatusLst[page - 1], segIdx, me.multiCols, multiColIdx)); } } } return rst; }; JpcFlowTabResult.outputSegSum = function (rptTpl, dataObj, page, segIdx, bands, unitFactor, controls) { let me = this, rst = []; let FLOW_NODE_STR = me.isEx?JV.NODE_FLOW_INFO_EX:JV.NODE_FLOW_INFO; let tab = rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_SEG_SUM]; let band = bands[tab[JV.PROP_BAND_NAME]]; if (band) { let pageStatus = me.pageStatusLst[page - 1]; if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]]) { let tab_fields = me.seg_sum_tab_fields; for (let i = 0; i < tab_fields.length; i++) { let cellItem = JpcCommonOutputHelper.createCommonOutput(tab_fields[i], me.segSumValLst[segIdx][i], controls); cellItem[JV.PROP_AREA] = JpcAreaHelper.outputArea(tab_fields[i][JV.PROP_AREA], band, unitFactor, 1, 0, 1, 0, me.multiCols, 0, true, false); rst.push(cellItem); } if (tab[JV.PROP_TEXT]) { rst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXT], band, unitFactor, 1, 0, 1, 0, me.multiCols, 0)); } if (tab[JV.PROP_TEXTS]) { for (let j = 0; j < tab[JV.PROP_TEXTS].length; j++) { rst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXTS][j], band, unitFactor, 1, 0, 1, 0, me.multiCols, 0)); } } if (tab[JV.NODE_DISCRETE_INFO]) { rst = rst.concat(JpcDiscreteHelper.outputDiscreteInfo(tab[JV.NODE_DISCRETE_INFO], bands, dataObj, unitFactor, me.pageStatusLst[page - 1], segIdx, me.multiCols, 0)); } } } return rst; }; JpcFlowTabResult.outputPageSum = function (rptTpl, dataObj, page, segIdx, bands, unitFactor, controls) { let me = this, rst = []; let FLOW_NODE_STR = me.isEx?JV.NODE_FLOW_INFO_EX:JV.NODE_FLOW_INFO; let tab = rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_PAGE_SUM]; let band = bands[tab[JV.PROP_BAND_NAME]]; if (band) { let pageStatus = me.pageStatusLst[page - 1]; if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]]) { let tab_fields = me.page_sum_tab_fields; for (let i = 0; i < tab_fields.length; i++) { let cellItem = JpcCommonOutputHelper.createCommonOutput(tab_fields[i], me.pageSumValLst[page - 1], controls); cellItem[JV.PROP_AREA] = JpcAreaHelper.outputArea(tab_fields[i][JV.PROP_AREA], band, unitFactor, 1, 0, 1, 0, me.multiCols, 0, true, false); rst.push(cellItem); } if (tab[JV.PROP_TEXT]) { rst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXT], band, unitFactor, 1, 0, 1, 0, me.multiCols, 0)); } if (tab[JV.PROP_TEXTS]) { for (let j = 0; j < tab[JV.PROP_TEXTS].length; j++) { rst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXTS][j], band, unitFactor, 1, 0, 1, 0, me.multiCols, 0)); } } if (tab[JV.NODE_DISCRETE_INFO]) { rst = rst.concat(JpcDiscreteHelper.outputDiscreteInfo(tab[JV.NODE_DISCRETE_INFO], bands, dataObj, unitFactor, me.pageStatusLst[page - 1], segIdx, me.multiCols, 0)); } } } return rst; }; JpcFlowTabResult.outputTabField = function (band, tab_field, data_field, valueIdx, serialIdx, rows, rowIdx, cols, colIdx, unitFactor, isRow, controls, multiColIdx) { let me = this, rst = JpcCommonOutputHelper.createCommonOutput(tab_field, JpcFieldHelper.getValue(data_field, valueIdx), controls); rst[JV.PROP_AREA] = JpcAreaHelper.outputArea(tab_field[JV.PROP_AREA], band, unitFactor, rows, rowIdx, cols, colIdx, me.multiCols, multiColIdx, true, false); return rst; }; JpcFlowTabResult.outputTabGrpLine = function (band, grp_line, page, grpValueIdx, rows, rowIdx, cols, colIdx, unitFactor, isRow, controls, multiColIdx) { let me = this, rst = []; if (grp_line[JV.PROP_GROUP_SUM_KEYS]) { let segIdx = JpcCommonHelper.getSegIdxByPageIdx(page, me.page_seg_map); let curSegGrpSum = me.group_sum_values[segIdx]; for (let sumFieldNode of grp_line[JV.PROP_GROUP_SUM_KEYS]) { let value = curSegGrpSum[sumFieldNode[JV.PROP_SUM_KEY]][grpValueIdx[2]]; let sumFldRst = JpcTextHelper.outputDirectValue(sumFieldNode, value, band, unitFactor, rows, rowIdx, cols, colIdx, me.multiCols, multiColIdx) rst.push(sumFldRst); } } if (grp_line[JV.PROP_TEXTS]) { for (let txt of grp_line[JV.PROP_TEXTS]) { rst.push(JpcTextHelper.outputText(txt, band, unitFactor, rows, rowIdx, cols, colIdx, me.multiCols, multiColIdx)); } } if (grp_line[JV.PROP_DISCRETE_FIELDS]) { //暂时不支持 } if (grp_line[JV.PROP_PARAMS]) { //暂时不支持 } // console.log(rst); return rst; }; return JpcFlowTabResult; }; module.exports = new JpcFlowTabSrv();