Ver código fonte

多种类报表导出 改进 + 优化

TonyKang 6 anos atrás
pai
commit
ced5444f3c

+ 347 - 52
modules/reports/controllers/rpt_controller.js

@@ -248,7 +248,6 @@ function getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, custo
                             let tplData = rptDataUtil.assembleData(rawDataObj);
                             let printCom = JpcEx.createNew();
                             if (pageSize) rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pageSize;
-                            //console.log("orientation: " + (orientation === 'null'));
                             if (orientation && (orientation !== 'null')) rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] = orientation;
                             let defProperties = rptUtil.getReportDefaultCache();
                             if (customizeCfg) setupCustomizeCfg(customizeCfg, rptTpl, defProperties);
@@ -344,62 +343,77 @@ function getMultiRptsCommon(user_id, prj_id, rpt_ids, pageSize, orientation, cus
                     filters.push(dtlFilter);
                 }
             }
-            //正常应该根据报表模板定义的数据类型来请求数据
-            rptTplDataFacade.prepareProjectData(userId_Dft, demoPrjId, filters, function (err, msg, rawDataObj) {
-                if (!err) {
-                    try {
-                        //1. 这里只用一份数据,根据实际应用情况,只需要保留copy三样数据: bills, ration, ration_glj, projectGLJ
-                        let savedBillsData = [], savedRationData = [], savedGljData = [];
-                        for (let dtlData of rawDataObj.prjData) {
-                            if (dtlData.moduleName === 'bills') {
-                                Object.assign(savedBillsData, dtlData.data);
-                            } else if (dtlData.moduleName === 'ration') {
-                                Object.assign(savedRationData, dtlData.data);
-                            } else if (dtlData.moduleName === 'ration_glj') {
-                                Object.assign(savedGljData, dtlData.data);
-                            } else if (dtlData.moduleName === 'projectGLJ') {
-                                //这个待定
-                            }
+        }
+        //正常应该根据报表模板定义的数据类型来请求数据
+        rptTplDataFacade.prepareProjectData(user_id, prj_id, filters, function (err, msg, rawDataObj) {
+            if (!err) {
+                try {
+                    let rptPageRstArray = [];
+                    //1. 这里只用一份数据,根据实际应用情况,只需要保留copy三样数据: bills, ration, ration_glj, projectGLJ
+                    let savedBillsData = [], savedRationData = [], savedGljData = [], savedPrjGljData = [], savedFeeRateData = [];
+                    for (let dtlData of rawDataObj.prjData) {
+                        if (dtlData.moduleName === 'bills') {
+                            Object.assign(savedBillsData, dtlData.data);
+                        } else if (dtlData.moduleName === 'ration') {
+                            Object.assign(savedRationData, dtlData.data);
+                        } else if (dtlData.moduleName === 'ration_glj') {
+                            Object.assign(savedGljData, dtlData.data);
+                        } else if (dtlData.moduleName === 'feeRate') {
+                            Object.assign(savedFeeRateData, dtlData.data._doc.rates);
+                        } else if (dtlData.moduleName === 'projectGLJ') {
+                            Object.assign(savedPrjGljData, dtlData.data.gljList);
                         }
-                        //2. 一个一个模板创建数据
-                        for (let tplIdx = 0; tplIdx < rptTpls.length; tplIdx++) {
-                            let rptTpl = (rptTpls[tplIdx]._doc)?rptTpls[tplIdx]._doc:rptTpls[tplIdx];
-                            rptDataUtil.initialize(rptTpl);
-                            let tplData = rptDataUtil.assembleData(rawDataObj);
-                            let printCom = JpcEx.createNew();
-                            rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pagesize;
-                            let defProperties = rpt_cfg;
-                            let dftOption = JV.PAGING_OPTION_NORMAL;
-                            printCom.initialize(rptTpl);
-                            printCom.analyzeData(rptTpl, tplData, defProperties, dftOption, JV.OUTPUT_TYPE_EXCEL);
-                            let maxPages = printCom.totalPages;
-                            let customizeCfg = {"fillZero": true};
-                            let pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties, customizeCfg);
-                            if (pageRst) {
-                            } else {
-                            }
-                            //注意:这里需要把清单、定额、工料机数据assign回去!!!
-                            for (let dtlData of rawDataObj.prjData) {
-                                if (dtlData.moduleName === 'bills' && savedBillsData.length > 0) {
-                                    Object.assign(dtlData.data, savedBillsData);
-                                } else if (dtlData.moduleName === 'ration' && savedRationData.length > 0) {
-                                    Object.assign(dtlData.data, savedRationData);
-                                } else if (dtlData.moduleName === 'ration_glj' && savedGljData.length > 0) {
-                                    Object.assign(dtlData.data, savedGljData);
-                                } else if (dtlData.moduleName === 'projectGLJ') {
-                                    //这个待定
-                                }
+                    }
+                    //2. 一个一个模板创建数据
+                    for (let tplIdx = 0; tplIdx < rptTpls.length; tplIdx++) {
+                        let rptTpl = (rptTpls[tplIdx]._doc)?rptTpls[tplIdx]._doc:rptTpls[tplIdx];
+                        rptDataUtil.initialize(rptTpl);
+                        let tplData = rptDataUtil.assembleData(rawDataObj);
+                        let printCom = JpcEx.createNew();
+                        rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pageSize;
+
+                        if (pageSize) rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pageSize;
+                        if (orientation && (orientation !== 'null')) rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] = orientation;
+                        let defProperties = rptUtil.getReportDefaultCache();
+                        if (customizeCfg) setupCustomizeCfg(customizeCfg, rptTpl, defProperties);
+                        let dftOption = option||JV.PAGING_OPTION_NORMAL;
+
+                        printCom.initialize(rptTpl);
+                        printCom.analyzeData(rptTpl, tplData, defProperties, dftOption, outputType);
+                        let maxPages = printCom.totalPages;
+                        let pageRst = null;
+                        if (maxPages > 0) {
+                            pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties, customizeCfg);
+                        } else {
+                            pageRst = printCom.outputAsPreviewPage(rptTpl, defProperties);
+                        }
+                        rptPageRstArray.push(pageRst);
+                        //注意:这里需要把清单、定额、工料机数据assign回去!!!
+                        for (let dtlData of rawDataObj.prjData) {
+                            if (dtlData.moduleName === 'bills' && savedBillsData.length > 0) {
+                                Object.assign(dtlData.data, savedBillsData);
+                            } else if (dtlData.moduleName === 'ration' && savedRationData.length > 0) {
+                                Object.assign(dtlData.data, savedRationData);
+                            } else if (dtlData.moduleName === 'ration_glj' && savedGljData.length > 0) {
+                                Object.assign(dtlData.data, savedGljData);
+                            } else if (dtlData.moduleName === 'feeRate' && savedFeeRateData.length > 0) {
+                                Object.assign(dtlData.data._doc.rates, savedFeeRateData);
+                            } else if (dtlData.moduleName === 'projectGLJ' && savedPrjGljData.length > 0) {
+                                Object.assign(dtlData.data.gljList, savedPrjGljData);
                             }
                         }
-                    } catch (ex) {
-                        console.log(ex);
-                    } finally {
                     }
-                } else {
-                    //
+                    cb(null, rptPageRstArray);
+                } catch (ex) {
+                    console.log("报表数据异常(getMultiRptsCommon): userId " + user_id + ", project id: " + prj_id);
+                    console.log(ex);
+                    cb('Exception occurs while on going...', null);
+                } finally {
                 }
-            })
-        }
+            } else {
+                cb('No report data were found!', null);
+            }
+        })
     });
 }
 
@@ -442,6 +456,88 @@ function getBillsSummaryReportPages(user_id, prjIds, rpt_id, pageSize, orientati
     });
 }
 
+function getSummaryComboPages(user_id, prjIds, billsSummaryRpt_ids, gljSummaryRpt_ids, pageSize, orientation, customizeCfg, option, outputType, cb) {
+    let pageRstArr = [];
+    let pri_setup_rpt_tpl_data = function (rptTpl, summaryRawDataRst) {
+        let rptDataUtil = new rptDataExtractor();
+        rptDataUtil.initialize((rptTpl._doc)?rptTpl._doc:rptTpl);
+        try {
+            let tplData = rptDataUtil.assembleData(summaryRawDataRst);
+            let printCom = JpcEx.createNew();
+            if (pageSize) rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pageSize;
+            if (orientation && (orientation !== 'null')) rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] = orientation;
+            let defProperties = rptUtil.getReportDefaultCache();
+            if (customizeCfg) setupCustomizeCfg(customizeCfg, rptTpl, defProperties);
+            let dftOption = option||JV.PAGING_OPTION_NORMAL;
+            printCom.initialize(rptTpl);
+            printCom.analyzeData(rptTpl, tplData, defProperties, dftOption, outputType);
+            let maxPages = printCom.totalPages;
+            let pageRst = null;
+            if (maxPages > 0) {
+                pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties, customizeCfg);
+            } else {
+                pageRst = printCom.outputAsPreviewPage(rptTpl, defProperties);
+            }
+            pageRstArr.push(pageRst);
+        } catch (ex) {
+            console.log("Summary报表数据异常: userId " + user_id + ", project ids: " + prjIds);
+            console.log(ex);
+        }
+    };
+
+    let billRpts = [], gljRpts = [];
+    rptTplFacade.getRptTemplates(billsSummaryRpt_ids.concat(gljSummaryRpt_ids)).then(function(rptTpls) {
+        if (rptTpls && rptTpls.length > 0) {
+            for (let rptTpl of rptTpls) {
+                if (billsSummaryRpt_ids.indexOf(rptTpl.ID) >= 0) {
+                    billRpts.push(rptTpl);
+                } else if (gljSummaryRpt_ids.indexOf(rptTpl.ID) >= 0) {
+                    gljRpts.push(rptTpl);
+                }
+            }
+        }
+        if (billRpts.length > 0) {
+            rptTplDataFacade.getBudgetSummayDatas(prjIds).then(function(summaryRawDataRst) {
+                let savedBillsData = [];
+                Object.assign(savedBillsData, summaryRawDataRst.SummaryAuditDetail);
+                for (let idx = 0; idx < billRpts.length; idx++) {
+                    pri_setup_rpt_tpl_data(billRpts[idx], summaryRawDataRst);
+                    if (idx < billRpts.length - 1) {
+                        Object.assign(summaryRawDataRst.SummaryAuditDetail, savedBillsData);
+                    }
+                }
+                if (gljRpts && gljRpts.length > 0) {
+                    rptTplDataFacade.getGLJSummayDatas(prjIds).then(function(summaryRawDataRst) {
+                        let savedBillsData = [];
+                        Object.assign(savedBillsData, summaryRawDataRst.SummaryAuditDetail);
+                        for (let idx = 0; idx < gljRpts.length; idx++) {
+                            pri_setup_rpt_tpl_data(gljRpts[idx], summaryRawDataRst);
+                            if (idx < gljRpts.length - 1) {
+                                Object.assign(summaryRawDataRst.SummaryAuditDetail, savedBillsData);
+                            }
+                        }
+                        cb(null, pageRstArr);
+                    });
+                } else {
+                    cb(null, pageRstArr);
+                }
+            });
+        } else if (gljRpts.length > 0) {
+            rptTplDataFacade.getGLJSummayDatas(prjIds).then(function(summaryRawDataRst) {
+                let savedBillsData = [];
+                Object.assign(savedBillsData, summaryRawDataRst.SummaryAuditDetail);
+                for (let idx = 0; idx < gljRpts.length; idx++) {
+                    pri_setup_rpt_tpl_data(gljRpts[idx], summaryRawDataRst);
+                    if (idx < gljRpts.length - 1) {
+                        Object.assign(summaryRawDataRst.SummaryAuditDetail, savedBillsData);
+                    }
+                }
+                cb(null, pageRstArr);
+            });
+        }
+    });
+}
+
 function getGljSummaryReportPages(user_id, prjIds, rpt_id, pageSize, orientation, customizeCfg, option, outputType, cb) {
     let rptTpl = null;
     rptTplDataFacade.getGLJSummayDatas(prjIds).then(function(summaryRawDataRst) {
@@ -497,6 +593,7 @@ module.exports = {
         });
     },
     getMultiReports: function (req, res) {
+        //打印预览用
         let params = JSON.parse(req.body.params),
             prj_id = params.prj_id,
             rpt_ids = params.rpt_ids.split(','),
@@ -578,6 +675,18 @@ module.exports = {
         });
     },
 
+    createSummaryReportFiles: function (req, res) {
+        let params = JSON.parse(req.body.params),
+            rpt_bill_tpl_ids = params.rpt_bill_tpl_ids,
+            rpt_glj_tpl_ids = params.rpt_glj_tpl_ids,
+            prjIds = params.prjIds,
+            pageSize = params.pageSize,
+            orientation = params.orientation,
+            customizeCfg = params.custCfg
+        ;
+        let user_id = req.session.sessionUser.id;
+    },
+
     getReportAllPagesSvg: function (req, res) {
         let params = JSON.parse(req.body.params),
             rpt_id = params.rpt_tpl_id,
@@ -632,6 +741,54 @@ module.exports = {
         })
     },
 
+    createExcelFilesInOneBookEx: function (req, res) {
+        //采用了优化策略
+        let params = JSON.parse(req.body.params),
+            prj_id = params.prj_id,
+            rpt_ids = params.rpt_ids,
+            //--以下是汇总类数据----------
+            rpt_bill_tpl_ids = params.rpt_bill_tpl_ids,
+            rpt_glj_tpl_ids = params.rpt_glj_tpl_ids,
+            prjIds = params.prjIds,
+            //------------
+            rptName = params.rptName,
+            pageSize = params.pageSize,
+            orientation = params.orientation,
+            customizeCfg = params.custCfg,
+            option = params.option;
+        let user_id = req.session.sessionUser.id;
+        let dftOption = option||JV.PAGING_OPTION_NORMAL;
+
+        if (rpt_ids && rpt_ids.length > 0) {
+            getMultiRptsCommon(user_id, prj_id, rpt_ids, pageSize, orientation, customizeCfg, dftOption, JV.OUTPUT_TYPE_NORMAL, function (err, rptPageRstArray) {
+                if(err){
+                    callback(req, res, '数据有误', null);
+                } else {
+                    if ((rpt_bill_tpl_ids && rpt_bill_tpl_ids.length > 0) || (rpt_glj_tpl_ids && rpt_glj_tpl_ids.length > 0)) {
+                        getSummaryComboPages(user_id, prjIds, rpt_bill_tpl_ids, rpt_glj_tpl_ids, pageSize, orientation, customizeCfg, option, JV.OUTPUT_TYPE_NORMAL, function (err, rptSumPageRstArray) {
+                            rpt_xl_util.exportExcelInOneBook(rptPageRstArray.concat(rptSumPageRstArray), pageSize, rptName, function(uuidName){
+                                let fileRst = {uuid: uuidName, reportName: rptName};
+                                callback(req, res, err, fileRst);
+                            });
+                        });
+                    } else {
+                        rpt_xl_util.exportExcelInOneBook(rptPageRstArray, pageSize, rptName, function(uuidName){
+                            let fileRst = {uuid: uuidName, reportName: rptName};
+                            callback(req, res, err, fileRst);
+                        });
+                    }
+                }
+            });
+        } else if ((rpt_bill_tpl_ids && rpt_bill_tpl_ids.length > 0) || (rpt_glj_tpl_ids && rpt_glj_tpl_ids.length > 0)) {
+            getSummaryComboPages(user_id, prjIds, rpt_bill_tpl_ids, rpt_glj_tpl_ids, pageSize, orientation, customizeCfg, option, JV.OUTPUT_TYPE_NORMAL, function (err, rptPageRstArray) {
+                rpt_xl_util.exportExcelInOneBook(rptPageRstArray, pageSize, rptName, function(uuidName){
+                    let fileRst = {uuid: uuidName, reportName: rptName};
+                    callback(req, res, err, fileRst);
+                });
+            });
+        }
+    },
+
     createExcelFiles: function (req, res) {
         let params = JSON.parse(req.body.params),
             prj_id = params.prj_id,
@@ -672,6 +829,76 @@ module.exports = {
             }
         })
     },
+
+    createExcelFilesEx: function (req, res) {
+        let params = JSON.parse(req.body.params),
+            prj_id = params.prj_id,
+            rpt_ids = params.rpt_ids,
+            //--以下是汇总类数据----------
+            rpt_bill_tpl_ids = params.rpt_bill_tpl_ids,
+            rpt_glj_tpl_ids = params.rpt_glj_tpl_ids,
+            prjIds = params.prjIds,
+            sum_rpt_names = params.sum_rpt_names,
+            //------------
+            rpt_names = params.rpt_names,
+            pageSize = params.pageSize,
+            orientation = params.orientation,
+            isOneSheet = params.isOneSheet,
+            customizeCfg = params.custCfg,
+            option = params.option;
+        let user_id = req.session.sessionUser.id;
+        let dftOption = option||JV.PAGING_OPTION_NORMAL;
+        let pri_Add_Parallel_Functions = function (parallelFunctions, rptPageRstArray, paraRptNames, err) {
+            for (let idx = 0; idx < rptPageRstArray.length; idx++) {
+                parallelFunctions.push((function (pageRst, rpt_name) {
+                    return function (cb) {
+                        rpt_xl_util.exportExcel(pageRst, pageSize, rpt_name, isOneSheet, null, null, function(uuidName){
+                            let fileRst = {uuid: uuidName, reportName: rpt_name};
+                            cb(err, fileRst);
+                        })
+                    };
+                })(rptPageRstArray[idx], paraRptNames[idx]));
+            }
+        };
+        let pri_Run_Parallel_Functions = function (parallelFunctions) {
+            async.parallel(parallelFunctions, function (err, fileRstArray) {
+                if (err) {
+                    console.log('导出Excel错误(导出数据过程错误), userId: ' + user_id + ', prjId' + prj_id);
+                    callback(req, res, '数据导出错误', null);
+                } else {
+                    // console.log(err);
+                    callback(req, res, err, fileRstArray);
+                }
+            });
+        };
+        if (rpt_ids && rpt_ids.length > 0) {
+            getMultiRptsCommon(user_id, prj_id, rpt_ids, pageSize, orientation, customizeCfg, dftOption, JV.OUTPUT_TYPE_PDF, function (err, rptPageRstArray) {
+                if (err) {
+                    console.log('导出Excel错误(生成数据过程错误), userId: ' + user_id + ', prjId' + prj_id);
+                    callback(req, res, '数据生成错误', null);
+                } else {
+                    if ((rpt_bill_tpl_ids && rpt_bill_tpl_ids.length > 0) || (rpt_glj_tpl_ids && rpt_glj_tpl_ids.length > 0)) {
+                        getSummaryComboPages(user_id, prjIds, rpt_bill_tpl_ids, rpt_glj_tpl_ids, pageSize, orientation, customizeCfg, option, JV.OUTPUT_TYPE_NORMAL, function (err, rptSumPageRstArray) {
+                            let parallelFunctions = [];
+                            pri_Add_Parallel_Functions(parallelFunctions, rptPageRstArray, rpt_names, err);
+                            pri_Add_Parallel_Functions(parallelFunctions, rptSumPageRstArray, sum_rpt_names, err);
+                            pri_Run_Parallel_Functions(parallelFunctions);
+                        });
+                    } else {
+                        let parallelFunctions = [];
+                        pri_Add_Parallel_Functions(parallelFunctions, rptPageRstArray, rpt_names, err);
+                        pri_Run_Parallel_Functions(parallelFunctions);
+                    }
+                }
+            });
+        } else if ((rpt_bill_tpl_ids && rpt_bill_tpl_ids.length > 0) || (rpt_glj_tpl_ids && rpt_glj_tpl_ids.length > 0)) {
+            getSummaryComboPages(user_id, prjIds, rpt_bill_tpl_ids, rpt_glj_tpl_ids, pageSize, orientation, customizeCfg, option, JV.OUTPUT_TYPE_NORMAL, function (err, rptSumPageRstArray) {
+                let parallelFunctions = [];
+                pri_Add_Parallel_Functions(parallelFunctions, rptSumPageRstArray, sum_rpt_names, err);
+                pri_Run_Parallel_Functions(parallelFunctions);
+            });
+        }
+    },
     getFileByUUID: function (req, res) {
         let uuid = req.params.uuid,
             rptName = req.params.rptName,
@@ -806,6 +1033,74 @@ module.exports = {
             }
         })
     },
+    createPdfFilesEx: function (req, res) {
+        let params = JSON.parse(req.body.params),
+            prj_id = params.prj_id,
+            rpt_ids = params.rpt_ids,
+            rpt_names = params.rpt_names,
+            //--以下是汇总类数据----------
+            rpt_bill_tpl_ids = params.rpt_bill_tpl_ids,
+            rpt_glj_tpl_ids = params.rpt_glj_tpl_ids,
+            prjIds = params.prjIds,
+            sum_rpt_names = params.sum_rpt_names,
+            //------------
+            pageSize = params.pageSize,
+            orientation = params.orientation,
+            customizeCfg = params.custCfg,
+            option = params.option;
+        let user_id = req.session.sessionUser.id;
+        let dftOption = option||JV.PAGING_OPTION_NORMAL;
+        let pri_Add_Parallel_Functions = function (parallelFunctions, rptPageRstArray, paraRptNames, err) {
+            for (let idx = 0; idx < rptPageRstArray.length; idx++) {
+                parallelFunctions.push((function (pageRst, rpt_name) {
+                    return function (cb) {
+                        rpt_pdf_util.export_pdf_file(pageRst, pageSize, rpt_name, function(uuidName){
+                            let fileRst = {uuid: uuidName, reportName: rpt_name};
+                            cb(err, fileRst);
+                        })
+                    };
+                })(rptPageRstArray[idx], paraRptNames[idx]));
+            }
+        };
+        let pri_Run_Parallel_Functions = function (parallelFunctions) {
+            async.parallel(parallelFunctions, function (err, fileRstArray) {
+                if (err) {
+                    console.log('导出PDF错误(生成数据过程错误), userId: ' + user_id + ', prjId' + prj_id);
+                    callback(req, res, '数据导出错误', null);
+                } else {
+                    // console.log(err);
+                    callback(req, res, err, fileRstArray);
+                }
+            });
+        };
+        if (rpt_ids && rpt_ids.length > 0) {
+            getMultiRptsCommon(user_id, prj_id, rpt_ids, pageSize, orientation, customizeCfg, dftOption, JV.OUTPUT_TYPE_PDF, function (err, rptPageRstArray) {
+                if (err) {
+                    console.log('导出Excel错误(生成数据过程错误), userId: ' + user_id + ', prjId' + prj_id);
+                    callback(req, res, '数据生成错误', null);
+                } else {
+                    if ((rpt_bill_tpl_ids && rpt_bill_tpl_ids.length > 0) || (rpt_glj_tpl_ids && rpt_glj_tpl_ids.length > 0)) {
+                        getSummaryComboPages(user_id, prjIds, rpt_bill_tpl_ids, rpt_glj_tpl_ids, pageSize, orientation, customizeCfg, option, JV.OUTPUT_TYPE_NORMAL, function (err, rptSumPageRstArray) {
+                            let parallelFunctions = [];
+                            pri_Add_Parallel_Functions(parallelFunctions, rptPageRstArray, rpt_names, err);
+                            pri_Add_Parallel_Functions(parallelFunctions, rptSumPageRstArray, sum_rpt_names, err);
+                            pri_Run_Parallel_Functions(parallelFunctions);
+                        });
+                    } else {
+                        let parallelFunctions = [];
+                        pri_Add_Parallel_Functions(parallelFunctions, rptPageRstArray, rpt_names, err);
+                        pri_Run_Parallel_Functions(parallelFunctions);
+                    }
+                }
+            });
+        } else if ((rpt_bill_tpl_ids && rpt_bill_tpl_ids.length > 0) || (rpt_glj_tpl_ids && rpt_glj_tpl_ids.length > 0)) {
+            getSummaryComboPages(user_id, prjIds, rpt_bill_tpl_ids, rpt_glj_tpl_ids, pageSize, orientation, customizeCfg, option, JV.OUTPUT_TYPE_NORMAL, function (err, rptSumPageRstArray) {
+                let parallelFunctions = [];
+                pri_Add_Parallel_Functions(parallelFunctions, rptSumPageRstArray, sum_rpt_names, err);
+                pri_Run_Parallel_Functions(parallelFunctions);
+            });
+        }
+    },
     getPDF:function (req, res) {
         let prj_id = req.params.prj_id,
             rpt_id = req.params.rpt_id,

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

@@ -27,9 +27,9 @@ module.exports =function (app) {
     rptRouter.post('/getReport', reportController.getReportAllPages);
     rptRouter.post('/getReportSvg', reportController.getReportAllPagesSvg);
     rptRouter.post('/getMultiReports', reportController.getMultiReports);
-    rptRouter.post('/createExcelFiles', reportController.createExcelFiles);
-    rptRouter.post('/createExcelFilesInOneBook', reportController.createExcelFilesInOneBook);
-    rptRouter.post('/createPdfFiles', reportController.createPdfFiles);
+    rptRouter.post('/createExcelFiles', reportController.createExcelFilesEx);
+    rptRouter.post('/createExcelFilesInOneBook', reportController.createExcelFilesInOneBookEx);
+    rptRouter.post('/createPdfFiles', reportController.createPdfFilesEx);
     rptRouter.post('/getBillsSummaryReport', reportController.getBillSummaryReportPages);
     rptRouter.post('/getGljSummaryReport', reportController.getGljSummaryReportPages);
 

+ 2 - 0
modules/reports/util/rpt_yanghu_data_util.js

@@ -154,6 +154,7 @@ class Rpt_Data_Extractor {
                                     field[JV.PROP_FIELD_EXP_MAP].indexOf("'techQuantity'") > 0 ) {
                                     if (rst.indexOf(projectConst.RATION) < 0) rst.push(projectConst.RATION);
                                     if (rst.indexOf(projectConst.BILLS) < 0) rst.push(projectConst.BILLS);
+                                    //备注:项目工料机的数量是需要根据定额清单来计算的!这里的逻辑是对的
                                 }
                             }
                         }
@@ -165,6 +166,7 @@ class Rpt_Data_Extractor {
                         field[JV.PROP_FIELD_EXP_MAP].indexOf("'techQuantity'") > 0 ) {
                         if (rst.indexOf(projectConst.RATION) < 0) rst.push(projectConst.RATION);
                         if (rst.indexOf(projectConst.BILLS) < 0) rst.push(projectConst.BILLS);
+                        //备注:项目工料机的数量是需要根据定额清单来计算的!这里的逻辑是对的
                     }
                 }
             }

+ 18 - 9
test/unit/reports/test_multi_rpts.js

@@ -38,9 +38,12 @@ let demoRptIds = [];
 // demoRptIds.push(20); //01
 // demoRptIds.push(23); //04 综合费率表
 // demoRptIds.push(56); //24
-demoRptIds.push(36); //5.1
-demoRptIds.push(49); //5.5
+// demoRptIds.push(36); //5.1
+// demoRptIds.push(49); //5.5
 // demoRptIds.push(66); //5.4
+demoRptIds.push(57); //01
+demoRptIds.push(58); //03
+demoRptIds.push(59); //04
 
 let pagesize = "A4";
 
@@ -55,8 +58,8 @@ let demoPrjId = - 1;
 // demoPrjId = 313; //PROD:
 // demoPrjId = 455; //PROD:
 // demoPrjId = 618; //PROD:
-demoPrjId = 815; //PROD:
-// demoPrjId = 4107; //UAT:
+// demoPrjId = 815; //PROD:
+demoPrjId = 1510; //UAT:
 //*/
 let userId_Dft = userId_Leng;
 // let userId_Dft = "5a025c4c15074d134c2b9689";
@@ -106,12 +109,15 @@ test('测试 - 测试模板啦: ', function (t) {
                 }
             }
         }
+        filters.push('projectGLJ'); //临时用
+        console.log(filters);
         //正常应该根据报表模板定义的数据类型来请求数据
         rptTplDataFacade.prepareProjectData(userId_Dft, demoPrjId, filters, function (err, msg, rawDataObj) {
             if (!err) {
                 try {
                     //1. 这里只用一份数据,根据实际应用情况,只需要保留copy三样数据: bills, ration, ration_glj, projectGLJ
-                    let savedBillsData = [], savedRationData = [], savedGljData = [];
+                    fsUtil.writeObjToFile(rawDataObj, "D:/GitHome/YangHuCost/tmp/报表优化测试_原始数据.jsp");
+                    let savedBillsData = [], savedRationData = [], savedGljData = [], savedPrjGljData = [], savedFeeRateData = [];
                     for (let dtlData of rawDataObj.prjData) {
                         if (dtlData.moduleName === 'bills') {
                             Object.assign(savedBillsData, dtlData.data);
@@ -119,8 +125,10 @@ test('测试 - 测试模板啦: ', function (t) {
                             Object.assign(savedRationData, dtlData.data);
                         } else if (dtlData.moduleName === 'ration_glj') {
                             Object.assign(savedGljData, dtlData.data);
+                        } else if (dtlData.moduleName === 'feeRate') {
+                            Object.assign(savedFeeRateData, dtlData.data._doc.rates);
                         } else if (dtlData.moduleName === 'projectGLJ') {
-                            //这个待定
+                            Object.assign(savedPrjGljData, dtlData.data.gljList);
                         }
                     }
                     //2. 一个一个模板创建数据
@@ -148,7 +156,6 @@ test('测试 - 测试模板啦: ', function (t) {
                         } else {
                             console.log("oh! no pages were created!");
                         }
-                        //注意:这里需要把清单、定额、工料机数据assign回去!!!
                         for (let dtlData of rawDataObj.prjData) {
                             if (dtlData.moduleName === 'bills' && savedBillsData.length > 0) {
                                 Object.assign(dtlData.data, savedBillsData);
@@ -156,8 +163,10 @@ test('测试 - 测试模板啦: ', function (t) {
                                 Object.assign(dtlData.data, savedRationData);
                             } else if (dtlData.moduleName === 'ration_glj' && savedGljData.length > 0) {
                                 Object.assign(dtlData.data, savedGljData);
-                            } else if (dtlData.moduleName === 'projectGLJ') {
-                                //这个待定
+                            } else if (dtlData.moduleName === 'feeRate' && savedFeeRateData.length > 0) {
+                                Object.assign(dtlData.data._doc.rates, savedFeeRateData);
+                            } else if (dtlData.moduleName === 'projectGLJ' && savedPrjGljData.length > 0) {
+                                Object.assign(dtlData.data.gljList, savedPrjGljData);
                             }
                         }
                     }

+ 13 - 8
test/unit/reports/test_rpt_test_template.js

@@ -30,7 +30,7 @@ let demoPrjId = - 1;
 // let demoRptId = 6; //封面
 // let demoRptId = 22; //03
 // let demoRptId = 26; //07
-// let demoRptId = 28; //09
+let demoRptId = 28; //09
 // let demoRptId = 27; //08
 // let demoRptId = 24; //05
 // let demoRptId = 20; //01
@@ -46,7 +46,7 @@ let demoPrjId = - 1;
 // let demoRptId = 37; //5.2.1 计日工劳务
 // let demoRptId = 68; //01-2
 // let demoRptId = 71; //21-2
-let demoRptId = 74; //22
+// let demoRptId = 74; //22
 
 let pagesize = "A4";
 //288: 11-2表(新)
@@ -63,8 +63,8 @@ let userId_Leng = "5c3ffa9aa0a92732f41216e0"; //小冷User Id (养护的)
 // demoPrjId = 455; //PROD:
 // demoPrjId = 776; //PROD:
 // demoPrjId = 671; //PROD:
-// demoPrjId = 473; //UAT
-demoPrjId = 1516; //PROD:
+demoPrjId = 2056; //UAT
+// demoPrjId = 1516; //PROD:
 // demoPrjId = 756; //PROD:
 // demoPrjId = 815; //PROD:
 // demoPrjId = 4107; //UAT:
@@ -89,24 +89,28 @@ fs.readFile(__dirname.slice(0, __dirname.length - 18) + '/public/web/date_util.j
 });
 
 test('测试 - 测试模板啦: ', function (t) {
+    // console.log(new Date());
     rptTplFacade.getRptTemplate(demoRptId).then(function(rptTpl) {
+        // console.log(new Date());
         let rptDataUtil = new rptDataExtractor();
         rptDataUtil.initialize(rptTpl._doc);
         let filter = rptDataUtil.getDataRequestFilter();
+        console.log('开始时间:' + (new Date()));
         // filter.push('ration');  //临时用
         // filter.push('ration_coe'); //临时用2
         // filter.push('projectGLJ'); //临时用3
         // filter.push('calc_program'); //临时用4
-        // console.log(filter);
+        console.log(filter);
         //正常应该根据报表模板定义的数据类型来请求数据
         rptTplDataFacade.prepareProjectData(userId_Dft, demoPrjId, filter, function (err, msg, rawDataObj) {
             if (!err) {
                 try {
                     let dt = new Date();
-                    // fsUtil.writeObjToFile(rawDataObj, "D:/GitHome/YangHuCost/tmp/rptTplRawDataObject_测试模板.jsp");
+                    console.log('取完项目数据时间:' + (dt));
+                    fsUtil.writeObjToFile(rawDataObj, "D:/GitHome/YangHuCost/tmp/rptTplRawDataObject_测试模板.jsp");
                     let tplData = rptDataUtil.assembleData(rawDataObj);
                     // fsUtil.writeObjToFile(rawDataObj, "D:/GitHome/YangHuCost/tmp/rptTplRawDataAfterCacl_测试模板.jsp");
-                    // fsUtil.writeObjToFile(tplData, "D:/GitHome/YangHuCost/tmp/rptTplAssembledData_测试模板.jsp");
+                    fsUtil.writeObjToFile(tplData, "D:/GitHome/YangHuCost/tmp/rptTplAssembledData_测试模板.jsp");
                     //it's time to build the report!!!
                     let printCom = JpcEx.createNew();
                     rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pagesize;
@@ -124,7 +128,7 @@ test('测试 - 测试模板啦: ', function (t) {
                     }
                     if (pageRst) {
                         // fsUtil.writeObjToFile(pageRst, "D:/GitHome/YangHuCost/tmp/testBuiltPageResult_测试模板" + dt.getTime() + ".jsp");
-                        // fsUtil.writeObjToFile(pageRst, "D:/GitHome/YangHuCost/tmp/testBuiltPageResult_测试模板.jsp");
+                        fsUtil.writeObjToFile(pageRst, "D:/GitHome/YangHuCost/tmp/testBuiltPageResult_测试模板.jsp");
                         // rpt_xl_util.exportExcel(pageRst, pagesize, "local_test_rpt_excel", true, null, null, function(uuidName){
                         //     console.log("excel uuid: " + uuidName);
                         // });
@@ -134,6 +138,7 @@ test('测试 - 测试模板啦: ', function (t) {
                     } else {
                         console.log("oh! no pages were created!");
                     }
+                    // console.log(new Date());
                 } catch (ex) {
                     console.log(ex);
                     t.pass('pass with exception!');

+ 5 - 5
test/unit/reports/test_summary_multi_prjs.js

@@ -16,8 +16,8 @@ dbm.connect(process.env.NODE_ENV);
 
 let demoPrjs = [1510, 1511]; //
 // let demoRptId = 68; //01-2
-// let demoRptId = 72; //01-1
-let demoRptId = 73; //02-2
+let demoRptId = 72; //01-1
+// let demoRptId = 73; //02-2
 let pagesize = "A4";
 let userId_Leng = "5c3ffa9aa0a92732f41216e0"; //小冷User Id (养护的)
 // let userId_me = "5b6a60b1c4ba33000dd417c0"; //我的
@@ -45,14 +45,14 @@ fs.readFile(__dirname.slice(0, __dirname.length - 18) + '/public/web/date_util.j
     eval(data);
 });
 
-/*
+//*
 test('测试 - 测试清单汇总: ', function (t) {
     rptTplDataFacade.getBudgetSummayDatas(demoPrjs).then(function(summaryRst) {
         //console.log(summaryRst);
         rptTplFacade.getRptTemplate(demoRptId).then(function(rptTpl) {
             try {
                 let dt = new Date();
-                // fsUtil.writeObjToFile(summaryRst, "D:/GitHome/YangHuCost/tmp/多清单汇总表(01_2)原始数据.jsp");
+                fsUtil.writeObjToFile(summaryRst, "D:/GitHome/YangHuCost/tmp/多清单汇总表(01_2)原始数据.jsp");
                 let rptDataUtil = new rptDataExtractor();
                 rptDataUtil.initialize(rptTpl._doc);
                 let tplData = rptDataUtil.assembleData(summaryRst);
@@ -69,7 +69,7 @@ test('测试 - 测试清单汇总: ', function (t) {
                 let customizeCfg = {"fillZero": true};
                 let pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties, customizeCfg);
                 if (pageRst) {
-                    fsUtil.writeObjToFile(pageRst, "D:/GitHome/YangHuCost/tmp/多清单汇总表(01_2)page数据" + dt.getTime() + ".jsp");
+                    // fsUtil.writeObjToFile(pageRst, "D:/GitHome/YangHuCost/tmp/多清单汇总表(01_2)page数据" + dt.getTime() + ".jsp");
                     // rpt_xl_util.exportExcel(pageRst, pagesize, "local_test_rpt_excel", true, null, null, function(uuidName){
                     //     console.log("excel uuid: " + uuidName);
                     // });

+ 13 - 1
web/building_saas/report/html/rpt_select_projects.html

@@ -18,7 +18,19 @@
             </div>
             <div class="modal-footer" id="divReqGljSummary" style="display:none">
                 <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                <a onclick="zTreeOprObj.requestGljSummaryRpt()" class="btn btn-primary" data-dismiss="modal">确定</a>
+                <a onclick="zTreeOprObj.requestGljSummaryRpt()" class="btn btn-primary" data-dismiss="modal" >确定</a>
+            </div>
+            <div class="modal-footer" id="divReqCommonSummaryExcel" style="display:none">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+                <a onclick="zTreeOprObj.requestSumAndNormalRptForAllInOneExcel()" class="btn btn-primary" data-dismiss="modal">确定</a>
+            </div>
+            <div class="modal-footer" id="divReqCommonSummaryMultiExcel" style="display:none">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+                <a onclick="zTreeOprObj.requestSumAndNormalRptForMultiExcel()" class="btn btn-primary" data-dismiss="modal">确定</a>
+            </div>
+            <div class="modal-footer" id="divReqCommonSummaryPDF" style="display:none">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+                <a onclick="zTreeOprObj.requestSumAndNormalRptForPDF()" class="btn btn-primary" data-dismiss="modal">确定</a>
             </div>
         </div>
     </div>

+ 298 - 7
web/building_saas/report/js/rpt_main.js

@@ -274,7 +274,7 @@ let zTreeOprObj = {
     requestReport: function (params) {
         let me = zTreeOprObj;
         hintBox.waitBox();
-        CommonAjax.postEx("report_api/getReport", params, 15000, true,
+        CommonAjax.postEx("report_api/getReport", params, 60000, true,
             function(result){
                 hintBox.unWaitBox();
                 let pageRst = result;
@@ -343,12 +343,18 @@ let zTreeOprObj = {
         let me = zTreeOprObj;
         $("#divReqBillSummary")[0].style.display = "";
         $("#divReqGljSummary")[0].style.display = "none";
+        $("#divReqCommonSummaryExcel")[0].style.display = "none";
+        $("#divReqCommonSummaryMultiExcel")[0].style.display = "none";
+        $("#divReqCommonSummaryPDF")[0].style.display = "none";
         me.requestPrjFolderCommon();
     },
     requestPrjFolderForGljSummary: function () {
         let me = zTreeOprObj;
         $("#divReqBillSummary")[0].style.display = "none";
         $("#divReqGljSummary")[0].style.display = "";
+        $("#divReqCommonSummaryExcel")[0].style.display = "none";
+        $("#divReqCommonSummaryMultiExcel")[0].style.display = "none";
+        $("#divReqCommonSummaryPDF")[0].style.display = "none";
         me.requestPrjFolderCommon();
     },
     requestBillsSummaryRpt: function () {
@@ -441,6 +447,146 @@ let zTreeOprObj = {
             );
         }
     },
+    requestSumAndNormalRptForPDF: function () {
+        let me = rptControlObj;
+        let rpt_names = [], bill_rpt_names = [], glj_rpt_names = [];
+        let refRptTplIds = [], refBillSumPrjsIds = [], refGljSumPrjsIds = [];
+        for (let node of zTreeOprObj.checkedRptTplNodes) {
+            if (node.hasOwnProperty('flags') && node.flags.hasOwnProperty('reportType') && node['flags']['reportType'] !== 'NA') {
+                if (node['flags']['reportType'] === 'billSummary') {
+                    refBillSumPrjsIds.push(node.refId);
+                    bill_rpt_names.push(node.name);
+                } else if (node['flags']['reportType'] === 'gljSummary') {
+                    refGljSumPrjsIds.push(node.refId);
+                    glj_rpt_names.push(node.name);
+                }
+            } else {
+                refRptTplIds.push(node.refId);
+                rpt_names.push(node.name);
+            }
+        }
+        let nodes = zTreeOprObj.prjFolderTreeObj.getCheckedNodes(true);
+        let params = {};
+        params.prj_id = projectObj.project.projectInfo.ID;
+        params.rpt_ids = refRptTplIds;
+        params.rpt_bill_tpl_ids = refBillSumPrjsIds;
+        params.rpt_glj_tpl_ids = refGljSumPrjsIds;
+        params.prjIds = [];
+        for (let node of nodes) {
+            params.prjIds.push(node.ID);
+        }
+        params.sum_rpt_names = bill_rpt_names.concat(glj_rpt_names);
+        params.rpt_names = rpt_names;
+        params.isOneSheet = true;
+        params.pageSize = me.getCurrentPageSize();
+        params.orientation = ((zTreeOprObj.checkedRptTplNodes.length > 1)?null:me.getCurrentOrientation());
+        params.custCfg = zTreeOprObj.reportPageCfg;
+        params.option = "normal";
+        CommonAjax.postEx("report_api/createPdfFiles", params, 120000, true, function(result){
+                if (result) {
+                    let uuIdUrls = [];
+                    for (let uuIdObj of result) {
+                        let uuIdUrl =  "/report_api/getFileByUUID/" + uuIdObj.uuid + "/" + stringUtil.replaceAll(uuIdObj.reportName, "#", "_") + "/pdf";
+                        uuIdUrls.push(uuIdUrl);
+                    }
+                    downloadReport(uuIdUrls);
+                } else {
+                    //
+                }
+            }, null, null
+        );
+    },
+    requestSumAndNormalRptForMultiExcel: function () {
+        let me = rptControlObj;
+        let rpt_names = [], bill_rpt_names = [], glj_rpt_names = [];
+        let refRptTplIds = [], refBillSumPrjsIds = [], refGljSumPrjsIds = [];
+        for (let node of zTreeOprObj.checkedRptTplNodes) {
+            if (node.hasOwnProperty('flags') && node.flags.hasOwnProperty('reportType') && node['flags']['reportType'] !== 'NA') {
+                if (node['flags']['reportType'] === 'billSummary') {
+                    refBillSumPrjsIds.push(node.refId);
+                    bill_rpt_names.push(node.name);
+                } else if (node['flags']['reportType'] === 'gljSummary') {
+                    refGljSumPrjsIds.push(node.refId);
+                    glj_rpt_names.push(node.name);
+                }
+            } else {
+                refRptTplIds.push(node.refId);
+                rpt_names.push(node.name);
+            }
+        }
+        let nodes = zTreeOprObj.prjFolderTreeObj.getCheckedNodes(true);
+        let params = {};
+        params.prj_id = projectObj.project.projectInfo.ID;
+        params.rpt_ids = refRptTplIds;
+        params.rpt_bill_tpl_ids = refBillSumPrjsIds;
+        params.rpt_glj_tpl_ids = refGljSumPrjsIds;
+        params.prjIds = [];
+        for (let node of nodes) {
+            params.prjIds.push(node.ID);
+        }
+        params.sum_rpt_names = bill_rpt_names.concat(glj_rpt_names);
+        params.rpt_names = rpt_names;
+        params.isOneSheet = true;
+        params.pageSize = me.getCurrentPageSize();
+        params.orientation = ((zTreeOprObj.checkedRptTplNodes.length > 1)?null:me.getCurrentOrientation());
+        params.custCfg = zTreeOprObj.reportPageCfg;
+        params.option = "normal";
+        CommonAjax.postEx("report_api/createExcelFiles", params, 120000, true, function(result){
+                if (result) {
+                    let uuIdUrls = [];
+                    for (let uuIdObj of result) {
+                        let uuIdUrl =  "/report_api/getFileByUUID/" + uuIdObj.uuid + "/" + stringUtil.replaceAll(uuIdObj.reportName, "#", "_") + "/xlsx";
+                        uuIdUrls.push(uuIdUrl);
+                    }
+                    downloadReport(uuIdUrls);
+                } else {
+                    //
+                }
+            }, null, null
+        );
+    },
+    requestSumAndNormalRptForAllInOneExcel: function () {
+        let me = rptControlObj;
+        let orgRptName = projectObj.project.projectInfo.name;
+        let refRptTplIds = [], refBillSumPrjsIds = [], refGljSumPrjsIds = [];
+        for (let node of zTreeOprObj.checkedRptTplNodes) {
+            if (node.hasOwnProperty('flags') && node.flags.hasOwnProperty('reportType') && node['flags']['reportType'] !== 'NA') {
+                if (node['flags']['reportType'] === 'billSummary') {
+                    refBillSumPrjsIds.push(node.refId);
+                } else if (node['flags']['reportType'] === 'gljSummary') {
+                    refGljSumPrjsIds.push(node.refId);
+                }
+            } else {
+                refRptTplIds.push(node.refId);
+            }
+        }
+        let nodes = zTreeOprObj.prjFolderTreeObj.getCheckedNodes(true);
+        let params = {};
+        params.prj_id = projectObj.project.projectInfo.ID;
+        params.rpt_ids = refRptTplIds;
+        params.rpt_bill_tpl_ids = refBillSumPrjsIds;
+        params.rpt_glj_tpl_ids = refGljSumPrjsIds;
+        params.prjIds = [];
+        for (let node of nodes) {
+            params.prjIds.push(node.ID);
+        }
+        params.rptName = orgRptName;
+        params.pageSize = me.getCurrentPageSize();
+        params.orientation = ((zTreeOprObj.checkedRptTplNodes.length > 1)?null:me.getCurrentOrientation());
+        params.custCfg = zTreeOprObj.reportPageCfg;
+        params.option = "normal";
+        CommonAjax.postEx("report_api/createExcelFilesInOneBook", params, 120000, true, function(result){
+                if (result) {
+                    let uuIdUrls = [];
+                    let uuIdUrl =  "/report_api/getFileByUUID/" + result.uuid + "/" + stringUtil.replaceAll(result.reportName, "#", "_") + "/xlsx";
+                    uuIdUrls.push(uuIdUrl);
+                    downloadReport(uuIdUrls);
+                } else {
+                    //
+                }
+            }, null, null
+        );
+    },
     showPage: function (pageNum, canvas) {
         let me = zTreeOprObj;
         if (pageNum >= 1 && pageNum <= me.maxPages) {
@@ -536,7 +682,7 @@ let rptControlObj = {
             //other types if needed.
         }
     },
-    getAllInOneBook: function () {
+    getAllInOneBook_bk: function () {
         if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) {
             let me = rptControlObj;
             let orgRptName = projectObj.project.projectInfo.name;
@@ -552,7 +698,7 @@ let rptControlObj = {
             params.orientation = ((zTreeOprObj.checkedRptTplNodes.length > 1)?null:me.getCurrentOrientation());
             params.custCfg = zTreeOprObj.reportPageCfg;
             params.option = "normal";
-            CommonAjax.postEx("report_api/createExcelFilesInOneBook", params, 20000, true, function(result){
+            CommonAjax.postEx("report_api/createExcelFilesInOneBook", params, 120000, true, function(result){
                     if (result) {
                         let uuIdUrls = [];
                         let uuIdUrl =  "/report_api/getFileByUUID/" + result.uuid + "/" + stringUtil.replaceAll(result.reportName, "#", "_") + "/xlsx";
@@ -565,7 +711,53 @@ let rptControlObj = {
             );
         }
     },
-    getAllIndividualExcelBook: function () {
+    getAllInOneBook: function () {
+        if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) {
+            let me = rptControlObj;
+            let orgRptName = projectObj.project.projectInfo.name;
+            let refRptTplIds = [], refBillSumPrjsIds = [], refGljSumPrjsIds = [];
+            for (let node of zTreeOprObj.checkedRptTplNodes) {
+                if (node.hasOwnProperty('flags') && node.flags.hasOwnProperty('reportType') && node['flags']['reportType'] !== 'NA') {
+                    if (node['flags']['reportType'] === 'billSummary') {
+                        refBillSumPrjsIds.push(node.refId);
+                    } else if (node['flags']['reportType'] === 'gljSummary') {
+                        refGljSumPrjsIds.push(node.refId);
+                    }
+                } else {
+                    refRptTplIds.push(node.refId);
+                }
+            }
+            if (refBillSumPrjsIds.length > 0 || refGljSumPrjsIds.length > 0) {
+                $("#divReqBillSummary")[0].style.display = "none";
+                $("#divReqGljSummary")[0].style.display = "none";
+                $("#divReqCommonSummaryExcel")[0].style.display = "";
+                $("#divReqCommonSummaryMultiExcel")[0].style.display = "none";
+                $("#divReqCommonSummaryPDF")[0].style.display = "none";
+                zTreeOprObj.requestPrjFolderCommon(); //先处理需要汇总的报表,走另外一个分支
+            } else if (refRptTplIds.length > 0) {
+                let params = {};
+                params.prj_id = projectObj.project.projectInfo.ID;
+                params.rpt_ids = refRptTplIds;
+                params.rptName = orgRptName;
+                params.pageSize = me.getCurrentPageSize();
+                params.orientation = ((zTreeOprObj.checkedRptTplNodes.length > 1)?null:me.getCurrentOrientation());
+                params.custCfg = zTreeOprObj.reportPageCfg;
+                params.option = "normal";
+                CommonAjax.postEx("report_api/createExcelFilesInOneBook", params, 120000, true, function(result){
+                        if (result) {
+                            let uuIdUrls = [];
+                            let uuIdUrl =  "/report_api/getFileByUUID/" + result.uuid + "/" + stringUtil.replaceAll(result.reportName, "#", "_") + "/xlsx";
+                            uuIdUrls.push(uuIdUrl);
+                            downloadReport(uuIdUrls);
+                        } else {
+                            //
+                        }
+                    }, null, null
+                );
+            }
+        }
+    },
+    getAllIndividualExcelBook_bk: function () {
         let me = rptControlObj;
         if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) {
             let rpt_ids = [], rpt_names = [];
@@ -582,7 +774,7 @@ let rptControlObj = {
             params.isOneSheet = true;
             params.custCfg = zTreeOprObj.reportPageCfg;
             params.option = "normal";
-            CommonAjax.postEx("report_api/createExcelFiles", params, 20000, true, function(result){
+            CommonAjax.postEx("report_api/createExcelFiles", params, 120000, true, function(result){
                     if (result) {
                         let uuIdUrls = [];
                         for (let uuIdObj of result) {
@@ -597,6 +789,56 @@ let rptControlObj = {
             );
         }
     },
+    getAllIndividualExcelBook: function () {
+        let me = rptControlObj;
+        if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) {
+            let refRptTplIds = [], refBillSumPrjsIds = [], refGljSumPrjsIds = [], rpt_names = [];
+            for (let node of zTreeOprObj.checkedRptTplNodes) {
+                if (node.hasOwnProperty('flags') && node.flags.hasOwnProperty('reportType') && node['flags']['reportType'] !== 'NA') {
+                    if (node['flags']['reportType'] === 'billSummary') {
+                        refBillSumPrjsIds.push(node.refId);
+                    } else if (node['flags']['reportType'] === 'gljSummary') {
+                        refGljSumPrjsIds.push(node.refId);
+                    }
+                } else {
+                    refRptTplIds.push(node.refId);
+                    rpt_names.push(node.name);
+                }
+            }
+
+            if (refBillSumPrjsIds.length > 0 || refGljSumPrjsIds.length > 0) {
+                $("#divReqBillSummary")[0].style.display = "none";
+                $("#divReqGljSummary")[0].style.display = "none";
+                $("#divReqCommonSummaryExcel")[0].style.display = "none";
+                $("#divReqCommonSummaryMultiExcel")[0].style.display = "";
+                $("#divReqCommonSummaryPDF")[0].style.display = "none";
+                zTreeOprObj.requestPrjFolderCommon(); //先处理需要汇总的报表,走另外一个分支
+            } else if (refRptTplIds.length > 0) {
+                let params = {};
+                params.prj_id = projectObj.project.projectInfo.ID;
+                params.rpt_ids = refRptTplIds;
+                params.rpt_names = rpt_names;
+                params.pageSize = me.getCurrentPageSize();
+                params.orientation = ((zTreeOprObj.checkedRptTplNodes.length > 1)?null:me.getCurrentOrientation());
+                params.isOneSheet = true;
+                params.custCfg = zTreeOprObj.reportPageCfg;
+                params.option = "normal";
+                CommonAjax.postEx("report_api/createExcelFiles", params, 120000, true, function(result){
+                        if (result) {
+                            let uuIdUrls = [];
+                            for (let uuIdObj of result) {
+                                let uuIdUrl =  "/report_api/getFileByUUID/" + uuIdObj.uuid + "/" + stringUtil.replaceAll(uuIdObj.reportName, "#", "_") + "/xlsx";
+                                uuIdUrls.push(uuIdUrl);
+                            }
+                            downloadReport(uuIdUrls);
+                        } else {
+                            //
+                        }
+                    }, null, null
+                );
+            }
+        }
+    },
     checkAndGetExcel: function () {
         if (zTreeOprObj.treeObj) {
             let chkNodes = zTreeOprObj.treeObj.getCheckedNodes(true);
@@ -615,7 +857,7 @@ let rptControlObj = {
             me.getAllIndividualExcelBook();
         }
     },
-    getPDF: function() {
+    getPDF_bk: function() {
         let me = rptControlObj;
         if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) {
             let rpt_ids = [], rpt_names = [];
@@ -631,7 +873,7 @@ let rptControlObj = {
             params.orientation = ((zTreeOprObj.checkedRptTplNodes.length > 1)?null:me.getCurrentOrientation());
             params.custCfg = zTreeOprObj.reportPageCfg;
             params.option = "normal";
-            CommonAjax.postEx("report_api/createPdfFiles", params, 20000, true, function(result){
+            CommonAjax.postEx("report_api/createPdfFiles", params, 120000, true, function(result){
                     if (result) {
                         let uuIdUrls = [];
                         for (let uuIdObj of result) {
@@ -646,6 +888,55 @@ let rptControlObj = {
             );
         }
     },
+    getPDF: function () {
+        let me = rptControlObj;
+        if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) {
+            let refRptTplIds = [], refBillSumPrjsIds = [], refGljSumPrjsIds = [], rpt_names = [];
+            for (let node of zTreeOprObj.checkedRptTplNodes) {
+                if (node.hasOwnProperty('flags') && node.flags.hasOwnProperty('reportType') && node['flags']['reportType'] !== 'NA') {
+                    if (node['flags']['reportType'] === 'billSummary') {
+                        refBillSumPrjsIds.push(node.refId);
+                    } else if (node['flags']['reportType'] === 'gljSummary') {
+                        refGljSumPrjsIds.push(node.refId);
+                    }
+                } else {
+                    refRptTplIds.push(node.refId);
+                    rpt_names.push(node.name);
+                }
+            }
+
+            if (refBillSumPrjsIds.length > 0 || refGljSumPrjsIds.length > 0) {
+                $("#divReqBillSummary")[0].style.display = "none";
+                $("#divReqGljSummary")[0].style.display = "none";
+                $("#divReqCommonSummaryExcel")[0].style.display = "none";
+                $("#divReqCommonSummaryMultiExcel")[0].style.display = "none";
+                $("#divReqCommonSummaryPDF")[0].style.display = "";
+                zTreeOprObj.requestPrjFolderCommon(); //先处理需要汇总的报表,走另外一个分支
+            } else if (refRptTplIds.length > 0) {
+                let params = {};
+                params.prj_id = projectObj.project.projectInfo.ID;
+                params.rpt_ids = refRptTplIds;
+                params.rpt_names = rpt_names;
+                params.pageSize = me.getCurrentPageSize();
+                params.orientation = ((zTreeOprObj.checkedRptTplNodes.length > 1)?null:me.getCurrentOrientation());
+                params.custCfg = zTreeOprObj.reportPageCfg;
+                params.option = "normal";
+                CommonAjax.postEx("report_api/createPdfFiles", params, 120000, true, function(result){
+                        if (result) {
+                            let uuIdUrls = [];
+                            for (let uuIdObj of result) {
+                                let uuIdUrl =  "/report_api/getFileByUUID/" + uuIdObj.uuid + "/" + stringUtil.replaceAll(uuIdObj.reportName, "#", "_") + "/pdf";
+                                uuIdUrls.push(uuIdUrl);
+                            }
+                            downloadReport(uuIdUrls);
+                        } else {
+                            //
+                        }
+                    }, null, null
+                );
+            }
+        }
+    },
     firstPage: function(dom) {
         let canvas = document.getElementById("rptCanvas");
         zTreeOprObj.showPage(1, canvas);