Prechádzať zdrojové kódy

output tuning (PDF)

TonyKang 7 rokov pred
rodič
commit
87a656eca3

+ 1 - 0
.gitignore

@@ -3,5 +3,6 @@ node_modules/
 dist/
 .idea/
 tmp/*.xlsx
+tmp/*.pdf
 test/unit/logs
 *.log

+ 24 - 0
modules/reports/controllers/rpt_controller.js

@@ -222,6 +222,30 @@ module.exports = {
             }
         })
     },
+    getPDF:function (req, res) {
+        let prj_id = req.params.prj_id,
+            rpt_id = req.params.rpt_id,
+            pageSize = req.params.size,
+            rptName = req.params.rptName
+        ;
+        let user_id = req.session.sessionUser.ssoId;
+        getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, JV.PAGING_OPTION_NORMAL, function(err, pageRst){
+            rpt_pdf_util.export_pdf_file(pageRst, pageSize, rptName,function (newName) {
+                res.setHeader('Content-Type', 'application/vnd.openxmlformats');
+                res.setHeader("Content-Disposition", "attachment; filename=" + strUtil.getPinYinCamelChars(rptName) + ".pdf");
+
+                let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + newName + '.pdf');
+                filestream.on('data', function(chunk) {
+                    res.write(chunk);
+                });
+                filestream.on('end', function() {
+                    res.end();
+                });
+            })
+
+        })
+
+    },
     getTestPDF:function (req, res) {
         let rpt_id = req.params.id,
             pageSize = req.params.size,

+ 1 - 1
modules/reports/routes/report_router.js

@@ -26,8 +26,8 @@ module.exports =function (app) {
     //now is the real:
     rptRouter.post('/getReport', reportController.getReportAllPages);
     rptRouter.get('/getExcel/:prj_id/:rpt_id/:size/:rptName/:isOneSheet/:option', reportController.getExcel);
+    rptRouter.get('/getPDF/:prj_id/:rpt_id/:size/:rptName', reportController.getPDF);
     // rptRouter.get('/getExcelInOneBook/:ids/:size/:rptName/:option', reportController.getExcelInOneBook);
-    // rptRouter.get('/getPDF/:id/:size/:rptName', reportController.getPDF);
 
     app.use("/report_api", rptRouter);
 };

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

@@ -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) {
@@ -582,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;

BIN
web/building_saas/img/FirstPageSimple.cur


BIN
web/building_saas/img/LastPageSimple.cur


BIN
web/building_saas/img/NextPageSimple.cur


BIN
web/building_saas/img/PreviousPageSimple.cur


+ 45 - 4
web/building_saas/report/html/rpt_main.html

@@ -16,9 +16,11 @@
                 <div class="print-toolsbar">
                     <div class="panel">
                         <div class="panel-body">
-                            <button class="btn btn-secondary btn-sm" type="button" onclick="rptHeaderObj.getExcel();">
-                                <i class="fa fa-print"></i><br>
-                                打印 <span id="checkCount" class="badge badge-primary">5</span>
+                            <button class="btn btn-secondary btn-sm" type="button" onclick="">
+                                <i class="fa fa-print"></i><br>打印
+                            </button>
+                            <button class="btn btn-secondary btn-sm" type="button"  href="#export" data-toggle="modal" data-target="#export">
+                                <i class="fa fa-share-square-o"></i><br>导出
                             </button>
                         </div>
                     </div>
@@ -51,7 +53,7 @@
                         <div class="panel-body">
                             <div class="btn-group" role="group">
                                 <button type="button" class="btn btn-secondary btn-sm">-</button>
-                                <a class="btn btn-secondary btn-sm" data-toggle="tooltip" data-placement="bottom" title="重置默认大小">1000%</a>
+                                <a class="btn btn-secondary btn-sm" data-toggle="tooltip" data-placement="bottom" title="重置默认大小">100%</a>
                                 <button type="button" class="btn btn-secondary btn-sm">+</button>
                             </div>
                         </div>
@@ -139,6 +141,45 @@
         </div>
     </div>
 </div>
+<!--弹出导出-->
+<div class="modal fade" id="export" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">选择导出格式</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <div class="row">
+                    <div class="col-6">
+                        <a class="btn btn-block btn-outline-secondary" id="PDF_TYPE" onclick="rptControlObj.changeType('PDF')">
+                            <!-- <i class="fa fa-check-square pull-right"></i> -->
+                            <div class="card-body text-center">
+                                <h1 class="display-3"><i class="fa fa-file-pdf-o"></i></h1>
+                                <h1>PDF</h1>
+                            </div>
+                        </a>
+                    </div>
+                    <div class="col-6">
+                        <a class="btn btn-block btn-primary" id="EXCEL_TYPE" onclick="rptControlObj.changeType('Excel')">
+                            <!-- <i class="fa fa-check-square pull-right"></i> -->
+                            <div class="card-body text-center">
+                                <h1 class="display-3"><i class="fa fa-file-excel-o"></i></h1>
+                                <h1>Excel</h1>
+                            </div>
+                        </a>
+                    </div>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+                <a onclick="rptControlObj.outputRpt();" class="btn btn-primary">确定</a>
+            </div>
+        </div>
+    </div>
+</div>
 <script>
     const SCREEN_DPI = [];
     function getScreenDPI() {

+ 2 - 2
web/building_saas/report/js/jpc_output.js

@@ -196,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);

+ 76 - 28
web/building_saas/report/js/rpt_main.js

@@ -3,6 +3,11 @@
  */
 'use strict'
 
+const PRE_PAGE_OFFSET = 150;
+const NEXT_PAGE_OFFSET = 160;
+const FIRST_PAGE_OFFSET = 50;
+const LAST_PAGE_OFFSET = 60;
+
 let rptTplObj = {
     hasInitialized: false,
     iniPage: function() {
@@ -67,7 +72,7 @@ let zTreeOprObj = {
         let canvas = document.getElementById("rptCanvas");
         if (treeNode.nodeType === TPL_TYPE_TEMPLATE && treeNode.refId > 0) {
             let params = {};
-            let pageSize = rptHeaderObj.getCurrentPageSize();
+            let pageSize = rptControlObj.getCurrentPageSize();
             params.user_id = userID;
             params.pageSize = pageSize;
             params.rpt_tpl_id = treeNode.refId;
@@ -106,38 +111,43 @@ let zTreeOprObj = {
 
 let canvasOprObj = {
     canvasOnMouseMove: function (event) {
-        let x = event.offsetX - JpcCanvasOutput.offsetX, canvas = event.originalTarget;
-        if (x < 80) {
-            canvas.style.cursor = "url(/web/building_saas/img/FirstPageSimple.cur), auto";
-        } else if (x < 200) {
-            // canvas.style.cursor = "e-resize";
-            canvas.style.cursor = "url(/web/building_saas/img/PreviousPageSimple.cur), auto";
-        } else if ((canvas.width - x) < 80) {
-            canvas.style.cursor = "url(/web/building_saas/img/LastPageSimple.cur), auto";
-        } else if ((canvas.width - x) < 200) {
-            // canvas.style.cursor = "w-resize";
-            canvas.style.cursor = "url(/web/building_saas/img/NextPageSimple.cur), auto";
-        } else {
-            canvas.style.cursor = "";
+        if (zTreeOprObj.currentNode) {
+            let x = event.offsetX - JpcCanvasOutput.offsetX, canvas = event.originalTarget;
+            if (x < FIRST_PAGE_OFFSET) {
+                canvas.style.cursor = "url(/web/building_saas/img/FirstPageSimple.cur), auto";
+            } else if (x < PRE_PAGE_OFFSET) {
+                // canvas.style.cursor = "e-resize";
+                canvas.style.cursor = "url(/web/building_saas/img/PreviousPageSimple.cur), auto";
+            } else if ((canvas.width - x) < LAST_PAGE_OFFSET) {
+                canvas.style.cursor = "url(/web/building_saas/img/LastPageSimple.cur), auto";
+            } else if ((canvas.width - x) < NEXT_PAGE_OFFSET) {
+                // canvas.style.cursor = "w-resize";
+                canvas.style.cursor = "url(/web/building_saas/img/NextPageSimple.cur), auto";
+            } else {
+                canvas.style.cursor = "";
+            }
         }
     },
     cavansOnClick: function(event){
-        let x = event.offsetX - JpcCanvasOutput.offsetX,
-            //y = event.offsetY - JpcCanvasOutput.offsetY,
-            canvas = event.originalTarget;
-        if (x < 80) {
-            zTreeOprObj.showPage(1, canvas);
-        } else if (x < 200) {
-            zTreeOprObj.showPage(zTreeOprObj.currentPage - 1, canvas);
-        } else if ((canvas.width - x) < 80) {
-            zTreeOprObj.showPage(zTreeOprObj.maxPages, canvas);
-        } else if ((canvas.width - x) < 200) {
-            zTreeOprObj.showPage(zTreeOprObj.currentPage + 1, canvas);
+        if (zTreeOprObj.currentNode) {
+            let x = event.offsetX - JpcCanvasOutput.offsetX,
+                //y = event.offsetY - JpcCanvasOutput.offsetY,
+                canvas = event.originalTarget;
+            if (x < FIRST_PAGE_OFFSET) {
+                zTreeOprObj.showPage(1, canvas);
+            } else if (x < PRE_PAGE_OFFSET) {
+                zTreeOprObj.showPage(zTreeOprObj.currentPage - 1, canvas);
+            } else if ((canvas.width - x) < LAST_PAGE_OFFSET) {
+                zTreeOprObj.showPage(zTreeOprObj.maxPages, canvas);
+            } else if ((canvas.width - x) < NEXT_PAGE_OFFSET) {
+                zTreeOprObj.showPage(zTreeOprObj.currentPage + 1, canvas);
+            }
         }
     }
 };
 
-let rptHeaderObj = {
+let rptControlObj = {
+    currentOutputType: "Excel",
     getCurrentPageSize: function() {
         let rst = "A4";
         //
@@ -151,16 +161,54 @@ let rptHeaderObj = {
     getCurrentReportOption: function() {
         //
     },
+    changeType: function(newType) {
+        let me = rptControlObj;
+        let excelDom = document.getElementById("EXCEL_TYPE");
+        let pdfDom = document.getElementById("PDF_TYPE");
+        if (newType === "Excel") {
+            excelDom.className = "btn btn-block btn-primary";
+            pdfDom.className = "btn btn-block btn-outline-secondary";
+            me.currentOutputType = newType;
+        } else if (newType === "PDF") {
+            excelDom.className = "btn btn-block btn-outline-secondary";
+            pdfDom.className = "btn btn-block btn-primary";
+            me.currentOutputType = newType;
+        } else {
+            //me.currentOutputType = newType;
+        }
+    },
+    outputRpt: function() {
+        let me = rptControlObj;
+        if (me.currentOutputType === "Excel") {
+            me.getExcel();
+        } else if (me.currentOutputType === "PDF") {
+            me.getPDF();
+        } else {
+            //other types if needed.
+        }
+    },
     getExcel: function() {
-        let me = rptHeaderObj;
+        let me = rptControlObj;
         //目前只支持当前打开报表
         //zTreeOprObj.currentRptPageRst
         if (zTreeOprObj.currentNode && zTreeOprObj.currentNode.refId) {
             let orgRptName = zTreeOprObj.currentNode.name;
-            orgRptName = orgRptName.replace('【', '').replace('】','').replace('-','_');
+            orgRptName = orgRptName.replace('【', '').replace('】','').replace('-','_').replace(' ','');
             let url =  "/report_api/getExcel/" + projectInfoObj.projectInfo.ID + "/" + zTreeOprObj.currentNode.refId + "/" +
                 me.getCurrentPageSize() + "/" + orgRptName + "/" + false + "/" + 'normal';
             window.location = url;//这里不能使用get方法跳转,否则下载不成功
         }
+    },
+    getPDF: function() {
+        let me = rptControlObj;
+        //目前只支持当前打开报表
+        //zTreeOprObj.currentRptPageRst
+        if (zTreeOprObj.currentNode && zTreeOprObj.currentNode.refId) {
+            let orgRptName = zTreeOprObj.currentNode.name;
+            orgRptName = orgRptName.replace('【', '').replace('】','').replace('-','_');
+            let url =  "/report_api/getPDF/" + projectInfoObj.projectInfo.ID + "/" + zTreeOprObj.currentNode.refId + "/" +
+                me.getCurrentPageSize() + "/" + orgRptName;
+            window.location = url;//这里不能使用get方法跳转,否则下载不成功
+        }
     }
 };