浏览代码

code sync

TonyKang 7 年之前
父节点
当前提交
4bd18f24c8

+ 28 - 9
modules/reports/util/rpt_excel_util.js

@@ -341,7 +341,7 @@ function writeSheets(pageData, paperSize, sharedStrList, stylesObj, isSinglePage
 function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
     let rst = [], xPos = [], yPos = [], yMultiPos = [], headerStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
     let cacheBorderCell = {};
-    let currentPageMergePos = null;
+    let currentPageMergePos = null; //在 JV.PAGING_OPTION_INFINITY 场合应用
     let private_pre_analyze_pos = function(){
         let cell, pos;
         let self_analyze_sheet_pos = function (theShtData, theXPos, theYPos) {
@@ -425,7 +425,12 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
             stylesObj.fonts = [];
             //for (let i = 0; i < sheetData.font_collection)
         }
-        let sheetFont = pageData.font_collection[cell.font];
+        let sheetFont = null;
+        if (typeof cell[JV.PROP_FONT] === "string") {
+            sheetFont = pageData[JV.NODE_FONT_COLLECTION][cell[JV.PROP_FONT]];
+        } else {
+            sheetFont = cell[JV.PROP_FONT];
+        }
         for (let i = 0; i < stylesObj.fonts.length; i++) {
             let font = stylesObj.fonts[i];
             if (sheetFont) {
@@ -487,7 +492,10 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
         return rst;
     };
     let private_chkAndGetMergeLine = function(cell, sheetBorder, borderStr, needFurtherChk) {
-        let rst = 0, mergeBorder = pageData[JV.BAND_PROP_MERGE_BAND];
+        let rst = 0,
+            mergeBorder = (sheetData[JV.PROP_PAGE_MERGE_BORDER])?sheetData[JV.PROP_PAGE_MERGE_BORDER]:pageData[JV.BAND_PROP_MERGE_BAND],
+            mergeBand = pageData[JV.BAND_PROP_MERGE_BAND]
+        ;
         if (sheetBorder[borderStr] && sheetBorder[borderStr][JV.PROP_LINE_WEIGHT] !== undefined) {
             rst = sheetBorder[borderStr][JV.PROP_LINE_WEIGHT];
         }
@@ -500,7 +508,7 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
                     for (let i = 0; i < topSide.length; i++) {
                         if (cell[JV.PROP_AREA][JV.PROP_TOP] >= topSide[i]) {
                             if (cell[JV.PROP_AREA][JV.PROP_BOTTOM] <= bottomSide[i]) {
-                                let destStyle = pageData[JV.NODE_STYLE_COLLECTION][mergeBorder[JV.PROP_STYLE][JV.PROP_ID]];
+                                let destStyle = pageData[JV.NODE_STYLE_COLLECTION][mergeBand[JV.PROP_STYLE][JV.PROP_ID]];
                                 rst = destStyle[borderStr][JV.PROP_LINE_WEIGHT];
                                 break;
                             }
@@ -509,13 +517,13 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
                         }
                     }
                 } else {
-                    let destStyle = pageData[JV.NODE_STYLE_COLLECTION][mergeBorder[JV.PROP_STYLE][JV.PROP_ID]];
+                    let destStyle = pageData[JV.NODE_STYLE_COLLECTION][mergeBand[JV.PROP_STYLE][JV.PROP_ID]];
                     rst = destStyle[borderStr][JV.PROP_LINE_WEIGHT];
                 }
             }
         } else {
             if (cell[JV.PROP_AREA][borderStr] === mergeBorder[borderStr]) {
-                let destStyle = pageData[JV.NODE_STYLE_COLLECTION][mergeBorder[JV.PROP_STYLE][JV.PROP_ID]];
+                let destStyle = pageData[JV.NODE_STYLE_COLLECTION][mergeBand[JV.PROP_STYLE][JV.PROP_ID]];
                 if (needFurtherChk) {
                     if (cell[JV.PROP_AREA][JV.PROP_TOP] >= mergeBorder[JV.PROP_TOP] &&
                         cell[JV.PROP_AREA][JV.PROP_BOTTOM] <= mergeBorder[JV.PROP_BOTTOM]) {
@@ -579,12 +587,23 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
         let rst = 1, hasStyle = false;
         if (!(stylesObj.cellXfs)) stylesObj.cellXfs = [];
         let fontId = private_getFontId(cell);
-        let fontAngle = parseInt(pageData.font_collection[cell.font].FontAngle);
+        let fontAngle = 0;
+        if (typeof cell[JV.PROP_FONT] === "string") {
+            fontAngle = parseInt(pageData[JV.NODE_FONT_COLLECTION][cell[JV.PROP_FONT]].FontAngle);
+        } else {
+            fontAngle = parseInt(cell[JV.PROP_FONT].FontAngle);
+        }
+
         let borderId = private_getBorderId(cell);
-        let cellControl = pageData[JV.NODE_CONTROL_COLLECTION][cell[JV.PROP_CONTROL]];
+        let cellControl = null;
+        if (typeof cell[JV.PROP_CONTROL] === "string") {
+            cellControl = pageData[JV.NODE_CONTROL_COLLECTION][cell[JV.PROP_CONTROL]];
+        } else {
+            cellControl = cell[JV.PROP_CONTROL];
+        }
         for (let i = 0; i < stylesObj.cellXfs.length; i++) {
             let sheetControl = stylesObj.cellXfs[i];
-            if (sheetControl.fontId == fontId && sheetControl.borderId == borderId) {
+            if (sheetControl.fontId === fontId && sheetControl.borderId === borderId) {
                 if (private_checkControl(cellControl, sheetControl)) {
                     rst = i;
                     hasStyle = true;

+ 82 - 46
modules/reports/util/rpt_pdf_util.js

@@ -6,8 +6,8 @@
  */
 
 const prf_cons = require('./pdf_base_files/rpt_pdf_consts');
-var pdf = require('pdfkit');
-var fs = require('fs');
+let pdf = require('pdfkit');
+let fs = require('fs');
 let jpcCmnHelper = require('../rpt_component/helper/jpc_helper_common');
 let DPI = jpcCmnHelper.getScreenDPI()[0];
 //let JV = prf_cons.JV;
@@ -21,7 +21,7 @@ module.exports ={
 function export_pdf_file (pageData, paperSize, fName, callback) {
     let offsetX= 10;
     let offsetY=10;
-    var doc = new pdf({autoFirstPage: false});
+    let doc = new pdf({autoFirstPage: false});
     let newName = '' + (new Date()).valueOf();
     let stream = doc.pipe(fs.createWriteStream(__dirname.slice(0, __dirname.length - 21) + '/tmp/'+newName+'.pdf'));
     let pageObj = pageData;
@@ -29,18 +29,34 @@ function export_pdf_file (pageData, paperSize, fName, callback) {
     let paperSizeIdx = JV.PAGES_SIZE_STR.indexOf(paperSize);
     let size = JV.PAGES_SIZE[paperSizeIdx];
 
+    function private_getIniPageMergeBorder(mergedBand) {
+        let rst = {};
+        rst[JV.PROP_LEFT] = mergedBand[JV.PROP_LEFT];
+        rst[JV.PROP_RIGHT] = mergedBand[JV.PROP_RIGHT];
+        rst[JV.PROP_TOP] = mergedBand[JV.PROP_TOP];
+        rst[JV.PROP_BOTTOM] = mergedBand[JV.PROP_BOTTOM];
+        rst[JV.PROP_STYLE] = mergedBand[JV.PROP_STYLE];
+        return rst;
+    }
+
+    let newPageMergeBand = private_getIniPageMergeBorder(pageObj[JV.BAND_PROP_MERGE_BAND]);
     if (pageObj && pageObj.items.length > 0 ) {
         for(let i=0;i<pageObj.items.length;i++){
             doc.addPage({size:[size[1]*DPI,size[0]*DPI]});
-            var page = pageObj.items[i],
+            let page = pageObj.items[i],
                 fonts = pageObj[JV.NODE_FONT_COLLECTION],
                 styles = pageObj[JV.NODE_STYLE_COLLECTION],
-                controls = pageObj[JV.NODE_CONTROL_COLLECTION],
-                mergedBand = pageObj[JV.BAND_PROP_MERGE_BAND];
+                controls = pageObj[JV.NODE_CONTROL_COLLECTION];
 
-            for (var j = 0; j < page.cells.length; j++) {
-                var cell = page.cells[j];
-                private_drawCell(cell, fonts, styles, controls, mergedBand);
+            if (page[JV.PROP_PAGE_MERGE_BORDER]) {
+                newPageMergeBand[JV.PROP_LEFT] = page[JV.PROP_PAGE_MERGE_BORDER][JV.PROP_LEFT];
+                newPageMergeBand[JV.PROP_RIGHT] = page[JV.PROP_PAGE_MERGE_BORDER][JV.PROP_RIGHT];
+                newPageMergeBand[JV.PROP_TOP] = page[JV.PROP_PAGE_MERGE_BORDER][JV.PROP_TOP];
+                newPageMergeBand[JV.PROP_BOTTOM] = page[JV.PROP_PAGE_MERGE_BORDER][JV.PROP_BOTTOM];
+            }
+            for (let j = 0; j < page.cells.length; j++) {
+                let cell = page.cells[j];
+                private_drawCell(cell, fonts, styles, controls, newPageMergeBand);
             }
         }
     }
@@ -48,34 +64,43 @@ function export_pdf_file (pageData, paperSize, fName, callback) {
     stream.on('finish',function () {
         console.log(newName + ".pdf was written.");
         callback(newName);
-    })
+    });
 
+    function private_chkIfInMergedBand(mergedBand, cell) {
+        let rst = false;
+        if (mergedBand && cell) {
+            rst = mergedBand[JV.PROP_TOP] <= cell[JV.PROP_AREA][JV.PROP_TOP] && mergedBand[JV.PROP_BOTTOM] >= cell[JV.PROP_AREA][JV.PROP_BOTTOM] &&
+                mergedBand[JV.PROP_LEFT] <= cell[JV.PROP_AREA][JV.PROP_LEFT] && mergedBand[JV.PROP_RIGHT] >= cell[JV.PROP_AREA][JV.PROP_RIGHT];
+        }
+        return rst;
+    }
 
     function private_drawCell(cell, fonts, styles, controls, mergedBand) {
         doc.save();
         //doc.translate(0.5,0.5);
-        var style = styles[cell[JV.PROP_STYLE]];
+        let style = styles[cell[JV.PROP_STYLE]];
         if (style) {
-            private_drawLine(cell, doc, style, JV.PROP_TOP, [JV.PROP_LEFT, JV.PROP_TOP],[JV.PROP_RIGHT, JV.PROP_TOP], mergedBand, styles);
-            private_drawLine(cell, doc, style, JV.PROP_RIGHT, [JV.PROP_RIGHT, JV.PROP_TOP],[JV.PROP_RIGHT, JV.PROP_BOTTOM], mergedBand, styles);
-            private_drawLine(cell, doc, style, JV.PROP_BOTTOM, [JV.PROP_RIGHT, JV.PROP_BOTTOM],[JV.PROP_LEFT, JV.PROP_BOTTOM], mergedBand, styles);
-            private_drawLine(cell, doc, style, JV.PROP_LEFT, [JV.PROP_LEFT, JV.PROP_BOTTOM],[JV.PROP_LEFT, JV.PROP_TOP], mergedBand, styles);
+            let isNeedMergeBand = private_chkIfInMergedBand(mergedBand, cell);
+            private_drawLine(cell, doc, style, JV.PROP_TOP, [JV.PROP_LEFT, JV.PROP_TOP],[JV.PROP_RIGHT, JV.PROP_TOP], mergedBand, styles, isNeedMergeBand);
+            private_drawLine(cell, doc, style, JV.PROP_RIGHT, [JV.PROP_RIGHT, JV.PROP_TOP],[JV.PROP_RIGHT, JV.PROP_BOTTOM], mergedBand, styles, isNeedMergeBand);
+            private_drawLine(cell, doc, style, JV.PROP_BOTTOM, [JV.PROP_RIGHT, JV.PROP_BOTTOM],[JV.PROP_LEFT, JV.PROP_BOTTOM], mergedBand, styles, isNeedMergeBand);
+            private_drawLine(cell, doc, style, JV.PROP_LEFT, [JV.PROP_LEFT, JV.PROP_BOTTOM],[JV.PROP_LEFT, JV.PROP_TOP], mergedBand, styles, isNeedMergeBand);
         }
         private_drawCellText(cell, fonts, controls);
         doc.restore();
 
     }
 
-    function private_drawLine(cell, doc, style, styleBorderDest, startP, destP, mergedBand, styles) {
+    function private_drawLine(cell, doc, style, styleBorderDest, startP, destP, mergedBand, styles, isNeedMergeBand) {
         //doc.beginPath();
-        var destStyle = style;
+        let destStyle = style;
         if (mergedBand) {
-            if (mergedBand[styleBorderDest] == cell[JV.PROP_AREA][styleBorderDest]) {
+            if (isNeedMergeBand && parseFloat(mergedBand[styleBorderDest]) === parseFloat(cell[JV.PROP_AREA][styleBorderDest])) {
                 destStyle = styles[mergedBand[JV.PROP_STYLE][JV.PROP_ID]];
             }
         }
         doc.moveTo(cell[JV.PROP_AREA][startP[0]] + offsetX, cell[JV.PROP_AREA][startP[1]] + offsetY);
-        if (destStyle[styleBorderDest] && destStyle[styleBorderDest][JV.PROP_LINE_WEIGHT] != 0) {
+        if (destStyle[styleBorderDest] && parseFloat(destStyle[styleBorderDest][JV.PROP_LINE_WEIGHT]) !== 0) {
             doc.lineWidth(1.0 * destStyle[styleBorderDest][JV.PROP_LINE_WEIGHT]);
             doc.lineTo(cell[JV.PROP_AREA][destP[0]] + offsetX, cell[JV.PROP_AREA][destP[1]] + offsetY);
             doc.strokeColor(destStyle[styleBorderDest][JV.PROP_COLOR]);
@@ -84,12 +109,24 @@ function export_pdf_file (pageData, paperSize, fName, callback) {
     }
     function private_drawCellText(cell, fonts, controls) {
         if (cell[JV.PROP_VALUE]) {
-            var values = ("" + cell[JV.PROP_VALUE]).split('|');
-            var font = fonts[cell[JV.PROP_FONT]];
-            var control = controls[cell[JV.PROP_CONTROL]];
-            var height = cell[JV.PROP_AREA][JV.PROP_BOTTOM] - cell[JV.PROP_AREA][JV.PROP_TOP];
-            var 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];
-            for (var i = 0; i < values.length; i++) {
+            let values = ("" + cell[JV.PROP_VALUE]).split('|');
+            // let font = fonts[cell[JV.PROP_FONT]];
+            let font = null;
+            if (typeof cell[JV.PROP_FONT] === "string") {
+                font = fonts[cell[JV.PROP_FONT]];
+            } else {
+                font = cell[JV.PROP_FONT];
+            }
+            // let control = controls[cell[JV.PROP_CONTROL]];
+            let control = null;
+            if (typeof cell[JV.PROP_CONTROL] === "string") {
+                control = controls[cell[JV.PROP_CONTROL]];
+            } else {
+                control = cell[JV.PROP_CONTROL];
+            }
+            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] + 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];
+            for (let i = 0; i < values.length; i++) {
                 area[JV.IDX_TOP] = cell[JV.PROP_AREA][JV.PROP_TOP] + i * (height / values.length) + offsetY;
                 area[JV.IDX_BOTTOM] = cell[JV.PROP_AREA][JV.PROP_TOP] + (i + 1) * (height / values.length) + offsetY;
                 private_drawText(values[i], area, font, control);
@@ -98,22 +135,22 @@ function export_pdf_file (pageData, paperSize, fName, callback) {
     }
 
     function private_drawText(val, area, font, control) {
-        var dftFontHeight = 12;
-        var output = [];
+        let dftFontHeight = 12;
+        let output = [];
         if (font) {
             dftFontHeight = 1 * font[JV.FONT_PROPS[1]];
-            var dftFontBold = font[JV.FONT_PROPS[3]];
-            var dftFontItalic = font[JV.FONT_PROPS[4]];
-            if (dftFontBold && dftFontBold == 'T') {
+            let dftFontBold = font[JV.FONT_PROPS[3]];
+            let dftFontItalic = font[JV.FONT_PROPS[4]];
+            if (dftFontBold && dftFontBold === 'T') {
                 doc.font(__dirname+'/pdf_base_files/hwxsb.ttf');
-            }else if(dftFontItalic && dftFontItalic == 'T'){
+            }else if(dftFontItalic && dftFontItalic === 'T'){
                 doc.font(__dirname+'/pdf_base_files/Smart-italic.ttf');
             }else {
                 doc.font(__dirname+'/pdf_base_files/Smart.ttf');
             }
             doc.fontSize(dftFontHeight);
         }
-        var options={};
+        let options={};
         if (control) {
             private_setupAreaH(area, control.Horizon, font.FontAngle, dftFontHeight, output,options);
             private_setupAreaV(area, control.Vertical, font.FontAngle, dftFontHeight, output);
@@ -121,8 +158,8 @@ function export_pdf_file (pageData, paperSize, fName, callback) {
             private_setupAreaH(area, "left", font.FontAngle, dftFontHeight, output,options);
             private_setupAreaV(area, "bottom", font.FontAngle, dftFontHeight, output);
         }
-        var w = area[JV.IDX_RIGHT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT] - area[JV.IDX_LEFT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT];
-        if (font.FontAngle != "0") {
+        let w = area[JV.IDX_RIGHT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT] - area[JV.IDX_LEFT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT];
+        if (parseInt(font.FontAngle) !== 0) {
             w = area[JV.IDX_BOTTOM] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_BOTTOM] - area[JV.IDX_TOP] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP];
         }
         doc.save();
@@ -142,8 +179,8 @@ function export_pdf_file (pageData, paperSize, fName, callback) {
             }
         }
 
-        var rotateOptions;
-        if (font.FontAngle != "0") {
+        let rotateOptions;
+        if (parseInt(font.FontAngle) !== 0) {
             if (control){
                 rotateOptions=private_setupAreaRotateOption(area,w,control.Vertical,dftFontHeight, output);
             }else {
@@ -156,15 +193,15 @@ function export_pdf_file (pageData, paperSize, fName, callback) {
     }
 
     function private_setupAreaH(area, type, fontAngle, dftFontHeight, outputPoint,options) {
-        var lType = type;
-        if (type != "left" && type != "right" && type != "center") lType = "left";
+        let lType = type;
+        if (type !== "left" && type !== "right" && type !== "center") lType = "left";
         options.align=lType;
         outputPoint[0]=1 * area[JV.IDX_LEFT]+ JV.OUTPUT_OFFSET[JV.OFFSET_IDX_LEFT];
     }
 
     function private_setupAreaV(area, type, fontAngle, dftFontHeight, outputPoint) {
-        var lType = type;
-        if (type != "top" && type != "bottom" && type != "center") lType = "top";
+        let lType = type;
+        if (type !== "top" && type !== "bottom" && type !== "center") lType = "top";
         switch (lType) {
             case "top":
                 outputPoint[1] = 1 * area[JV.IDX_TOP] + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP];
@@ -179,13 +216,12 @@ function export_pdf_file (pageData, paperSize, fName, callback) {
     }
 
     function private_setupAreaRotateOption(area,w, type="top",dftFontHeight,outputPoint){
-        var x = (area[JV.IDX_RIGHT] - area[JV.IDX_LEFT])/2+area[JV.IDX_LEFT];
-        var y =(area[JV.IDX_BOTTOM] - area[JV.IDX_TOP])/2+ area[JV.IDX_TOP];
-        var rotateOptions = {origin:[x,y]};
-        var h = area[JV.IDX_RIGHT] - area[JV.IDX_LEFT];
+        let x = (area[JV.IDX_RIGHT] - area[JV.IDX_LEFT])/2+area[JV.IDX_LEFT];
+        let y =(area[JV.IDX_BOTTOM] - area[JV.IDX_TOP])/2+ area[JV.IDX_TOP];
+        let rotateOptions = {origin:[x,y]};
+        let h = area[JV.IDX_RIGHT] - area[JV.IDX_LEFT];
         outputPoint[0]=x-w/2+JV.OUTPUT_OFFSET[JV.OFFSET_IDX_LEFT];
-        var lType = type;
-        switch (lType) {
+        switch (type) {
             case "top":
                 outputPoint[1] = y- h/2+ JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP];
                 break;

+ 87 - 28
web/maintain/report/js/jpc_output.js

@@ -17,26 +17,26 @@ let JpcCanvasOutput = {
 
         function private_setupAreaH(area, type, fontAngle, dftFontHeight, outputPoint) {
             let lType = type;
-            if (type != "left" && type != "right" && type != "center") lType = "left";
+            if (type !== "left" && type !== "right" && type !== "center") lType = "left";
             switch (lType) {
                 case "left":
-                    if (fontAngle == JV.VERTICAL_ANGLE) {
+                    if (fontAngle === JV.VERTICAL_ANGLE_INT) {
                         outputPoint[1] = 1 * area[JV.IDX_TOP] + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_LEFT];
-                    } else if (fontAngle == JV.ANTI_VERTICAL_ANGLE) {
+                    } else if (fontAngle === JV.ANTI_VERTICAL_ANGLE_INT) {
                         outputPoint[1] = 1 * area[JV.IDX_BOTTOM] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_LEFT];
                     } else outputPoint[0] = 1 * area[JV.IDX_LEFT] + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_LEFT];
                     ctx.textAlign="start";
                     break;
                 case "right":
-                    if (fontAngle == JV.VERTICAL_ANGLE) {
+                    if (fontAngle === JV.VERTICAL_ANGLE_INT) {
                         outputPoint[1] = 1 * area[JV.IDX_BOTTOM] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT];
-                    } else if (fontAngle == JV.ANTI_VERTICAL_ANGLE) {
+                    } else if (fontAngle === JV.ANTI_VERTICAL_ANGLE_INT) {
                         outputPoint[1] = 1 * area[JV.IDX_TOP] + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT];
                     } else outputPoint[0] = 1 * area[JV.IDX_RIGHT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT];
                     ctx.textAlign="end";
                     break;
                 case "center":
-                    if (fontAngle == JV.VERTICAL_ANGLE || fontAngle == JV.ANTI_VERTICAL_ANGLE) {
+                    if (fontAngle === JV.VERTICAL_ANGLE_INT || fontAngle === JV.ANTI_VERTICAL_ANGLE_INT) {
                         outputPoint[1] = (1 * area[JV.IDX_TOP] + 1 * area[JV.IDX_BOTTOM]) / 2;
                     } else outputPoint[0] = (1 * area[JV.IDX_LEFT] + 1 * area[JV.IDX_RIGHT]) / 2;
                     ctx.textAlign="center";
@@ -45,26 +45,26 @@ let JpcCanvasOutput = {
         }
         function private_setupAreaV(area, type, fontAngle, dftFontHeight, outputPoint) {
             let lType = type;
-            if (type != "top" && type != "bottom" && type != "center") lType = "top";
+            if (type !== "top" && type !== "bottom" && type !== "center") lType = "top";
             switch (lType) {
                 case "top":
-                    if (fontAngle == JV.VERTICAL_ANGLE) {
+                    if (fontAngle === JV.VERTICAL_ANGLE_INT) {
                         outputPoint[0] = 1 * area[JV.IDX_RIGHT] - dftFontHeight - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP];
-                    } else if (fontAngle == JV.ANTI_VERTICAL_ANGLE) {
+                    } else if (fontAngle === JV.ANTI_VERTICAL_ANGLE_INT) {
                         outputPoint[0] = 1 * area[JV.IDX_LEFT] + dftFontHeight + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP];
                     } else outputPoint[1] = 1 * area[JV.IDX_TOP] + dftFontHeight + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP];
                     break;
                 case "bottom":
-                    if (fontAngle == JV.VERTICAL_ANGLE) {
+                    if (fontAngle === JV.VERTICAL_ANGLE_INT) {
                         outputPoint[0] = 1 * area[JV.IDX_LEFT] + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_BOTTOM];
-                    } else if (fontAngle == JV.ANTI_VERTICAL_ANGLE) {
+                    } else if (fontAngle === JV.ANTI_VERTICAL_ANGLE_INT) {
                         outputPoint[0] = 1 * area[JV.IDX_RIGHT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_BOTTOM];
                     } else outputPoint[1] = 1 * area[JV.IDX_BOTTOM] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_BOTTOM];
                     break;
                 case "center":
-                    if (fontAngle == JV.VERTICAL_ANGLE) {
+                    if (fontAngle === JV.VERTICAL_ANGLE_INT) {
                         outputPoint[0] = (1 * area[JV.IDX_LEFT] + 1 * area[JV.IDX_RIGHT] - dftFontHeight) / 2;
-                    } else if (fontAngle == JV.ANTI_VERTICAL_ANGLE) {
+                    } else if (fontAngle === JV.ANTI_VERTICAL_ANGLE_INT) {
                         outputPoint[0] = (1 * area[JV.IDX_LEFT] + 1 * area[JV.IDX_RIGHT] + dftFontHeight) / 2;
                     } else outputPoint[1] = (1 * area[JV.IDX_TOP] + 1 * area[JV.IDX_BOTTOM] + dftFontHeight) / 2;
                     break;
@@ -74,31 +74,75 @@ let JpcCanvasOutput = {
             let dftFontHeight = 12;
             let output = [];
             if (font) {
-                dftFontHeight = 1 * font[JV.FONT_PROPS[1]];
+                dftFontHeight = parseFloat(font[JV.FONT_PROPS[1]]);
                 let dftOthers = "";
                 let dftFontBold = font[JV.FONT_PROPS[3]];
-                if (dftFontBold && dftFontBold == 'T') {
+                if (dftFontBold && dftFontBold === 'T') {
                     dftOthers = "bold " + dftOthers ;
                 }
                 let dftFontItalic = font[JV.FONT_PROPS[4]];
-                if (dftFontItalic && dftFontItalic == 'T') {
+                if (dftFontItalic && dftFontItalic === 'T') {
                     dftOthers = dftOthers + "italic ";
                 }
                 ctx.font = dftOthers + dftFontHeight + "px " + font[JV.PROP_NAME];
             }
             if (control) {
-                private_setupAreaH(area, control.Horizon, font.FontAngle, dftFontHeight, output);
-                private_setupAreaV(area, control.Vertical, font.FontAngle, dftFontHeight, output);
+                private_setupAreaH(area, control.Horizon, parseInt(font.FontAngle), dftFontHeight, output);
+                private_setupAreaV(area, control.Vertical, parseInt(font.FontAngle), dftFontHeight, output);
             } else {
-                private_setupAreaH(area, "left", font.FontAngle, dftFontHeight, output);
-                private_setupAreaV(area, "bottom", font.FontAngle, dftFontHeight, output);
+                private_setupAreaH(area, "left", parseInt(font.FontAngle), dftFontHeight, output);
+                private_setupAreaV(area, "bottom", parseInt(font.FontAngle), dftFontHeight, output);
             }
             let w = area[JV.IDX_RIGHT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT] - area[JV.IDX_LEFT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT];
-            if (font.FontAngle != "0") {
+            if ( parseInt(font.FontAngle) !== 0) {
                 w = area[JV.IDX_BOTTOM] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_BOTTOM] - area[JV.IDX_TOP] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP];
             }
+
+            function private_drawUnderline() {
+                //A. 暂不支持角度; B. 坐标已经translate
+                //1. 计算下划线的相关坐标
+                let width = ctx.measureText(val).width;
+                let height = dftFontHeight;
+                // let startX = area[JV.IDX_LEFT], startY = area[JV.IDX_TOP], endX = area[JV.IDX_RIGHT], endY = area[JV.IDX_BOTTOM];
+                let startX = 0, startY = 0, endX = width, endY = startY;
+                if (control.Horizon === "left") {
+                    // 无变化;
+                } else if (control.Horizon === "right") {
+                    startX = Math.round(startX - width);
+                } else {
+                    startX = Math.round(startX - width / 2);
+                }
+                endX = Math.round(startX + width);
+
+                if (control.Vertical === "top") {
+                    startY += JV.OUTPUT_OFFSET[JV.IDX_TOP] + JV.OUTPUT_OFFSET[JV.IDX_BOTTOM];
+                } else if (control.Vertical === "bottom") {
+                    // startY = Math.round(startY);
+                    startY += JV.OUTPUT_OFFSET[JV.IDX_TOP] + JV.OUTPUT_OFFSET[JV.IDX_BOTTOM];
+                } else {
+                    startY = Math.round(height / 2) - JV.OUTPUT_OFFSET[JV.IDX_TOP] - JV.OUTPUT_OFFSET[JV.IDX_BOTTOM];
+                    // startY += JV.OUTPUT_OFFSET[JV.IDX_TOP] + JV.OUTPUT_OFFSET[JV.IDX_BOTTOM];
+                }
+                endY = Math.round(startY);
+                //2. 画线
+                // ctx.save();
+                if ( output[1] !== Math.round(output[1])) {
+                    ctx.translate(0,0.5);
+                }
+                ctx.beginPath();
+                ctx.moveTo(startX, startY);
+                ctx.lineWidth = 1;
+                ctx.strokeStyle = "BLACK";
+                ctx.lineTo(endX, endY);
+                ctx.stroke();
+                // ctx.restore();
+            }
+
             ctx.save();
             ctx.translate(output[0], output[1]);
+            if (font[JV.FONT_PROPS[5]] === 'T' && parseInt(font.FontAngle) === 0) {
+                private_drawUnderline();
+            }
             if (font.FontAngle === JV.VERTICAL_ANGLE) {
                 ctx.rotate(Math.PI/2);
             } else if (font.FontAngle === JV.ANTI_VERTICAL_ANGLE) {
@@ -121,8 +165,19 @@ let JpcCanvasOutput = {
         function private_drawCellText(cell, fonts, controls) {
             if (cell[JV.PROP_VALUE]) {
                 let values = ("" + cell[JV.PROP_VALUE]).split('|');
-                let font = fonts[cell[JV.PROP_FONT]];
-                let control = controls[cell[JV.PROP_CONTROL]];
+                let font = null;
+                if (typeof cell[JV.PROP_FONT] === "string") {
+                    font = fonts[cell[JV.PROP_FONT]];
+                } else {
+                    font = cell[JV.PROP_FONT];
+                }
+                //let control = controls[cell[JV.PROP_CONTROL]];
+                let control = null;
+                if (typeof cell[JV.PROP_CONTROL] === "string") {
+                    control = controls[cell[JV.PROP_CONTROL]];
+                } else {
+                    control = cell[JV.PROP_CONTROL];
+                }
                 if (control.ShowZero === "F") {
                     if (parseFloat(cell[JV.PROP_VALUE]) === 0.0) {
                         values = [""];
@@ -141,12 +196,12 @@ let JpcCanvasOutput = {
             ctx.beginPath();
             let destStyle = style;
             if (mergedBand) {
-                if (isNeedMergeBand && mergedBand[styleBorderDest] == cell[JV.PROP_AREA][styleBorderDest]) {
+                if (isNeedMergeBand && parseFloat(mergedBand[styleBorderDest]) === parseFloat(cell[JV.PROP_AREA][styleBorderDest])) {
                     destStyle = styles[mergedBand[JV.PROP_STYLE][JV.PROP_ID]];
                 }
             }
             ctx.moveTo(cell[JV.PROP_AREA][startP[0]] + me.offsetX, cell[JV.PROP_AREA][startP[1]] + me.offsetY);
-            if (destStyle[styleBorderDest] && destStyle[styleBorderDest][JV.PROP_LINE_WEIGHT] != 0) {
+            if (destStyle[styleBorderDest] && parseFloat(destStyle[styleBorderDest][JV.PROP_LINE_WEIGHT]) !== 0.0) {
                 ctx.lineWidth = 1.0 * destStyle[styleBorderDest][JV.PROP_LINE_WEIGHT];
                 ctx.strokeStyle = destStyle[styleBorderDest][JV.PROP_COLOR];
                 ctx.lineTo(cell[JV.PROP_AREA][destP[0]] + me.offsetX, cell[JV.PROP_AREA][destP[1]] + me.offsetY);
@@ -207,9 +262,7 @@ let JpcCanvasOutput = {
     },
     drawPageBorder: function(rptTpl, canvas, resolution) {
         let me = this;
-        let size = rptTpl[JV.NODE_PAGE_INFO][JV.NODE_PAGE_SIZE].slice(0);
-        size[0] = Math.round(resolution[0] * size[0]);
-        size[1] = Math.round(resolution[0] * size[1]);
+        let size = me.getReportSizeInPixel(rptTpl, resolution);
 
         let ctx = canvas.getContext("2d");
         ctx.save();
@@ -227,5 +280,11 @@ let JpcCanvasOutput = {
         ctx.fillStyle="black";
         ctx.fillRect(size[0] + me.offsetX,10 + me.offsetY,10,size[1]);
         ctx.fillRect(10 + me.offsetX,size[1] + me.offsetY,size[0],10);
+    },
+    getReportSizeInPixel: function(rptTpl, resolution) {
+        let rst = rptTpl[JV.NODE_PAGE_INFO][JV.NODE_PAGE_SIZE].slice(0);
+        rst[0] = Math.round(resolution[0] * rst[0]);
+        rst[1] = Math.round(resolution[0] * rst[1]);
+        return rst;
     }
 };

+ 3 - 1
web/maintain/report/js/jpc_output_value_define.js

@@ -39,12 +39,14 @@ let JV = {
     PROP_COLOR: "Color",
     FONT_PROPS: ["Name", "FontHeight", "FontColor", "FontBold", "FontItalic", "FontUnderline", "FontStrikeOut", "FontAngle"],
 
-    OUTPUT_OFFSET: [2,1,2,3],
+    OUTPUT_OFFSET: [2,2,1,3],
     OFFSET_IDX_LEFT: 0,
     OFFSET_IDX_RIGHT: 1,
     OFFSET_IDX_TOP: 2,
     OFFSET_IDX_BOTTOM: 3,
 
+    VERTICAL_ANGLE_INT: 90,
+    ANTI_VERTICAL_ANGLE_INT: -90,
     VERTICAL_ANGLE: "90",
     ANTI_VERTICAL_ANGLE: "-90"
 };