|
@@ -9,6 +9,7 @@ let JpcDiscreteHelper = require('./helper/jpc_helper_discrete');
|
|
let JpcTextHelper = require('./helper/jpc_helper_text');
|
|
let JpcTextHelper = require('./helper/jpc_helper_text');
|
|
let JpcCommonOutputHelper = require('./helper/jpc_helper_common_output');
|
|
let JpcCommonOutputHelper = require('./helper/jpc_helper_common_output');
|
|
let JpcAreaHelper = require('./helper/jpc_helper_area');
|
|
let JpcAreaHelper = require('./helper/jpc_helper_area');
|
|
|
|
+let PDFKit = require('pdfkit');
|
|
|
|
|
|
let JpcFlowTabSrv = function(){};
|
|
let JpcFlowTabSrv = function(){};
|
|
//let grpPageInfo = {"segGrpRecStartIdx": 0, "insertedGrpRecAmt": 0, "preAddPageGrpInfo": null};
|
|
//let grpPageInfo = {"segGrpRecStartIdx": 0, "insertedGrpRecAmt": 0, "preAddPageGrpInfo": null};
|
|
@@ -87,6 +88,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
|
|
me.page_sum_fields_idx = [];
|
|
me.page_sum_fields_idx = [];
|
|
me.page_sum_tab_fields = [];
|
|
me.page_sum_tab_fields = [];
|
|
|
|
|
|
|
|
+ me.auto_height_fields_idx = [];//那些被标记为判断自动行高的指标集合
|
|
me.group_fields = [];
|
|
me.group_fields = [];
|
|
me.group_sum_fields = [];
|
|
me.group_sum_fields = [];
|
|
me.group_sum_values = null;
|
|
me.group_sum_values = null;
|
|
@@ -107,6 +109,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
|
|
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_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_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);
|
|
JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_GROUP][JV.PROP_SUM_FIELDS], me.group_sum_fields, null, me.isEx);
|
|
|
|
+ JpcFieldHelper.findAutoHeightFieldIdx(rptTpl, rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_CONTENT][JV.PROP_FLOW_FIELDS], me.auto_height_fields_idx, me.isEx);
|
|
for (let si = 0; si < dataSeq.length; si++) {
|
|
for (let si = 0; si < dataSeq.length; si++) {
|
|
me.segments.push(dataSeq[si].slice(0));
|
|
me.segments.push(dataSeq[si].slice(0));
|
|
}
|
|
}
|
|
@@ -209,6 +212,14 @@ JpcFlowTabSrv.prototype.createNew = function(){
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
};
|
|
|
|
+ JpcFlowTabResult.setupAutoHeightData = function(rptTpl, dataObj, $CURRENT_RPT) {
|
|
|
|
+ //自动行高功能,需要考虑以下情况:
|
|
|
|
+ //1. 每一Segment的需要增加行的数量
|
|
|
|
+ //2. 边界条件(跨页处理)
|
|
|
|
+ let me = this;
|
|
|
|
+ let CURRENT_FLOW_INFO = (me.isEx)?JV.NODE_FLOW_INFO_EX:JV.NODE_FLOW_INFO;
|
|
|
|
+ //rptTpl[CURRENT_FLOW_INFO][JV.NODE_FLOW_GROUP][JV.PROP_GROUP_LINES].length;
|
|
|
|
+ };
|
|
|
|
|
|
JpcFlowTabResult.preSetupPages = function (rptTpl, dataObj, defProperties, option, $CURRENT_RPT, followTabEx) {
|
|
JpcFlowTabResult.preSetupPages = function (rptTpl, dataObj, defProperties, option, $CURRENT_RPT, followTabEx) {
|
|
//换一种思路来整理流水式数据
|
|
//换一种思路来整理流水式数据
|
|
@@ -302,13 +313,14 @@ JpcFlowTabSrv.prototype.createNew = function(){
|
|
currentRecAmt = 0;
|
|
currentRecAmt = 0;
|
|
counterRowRec = 0;
|
|
counterRowRec = 0;
|
|
counterRowRecEx = 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);
|
|
|
|
|
|
+ let ttlSegRecAmtNormal = me.segments[segIdx].length + grpRecAmt; //正常的segment下的数据长度累计(含grouping data)
|
|
|
|
+ let ttlSegRecAmt = (followTabEx)?(me.segments[segIdx].length + grpRecAmt + followTabEx.segments[segIdx].length + grpRecAmtEx):(me.segments[segIdx].length + grpRecAmt); //所有的segment下的数据长度累计(包括ex部分)
|
|
while (true) {
|
|
while (true) {
|
|
if (currentRecAmt > 0) pageStatus[JV.STATUS_SEGMENT_START] = false;
|
|
if (currentRecAmt > 0) pageStatus[JV.STATUS_SEGMENT_START] = false;
|
|
if (pageIdx > 0) pageStatus[JV.STATUS_REPORT_START] = false;
|
|
if (pageIdx > 0) pageStatus[JV.STATUS_REPORT_START] = false;
|
|
//开始判断各种scenarios
|
|
//开始判断各种scenarios
|
|
if (ttlSegRecAmtNormal < ttlSegRecAmt) {
|
|
if (ttlSegRecAmtNormal < ttlSegRecAmt) {
|
|
|
|
+ //有流水拓展,并且是follow mode
|
|
if (currentRecAmt + maxRowRec > ttlSegRecAmtNormal) {
|
|
if (currentRecAmt + maxRowRec > ttlSegRecAmtNormal) {
|
|
if (currentRecAmt >= ttlSegRecAmtNormal) {
|
|
if (currentRecAmt >= ttlSegRecAmtNormal) {
|
|
//纯 followTabEx 数据
|
|
//纯 followTabEx 数据
|
|
@@ -355,6 +367,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
|
|
private_addPage(segIdx, grpSeqInfo, false, false, -1);
|
|
private_addPage(segIdx, grpSeqInfo, false, false, -1);
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
|
|
+ //普通流水数据情况
|
|
if (currentRecAmt + maxRowRec >= ttlSegRecAmt) {
|
|
if (currentRecAmt + maxRowRec >= ttlSegRecAmt) {
|
|
pageStatus[JV.STATUS_SEGMENT_END] = true;
|
|
pageStatus[JV.STATUS_SEGMENT_END] = true;
|
|
pageStatus[JV.STATUS_REPORT_END] = true;
|
|
pageStatus[JV.STATUS_REPORT_END] = true;
|
|
@@ -379,9 +392,9 @@ JpcFlowTabSrv.prototype.createNew = function(){
|
|
//备注:这里必须得考虑多栏的情况,否则会造成pageStatus出界的问题
|
|
//备注:这里必须得考虑多栏的情况,否则会造成pageStatus出界的问题
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
- //控制阀值,超过阀值则强制退出,防止死循环
|
|
|
|
|
|
+ //控制阈值,超过阈值则强制退出,防止死循环
|
|
threshold++;
|
|
threshold++;
|
|
- if (threshold > 500) {
|
|
|
|
|
|
+ if (threshold > 1000) {
|
|
console.log("Hey! There may be a dead loop here!!!");
|
|
console.log("Hey! There may be a dead loop here!!!");
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
@@ -394,99 +407,6 @@ JpcFlowTabSrv.prototype.createNew = function(){
|
|
return 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) {
|
|
JpcFlowTabResult.outputAsSimpleJSONPage = function (rptTpl, dataObj, page, bands, controls, adHocMergePos, $CURRENT_RPT) {
|
|
let me = this, rst = [], tabRstLst = [];
|
|
let me = this, rst = [], tabRstLst = [];
|
|
let FLOW_NODE_STR = me.isEx?JV.NODE_FLOW_INFO_EX:JV.NODE_FLOW_INFO;
|
|
let FLOW_NODE_STR = me.isEx?JV.NODE_FLOW_INFO_EX:JV.NODE_FLOW_INFO;
|