Browse Source

code sync: 实现自动行高功能之前的代码回顾及bug扫除

TonyKang 7 years ago
parent
commit
a87031a872

+ 1 - 0
modules/reports/rpt_component/helper/jpc_helper_common.js

@@ -70,6 +70,7 @@ let JpcCommonHelper = {
         let me = this, arrDPI = [];
         if (!me.commonConstant.resolution) {
             arrDPI = [96,96];
+            // arrDPI = [100,100];
             me.commonConstant.resolution = arrDPI;
         } else {
             arrDPI = me.commonConstant.resolution;

+ 17 - 0
modules/reports/rpt_component/helper/jpc_helper_field.js

@@ -20,6 +20,7 @@ let JpcFieldHelper = {
         }
     },
     findAndPutDataFieldIdx: function (rptTpl, tab_fields, rstFields, rstFieldsIdx, isEx) {
+        //通过FieldID找到相关映射指标的位置IDX并记录下来,方便后续引用
         if (tab_fields) {
             let DTL_STR = isEx?JV.NODE_DETAIL_FIELDS_EX:JV.NODE_DETAIL_FIELDS;
             let detail_fields = rptTpl[JV.NODE_FIELD_MAP][DTL_STR];
@@ -39,6 +40,22 @@ let JpcFieldHelper = {
                 }
             }
         }
+    },
+    findAutoHeightFieldIdx: function(rptTpl, tab_fields, rstFieldsIdx, isEx) {
+        if (tab_fields) {
+            let DTL_STR = isEx?JV.NODE_DETAIL_FIELDS_EX:JV.NODE_DETAIL_FIELDS;
+            let detail_fields = rptTpl[JV.NODE_FIELD_MAP][DTL_STR];
+            for (let i = 0; i < tab_fields.length; i++) {
+                if (tab_fields[i][JV.PROP_IS_AUTO_HEIGHT]) {
+                    for (let j = 0; j < detail_fields.length; j++) {
+                        if (tab_fields[i]["FieldID"] === detail_fields[j]["ID"]) {
+                            rstFieldsIdx.push(j);
+                            break;
+                        }
+                    }
+                }
+            }
+        }
     }
 };
 

+ 17 - 97
modules/reports/rpt_component/jpc_flow_tab.js

@@ -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;

+ 4 - 2
modules/reports/util/rpt_excel_util.js

@@ -634,7 +634,7 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
             rst.push('<col min="' + i +'" max="' + i +'" width="' + w + '" customWidth="1"/>');
         }
         /*/
-        for (let i = 1; i < xPos.length - 2; i++) {
+        for (let i = 1; i < xPos.length - 1; i++) {
             w = 1.0 * (xPos[i + 1] - xPos[i]) / DPI * 25.4 / 2.117;
             w = Math.round(w * 1000) / 1000;
             rst.push('<col min="' + i +'" max="' + i +'" width="' + w + '" customWidth="1"/>');
@@ -825,7 +825,9 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
     private_setSheetData();
     private_setMergedCells();
     rst.push('<phoneticPr fontId="1" type="noConversion"/>');
-    rst.push('<pageMargins left="0.315" right="0.215" top="0.315" bottom="0.315" header="0" footer="0"/>');
+    // rst.push('<pageMargins left="0.315" right="0.215" top="0.315" bottom="0.315" header="0" footer="0"/>');
+    rst.push('<pageMargins left="' + (parseFloat(pageData[JV.NODE_PAGE_INFO][JV.NODE_MARGINS][JV.PROP_LEFT]) * 0.39375) +
+        '" right="0.215" top="0.315" bottom="0.315" header="0" footer="0"/>');
     let paperSizeIdx = JV.PAGES_SIZE_STR.indexOf(paperSize);
     let pStr = '';
     if (paperSizeIdx >= 0) {

+ 1 - 0
public/web/rpt_value_define.js

@@ -107,6 +107,7 @@ const JV = {
     PROP_POSITION: "Position",
     PROP_HIDDEN: "Hidden",
     PROP_IS_SERIAL: "isSerial",
+    PROP_IS_AUTO_HEIGHT: "isAutoHeight",
     PROP_FONT: "font",
     PROP_CONTROL: "control",
     PROP_STYLE: "style",