Преглед на файлове

Merge branch 'master' of http://smartcost.f3322.net:3000/SmartCost/ConstructionCost

# Conflicts:
#	web/building_saas/main/html/main.html
zhongzewei преди 7 години
родител
ревизия
f442d5bea6

+ 2 - 1
modules/all_models/compilation.js

@@ -20,6 +20,7 @@ let engineeringListSchema = new Schema({
     }
 }, {_id: false});
 let childrenSchema = new Schema({
+    id:String,
     // 计价名称
     name: String,
     // 工程专业列表
@@ -47,7 +48,7 @@ let childrenSchema = new Schema({
             "cols":[]
         }
     }
-});
+},{_id: false});
 let modelSchema = {
     // 是否发布
     is_release: {

+ 19 - 0
modules/main/controllers/calc_program_controller.js

@@ -11,6 +11,7 @@ module.exports = {
     saveCalcItem: saveCalcItem,
     saveCalcItems: saveCalcItems,
     updateTemplate: updateTemplate,
+    updateTemplateFile: updateTemplateFile,
     addTemplate: addTemplate,
     deleteTemplate: deleteTemplate
 };
@@ -96,6 +97,24 @@ async function updateTemplate(req, res) {
 
 };
 
+async function updateTemplateFile(req, res) {
+    let result = {};
+    await calcProgramFacade.updateTemplateFile(req.body.data, function (err, msg, data) {
+        if (err) {
+            result.error = 1;
+            result.message = msg;
+            result.data = null;
+        }
+        else{
+            result.error = 0;
+            result.message = msg;
+            result.data = data;
+        }
+        res.json(result);
+    });
+
+};
+
 async function addTemplate(req, res) {
     let result = {};
     calcProgramFacade.addTemplate(req.body.data, function (err, msg) {

+ 23 - 0
modules/main/facade/calc_program_facade.js

@@ -21,6 +21,7 @@ module.exports = {
     saveCalcItem: saveCalcItem,
     saveCalcItems: saveCalcItems,
     updateTemplate: updateTemplate,
+    updateTemplateFile: updateTemplateFile,
     addTemplate: addTemplate,
     deleteTemplate: deleteTemplate
 };
@@ -189,6 +190,28 @@ function updateTemplate(dataObj, callback) {
     });
 };
 
+// 一次性替换所有模板:用于切换模板文件。(这里实际上只替换了所有模板,基本信息如projectID、name等保留)
+// {projectID: 2706, libID: 2}
+async function updateTemplateFile(dataObj, callback) {
+    dataObj=JSON.parse(dataObj);
+    let stdCP = await getStdCalcProgramFile(dataObj.libID);
+    projectCalcProgramsModel.findOne({projectID: dataObj.projectID}, function (err, data) {
+        if(!err){
+            data.templates = stdCP.templates;
+            data.save(function (err) {
+                if (err) {
+                    callback(1, '计算模板文件保存失败', null);
+                } else {
+                    callback(0, '计算模板文件保存成功', stdCP.templates);
+                }
+            });
+        }
+        else {
+            callback(1, '没有找到项目的计算模板文件', null);
+        }
+    });
+};
+
 // {  projectID: 1233, ID: 19, name: '建筑工程2', custom: true, calcItems: [{},{}] }
 function addTemplate(dataObj, callback) {
     dataObj=JSON.parse(dataObj);

+ 1 - 0
modules/main/routes/calc_program_route.js

@@ -14,6 +14,7 @@ module.exports = function (app) {
     cpRouter.post('/saveCalcItem', cpController.saveCalcItem);
     cpRouter.post('/saveCalcItems', cpController.saveCalcItems);
     cpRouter.post('/updateTemplate', cpController.updateTemplate);
+    cpRouter.post('/updateTemplateFile', cpController.updateTemplateFile);
     cpRouter.post('/addTemplate', cpController.addTemplate);
     cpRouter.post('/deleteTemplate', cpController.deleteTemplate);
 

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

@@ -302,7 +302,8 @@ module.exports = {
             try {
                 rpt_xl_util.exportExcel(pageRst, pageSize, rptName, isOneSheet, null, function(newName){
                     res.setHeader('Content-Type', 'application/vnd.openxmlformats');
-                    res.setHeader("Content-Disposition", "attachment; filename=" + strUtil.getPinYinCamelChars(rptName) + ".xlsx");
+                    let rptNameURI = encodeURI(rptName);
+                    res.setHeader("Content-Disposition", "attachment; filename=\"" + rptNameURI + ".xlsx\"; filename*=utf-8''" + rptNameURI );
                     let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + newName + '.xlsx');
                     filestream.on('data', function(chunk) {
                         res.write(chunk);
@@ -316,6 +317,48 @@ module.exports = {
             }
         })
     },
+    getExcelInOneBook: function (req, res) {
+        let prj_id = req.params.prj_id,
+            rpt_ids = req.params.rpt_ids.split(','),
+            pageSize = req.params.size,
+            rptName = req.params.rptName,
+            option = req.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, pageSize, null, null, 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 {
+                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 );
+                    let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + tmpFilePath + '.xlsx');
+                    filestream.on('data', function(chunk) {
+                        res.write(chunk);
+                    });
+                    filestream.on('end', function() {
+                        res.end();
+                    });
+                });
+            }
+        })
+    },
     getTestExcel: function(req, res) {
         let rpt_id = req.params.id,
             pageSize = req.params.size,
@@ -393,7 +436,9 @@ module.exports = {
         getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, null, 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");
+                // 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 + ".pdf" );
 
                 let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + newName + '.pdf');
                 filestream.on('data', function(chunk) {
@@ -415,7 +460,9 @@ module.exports = {
         getAllPagesCommonOrg(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");
+                // 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 );
 
                 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.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);
     // rptRouter.get('/getExcelInOneBook/:ids/:size/:rptName/:option', reportController.getExcelInOneBook);

+ 5 - 5
modules/users/models/engineering_lib_model.js

@@ -39,10 +39,10 @@ class EngineeringLibModel extends BaseModel {
                 continue;
             }
             for(let engineering of valuation.engineering_list) {
-                if (engineeringTemp[valuation._id] === undefined) {
-                    engineeringTemp[valuation._id] = [engineering.engineering_id];
+                if (engineeringTemp[valuation.id] === undefined) {
+                    engineeringTemp[valuation.id] = [engineering.engineering_id];
                 }else {
-                    engineeringTemp[valuation._id].push(engineering.engineering_id);
+                    engineeringTemp[valuation.id].push(engineering.engineering_id);
                 }
                 engineeringLibIdList.push(engineering.engineering_id);
             }
@@ -79,10 +79,10 @@ class EngineeringLibModel extends BaseModel {
                 continue;
             }
             for(let engineering of valuation.engineering_list) {
-                if (engineering === null || engineeringLib[valuation._id] === undefined) {
+                if (engineering === null || engineeringLib[valuation.id] === undefined) {
                     continue;
                 }
-                for (let tmp of engineeringLib[valuation._id]) {
+                for (let tmp of engineeringLib[valuation.id]) {
                     if (tmp._id.toString() === engineering.engineering_id.toString()) {
                         engineering.lib = tmp;
                     }

+ 14 - 14
package.json

@@ -22,37 +22,37 @@
     "glob": "~4.0.5"
   },
   "dependencies": {
+    "babel-core": "^6.4.0",
     "bluebird": "^3.5.0",
-    "jszip": "^3.1.3",
-    "moment": "^2.18.1",
-    "socket.io": "^2.0.3",
-    "ua-parser-js": "^0.7.14",
-    "uuid": "^3.1.0",
-    "ioredis":"^3.1.4",
-    "log4js":"~2.3.3",
-    "pdfkit": "^0.8.2",
     "del": "^1.1.1",
     "gulp": "^3.9.0",
     "gulp-autoprefixer": "^3.0.1",
     "gulp-babel": "^6.1.1",
-    "babel-core": "^6.4.0",
+    "gulp-concat": "^2.6.1",
     "gulp-cssnano": "^2.0.0",
     "gulp-eslint": "^0.13.2",
     "gulp-htmlmin": "^1.3.0",
     "gulp-imagemin": "^2.2.1",
+    "gulp-inject": "^4.3.0",
     "gulp-load-plugins": "^0.10.0",
     "gulp-plumber": "^1.0.1",
     "gulp-sass": "^2.0.0",
     "gulp-size": "^1.2.1",
     "gulp-uglify": "^1.1.0",
-    "gulp-inject":"^4.3.0",
-    "gulp-concat": "^2.6.1",
+    "gulp-uglify-es": "^0.1.3",
+    "ioredis": "^3.1.4",
+    "jszip": "^3.1.3",
+    "log4js": "~2.3.3",
     "main-bower-files": "^2.5.0",
-    "wiredep": "^2.2.2",
-    "gulp-uglify-es":"^0.1.3",
+    "moment": "^2.18.1",
     "multiparty": "^4.1.3",
+    "node-schedule": "^1.3.0",
     "node-xlsx": "^0.11.2",
-    "node-schedule": "^1.3.0"
+    "pdfkit": "^0.8.2",
+    "socket.io": "^2.0.3",
+    "ua-parser-js": "^0.7.14",
+    "uuid": "^3.1.0",
+    "wiredep": "^2.2.2"
   },
   "scripts": {
     "start": "C:\\Users\\mai\\AppData\\Roaming\\npm\\babel-node.cmd server.js"

BIN
web/building_saas/img/p1.png


BIN
web/building_saas/img/p2.png


+ 1 - 4
web/building_saas/main/html/main.html

@@ -1421,10 +1421,7 @@
             }
 
             $(document).ready(function(){
-                let a = '';
-                if(a === ''){
-                    console.log('a');
-                }
+           
                 //
             });
         </SCRIPT>

+ 9 - 4
web/building_saas/main/js/views/calc_program_manage.js

@@ -497,15 +497,20 @@ $(document).ready(function(){
         // 取标准库数据过来显示。
         let libID = $(this).val();
         if (libID == ''){
-
+            calcProgramManage.mainSpread.getSheet(0).setRowCount(0);
+            calcProgramManage.detailSpread.getSheet(0).setRowCount(0);
             return false;
         };
 
-        CommonAjax.post('/calcProgram/getStdCalcProgram', {"ID":  parseFloat(libID)}, function (data) {
-            projectObj.project.calcProgram.datas.templates = data.templates;
+        $.bootstrapLoading.start();
+        libID = parseFloat(libID);
+        let projectID = projectObj.project.ID();
+        CommonAjax.post('/calcProgram/updateTemplateFile', {"projectID": projectID, "libID": libID}, function (data) {
+            projectObj.project.calcProgram.datas.templates = data;
             projectObj.project.calcProgram.compileAllTemps();
+            projectObj.project.calcProgram.calcAllNodesAndSave();
             calcProgramManage.buildSheet();
-            // $('#this').val(libID);
+            $.bootstrapLoading.end();
         });
     });
 });

+ 2 - 1
web/building_saas/pm/html/project-management.html

@@ -546,6 +546,7 @@
     let billValuation = '<%- billValuation %>';
     let rationValuation = '<%- rationValuation %>';
     let engineeringList = '<%- engineeringList %>';
-    let compilationData = JSON.parse('<%- compilationData %>');
+    let compilationData = '<%- compilationData %>';
+    compilationData = JSON.parse(compilationData.replace(/[\s\r\n]/g, ""));//去掉空格字符
 </script>
 </html>

+ 4 - 3
web/building_saas/pm/js/pm_newMain.js

@@ -24,6 +24,7 @@ let fileType = {
     feeRateFile: 'FeeRateFile'
 };
 
+
 const projTreeObj = {
     tree: null,
     workBook: null,
@@ -1064,7 +1065,7 @@ $(document).ready(function() {
             if (valuation === null) {
                 continue;
             }
-            html += `<option ${i === targetData.length -1 ? 'selected' : ''} value="${valuation._id}">${valuation.name}</option>`;
+            html += `<option ${i === targetData.length -1 ? 'selected' : ''} value="${valuation.id}">${valuation.name}</option>`;
         }
         $("#valuation").html(html);
         //$("#tender-engineering").html('<option value="">请选择对应的工程专业</option>');
@@ -1778,7 +1779,7 @@ function getEngineeringList(){
     let valuationData = valuationType === 'bill' ? JSON.parse(billValuation) : JSON.parse(rationValuation);
     let engineeringList = [];
     for(let tmp of valuationData) {
-        if (tmp._id === valuation) {
+        if (tmp.id === valuation) {
             engineeringList = tmp.engineering_list;
             break;
         }
@@ -2076,7 +2077,7 @@ function AddTender() {
         let valuationData = valuationType === 'bill' ? JSON.parse(billValuation) : JSON.parse(rationValuation);
         let engineeringList = [];
         for(let tmp of valuationData) {
-            if (tmp._id === valuation) {
+            if (tmp.id === valuation) {
                 engineeringList = tmp.engineering_list;
                 break;
             }

+ 6 - 6
web/building_saas/report/html/rpt_export_excel.html

@@ -11,11 +11,11 @@
                 <div class="row">
                     <div class="col-6">
                         <div class="card">
-                            <img class="card-img-top" src="img/p2.png">
+                            <img class="card-img-top" src="/web/building_saas/img/p2.png">
                             <div class="card-body px-3">
                                 <div class="form-check">
-                                    <input class="form-check-input" type="radio" name="exampleRadios" id="exampleRadios1" value="option1" checked>
-                                    <label class="form-check-label" for="exampleRadios1">
+                                    <input class="form-check-input" type="radio" name="excelExportTypeRadio" id="excelExportType_AllInOneBook" value="option1" checked>
+                                    <label class="form-check-label" for="excelExportType_AllInOneBook">
                                         多个表导出一个Excel文件
                                     </label>
                                 </div>
@@ -24,11 +24,11 @@
                     </div>
                     <div class="col-6">
                         <div class="card">
-                            <img class="card-img-top" src="img/p1.png">
+                            <img class="card-img-top" src="/web/building_saas/img/p1.png">
                             <div class="card-body px-3">
                                 <div class="form-check">
-                                    <input class="form-check-input" type="radio" name="exampleRadios" id="exampleRadios2" value="option2" checked>
-                                    <label class="form-check-label" for="exampleRadios2">
+                                    <input class="form-check-input" type="radio" name="excelExportTypeRadio" id="excelExportType_IndividualBook" value="option2" checked>
+                                    <label class="form-check-label" for="excelExportType_IndividualBook">
                                         每个表导出一个Excel文件
                                     </label>
                                 </div>

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

@@ -15,9 +15,9 @@
             <div class="toolsbar">
                 <div class="print-toolsbar">
                     <div class="panel">
-                        <div class="panel-body">
+                        <div class="panel-body" id="print_div">
                             <button class="btn btn-outline-primary btn-sm" type="button" onclick="rptPrintHelper.preview()">
-                                <i class="fa fa-print"></i><br>打印
+                                <i class="fa fa-print"></i><br>打印<span class="badge badge-secondary">0</span>
                             </button>
                             <!--
                             <button class="btn btn-outline-primary btn-sm" type="button"  href="#export" data-toggle="modal" data-target="#export">
@@ -28,7 +28,7 @@
                     </div>
                     <div class="panel">
                         <div class="panel-body">
-                            <div class="btn-group" role="group" aria-label="Button group with nested dropdown">
+                            <div class="btn-group" role="group" aria-label="Button group with nested dropdown" id="export_div">
                                 <button type="button" class="btn btn-outline-primary btn-sm" data-toggle="modal" data-target="#export_excel"><i class="fa fa-file-excel-o"></i> Excel <span class="badge badge-secondary">0</span></button>
                                 <button type="button" class="btn btn-outline-primary btn-sm" onclick="rptControlObj.getPDF()"><i class="fa fa-file-pdf-o"></i> PDF <span class="badge badge-secondary">0</span></button>
                             </div>

+ 1 - 1
web/building_saas/report/js/rpt_cfg_const.js

@@ -25,7 +25,7 @@ let rpt_tpl_setting = {
         }
     },
     callback: {
-        //onCheck: zTreeOprObj.onCheck
+        onCheck: zTreeOprObj.onCheck,
         onClick: zTreeOprObj.onClick
     }
 };

+ 84 - 26
web/building_saas/report/js/rpt_main.js

@@ -26,10 +26,36 @@ let rptTplObj = {
 let zTreeOprObj = {
     treeObj: null,
     currentNode: null,
+    checkedRptTplNodes: null,
     currentRptPageRst: null,
     reportPageCfg: null,
     currentPage: 1,
     maxPages: 0,
+    countChkedRptTpl: function () {
+        let me = zTreeOprObj;
+        if (me.treeObj) {
+            me.checkedRptTplNodes = [];
+            let chkNodes = me.treeObj.getCheckedNodes(true), cnt = 0, hasCurrentNode = false;
+            for (let node of chkNodes) {
+                if (node.nodeType === TPL_TYPE_TEMPLATE) {
+                    cnt++;
+                    me.checkedRptTplNodes.push(node);
+                    if (me.currentNode === node) hasCurrentNode = true;
+                }
+            }
+            if (!hasCurrentNode && cnt === 0 && me.currentNode !== null) {
+                //这里根据实际需求再做处理
+                cnt++;
+                me.checkedRptTplNodes.push(me.currentNode);
+            }
+            $("#export_div").find("span").each(function(cIdx,elementSpan){
+                elementSpan.innerText = cnt;
+            });
+            $("#print_div").find("span").each(function(cIdx,elementSpan){
+                elementSpan.innerText = cnt;
+            });
+        }
+    },
     getReportTemplateTree: function() {
         let me = zTreeOprObj, params = {};
         params.engineerId = projectInfoObj.projectInfo.property.engineering;
@@ -114,11 +140,8 @@ let zTreeOprObj = {
         }
         me.treeObj.refresh();
     },
-    onCheck: function() {
-        //count();
-        //if (clearFlag) {
-        //    clearCheckedOldNodes();
-        //}
+    onCheck: function(event, treeId, treeNode) {
+        zTreeOprObj.countChkedRptTpl();
     },
     onClick: function(event,treeId,treeNode) {
         let me = zTreeOprObj;
@@ -131,6 +154,7 @@ let zTreeOprObj = {
             params.custCfg = me.reportPageCfg;
             me.currentNode = treeNode;
             me.requestReport(params);
+            me.countChkedRptTpl();
         }
     },
     changePageSize: function(dom) {
@@ -247,6 +271,8 @@ let canvasOprObj = {
 
 let rptControlObj = {
     currentOutputType: "Excel",
+    currentDownloadUrl: null,
+    currentDownloadIdx: 0,
     getCurrentPageSize: function() {
         // let rst = "A4";
         let rst = document.getElementById("btnRptPageSize").innerHTML.trim();
@@ -287,28 +313,47 @@ let rptControlObj = {
             //other types if needed.
         }
     },
-    getExcel: function() {
+    getAllInOneBook: function () {
+        let me = rptControlObj;
+        if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) {
+            let orgRptName = zTreeOprObj.checkedRptTplNodes[0].name;
+            let refRptTplIds = [];
+            for (let node of zTreeOprObj.checkedRptTplNodes) {
+                refRptTplIds.push(node.refId);
+            }
+            let url =  "/report_api/getExcelInOneBook/" + projectInfoObj.projectInfo.ID + "/" + refRptTplIds.join(",") + "/" +
+                me.getCurrentPageSize() + "/" + orgRptName + "/" + 'normal';
+            window.location = url;
+        }
+    },
+    getExcel: function () {
         let me = rptControlObj;
-        //目前只支持当前打开报表
-        //zTreeOprObj.currentRptPageRst
-        if (zTreeOprObj.currentNode && zTreeOprObj.currentNode.refId) {
-            let orgRptName = zTreeOprObj.currentNode.name;
-            orgRptName = orgRptName.replace('【', '').replace('】','').replace('-','_').replace(' ','');
-            let url =  "/report_api/getExcel/" + projectInfoObj.projectInfo.ID + "/" + zTreeOprObj.currentNode.refId + "/" +
-                me.getCurrentPageSize() + "/" + me.getCurrentOrientation() + "/" + orgRptName + "/" + false + "/" + 'normal';
-            window.location = url;//这里不能使用get方法跳转,否则下载不成功
+        if ($("#excelExportType_AllInOneBook").get(0).checked) {
+            me.getAllInOneBook();
+        } else if ($("#excelExportType_IndividualBook").get(0).checked) {
+            if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) {
+                let urls = [];
+                for (let tplNode of zTreeOprObj.checkedRptTplNodes) {
+                    let orgRptName = tplNode.name;
+                    let url =  "/report_api/getExcel/" + projectInfoObj.projectInfo.ID + "/" + tplNode.refId + "/" +
+                        me.getCurrentPageSize() + "/" + me.getCurrentOrientation() + "/" + orgRptName + "/" + true + "/" + 'normal';
+                    urls.push(url);
+                }
+                downloadReport(urls);
+            }
         }
     },
     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() + "/" + me.getCurrentOrientation() + "/" + orgRptName;
-            window.location = url;//这里不能使用get方法跳转,否则下载不成功
+        if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) {
+            let urls = [];
+            for (let tplNode of zTreeOprObj.checkedRptTplNodes) {
+                let orgRptName = tplNode.name;
+                let url =  "/report_api/getPDF/" + projectInfoObj.projectInfo.ID + "/" + tplNode.refId + "/" +
+                    me.getCurrentPageSize() + "/" + me.getCurrentOrientation() + "/" + orgRptName;
+                urls.push(url);
+            }
+            downloadReport(urls);
         }
     },
     firstPage: function(dom) {
@@ -335,7 +380,7 @@ let rptControlObj = {
         } else {
             keyPressed = event.which; // Firefox
         }
-        if (keyPressed == 13) {
+        if (keyPressed === 13) {
             let pageNum = 1;
             try {
                 pageNum = parseInt(dom.value);
@@ -389,12 +434,10 @@ let rptControlObj = {
         );
     },
     confirmCfgChange: function() {
-        // let me = zTreeOprObj;
         let treeNode = zTreeOprObj.currentNode;
         if (treeNode.nodeType === TPL_TYPE_TEMPLATE && treeNode.refId > 0) {
             let params = {};
-            let pageSize = rptControlObj.getCurrentPageSize();
-            params.pageSize = pageSize;
+            params.pageSize = rptControlObj.getCurrentPageSize();
             params.rpt_tpl_id = treeNode.refId;
             params.prj_id = projectInfoObj.projectInfo.ID;
             params.custCfg = zTreeOprObj.reportPageCfg;
@@ -403,3 +446,18 @@ let rptControlObj = {
 
     }
 };
+
+function downloadReport(urls) {
+    //考虑到多个报表下载,一些浏览器(如chrome)不允许一下子下载多个文件,得缓缓处理,统一在这处理
+    rptControlObj.currentDownloadUrl = null;
+    rptControlObj.currentDownloadIdx = 0;
+    let private_download = function() {
+        if (rptControlObj.currentDownloadIdx >= 0 && rptControlObj.currentDownloadIdx < urls.length) {
+            rptControlObj.currentDownloadUrl = urls[rptControlObj.currentDownloadIdx];
+            rptControlObj.currentDownloadIdx++;
+            window.location = rptControlObj.currentDownloadUrl;
+            setTimeout(private_download, 2000);
+        }
+    }
+    private_download();
+}