Browse Source

Merge branch 'master' of http://192.168.1.41:3000/SmartCost/YangHuCost

chenshilong 6 năm trước cách đây
mục cha
commit
c9e1565375

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 3 - 0
lib/fileSaver/FileSaver.min.js


+ 4 - 3
modules/main/facade/project_facade.js

@@ -300,6 +300,7 @@ async function getBudgetSummayDatas(projectIDs){
         names.push(mp.name);
         prjTypeNames.push(mp.prjTypeName);
         compilationScopes.push(mp.compilationScope);
+        if(projects.length == 1) decimal = await decimal_facade.getProjectDecimal(projectIDs[0]);//如果只有一个项目,则没走合并的那一步,decimal会为空,从面报错
         for(let i = 1;i<projects.length;i++){
             names.push(projects[i].name);
             prjTypeNames.push(projects[i].prjTypeName);
@@ -370,16 +371,16 @@ function getReportData(nameList,items,prjTypeNames,compilationScopes,decimal) {
                 total = scMathUtil.roundForObj(p+total,decimal.process);
             }
             tem.billsPrices.push(p);
-            if(bills.quantityMap[n]){
+            if(bills.quantityMap[n] && parseFloat(bills.quantityMap[n]) !== 0){
                 tem.billsAmounts.push(bills.quantityMap[n]);
                 tem['技术经济指标'].push(scMathUtil.roundForObj(p/bills.quantityMap[n],2));
             }else {
                 tem.billsAmounts.push(0);
-                tem['技术经济指标'].push(0);
+                tem['技术经济指标'].push(scMathUtil.roundForObj(p,2));
             }
         }
         tem.billsTtlPrice = scMathUtil.roundForObj(total,decimal.bills.totalPrice);
-        tem['技术经济综合指标'] = tem.billsTtlAmt?scMathUtil.roundForObj(tem.billsTtlPrice/tem.billsTtlAmt,2):0;
+        tem['技术经济综合指标'] = (tem.billsTtlAmt && parseFloat(tem.billsTtlAmt) !== 0)?scMathUtil.roundForObj(tem.billsTtlPrice/tem.billsTtlAmt,2):scMathUtil.roundForObj(tem.billsTtlPrice,2);
         if(bills.flag == fixedFlag.TOTAL_COST) totalItem = tem;
         return tem
     }

+ 52 - 3
modules/pm/controllers/pm_controller.js

@@ -28,7 +28,7 @@ const _ = require('lodash');
 import SectionTreeDao from '../../complementary_ration_lib/models/sectionTreeModel';
 let sectionTreeDao = new SectionTreeDao();
 let consts = require('../../main/models/project_consts');
-
+import multiparty from 'multiparty';
 //统一回调函数
 let callback = function(req, res, err, message, data){
     res.json({error: err, message: message, data: data});
@@ -451,10 +451,11 @@ module.exports = {
     },
 
     recGC: function(request, response){
-        let userID = request.session.sessionUser.id;
+        let userID = request.session.sessionUser.id,
+            compilationId = request.session.sessionCompilation._id;
         let data = JSON.parse(request.body.data);
         let nodes = data.nodes;
-        ProjectsData.recGC(userID, nodes, function (err, msg, data) {
+        ProjectsData.recGC(userID, compilationId, nodes, function (err, msg, data) {
             callback(request, response, err, msg, data);
         });
    },
@@ -665,5 +666,53 @@ module.exports = {
             console.log(err);
             callback(req, res, 1, err, null);
         }
+    },
+    exportProject:async function(req,res){
+        let result={
+            error:0
+        };
+        try {
+            let data = JSON.parse(req.body.data);
+            result.data = await pm_facade.exportProject(req.session.sessionUser.id, data);
+        }catch (err){
+            console.log(err);
+            result.error=1;
+            result.message = err.message;
+        }
+        res.json(result);
+
+    },
+    importProject:async function(req,res){
+        let form = new multiparty.Form({uploadDir: './public'});
+        let uploadFullName;
+        form.parse(req, async function (err, fields, files) {
+            try {
+                const file = typeof files.file !== 'undefined' ? files.file[0] : null;
+                if (err || !file) {
+                    throw '上传失败。';
+                }
+                console.log(file);
+                let data = fs.readFileSync(file.path,'utf-8');
+                console.log(data);
+            }catch (e){
+
+            }
+            res.json({error:0})
+        })
+        /*let result={
+            error:0
+        };
+        try {
+            console.log(req.files[0]);
+           /!* let data = JSON.parse(req.body.data);
+            result.data = await pm_facade.exportProject(req.session.sessionUser.id, data);*!/
+        }catch (err){
+            console.log(err);
+            result.error=1;
+            result.message = err.message;
+        }
+        res.json(result);*/
+
+
     }
 };

+ 86 - 2
modules/pm/facade/pm_facade.js

@@ -27,6 +27,7 @@ module.exports={
     prepareInitialData: prepareInitialData,
     changeFile:changeFile,
     copyForSectionError: copyForSectionError,
+    exportProject:exportProject
 };
 
 
@@ -49,6 +50,8 @@ let feeRateModel = mongoose.model('fee_rates');
 let feeRateFileModel = mongoose.model('fee_rate_file');
 let unitPriceFileModel = mongoose.model("unit_price_file");
 let mixRatioModel = mongoose.model("mix_ratio");
+let freightModel = mongoose.model("freight_calc");
+let originalModel = mongoose.model("original_calc");
 let unitPriceModel = mongoose.model("unit_price");
 let installationFeeModel = mongoose.model("installation_fee");
 let rationGLJModel = mongoose.model('ration_glj');
@@ -70,6 +73,7 @@ import CounterModel from "../../glj/models/counter_model";
 import moment from 'moment';
 import billsFlags from '../../common/const/bills_fixed';
 const notDeleted = [{deleteInfo: null}, {'deleteInfo.deleted': false}];
+let cipher = require('../../../public/cipher');
 
 
 
@@ -362,6 +366,8 @@ async function copyUnitPriceFile(newProjectID,rootProjectID,userID,originaluUnit
     let taskList = [
         copyFile(newProjectID,rootProjectID,userID,originaluUnitPriceFileID,unitPriceFileID,newName),
         copySubList(originaluUnitPriceFileID,unitPriceFileID,mixRatioModel),
+        copySubList(originaluUnitPriceFileID,unitPriceFileID,freightModel,true),
+        copySubList(originaluUnitPriceFileID,unitPriceFileID,originalModel,true),
         copySubList(originaluUnitPriceFileID,unitPriceFileID,unitPriceModel)
     ];
 
@@ -379,12 +385,12 @@ async function copyUnitPriceFile(newProjectID,rootProjectID,userID,originaluUnit
         await unitPriceFileModel.create(unitPriceFile._doc);
     }
 
-    async function copySubList(srcFID,newFID,model) {
+    async function copySubList(srcFID,newFID,model,UUID=false) {
         let mList = await model.find({unit_price_file_id: srcFID}, '-_id');
         let rList = [];
         for(let m of mList){
             m._doc.unit_price_file_id = newFID;
-            m._doc.id = await getCounterID(model.modelName);
+            UUID == true?m._doc.ID = uuidV1():m._doc.id = await getCounterID(model.modelName);
             rList.push(m._doc);
         }
         await insertMany(rList,model)
@@ -970,4 +976,82 @@ async function changeFile(datas,userID,fileID,name,from,type){//from 费率或
     }
     await project_facade.markProjectsToChange(projectIDs,projectUpdateType)//项目标记为待刷新状态
 
+}
+
+async function exportProject(userID,data){//导出建设项目
+    console.log(data);
+    if(data.type == 'main'){
+        return await exportMainData(userID,data.projectID);
+    }else {
+        return await  exportTenderData(data);
+    }
+}
+
+async function exportMainData(userID,projectID) {
+    let result = {userID:userID,projects:[],type:'Project'};//type 备用属性,表示导出的类型,目前导出的都是整个建设项目
+    let tenderIDs = [];
+    let project = await projectModel.findOne({ID:projectID});
+    if(!project) throw  new Error("没有找到该建设项目:"+projectID);
+    result['compilationID'] = project.compilation;
+    result.projects.push(project);
+    let subProjects = await  projectModel.find({"$or": [{'ParentID':projectID}, {"property.rootProjectID": projectID}]});
+    for(let s of subProjects){
+        if(!s.deleteInfo || !s.deleteInfo.deleted){
+            result.projects.push(s);
+            if(s.projType =="Tender") tenderIDs.push(s.ID);
+        }
+    }
+    let files = {unitFiles:await exportUnitFiles(projectID),feeRateFiles:await exportFeeRateFiles(projectID)};
+    result.files = files;
+    result = cipher.aesEncrypt(JSON.stringify(result));
+    result +="|----|" +JSON.stringify(tenderIDs);
+    return result;
+}
+
+async function exportUnitFiles(rootProjectID){
+    let unitFiles = [];
+    let files = await unitPriceFileModel.find({root_project_id:rootProjectID});
+    for(let f of  files){
+         if(f.deleteInfo && f.deleteInfo.deleted == true) continue;
+         let tem = {unitFile:f};
+         tem.unitPrices = await unitPriceModel.find({unit_price_file_id:f.id});
+         tem.mixRatios = await mixRatioModel.find({unit_price_file_id:f.id});
+         tem.freights = await freightModel.find({unit_price_file_id:f.id});
+         tem.originals = await originalModel.find({unit_price_file_id:f.id});
+         unitFiles.push(tem);
+    }
+    return unitFiles;
+}
+
+async function exportFeeRateFiles(rootProjectID) {
+    let feeRateFiles = [];
+    let files = await feeRateFileModel.find({rootProjectID:rootProjectID});
+    for(let f of files){
+        if(f.deleteInfo && f.deleteInfo.deleted == true) continue;
+        let tem = {feeRateFile:f};
+        tem.feeRate = await feeRateModel.findOne({ID:f.feeRateID});
+        feeRateFiles.push(tem);
+    }
+    return feeRateFiles;
+}
+
+
+
+async function exportTenderData(data){
+    let result = {};
+    let projectSetting =  await projectSettingModel.findOne({"projectID": data.projectID}, '-_id');
+    if(projectSetting) result['projSetting'] = projectSetting;
+    result.bills = await billsModel.find({"projectID": data.projectID});
+    result.rations = await rationModel.find({'$or': [{projectID: data.projectID, deleteInfo: null}, {projectID: data.projectID, 'deleteInfo.deleted': {$in: [null, false]}}]});
+    result.projectGLJs = await gljListModel.find({'project_id':data.projectID});
+    result.installationFees =  await installationFeeModel.find({projectID:data.projectID});
+    result.rationGLJs = await rationGLJModel.find({projectID:data.projectID});
+    result.rationCoes = await rationCoeModel.find({projectID:data.projectID});
+    result.quantityDetails = await quantityDetailModel.find({projectID:data.projectID});
+    result.rationInstallations = await rationInstallationModel.find({projectID:data.projectID});
+    result.rationTemplates = await rationTemplateModel.find({projectID:data.projectID});
+    result.calcProgramsFile = await calcProgramsModel.findOne({projectID:data.projectID});
+    result.labourCoes = await labourCoesModel.findOne({projectID:data.projectID});
+
+    return cipher.aesEncrypt(JSON.stringify(result));
 }

+ 4 - 4
modules/pm/models/project_model.js

@@ -467,8 +467,8 @@ ProjectsDAO.prototype.getGCFiles = async function (fileType, userID) {
     return rst;
 };
 
-ProjectsDAO.prototype.getFirstNodeID = async function (userID, pid) {
-    let nodes = await Projects.find({userID: userID, ParentID: pid, deleteInfo: null});
+ProjectsDAO.prototype.getFirstNodeID = async function (userID, compilationId, pid) {
+    let nodes = await Projects.find({userID: userID, compilation: compilationId, ParentID: pid, deleteInfo: null});
     if (nodes.length === 0) {
         return -1;
     }
@@ -499,7 +499,7 @@ ProjectsDAO.prototype.getFirstNodeID = async function (userID, pid) {
     }
 };
 
-ProjectsDAO.prototype.recGC = async function (userID, datas, callback) {
+ProjectsDAO.prototype.recGC = async function (userID, compilationId, datas, callback) {
     let functions = [];
     let updateDatas = [];
     for (let i = 0, len = datas.length; i < len; i++) {
@@ -521,7 +521,7 @@ ProjectsDAO.prototype.recGC = async function (userID, datas, callback) {
                         datas[i].updateData.ParentID = -1;
                     }
                 }
-                let firstNodeID = await this.getFirstNodeID(userID, projPid);
+                let firstNodeID = await this.getFirstNodeID(userID, compilationId, projPid);
                 datas[i].updateData.NextSiblingID = firstNodeID;
             }
             updateDatas.push(datas[i])

+ 3 - 1
modules/pm/routes/pm_route.js

@@ -14,7 +14,7 @@ module.exports = function (app) {
     let pmRouter = express.Router();
 
     pmRouter.use(function (req, res, next) {
-        if (/\/getNewProjectID/.test(req.originalUrl) || pmController.checkRight(req, res)) {
+        if (/\/getNewProjectID/.test(req.originalUrl)||/\/importProject/.test(req.originalUrl) || pmController.checkRight(req, res)) {
             next();
         } else {
             res.json({error: 1, message: '对不起,您无权限操作。', data: null});
@@ -61,6 +61,8 @@ module.exports = function (app) {
     pmRouter.post('/share', pmController.share);
     pmRouter.post('/receiveProjects', pmController.receiveProjects);
     pmRouter.post('/changeFile', pmController.changeFile);
+    pmRouter.post('/exportProject', pmController.exportProject);
+    pmRouter.post('/importProject', pmController.importProject);
 
     app.use('/pm/api', pmRouter);
 };

+ 42 - 11
modules/reports/controllers/rpt_controller.js

@@ -335,6 +335,13 @@ function getMultiRptsCommon(user_id, prj_id, rpt_ids, pageSize, orientation, cus
     rptTplFacade.getRptTemplates(rpt_ids).then(function(rptTpls) {
         let rptDataUtil = new rptDataExtractor();
         let filters = [];
+        if (rptTpls.length > 1) {
+            rptTpls.sort(function (item1, item2){
+                let i1 = (item1._doc)?item1._doc:item1, i2 = (item2._doc)?item2._doc:item2;
+                let ID1 = rpt_ids.indexOf(i1[JV.PROP_ID]), ID2 = rpt_ids.indexOf(i2[JV.PROP_ID]);
+                return ID1 - ID2;
+            });
+        }
         for (let rptTpl of rptTpls) {
             rptDataUtil.initialize((rptTpl._doc)?rptTpl._doc:rptTpl);
             let filter = rptDataUtil.getDataRequestFilter();
@@ -420,6 +427,7 @@ function getMultiRptsCommon(user_id, prj_id, rpt_ids, pageSize, orientation, cus
 function getBillsSummaryReportPages(user_id, prjIds, rpt_id, pageSize, orientation, customizeCfg, option, outputType, cb) {
     let rptTpl = null;
     rptTplDataFacade.getBudgetSummayDatas(prjIds).then(function(summaryRawDataRst) {
+        // console.log(summaryRawDataRst);
         rptTplFacade.getRptTemplate(rpt_id).then(function(rptTpl) {
             let rptDataUtil = new rptDataExtractor();
             rptDataUtil.initialize((rptTpl._doc)?rptTpl._doc:rptTpl);
@@ -627,24 +635,40 @@ module.exports = {
         })
     },
     getMultiReportsEx: function (req, res) {
-        //原则说明:把所有报表模板集中获取,统一filter,只读一次数据!(有空再整)
+        //原则说明:把所有报表模板集中获取,统一filter,只读一次数据!
         let params = JSON.parse(req.body.params),
             prj_id = params.prj_id,
-            rpt_ids = params.rpt_ids.split(','),
+            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,
+            //------------
             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;
-        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{
-                callback(req, res, err, rptPageRstArray);
-            }
-        });
+        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) {
+                    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) {
+                            callback(req, res, err, rptSumPageRstArray.concat(rptPageRstArray));
+                        });
+                    } else {
+                        callback(req, res, err, rptPageRstArray);
+                    }
+                }
+            });
+        } 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) {
+                callback(req, res, err, rptSumPageRstArray);
+            });
+        }
     },
 
     getBillSummaryReportPages: function (req, res) {
@@ -762,6 +786,7 @@ module.exports = {
         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){
+                    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)) {
@@ -872,7 +897,7 @@ module.exports = {
             });
         };
         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) {
+            getMultiRptsCommon(user_id, prj_id, rpt_ids, pageSize, orientation, customizeCfg, dftOption, JV.OUTPUT_TYPE_NORMAL, function (err, rptPageRstArray) {
                 if (err) {
                     console.log('导出Excel错误(生成数据过程错误), userId: ' + user_id + ', prjId' + prj_id);
                     callback(req, res, '数据生成错误', null);
@@ -1050,6 +1075,7 @@ module.exports = {
             option = params.option;
         let user_id = req.session.sessionUser.id;
         let dftOption = option||JV.PAGING_OPTION_NORMAL;
+        console.log('start!');
         let pri_Add_Parallel_Functions = function (parallelFunctions, rptPageRstArray, paraRptNames, err) {
             for (let idx = 0; idx < rptPageRstArray.length; idx++) {
                 parallelFunctions.push((function (pageRst, rpt_name) {
@@ -1074,19 +1100,23 @@ module.exports = {
             });
         };
         if (rpt_ids && rpt_ids.length > 0) {
+            console.log(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)) {
+                        console.log(1);
                         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 = [];
+                            console.log(2);
                             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 {
+                        console.log(3);
                         let parallelFunctions = [];
                         pri_Add_Parallel_Functions(parallelFunctions, rptPageRstArray, rpt_names, err);
                         pri_Run_Parallel_Functions(parallelFunctions);
@@ -1094,6 +1124,7 @@ module.exports = {
                 }
             });
         } else if ((rpt_bill_tpl_ids && rpt_bill_tpl_ids.length > 0) || (rpt_glj_tpl_ids && rpt_glj_tpl_ids.length > 0)) {
+            console.log(10);
             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);

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

@@ -26,7 +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.post('/getMultiReports', reportController.getMultiReportsEx);
     rptRouter.post('/createExcelFiles', reportController.createExcelFilesEx);
     rptRouter.post('/createExcelFilesInOneBook', reportController.createExcelFilesInOneBookEx);
     rptRouter.post('/createPdfFiles', reportController.createPdfFilesEx);

+ 1 - 0
modules/reports/rpt_component/helper/jpc_helper_cross_tab.js

@@ -232,6 +232,7 @@ function getMaxTabCntPerPage(rptTpl, tabNodeName, tabMeasurePropName, measureFor
         }
         rst = Math.floor(measureForCal / maxFieldMeasure);
     }
+    if (rst <= 0) rst = 1;
     return rst;
 };
 

+ 5 - 0
modules/reports/rpt_component/helper/jpc_helper_field.js

@@ -1,4 +1,5 @@
 let JV = require('../jpc_value_define');
+let strUtil = require("../../../../public/stringUtil");
 
 let JpcFieldHelper = {
     getValue: function(dataField, valueIdx) {
@@ -45,6 +46,10 @@ let JpcFieldHelper = {
             }
             map_field[JV.PROP_FORMAT] = tab_field[JV.PROP_FORMAT]; //这里顺手把format也赋给map_field,后期统计用得着
             rst = true;
+        } else if (tab_field[JV.PROP_FORMAT] && tab_field[JV.PROP_FORMAT].indexOf("#") >= 0 && (customizeCfg && customizeCfg.fillZero)) {
+            tab_field[JV.PROP_FORMAT] = strUtil.replaceAll(tab_field[JV.PROP_FORMAT], '#', '0');
+            map_field[JV.PROP_FORMAT] = tab_field[JV.PROP_FORMAT];
+            rst = true;
         }
         return rst;
     },

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

@@ -444,7 +444,7 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj, ap
     };
     let private_getSharedStrIdx = function(val) {
         let strVal = val;
-        if (val === null) {
+        if (val === null || val === undefined || (typeof val === 'number' && isNaN(val))) {
             strVal = "";
         }
         let rst = sharedStrList.indexOf(strVal);
@@ -749,6 +749,7 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj, ap
                     let valIdx = private_getSharedStrIdx(theShtData.cells[cIdx][JV.PROP_VALUE]);
                     cellObj.v = valIdx;
                 }
+
                 rowIdx2 = theYPos.indexOf(theShtData.cells[cIdx][JV.PROP_AREA][JV.PROP_BOTTOM]);
                 colIdx2 = xPos.indexOf(theShtData.cells[cIdx][JV.PROP_AREA][JV.PROP_RIGHT]);
                 if ((rowIdx2 - rowIdx1 > 1) || (colIdx2 - colIdx1 > 1)) {

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

@@ -31,19 +31,21 @@ let demoRptIds = [];
 // demoRptIds.push(38); //5.2.2表
 // demoRptIds.push(6); //封面
 // demoRptIds.push(22); //03
+// demoRptIds.push(23); //04 综合费率表
+// demoRptIds.push(24); //05 预算
+// demoRptIds.push(25); //06
 // demoRptIds.push(26); //07
-// demoRptIds.push(28); //09
 // demoRptIds.push(27); //08
-// demoRptIds.push(24); //05
+// demoRptIds.push(28); //09
 // demoRptIds.push(20); //01
-// demoRptIds.push(23); //04 综合费率表
 // demoRptIds.push(56); //24
 // 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
+// demoRptIds.push(57); //01
+// demoRptIds.push(58); //03
+// demoRptIds.push(59); //04
+demoRptIds.push(65); //05 工程量清单
 
 let pagesize = "A4";
 
@@ -59,7 +61,7 @@ let demoPrjId = - 1;
 // demoPrjId = 455; //PROD:
 // demoPrjId = 618; //PROD:
 // demoPrjId = 815; //PROD:
-demoPrjId = 1510; //UAT:
+demoPrjId = 552; //UAT:
 //*/
 let userId_Dft = userId_Leng;
 // let userId_Dft = "5a025c4c15074d134c2b9689";

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

@@ -47,7 +47,8 @@ let demoPrjId = - 1;
 // let demoRptId = 68; //01-2
 // let demoRptId = 71; //21-2
 // let demoRptId = 74; //22
-let demoRptId = 83; //02
+let demoRptId = 83; //02 预算
+// let demoRptId = 84; //02 清单
 
 let pagesize = "A4";
 //288: 11-2表(新)
@@ -70,8 +71,9 @@ let userId_Leng = "5c3ffa9aa0a92732f41216e0"; //小冷User Id (养护的)
 // demoPrjId = 618; //PROD:
 // demoPrjId = 2580; //PROD:
 // demoPrjId = 815; //PROD:
-// demoPrjId = 499; //UAT:
-demoPrjId = 738; //UAT:
+demoPrjId = 3261; //UAT:
+// demoPrjId = 738; //UAT:
+// demoPrjId = 670; //UAT: 清单项目
 //*/
 let userId_Dft = userId_Leng;
 // userId_Dft = '5c641205950967000d20d35b'; //临时用
@@ -112,9 +114,9 @@ test('测试 - 测试模板啦: ', function (t) {
                 try {
                     let dt = new Date();
                     console.log('取完项目数据时间:' + (dt));
-                    // fsUtil.writeObjToFile(rawDataObj, "D:/GitHome/YangHuCost/tmp/rptTplRawDataObject_测试模板.jsp");
+                    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(rawDataObj, "D:/GitHome/YangHuCost/tmp/rptTplRawDataAfterCacl_测试模板.jsp");
                     // fsUtil.writeObjToFile(tplData, "D:/GitHome/YangHuCost/tmp/rptTplAssembledData_测试模板.jsp");
                     //it's time to build the report!!!
                     let printCom = JpcEx.createNew();
@@ -134,9 +136,9 @@ 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");
-                        // rpt_xl_util.exportExcel(pageRst, pagesize, "local_test_rpt_excel", true, null, null, function(uuidName){
-                        //     console.log("excel uuid: " + uuidName);
-                        // });
+                        rpt_xl_util.exportExcel(pageRst, pagesize, "local_test_rpt_excel", true, null, null, function(uuidName){
+                            console.log("excel uuid: " + uuidName);
+                        });
                         // rpt_pdf_util.export_pdf_file(pageRst, pagesize, 'local_test_rpt_pdf', function(uuidName){
                         //     console.log("pdf uuid: " + uuidName);
                         // });

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

@@ -14,14 +14,15 @@ let dbm = require("../../../config/db/db_manager");
 let rpt_cfg = require('./rpt_cfg');
 dbm.connect(process.env.NODE_ENV);
 
-let demoPrjs = [1510, 1511]; //
+let demoPrjs = [548,561]; //
 // let demoRptId = 68; //01-2
-let demoRptId = 72; //01-1
+let demoRptId = 79; //01-1
 // let demoRptId = 73; //02-2
 let pagesize = "A4";
-let userId_Leng = "5c3ffa9aa0a92732f41216e0"; //小冷User Id (养护的)
+// let userId_Leng = "5c3ffa9aa0a92732f41216e0"; //小冷User Id (养护的)
 // let userId_me = "5b6a60b1c4ba33000dd417c0"; //我的
-let userId_Dft = userId_Leng;
+// let userId_Dft = userId_Leng;
+let userId_Dft = "5c49353e9bda24000b44414e"; //曾沛文的ID
 
 //统一引用models
 fileUtils.getGlobbedFiles('../../../modules/all_models/*.js').forEach(function(modelPath) {
@@ -52,7 +53,7 @@ test('测试 - 测试清单汇总: ', function (t) {
         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_1)原始数据.jsp");
                 let rptDataUtil = new rptDataExtractor();
                 rptDataUtil.initialize(rptTpl._doc);
                 let tplData = rptDataUtil.assembleData(summaryRst);

+ 12 - 1
web/building_saas/js/global.js

@@ -145,4 +145,15 @@ function getFeeIndex(fees) {
 function replaceAll(FindText, RepText,str) {
     let regExp = new RegExp(FindText, "g");
     return str.replace(regExp, RepText);
-};
+};
+
+function setTimeoutSync(handle, time) {
+    return new Promise(function(resolve, reject) {
+        setTimeout(function () {
+            if (handle && typeof handle === 'function') {
+                handle();
+            }
+            resolve();
+        }, time);
+    });
+}

+ 3 - 3
web/building_saas/main/js/views/material_calc_view.js

@@ -25,7 +25,7 @@ materialCalcObj = {
         ],
         view: {
             lockColumns: ["code","name","marketPrice",'offSiteTransportLoss','purchaseStorage'],
-            colHeaderHeight:45
+            colHeaderHeight:36
         }
     },
     freightSpread:null,
@@ -47,7 +47,7 @@ materialCalcObj = {
         ],
         view: {
             lockColumns: ["exp"],
-            colHeaderHeight:45
+            colHeaderHeight:36
         },
         getText:{
             forExp:function (item) {
@@ -68,7 +68,7 @@ materialCalcObj = {
         ],
         view: {
             lockColumns: [],
-            colHeaderHeight:45
+            colHeaderHeight:36
         }
     },
     initMaterialSpread:function () {

+ 1 - 1
web/building_saas/main/js/views/project_glj_view.js

@@ -77,7 +77,7 @@ projectGljObject={
         this.projectGljSheet.bind(GC.Spread.Sheets.Events.EditStarting,this.onProjectGljEditStarting);
         this.projectGljSheet.bind(GC.Spread.Sheets.Events.CellDoubleClick, this.onProjectGljDoubleClick);
         this.projectGljSheet.name('projectGljSheet');
-        this.projectGljSheet.setRowHeight(0, 45, 1);
+        this.projectGljSheet.setRowHeight(0, 36, 1);
     },
     initMixRatio:function () {
         let me = projectGljObject;

+ 50 - 0
web/building_saas/pm/html/project-management.html

@@ -645,8 +645,58 @@
         </div>
     </div>
 </div>
+
+<!--弹出 导出-->
+<div class="modal fade" id="export" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">导出文件</h5>
+              <!--  <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>-->
+            </div>
+            <div class="modal-body">
+                <!--正在生成-->
+                <h5 class="my-3">正在生成文件</h5>
+                <div class="progress mb-3">
+                    <div id="export_progress_bar" class="progress-bar progress-bar-striped progress-bar-animated" role="progressbar" aria-valuenow="75" aria-valuemin="0" aria-valuemax="100" style="width: 10%"></div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!--弹出 导出-->
+<div class="modal fade" id="import" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">导入建设项目</h5><button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                <span aria-hidden="true">&times;</span>
+            </button>
+            </div>
+            <div class="modal-body">
+                <form>
+                    <div class="form-group">
+                        <label>请选择ybp格式文件</label>
+                        <input class="form-control-file" type="file" accept=".ybp" name="import_project_data"/>
+                    </div>
+                </form>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-primary" id="confirm-import">确定导入</button>
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+            </div>
+        </div>
+    </div>
+</div>
+
+
+
 <!-- JS. -->
 <script src = "/lib/spreadjs/sheets/gc.spread.sheets.all.11.1.2.min.js"></script>
+<script src = "/lib/fileSaver/FileSaver.min.js"></script>
 <script>GC.Spread.Sheets.LicenseKey = '<%- LicenseKey %>';</script>
 <!-- inject:js -->
 <script src="/web/building_saas/js/global.js"></script>

+ 127 - 1
web/building_saas/pm/js/pm_newMain.js

@@ -338,6 +338,38 @@ const projTreeObj = {
                 //获取当前节点的建设项目ID
                 projTreeObj.refreshProjectData();
             }
+        },
+        exportProject: {
+            name: "导出建设项目",
+            icon: 'fa-external-link',
+            disabled: function () {
+                let selectedItem = projTreeObj.tree.selected;
+                return !(selectedItem && selectedItem.data.projType === projectType.project);
+            },
+            visible:function () {
+                return false
+            },
+            callback: function (key, opt) {
+                //获取当前节点的建设项目ID
+                projTreeObj.exportProject(projTreeObj.tree.selected.data.ID,projTreeObj.tree.selected.data.name);
+            }
+        },
+        improtProject:{
+            name: "导入建设项目",
+            icon: 'fa-external-link',
+            disabled: function () {
+                let selectedItem = projTreeObj.tree.selected;
+                return !(selectedItem && selectedItem.data.projType === projectType.project);
+            },
+            visible:function () {
+              return false
+            },
+            callback: function (key, opt) {
+                //获取当前节点的建设项目ID
+                $("#import").modal('show');
+
+               // projTreeObj.exportProject(projTreeObj.tree.selected.data.ID);
+            }
         }
     },
     //全部-开始(新建)按钮弹出菜单(新建单位工程)
@@ -367,7 +399,9 @@ const projTreeObj = {
                 "share": me.contextMenuItems.share,
                 "spr3": '--------',
                 "manageFiles": me.contextMenuItems.manageFiles,
-                "refreshSummary": me.contextMenuItems.refreshSummary
+                "refreshSummary": me.contextMenuItems.refreshSummary,
+                "exportProject":me.contextMenuItems.exportProject,
+                "importProject":me.contextMenuItems.improtProject
             }
         });
     },
@@ -1438,6 +1472,62 @@ const projTreeObj = {
     refreshWhenFileDateChange:function(projectID){//当单价文件、费率文件被修改后,刷新页面,共用的项目提示刷新图标
         //在一次的修改中,同一个建设下,单价文件、费率文件才有共用的情况,而refreshProjectData是传入单位工程ID,刷新整个建设项目,所以,只要传入修改的单位工程ID,刷新建设项目即可
         this.refreshProjectData(projectID);
+    },
+     exportProject:async function(projectID,projectName){
+        $("#export_progress_bar").css('width','0%');
+        $("#export").modal('show');
+        let spString = "|----|";
+        try {
+            let sumString = "";
+            let result = await getProjectInfo({projectID:projectID,type:"main",user_id: userID});
+            $("#export_progress_bar").css('width','10%');
+            let result_arr = result.split(spString);
+            sumString = result_arr[0];
+            if(result_arr.length == 2){
+                let tenders = JSON.parse(result_arr[1]);
+                let each = 100;
+                let width = 10;
+                if(tenders.length > 0) each = 90/tenders.length;
+                for(let t of tenders){
+                    let tenderString = await getProjectInfo({projectID:t,rootProjectID:projectID,type:"sub",user_id: userID});
+                    width += each;
+                    $("#export_progress_bar").css('width',width+'%');
+                    await  setTimeoutSync(null,500);//设置间隔
+                    sumString = sumString + spString +tenderString;
+                    console.log(JSON.parse(tenderString));
+                }
+
+            }
+            $("#export_progress_bar").css('width','100%');
+            $("#export").modal('hide');
+          //  console.log(JSON.parse(sumString));
+
+            saveProjectFile(sumString);
+
+        }catch (e){
+            console.log(e)
+        }
+
+
+        async function getProjectInfo(data) {
+            let result = await ajaxPost("/pm/api/exportProject",data);
+            return result;
+           // let blob = new Blob([result], {type: 'text/plain;charset=utf-8'});
+           // saveAs(blob, 'textName.ybp');
+        }
+
+        function saveProjectFile(data) {
+            let blob = new Blob([data], {type: 'text/plain;charset=utf-8'});
+            saveAs(blob, projectName+'.ybp');
+        }
+
+       /* setTimeout(function(){
+            $("#progressbar").css('width','50%');
+            setTimeout(function(){
+                $("#export").modal('hide');
+            },1000)
+            //$("#export").modal('hide');
+        },1000)*/
     }
 };
 
@@ -3494,6 +3584,42 @@ $('#shareToConfirm').click(function () {
     updateShareInfo(selected);
 });
 
+
+$("#confirm-import").click(function() {
+    //$.bootstrapLoading.start();
+    const self = $(this);
+    try {
+        let formData = new FormData();
+        let file = $("input[name='import_project_data']")[0];
+        if (file.files.length <= 0) {
+            throw '请选择文件!';
+        }
+        formData.append('file', file.files[0]);
+        formData.append('userID', userID);
+        $.ajax({
+            url: '/pm/api/importProject',
+            type: 'POST',
+            data: formData,
+            cache: false,
+            contentType: false,
+            processData: false,
+            beforeSend: function() {
+                self.attr('disabled', 'disabled');
+                self.text('上传中...');
+            },
+            success: function(response){
+
+            },
+            error: function(){
+
+            }
+        });
+    } catch(error) {
+        alert(error);
+        $.bootstrapLoading.end();
+    }
+});
+
 //设置分享给界面数据
 //@param {Object}selected @return {void}
 function setShareToModal(selected){

+ 4 - 1
web/building_saas/pm/js/pm_tree.js

@@ -272,7 +272,10 @@ const pmTree = {
                     }
                     that.maxNodeId(node.id());
                     if(parent.childIndex(node) === -1){
-                        if(pre && parent.childIndex(pre) !== -1){
+                        if (!pre) {
+                            parent.children.unshift(node);
+                        }
+                        else if(pre && parent.childIndex(pre) !== -1){
                             parent.children.splice(parent.childIndex(pre) + 1, 0, node);
                         }
                         else if(next && parent.childIndex(next) !== -1){

+ 237 - 278
web/building_saas/report/js/rpt_main.js

@@ -8,6 +8,8 @@ const NEXT_PAGE_OFFSET = 160;
 const FIRST_PAGE_OFFSET = 50;
 const LAST_PAGE_OFFSET = 60;
 
+const WAIT_TIME_EXPORT = 12000;
+
 let fontSuffixMapObj = {"表标题": "title", "列标题": "column", "正文内容": "content", "合计": "summary", "表眉/表脚": "header_footer"};
 
 let rptTplObj = {
@@ -17,6 +19,7 @@ let rptTplObj = {
         if (!me.hasInitialized) {
             zTreeOprObj.getCustomerCfg();
             zTreeOprObj.getReportTemplateTree();
+            zTreeOprObj.selectedPrjIDs = [];
             me.hasInitialized = true;
             let canvas = document.getElementById("rptCanvas");
             canvas.onclick = canvasOprObj.canvasOnClick;
@@ -35,6 +38,7 @@ let zTreeOprObj = {
     defReportPageCfg: null,
     currentPage: 1,
     maxPages: 0,
+    selectedPrjIDs: [],
     countChkedRptTpl: function () {
         let me = zTreeOprObj;
         if (me.treeObj) {
@@ -229,7 +233,7 @@ let zTreeOprObj = {
                 params.rpt_tpl_id = treeNode.refId;
                 params.prj_id = projectObj.project.projectInfo.ID;
                 params.custCfg = me.reportPageCfg;
-                me.requestReport(params);
+                me.requestNormalReport(params);
             }
             me.countChkedRptTpl();
         }
@@ -253,13 +257,70 @@ let zTreeOprObj = {
     },
     changeCfg: function() {
         let me = zTreeOprObj;
-        let params = {};
-        params.pageSize = rptControlObj.getCurrentPageSize();
-        params.orientation = rptControlObj.getCurrentOrientation();
-        params.rpt_tpl_id = me.currentNode.refId;
-        params.prj_id = projectObj.project.projectInfo.ID;
-        params.custCfg = me.reportPageCfg;
-        me.requestReport(params);
+
+        if (me.currentNode) {
+            if (me.currentNode.hasOwnProperty('flags') && me.currentNode.flags.hasOwnProperty('reportType') && me.currentNode['flags']['reportType'] !== 'NA') {
+                let refRptTplIds = [], refBillSumPrjsIds = [], refGljSumPrjsIds = [];
+                if (me.currentNode['flags']['reportType'] === 'billSummary') {
+                    refBillSumPrjsIds.push(me.currentNode.refId);
+                } else if (me.currentNode['flags']['reportType'] === 'gljSummary') {
+                    refGljSumPrjsIds.push(me.currentNode.refId);
+                }
+                if (zTreeOprObj.selectedPrjIDs.length > 0) {
+                    let params = rptControlObj.creatCommonExportParam(refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds);
+                    params.pageSize = rptControlObj.getCurrentPageSize();
+                    params.orientation = rptControlObj.getCurrentOrientation();
+                    params.rpt_ids = refRptTplIds;
+                    params.rpt_bill_tpl_ids = refBillSumPrjsIds;
+                    params.rpt_glj_tpl_ids = refGljSumPrjsIds;
+                    params.custCfg = me.reportPageCfg;
+                    CommonAjax.postEx("report_api/getMultiReports", params, 10000, true,
+                        function(result){
+                            hintBox.unWaitBox();
+                            let pageRst = result[0];
+                            let canvas = document.getElementById("rptCanvas");
+                            if (pageRst && pageRst.items && pageRst.items.length > 0) {
+                                me.resetAfter(pageRst);
+                                me.currentRptPageRst = pageRst;
+                                me.maxPages = pageRst.items.length;
+                                me.currentPage = 1;
+                                me.displayPageValue();
+                                let size = JpcCanvasOutput.getReportSizeInPixel(me.currentRptPageRst, getScreenDPI());
+                                canvas.width = size[0] + 20;
+                                if (size[1] > size[0]) {
+                                    canvas.height = size[1] + 100;
+                                } else {
+                                    canvas.height = size[1] + 50;
+                                }
+                                me.showPage(1, canvas);
+                            } else {
+                                //返回了无数据表
+                                JpcCanvasOutput.cleanCanvas(canvas);
+                                JpcCanvasOutput.drawPageBorder(me.currentRptPageRst, canvas, getScreenDPI());
+                            }
+                        }, function(err){
+                            hintBox.unWaitBox();
+                        }, function(ex){
+                            hintBox.unWaitBox();
+                        }
+                    );
+                } else {
+                    if (me.currentNode['flags']['reportType'] === 'billSummary') {
+                        me.requestPrjFolderForBillsSummary();
+                    } else if (me.currentNode['flags']['reportType'] === 'gljSummary') {
+                        me.requestPrjFolderForGljSummary();
+                    }
+                }
+            } else {
+                let params = {};
+                params.pageSize = rptControlObj.getCurrentPageSize();
+                params.orientation = rptControlObj.getCurrentOrientation();
+                params.rpt_tpl_id = me.currentNode.refId;
+                params.prj_id = projectObj.project.projectInfo.ID;
+                params.custCfg = me.reportPageCfg;
+                me.requestNormalReport(params);
+            }
+        }
     },
     resetAfter: function (pageRst) {
         let size = pageRst[JV.NODE_PAGE_INFO][JV.NODE_PAGE_SIZE].slice(0);
@@ -271,7 +332,7 @@ let zTreeOprObj = {
             document.getElementById("hrefRptOrientation").innerHTML = "横向";
         }
     },
-    requestReport: function (params) {
+    requestNormalReport: function (params) {
         let me = zTreeOprObj;
         hintBox.waitBox();
         CommonAjax.postEx("report_api/getReport", params, 60000, true,
@@ -367,8 +428,10 @@ let zTreeOprObj = {
             params.rpt_tpl_id = me.currentNode.refId;
             params.custCfg = me.reportPageCfg;
             params.prjIds = [];
+            me.selectedPrjIDs = [];
             for (let node of nodes) {
                 params.prjIds.push(node.ID);
+                me.selectedPrjIDs.push(node.ID);
             }
             CommonAjax.postEx("report_api/getBillsSummaryReport", params, 26000, true,
                 function(result){
@@ -412,8 +475,10 @@ let zTreeOprObj = {
             params.rpt_tpl_id = me.currentNode.refId;
             params.custCfg = me.reportPageCfg;
             params.prjIds = [];
+            zTreeOprObj.selectedPrjIDs = [];
             for (let node of nodes) {
                 params.prjIds.push(node.ID);
+                zTreeOprObj.selectedPrjIDs.push(node.ID);
             }
             CommonAjax.postEx("report_api/getGljSummaryReport", params, 26000, true,
                 function(result){
@@ -448,41 +513,15 @@ 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);
-        }
+        rptControlObj.getTplIdsCommon(refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds, rpt_names, bill_rpt_names, glj_rpt_names);
+        let params = rptControlObj.creatCommonExportParam(refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds);
         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){
+
+        CommonAjax.postEx("report_api/createPdfFiles", params, WAIT_TIME_EXPORT, true, function(result){
                 if (result) {
                     let uuIdUrls = [];
                     for (let uuIdObj of result) {
@@ -497,41 +536,15 @@ let zTreeOprObj = {
         );
     },
     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);
-        }
+        rptControlObj.getTplIdsCommon(refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds, rpt_names, bill_rpt_names, glj_rpt_names);
+        let params = rptControlObj.creatCommonExportParam(refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds);
         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){
+
+        CommonAjax.postEx("report_api/createExcelFiles", params, WAIT_TIME_EXPORT, true, function(result){
                 if (result) {
                     let uuIdUrls = [];
                     for (let uuIdObj of result) {
@@ -546,36 +559,13 @@ let zTreeOprObj = {
         );
     },
     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);
-        }
+        rptControlObj.getTplIdsCommon(refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds, null, null, null);
+        let params = rptControlObj.creatCommonExportParam(refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds);
         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){
+
+        CommonAjax.postEx("report_api/createExcelFilesInOneBook", params, WAIT_TIME_EXPORT, true, function(result){
                 if (result) {
                     let uuIdUrls = [];
                     let uuIdUrl =  "/report_api/getFileByUUID/" + result.uuid + "/" + stringUtil.replaceAll(result.reportName, "#", "_") + "/xlsx";
@@ -682,68 +672,55 @@ let rptControlObj = {
             //other types if needed.
         }
     },
-    getAllInOneBook_bk: function () {
-        if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) {
-            let me = rptControlObj;
-            let orgRptName = projectObj.project.projectInfo.name;
-            let refRptTplIds = [];
-            for (let node of zTreeOprObj.checkedRptTplNodes) {
+    getTplIdsCommon: function (refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds, rpt_names, bill_rpt_names, glj_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);
+                    if (bill_rpt_names) bill_rpt_names.push(node.name);
+                } else if (node['flags']['reportType'] === 'gljSummary') {
+                    refGljSumPrjsIds.push(node.refId);
+                    if (glj_rpt_names) glj_rpt_names.push(node.name);
+                }
+            } else {
                 refRptTplIds.push(node.refId);
+                if (rpt_names) rpt_names.push(node.name);
             }
-            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
-            );
         }
     },
+    creatCommonExportParam: function (refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds) {
+        let nodes = (zTreeOprObj.prjFolderTreeObj === null)?[]:zTreeOprObj.prjFolderTreeObj.getCheckedNodes(true);
+        let rst = {};
+        rst.prj_id = projectObj.project.projectInfo.ID;
+        rst.rpt_ids = refRptTplIds;
+        rst.rpt_bill_tpl_ids = refBillSumPrjsIds;
+        rst.rpt_glj_tpl_ids = refGljSumPrjsIds;
+        rst.prjIds = [];
+        zTreeOprObj.selectedPrjIDs = [];
+        for (let node of nodes) {
+            rst.prjIds.push(node.ID);
+            zTreeOprObj.selectedPrjIDs.push(node.ID);
+        }
+        // rst.sum_rpt_names = bill_rpt_names.concat(glj_rpt_names);
+        // rst.rpt_names = rpt_names;
+        // rst.isOneSheet = true;
+        rst.pageSize = rptControlObj.getCurrentPageSize();
+        rst.orientation = ((zTreeOprObj.checkedRptTplNodes.length > 1)?null:rptControlObj.getCurrentOrientation());
+        rst.custCfg = zTreeOprObj.reportPageCfg;
+        rst.option = "normal";
+        return rst;
+    },
     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;
+            rptControlObj.getTplIdsCommon(refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds);
+            if (zTreeOprObj.selectedPrjIDs.length > 0 && (refBillSumPrjsIds.length > 0 || refGljSumPrjsIds.length > 0)) {
+                let params = rptControlObj.creatCommonExportParam(refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds);
                 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){
+
+                CommonAjax.postEx("report_api/createExcelFilesInOneBook", params, WAIT_TIME_EXPORT, true, function(result){
                         if (result) {
                             let uuIdUrls = [];
                             let uuIdUrl =  "/report_api/getFileByUUID/" + result.uuid + "/" + stringUtil.replaceAll(result.reportName, "#", "_") + "/xlsx";
@@ -754,76 +731,52 @@ let rptControlObj = {
                         }
                     }, null, null
                 );
+            } else {
+                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, WAIT_TIME_EXPORT, 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 = [];
-            for (let tplNode of zTreeOprObj.checkedRptTplNodes) {
-                rpt_ids.push(tplNode.refId);
-                rpt_names.push(tplNode.name)
-            }
-            let params = {};
-            params.prj_id = projectObj.project.projectInfo.ID;
-            params.rpt_ids = rpt_ids;
-            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
-            );
-        }
-    },
     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 = {};
+            let refRptTplIds = [], refBillSumPrjsIds = [], refGljSumPrjsIds = [];
+            let rpt_names = [], bill_rpt_names = [], glj_rpt_names = [];
+            rptControlObj.getTplIdsCommon(refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds, rpt_names, bill_rpt_names, glj_rpt_names);
+            if (zTreeOprObj.selectedPrjIDs.length > 0 && (glj_rpt_names.length > 0 || bill_rpt_names.length > 0)) {
+                let params = rptControlObj.creatCommonExportParam(refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds);
                 params.prj_id = projectObj.project.projectInfo.ID;
-                params.rpt_ids = refRptTplIds;
+                params.sum_rpt_names = bill_rpt_names.concat(glj_rpt_names);
                 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){
+                params.rptName = projectObj.project.projectInfo.name;
+                CommonAjax.postEx("report_api/createExcelFiles", params, WAIT_TIME_EXPORT, true, function(result){
                         if (result) {
                             let uuIdUrls = [];
                             for (let uuIdObj of result) {
@@ -836,6 +789,38 @@ let rptControlObj = {
                         }
                     }, null, null
                 );
+            } else {
+                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, WAIT_TIME_EXPORT, 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
+                    );
+                }
             }
         }
     },
@@ -857,71 +842,23 @@ let rptControlObj = {
             me.getAllIndividualExcelBook();
         }
     },
-    getPDF_bk: function() {
-        let me = rptControlObj;
-        if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) {
-            let rpt_ids = [], rpt_names = [];
-            for (let tplNode of zTreeOprObj.checkedRptTplNodes) {
-                rpt_ids.push(tplNode.refId);
-                rpt_names.push(tplNode.name)
-            }
-            let params = {};
-            params.prj_id = projectObj.project.projectInfo.ID;
-            params.rpt_ids = rpt_ids;
-            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
-            );
-        }
-    },
     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 = {};
+            let refRptTplIds = [], refBillSumPrjsIds = [], refGljSumPrjsIds = [];
+            let rpt_names = [], bill_rpt_names = [], glj_rpt_names = [];
+            rptControlObj.getTplIdsCommon(refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds, rpt_names, bill_rpt_names, glj_rpt_names);
+            if (zTreeOprObj.selectedPrjIDs.length > 0 && (glj_rpt_names.length > 0 || bill_rpt_names.length > 0)) {
+                let params = rptControlObj.creatCommonExportParam();
                 params.prj_id = projectObj.project.projectInfo.ID;
+                params.sum_rpt_names = bill_rpt_names.concat(glj_rpt_names);
                 params.rpt_ids = refRptTplIds;
+                params.rpt_bill_tpl_ids = refBillSumPrjsIds;
+                params.rpt_glj_tpl_ids = refGljSumPrjsIds;
                 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){
+                params.isOneSheet = true;
+                params.rptName = projectObj.project.projectInfo.name;
+                CommonAjax.postEx("report_api/createPdfFiles", params, WAIT_TIME_EXPORT, true, function(result){
                         if (result) {
                             let uuIdUrls = [];
                             for (let uuIdObj of result) {
@@ -934,6 +871,37 @@ let rptControlObj = {
                         }
                     }, null, null
                 );
+            } else {
+                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, WAIT_TIME_EXPORT, 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
+                    );
+                }
             }
         }
     },
@@ -1032,16 +1000,7 @@ let rptControlObj = {
         );
     },
     confirmCfgChange: function() {
-        let treeNode = zTreeOprObj.currentNode;
-        if (treeNode.nodeType === TPL_TYPE_TEMPLATE && treeNode.refId > 0) {
-            let params = {};
-            params.pageSize = rptControlObj.getCurrentPageSize();
-            params.rpt_tpl_id = treeNode.refId;
-            params.prj_id = projectObj.project.projectInfo.ID;
-            params.custCfg = zTreeOprObj.reportPageCfg;
-            zTreeOprObj.requestReport(params);
-        }
-
+        zTreeOprObj.changeCfg();
     }
 };
 

+ 6 - 10
web/building_saas/report/js/rpt_print.js

@@ -5,16 +5,12 @@
 let rptPrintHelper = {
     preview: function () {
         if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) {
-            let rptIds = [];
-            let params = {};
-            params.pageSize = rptControlObj.getCurrentPageSize();
-            params.orientation = ((zTreeOprObj.checkedRptTplNodes.length > 1)?null:rptControlObj.getCurrentOrientation());
-            params.custCfg = zTreeOprObj.reportPageCfg;
-            params.prj_id = projectObj.project.projectInfo.ID;
-            for (let tplNode of zTreeOprObj.checkedRptTplNodes) {
-                rptIds.push(tplNode.refId);
-            }
-            params.rpt_ids = rptIds.join(",");
+            let refRptTplIds = [], refBillSumPrjsIds = [], refGljSumPrjsIds = [];
+            rptControlObj.getTplIdsCommon(refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds, null, null, null);
+            let params = rptControlObj.creatCommonExportParam(refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds);
+            params.rpt_ids = refRptTplIds;
+            params.rpt_bill_tpl_ids = refBillSumPrjsIds;
+            params.rpt_glj_tpl_ids = refGljSumPrjsIds;
             CommonAjax.postEx("report_api/getMultiReports", params, 10000, true,
                 function(result){
                     //sessionStorage.currentPageData = JSON.stringify(zTreeOprObj.currentRptPageRst);