| 
					
				 | 
			
			
				@@ -9,6 +9,7 @@ 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 PDFKit = require('pdfkit'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 let JpcFlowTabSrv = function(){}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 //let grpPageInfo = {"segGrpRecStartIdx": 0, "insertedGrpRecAmt": 0, "preAddPageGrpInfo": null}; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -87,6 +88,7 @@ JpcFlowTabSrv.prototype.createNew = function(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         me.page_sum_fields_idx = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         me.page_sum_tab_fields = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        me.auto_height_fields_idx = [];//那些被标记为判断自动行高的指标集合 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         me.group_fields = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         me.group_sum_fields = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         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_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.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++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             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) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         //换一种思路来整理流水式数据 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -302,13 +313,14 @@ JpcFlowTabSrv.prototype.createNew = function(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 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); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                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) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     if (currentRecAmt > 0) pageStatus[JV.STATUS_SEGMENT_START] = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     if (pageIdx > 0) pageStatus[JV.STATUS_REPORT_START] = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     //开始判断各种scenarios 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     if (ttlSegRecAmtNormal < ttlSegRecAmt) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        //有流水拓展,并且是follow mode 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         if (currentRecAmt + maxRowRec > ttlSegRecAmtNormal) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             if (currentRecAmt >= ttlSegRecAmtNormal) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                 //纯 followTabEx 数据 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -355,6 +367,7 @@ JpcFlowTabSrv.prototype.createNew = function(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             private_addPage(segIdx, grpSeqInfo, false, false, -1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        //普通流水数据情况 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         if (currentRecAmt + maxRowRec >= ttlSegRecAmt) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             pageStatus[JV.STATUS_SEGMENT_END] = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             pageStatus[JV.STATUS_REPORT_END] = true; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -379,9 +392,9 @@ JpcFlowTabSrv.prototype.createNew = function(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         //备注:这里必须得考虑多栏的情况,否则会造成pageStatus出界的问题 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    //控制阀值,超过阀值则强制退出,防止死循环 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    //控制阈值,超过阈值则强制退出,防止死循环 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     threshold++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    if (threshold > 500) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (threshold > 1000) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         console.log("Hey! There may be a dead loop here!!!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -394,99 +407,6 @@ JpcFlowTabSrv.prototype.createNew = function(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         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; 
			 |