Kaynağa Gözat

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

zhangweicheng 4 yıl önce
ebeveyn
işleme
d50e0b7ae8

+ 27 - 0
modules/main/models/project.js

@@ -156,6 +156,33 @@ Project.prototype.getDataSync = function(projectID){
     });
 };
 
+Project.prototype.getFilterDataSync = function(projectID, filters){
+    return new Promise((resolve, reject) => {
+        const functions = [];
+        for (const moduleName of filters){
+            if (moduleMap[moduleName]) {
+                functions.push((function(filterName){
+                    return function (cb) {
+                        moduleMap[filterName].getData(projectID, function(err, fmName, data){
+                            cb(err, {moduleName: fmName, data: data})
+                        }, false);
+                    }
+                })(moduleName));
+            } else {
+                console.log(`有未知模块数据(Project.prototype.getFilterDataSync): ${moduleName} - projectID : ${projectID} - ${(new Date()).toString()}`);
+            }
+        }
+    
+        asyncTool.parallel(functions, function(err, results) {
+            if (!err) {
+                resolve(results);
+            } else {
+                reject(err);
+            }
+        });
+    });
+};
+
 Project.prototype.getFilterData = function (projectID, filter, callback) {
     let functions = [];
     let getModuleData = function (moduleName) {

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

@@ -142,6 +142,14 @@ ProjectsDAO.prototype.getUserProjects = async function (userId, compilation, cal
     }
 };
 
+ProjectsDAO.prototype.getUserProjectAsync = async function (userId, ProjId) {
+    let template = await Projects.findOne({$or: [{deleteInfo: null}, {'deleteInfo.deleted': false}], ID: ProjId}, '-_id');
+    if (template && userId !== template.userID) {
+        template._doc.readOnly = true;
+    }
+    return template;
+};
+
 ProjectsDAO.prototype.getUserProject = function (userId, ProjId, callback) {
     Projects.findOne({$or: [{deleteInfo: null}, {'deleteInfo.deleted': false}], ID: ProjId}, '-_id', function (err, template) {
         if (err) {

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

@@ -244,9 +244,11 @@ async function getAllPagesForOneRptCommonEx(user_id, rpt_params, outputType, cb)
         let summaryRst = [];
         let filter = rptDataUtil.getDataRequestFilter(summaryRst);
         // 这里不考虑清单汇总及工料机汇总的情况了(有另外的分支处理,不会经过这里)
-        let multiRawData = await rptTplDataFacade.prepareMultiProjectData(user_id, rpt_params.prj_ids, filter);
+        // let multiRawData = await rptTplDataFacade.prepareMultiProjectData(user_id, rpt_params.prj_ids, filter);
+        let multiRawData = await rptTplDataFacade.prepareMultiProjectDataEx(user_id, rpt_params.prj_ids, filter);
         try {
             if (multiRawData.length > 0) {
+                // fsUtil.writeObjToFile(multiRawData, `D:/GitHome/YangHuCost/tmp/orgMultiRawData_${(new Date()).getTime()}.jsp`);
                 //考虑到工料机的数据还需要再计算,所以还不能直接用,需要每个工程都处理一遍后,再合并
                 let tplData = rptDataUtil.assembleData(multiRawData[0]);
                 for (let idx = 1; idx < multiRawData.length; idx++) {
@@ -316,7 +318,8 @@ async function getMultiRptsCommonEx(user_id, prj_ids_arr, rpt_ids, pageSize, ori
         let parallelFunctions = [];
         for (let tplIdx = 0; tplIdx < rptTpls.length; tplIdx++) {
             // 不同的项目ID跟着报表模板走(大部分是只有一个项目,汇总类型的表会有多个)
-            let multiRawData = await rptTplDataFacade.prepareMultiProjectData(user_id, prj_ids_arr[tplIdx], filters[tplIdx]);
+            // let multiRawData = await rptTplDataFacade.prepareMultiProjectData(user_id, prj_ids_arr[tplIdx], filters[tplIdx]);
+            let multiRawData = await rptTplDataFacade.prepareMultiProjectDataEx(user_id, prj_ids_arr[tplIdx], filters[tplIdx]);
             parallelFunctions.push(getProjectPageData(rptTpls[tplIdx], prj_ids_arr[tplIdx], multiRawData));
         }
         let rptPageRstArray = await Promise.all(parallelFunctions);
@@ -355,7 +358,6 @@ async function getMultiRptsCommon(user_id, prj_id, rpt_ids, pageSize, orientatio
     // 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 {
@@ -611,6 +613,7 @@ module.exports = {
         if (!params.hasOwnProperty('prj_ids')) {
             params.prj_ids = [params.prj_id];
         }
+        // console.log(params);
         getAllPagesForOneRptCommonEx(user_id, params, JV.OUTPUT_TYPE_NORMAL, function (err, pageRst) {
             callback(req, res, err, pageRst);
         });

+ 31 - 5
modules/reports/facade/rpt_tpl_data_facade.js

@@ -14,6 +14,7 @@ module.exports = {
     getBudgetSummayDatas: getBudgetSummayDatas,
     getGLJSummayDatas: getGLJSummayDatas,
     prepareMultiProjectData: prepareMultiProjectData,
+    prepareMultiProjectDataEx: prepareMultiProjectDataEx,
 };
 
 function prepareProjectData(userId, prjId, filter, callback) {
@@ -69,6 +70,7 @@ async function getGLJSummayDatas(prjIds) {
     return await projectFacade.getGLJSummayDatas(prjIds);
 }
 
+// prepareMultiProjectData 方法实际测试有并行问题,并行的结果有时候会乱来,弃用。以prepareMultiProjectDataEx代替
 async function prepareMultiProjectData(userId, prjIds, filter) {
     function getProjectPageData(prjId, basicRst) {
         return new Promise(function(resolve, reject) {
@@ -86,14 +88,16 @@ async function prepareMultiProjectData(userId, prjIds, filter) {
                             rawDataObj = {};
                             rawDataObj.prj = rst;
                             rawDataObj.prjData = results;
-                            let doc = (rawDataObj.prj._doc)?rawDataObj.prj._doc:rawDataObj.prj;
+                            // 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;
+                                    // let doc = (rawDataObj.prj._doc)?rawDataObj.prj._doc:rawDataObj.prj;
                                     doc.property.estUnitPriceFeature = features.feature;
+                                    console.log(`prjId: ${prjId}`);
+                                    console.log(rawDataObj);
                                     resolve(rawDataObj);
                                 });
                             } else {
@@ -110,10 +114,32 @@ async function prepareMultiProjectData(userId, prjIds, filter) {
         });
     }
     let parallelFunctions = [];
-    for (let prjId of prjIds) {
-        let firstBasicRst = await prjMdl.project.getBasicInfo(prjId);
-        parallelFunctions.push(getProjectPageData(prjId, firstBasicRst));
+    for (let pidx = 0; pidx < prjIds.length; pidx++) {
+        let firstBasicRst = await prjMdl.project.getBasicInfo(prjIds[pidx]);
+        parallelFunctions.push(getProjectPageData(prjIds[pidx], firstBasicRst));
     }
     let rst = await Promise.all(parallelFunctions);
     return rst;
+}
+
+async function prepareMultiProjectDataEx(userId, prjIds, filter) {
+    let rstData = [];
+    for (let pidx = 0; pidx < prjIds.length; pidx++) {
+        let basicRst = await prjMdl.project.getBasicInfo(prjIds[pidx]);
+        let prj = await prjMdl.project.getUserProjectAsync(userId, prjIds[pidx]);
+        let prjData = await projectDataMdl.getFilterDataSync(prjIds[pidx], filter);
+        let prjDoc = prj._doc ? prj._doc : prj;
+        if (prjDoc.property.engineeringName === '指标估算') {
+            //要加料
+            let conditions = {compilationId: prjDoc.compilation};
+            let estUnitPriceFeature = await billsUnitPriceFeatureModel.findOne(conditions,{_id: 0}).lean();
+            prjDoc.property.estUnitPriceFeature = estUnitPriceFeature.feature;
+        }
+        let rawDataObj = {};
+        rawDataObj.prj = prj;
+        rawDataObj.prjData = prjData;
+        prjDoc.property.basicInformation = basicRst;
+        rstData.push(rawDataObj);
+    }
+    return rstData;
 }

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

@@ -807,7 +807,6 @@ let rptControlObj = {
     },
     _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
@@ -823,6 +822,7 @@ let rptControlObj = {
                 }
             }
         }
+        if (rst.length === 0) rst.push(projectObj.project.projectInfo.ID);
         return rst;
     },