Browse Source

feat: 项目管理汇总金额改成概算汇总的金额

vian 4 years ago
parent
commit
bb6c3d489e
2 changed files with 54 additions and 54 deletions
  1. 29 13
      modules/main/facade/bill_facade.js
  2. 25 41
      modules/pm/facade/pm_facade.js

+ 29 - 13
modules/main/facade/bill_facade.js

@@ -134,9 +134,6 @@ module.exports={
     // 获取单位工程ID 工程费用(费用汇总里的totalFee) 映射表
     getUnitsBudgetMap: async function (unitIDs) {
         const rst = {};
-        /* unitIDs.forEach(unitID => {
-            rst[unitID] = 1000000;
-        }); */
         const gatherData = await gatherModel.find({ projectID: { $in: unitIDs } }, '-_id projectID totalFee').lean();
         const gatherMap = {};
         gatherData.forEach(item => gatherMap[item.projectID] = item.totalFee || 0);
@@ -147,11 +144,6 @@ module.exports={
     },
     // 获取设备购置费
     getUnitsEquipmentMap: async function (unitIDs) {
-        /* const rst = {};
-        unitIDs.forEach(unitID => {
-            rst[unitID] = 5000;
-        });
-        return rst; */
         return await equipmentFacade.getEquipmentTotalCost(unitIDs);
     },
     // 获取概算汇总初始化数据
@@ -166,14 +158,38 @@ module.exports={
             growthPeriod,
         }
     },
+    // 项目管理等需要获取概算汇总项目数据映射
+    getBudgetSummaryInfo: async function (constructionIDs) {
+        const map = {};
+        const task = [];
+        for (const constructionID of constructionIDs) {
+            task.push(this.getBudgetSummary(constructionID, true));
+            
+        }
+        const summaryResult = await Promise.all(task);
+        summaryResult.forEach(items => {
+            items.forEach(item => {
+                if (item.orgProjectID) {
+                    map[item.orgProjectID] = item;
+                }
+            });
+        });
+        return map;
+    },
     // 获取概算汇总数据(拍好序的)
-    getBudgetSummary: async function (constructionID) {
+    // 如果isSimple为true,只进行工程费用部分汇总,只返回工程费用部分数据
+    getBudgetSummary: async function (constructionID, isSimple = false) {
         // 获取建设项目清单数据(工程建设其他费用 - 建设项目总概算)部分
-        const constructionOtherFeeBills = await bill_Model.find({ projectID: constructionID }).lean();
-        const sortedOtherFeeBills = getSortedTreeData('-1', constructionOtherFeeBills);
-        sortedOtherFeeBills.forEach(item => item.area = BudgetArea.CONSTRUCTION_OTHER_FEE);
+        let sortedOtherFeeBills = [];
+        if (!isSimple) {
+            const constructionOtherFeeBills = await bill_Model.find({ projectID: constructionID }).lean();
+            sortedOtherFeeBills = getSortedTreeData('-1', constructionOtherFeeBills);
+            sortedOtherFeeBills.forEach(item => item.area = BudgetArea.CONSTRUCTION_OTHER_FEE);
+        } else {
+            sortedOtherFeeBills = await bill_Model.find({ projectID: constructionID, 'flags.flag': fixedFlag.CONSTRUCTION_BUDGET }).lean();
+        }
         // 获取工程费用数据
-        const constructionFeeBills = await this.getConstructionFeeData(constructionID, sortedOtherFeeBills[0].ID);
+        const constructionFeeBills = await this.getConstructionFeeData(constructionID, (sortedOtherFeeBills[0] && sortedOtherFeeBills[0].ID) || '-1');
         // 汇算工程费用
         await this.summarizeData(constructionFeeBills);
         const rst = [...constructionFeeBills, ...sortedOtherFeeBills];

+ 25 - 41
modules/pm/facade/pm_facade.js

@@ -137,6 +137,7 @@ let fs = require("fs");
 let path = require("path");
 let request = require("request");
 const systemSettingModel = mongoose.model('system_setting');
+const billFacade = require('../../main/facade/bill_facade');
 
 
 let qiniu_config = {
@@ -1256,7 +1257,25 @@ async function getSummaryInfoByTender(tenderID, summaryType) {
 
 //获取单位工程的各标段费用信息(不进行汇总)
 async function getTendersFeeInfo(tenders) {
-    let IDMapping = {};
+    const unitIDs = tenders.map(tender => tender.ID);
+    const unitsBudgetMap = await billFacade.getUnitsBudgetMap(unitIDs);
+    const unitsEquipmentMap = await billFacade.getUnitsEquipmentMap(unitIDs);
+    const IDMapping = {};
+    tenders.forEach(tender => {
+        const unitID = tender.ID;
+        const decimal = tender && tender.property && tender.property.decimal && tender.property.decimal.bills && tender.property.decimal.bills.totalPrice || 2;
+        const unitFee = +unitsBudgetMap[unitID]; // 费用汇总算出来的值
+        const unitEquipmentFee = +unitsEquipmentMap[unitID]; // 设备购置窗口的值
+        const unitTotalFee = scMathUtil.roundForObj(unitFee + unitEquipmentFee, decimal); // 费用汇总算出来的值 + 设备购置值
+        IDMapping[unitID] = {
+            engineeringCost: unitTotalFee,
+            buildingArea: '',
+            rate: '',
+            perCost: '',
+        }
+    })
+
+    /* let IDMapping = {};
     //固定清单类别与汇总金额字段映射
     let flagFieldMapping = {};
     flagFieldMapping[fixedFlag.ENGINEERINGCOST] = 'engineeringCost';
@@ -1296,7 +1315,7 @@ async function getTendersFeeInfo(tenders) {
             //单方造价
             tenderInfo.perCost = '';
         }
-    }
+    } */
     return IDMapping;
 }
 
@@ -1362,6 +1381,7 @@ async function getSummaryInfo(projectIDs, summaryField = defaultSummaryField){
             });
         }
     }
+    const summaryMap = await billFacade.getBudgetSummaryInfo(projectIDs);
     //ID与汇总信息映射
     let IDMapping = {};
     let projects = await projectModel.find({ID: {$in : projectIDs}, projType: projectType.project, $or: [{deleteInfo: null}, {'deleteInfo.deleted': false}]});
@@ -1379,8 +1399,7 @@ async function getSummaryInfo(projectIDs, summaryField = defaultSummaryField){
                 }
             }
         }
-        IDMapping[project.ID] = {rate: 0, buildingArea: grossArea, perCost: ''};
-        initFees(IDMapping[project.ID], summaryField);
+        IDMapping[project.ID] = { engineeringCost: summaryMap[project.ID].totalFee || 0, rate: summaryMap[project.ID].rate || 0, buildingArea: grossArea, perCost: ''};
     }
 
     //单项工程
@@ -1390,8 +1409,7 @@ async function getSummaryInfo(projectIDs, summaryField = defaultSummaryField){
     
     for(let eng of engineerings){
         engIDs.push(eng.ID);
-        IDMapping[eng.ID] = {rate: 0, buildingArea: '', perCost: ''};
-        initFees(IDMapping[eng.ID], summaryField);
+        IDMapping[eng.ID] = {engineeringCost: summaryMap[eng.ID].totalFee || 0, rate: summaryMap[eng.ID].rate || 0, buildingArea: '', perCost: ''};
     }
     //单位工程
     if(engIDs.length > 0){
@@ -1401,56 +1419,22 @@ async function getSummaryInfo(projectIDs, summaryField = defaultSummaryField){
     if(tenders.length > 0){
         for(let tender of tenders){
             tenderIDs.push(tender.ID);
-            IDMapping[tender.ID] = {rate: 0, buildingArea: '', perCost: '', changeMark:tender.changeMark,property:tender.property};
-            initFees(IDMapping[tender.ID], summaryField);
+            IDMapping[tender.ID] = {engineeringCost: summaryMap[tender.ID].totalFee || 0, rate: summaryMap[tender.ID].rate || 0,buildingArea: '', perCost: '', changeMark:tender.changeMark,property:tender.property};
             let buildingArea = getBuildingArea(tender.property.projectFeature);
             if(buildingArea){
                 IDMapping[tender.ID]['buildingArea'] = buildingArea;
             }
         }
-        //需要获取的清单固定类别综合合价:工程造价、分部分项、措施项目、安全文明施工专项、规费、其他项目、税金...
-        let needFlags = Object.getOwnPropertyNames(summaryField);
-        //获取单位工程汇总金额需要用到的所有清单
-        let allBills = await billsModel.find({projectID: {$in: tenderIDs}, 'flags.flag': {$in: needFlags}, $or: [{deleteInfo: null}, {'deleteInfo.deleted': false}]},
-                                            '-_id projectID fees flags');
-        //进行单位工程级别的汇总
-        for(let bills of allBills){
-            let billsFlag = bills.flags[0]['flag'];
-            // 设置上单位工程需要汇总的字段金额
-            const summaryItem = summaryField[billsFlag];
-            summaryItem.items.forEach(costItem => {
-                IDMapping[bills.projectID][costItem.name] = getTotalFee(bills, costItem.feeName);
-            });
-        }
-        const summaryNames = [];
-        for (const flag in summaryField) {
-            summaryField[flag].items.forEach(item => summaryNames.push(item.name));
-        }
-        //进行单项工程级别的汇总
-        for(let tender of tenders){
-            summarizeToParent(IDMapping[tender.ParentID], IDMapping[tender.ID], summaryNames);
-        }
-        //进行建设项目级别的汇总
-        for(let eng of engineerings){
-            summarizeToParent(IDMapping[eng.ParentID], IDMapping[eng.ID], summaryNames);
-        }
         //占造价比例、单方造价
         const rateDecimal = -2;
         const perCostDecimal = -2;
         for(let tender of tenders){
             let tenderInfo = IDMapping[tender.ID];
-            let engInfo = IDMapping[tender.ParentID];
-            tenderInfo.rate = engInfo.engineeringCost == 0 ? 0 : scMathUtil.roundTo(tenderInfo.engineeringCost * 100 / engInfo.engineeringCost, rateDecimal);
             //单方造价
             tenderInfo.perCost = tenderInfo.buildingArea.toString().trim() === '' || tenderInfo.buildingArea == 0 
                 ? tenderInfo.buildingArea.toString().trim() 
                 : scMathUtil.roundTo(tenderInfo.engineeringCost / tenderInfo.buildingArea, perCostDecimal);
         }
-        for(let eng of engineerings){
-            let engInfo = IDMapping[eng.ID];
-            let projInfo = IDMapping[eng.ParentID];
-            engInfo.rate = !isDef(projInfo) || projInfo.engineeringCost == 0 ? 0 : scMathUtil.roundTo(engInfo.engineeringCost * 100 / projInfo.engineeringCost, rateDecimal);
-        }
         //建设项目占造价比例及单方造价
         for(let project of projects){
             let projectInfo = IDMapping[project.ID];