| 
					
				 | 
			
			
				@@ -11,6 +11,8 @@ let JpcCommonOutputHelper = require('./helper/jpc_helper_common_output'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 let JpcAreaHelper = require('./helper/jpc_helper_area'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 let PDFKit = require('pdfkit'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 let fontUtil = require('../util/rpt_font_util'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+let fsUtil = require("../../../public/fsUtil"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 let JpcFlowTabSrv = function(){}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 JpcFlowTabSrv.prototype.createNew = function(){ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -422,10 +424,12 @@ JpcFlowTabSrv.prototype.createNew = function(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 JpcBandHelper.setBandArea(bands, rptTpl, pageStatus, !me.isEx, me.isEx); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 maxRowRec = JpcFlowTabHelper.getMaxRowsPerPage(bands, rptTpl, me.isEx); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            let handledRowAmt = 0; //handledRowAmt纪录的是真正处理过的显示行数,包含了空白行,主要是为分页用(自动行高) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             function private_addPage(segIdx, grpSeqInfo, isFollow, isMix, mixSplitPoint) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 private_resetBandArea(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 me.pageStatusLst.push(pageStatus.slice(0)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 currentRecAmt += maxRowRec; //在自动行高的场景下,currentRecAmt在后面还需要调整 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                handledRowAmt += maxRowRec; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 let redundantRecAmt = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 pageIdx++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 function private_chk_handle_rec_amt(dv, isEx) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -473,6 +477,7 @@ JpcFlowTabSrv.prototype.createNew = function(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 let grpRecAmt = (grpSeqInfo)?(grpSeqInfo.length*me.group_lines_amt):0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 let grpRecAmtEx = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 let accAutoHeightAmt = 0; //累计的自动行高数量 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                handledRowAmt = 0; //初始化每一段的已处理纪录行数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 if (followTabEx && followTabEx.group_node_info) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     grpRecAmtEx = followTabEx.group_node_info.length * followTabEx.group_lines_amt; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -574,17 +579,16 @@ JpcFlowTabSrv.prototype.createNew = function(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         //普通流水数据情况 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        // if ((currentRecAmt + adHocAutoHeightAmt + maxRowRec >= ttlSegRecAmt) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        if ((currentRecAmt + accAutoHeightAmt + adHocAutoHeightAmt + maxRowRec >= ttlSegRecAmt) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                             //&& (adHocAutoHeightAmt < 2 * maxRowRec) ) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                             // && ((currentRecAmt + adHocAutoHeightAmt + maxRowRec - ttlSegRecAmt) < maxRowRec) ) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            && ((currentRecAmt + accAutoHeightAmt + adHocAutoHeightAmt + maxRowRec - ttlSegRecAmt) < maxRowRec) ) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (handledRowAmt + maxRowRec >= ttlSegRecAmt) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             //备注: 理论上自动行高是没有上限的,有可能正常一页的数据可以拓展到3页及以上,在此极端情况下,必须做一些限制判断,否则会出现缺页情况。 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            // 2018-08-04 其实之前的判断逻辑完全是自找麻烦,而且还不够正确。其实只需要判断已经处理了多少行纪录(所有的都算,包括空白行), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            // 与总的seg纪录数想比较,就很容易得到结果,而且能处理更极端的情况。 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             pageStatus[JV.STATUS_SEGMENT_END] = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             pageStatus[JV.STATUS_REPORT_END] = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             private_resetBandArea(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            let hasAdHocRow = ((adHocAutoHeightAmt > maxRowRec) || 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                              !JpcFlowTabHelper.chkSegEnd(bands, rptTpl, ttlSegRecAmt, currentRecAmt + adHocAutoHeightAmt, maxRowRec, me.isEx)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            let hasAdHocRow = ((adHocAutoHeightAmt > maxRowRec) || !JpcFlowTabHelper.chkSegEnd(bands, rptTpl, ttlSegRecAmt, handledRowAmt, maxRowRec, me.isEx)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                              // !JpcFlowTabHelper.chkSegEnd(bands, rptTpl, ttlSegRecAmt, currentRecAmt + adHocAutoHeightAmt, maxRowRec, me.isEx)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             if (hasAdHocRow) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                 //add page info(pre segment end) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                 pageStatus[JV.STATUS_SEGMENT_END] = false; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -602,7 +606,8 @@ JpcFlowTabSrv.prototype.createNew = function(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     //检测是否可退出 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    if ((currentRecAmt + accAutoHeightAmt + adHocAutoHeightAmt >= ttlSegRecAmt) && (pageIdx % me.multiCols === 0)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    // if ((currentRecAmt + accAutoHeightAmt + adHocAutoHeightAmt >= ttlSegRecAmt) && (pageIdx % me.multiCols === 0)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (handledRowAmt >= ttlSegRecAmt && (pageIdx % me.multiCols === 0)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         //备注:这里必须得考虑多栏的情况,否则会造成pageStatus出界的问题 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -737,7 +742,7 @@ JpcFlowTabSrv.prototype.createNew = function(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return rst; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     JpcFlowTabResult.outputContent = function(rptTpl, dataObj, page, bands, unitFactor, controls, multiColIdx, $CURRENT_RPT, customizeCfg) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let me = this, rst = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let me = this, rst = [], prepareObj = {}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         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; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -805,6 +810,7 @@ JpcFlowTabSrv.prototype.createNew = function(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                     } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                         cellItem[JV.PROP_STYLE] = cellItem[JV.PROP_STYLE] + '_AutoHeightMerge_Middle'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    prepareAutoHeightCells(prepareObj, cellItem, rst.length - 1, rst); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -864,6 +870,13 @@ JpcFlowTabSrv.prototype.createNew = function(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let eliminateCells = combineAutoHeightCells(prepareObj, page, controls); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // console.log("rst.length: " + rst.length); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // console.log("eliminateCells.length: " + eliminateCells.length); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (let idIdx = eliminateCells.length - 1; idIdx >= 0; idIdx--) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            rst.splice(eliminateCells[idIdx], 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        console.log("rst.length: " + rst.length); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return rst; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     JpcFlowTabResult.outputColumn = function (rptTpl, dataObj, page, segIdx, bands, unitFactor, multiColIdx) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1012,4 +1025,86 @@ JpcFlowTabSrv.prototype.createNew = function(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return JpcFlowTabResult; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function push_cell(pageCellObj, cell, cellIdx) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (!pageCellObj[cell[JV.PROP_AREA][JV.PROP_LEFT] + '_' + cell[JV.PROP_AREA][JV.PROP_RIGHT]]) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        pageCellObj[cell[JV.PROP_AREA][JV.PROP_LEFT] + '_' + cell[JV.PROP_AREA][JV.PROP_RIGHT]] = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    let cellArr = pageCellObj[cell[JV.PROP_AREA][JV.PROP_LEFT] + '_' + cell[JV.PROP_AREA][JV.PROP_RIGHT]]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    cellArr.push({"cellIdx": cellIdx, "cell": cell}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function prepareAutoHeightCells(prepareObj, cellItem, cellIdx, cellsArr) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (prepareObj) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (prepareObj.cellsArr === undefined) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            prepareObj.cellsArr = cellsArr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            prepareObj.pageCellObj = {}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        push_cell(prepareObj.pageCellObj, cellItem, cellIdx); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function setupControl(mergeCell, controls) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    let orgCtrl = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if ( typeof mergeCell[JV.PROP_CONTROL] === "string") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        orgCtrl = controls[mergeCell[JV.PROP_CONTROL]]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        mergeCell[JV.PROP_CONTROL] = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "Shrink": "T", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "ShowZero": orgCtrl.ShowZero, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "Horizon": orgCtrl.Horizon, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "Vertical": "top", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "Wrap": "T" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        mergeCell[JV.PROP_CONTROL].Shrink = "T"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        mergeCell[JV.PROP_CONTROL].Vertical = "top"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        mergeCell[JV.PROP_CONTROL].Wrap = "T"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        orgCtrl = mergeCell[JV.PROP_CONTROL]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return orgCtrl; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function combineAutoHeightCells(prepareObj, page, controls) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    let rst = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (prepareObj.cellsArr) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //merge cells' value and area 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (let mergeKey in prepareObj.pageCellObj) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (prepareObj.pageCellObj[mergeKey].length > 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                let firstMergeCell = prepareObj.pageCellObj[mergeKey][0].cell; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                firstMergeCell[JV.PROP_STYLE] = firstMergeCell[JV.PROP_STYLE].slice(0, firstMergeCell[JV.PROP_STYLE].indexOf("_AutoHeightMerge")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                let orgCtrl = setupControl(firstMergeCell, controls); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                let validValueAmt = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                for (let i = 1; i < prepareObj.pageCellObj[mergeKey].length; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    let mergeCell = prepareObj.pageCellObj[mergeKey][i].cell; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (mergeCell[JV.PROP_STYLE].indexOf("_AutoHeightMerge_Top") < 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        //merge into the firstMergeCell! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        firstMergeCell[JV.PROP_AREA][JV.PROP_BOTTOM] = mergeCell[JV.PROP_AREA][JV.PROP_BOTTOM]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        firstMergeCell[JV.PROP_VALUE] = firstMergeCell[JV.PROP_VALUE] + "|" + mergeCell[JV.PROP_VALUE]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (mergeCell[JV.PROP_VALUE]) validValueAmt++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        rst.push(prepareObj.pageCellObj[mergeKey][i].cellIdx); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (i === prepareObj.pageCellObj[mergeKey].length - 1 && validValueAmt === 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            firstMergeCell[JV.PROP_CONTROL].Shrink = orgCtrl.Shrink; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            firstMergeCell[JV.PROP_CONTROL].Wrap = "F"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (validValueAmt === 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            firstMergeCell[JV.PROP_CONTROL].Shrink = orgCtrl.Shrink; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            firstMergeCell[JV.PROP_CONTROL].Wrap = "F"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        firstMergeCell = prepareObj.pageCellObj[mergeKey][i].cell; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        firstMergeCell[JV.PROP_STYLE] = firstMergeCell[JV.PROP_STYLE].slice(0, firstMergeCell[JV.PROP_STYLE].indexOf("_AutoHeightMerge")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        orgCtrl = setupControl(firstMergeCell, controls); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        validValueAmt = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        rst.sort(function (i1, i2) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return (i1 > i2)?1:-1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // fsUtil.writeObjToFile(prepareObj, "D:/GitHome/ConstructionCost/tmp/afterMergeCellsPrepareObj_" + page + ".jsp"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // fsUtil.writeObjToFile(rst, "D:/GitHome/ConstructionCost/tmp/eliminateCells_" + page + ".jsp"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return rst; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 module.exports = new JpcFlowTabSrv(); 
			 |