|
@@ -137,6 +137,7 @@ let fs = require("fs");
|
|
let path = require("path");
|
|
let path = require("path");
|
|
let request = require("request");
|
|
let request = require("request");
|
|
const systemSettingModel = mongoose.model('system_setting');
|
|
const systemSettingModel = mongoose.model('system_setting');
|
|
|
|
+const billFacade = require('../../main/facade/bill_facade');
|
|
|
|
|
|
|
|
|
|
let qiniu_config = {
|
|
let qiniu_config = {
|
|
@@ -1256,7 +1257,25 @@ async function getSummaryInfoByTender(tenderID, summaryType) {
|
|
|
|
|
|
//获取单位工程的各标段费用信息(不进行汇总)
|
|
//获取单位工程的各标段费用信息(不进行汇总)
|
|
async function getTendersFeeInfo(tenders) {
|
|
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 = {};
|
|
let flagFieldMapping = {};
|
|
flagFieldMapping[fixedFlag.ENGINEERINGCOST] = 'engineeringCost';
|
|
flagFieldMapping[fixedFlag.ENGINEERINGCOST] = 'engineeringCost';
|
|
@@ -1296,7 +1315,7 @@ async function getTendersFeeInfo(tenders) {
|
|
//单方造价
|
|
//单方造价
|
|
tenderInfo.perCost = '';
|
|
tenderInfo.perCost = '';
|
|
}
|
|
}
|
|
- }
|
|
|
|
|
|
+ } */
|
|
return IDMapping;
|
|
return IDMapping;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1362,6 +1381,7 @@ async function getSummaryInfo(projectIDs, summaryField = defaultSummaryField){
|
|
});
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ const summaryMap = await billFacade.getBudgetSummaryInfo(projectIDs);
|
|
//ID与汇总信息映射
|
|
//ID与汇总信息映射
|
|
let IDMapping = {};
|
|
let IDMapping = {};
|
|
let projects = await projectModel.find({ID: {$in : projectIDs}, projType: projectType.project, $or: [{deleteInfo: null}, {'deleteInfo.deleted': false}]});
|
|
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){
|
|
for(let eng of engineerings){
|
|
engIDs.push(eng.ID);
|
|
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){
|
|
if(engIDs.length > 0){
|
|
@@ -1401,56 +1419,22 @@ async function getSummaryInfo(projectIDs, summaryField = defaultSummaryField){
|
|
if(tenders.length > 0){
|
|
if(tenders.length > 0){
|
|
for(let tender of tenders){
|
|
for(let tender of tenders){
|
|
tenderIDs.push(tender.ID);
|
|
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);
|
|
let buildingArea = getBuildingArea(tender.property.projectFeature);
|
|
if(buildingArea){
|
|
if(buildingArea){
|
|
IDMapping[tender.ID]['buildingArea'] = 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 rateDecimal = -2;
|
|
const perCostDecimal = -2;
|
|
const perCostDecimal = -2;
|
|
for(let tender of tenders){
|
|
for(let tender of tenders){
|
|
let tenderInfo = IDMapping[tender.ID];
|
|
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.perCost = tenderInfo.buildingArea.toString().trim() === '' || tenderInfo.buildingArea == 0
|
|
? tenderInfo.buildingArea.toString().trim()
|
|
? tenderInfo.buildingArea.toString().trim()
|
|
: scMathUtil.roundTo(tenderInfo.engineeringCost / tenderInfo.buildingArea, perCostDecimal);
|
|
: 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){
|
|
for(let project of projects){
|
|
let projectInfo = IDMapping[project.ID];
|
|
let projectInfo = IDMapping[project.ID];
|