浏览代码

BUG #3379 紧密输出功能

Tony Kang 3 年之前
父节点
当前提交
762949ace0

+ 49 - 29
app/public/report/js/jpc_output.js

@@ -117,6 +117,13 @@ let JpcCanvasOutput = {
             }
             return rst;
         }
+        function _chkIfCloseOutput(control, actLines, area, fontHeight) {
+            let rst = false;
+            if (control.CloseOutput === 'T' && actLines > 1) {
+                rst = true;
+            }
+            return rst;
+        }
         function private_drawText(val, area, font, control) {
             let dftFontHeight = 12;
             let output = [];
@@ -265,10 +272,11 @@ let JpcCanvasOutput = {
             //根据control的 自动折行 及 缩放优先 这俩属性 来分解cell value
             if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_WRAP]] === 'T' && control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_SHRINK_FIRST]] !== 'T') {
                 let vals = [];
-                let validAreaTxtWidth = cell[JV.PROP_AREA][JV.PROP_RIGHT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT] - cell[JV.PROP_AREA][JV.PROP_LEFT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_LEFT];
+                let validAreaTxtWidth = cell[JV.PROP_AREA][JV.PROP_RIGHT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT] - cell[JV.PROP_AREA][JV.PROP_LEFT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_LEFT] - 1;
                 for (let val of orgValues) {
                     let actW = ctx2D.measureText(val).width;
-                    if (actW > validAreaTxtWidth) {
+                    if (actW > (validAreaTxtWidth - 4)) {
+                        //减4个像素是考虑到导出excel的情况
                         vals = vals.concat(private_splitString(val, validAreaTxtWidth, ctx2D));
                     } else {
                         vals.push(val);
@@ -308,42 +316,54 @@ let JpcCanvasOutput = {
                     }
                 }
 
-                if (font) {
-                    let dftFontHeight = parseFloat(font[JV.FONT_PROPS[1]]);
-                    let dftOthers = "";
-                    let dftFontBold = font[JV.FONT_PROPS[3]];
-                    if (dftFontBold && dftFontBold === 'T') {
-                        dftOthers = "bold " + dftOthers ;
-                    }
-                    let dftFontItalic = font[JV.FONT_PROPS[4]];
-                    if (dftFontItalic && dftFontItalic === 'T') {
-                        dftOthers = dftOthers + "italic ";
-                    }
-                    dftFontHeight = me.scaleFactor * dftFontHeight;
-                    ctx.font = dftOthers + dftFontHeight + "px " + font[JV.PROP_NAME];
+                let dftFontHeight = parseFloat(font[JV.FONT_PROPS[1]]);
+                let dftOthers = "";
+                let dftFontBold = font[JV.FONT_PROPS[3]];
+                if (dftFontBold && dftFontBold === 'T') {
+                    dftOthers = "bold " + dftOthers ;
                 }
+                let dftFontItalic = font[JV.FONT_PROPS[4]];
+                if (dftFontItalic && dftFontItalic === 'T') {
+                    dftOthers = dftOthers + "italic ";
+                }
+                dftFontHeight = me.scaleFactor * dftFontHeight;
+                ctx.font = dftOthers + dftFontHeight + "px " + font[JV.PROP_NAME];
+
                 _splitValues(cell, control, values, ctx);
 
                 let height = cell[JV.PROP_AREA][JV.PROP_BOTTOM] - cell[JV.PROP_AREA][JV.PROP_TOP];
                 let area = [cell[JV.PROP_AREA][JV.PROP_LEFT] + me.offsetX, cell[JV.PROP_AREA][JV.PROP_TOP] + me.offsetY, cell[JV.PROP_AREA][JV.PROP_RIGHT] + me.offsetX, cell[JV.PROP_AREA][JV.PROP_BOTTOM] + me.offsetY];
                 let ah = height;
                 let restTopH = 0, restBottomH = 0;
-                if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_CLOSE_OUTPUT]] === 'T') {
-                    ah = (parseFloat(font[JV.FONT_PROPS[1]]) + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP] + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_BOTTOM]) * values.length;
-                    let restH = height - ah;
-                    if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === 'center') {
-                        restTopH = restH / 2;
-                        restBottomH = restH / 2;
-                    } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === 'bottom') {
-                        restBottomH = restH;
-                    } else {
-                        // restTopH = restH;
-                        restTopH = JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP];
-                    }
+                // if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_CLOSE_OUTPUT]] === 'T') {
+                //     ah = (parseFloat(font[JV.FONT_PROPS[1]]) + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP] + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_BOTTOM]) * values.length;
+                //     let restH = height - ah;
+                //     if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === 'center') {
+                //         restTopH = restH / 2;
+                //         restBottomH = restH / 2;
+                //     } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === 'bottom') {
+                //         restBottomH = restH;
+                //     } else {
+                //         // restTopH = restH;
+                //         restTopH = JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP];
+                //     }
+                // }
+                //这里增加 ‘紧密输出’ 处理:在cell的输出空间划分出上下空间,中间行的输出间隔只有4个像素(要考虑与导出excel一致性,不能少了)
+                const isCloseOutput = _chkIfCloseOutput(control, values.length, area, dftFontHeight);
+                let closeTopOffset = 0;
+                if (isCloseOutput) {
+                    closeTopOffset = (height - (dftFontHeight + 4) * values.length) / 2;
                 }
                 for (let i = 0; i < values.length; i++) {
-                    area[JV.IDX_TOP] = cell[JV.PROP_AREA][JV.PROP_TOP] + i * (ah / values.length) + me.offsetY + restTopH;
-                    area[JV.IDX_BOTTOM] = cell[JV.PROP_AREA][JV.PROP_TOP] + (i + 1) * (ah / values.length) + me.offsetY + restBottomH;
+                    // area[JV.IDX_TOP] = cell[JV.PROP_AREA][JV.PROP_TOP] + i * (ah / values.length) + me.offsetY + restTopH;
+                    // area[JV.IDX_BOTTOM] = cell[JV.PROP_AREA][JV.PROP_TOP] + (i + 1) * (ah / values.length) + me.offsetY + restBottomH;
+                    if (isCloseOutput) {
+                        area[JV.IDX_TOP] = cell[JV.PROP_AREA][JV.PROP_TOP] + closeTopOffset + i *(dftFontHeight + 4) + me.offsetY;
+                        area[JV.IDX_BOTTOM] = cell[JV.PROP_AREA][JV.PROP_TOP] + closeTopOffset + (i + 1) *(dftFontHeight + 4) + me.offsetY;
+                    } else {
+                        area[JV.IDX_TOP] = cell[JV.PROP_AREA][JV.PROP_TOP] + i * (ah / values.length) + me.offsetY + restTopH;
+                        area[JV.IDX_BOTTOM] = cell[JV.PROP_AREA][JV.PROP_TOP] + (i + 1) * (ah / values.length) + me.offsetY + restBottomH;
+                    }
                     if (values[i] === null || values[i] === undefined || values[i] === 'null') {
                         values[i] = "";
                     }

+ 1 - 1
app/public/report/js/jpc_output_value_define.js

@@ -81,7 +81,7 @@ let JV = {
     PAGES_SIZE_IDX: [8, 9, 11, 12, 13, 1, 5, 7, 93],
     PAGES_SIZE: [[11.693, 16.535], [8.268, 11.693], [5.827, 8.268], [9.84, 13.898], [6.93, 9.84], [8.5, 11.0], [8.5, 14.0], [7.25, 10.5], [7.25, 10.5]],
 
-    OUTPUT_OFFSET: [2,2,1,3],
+    OUTPUT_OFFSET: [1,1,1,1],
     OFFSET_IDX_LEFT: 0,
     OFFSET_IDX_RIGHT: 1,
     OFFSET_IDX_TOP: 2,

+ 38 - 16
app/public/report/js/rpt_jspdf.js

@@ -300,10 +300,11 @@ let JpcJsPDFHelper = {
             //根据control的 自动折行 及 缩放优先 这俩属性 来分解cell value
             if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_WRAP]] === 'T' && control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_SHRINK_FIRST]] !== 'T') {
                 let vals = [];
-                let validAreaTxtWidth = cell[JV.PROP_AREA][JV.PROP_RIGHT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT] - cell[JV.PROP_AREA][JV.PROP_LEFT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_LEFT];
+                let validAreaTxtWidth = cell[JV.PROP_AREA][JV.PROP_RIGHT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT] - cell[JV.PROP_AREA][JV.PROP_LEFT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_LEFT] - 1;
                 for (let val of orgValues) {
                     let actW = doc.getTextWidth(val);
-                    if (actW > validAreaTxtWidth) {
+                    if (actW > (validAreaTxtWidth - 4)) {
+                        //减4个像素是考虑到导出excel的情况
                         vals = vals.concat(private_splitString(val, validAreaTxtWidth, doc));
                     } else {
                         vals.push(val);
@@ -317,6 +318,14 @@ let JpcJsPDFHelper = {
             }
         }
 
+        function _chkIfCloseOutput(control, actLines, area, fontHeight) {
+            let rst = false;
+            if (control.CloseOutput === 'T' && actLines > 1) {
+                rst = true;
+            }
+            return rst;
+        }
+
         function private_drawCellText(doc, ctx, cell, fonts, controls) {
             if (cell[JV.PROP_VALUE] !== undefined && cell[JV.PROP_VALUE] !== null) {
                 // let values = ("" + cell[JV.PROP_VALUE]).split('|');
@@ -364,23 +373,36 @@ let JpcJsPDFHelper = {
                 let area = [cell[JV.PROP_AREA][JV.PROP_LEFT] + offsetX, cell[JV.PROP_AREA][JV.PROP_TOP] + offsetY, cell[JV.PROP_AREA][JV.PROP_RIGHT] + offsetX, cell[JV.PROP_AREA][JV.PROP_BOTTOM] + offsetY];
                 let ah = height;
                 let restTopH = 0, restBottomH = 0;
-                if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_CLOSE_OUTPUT]] === 'T') {
-                    ah = (parseFloat(font[JV.FONT_PROPS[1]]) + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP] + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_BOTTOM]) * values.length;
-                    let restH = height - ah;
-                    if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === 'center') {
-                        restTopH = restH / 2;
-                        restBottomH = restH / 2;
-                    } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === 'bottom') {
-                        restBottomH = restH;
-                    } else {
-                        // restTopH = restH;
-                        restTopH = JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP];
-                    }
+                let dftFontHeight = parseFloat(font[JV.FONT_PROPS[1]]);
+                const isCloseOutput = _chkIfCloseOutput(control, values.length, area, dftFontHeight);
+                let closeTopOffset = 0;
+                if (isCloseOutput) {
+                    closeTopOffset = (height - (dftFontHeight + 4) * values.length) / 2;
                 }
+                // if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_CLOSE_OUTPUT]] === 'T') {
+                //     ah = (parseFloat(font[JV.FONT_PROPS[1]]) + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP] + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_BOTTOM]) * values.length;
+                //     let restH = height - ah;
+                //     if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === 'center') {
+                //         restTopH = restH / 2;
+                //         restBottomH = restH / 2;
+                //     } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === 'bottom') {
+                //         restBottomH = restH;
+                //     } else {
+                //         // restTopH = restH;
+                //         restTopH = JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP];
+                //     }
+                // }
                 let spaceIdxArr = [];
                 for (let i = 0; i < values.length; i++) {
-                    area[JV.IDX_TOP] = cell[JV.PROP_AREA][JV.PROP_TOP] + i * (ah / values.length) + offsetY + restTopH;
-                    area[JV.IDX_BOTTOM] = cell[JV.PROP_AREA][JV.PROP_TOP] + (i + 1) * (ah / values.length) + offsetY + restBottomH;
+                    // area[JV.IDX_TOP] = cell[JV.PROP_AREA][JV.PROP_TOP] + i * (ah / values.length) + offsetY + restTopH;
+                    // area[JV.IDX_BOTTOM] = cell[JV.PROP_AREA][JV.PROP_TOP] + (i + 1) * (ah / values.length) + offsetY + restBottomH;
+                    if (isCloseOutput) {
+                        area[JV.IDX_TOP] = cell[JV.PROP_AREA][JV.PROP_TOP] + closeTopOffset + i * (dftFontHeight + 4) + offsetY;
+                        area[JV.IDX_BOTTOM] = cell[JV.PROP_AREA][JV.PROP_TOP] + closeTopOffset + (i + 1) * (dftFontHeight + 4) + offsetY;
+                    } else {
+                        area[JV.IDX_TOP] = cell[JV.PROP_AREA][JV.PROP_TOP] + i * (ah / values.length) + offsetY + restTopH;
+                        area[JV.IDX_BOTTOM] = cell[JV.PROP_AREA][JV.PROP_TOP] + (i + 1) * (ah / values.length) + offsetY + restBottomH;
+                    }
                     if (values[i] === null || values[i] === undefined || values[i] === 'null') {
                         values[i] = "";
                     }

+ 37 - 18
app/public/report/js/rpt_print.js

@@ -403,10 +403,11 @@ function _splitValues(cell, control, orgValues, ctx2D) {
     //根据control的 自动折行 及 缩放优先 这俩属性 来分解cell value
     if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_WRAP]] === 'T' && control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_SHRINK_FIRST]] !== 'T') {
         let vals = [];
-        let validAreaTxtWidth = cell[JV.PROP_AREA][JV.PROP_RIGHT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT] - cell[JV.PROP_AREA][JV.PROP_LEFT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_LEFT];
+        let validAreaTxtWidth = cell[JV.PROP_AREA][JV.PROP_RIGHT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT] - cell[JV.PROP_AREA][JV.PROP_LEFT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_LEFT] - 1;
         for (let val of orgValues) {
             let actW = ctx2D.measureText(val).width;
-            if (actW > validAreaTxtWidth) {
+            if (actW > (validAreaTxtWidth - 4)) {
+                //减4个像素是考虑到导出excel的情况
                 vals = vals.concat(private_splitString(val, validAreaTxtWidth, ctx2D));
             } else {
                 vals.push(val);
@@ -548,28 +549,46 @@ function buildText(destRst, cell, font, control, offsetX, offsetY, adjustY, canv
     };
     let ah = height;
     let restTopH = 0, restBottomH = 0;
-    if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_CLOSE_OUTPUT]] === 'T') {
-        ah = (parseFloat(font[JV.FONT_PROPS[1]]) + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP] + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_BOTTOM]) * values.length;
-        let restH = height - ah;
-        if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === 'center') {
-            restTopH = restH / 2;
-            restBottomH = restH / 2;
-        } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === 'bottom') {
-            restBottomH = restH;
-        } else {
-            // restTopH = restH;
-            restTopH = JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP] + 8; // 备注:打印比别的方式多加些空隙
-        }
+    // if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_CLOSE_OUTPUT]] === 'T') {
+    //     ah = (parseFloat(font[JV.FONT_PROPS[1]]) + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP] + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_BOTTOM]) * values.length;
+    //     let restH = height - ah;
+    //     if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === 'center') {
+    //         restTopH = restH / 2;
+    //         restBottomH = restH / 2;
+    //     } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === 'bottom') {
+    //         restBottomH = restH;
+    //     } else {
+    //         // restTopH = restH;
+    //         restTopH = JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP] + 8; // 备注:打印比别的方式多加些空隙
+    //     }
+    // }
+    const isCloseOutput = _chkIfCloseOutput(control, values.length, area, orgFontHeight);
+    let closeTopOffset = 0;
+    if (isCloseOutput) {
+        closeTopOffset = (height - (orgFontHeight + 4) * values.length) / 2;
     }
     for (let vidx = 0; vidx < values.length; vidx++) {
-        // area[JV.IDX_TOP] = top + vidx * (height / values.length);
-        // area[JV.IDX_BOTTOM] = top + (vidx + 1) * (height / values.length);
-        area[JV.IDX_TOP] = top + vidx * (ah / values.length) + restTopH;
-        area[JV.IDX_BOTTOM] = top + (vidx + 1) * (ah / values.length) + restTopH;
+        // area[JV.IDX_TOP] = top + vidx * (ah / values.length) + restTopH;
+        // area[JV.IDX_BOTTOM] = top + (vidx + 1) * (ah / values.length) + restTopH;
+        if (isCloseOutput) {
+            area[JV.IDX_TOP] = top + closeTopOffset + vidx * (orgFontHeight + 4);
+            area[JV.IDX_BOTTOM] = top + closeTopOffset + (vidx + 1) * (orgFontHeight + 4);
+        } else {
+            area[JV.IDX_TOP] = top + vidx * (ah / values.length) + restTopH;
+            area[JV.IDX_BOTTOM] = top + (vidx + 1) * (ah / values.length) + restBottomH;
+        }
         inner_draw_text(values[vidx]);
     }
 }
 
+function _chkIfCloseOutput(control, actLines, area, fontHeight) {
+    let rst = false;
+    if (control.CloseOutput === 'T' && actLines > 1) {
+        rst = true;
+    }
+    return rst;
+}
+
 function private_splitString(val, areaWidth, ctx) {
     let rst = [];
     if (val) {

+ 24 - 22
app/reports/rpt_component/helper/jpc_helper_common.js

@@ -4,7 +4,7 @@ const JV = require('../jpc_value_define');
 
 const JpcCommonHelper = {
     commonConstant: {},
-    getResultByID: function(KeyID, collectionList) {
+    getResultByID(KeyID, collectionList) {
         let rst = null;
         if (KeyID) {
             for (let i = 0; i < collectionList.length; i++) {
@@ -22,38 +22,38 @@ const JpcCommonHelper = {
         }
         return rst;
     },
-    getFont: function(fontName, dftFonts, rptTpl) {
+    getFont(fontName, dftFonts, rptTpl) {
         const me = this;
         const list = [];
         if (rptTpl) list.push(rptTpl[JV.NODE_FONT_COLLECTION]);
         list.push(dftFonts);
         return me.getResultByID(fontName, list);
     },
-    getStyle: function(styleName, dftStyles, rptTpl) {
+    getStyle(styleName, dftStyles, rptTpl) {
         const me = this;
         const list = [];
         if (rptTpl) list.push(rptTpl[JV.NODE_STYLE_COLLECTION]);
         list.push(dftStyles);
         return me.getResultByID(styleName, list);
     },
-    getControl: function(controlName, dftControls, rptTpl) {
+    getControl(controlName, dftControls, rptTpl) {
         const me = this;
         const list = [];
         if (rptTpl) list.push(rptTpl[JV.NODE_CONTROL_COLLECTION]);
         list.push(dftControls);
         return me.getResultByID(controlName, list);
     },
-    getLayoutAlignment: function(alignStr) {
+    getLayoutAlignment(alignStr) {
         let rst = JV.LAYOUT.indexOf(alignStr);
         if (rst < 0) rst = JV.LAYOUT_FULFILL;
         return rst;
     },
-    getPosCalculationType: function (typeStr) {
+    getPosCalculationType(typeStr) {
         let rst = JV.CAL_TYPE.indexOf(typeStr);
         if (rst < 0) rst = JV.CAL_TYPE_ABSTRACT;
         return rst;
     },
-    getBoolean: function(bStr) {
+    getBoolean(bStr) {
         let rst = false;
         if (bStr !== null && bStr !== undefined) {
             const valType = typeof bStr;
@@ -68,11 +68,11 @@ const JpcCommonHelper = {
         }
         return rst;
     },
-    getScreenDPI: function() {
+    getScreenDPI() {
         const me = this;
         let arrDPI = [];
         if (!me.commonConstant.resolution) {
-            arrDPI = [96,96];
+            arrDPI = [96, 96];
             // arrDPI = [100,100];
             me.commonConstant.resolution = arrDPI;
         } else {
@@ -80,11 +80,11 @@ const JpcCommonHelper = {
         }
         return arrDPI;
     },
-    getUnitFactor: function(rptTpl) {
+    getUnitFactor(rptTpl) {
         const me = this;
         return me.translateUnit(rptTpl[JV.NODE_MAIN_INFO][JV.PROP_UNITS]);
     },
-    translateUnit: function(unitStr) {
+    translateUnit(unitStr) {
         const me = this;
         let rst = 1.0;
         if (unitStr) {
@@ -99,7 +99,7 @@ const JpcCommonHelper = {
         }
         return rst;
     },
-    getPageSize: function(rptTpl) {
+    getPageSize(rptTpl) {
         let size = null;
         const sizeStr = rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE];
         const sizeIdx = JV.PAGES_SIZE_STR.indexOf(sizeStr);
@@ -112,14 +112,14 @@ const JpcCommonHelper = {
         }
         const page_orientation = rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION];
         if (page_orientation === JV.ORIENTATION_LANDSCAPE || page_orientation === JV.ORIENTATION_LANDSCAPE_CHN) {
-            //swap x,y
+            // swap x,y
             const tmp = size[0];
             size[0] = size[1];
             size[1] = tmp;
         }
         return size;
     },
-    getReportArea: function(rptTpl, unitFactor) {
+    getReportArea(rptTpl, unitFactor) {
         const me = this;
         const resolution = me.getScreenDPI();
         const rst = [];
@@ -132,7 +132,7 @@ const JpcCommonHelper = {
         rst.push(size[1] - unitFactor * rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_BOTTOM]);
         return rst;
     },
-    getSegIdxByPageIdx: function(page, page_seg_map) {
+    getSegIdxByPageIdx(page, page_seg_map) {
         let rst = -1;
         for (let pIdx = 0; pIdx < page_seg_map.length; pIdx++) {
             if (page_seg_map[pIdx][0] === page) {
@@ -142,7 +142,7 @@ const JpcCommonHelper = {
         }
         return rst;
     },
-    getSegPageIdxByPage: function(page, page_seg_map) {
+    getSegPageIdxByPage(page, page_seg_map) {
         let rst = 0;
         for (let pIdx = 0; pIdx < page_seg_map.length; pIdx++) {
             if (page_seg_map[pIdx][0] === page) {
@@ -159,7 +159,7 @@ const JpcCommonHelper = {
         }
         return rst;
     },
-    getStringLinesInArea: function(area, strVal, chnW, otherW) {
+    getStringLinesInArea(area, strVal, chnW, otherW) {
         // 备注: 因后台的pdf kit判断字符串长度与前端的不一样,需要做些调整,不一次性地判断字符串长度。
         //      分2种字符:中文与非中文,按照各种字符的数量分别乘以相关一个字符的宽度再累计。
         //      另判断行数还不能直接用总长度除以宽度来计算,因每一行都会有不同的余量,所以得一行行走过来判断。
@@ -169,9 +169,10 @@ const JpcCommonHelper = {
             let txtWidth = 0;
             let currentW = 0;
             for (let sIdx = 0; sIdx < strVal.length; sIdx++) {
-                currentW = (strVal.charCodeAt(sIdx) > 127)?chnW:otherW;
+                currentW = (strVal.charCodeAt(sIdx) > 127) ? chnW : otherW;
                 txtWidth += currentW;
-                if (txtWidth > areaWidth) {
+                if (txtWidth > (areaWidth - 4)) {
+                    // 减4个像素是考虑到导出excel的情况
                     rst++;
                     txtWidth = currentW;
                 }
@@ -184,7 +185,7 @@ const JpcCommonHelper = {
         return rst;
         // 备注: 其实是想用canvas的,但node canvas装起来麻烦,暂时用PDF Kit来顶用一下,以后有更好的再换
     },
-    splitString: function(area, strVal, chnW, otherW) {
+    splitString(area, strVal, chnW, otherW) {
         const rst = [];
         if (strVal) {
             const areaWidth = area[JV.PROP_RIGHT] - area[JV.PROP_LEFT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_LEFT] - 1;
@@ -194,7 +195,8 @@ const JpcCommonHelper = {
             for (let sIdx = 0; sIdx < strVal.length; sIdx++) {
                 currentW = (strVal.charCodeAt(sIdx) > 127) ? chnW : otherW;
                 txtWidth += currentW;
-                if (txtWidth > areaWidth) {
+                if (txtWidth > (areaWidth - 4)) {
+                    // 减4个像素是考虑到导出excel的情况
                     if (preSIdx < sIdx) {
                         rst.push(strVal.substr(preSIdx, sIdx - preSIdx));
                         preSIdx = sIdx;
@@ -214,4 +216,4 @@ const JpcCommonHelper = {
     },
 };
 
-module.exports = JpcCommonHelper;
+module.exports = JpcCommonHelper;

+ 9 - 9
app/reports/rpt_component/helper/jpc_helper_field.js

@@ -8,7 +8,7 @@ const REG3 = new RegExp('\n', 'g');
 const REG4 = new RegExp('\r', 'g');
 
 const JpcFieldHelper = {
-    getValue: function(dataField, valueIdx) {
+    getValue(dataField, valueIdx) {
         let rst = '';
         if (dataField && (dataField.length > valueIdx) && (valueIdx >= 0)) {
             rst = dataField[valueIdx];
@@ -18,12 +18,12 @@ const JpcFieldHelper = {
         // }
         return rst;
     },
-    setValue: function(dataField, valueIdx, newValue) {
+    setValue(dataField, valueIdx, newValue) {
         if (dataField && (dataField.length > valueIdx) && (valueIdx >= 0)) {
             dataField[valueIdx] = newValue;
         }
     },
-    resetSumFormat: function(ref_tab_fields, sum_tab_field) {
+    resetSumFormat(ref_tab_fields, sum_tab_field) {
         let rst = false;
         if (ref_tab_fields && ref_tab_fields.length > 0) {
             for (const tab_field of ref_tab_fields) {
@@ -38,7 +38,7 @@ const JpcFieldHelper = {
         }
         return rst;
     },
-    resetFormat: function(tab_field, map_field, customizeCfg) {
+    resetFormat(tab_field, map_field, customizeCfg) {
         let rst = false;
         if (map_field && map_field[JV.PROP_PRECISION] && map_field[JV.PROP_PRECISION].type === 'fixed') {
             const formatStrs = ['#'];
@@ -63,14 +63,14 @@ const JpcFieldHelper = {
         }
         return rst;
     },
-    resetFlexibleFormat: function(tab_field, ref_field_data, flexiblePrecisionRefObj, valueIdx, customizeCfg) {
+    resetFlexibleFormat(tab_field, ref_field_data, flexiblePrecisionRefObj, valueIdx, customizeCfg) {
         let precisionAmt = 2;
         if (ref_field_data && flexiblePrecisionRefObj && valueIdx >= 0) {
             precisionAmt = flexiblePrecisionRefObj['refUnit_' + ref_field_data[valueIdx]];
             if (precisionAmt === null || precisionAmt === undefined) precisionAmt = flexiblePrecisionRefObj['refUnit_其他未列单位'];
         }
         const formatStrs = ['#.'];
-        const ffStr = (customizeCfg && customizeCfg.fillZero)?'0':'#';
+        const ffStr = (customizeCfg && customizeCfg.fillZero) ? '0' : '#';
         for (let idx = 0; idx < precisionAmt; idx++) {
             formatStrs.push(ffStr);
         }
@@ -80,7 +80,7 @@ const JpcFieldHelper = {
             tab_field[JV.PROP_FORMAT] = formatStrs.join('');
         }
     },
-    decorateValue: function(cell, controls) {
+    decorateValue(cell, controls) {
         if (controls) {
             const showZero = controls[cell[JV.PROP_CONTROL]][JV.PROP_SHOW_ZERO];
             if (showZero && showZero === 'F') {
@@ -100,7 +100,7 @@ const JpcFieldHelper = {
             }
         }
     },
-    findAndPutDataFieldIdx: function (rptTpl, tab_fields, rstFields, rstFieldsIdx, isEx) {
+    findAndPutDataFieldIdx(rptTpl, tab_fields, rstFields, rstFieldsIdx, isEx) {
         // 通过FieldID找到相关映射指标的位置IDX并记录下来,方便后续引用
         if (tab_fields) {
             const DTL_STR = isEx ? JV.NODE_DETAIL_FIELDS_EX : JV.NODE_DETAIL_FIELDS;
@@ -134,7 +134,7 @@ const JpcFieldHelper = {
             }
         }
     },
-    findAutoHeightFieldIdx: function(rptTpl, tab_fields, rstFieldsIdx, isEx) {
+    findAutoHeightFieldIdx(rptTpl, tab_fields, rstFieldsIdx, isEx) {
         if (tab_fields) {
             const DTL_STR = isEx ? JV.NODE_DETAIL_FIELDS_EX : JV.NODE_DETAIL_FIELDS;
             const detail_fields = rptTpl[JV.NODE_FIELD_MAP][DTL_STR];

+ 48 - 26
app/reports/rpt_component/helper/jpc_helper_flow_tab.js

@@ -1,16 +1,35 @@
-let JV = require('../jpc_value_define');
-let JpcCommonHelper = require('./jpc_helper_common');
+'use strict';
 
-let JpcFlowTabHelper = {
-    getMaxRowsPerPage: function(bands, rptTpl, isEx) {
+const JV = require('../jpc_value_define');
+const JpcCommonHelper = require('./jpc_helper_common');
+
+const JpcFlowTabHelper = {
+    getRowHeight(bands, rptTpl, isEx) {
+        let rst = 0;
+        const FLOW_INFO_STR = (!isEx) ? JV.NODE_FLOW_INFO : JV.NODE_FLOW_INFO_EX;
+        const tab = rptTpl[FLOW_INFO_STR][JV.NODE_FLOW_CONTENT];
+        const band = bands[tab[JV.PROP_BAND_NAME]];
+        if (band) {
+            let maxFieldMeasure = 1.0;
+            if (JV.CAL_TYPE_ABSTRACT === JpcCommonHelper.getPosCalculationType(tab[JV.PROP_CALCULATION])) {
+                const unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
+                maxFieldMeasure = 1.0 * rptTpl[FLOW_INFO_STR][JV.NODE_FLOW_CONTENT][JV.PROP_CMN_HEIGHT] * unitFactor;
+            } else {
+                maxFieldMeasure = (band.Bottom - band.Top) * rptTpl[FLOW_INFO_STR][JV.NODE_FLOW_CONTENT][JV.PROP_CMN_HEIGHT] / JV.HUNDRED_PERCENT;
+            }
+            rst = maxFieldMeasure;
+        }
+        return rst;
+    },
+    getMaxRowsPerPage(bands, rptTpl, isEx) {
         let rst = 1;
-        let FLOW_INFO_STR = (!isEx)?JV.NODE_FLOW_INFO:JV.NODE_FLOW_INFO_EX;
-        let tab = rptTpl[FLOW_INFO_STR][JV.NODE_FLOW_CONTENT];
-        let band = bands[tab[JV.PROP_BAND_NAME]];
+        const FLOW_INFO_STR = (!isEx) ? JV.NODE_FLOW_INFO : JV.NODE_FLOW_INFO_EX;
+        const tab = rptTpl[FLOW_INFO_STR][JV.NODE_FLOW_CONTENT];
+        const band = bands[tab[JV.PROP_BAND_NAME]];
         if (band) {
             let maxFieldMeasure = 1.0;
             if (JV.CAL_TYPE_ABSTRACT === JpcCommonHelper.getPosCalculationType(tab[JV.PROP_CALCULATION])) {
-                let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
+                const unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
                 maxFieldMeasure = 1.0 * rptTpl[FLOW_INFO_STR][JV.NODE_FLOW_CONTENT][JV.PROP_CMN_HEIGHT] * unitFactor;
             } else {
                 maxFieldMeasure = (band.Bottom - band.Top) * rptTpl[FLOW_INFO_STR][JV.NODE_FLOW_CONTENT][JV.PROP_CMN_HEIGHT] / JV.HUNDRED_PERCENT;
@@ -19,15 +38,15 @@ let JpcFlowTabHelper = {
         }
         return rst;
     },
-    getActualContentAreaHeight: function(bands, rptTpl, segments, rowAmt, page, isEx) {
+    getActualContentAreaHeight(bands, rptTpl, segments, rowAmt, page, isEx) {
         let rst = 1;
-        let FLOW_INFO_STR = (!isEx)?JV.NODE_FLOW_INFO:JV.NODE_FLOW_INFO_EX;
-        let tab = rptTpl[FLOW_INFO_STR][JV.NODE_FLOW_CONTENT];
-        let band = bands[tab[JV.PROP_BAND_NAME]];
+        const FLOW_INFO_STR = (!isEx) ? JV.NODE_FLOW_INFO : JV.NODE_FLOW_INFO_EX;
+        const tab = rptTpl[FLOW_INFO_STR][JV.NODE_FLOW_CONTENT];
+        const band = bands[tab[JV.PROP_BAND_NAME]];
         if (band) {
             let maxFieldMeasure = 1.0;
             if (JV.CAL_TYPE_ABSTRACT === JpcCommonHelper.getPosCalculationType(tab[JV.PROP_CALCULATION])) {
-                let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
+                const unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
                 maxFieldMeasure = 1.0 * rptTpl[FLOW_INFO_STR][JV.NODE_FLOW_CONTENT][JV.PROP_CMN_HEIGHT] * unitFactor;
             } else {
                 maxFieldMeasure = (band.Bottom - band.Top) * rptTpl[FLOW_INFO_STR][JV.NODE_FLOW_CONTENT][JV.PROP_CMN_HEIGHT] / JV.HUNDRED_PERCENT;
@@ -38,27 +57,30 @@ let JpcFlowTabHelper = {
         }
         return rst;
     },
-    chkSegEnd: function (bands, rptTpl, segmentLength, preRec, pageRecAmt, isEx) {
-        let me = this, rst = false;
-        let remainAmt = preRec + pageRecAmt - segmentLength;
+    chkSegEnd(bands, rptTpl, segmentLength, preRec, pageRecAmt, isEx) {
+        let me = this,
+            rst = false;
+        const remainAmt = preRec + pageRecAmt - segmentLength;
         rst = me.hasEnoughSpace(rptTpl, bands, remainAmt, isEx);
         return rst;
     },
-    hasEnoughSpace: function (rptTpl, bands, remainAmt, isEx) {
+    hasEnoughSpace(rptTpl, bands, remainAmt, isEx) {
         if (remainAmt < 0) return false;
-        let rst = true, measurement = 1.0, douDiffForCompare = 0.00001;
-        let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
-        let FLOW_INFO_STR = (!isEx)?JV.NODE_FLOW_INFO:JV.NODE_FLOW_INFO_EX;
-        let tab = rptTpl[FLOW_INFO_STR][JV.NODE_FLOW_CONTENT];
-        let band = bands[tab[JV.PROP_BAND_NAME]];
+        let rst = true,
+            measurement = 1.0,
+            douDiffForCompare = 0.00001;
+        const unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
+        const FLOW_INFO_STR = (!isEx) ? JV.NODE_FLOW_INFO : JV.NODE_FLOW_INFO_EX;
+        const tab = rptTpl[FLOW_INFO_STR][JV.NODE_FLOW_CONTENT];
+        const band = bands[tab[JV.PROP_BAND_NAME]];
         if (band !== null && band !== undefined) {
             measurement = 1.0 * tab[JV.PROP_CMN_HEIGHT] * unitFactor;
-            let spareHeight = measurement * remainAmt;
-            let douH = band.Bottom - band.Top;
+            const spareHeight = measurement * remainAmt;
+            const douH = band.Bottom - band.Top;
             rst = ((spareHeight >= douH) || ((spareHeight - douH) <= douDiffForCompare));
         }
         return rst;
-    }
+    },
 };
 
-module.exports = JpcFlowTabHelper;
+module.exports = JpcFlowTabHelper;

+ 489 - 489
app/reports/rpt_component/helper/jpc_helper_font_width.js

@@ -5,503 +5,503 @@
  */
 
 const fontWidthMap = {
-    '宋体': {
-        '宽': {
-            '_6': 6,
-            '_7': 7,
-            '_8': 8,
-            '_9': 9,
-            '_10': 10,
-            '_11': 11,
-            '_12': 12,
-            '_13': 13,
-            '_14': 14,
-            '_15': 15,
-            '_16': 16,
-            '_17': 17,
-            '_18': 18,
-            '_19': 19,
-            '_20': 20,
-            '_21': 21,
-            '_22': 22,
-            '_23': 23,
-            '_24': 24,
-            '_25': 25,
-            '_26': 26,
-            '_27': 27,
-            '_28': 28,
-            '_29': 29,
-            '_30': 30,
-            '_31': 31,
-            '_32': 32,
-            '_33': 33,
-            '_34': 34,
-            '_35': 35,
-            '_36': 36,
-            '_37': 37,
-            '_38': 38,
-            '_39': 39,
-            '_40': 40,
-            '_41': 41,
-            '_42': 42,
-            '_43': 43,
-            '_44': 44,
-            '_45': 45,
-            '_46': 46,
-            '_47': 47,
-            '_48': 48,
-            '_49': 49,
-            '_50': 50,
-            '_51': 51,
-            '_52': 52,
-            '_53': 53,
-            '_54': 54,
-            '_55': 55,
-            '_56': 56,
-            '_57': 57,
-            '_58': 58,
-            '_59': 59,
-            '_60': 60,
-            '_61': 61,
-            '_62': 62,
-            '_63': 63,
-            '_64': 64
+    宋体: {
+        宽: {
+            _6: 6,
+            _7: 7,
+            _8: 8,
+            _9: 9,
+            _10: 10,
+            _11: 11,
+            _12: 12,
+            _13: 13,
+            _14: 14,
+            _15: 15,
+            _16: 16,
+            _17: 17,
+            _18: 18,
+            _19: 19,
+            _20: 20,
+            _21: 21,
+            _22: 22,
+            _23: 23,
+            _24: 24,
+            _25: 25,
+            _26: 26,
+            _27: 27,
+            _28: 28,
+            _29: 29,
+            _30: 30,
+            _31: 31,
+            _32: 32,
+            _33: 33,
+            _34: 34,
+            _35: 35,
+            _36: 36,
+            _37: 37,
+            _38: 38,
+            _39: 39,
+            _40: 40,
+            _41: 41,
+            _42: 42,
+            _43: 43,
+            _44: 44,
+            _45: 45,
+            _46: 46,
+            _47: 47,
+            _48: 48,
+            _49: 49,
+            _50: 50,
+            _51: 51,
+            _52: 52,
+            _53: 53,
+            _54: 54,
+            _55: 55,
+            _56: 56,
+            _57: 57,
+            _58: 58,
+            _59: 59,
+            _60: 60,
+            _61: 61,
+            _62: 62,
+            _63: 63,
+            _64: 64,
+        },
+        窄: {
+            _6: 3,
+            _7: 3.5,
+            _8: 4,
+            _9: 4.5,
+            _10: 5,
+            _11: 5.5,
+            _12: 6,
+            _13: 6.5,
+            _14: 7,
+            _15: 7.5,
+            _16: 8,
+            _17: 8.5,
+            _18: 9,
+            _19: 9.5,
+            _20: 10,
+            _21: 10.5,
+            _22: 11,
+            _23: 11.5,
+            _24: 12,
+            _25: 12.5,
+            _26: 13,
+            _27: 13.5,
+            _28: 14,
+            _29: 14.5,
+            _30: 15,
+            _31: 15.5,
+            _32: 16,
+            _33: 16.5,
+            _34: 17,
+            _35: 17.5,
+            _36: 18,
+            _37: 18.5,
+            _38: 19,
+            _39: 19.5,
+            _40: 20,
+            _41: 20.5,
+            _42: 21,
+            _43: 21.5,
+            _44: 22,
+            _45: 22.5,
+            _46: 23,
+            _47: 23.5,
+            _48: 24,
+            _49: 24.5,
+            _50: 25,
+            _51: 25.5,
+            _52: 26,
+            _53: 26.5,
+            _54: 27,
+            _55: 27.5,
+            _56: 28,
+            _57: 28.5,
+            _58: 29,
+            _59: 29.5,
+            _60: 30,
+            _61: 30.5,
+            _62: 31,
+            _63: 31.5,
+            _64: 32,
         },
-        '窄': {
-            '_6': 3,
-            '_7': 3.5,
-            '_8': 4,
-            '_9': 4.5,
-            '_10': 5,
-            '_11': 5.5,
-            '_12': 6,
-            '_13': 6.5,
-            '_14': 7,
-            '_15': 7.5,
-            '_16': 8,
-            '_17': 8.5,
-            '_18': 9,
-            '_19': 9.5,
-            '_20': 10,
-            '_21': 10.5,
-            '_22': 11,
-            '_23': 11.5,
-            '_24': 12,
-            '_25': 12.5,
-            '_26': 13,
-            '_27': 13.5,
-            '_28': 14,
-            '_29': 14.5,
-            '_30': 15,
-            '_31': 15.5,
-            '_32': 16,
-            '_33': 16.5,
-            '_34': 17,
-            '_35': 17.5,
-            '_36': 18,
-            '_37': 18.5,
-            '_38': 19,
-            '_39': 19.5,
-            '_40': 20,
-            '_41': 20.5,
-            '_42': 21,
-            '_43': 21.5,
-            '_44': 22,
-            '_45': 22.5,
-            '_46': 23,
-            '_47': 23.5,
-            '_48': 24,
-            '_49': 24.5,
-            '_50': 25,
-            '_51': 25.5,
-            '_52': 26,
-            '_53': 26.5,
-            '_54': 27,
-            '_55': 27.5,
-            '_56': 28,
-            '_57': 28.5,
-            '_58': 29,
-            '_59': 29.5,
-            '_60': 30,
-            '_61': 30.5,
-            '_62': 31,
-            '_63': 31.5,
-            '_64': 32
-        }
     },
-    '黑体': {
-        '宽': {
-            '_6': 6,
-            '_7': 7,
-            '_8': 8,
-            '_9': 9,
-            '_10': 10,
-            '_11': 11,
-            '_12': 12,
-            '_13': 13,
-            '_14': 14,
-            '_15': 15,
-            '_16': 16,
-            '_17': 17,
-            '_18': 18,
-            '_19': 19,
-            '_20': 20,
-            '_21': 21,
-            '_22': 22,
-            '_23': 23,
-            '_24': 24,
-            '_25': 25,
-            '_26': 26,
-            '_27': 27,
-            '_28': 28,
-            '_29': 29,
-            '_30': 30,
-            '_31': 31,
-            '_32': 32,
-            '_33': 33,
-            '_34': 34,
-            '_35': 35,
-            '_36': 36,
-            '_37': 37,
-            '_38': 38,
-            '_39': 39,
-            '_40': 40,
-            '_41': 41,
-            '_42': 42,
-            '_43': 43,
-            '_44': 44,
-            '_45': 45,
-            '_46': 46,
-            '_47': 47,
-            '_48': 48,
-            '_49': 49,
-            '_50': 50,
-            '_51': 51,
-            '_52': 52,
-            '_53': 53,
-            '_54': 54,
-            '_55': 55,
-            '_56': 56,
-            '_57': 57,
-            '_58': 58,
-            '_59': 59,
-            '_60': 60,
-            '_61': 61,
-            '_62': 62,
-            '_63': 63,
-            '_64': 64
+    黑体: {
+        宽: {
+            _6: 6,
+            _7: 7,
+            _8: 8,
+            _9: 9,
+            _10: 10,
+            _11: 11,
+            _12: 12,
+            _13: 13,
+            _14: 14,
+            _15: 15,
+            _16: 16,
+            _17: 17,
+            _18: 18,
+            _19: 19,
+            _20: 20,
+            _21: 21,
+            _22: 22,
+            _23: 23,
+            _24: 24,
+            _25: 25,
+            _26: 26,
+            _27: 27,
+            _28: 28,
+            _29: 29,
+            _30: 30,
+            _31: 31,
+            _32: 32,
+            _33: 33,
+            _34: 34,
+            _35: 35,
+            _36: 36,
+            _37: 37,
+            _38: 38,
+            _39: 39,
+            _40: 40,
+            _41: 41,
+            _42: 42,
+            _43: 43,
+            _44: 44,
+            _45: 45,
+            _46: 46,
+            _47: 47,
+            _48: 48,
+            _49: 49,
+            _50: 50,
+            _51: 51,
+            _52: 52,
+            _53: 53,
+            _54: 54,
+            _55: 55,
+            _56: 56,
+            _57: 57,
+            _58: 58,
+            _59: 59,
+            _60: 60,
+            _61: 61,
+            _62: 62,
+            _63: 63,
+            _64: 64,
+        },
+        窄: {
+            _6: 3,
+            _7: 3.5,
+            _8: 4,
+            _9: 4.5,
+            _10: 5,
+            _11: 5.5,
+            _12: 6,
+            _13: 6.5,
+            _14: 7,
+            _15: 7.5,
+            _16: 8,
+            _17: 8.5,
+            _18: 9,
+            _19: 9.5,
+            _20: 10,
+            _21: 10.5,
+            _22: 11,
+            _23: 11.5,
+            _24: 12,
+            _25: 12.5,
+            _26: 13,
+            _27: 13.5,
+            _28: 14,
+            _29: 14.5,
+            _30: 15,
+            _31: 15.5,
+            _32: 16,
+            _33: 16.5,
+            _34: 17,
+            _35: 17.5,
+            _36: 18,
+            _37: 18.5,
+            _38: 19,
+            _39: 19.5,
+            _40: 20,
+            _41: 20.5,
+            _42: 21,
+            _43: 21.5,
+            _44: 22,
+            _45: 22.5,
+            _46: 23,
+            _47: 23.5,
+            _48: 24,
+            _49: 24.5,
+            _50: 25,
+            _51: 25.5,
+            _52: 26,
+            _53: 26.5,
+            _54: 27,
+            _55: 27.5,
+            _56: 28,
+            _57: 28.5,
+            _58: 29,
+            _59: 29.5,
+            _60: 30,
+            _61: 30.5,
+            _62: 31,
+            _63: 31.5,
+            _64: 32,
         },
-        '窄': {
-            '_6': 3,
-            '_7': 3.5,
-            '_8': 4,
-            '_9': 4.5,
-            '_10': 5,
-            '_11': 5.5,
-            '_12': 6,
-            '_13': 6.5,
-            '_14': 7,
-            '_15': 7.5,
-            '_16': 8,
-            '_17': 8.5,
-            '_18': 9,
-            '_19': 9.5,
-            '_20': 10,
-            '_21': 10.5,
-            '_22': 11,
-            '_23': 11.5,
-            '_24': 12,
-            '_25': 12.5,
-            '_26': 13,
-            '_27': 13.5,
-            '_28': 14,
-            '_29': 14.5,
-            '_30': 15,
-            '_31': 15.5,
-            '_32': 16,
-            '_33': 16.5,
-            '_34': 17,
-            '_35': 17.5,
-            '_36': 18,
-            '_37': 18.5,
-            '_38': 19,
-            '_39': 19.5,
-            '_40': 20,
-            '_41': 20.5,
-            '_42': 21,
-            '_43': 21.5,
-            '_44': 22,
-            '_45': 22.5,
-            '_46': 23,
-            '_47': 23.5,
-            '_48': 24,
-            '_49': 24.5,
-            '_50': 25,
-            '_51': 25.5,
-            '_52': 26,
-            '_53': 26.5,
-            '_54': 27,
-            '_55': 27.5,
-            '_56': 28,
-            '_57': 28.5,
-            '_58': 29,
-            '_59': 29.5,
-            '_60': 30,
-            '_61': 30.5,
-            '_62': 31,
-            '_63': 31.5,
-            '_64': 32
-        }
     },
-    '楷体': {
-        '宽': {
-            '_6': 6,
-            '_7': 7,
-            '_8': 8,
-            '_9': 9,
-            '_10': 10,
-            '_11': 11,
-            '_12': 12,
-            '_13': 13,
-            '_14': 14,
-            '_15': 15,
-            '_16': 16,
-            '_17': 17,
-            '_18': 18,
-            '_19': 19,
-            '_20': 20,
-            '_21': 21,
-            '_22': 22,
-            '_23': 23,
-            '_24': 24,
-            '_25': 25,
-            '_26': 26,
-            '_27': 27,
-            '_28': 28,
-            '_29': 29,
-            '_30': 30,
-            '_31': 31,
-            '_32': 32,
-            '_33': 33,
-            '_34': 34,
-            '_35': 35,
-            '_36': 36,
-            '_37': 37,
-            '_38': 38,
-            '_39': 39,
-            '_40': 40,
-            '_41': 41,
-            '_42': 42,
-            '_43': 43,
-            '_44': 44,
-            '_45': 45,
-            '_46': 46,
-            '_47': 47,
-            '_48': 48,
-            '_49': 49,
-            '_50': 50,
-            '_51': 51,
-            '_52': 52,
-            '_53': 53,
-            '_54': 54,
-            '_55': 55,
-            '_56': 56,
-            '_57': 57,
-            '_58': 58,
-            '_59': 59,
-            '_60': 60,
-            '_61': 61,
-            '_62': 62,
-            '_63': 63,
-            '_64': 64
+    楷体: {
+        宽: {
+            _6: 6,
+            _7: 7,
+            _8: 8,
+            _9: 9,
+            _10: 10,
+            _11: 11,
+            _12: 12,
+            _13: 13,
+            _14: 14,
+            _15: 15,
+            _16: 16,
+            _17: 17,
+            _18: 18,
+            _19: 19,
+            _20: 20,
+            _21: 21,
+            _22: 22,
+            _23: 23,
+            _24: 24,
+            _25: 25,
+            _26: 26,
+            _27: 27,
+            _28: 28,
+            _29: 29,
+            _30: 30,
+            _31: 31,
+            _32: 32,
+            _33: 33,
+            _34: 34,
+            _35: 35,
+            _36: 36,
+            _37: 37,
+            _38: 38,
+            _39: 39,
+            _40: 40,
+            _41: 41,
+            _42: 42,
+            _43: 43,
+            _44: 44,
+            _45: 45,
+            _46: 46,
+            _47: 47,
+            _48: 48,
+            _49: 49,
+            _50: 50,
+            _51: 51,
+            _52: 52,
+            _53: 53,
+            _54: 54,
+            _55: 55,
+            _56: 56,
+            _57: 57,
+            _58: 58,
+            _59: 59,
+            _60: 60,
+            _61: 61,
+            _62: 62,
+            _63: 63,
+            _64: 64,
+        },
+        窄: {
+            _6: 3,
+            _7: 3.5,
+            _8: 4,
+            _9: 4.5,
+            _10: 5,
+            _11: 5.5,
+            _12: 6,
+            _13: 6.5,
+            _14: 7,
+            _15: 7.5,
+            _16: 8,
+            _17: 8.5,
+            _18: 9,
+            _19: 9.5,
+            _20: 10,
+            _21: 10.5,
+            _22: 11,
+            _23: 11.5,
+            _24: 12,
+            _25: 12.5,
+            _26: 13,
+            _27: 13.5,
+            _28: 14,
+            _29: 14.5,
+            _30: 15,
+            _31: 15.5,
+            _32: 16,
+            _33: 16.5,
+            _34: 17,
+            _35: 17.5,
+            _36: 18,
+            _37: 18.5,
+            _38: 19,
+            _39: 19.5,
+            _40: 20,
+            _41: 20.5,
+            _42: 21,
+            _43: 21.5,
+            _44: 22,
+            _45: 22.5,
+            _46: 23,
+            _47: 23.5,
+            _48: 24,
+            _49: 24.5,
+            _50: 25,
+            _51: 25.5,
+            _52: 26,
+            _53: 26.5,
+            _54: 27,
+            _55: 27.5,
+            _56: 28,
+            _57: 28.5,
+            _58: 29,
+            _59: 29.5,
+            _60: 30,
+            _61: 30.5,
+            _62: 31,
+            _63: 31.5,
+            _64: 32,
         },
-        '窄': {
-            '_6': 3,
-            '_7': 3.5,
-            '_8': 4,
-            '_9': 4.5,
-            '_10': 5,
-            '_11': 5.5,
-            '_12': 6,
-            '_13': 6.5,
-            '_14': 7,
-            '_15': 7.5,
-            '_16': 8,
-            '_17': 8.5,
-            '_18': 9,
-            '_19': 9.5,
-            '_20': 10,
-            '_21': 10.5,
-            '_22': 11,
-            '_23': 11.5,
-            '_24': 12,
-            '_25': 12.5,
-            '_26': 13,
-            '_27': 13.5,
-            '_28': 14,
-            '_29': 14.5,
-            '_30': 15,
-            '_31': 15.5,
-            '_32': 16,
-            '_33': 16.5,
-            '_34': 17,
-            '_35': 17.5,
-            '_36': 18,
-            '_37': 18.5,
-            '_38': 19,
-            '_39': 19.5,
-            '_40': 20,
-            '_41': 20.5,
-            '_42': 21,
-            '_43': 21.5,
-            '_44': 22,
-            '_45': 22.5,
-            '_46': 23,
-            '_47': 23.5,
-            '_48': 24,
-            '_49': 24.5,
-            '_50': 25,
-            '_51': 25.5,
-            '_52': 26,
-            '_53': 26.5,
-            '_54': 27,
-            '_55': 27.5,
-            '_56': 28,
-            '_57': 28.5,
-            '_58': 29,
-            '_59': 29.5,
-            '_60': 30,
-            '_61': 30.5,
-            '_62': 31,
-            '_63': 31.5,
-            '_64': 32
-        }
     },
-    'Arial': {
-        '宽': {
-            '_6': 6,
-            '_7': 7,
-            '_8': 8,
-            '_9': 9,
-            '_10': 10,
-            '_11': 11,
-            '_12': 12,
-            '_13': 13,
-            '_14': 14,
-            '_15': 15,
-            '_16': 16,
-            '_17': 17,
-            '_18': 18,
-            '_19': 19,
-            '_20': 20,
-            '_21': 21,
-            '_22': 22,
-            '_23': 23,
-            '_24': 24,
-            '_25': 25,
-            '_26': 26,
-            '_27': 27,
-            '_28': 28,
-            '_29': 29,
-            '_30': 30,
-            '_31': 31,
-            '_32': 32,
-            '_33': 33,
-            '_34': 34,
-            '_35': 35,
-            '_36': 36,
-            '_37': 37,
-            '_38': 38,
-            '_39': 39,
-            '_40': 40,
-            '_41': 41,
-            '_42': 42,
-            '_43': 43,
-            '_44': 44,
-            '_45': 45,
-            '_46': 46,
-            '_47': 47,
-            '_48': 48,
-            '_49': 49,
-            '_50': 50,
-            '_51': 51,
-            '_52': 52,
-            '_53': 53,
-            '_54': 54,
-            '_55': 55,
-            '_56': 56,
-            '_57': 57,
-            '_58': 58,
-            '_59': 59,
-            '_60': 60,
-            '_61': 61,
-            '_62': 62,
-            '_63': 63,
-            '_64': 64
+    Arial: {
+        宽: {
+            _6: 6,
+            _7: 7,
+            _8: 8,
+            _9: 9,
+            _10: 10,
+            _11: 11,
+            _12: 12,
+            _13: 13,
+            _14: 14,
+            _15: 15,
+            _16: 16,
+            _17: 17,
+            _18: 18,
+            _19: 19,
+            _20: 20,
+            _21: 21,
+            _22: 22,
+            _23: 23,
+            _24: 24,
+            _25: 25,
+            _26: 26,
+            _27: 27,
+            _28: 28,
+            _29: 29,
+            _30: 30,
+            _31: 31,
+            _32: 32,
+            _33: 33,
+            _34: 34,
+            _35: 35,
+            _36: 36,
+            _37: 37,
+            _38: 38,
+            _39: 39,
+            _40: 40,
+            _41: 41,
+            _42: 42,
+            _43: 43,
+            _44: 44,
+            _45: 45,
+            _46: 46,
+            _47: 47,
+            _48: 48,
+            _49: 49,
+            _50: 50,
+            _51: 51,
+            _52: 52,
+            _53: 53,
+            _54: 54,
+            _55: 55,
+            _56: 56,
+            _57: 57,
+            _58: 58,
+            _59: 59,
+            _60: 60,
+            _61: 61,
+            _62: 62,
+            _63: 63,
+            _64: 64,
+        },
+        窄: {
+            _6: 3.3399999141693115,
+            _7: 3.8899998664855957,
+            _8: 4.449999809265137,
+            _9: 5.009999752044678,
+            _10: 5.559999942779541,
+            _11: 6.119999885559082,
+            _12: 6.670000076293945,
+            _13: 7.230000019073486,
+            _14: 7.789999961853027,
+            _15: 8.34000015258789,
+            _16: 8.899999618530273,
+            _17: 9.449999809265136,
+            _18: 10.010000228881836,
+            _19: 10.569999694824218,
+            _20: 11.119999885559082,
+            _21: 11.679999351501464,
+            _22: 12.239999771118164,
+            _23: 12.789999961853027,
+            _24: 13.34999942779541,
+            _25: 13.899999618530273,
+            _26: 14.460000038146972,
+            _27: 15.019999504089355,
+            _28: 15.569999694824218,
+            _29: 16.1299991607666,
+            _30: 16.68000030517578,
+            _31: 17.239999771118164,
+            _32: 17.799999237060547,
+            _33: 18.350000381469726,
+            _34: 18.90999984741211,
+            _35: 19.469999313354492,
+            _36: 20.020000457763672,
+            _37: 20.579999923706054,
+            _38: 21.1299991607666,
+            _39: 21.689998626708984,
+            _40: 22.25,
+            _41: 22.799999237060547,
+            _42: 23.35999870300293,
+            _43: 23.90999984741211,
+            _44: 24.469999313354492,
+            _45: 25.029998779296875,
+            _46: 25.579999923706054,
+            _47: 26.139999389648437,
+            _48: 26.69999885559082,
+            _49: 27.25,
+            _50: 27.809999465942383,
+            _51: 28.35999870300293,
+            _52: 28.920000076293945,
+            _53: 29.479999542236328,
+            _54: 30.029998779296875,
+            _55: 30.59000015258789,
+            _56: 31.139999389648437,
+            _57: 31.69999885559082,
+            _58: 32.2599983215332,
+            _59: 32.80999755859375,
+            _60: 33.369998931884766,
+            _61: 33.93000030517578,
+            _62: 34.47999954223633,
+            _63: 35.040000915527344,
+            _64: 35.59000015258789,
         },
-        '窄': {
-            '_6': 3.3399999141693115,
-            '_7': 3.8899998664855957,
-            '_8': 4.449999809265137,
-            '_9': 5.009999752044678,
-            '_10': 5.559999942779541,
-            '_11': 6.119999885559082,
-            '_12': 6.670000076293945,
-            '_13': 7.230000019073486,
-            '_14': 7.789999961853027,
-            '_15': 8.34000015258789,
-            '_16': 8.899999618530273,
-            '_17': 9.449999809265136,
-            '_18': 10.010000228881836,
-            '_19': 10.569999694824218,
-            '_20': 11.119999885559082,
-            '_21': 11.679999351501464,
-            '_22': 12.239999771118164,
-            '_23': 12.789999961853027,
-            '_24': 13.34999942779541,
-            '_25': 13.899999618530273,
-            '_26': 14.460000038146972,
-            '_27': 15.019999504089355,
-            '_28': 15.569999694824218,
-            '_29': 16.1299991607666,
-            '_30': 16.68000030517578,
-            '_31': 17.239999771118164,
-            '_32': 17.799999237060547,
-            '_33': 18.350000381469726,
-            '_34': 18.90999984741211,
-            '_35': 19.469999313354492,
-            '_36': 20.020000457763672,
-            '_37': 20.579999923706054,
-            '_38': 21.1299991607666,
-            '_39': 21.689998626708984,
-            '_40': 22.25,
-            '_41': 22.799999237060547,
-            '_42': 23.35999870300293,
-            '_43': 23.90999984741211,
-            '_44': 24.469999313354492,
-            '_45': 25.029998779296875,
-            '_46': 25.579999923706054,
-            '_47': 26.139999389648437,
-            '_48': 26.69999885559082,
-            '_49': 27.25,
-            '_50': 27.809999465942383,
-            '_51': 28.35999870300293,
-            '_52': 28.920000076293945,
-            '_53': 29.479999542236328,
-            '_54': 30.029998779296875,
-            '_55': 30.59000015258789,
-            '_56': 31.139999389648437,
-            '_57': 31.69999885559082,
-            '_58': 32.2599983215332,
-            '_59': 32.80999755859375,
-            '_60': 33.369998931884766,
-            '_61': 33.93000030517578,
-            '_62': 34.47999954223633,
-            '_63': 35.040000915527344,
-            '_64': 35.59000015258789
-        }
     },
-    getFontWidth: function(fontName, fontHeight, typeStr) {
+    getFontWidth(fontName, fontHeight, typeStr) {
         let rst = 12;
         if (fontWidthMap[fontName]) {
             rst = fontWidthMap[fontName][typeStr]['_' + fontHeight];

+ 1 - 1
app/reports/rpt_component/jpc_bill_tab.js

@@ -61,7 +61,7 @@ JpcBillTabSrv.prototype.createNew = function() {
         rst = rst.concat(JpcDiscreteHelper.outputPreviewDiscreteInfo(rptTpl[JV.NODE_BILL_INFO][JV.NODE_DISCRETE_INFO], bands, unitFactor, pageStatus));
         return rst;
     };
-    JpcBillTabResult.outputAsSimpleJSONPage = function(rptTpl, dataObj, page, bands, controls, $CURRENT_RPT, customizeCfg) {
+    JpcBillTabResult.outputAsSimpleJSONPage = function(rptTpl, dataObj, page, bands, controls, fonts, $CURRENT_RPT, customizeCfg) {
         const me = this;
         let rst = [];
         me.signatureRst = [];

+ 6 - 6
app/reports/rpt_component/jpc_cross_tab.js

@@ -263,7 +263,7 @@ JpcCrossTabSrv.prototype.createNew = function() {
                             if (isNaN(vTtl)) {
                                 vTtl = 0;
                             }
-                            //rowGrandTotal[di] = rowGrandTotal[di] + 1.0 * vTtl;
+                            // rowGrandTotal[di] = rowGrandTotal[di] + 1.0 * vTtl;
                             rowGrandTotal[di] = bc.add(rowGrandTotal[di], vTtl);
                         }
                     }
@@ -392,8 +392,8 @@ JpcCrossTabSrv.prototype.createNew = function() {
                             if ((segIdx === segCnt - 1) && pageStatus[JV.STATUS_CROSS_ROW_END] && pageStatus[JV.STATUS_CROSS_COL_END]) {
                                 pageStatus[JV.STATUS_REPORT_END] = true;
                                 private_resetBandArea();
-                                let hasAdHocColEnd = !JpcCrossTabHelper.chkTabEnd(JV.NODE_CROSS_COL_SUM, rptTpl, bands, me.sortedColSequence, segIdx, (colSplitCnt - 1) * orgMaxColRec, maxColRec);
-                                let hasAdHocRowEnd = !JpcCrossTabHelper.chkTabEnd(JV.NODE_CROSS_ROW_SUM, rptTpl, bands, me.sortedRowSequence, segIdx, (rowSplitCnt - 1) * orgMaxRowRec, maxRowRec);
+                                const hasAdHocColEnd = !JpcCrossTabHelper.chkTabEnd(JV.NODE_CROSS_COL_SUM, rptTpl, bands, me.sortedColSequence, segIdx, (colSplitCnt - 1) * orgMaxColRec, maxColRec);
+                                const hasAdHocRowEnd = !JpcCrossTabHelper.chkTabEnd(JV.NODE_CROSS_ROW_SUM, rptTpl, bands, me.sortedRowSequence, segIdx, (rowSplitCnt - 1) * orgMaxRowRec, maxRowRec);
                                 if (hasAdHocColEnd || hasAdHocRowEnd) {
                                     needOneMoreRptEnd = true;
                                     pageStatus[JV.STATUS_REPORT_END] = false;
@@ -445,8 +445,8 @@ JpcCrossTabSrv.prototype.createNew = function() {
                             if ((segIdx === segCnt - 1) && pageStatus[JV.STATUS_CROSS_ROW_END] && pageStatus[JV.STATUS_CROSS_COL_END]) {
                                 pageStatus[JV.STATUS_REPORT_END] = true;
                                 private_resetBandArea();
-                                let hasAdHocColEnd = !JpcCrossTabHelper.chkTabEnd(JV.NODE_CROSS_COL_SUM, rptTpl, bands, me.sortedColSequence, segIdx, (colSplitCnt - 1) * orgMaxColRec, maxColRec);
-                                let hasAdHocRowEnd = !JpcCrossTabHelper.chkTabEnd(JV.NODE_CROSS_ROW_SUM, rptTpl, bands, me.sortedRowSequence, segIdx, (rowSplitCnt - 1) * orgMaxRowRec, maxRowRec);
+                                const hasAdHocColEnd = !JpcCrossTabHelper.chkTabEnd(JV.NODE_CROSS_COL_SUM, rptTpl, bands, me.sortedColSequence, segIdx, (colSplitCnt - 1) * orgMaxColRec, maxColRec);
+                                const hasAdHocRowEnd = !JpcCrossTabHelper.chkTabEnd(JV.NODE_CROSS_ROW_SUM, rptTpl, bands, me.sortedRowSequence, segIdx, (rowSplitCnt - 1) * orgMaxRowRec, maxRowRec);
                                 if (hasAdHocColEnd || hasAdHocRowEnd) {
                                     needOneMoreRptEnd = true;
                                     pageStatus[JV.STATUS_REPORT_END] = false;
@@ -572,7 +572,7 @@ JpcCrossTabSrv.prototype.createNew = function() {
         }
         return rst;
     };
-    JpcCrossTabResult.outputAsSimpleJSONPage = function(rptTpl, dataObj, page, bands, controls, $CURRENT_RPT, customizeCfg) {
+    JpcCrossTabResult.outputAsSimpleJSONPage = function(rptTpl, dataObj, page, bands, controls, fonts, $CURRENT_RPT, customizeCfg) {
         const me = this;
         let rst = [];
         const tabRstLst = [];

+ 6 - 6
app/reports/rpt_component/jpc_ex.js

@@ -341,7 +341,7 @@ JpcExSrv.prototype.createNew = function() {
                 for (let page = startPage; page <= endPage; page++) {
                     me.runTimePageData.currentPage = page;
                     me.executeFormulas($CTX_HELPER, JV.RUN_TYPE_BEFORE_OUTPUT, rptTpl, dataObj, me, $CUSTOM_DEFINE, defProperties);
-                    rst.items.push(me.outputAsSimpleJSONPage(rptTpl, dataObj, bands, page, rst[JV.NODE_CONTROL_COLLECTION], customizeCfg));
+                    rst.items.push(me.outputAsSimpleJSONPage(rptTpl, dataObj, bands, page, rst[JV.NODE_CONTROL_COLLECTION], rst[JV.NODE_FONT_COLLECTION], customizeCfg));
                 }
                 if (bands[JV.BAND_PROP_MERGE_BAND]) {
                     const mergedBand = {};
@@ -361,7 +361,7 @@ JpcExSrv.prototype.createNew = function() {
         }
         return rst;
     };
-    JpcResult.outputAsSimpleJSONPage = function(rptTpl, dataObj, bands, page, controls, customizeCfg) {
+    JpcResult.outputAsSimpleJSONPage = function(rptTpl, dataObj, bands, page, controls, fonts, customizeCfg) {
         const me = this;
         let rst = null;
         function getPageMergeBorder() {
@@ -388,7 +388,7 @@ JpcExSrv.prototype.createNew = function() {
                     if (me.flowTab.paging_option === JV.PAGING_OPTION_INFINITY) {
                         adHocMergePos = {};
                     }
-                    rst[JV.PROP_CELLS] = me.flowTab.outputAsSimpleJSONPage(rptTpl, dataObj, page, bands, controls, adHocMergePos, me, customizeCfg);
+                    rst[JV.PROP_CELLS] = me.flowTab.outputAsSimpleJSONPage(rptTpl, dataObj, page, bands, controls, fonts, adHocMergePos, me, customizeCfg);
                     rst[JV.PROP_SIGNATURE_CELLS] = me.flowTab.signatureRst;
                     rst[JV.PROP_SIGNATURE_DATE_CELLS] = me.flowTab.signatureDateRst;
                     rst[JV.PROP_SIGNATURE_AUDIT_CELLS] = me.flowTab.signatureAuditRst;
@@ -399,19 +399,19 @@ JpcExSrv.prototype.createNew = function() {
 
                 } else {
                     if (!me.isFollowMode) {
-                        rst[JV.PROP_CELLS] = me.flowTabEx.outputAsSimpleJSONPage(rptTpl, dataObj, page - (me.totalPages - me.exTotalPages), bands, controls, adHocMergePos, me, customizeCfg);
+                        rst[JV.PROP_CELLS] = me.flowTabEx.outputAsSimpleJSONPage(rptTpl, dataObj, page - (me.totalPages - me.exTotalPages), bands, controls, fonts, adHocMergePos, me, customizeCfg);
                         rst[JV.PROP_SIGNATURE_CELLS] = me.flowTabEx.signatureRst;
                         rst[JV.PROP_SIGNATURE_DATE_CELLS] = me.flowTabEx.signatureDateRst;
                         rst[JV.PROP_SIGNATURE_AUDIT_CELLS] = me.flowTabEx.signatureAuditRst;
                     }
                 }
             } else if (me.crossTab) {
-                rst[JV.PROP_CELLS] = me.crossTab.outputAsSimpleJSONPage(rptTpl, dataObj, page, bands, controls, me, customizeCfg);
+                rst[JV.PROP_CELLS] = me.crossTab.outputAsSimpleJSONPage(rptTpl, dataObj, page, bands, controls, fonts, me, customizeCfg);
                 rst[JV.PROP_SIGNATURE_CELLS] = me.crossTab.signatureRst;
                 rst[JV.PROP_SIGNATURE_DATE_CELLS] = me.crossTab.signatureDateRst;
                 rst[JV.PROP_SIGNATURE_AUDIT_CELLS] = me.crossTab.signatureAuditRst;
             } else if (me.billTab) {
-                rst[JV.PROP_CELLS] = me.billTab.outputAsSimpleJSONPage(rptTpl, dataObj, page, bands, controls, me, customizeCfg);
+                rst[JV.PROP_CELLS] = me.billTab.outputAsSimpleJSONPage(rptTpl, dataObj, page, bands, controls, fonts, me, customizeCfg);
                 rst[JV.PROP_SIGNATURE_CELLS] = me.billTab.signatureRst;
                 rst[JV.PROP_SIGNATURE_DATE_CELLS] = me.billTab.signatureDateRst;
                 rst[JV.PROP_SIGNATURE_AUDIT_CELLS] = me.billTab.signatureAuditRst;

+ 124 - 12
app/reports/rpt_component/jpc_flow_tab.js

@@ -401,6 +401,7 @@ JpcFlowTabSrv.prototype.createNew = function() {
             };
             const private_get_max_lines_of_the_record = function(theRecIdx) {
                 let rst = 1;
+                let maxAmt = 1;
                 for (let loop = 0; loop < me.auto_height_fields_idx.length; loop++) {
                     /*
                     let data_field = null;
@@ -424,20 +425,24 @@ JpcFlowTabSrv.prototype.createNew = function() {
                         let value = JpcFieldHelper.getValue(data_field, theRecIdx);
                         const area = JpcAreaHelper.outputArea(tab_field[JV.PROP_AREA], band, 1, 1, 0, 1, 0, 1, 0, false, false);
                         if (value !== null && value !== undefined) {
-                            // value = value.replace('\t', '');
-                            value = value.replace(reg1, '|').replace(reg2, '|').replace(reg3, '|').replace(reg4, '|').replace(reg5, '');
+                            if (typeof value === 'string') {
+                                value = value.replace('\t', '');
+                                value = value.replace(reg1, '|').replace(reg2, '|').replace(reg3, '|').replace(reg4, '|').replace(reg5, '');
+                            } else {
+                                value = '' + value;
+                            }
                         } else {
                             value = '';
                         }
                         JpcFieldHelper.setValue(data_field, theRecIdx, value);
                         const values = value.split('|');
-                        if (values.length > rst) rst = values.length;
+                        // if (values.length > rst) rst = values.length; // 考虑到紧凑输出,不能那么快设置rst
                         const font = private_get_font(tab_field[JV.PROP_FONT]);
                         let chkFontName = '宋体';
                         let chkFontHeight = 12;
                         if (font) {
                             chkFontName = font[JV.FONT_PROPS[0]];
-                            chkFontHeight = font[JV.FONT_PROPS[JV.FONT_PROP_IDX_HEIGHT]];
+                            chkFontHeight = parseFloat(font[JV.FONT_PROPS[JV.FONT_PROP_IDX_HEIGHT]]);
                         }
                         let hasSplitStr = false;
                         let splitStrArr = [];
@@ -452,7 +457,20 @@ JpcFlowTabSrv.prototype.createNew = function() {
                                 splitStrArr.push(i);
                             }
                         }
-                        if (accAmt > rst) rst = accAmt;
+                        // if (accAmt > rst) rst = accAmt;
+                        if (rst > 3) {
+                            // 新优化,计算实际能显示完的真正行数
+                            const rowHeight = JpcFlowTabHelper.getRowHeight(bands, rptTpl, me.isEx);
+                            const tmpFV = ((chkFontHeight + JV.CLOSE_OUTPUT_ROW_BUFFER) * accAmt) / rowHeight;
+                            let tmpAmt = Math.floor(tmpFV);
+                            if (Math.ceil(tmpFV) > tmpAmt) {
+                                tmpAmt++;
+                            }
+                            // rst = tmpAmt;
+                            if (maxAmt < tmpAmt) maxAmt = tmpAmt;
+                        } else {
+                            if (maxAmt < accAmt) maxAmt = accAmt;
+                        }
                         // if (hasSplitStr && outputType !== JV.OUTPUT_TYPE_EXCEL) {
                         if (hasSplitStr) {
                             let newValArr = [];
@@ -471,6 +489,7 @@ JpcFlowTabSrv.prototype.createNew = function() {
                         //      根据最新需求,暂时不考虑excel类型输出,换回原来逻辑
                     }
                 }
+                if (rst < maxAmt) rst = maxAmt; // 最后才设置最大结果
                 return rst;
             };
             for (const tabField of tab_fields) {
@@ -862,7 +881,7 @@ JpcFlowTabSrv.prototype.createNew = function() {
         rst = rst.concat(JpcDiscreteHelper.outputPreviewDiscreteInfo(rptTpl[JV.NODE_FLOW_INFO][JV.NODE_DISCRETE_INFO], bands, unitFactor, pageStatus));
         return rst;
     };
-    JpcFlowTabResult.outputAsSimpleJSONPage = function(rptTpl, dataObj, page, bands, controls, adHocMergePos, $CURRENT_RPT, customizeCfg) {
+    JpcFlowTabResult.outputAsSimpleJSONPage = function(rptTpl, dataObj, page, bands, controls, fonts, adHocMergePos, $CURRENT_RPT, customizeCfg) {
         const me = this;
         let rst = [];
         const tabRstLst = [];
@@ -894,7 +913,7 @@ JpcFlowTabSrv.prototype.createNew = function() {
             const 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, customizeCfg));
+            tabRstLst.push(me.outputContent(rptTpl, dataObj, page, bands, unitFactor, controls, fonts, 0, $CURRENT_RPT, customizeCfg));
             // 2.2 Column tab
             tabRstLst.push(me.outputColumn(rptTpl, dataObj, page, segIdx, 0, bands, unitFactor, 0, $CURRENT_RPT, customizeCfg));
             // 2.3 Sum Seg
@@ -929,7 +948,7 @@ JpcFlowTabSrv.prototype.createNew = function() {
             for (let pi = 0; pi < me.multiCols; pi++) {
                 const actualPage = (page - 1) * me.multiCols + pi + 1;
                 // 2.1 Content-Tab
-                tabRstLst.push(me.outputContent(rptTpl, dataObj, actualPage, bands, unitFactor, controls, pi, $CURRENT_RPT, customizeCfg));
+                tabRstLst.push(me.outputContent(rptTpl, dataObj, actualPage, bands, unitFactor, controls, fonts, pi, $CURRENT_RPT, customizeCfg));
                 // 2.2 Column tab
                 tabRstLst.push(me.outputColumn(rptTpl, dataObj, actualPage, segIdx, segPageIdx, bands, unitFactor, pi, $CURRENT_RPT, customizeCfg));
                 // 2.3 Sum Seg
@@ -949,15 +968,57 @@ JpcFlowTabSrv.prototype.createNew = function() {
         }
         return rst;
     };
-    JpcFlowTabResult.combinePageCells = function(rstPageCells, verticalCombinePos, horizonCombinePos) {
+    JpcFlowTabResult.combinePageCells = function(rstPageCells, verticalCombinePos, horizonCombinePos, controls, fonts) {
         // let me = this;
         // 备注:纵向合并要考虑以下因素:
         //     如果有多个column纵向合并,需要总体考虑分割,
         //     假如:第一列的前3个数据(1、2、3)是相同的,第二列中第2、3、4行数据相同,那么第二列只能合并2、3行的数据,不能合并到第四行
         //     同理如此类推第三列...n列
+        // 另:要考虑紧密输出情况,需要重新拆分数据
+        const _splitValues = function(oCell) {
+            // JpcFieldHelper.setValue(data_field, theRecIdx, value);
+            const values = oCell.Value.split('|');
+            let font = oCell[JV.PROP_FONT];
+            if (typeof oCell[JV.PROP_FONT] === 'string') {
+                font = fonts[oCell[JV.PROP_FONT]];
+            }
+            // // if (values.length > rst) rst = values.length; // 考虑到紧凑输出,不能那么快设置rst
+            // const font = private_get_font(tab_field[JV.PROP_FONT]);
+            let chkFontName = '宋体';
+            let chkFontHeight = 12;
+            if (font) {
+                chkFontName = font[JV.FONT_PROPS[0]];
+                chkFontHeight = parseFloat(font[JV.FONT_PROPS[JV.FONT_PROP_IDX_HEIGHT]]);
+            }
+            let hasSplitStr = false;
+            const splitStrArr = [];
+            let accAmt = 0;
+            const chnW = fontWidthMap.getFontWidth(chkFontName, chkFontHeight, '宽');
+            const otherW = fontWidthMap.getFontWidth(chkFontName, chkFontHeight, '窄');
+            for (let i = 0; i < values.length; i++) {
+                const amt = JpcCommonHelper.getStringLinesInArea(oCell.area, values[i], chnW, otherW);
+                accAmt += amt;
+                if (amt > 1) {
+                    hasSplitStr = true;
+                    splitStrArr.push(i);
+                }
+            }
+            if (hasSplitStr) {
+                let newValArr = [];
+                for (let i = 0; i < values.length; i++) {
+                    if (splitStrArr.indexOf(i) < 0) {
+                        newValArr.push(values[i]);
+                    } else {
+                        newValArr = newValArr.concat(JpcCommonHelper.splitString(oCell.area, values[i], chnW, otherW));
+                    }
+                }
+                oCell.Value = newValArr.join('|');
+            }
+        };
         if (verticalCombinePos.length > 0 || horizonCombinePos.length > 1) {
             const cacheObj = { vCache: {}, hCache: {}, hCacheStr: [] };
             const removeCellIds = [];
+            const reservedCells = [];
             for (const vPosArr of verticalCombinePos) {
                 const pStr = '_' + vPosArr[0] + '_' + vPosArr[1];
                 cacheObj.vCache[pStr] = [];
@@ -1021,6 +1082,9 @@ JpcFlowTabSrv.prototype.createNew = function() {
                                 if (preCell.Value === rstPageCells[cacheObj.vCache[pStr][cIdx]].Value) {
                                     const bkBottom = preCell[JV.PROP_AREA][JV.PROP_BOTTOM];
                                     preCell[JV.PROP_AREA][JV.PROP_BOTTOM] = rstPageCells[cacheObj.vCache[pStr][cIdx]][JV.PROP_AREA][JV.PROP_BOTTOM];
+                                    if (reservedCells.indexOf(preCell) < 0) {
+                                        reservedCells.push(preCell);
+                                    }
                                     if (private_chk_in_pre_merge(vidx, preCell)) {
                                         removeCellIds.push(cacheObj.vCache[pStr][cIdx]);
                                         if (cIdx === cacheObj.vCache[pStr].length - 1) {
@@ -1072,6 +1136,12 @@ JpcFlowTabSrv.prototype.createNew = function() {
                     rstPageCells.splice(removeCellIds[idx], 1);
                 }
             }
+            if (reservedCells.length > 0) {
+                for (const rCell of reservedCells) {
+                    // 要拆分下数据
+                    _splitValues(rCell);
+                }
+            }
         }
     };
     JpcFlowTabResult.outputPreviewContent = function(rptTpl, bands, unitFactor, controls, pageStatus, maxRec) {
@@ -1094,7 +1164,7 @@ JpcFlowTabSrv.prototype.createNew = function() {
         }
         return rst;
     };
-    JpcFlowTabResult.outputContent = function(rptTpl, dataObj, page, bands, unitFactor, controls, multiColIdx, $CURRENT_RPT, customizeCfg) {
+    JpcFlowTabResult.outputContent = function(rptTpl, dataObj, page, bands, unitFactor, controls, fonts, multiColIdx, $CURRENT_RPT, customizeCfg) {
         const me = this;
         let rst = [];
         const prepareObj = {};
@@ -1284,7 +1354,7 @@ JpcFlowTabSrv.prototype.createNew = function() {
             rst.splice(eliminateCells[idIdx], 1);
         }
         me.checkCombineEvent(JV.RUN_TYPE_BEFORE_COMBINE, verticalCombinePos, horizonCombinePos, rst, $CURRENT_RPT, dataObj);
-        me.combinePageCells(rst, verticalCombinePos, horizonCombinePos);
+        me.combinePageCells(rst, verticalCombinePos, horizonCombinePos, controls, fonts);
         me.checkCombineEvent(JV.RUN_TYPE_AFTER_COMBINE, verticalCombinePos, horizonCombinePos, rst, $CURRENT_RPT, dataObj);
         return rst;
     };
@@ -1423,11 +1493,53 @@ JpcFlowTabSrv.prototype.createNew = function() {
             if (showText) {
                 textArr = textArr.concat(showText.split('|'));
             }
+            /*
             if (contentValInfo[3] < textArr.length && contentValInfo[3] >= 0) {
                 showText = textArr[contentValInfo[3]];
             } else {
                 showText = '';
             }
+            /*/
+            // 因新逻辑要优化自动行高,不再是一个折行占用1row,而是:
+            // a. 根据实际情况,设置了一个实际的行数值(比如共有10行,根据行高情况,可能只设置了6行的高度,在setupAutoHeightData方法里处理)
+            // b. 这里最大的难题在于跨页分配(预估会有来回调整,目前采用按比例分配原则)
+            // c. 还有个问题就是多个自动行高指标的问题
+            const ACT_ROWS = contentValInfo[4]; // 经实际计算,能容纳所有数据的实际行数
+            const CURRENT_ROW = contentValInfo[3]; // 从0开始
+            const QUOTA_Rate = textArr.length / ACT_ROWS; // 每行显示的加权系数(超过2的话,表示给的行高太多了,需要另外一些特殊处理,后期有需要再加)
+            if (textArr.length <= 3 || ACT_ROWS > textArr.length) {
+                // 表示这个一定是附属的autoheight指标,或者数据就只有3行(假如数据3行精简成2行,但刚好处于分页状态,那么无论是前一页或后一页,显示上都很纠结(多出来的一行放哪好?),所以新逻辑的起点要3行以上,少了就不折腾了,老老实实地一个萝卜一个坑)
+                if (CURRENT_ROW < textArr.length && CURRENT_ROW >= 0) {
+                    showText = textArr[CURRENT_ROW];
+                } else {
+                    showText = '';
+                }
+            } else {
+                // 这里不管是不是附属autoheight指标,有足够的条件单独处理
+                if (QUOTA_Rate >= 2) {
+                    // 压缩超过一半空间的话,说明给的行高度太高了,需要另外一些特殊处理,后期有需要再加
+                    console.log('压缩率异常!!!!!');
+                } else {
+                    // 正常的压缩比例
+                    let startIdx = 0,
+                        endIdx = 0;
+                    if (CURRENT_ROW > 0) {
+                        endIdx = Math.round((CURRENT_ROW + 1) * QUOTA_Rate) - 1;
+                        let preEndIdx = 0;
+                        if (CURRENT_ROW > 1) {
+                            // 重定位 preEndIdx
+                            preEndIdx = Math.round(CURRENT_ROW * QUOTA_Rate) - 1;
+                        }
+                        startIdx = preEndIdx + 1;
+                    }
+                    // 按比例分配
+                    showText = textArr[startIdx];
+                    for (let idx = startIdx + 1; idx <= endIdx; idx++) {
+                        showText += `|${textArr[idx]}`;
+                    }
+                }
+            }
+            // */
             rst = JpcCommonOutputHelper.createCommonOutput(tab_field, showText, controls);
             rst[JV.PROP_AREA] = JpcAreaHelper.outputArea(tab_field[JV.PROP_AREA], band, unitFactor, rows, rowIdx, cols, colIdx, me.multiCols, multiColIdx, true, false);
             rst[JV.PROP_IS_AUTO_HEIGHT] = true;
@@ -1456,7 +1568,7 @@ JpcFlowTabSrv.prototype.createNew = function() {
             for (const txt of grp_line[JV.PROP_TEXTS]) {
                 me.checkGrpTxtOutEvent(JV.RUN_TYPE_BEFORE_GROUP_TEXT_OUT, txt, grpCntIdx, $CURRENT_RPT, $CURRENT_DATA);
                 rst.push(JpcTextHelper.outputText(txt, band, unitFactor, rows, rowIdx, cols, colIdx, me.multiCols, multiColIdx));
-                // me.combinePageCells(rst, verticalCombinePos, horizonCombinePos);
+                // me.combinePageCells(rst, verticalCombinePos, horizonCombinePos, controls);
                 // 可能会有一个After,但意义不大,用不着
             }
         }

+ 1 - 0
app/reports/rpt_component/jpc_value_define.js

@@ -243,6 +243,7 @@ module.exports = {
     CONTROL_PROP_IDX_VERTICAL_EXCEL: 5,
     CONTROL_PROP_IDX_SHRINK_FIRST: 6,
     CONTROL_PROP_IDX_CLOSE_OUTPUT: 7,
+    CLOSE_OUTPUT_ROW_BUFFER: 4,
     BORDER_STYLE_PROPS: ['LineWeight', 'DashStyle', 'Color'],
     PROP_LINE_WEIGHT: 'LineWeight',
     PROP_DASH_STYLE: 'DashStyle',