TonyKang 4 лет назад
Родитель
Сommit
f9bc14b90d

+ 7 - 0
modules/pm/controllers/pm_controller.js

@@ -86,6 +86,13 @@ module.exports = {
             }
         });
     },
+    getAllUnitProjects: async function (req, res) {
+        const rootProjectID = JSON.parse(req.body.data).rootProjectID;
+        await ProjectsData.getAllUnitProjects(req.session.sessionUser.id, req.session.sessionCompilation._id, rootProjectID, function (err, message, data) {
+            console.log(err);
+            callback(req, res, err, message, data);
+        });
+    },
     updateProjects: async function (req, res) {
         let data = JSON.parse(req.body.data);
         try {

+ 44 - 0
modules/pm/models/project_model.js

@@ -58,6 +58,50 @@ const uuidV1 = require('uuid/v1');
 function ProjectsDAO() {
 }
 
+ProjectsDAO.prototype.getAllUnitProjects = async function (userId, compilation, rootPrjID, callback) {
+    //根据root project id获取所有的非删除单位工程
+    try {//
+        let projects = await Projects.find({
+            '$or': [
+                {
+                'userID': userId,
+                'compilation': compilation,
+                'property.rootProjectID': rootPrjID,
+                'deleteInfo': null
+                }, 
+                {
+                    'userID': userId, 
+                    'compilation': compilation, 
+                    'property.rootProjectID': rootPrjID,
+                    'deleteInfo.deleted': {'$in': [null, false]}
+                }
+            ]
+        }, '-_id', {lean: true});
+        let projIDs= [];
+        const allIDs = [];
+        for(let project of projects){
+            allIDs.push(project.ID);
+            if(project.projType === projectType.project){
+                projIDs.push(project.ID);
+            }
+        }
+        // 设置分享信息 
+        const shareMap = await pmFacade.getShareInfoMap(allIDs);
+        projects.forEach(project => {
+            project.shareInfo = shareMap[project.ID] || [];
+        });
+        // 当前费用定额未读的分享的条目数量
+        
+        // 设置汇总字段
+        let summaryInfo = await pmFacade.getSummaryInfo(projIDs);
+        pmFacade.setupSummaryFields(summaryInfo, projects);
+        callback(0, '', projects);
+    }
+    catch (err) {
+        callback(1, 'Error', null);
+    }
+}
+
 ProjectsDAO.prototype.getUserProjects = async function (userId, compilation, callback) {
     try {//
         let projects = await Projects.find({

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

@@ -29,6 +29,7 @@ module.exports = function (app) {
     pmRouter.post('/prepareInitialData', pmController.prepareInitialData);
 
     pmRouter.post('/getProjects', pmController.getProjects);
+    pmRouter.post('/getAllUnitProjects', pmController.getAllUnitProjects);
     pmRouter.post('/getSummaryInfo', pmController.getSummaryInfo);
 
     /*

+ 241 - 288
modules/reports/controllers/rpt_controller.js

@@ -22,6 +22,7 @@ const rpt_svg_util = require("../util/rpt_svg_util");
 const fs = require("fs");
 const strUtil = require("../../../public/stringUtil");
 const rptDataExtractor = require("../util/rpt_yanghu_data_util");
+const { output } = require("pdfkit");
 
 //统一回调函数
 let callback = function(req, res, err, data){
@@ -34,44 +35,6 @@ let callback = function(req, res, err, data){
     }
 };
 
-function getAllPagesCommonOrg(rpt_id, pageSize, option, cb) {
-    let rptTpl = null;
-    rptTplFacade.getRptTemplate(rpt_id).then(function(rst) {
-        rptTpl = rst;
-        if (rptTpl) {
-            if (rptTpl.ID_KEY) {
-                return demoTemplateFacade.getDemoData(rptTpl.ID_KEY);
-            } else {
-                //callback(req, res, 'No report template data were found!', null);
-                cb('No report template data were found!', null);
-            }
-        } else {
-            //callback(req, res, 'No report template was found!', null);
-            cb('No report template was found!', null);
-        }
-    }).then(function(tplData){
-            if (tplData) {
-                let printCom = JpcEx.createNew();
-                rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pageSize;
-                let defProperties = rptUtil.getReportDefaultCache();
-                let dftOption = option||JV.PAGING_OPTION_NORMAL;
-                printCom.initialize(rptTpl);
-                printCom.analyzeData(rptTpl, tplData, defProperties, dftOption, JV.OUTPUT_TYPE_NORMAL);
-                let maxPages = printCom.totalPages;
-                let pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties);
-                if (pageRst) {
-                    cb(null, pageRst);
-                } else {
-                    //callback(req, res, "Have errors while on going...", null);
-                    cb('Have errors while on going...', null);
-                }
-            } else {
-                //callback(req, res, 'No report data were found!', null);
-                cb('No report data were found!', null);
-            }
-        }
-    );
-}
 function setupCustomizeCfg(customizeCfg, rptTpl, defProperties) {
     let tmpObj = {};
     //1. 字体
@@ -222,118 +185,121 @@ function setupCustomizeCfg(customizeCfg, rptTpl, defProperties) {
         }
     }
 }
-function getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, customizeCfg, option, outputType, cb) {
-    let rptTpl = null;
-    rptTplFacade.getRptTemplate(rpt_id).then(function(rst) {
-        rptTpl = rst;
-        if (rptTpl) {
-            let rptDataUtil = new rptDataExtractor();
-            rptDataUtil.initialize((rptTpl._doc)?rptTpl._doc:rptTpl);
-            let summaryRst = [];
-            let filter = rptDataUtil.getDataRequestFilter(summaryRst);
-            let promiseArr = [null, null];
-            if (summaryRst.length > 0) {
-                if (summaryRst.indexOf(`Construct`) >= 0 || summaryRst.indexOf(`ConstructDetail`) >= 0) {
-                    promiseArr[0] = pm_facade.getSummaryInfoByTender(prj_id, pm_facade.projectType.project);
-                }
-                if (summaryRst.indexOf(`Segment`) >= 0 || summaryRst.indexOf(`SegmentDetail`) >= 0) {
-                    promiseArr[1] = pm_facade.getSummaryInfoByTender(prj_id, pm_facade.projectType.engineering);
+
+function _combineData(destData, srcData) {
+    // 备注:这里有一个前提条件,就是基于相同的报表模板
+    for (let idx = 0; idx < destData[JV.DATA_DISCRETE_DATA].length; idx++) {
+        destData[JV.DATA_DISCRETE_DATA][idx] = destData[JV.DATA_DISCRETE_DATA][idx].concat(srcData[JV.DATA_DISCRETE_DATA][idx]);
+    }
+    for (let idx = 0; idx < destData[JV.DATA_MASTER_DATA].length; idx++) {
+        destData[JV.DATA_MASTER_DATA][idx] = destData[JV.DATA_MASTER_DATA][idx].concat(srcData[JV.DATA_MASTER_DATA][idx]);
+    }
+    for (let idx = 0; idx < destData[JV.DATA_MASTER_DATA_EX].length; idx++) {
+        destData[JV.DATA_MASTER_DATA_EX][idx] = destData[JV.DATA_MASTER_DATA_EX][idx].concat(srcData[JV.DATA_MASTER_DATA_EX][idx]);
+    }
+    for (let idx = 0; idx < destData[JV.DATA_DETAIL_DATA].length; idx++) {
+        destData[JV.DATA_DETAIL_DATA][idx] = destData[JV.DATA_DETAIL_DATA][idx].concat(srcData[JV.DATA_DETAIL_DATA][idx]);
+    }
+    for (let idx = 0; idx < destData[JV.DATA_DETAIL_DATA_EX].length; idx++) {
+        destData[JV.DATA_DETAIL_DATA_EX][idx] = destData[JV.DATA_DETAIL_DATA_EX][idx].concat(srcData[JV.DATA_DETAIL_DATA_EX][idx]);
+    }
+}
+
+function _createPntPageData(tplData, rptTpl, params, outputType, cb) {
+    try {
+        let printCom = JpcEx.createNew();
+        if (params.pageSize) rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = params.pageSize;
+        if (params.orientation && (params.orientation !== 'null')) rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] = params.orientation;
+        let defProperties = rptUtil.getReportDefaultCache();
+        if (params.custCfg) setupCustomizeCfg(params.custCfg, rptTpl, defProperties);
+        let dftOption = params.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, params.custCfg);
+        } else {
+            pageRst = printCom.outputAsPreviewPage(rptTpl, defProperties);
+        }
+        if (pageRst) {
+            // fsUtil.writeObjToFile(pageRst, "D:/GitHome/ConstructionCost/tmp/testBuiltPageResult.jsp");
+            cb(null, pageRst);
+        } else {
+            cb('Have errors while on going...', null);
+        }
+    } catch(ex) {
+        // console.log("报表数据异常: project id: " + prj_id);
+        console.log(ex.toString());
+        cb('Exception occurs while on going...', null);
+    }
+}
+
+async function getAllPagesForOneRptCommonEx(user_id, rpt_params, outputType, cb) {
+    //prj_ids, rpt_id, pageSize, orientation, customizeCfg
+    rptTpl = await rptTplFacade.getRptTemplate(rpt_params.rpt_tpl_id);
+    if (rptTpl) {
+        let rptDataUtil = new rptDataExtractor();
+        rptDataUtil.initialize((rptTpl._doc)?rptTpl._doc:rptTpl);
+        let summaryRst = [];
+        let filter = rptDataUtil.getDataRequestFilter(summaryRst);
+        // 这里不考虑清单汇总及工料机汇总的情况了(有另外的分支处理,不会经过这里)
+        let multiRawData = await rptTplDataFacade.prepareMultiProjectData(user_id, rpt_params.prj_ids, filter);
+        try {
+            if (multiRawData.length > 0) {
+                //考虑到工料机的数据还需要再计算,所以还不能直接用,需要每个工程都处理一遍后,再合并
+                let tplData = rptDataUtil.assembleData(multiRawData[0]);
+                for (let idx = 1; idx < multiRawData.length; idx++) {
+                    let tmpData = rptDataUtil.assembleData(multiRawData[idx]);
+                    _combineData(tplData, tmpData);
                 }
+                _createPntPageData(tplData, rptTpl, rpt_params, outputType, cb);
+            } else {
+                cb('Have errors while on going...', null);
             }
-            rptTplDataFacade.prepareProjectData(user_id, prj_id, filter, function (err, msg, rawDataObj) {
-                if (!err) {
-                    let buildPageData = function() {
-                        try {
-                            // fsUtil.writeObjToFile(rawDataObj, `D:/GitHome/YangHuCost/tmp/rawDataObj_${(new Date).getTime()}.jsp`);
-                            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;
-                            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);
-                            }
-                            if (pageRst) {
-                                // fsUtil.writeObjToFile(pageRst, `D:/GitHome/ConstructionCost/tmp/testBuiltPageResult_${(new Date).getTime()}.jsp`);
-                                cb(null, pageRst);
-                            } else {
-                                cb('Have errors while on going...', null);
-                            }
-                        } catch (ex) {
-                            console.log("报表数据异常: userId " + user_id + ", project id: " + prj_id);
-                            console.log(ex.message);
-                            cb('Exception occurs while on going...', null);
-                        }
-                    };
-                    //*/
-                    //取汇总数据流程
-                    if (promiseArr[0] !== null) {
-                        promiseArr[0].then(function (rst) {
-                            rawDataObj.Construct = rst.parent;
-                            rawDataObj.ConstructDetail = rst.subList;
-                            if (promiseArr[1] !== null) {
-                                promiseArr[1].then(function (rst) {
-                                    rawDataObj.Segment = rst.parent;
-                                    rawDataObj.SegmentDetail = rst.subList;
-                                    buildPageData(rawDataObj, rptDataUtil, rptTpl);
-                                });
-                            } else {
-                                buildPageData(rawDataObj, rptDataUtil, rptTpl);
-                            }
-                        });
-                    } else  if (promiseArr[1] !== null) {
-                        promiseArr[1].then(function (rst) {
-                            rawDataObj.Segment = rst.parent;
-                            rawDataObj.SegmentDetail = rst.subList;
-                            buildPageData(rawDataObj, rptDataUtil, rptTpl);
-                        });
-                    } else {
-                        buildPageData(rawDataObj, rptDataUtil, rptTpl);
-                    }
-                    /*/
-                    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);
-                    let dftOption = option||JV.PAGING_OPTION_NORMAL;
-                    printCom.initialize(rptTpl);
-                    printCom.analyzeData(rptTpl, tplData, defProperties, dftOption, outputType);
-                    let maxPages = printCom.totalPages;
-                    let pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties, customizeCfg);
-                    if (pageRst) {
-                        // fsUtil.writeObjToFile(pageRst, "D:/GitHome/ConstructionCost/tmp/testBuiltPageResult.jsp");
-                        cb(null, pageRst);
-                    } else {
-                        cb('Have errors while on going...', null);
-                    }
-                    //*/
-                } else {
-                    cb('No report data were found!', null);
-                }
-            });
-        } else {
-            cb('No report template was found!', null);
+        } catch(ex) {
+            //
         }
-    });
+    } else {
+        cb('No report template was found!', null);
+    }
 }
 
-function getMultiRptsCommon(user_id, prj_id, rpt_ids, pageSize, orientation, customizeCfg, option, outputType, cb) {
-    for (let idx = 0; idx < rpt_ids.length; idx++) {
-        rpt_ids[idx] = parseInt(rpt_ids[idx]); //转换一下,以防万一
+async function getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, customizeCfg, option, outputType, cb) {
+    let rpt_params = {pageSize: pageSize, orientation: orientation, custCfg: customizeCfg, option: option, prj_ids: [prj_id], rpt_tpl_id: rpt_id};
+    getAllPagesForOneRptCommonEx(user_id, rpt_params, outputType, cb);
+}
+
+async function getMultiRptsCommonEx(user_id, prj_ids_arr, rpt_ids, pageSize, orientation, customizeCfg, option, outputType, cb) {
+    function getProjectPageData(rptTpl, prj_ids, multiRawData) {
+        let rpt_params = {pageSize: pageSize, orientation: orientation, custCfg: customizeCfg, option: option, prj_ids: prj_ids};
+        let util = new rptDataExtractor();
+        util.initialize((rptTpl._doc)?rptTpl._doc:rptTpl);
+        return new Promise(function(resolve, reject) {
+            if (multiRawData.length > 0) {
+                //考虑到工料机的数据还需要再计算,所以还不能直接用,需要每个工程都处理一遍后,再合并
+                let tplData = util.assembleData(multiRawData[0]);
+                for (let idx = 1; idx < multiRawData.length; idx++) {
+                    let tmpData = util.assembleData(multiRawData[idx]);
+                    _combineData(tplData, tmpData);
+                }
+                _createPntPageData(tplData, rptTpl, rpt_params, outputType, (err, pageRst)=>{
+                    if (err) {
+                        return reject('No data were found!');
+                    } else {
+                        resolve(pageRst);
+                    }
+                });
+            } else {
+                return reject('No data were found!');
+            }
+        });
     }
-    rptTplFacade.getRptTemplates(rpt_ids).then(function(rptTpls) {
-        let rptDataUtil = new rptDataExtractor();
+    try {
+        for (let idx = 0; idx < rpt_ids.length; idx++) {
+            rpt_ids[idx] = parseInt(rpt_ids[idx]); //转换一下,以防万一
+        }
+        let rptTpls = await rptTplFacade.getRptTemplates(rpt_ids);
         let filters = [];
         if (rptTpls.length > 1) {
             rptTpls.sort(function (item1, item2){
@@ -342,39 +308,79 @@ function getMultiRptsCommon(user_id, prj_id, rpt_ids, pageSize, orientation, cus
                 return ID1 - ID2;
             });
         }
+        let rptDataUtil = new rptDataExtractor();
         for (let rptTpl of rptTpls) {
             rptDataUtil.initialize((rptTpl._doc)?rptTpl._doc:rptTpl);
-            let filter = rptDataUtil.getDataRequestFilter();
-            for (let dtlFilter of filter) {
-                if (filters.indexOf(dtlFilter) < 0) {
-                    filters.push(dtlFilter);
-                }
+            filters.push(rptDataUtil.getDataRequestFilter()); // 这里不merge filter了,一个个独立
+        }
+        let parallelFunctions = [];
+        for (let tplIdx = 0; tplIdx < rptTpls.length; tplIdx++) {
+            // 不同的项目ID跟着报表模板走(大部分是只有一个项目,汇总类型的表会有多个)
+            let multiRawData = await rptTplDataFacade.prepareMultiProjectData(user_id, prj_ids_arr[tplIdx], filters[tplIdx]);
+            parallelFunctions.push(getProjectPageData(rptTpls[tplIdx], prj_ids_arr[tplIdx], multiRawData));
+        }
+        let rptPageRstArray = await Promise.all(parallelFunctions);
+        cb(null, rptPageRstArray);
+    } catch (ex) {
+        console.log(ex);
+        cb('Has exception!', null);
+    }
+}
+
+async function getMultiRptsCommon(user_id, prj_id, rpt_ids, pageSize, orientation, customizeCfg, option, outputType, cb) {
+    for (let idx = 0; idx < rpt_ids.length; idx++) {
+        rpt_ids[idx] = parseInt(rpt_ids[idx]); //转换一下,以防万一
+    }
+    let rptTpls = await rptTplFacade.getRptTemplates(rpt_ids);
+    
+    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();
+        for (let dtlFilter of filter) {
+            if (filters.indexOf(dtlFilter) < 0) {
+                filters.push(dtlFilter);
             }
         }
+    }
+    
+    // for (let dtlPrjIds of prj_ids_arr) {
+    if (rptTpls) {
         //正常应该根据报表模板定义的数据类型来请求数据
+        // let multiRawData = await rptTplDataFacade.prepareMultiProjectData(user_id, dtlPrjIds, filters);
         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);
-                            savedBillsData = JSON.stringify(dtlData.data);
-                        } else if (dtlData.moduleName === 'ration') {
-                            // Object.assign(savedRationData, dtlData.data);
-                            savedRationData = JSON.stringify(dtlData.data);
-                        } else if (dtlData.moduleName === 'ration_glj') {
-                            // Object.assign(savedGljData, dtlData.data);
-                            savedGljData = JSON.stringify(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);
-                            savedPrjGljData = JSON.stringify(dtlData.data.gljList);
+                    if (rpt_ids.length > 1) {
+                        for (let dtlData of rawDataObj.prjData) {
+                            if (dtlData.moduleName === 'bills') {
+                                // Object.assign(savedBillsData, dtlData.data);
+                                savedBillsData = JSON.stringify(dtlData.data);
+                            } else if (dtlData.moduleName === 'ration') {
+                                // Object.assign(savedRationData, dtlData.data);
+                                savedRationData = JSON.stringify(dtlData.data);
+                            } else if (dtlData.moduleName === 'ration_glj') {
+                                // Object.assign(savedGljData, dtlData.data);
+                                savedGljData = JSON.stringify(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);
+                                savedPrjGljData = JSON.stringify(dtlData.data.gljList);
+                            }
+                            // 备注:经测试,feeRate目前只能用assign方式来保存,用JSON方式会报错
                         }
-                        // 备注:经测试,feeRate目前只能用assign方式来保存,用JSON方式会报错
                     }
                     //2. 一个一个模板创建数据
                     for (let tplIdx = 0; tplIdx < rptTpls.length; tplIdx++) {
@@ -402,22 +408,24 @@ function getMultiRptsCommon(user_id, prj_id, rpt_ids, pageSize, orientation, cus
                         }
                         rptPageRstArray.push(pageRst);
                         //注意:这里需要把清单、定额、工料机数据assign回去!!!
-                        for (let dtlData of rawDataObj.prjData) {
-                            if (dtlData.moduleName === 'bills' && savedBillsData.length > 0) {
-                                // Object.assign(dtlData.data, savedBillsData);
-                                dtlData.data = JSON.parse(savedBillsData);
-                            } else if (dtlData.moduleName === 'ration' && savedRationData.length > 0) {
-                                // Object.assign(dtlData.data, savedRationData);
-                                dtlData.data = JSON.parse(savedRationData);
-                            } else if (dtlData.moduleName === 'ration_glj' && savedGljData.length > 0) {
-                                // Object.assign(dtlData.data, savedGljData);
-                                dtlData.data = JSON.parse(savedGljData);
-                            } else if (dtlData.moduleName === 'feeRate' && savedFeeRateData.length > 0) {
-                                Object.assign(dtlData.data._doc.rates, savedFeeRateData);
-                                // 备注:经测试,feeRate目前只能用assign方式来回滚,用JSON方式会报错
-                            } else if (dtlData.moduleName === 'projectGLJ' && savedPrjGljData.length > 0) {
-                                // Object.assign(dtlData.data.gljList, savedPrjGljData);
-                                dtlData.data.gljList = JSON.parse(savedPrjGljData);
+                        if (rpt_ids.length > 1) {
+                            for (let dtlData of rawDataObj.prjData) {
+                                if (dtlData.moduleName === 'bills' && savedBillsData.length > 0) {
+                                    // Object.assign(dtlData.data, savedBillsData);
+                                    dtlData.data = JSON.parse(savedBillsData);
+                                } else if (dtlData.moduleName === 'ration' && savedRationData.length > 0) {
+                                    // Object.assign(dtlData.data, savedRationData);
+                                    dtlData.data = JSON.parse(savedRationData);
+                                } else if (dtlData.moduleName === 'ration_glj' && savedGljData.length > 0) {
+                                    // Object.assign(dtlData.data, savedGljData);
+                                    dtlData.data = JSON.parse(savedGljData);
+                                } else if (dtlData.moduleName === 'feeRate' && savedFeeRateData.length > 0) {
+                                    Object.assign(dtlData.data._doc.rates, savedFeeRateData);
+                                    // 备注:经测试,feeRate目前只能用assign方式来回滚,用JSON方式会报错
+                                } else if (dtlData.moduleName === 'projectGLJ' && savedPrjGljData.length > 0) {
+                                    // Object.assign(dtlData.data.gljList, savedPrjGljData);
+                                    dtlData.data.gljList = JSON.parse(savedPrjGljData);
+                                }
                             }
                         }
                     }
@@ -432,47 +440,44 @@ function getMultiRptsCommon(user_id, prj_id, rpt_ids, pageSize, orientation, cus
                 cb('No report data were found!', null);
             }
         })
-    });
+    }
 }
 
-function getBillsSummaryReportPages(req, user_id, prjIds, rpt_id, pageSize, orientation, customizeCfg, option, outputType, cb) {
+async function getBillsSummaryReportPages(req, user_id, prjIds, rpt_id, pageSize, orientation, customizeCfg, option, outputType, cb) {
     let rptTpl = null;
-    rptTplDataFacade.getBudgetSummayDatas(prjIds, req.session.sessionUser.id, req.session.sessionCompilation._id, req.session.sessionCompilation.overWriteUrl).then(function(summaryRawDataRst) {
-        rptTplFacade.getRptTemplate(rpt_id).then(function(rptTpl) {
-            let rptDataUtil = new rptDataExtractor();
-            rptDataUtil.initialize((rptTpl._doc)?rptTpl._doc:rptTpl);
-            try {
-                let tplData = rptDataUtil.assembleData(summaryRawDataRst);
-                // fsUtil.writeObjToFile(summaryRawDataRst, "D:/GitHome/temp/billsSummaryRawDataRstRawData.jsp");
-                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);
-                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);
-                }
-                if (pageRst) {
-                    cb(null, pageRst);
-                } else {
-                    cb('Have errors while on going...', null);
-                }
-            } catch (ex) {
-                console.log("报表数据异常: userId " + user_id + ", project id: " + JSON.stringify(prjIds));
-                console.log(ex.message);
-                cb('Exception occurs while on going...', null);
-            }
-        });
-    });
-
+    let summaryRawDataRst = await rptTplDataFacade.getBudgetSummayDatas(prjIds, req.session.sessionUser.id, req.session.sessionCompilation._id, req.session.sessionCompilation.overWriteUrl);
+    rptTpl = await rptTplFacade.getRptTemplate(rpt_id);
+    let rptDataUtil = new rptDataExtractor();
+    rptDataUtil.initialize((rptTpl._doc)?rptTpl._doc:rptTpl);
+    try {
+        let tplData = rptDataUtil.assembleData(summaryRawDataRst);
+        // fsUtil.writeObjToFile(summaryRawDataRst, "D:/GitHome/temp/billsSummaryRawDataRstRawData.jsp");
+        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);
+        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);
+        }
+        if (pageRst) {
+            cb(null, pageRst);
+        } else {
+            cb('Have errors while on going...', null);
+        }
+    } catch (ex) {
+        console.log("报表数据异常: userId " + user_id + ", project id: " + JSON.stringify(prjIds));
+        console.log(ex.message);
+        cb('Exception occurs while on going...', null);
+    }
 }
 
 function getSummaryComboPages(req, user_id, prjIds, billsSummaryRpt_ids, gljSummaryRpt_ids, pageSize, orientation, customizeCfg, option, outputType, cb) {
@@ -599,58 +604,14 @@ async function getGljSummaryReportPages(user_id, prjIds, rpt_id, pageSize, orien
     }
 }
 
-function getGljSummaryReportPages_oldstyle(user_id, prjIds, rpt_id, pageSize, orientation, customizeCfg, option, outputType, cb) {
-    let rptTpl = null;
-    rptTplDataFacade.getGLJSummayDatas(prjIds).then(function(summaryRawDataRst) {
-        rptTplFacade.getRptTemplate(rpt_id).then(function(rptTpl) {
-            let rptDataUtil = new rptDataExtractor();
-            rptDataUtil.initialize((rptTpl._doc)?rptTpl._doc:rptTpl);
-            try {
-                // fsUtil.writeObjToFile(summaryRawDataRst, "D:/GitHome/temp/gljSummaryRawDataRstRawData.jsp");
-                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;
-                //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);
-                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);
-                }
-                if (pageRst) {
-                    cb(null, pageRst);
-                } else {
-                    cb('Have errors while on going...', null);
-                }
-            } catch (ex) {
-                // console.log("报表数据异常: userId " + user_id + ", project id: " + prj_id);
-                console.log(ex);
-                cb('Exception occurs while on going...', null);
-            }
-        });
-
-    });
-}
-
 module.exports = {
-    getReportAllPages: function (req, res) {
-        let params = JSON.parse(req.body.params),
-            rpt_id = params.rpt_tpl_id,
-            prj_id = params.prj_id,
-            pageSize = params.pageSize,
-            orientation = params.orientation,
-            customizeCfg = params.custCfg
-        ;
-        // req.session.sessionUser.ssoId
+    getReportAllPages: async function (req, res) {
+        let params = JSON.parse(req.body.params);
         let user_id = req.session.sessionUser.id;
-        getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, customizeCfg, null, JV.OUTPUT_TYPE_NORMAL, function (err, pageRst) {
+        if (!params.hasOwnProperty('prj_ids')) {
+            params.prj_ids = [params.prj_id];
+        }
+        getAllPagesForOneRptCommonEx(user_id, params, JV.OUTPUT_TYPE_NORMAL, function (err, pageRst) {
             callback(req, res, err, pageRst);
         });
     },
@@ -659,6 +620,7 @@ module.exports = {
         let params = JSON.parse(req.body.params),
             prj_id = params.prj_id,
             rpt_ids = params.rpt_ids,
+            prj_ids_arr = params.prj_ids_arr,
             //--以下是汇总类数据----------
             rpt_bill_tpl_ids = params.rpt_bill_tpl_ids,
             rpt_glj_tpl_ids = params.rpt_glj_tpl_ids,
@@ -671,7 +633,8 @@ module.exports = {
         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_PDF, function (err, rptPageRstArray) {
+            getMultiRptsCommonEx(user_id, prj_ids_arr, 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_PDF, function (err, rptPageRstArray) {
                 if (err) {
                     callback(req, res, '数据有误', null);
                 } else {
@@ -691,7 +654,7 @@ module.exports = {
         }
     },
 
-    getBillSummaryReportPages: function (req, res) {
+    getBillSummaryReportPages: async function (req, res) {
         let params = JSON.parse(req.body.params),
             rpt_id = params.rpt_tpl_id,
             prjIds = params.prjIds,
@@ -719,26 +682,12 @@ module.exports = {
         });
     },
 
-    getReportAllPagesSvg: function (req, res) {
-        let params = JSON.parse(req.body.params),
-            rpt_id = params.rpt_tpl_id,
-            prj_id = params.prj_id,
-            pageSize = params.pageSize,
-            orientation = params.orientation,
-            customizeCfg = params.custCfg
-        ;
-        let user_id = req.session.sessionUser.id;
-        getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, customizeCfg, null, JV.OUTPUT_TYPE_SVG, function (err, pageRst) {
-            let svgRstStrArr = rpt_svg_util.exportSvgStr(pageRst, 0, 0);
-            callback(req, res, err, svgRstStrArr);
-        });
-    },
-
     createExcelFilesInOneBookEx: function (req, res) {
         //采用了优化策略
         let params = JSON.parse(req.body.params),
             prj_id = params.prj_id,
             rpt_ids = params.rpt_ids,
+            prj_ids_arr = params.prj_ids_arr,
             //--以下是汇总类数据----------
             rpt_bill_tpl_ids = params.rpt_bill_tpl_ids,
             rpt_glj_tpl_ids = params.rpt_glj_tpl_ids,
@@ -753,7 +702,8 @@ module.exports = {
         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) {
+            getMultiRptsCommonEx(user_id, prj_ids_arr, 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);
@@ -787,6 +737,7 @@ module.exports = {
         let params = JSON.parse(req.body.params),
             prj_id = params.prj_id,
             rpt_ids = params.rpt_ids,
+            prj_ids_arr = params.prj_ids_arr,
             //--以下是汇总类数据----------
             rpt_bill_tpl_ids = params.rpt_bill_tpl_ids,
             rpt_glj_tpl_ids = params.rpt_glj_tpl_ids,
@@ -825,7 +776,8 @@ 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) {
+            getMultiRptsCommonEx(user_id, prj_ids_arr, 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);
@@ -953,6 +905,7 @@ module.exports = {
     createPdfFilesEx: function (req, res) {
         let params = JSON.parse(req.body.params),
             prj_id = params.prj_id,
+            prj_ids_arr = params.prj_ids_arr,
             rpt_ids = params.rpt_ids,
             rpt_names = params.rpt_names,
             //--以下是汇总类数据----------

+ 1 - 0
modules/reports/controllers/rpt_tpl_controller.js

@@ -160,6 +160,7 @@ let mExport = {
                                 }
                             }
                         }
+                        if (_doc.mobile === '13823093010') isFreeUser = false; // 给自己留的
                     }
                     let rstData = {isFreeUser: isFreeUser, data: tplTreeRst};
                     if (isFreeUser) {

+ 51 - 1
modules/reports/facade/rpt_tpl_data_facade.js

@@ -12,7 +12,8 @@ let billsUnitPriceFeatureModel = mongoose.model('std_bills_unitprice_feature_lib
 module.exports = {
     prepareProjectData: prepareProjectData,
     getBudgetSummayDatas: getBudgetSummayDatas,
-    getGLJSummayDatas: getGLJSummayDatas
+    getGLJSummayDatas: getGLJSummayDatas,
+    prepareMultiProjectData: prepareMultiProjectData,
 };
 
 function prepareProjectData(userId, prjId, filter, callback) {
@@ -67,3 +68,52 @@ async function getBudgetSummayDatas(prjIds, userId, CompilationId, overWriteUrl)
 async function getGLJSummayDatas(prjIds) {
     return await projectFacade.getGLJSummayDatas(prjIds);
 }
+
+async function prepareMultiProjectData(userId, prjIds, filter) {
+    function getProjectPageData(prjId, basicRst) {
+        return new Promise(function(resolve, reject) {
+            let estUnitPriceFeature = null;
+            prjMdl.project.getUserProject(userId, prjId, function(err, msg, rst){
+                if (!err) {
+                    projectDataMdl.getFilterData(prjId, filter, function(results) {
+                        let doc = rst._doc? rst._doc : rst;
+                        if (doc.property.engineeringName === '指标估算') {
+                            //要加料
+                            let conditions = {compilationId: doc.compilation};
+                            estUnitPriceFeature = billsUnitPriceFeatureModel.findOne(conditions,{_id: 0}).lean();
+                        }
+                        if (results) {
+                            rawDataObj = {};
+                            rawDataObj.prj = rst;
+                            rawDataObj.prjData = results;
+                            let doc = (rawDataObj.prj._doc)?rawDataObj.prj._doc:rawDataObj.prj;
+                            if (basicRst !== null) {
+                                doc.property.basicInformation = basicRst;
+                            }
+                            if (estUnitPriceFeature) {
+                                estUnitPriceFeature.then( (features) => {
+                                    let doc = (rawDataObj.prj._doc)?rawDataObj.prj._doc:rawDataObj.prj;
+                                    doc.property.estUnitPriceFeature = features.feature;
+                                    resolve(rawDataObj);
+                                });
+                            } else {
+                                resolve(rawDataObj);
+                            }
+                        } else {
+                            return reject('No data were found!');
+                        }
+                    });
+                } else {
+                    return reject(err);
+                }
+            });
+        });
+    }
+    let parallelFunctions = [];
+    for (let prjId of prjIds) {
+        let firstBasicRst = await prjMdl.project.getBasicInfo(prjId);
+        parallelFunctions.push(getProjectPageData(prjId, firstBasicRst));
+    }
+    let rst = await Promise.all(parallelFunctions);
+    return rst;
+}

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

@@ -20,7 +20,7 @@ module.exports =function (app) {
 
     //now is the real:
     rptRouter.post('/getReport', reportController.getReportAllPages);
-    rptRouter.post('/getReportSvg', reportController.getReportAllPagesSvg);
+    // rptRouter.post('/getReportSvg', reportController.getReportAllPagesSvg);
     rptRouter.post('/getMultiReports', reportController.getMultiReportsEx);
     rptRouter.post('/createExcelFiles', reportController.createExcelFilesEx);
     rptRouter.post('/createExcelFilesInOneBook', reportController.createExcelFilesInOneBookEx);

+ 68 - 9
web/building_saas/report/js/rpt_main.js

@@ -14,6 +14,7 @@ let fontSuffixMapObj = {"表标题": "title", "列标题": "column", "正文内
 
 let rptTplObj = {
     hasInitialized: false,
+    project_tree: null,
     pdfFont: {'SmartSimsun': [], 'simhei': [], 'simkai': []},
     iniPage: function() {
         let me = this;
@@ -33,6 +34,15 @@ let rptTplObj = {
             // dynamicLoadJs('/lib/jspdf/SmartSimsun-bold.js', me.pdfFontSimsunCallBack);
             // dynamicLoadJs('http://d2.smartcost.com.cn/cach/SmartSimsun-normal.js');
             // dynamicLoadJs('http://d2.smartcost.com.cn/cach/SmartSimsun-bold.js', me.pdfFontSimsunCallBack);
+            let params = {
+                rootProjectID: projectObj.project.property.rootProjectID,
+                user_id: userID
+            };
+            CommonAjax.post("pm/api/getAllUnitProjects", params, function(result) {
+                // console.log(result);
+                me.project_tree = result;
+                // console.log(me.getAllPrjIds());
+            });
         }
     },
     pdfFontSimsunCallBack: function() {
@@ -280,6 +290,7 @@ let zTreeOprObj = {
                 params.rpt_tpl_id = treeNode.refId;
                 params.prj_id = projectObj.project.projectInfo.ID;
                 params.custCfg = me.reportPageCfg;
+                params.prj_ids = rptControlObj._getRefPrjIdsByRptNode(treeNode);
                 me.requestNormalReport(params);
             }
             me.countChkedRptTpl();
@@ -572,10 +583,12 @@ let zTreeOprObj = {
     requestSumAndNormalRptForPDF: function () {
         let rpt_names = [], bill_rpt_names = [], glj_rpt_names = [];
         let refRptTplIds = [], refBillSumPrjsIds = [], refGljSumPrjsIds = [];
-        rptControlObj.getTplIdsCommon(refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds, rpt_names, bill_rpt_names, glj_rpt_names);
+        let prj_ids_arr = [];
+        rptControlObj.getTplIdsCommon(refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds, rpt_names, bill_rpt_names, glj_rpt_names, prj_ids_arr);
         let params = rptControlObj.creatCommonExportParam(refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds);
         params.sum_rpt_names = bill_rpt_names.concat(glj_rpt_names);
         params.rpt_names = rpt_names;
+        params.prj_ids_arr = prj_ids_arr;
         params.isOneSheet = true;
 
         CommonAjax.postEx("report_api/createPdfFiles", params, WAIT_TIME_EXPORT, true, function(result){
@@ -595,10 +608,12 @@ let zTreeOprObj = {
     requestSumAndNormalRptForPDF_Ex: function () {
         let rpt_names = [], bill_rpt_names = [], glj_rpt_names = [];
         let refRptTplIds = [], refBillSumPrjsIds = [], refGljSumPrjsIds = [];
-        rptControlObj.getTplIdsCommon(refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds, rpt_names, bill_rpt_names, glj_rpt_names);
+        let prj_ids_arr = [];
+        rptControlObj.getTplIdsCommon(refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds, rpt_names, bill_rpt_names, glj_rpt_names, prj_ids_arr);
         let params = rptControlObj.creatCommonExportParam(refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds);
         params.sum_rpt_names = bill_rpt_names.concat(glj_rpt_names);
         params.rpt_names = rpt_names;
+        params.prj_ids_arr = prj_ids_arr;
         params.isOneSheet = true;
         CommonAjax.postEx("report_api/getMultiReports", params, WAIT_TIME_EXPORT, true,
             function(result){
@@ -619,10 +634,12 @@ let zTreeOprObj = {
     requestSumAndNormalRptForMultiExcel: function () {
         let rpt_names = [], bill_rpt_names = [], glj_rpt_names = [];
         let refRptTplIds = [], refBillSumPrjsIds = [], refGljSumPrjsIds = [];
-        rptControlObj.getTplIdsCommon(refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds, rpt_names, bill_rpt_names, glj_rpt_names);
+        let prj_ids_arr = [];
+        rptControlObj.getTplIdsCommon(refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds, rpt_names, bill_rpt_names, glj_rpt_names, prj_ids_arr);
         let params = rptControlObj.creatCommonExportParam(refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds);
         params.sum_rpt_names = bill_rpt_names.concat(glj_rpt_names);
         params.rpt_names = rpt_names;
+        params.prj_ids_arr = prj_ids_arr;
         params.isOneSheet = true;
         $.bootstrapLoading.start();
         CommonAjax.postEx("report_api/createExcelFiles", params, WAIT_TIME_EXPORT, true, function(result){
@@ -651,8 +668,10 @@ let zTreeOprObj = {
     requestSumAndNormalRptForAllInOneExcel: function () {
         let orgRptName = projectObj.project.projectInfo.name;
         let refRptTplIds = [], refBillSumPrjsIds = [], refGljSumPrjsIds = [];
-        rptControlObj.getTplIdsCommon(refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds, null, null, null);
+        let prj_ids_arr = [];
+        rptControlObj.getTplIdsCommon(refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds, null, null, null, prj_ids_arr);
         let params = rptControlObj.creatCommonExportParam(refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds);
+        params.prj_ids_arr = prj_ids_arr;
         params.rptName = orgRptName;
         $.bootstrapLoading.start();
         CommonAjax.postEx("report_api/createExcelFilesInOneBook", params, WAIT_TIME_EXPORT, true, function(result){
@@ -768,7 +787,7 @@ let rptControlObj = {
             //other types if needed.
         }
     },
-    getTplIdsCommon: function (refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds, rpt_names, bill_rpt_names, glj_rpt_names) {
+    getTplIdsCommon: function (refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds, rpt_names, bill_rpt_names, glj_rpt_names, prj_ids_arr) {
         for (let node of zTreeOprObj.checkedRptTplNodes) {
             if (node.hasOwnProperty('flags') && node.flags.hasOwnProperty('reportType') && node['flags']['reportType'] !== 'NA' && node['flags']['reportType'] !== null) {
                 if (node['flags']['reportType'] === 'billSummary') {
@@ -778,12 +797,35 @@ let rptControlObj = {
                     refGljSumPrjsIds.push(node.refId);
                     if (glj_rpt_names) glj_rpt_names.push(node.name);
                 }
+                // if (prj_ids_arr) prj_ids_arr.push([]); // 清单汇总及工料机汇总有专门的分支处理,不需要加空数组,加了反而会造成混淆
             } else {
                 refRptTplIds.push(node.refId);
                 if (rpt_names) rpt_names.push(node.name);
+                if (prj_ids_arr) prj_ids_arr.push(rptControlObj._getRefPrjIdsByRptNode(node));
+            }
+        }
+    },
+    _getRefPrjIdsByRptNode: function (rptNode) {
+        let rst = [];
+        rst.push(projectObj.project.projectInfo.ID);
+        if (rptNode.flags && rptNode.flags.sumLevelType) {
+            if (rptNode.flags.sumLevelType === 'construct') {
+                //建设项目级别 rptTplObj.project_tree 所有project ids
+                for (let prj of rptTplObj.project_tree) {
+                    if (rst.indexOf(prj.ID) < 0) rst.push(prj.ID);
+                }
+            } else if (rptNode.flags.sumLevelType === 'single') {
+                //单位工程级别 me.project_tree 相同parent project ids
+                for (let prj of rptTplObj.project_tree) {
+                    if (projectObj.project.projectInfo.ParentID === prj.ParentID) {
+                        if (rst.indexOf(prj.ID) < 0) rst.push(prj.ID);
+                    }
+                }
             }
         }
+        return rst;
     },
+
     creatCommonExportParam: function (refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds) {
         let nodes = (zTreeOprObj.prjFolderTreeObj === null)?[]:zTreeOprObj.prjFolderTreeObj.getCheckedNodes(true);
         let rst = {};
@@ -792,11 +834,14 @@ let rptControlObj = {
         rst.rpt_bill_tpl_ids = refBillSumPrjsIds;
         rst.rpt_glj_tpl_ids = refGljSumPrjsIds;
         rst.prjIds = [];
+        // rst.prj_ids_arr = [];
         zTreeOprObj.selectedPrjIDs = [];
         for (let node of nodes) {
             if (node.level > 0) {
                 rst.prjIds.push(node.ID);
                 zTreeOprObj.selectedPrjIDs.push(node.ID);
+                //这里要考虑别的多单位工程汇总级别数据(建设项目级别、单项工程级别,与selectedPrjIDs不同)
+                // params.prj_ids = rptControlObj._getRefPrjIdsByRptNode(treeNode);
             }
         }
         // rst.sum_rpt_names = bill_rpt_names.concat(glj_rpt_names);
@@ -813,7 +858,8 @@ let rptControlObj = {
             let me = rptControlObj;
             let orgRptName = projectObj.project.projectInfo.name;
             let refRptTplIds = [], refBillSumPrjsIds = [], refGljSumPrjsIds = [];
-            rptControlObj.getTplIdsCommon(refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds);
+            let prj_ids_arr = [];
+            rptControlObj.getTplIdsCommon(refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds, prj_ids_arr);
             if (zTreeOprObj.selectedPrjIDs.length > 0 && (refBillSumPrjsIds.length > 0 || refGljSumPrjsIds.length > 0)) {
                 let params = rptControlObj.creatCommonExportParam(refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds);
                 params.rptName = orgRptName;
@@ -847,8 +893,13 @@ let rptControlObj = {
                     $("#divReqCommonSummaryPDF")[0].style.display = "none";
                     zTreeOprObj.requestPrjFolderCommon(); //先处理需要汇总的报表,走另外一个分支
                 } else if (refRptTplIds.length > 0) {
+                    let prj_ids_arr = [];
                     let params = {};
                     params.prj_id = projectObj.project.projectInfo.ID;
+                    for (let idx = 0; idx < refRptTplIds.length; idx++) {
+                        prj_ids_arr.push([projectObj.project.projectInfo.ID]);
+                    }
+                    params.prj_ids_arr = prj_ids_arr;
                     params.rpt_ids = refRptTplIds;
                     params.rptName = orgRptName;
                     params.pageSize = me.getCurrentPageSize();
@@ -885,10 +936,12 @@ let rptControlObj = {
         if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) {
             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);
+            let prj_ids_arr = [];
+            rptControlObj.getTplIdsCommon(refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds, rpt_names, bill_rpt_names, glj_rpt_names, prj_ids_arr);
             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.prj_ids_arr = prj_ids_arr;
                 params.sum_rpt_names = bill_rpt_names.concat(glj_rpt_names);
                 params.rpt_names = rpt_names;
                 params.isOneSheet = true;
@@ -927,6 +980,7 @@ let rptControlObj = {
                 } else if (refRptTplIds.length > 0) {
                     let params = {};
                     params.prj_id = projectObj.project.projectInfo.ID;
+                    params.prj_ids_arr = prj_ids_arr;
                     params.rpt_ids = refRptTplIds;
                     params.rpt_names = rpt_names;
                     params.pageSize = me.getCurrentPageSize();
@@ -988,10 +1042,12 @@ let rptControlObj = {
         if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) {
             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);
+            let prj_ids_arr = [];
+            rptControlObj.getTplIdsCommon(refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds, rpt_names, bill_rpt_names, glj_rpt_names, prj_ids_arr);
             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.prj_ids_arr = prj_ids_arr;
                 params.sum_rpt_names = bill_rpt_names.concat(glj_rpt_names);
                 params.rpt_ids = refRptTplIds;
                 params.rpt_bill_tpl_ids = refBillSumPrjsIds;
@@ -1087,11 +1143,13 @@ let rptControlObj = {
         if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) {
             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);
+            let prj_ids_arr = [];
+            rptControlObj.getTplIdsCommon(refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds, rpt_names, bill_rpt_names, glj_rpt_names, prj_ids_arr);
             // refRptTplIds获取的是
             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.prj_ids_arr = prj_ids_arr;
                 params.sum_rpt_names = bill_rpt_names.concat(glj_rpt_names);
                 params.rpt_ids = refRptTplIds;
                 params.rpt_bill_tpl_ids = refBillSumPrjsIds;
@@ -1137,6 +1195,7 @@ let rptControlObj = {
                 } else if (refRptTplIds.length > 0) {
                     let params = {};
                     params.prj_id = projectObj.project.projectInfo.ID;
+                    params.prj_ids_arr = prj_ids_arr;
                     params.rpt_ids = refRptTplIds;
                     params.rpt_names = rpt_names;
                     params.pageSize = me.getCurrentPageSize();

+ 3 - 1
web/building_saas/report/js/rpt_print.js

@@ -10,9 +10,11 @@ let rptPrintHelper = {
         }
         if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) {
             let refRptTplIds = [], refBillSumPrjsIds = [], refGljSumPrjsIds = [];
-            rptControlObj.getTplIdsCommon(refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds, null, null, null);
+            let prj_ids_arr = [];
+            rptControlObj.getTplIdsCommon(refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds, null, null, null, prj_ids_arr);
             let params = rptControlObj.creatCommonExportParam(refRptTplIds, refBillSumPrjsIds, refGljSumPrjsIds);
             params.rpt_ids = refRptTplIds;
+            params.prj_ids_arr = prj_ids_arr;
             params.rpt_bill_tpl_ids = refBillSumPrjsIds;
             params.rpt_glj_tpl_ids = refGljSumPrjsIds;
             CommonAjax.postEx("report_api/getMultiReports", params, 10000, true,