Explorar el Código

1.导出Excel文件扩展名 2.导出Excel字体size/height转换逻辑调整(round->floor) 3.cursor 4. 批量打印(基本完成,还有细节调整)

TonyKang hace 7 años
padre
commit
21875531fa

+ 34 - 3
modules/reports/controllers/rpt_controller.js

@@ -264,6 +264,37 @@ module.exports = {
             callback(req, res, err, pageRst);
         });
     },
+    getMultiReports: function (req, res) {
+        let params = JSON.parse(req.body.params),
+            prj_id = params.prj_id,
+            rpt_ids = params.rpt_ids.split(','),
+            customizeCfg = params.custCfg,
+            option = params.option;
+        let user_id = req.session.sessionUser.id;
+        let parallelFucs = [];
+        let dftOption = option||JV.PAGING_OPTION_NORMAL;
+        for (let id of rpt_ids) {
+            parallelFucs.push((function (rpt_id) {
+                return function (cb) {
+                    getAllPagesCommon(user_id, prj_id, rpt_id, null, null, customizeCfg, dftOption, function (err, pageRst) {
+                        if(err){
+                            cb(err);
+                        }
+                        else{
+                            cb(null, pageRst);
+                        }
+                    })
+                }
+            })(parseInt(id)));
+        }
+        async.parallel(parallelFucs, function (err, pageRstArray) {
+            if (err) {
+                callback(req, res, '数据有误', null);
+            } else {
+                callback(req, res, err, pageRstArray);
+            }
+        })
+    },
 
     getReportAllPagesSvg: function (req, res) {
         let params = JSON.parse(req.body.params),
@@ -303,7 +334,7 @@ module.exports = {
                 rpt_xl_util.exportExcel(pageRst, pageSize, rptName, isOneSheet, null, function(newName){
                     res.setHeader('Content-Type', 'application/vnd.openxmlformats');
                     let rptNameURI = encodeURI(rptName);
-                    res.setHeader("Content-Disposition", "attachment; filename=\"" + rptNameURI + ".xlsx\"; filename*=utf-8''" + rptNameURI );
+                    res.setHeader("Content-Disposition", "attachment; filename=\"" + rptNameURI + ".xlsx\"; filename*=utf-8''" + rptNameURI + '.xlsx' );
                     let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + newName + '.xlsx');
                     filestream.on('data', function(chunk) {
                         res.write(chunk);
@@ -347,7 +378,7 @@ module.exports = {
                 rpt_xl_util.exportExcelInOneBook(pageRstArray, pageSize, rptName, function(tmpFilePath){
                     res.setHeader('Content-Type', 'application/vnd.openxmlformats');
                     let rptNameURI = encodeURI(rptName);
-                    res.setHeader("Content-Disposition", "attachment; filename=\"" + rptNameURI + ".xlsx\"; filename*=utf-8''" + rptNameURI );
+                    res.setHeader("Content-Disposition", "attachment; filename=\"" + rptNameURI + ".xlsx\"; filename*=utf-8''" + rptNameURI + '.xlsx');
                     let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + tmpFilePath + '.xlsx');
                     filestream.on('data', function(chunk) {
                         res.write(chunk);
@@ -462,7 +493,7 @@ module.exports = {
                 res.setHeader('Content-Type', 'application/vnd.openxmlformats');
                 // res.setHeader("Content-Disposition", "attachment; filename=" + strUtil.getPinYinCamelChars(rptName) + ".pdf");
                 let rptNameURI = encodeURI(rptName);
-                res.setHeader("Content-Disposition", "attachment; filename=\"" + rptNameURI + ".pdf\"; filename*=utf-8''" + rptNameURI );
+                res.setHeader("Content-Disposition", "attachment; filename=\"" + rptNameURI + ".pdf\"; filename*=utf-8''" + rptNameURI + ".pdf"  );
 
                 let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + newName + '.pdf');
                 filestream.on('data', function(chunk) {

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

@@ -26,6 +26,7 @@ module.exports =function (app) {
     //now is the real:
     rptRouter.post('/getReport', reportController.getReportAllPages);
     rptRouter.post('/getReportSvg', reportController.getReportAllPagesSvg);
+    rptRouter.post('/getMultiReports', reportController.getMultiReports);
     rptRouter.get('/getExcelInOneBook/:prj_id/:rpt_ids/:size/:rptName/:option', reportController.getExcelInOneBook);
     rptRouter.get('/getExcel/:prj_id/:rpt_id/:size/:orientation/:rptName/:isOneSheet/:option', reportController.getExcel);
     rptRouter.get('/getPDF/:prj_id/:rpt_id/:size/:orientation/:rptName', reportController.getPDF);

+ 7 - 5
modules/reports/rpt_component/jpc_ex.js

@@ -215,12 +215,14 @@ JpcExSrv.prototype.createNew = function(){
         }
     };
     JpcResult.executeFormulas = function(runType, $CURRENT_TEMPLATE, $CURRENT_DATA, $CURRENT_RPT) {
-        let me = this;
-        for (let i = 0; i < me.formulas.length; i++) {
-            if (me.formulas[i][JV.PROP_RUN_TYPE] === runType) {
-                let expression = me.formulas[i][JV.PROP_EXPRESSION];
+        let execFmlMe = this;
+        for (let execFmlIdx = 0; execFmlIdx < execFmlMe.formulas.length; execFmlIdx++) {
+            //remark: 搞这么复杂的变量名是为了防止与表达式起冲突(如循环变量i,j,k,容易造成变量冲突且不容易看出问题)
+            if (execFmlMe.formulas[execFmlIdx][JV.PROP_RUN_TYPE] === runType) {
+                let expression = execFmlMe.formulas[execFmlIdx][JV.PROP_EXPRESSION];
                 if (expression) {
-                    let $ME = me.formulas[i];
+                    let $ME = execFmlMe.formulas[execFmlIdx];
+                    // console.log("current expression idx: " + execFmlIdx);
                     // console.log(expression);
                     try {
                         eval(expression);

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

@@ -437,7 +437,8 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
         for (let i = 0; i < stylesObj.fonts.length; i++) {
             let font = stylesObj.fonts[i];
             if (sheetFont) {
-                if (font[JV.FONT_PROPS[0]] === sheetFont[JV.FONT_PROPS[0]] && font.size === Math.round(sheetFont[JV.FONT_PROPS[1]] * 3 / 4)
+                // if (font[JV.FONT_PROPS[0]] === sheetFont[JV.FONT_PROPS[0]] && font.size === Math.round(sheetFont[JV.FONT_PROPS[1]] * 3 / 4)
+                if (font[JV.FONT_PROPS[0]] === sheetFont[JV.FONT_PROPS[0]] && font.size === Math.floor(sheetFont[JV.FONT_PROPS[1]] * 3 / 4)
                     && font[JV.FONT_PROPS[3]] === sheetFont[JV.FONT_PROPS[3]] && font[JV.FONT_PROPS[5]] === sheetFont[JV.FONT_PROPS[5]]) {
                     hasFont = true;
                     rst = i;
@@ -450,7 +451,8 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
         if (!hasFont) {
             let font = {};
             font[JV.FONT_PROPS[0]] = sheetFont[JV.FONT_PROPS[0]]; //font name
-            font.size = Math.round(sheetFont[JV.FONT_PROPS[1]] * 3 / 4);
+            // font.size = Math.round(sheetFont[JV.FONT_PROPS[1]] * 3 / 4);
+            font.size = Math.floor(sheetFont[JV.FONT_PROPS[1]] * 3 / 4);
             font.charset = 134;
             font.colorIdx = "8";
             font[JV.FONT_PROPS[3]] = sheetFont[JV.FONT_PROPS[3]]; //font bold

+ 3 - 2
test/unit/reports/test_rpt_test_template.js

@@ -27,8 +27,9 @@ let fsUtil = require("../../../public/fsUtil");
 
 let demoPrjId = - 1;
 // let demoRptId = 279;
-let demoRptId = 275; //测试模板-流水式
+// let demoRptId = 275; //测试模板-流水式
 // let demoRptId = 337; //19表
+let demoRptId = 361; //封1
 let pagesize = "A4";
 //288: 11-2表(新)
 //279: 04
@@ -79,7 +80,7 @@ test('测试 - 测试模板啦: ', function (t) {
                     let maxPages = printCom.totalPages;
                     let pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties);
                     if (pageRst) {
-                        // fsUtil.writeObjToFile(pageRst, "D:/GitHome/ConstructionCost/tmp/testBuiltPageResult_测试模板.jsp");
+                        fsUtil.writeObjToFile(pageRst, "D:/GitHome/ConstructionCost/tmp/testBuiltPageResult_测试模板.jsp");
                     } else {
                         console.log("oh! no pages were created!");
                     }

+ 2 - 2
web/building_saas/report/html/rpt_main.html

@@ -43,13 +43,13 @@
                                 <div class="btn-group" role="group">
                                     <button id="btnRptOrientation" type="button" class="btn btn-outline-primary btn-sm dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">纵向</button>
                                     <div class="dropdown-menu" aria-labelledby="btnGroupDrop1">
-                                        <a class="dropdown-item" id="hrefRptOrientation" onclick="zTreeOprObj.changeOrientation(this)">横向</a>
+                                        <a class="dropdown-item" id="hrefRptOrientation" style="cursor:pointer" onclick="zTreeOprObj.changeOrientation(this)">横向</a>
                                     </div>
                                 </div>
                                 <div class="btn-group" role="group">
                                     <button id="btnRptPageSize" type="button" class="btn btn-outline-primary btn-sm dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">A4</button>
                                     <div class="dropdown-menu" aria-labelledby="btnGroupDrop2">
-                                        <a class="dropdown-item" id="hrefRptPageSize" onclick="zTreeOprObj.changePageSize(this)">A3</a>
+                                        <a class="dropdown-item" id="hrefRptPageSize" style="cursor:pointer" onclick="zTreeOprObj.changePageSize(this)">A3</a>
                                     </div>
                                 </div>
                             </div>

+ 52 - 65
web/building_saas/report/html/rpt_print.html

@@ -38,83 +38,70 @@
 <script type="text/javascript" src="/web/building_saas/report/js/rpt_print.js"></script>
 <SCRIPT type="text/javascript">
     function loading() {
-        if (sessionStorage.currentPageData) {
-            let pageData = JSON.parse(sessionStorage.currentPageData);
+        if (sessionStorage.multiRptsData) {
+            let multiRptData = JSON.parse(sessionStorage.multiRptsData);
             let scaleFactor = parseInt(sessionStorage.scaleFactor);
-            $(document).attr("title", pageData[JV.NODE_PAGE_INFO][JV.NODE_MAIN_INFO_RPT_NAME]);
-            let orgHeight = 793, orgWidth = 1122;
-            let pageHeight = orgHeight * scaleFactor, pageWidth = orgWidth * scaleFactor;
-            if (sessionStorage.pageSize === 'A3') {
-                pageHeight = orgWidth * scaleFactor;
-                pageWidth = orgHeight * 2 * scaleFactor;
-                orgHeight = 1122;
-                orgWidth = 793 * 2;
-            } else if (sessionStorage.pageSize === '自定义') {
-                //自定义
-            }
-            if (sessionStorage.orientation === "纵向") {
-                let tmpInt = pageHeight;
-                pageHeight = pageWidth;
-                pageWidth = tmpInt;
-
-                tmpInt = orgWidth;
-                orgWidth = orgHeight;
-                orgHeight = tmpInt;
+            let svgArr = [];
+            for (let idx = 0; idx < multiRptData.length; idx++) {
+                let pageData = multiRptData[idx];
+                if (idx === 0) {
+                    $(document).attr("title", pageData[JV.NODE_PAGE_INFO][JV.NODE_MAIN_INFO_RPT_NAME]);
+                }
+                svgArr = svgArr.concat(rptPrintHelper.buildSvgArr(pageData, -30, -30));
             }
-
+            showPreviewData(svgArr, scaleFactor, sessionStorage.pageSize, sessionStorage.orientation);
+            window.print();
+        } else if (sessionStorage.currentPageData) {
+            let pageData = JSON.parse(sessionStorage.currentPageData);
+            let scaleFactor = parseInt(sessionStorage.scaleFactor);
             let svgArr = rptPrintHelper.buildSvgArr(pageData, -30, -30);
-            for (let i = 0; i < pageData.items.length; i++) {
-                let div = $('<div class="pageBreak"></div>');
-                div.append($(svgArr[i].join("")));
-                $("body").append(div);
-            }
-            $(document.body).find("div").each(function(index,element){
-                $(element).find("svg").each(function(cIdx,elementSvg){
-                    elementSvg.setAttribute('height', pageHeight);
-                    elementSvg.setAttribute('width', pageWidth);
-                });
-            });
+            $(document).attr("title", pageData[JV.NODE_PAGE_INFO][JV.NODE_MAIN_INFO_RPT_NAME]);
+            showPreviewData(svgArr, scaleFactor, sessionStorage.pageSize, sessionStorage.orientation);
             window.print();
-        } if (sessionStorage.currentPageSvgData) {
+        } else if (sessionStorage.currentPageSvgData) {
             let svgArr = JSON.parse(sessionStorage.currentPageSvgData);
             let scaleFactor = 1;
-            let orgHeight = 793, orgWidth = 1122;
-            let pageHeight = orgHeight * scaleFactor, pageWidth = orgWidth * scaleFactor;
-            if (sessionStorage.pageSize === 'A3') {
-                pageHeight = orgWidth * scaleFactor;
-                pageWidth = orgHeight * 2 * scaleFactor;
-                orgHeight = 1122;
-                orgWidth = 793 * 2;
-            } else if (sessionStorage.pageSize === '自定义') {
-                //自定义
-            }
-            if (sessionStorage.orientation === "纵向") {
-                let tmpInt = pageHeight;
-                pageHeight = pageWidth;
-                pageWidth = tmpInt;
-
-                tmpInt = orgWidth;
-                orgWidth = orgHeight;
-                orgHeight = tmpInt;
-            }
-
-            for (let i = 0; i < svgArr.length; i++) {
-                let div = $('<div class="pageBreak"></div>');
-                div.append($(svgArr[i].join("")));
-                $("body").append(div);
-            }
-            $(document.body).find("div").each(function(index,element){
-                $(element).find("svg").each(function(cIdx,elementSvg){
-                    elementSvg.setAttribute('height', pageHeight);
-                    elementSvg.setAttribute('width', pageWidth);
-                });
-            });
+            showPreviewData(svgArr, scaleFactor, sessionStorage.pageSize, sessionStorage.orientation);
             window.print();
         } else {
             //alert("没有报表数据!");
         }
     }
 
+    function showPreviewData(svgArr, scaleFactor, pageSize, orientation) {
+        let orgHeight = 793, orgWidth = 1122;
+        let pageHeight = orgHeight * scaleFactor, pageWidth = orgWidth * scaleFactor;
+        if (pageSize === 'A3') {
+            pageHeight = orgWidth * scaleFactor;
+            pageWidth = orgHeight * 2 * scaleFactor;
+            orgHeight = 1122;
+            orgWidth = 793 * 2;
+        } else if (pageSize === '自定义') {
+            //自定义
+        }
+        if (orientation === "纵向") {
+            let tmpInt = pageHeight;
+            pageHeight = pageWidth;
+            pageWidth = tmpInt;
+
+            tmpInt = orgWidth;
+            orgWidth = orgHeight;
+            orgHeight = tmpInt;
+        }
+
+        for (let i = 0; i < svgArr.length; i++) {
+            let div = $('<div class="pageBreak"></div>');
+            div.append($(svgArr[i].join("")));
+            $("body").append(div);
+        }
+        $(document.body).find("div").each(function(index,element){
+            $(element).find("svg").each(function(cIdx,elementSvg){
+                elementSvg.setAttribute('height', pageHeight);
+                elementSvg.setAttribute('width', pageWidth);
+            });
+        });
+    }
+
     function closing() {
         //
     }

+ 37 - 7
web/building_saas/report/js/rpt_print.js

@@ -4,15 +4,45 @@
 
 let rptPrintHelper = {
     preview: function () {
-        if (zTreeOprObj.currentRptPageRst) {
-            sessionStorage.currentPageData = JSON.stringify(zTreeOprObj.currentRptPageRst);
-            sessionStorage.pageSize = rptControlObj.getCurrentPageSize();
-            sessionStorage.orientation = rptControlObj.getCurrentOrientation();
-            sessionStorage.scaleFactor = 1;
-            window.open('/rpt_print');
+        if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) {
+            let rptIds = [];
+            let params = {};
+            params.custCfg = zTreeOprObj.reportPageCfg;
+            params.prj_id = projectInfoObj.projectInfo.ID;
+            for (let tplNode of zTreeOprObj.checkedRptTplNodes) {
+                rptIds.push(tplNode.refId);
+            }
+            params.rpt_ids = rptIds.join(",");
+            CommonAjax.postEx("report_api/getMultiReports", params, 10000, true,
+                function(result){
+                    //sessionStorage.currentPageData = JSON.stringify(zTreeOprObj.currentRptPageRst);
+                    sessionStorage.multiRptsData = JSON.stringify(result);
+                    sessionStorage.pageSize = rptControlObj.getCurrentPageSize();
+                    sessionStorage.orientation = rptControlObj.getCurrentOrientation();
+                    sessionStorage.scaleFactor = 1;
+                    window.open('/rpt_print');
+                },
+                function(failRst){
+                    sessionStorage.currentPageData = null;
+                    console.log(failRst);
+                },
+                function(exceptionRst){
+                    sessionStorage.currentPageData = null;
+                    console.log(exceptionRst);
+                }
+            );
         } else {
-            sessionStorage.currentPageData = null;
+            //不可能的branch
         }
+        // if (zTreeOprObj.currentRptPageRst) {
+        //     sessionStorage.currentPageData = JSON.stringify(zTreeOprObj.currentRptPageRst);
+        //     sessionStorage.pageSize = rptControlObj.getCurrentPageSize();
+        //     sessionStorage.orientation = rptControlObj.getCurrentOrientation();
+        //     sessionStorage.scaleFactor = 1;
+        //     window.open('/rpt_print');
+        // } else {
+        //     sessionStorage.currentPageData = null;
+        // }
     },
     previewSvgData: function() {
         //