|
|
@@ -609,13 +609,10 @@ function getCommonTotalFee(bills) {
|
|
|
|
|
|
function summarizeToParent(parent, child) {
|
|
|
const decimal = -2;
|
|
|
- parent.engineeringCost = scMathUtil.roundTo(parseFloat(parent.engineeringCost) + parseFloat(child.engineeringCost), decimal);
|
|
|
- parent.subEngineering = scMathUtil.roundTo(parseFloat(parent.subEngineering) + parseFloat(child.subEngineering), decimal);
|
|
|
- parent.measure = scMathUtil.roundTo(parseFloat(parent.measure) + parseFloat(child.measure), decimal);
|
|
|
- parent.safetyConstruction = scMathUtil.roundTo(parseFloat(parent.safetyConstruction) + parseFloat(child.safetyConstruction), decimal);
|
|
|
- parent.other = scMathUtil.roundTo(parseFloat(parent.other) + parseFloat(child.other), decimal);
|
|
|
- parent.charge = scMathUtil.roundTo(parseFloat(parent.charge) + parseFloat(child.charge), decimal);
|
|
|
- parent.tax = scMathUtil.roundTo(parseFloat(parent.tax) + parseFloat(child.tax), decimal);
|
|
|
+ let costFields = ['totalCost'];
|
|
|
+ for (let field of costFields) {
|
|
|
+ parent[field] = scMathUtil.roundTo(parseFloat(parent[field]) + parseFloat(child[field]), decimal);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
function getBuildingArea(projFeature){
|
|
|
@@ -640,32 +637,29 @@ async function getSummaryInfoByTender(tenderID, summaryType) {
|
|
|
if(!tender){
|
|
|
return null;
|
|
|
}
|
|
|
- let engineering = await projectModel.findOne({ID: tender.ParentID, $or: notDeleted});
|
|
|
- if(!engineering){
|
|
|
- return null;
|
|
|
- }
|
|
|
- let project = await projectModel.findOne({ID: engineering.ParentID, $or: notDeleted});
|
|
|
+ let project = await projectModel.findOne({ID: tender.ParentID, $or: notDeleted});
|
|
|
if(!project){
|
|
|
return null;
|
|
|
}
|
|
|
let summaryInfo = await getSummaryInfo([project.ID]);
|
|
|
+ //已经没有单项工程这一层
|
|
|
if(summaryType === projectType.engineering){
|
|
|
- parentName = engineering.name ? engineering.name : '';
|
|
|
+ /*parentName = engineering.name ? engineering.name : '';
|
|
|
let tenders = await projectModel.find({ParentID: engineering.ID, $or: notDeleted});
|
|
|
for(let t of tenders){
|
|
|
if(summaryInfo[t.ID]){
|
|
|
summaryInfo[t.ID]['name'] = t.name ? t.name : '';
|
|
|
summaryList.push(summaryInfo[t.ID]);
|
|
|
}
|
|
|
- }
|
|
|
+ }*/
|
|
|
}
|
|
|
else {
|
|
|
parentName = project.name ? project.name : '';
|
|
|
- let engs = await projectModel.find({ParentID: project.ID, $or: notDeleted});
|
|
|
- for(let e of engs){
|
|
|
- if(summaryInfo[e.ID]){
|
|
|
- summaryInfo[e.ID]['name'] = e.name ? e.name : '';
|
|
|
- summaryList.push(summaryInfo[e.ID]);
|
|
|
+ let tenders = await projectModel.find({ParentID: project.ID, $or: notDeleted});
|
|
|
+ for(let t of tenders){
|
|
|
+ if(summaryInfo[t.ID]){
|
|
|
+ summaryInfo[t.ID]['name'] = t.name ? t.name : '';
|
|
|
+ summaryList.push(summaryInfo[t.ID]);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -677,23 +671,15 @@ async function getTendersFeeInfo(tenders) {
|
|
|
let IDMapping = {};
|
|
|
//固定清单类别与汇总金额字段映射
|
|
|
let flagFieldMapping = {};
|
|
|
- flagFieldMapping[billsFlags.ENGINEERINGCOST] = 'engineeringCost';
|
|
|
- flagFieldMapping[billsFlags.SUB_ENGINERRING] = 'subEngineering';
|
|
|
- flagFieldMapping[billsFlags.MEASURE] = 'measure';
|
|
|
- flagFieldMapping[billsFlags.SAFETY_CONSTRUCTION] = 'safetyConstruction';
|
|
|
- flagFieldMapping[billsFlags.OTHER] = 'other';
|
|
|
- flagFieldMapping[billsFlags.CHARGE] = 'charge';
|
|
|
- flagFieldMapping[billsFlags.TAX] = 'tax';
|
|
|
+ flagFieldMapping[billsFlags.TOTAL_COST] = 'totalCost';
|
|
|
let tenderIDs = [];
|
|
|
if(tenders.length > 0){
|
|
|
for(let tender of tenders){
|
|
|
tenderIDs.push(tender.ID);
|
|
|
- IDMapping[tender.ID] = {engineeringCost: 0, subEngineering: 0, measure: 0, safetyConstruction: 0, other: 0, charge: 0, tax: 0, rate: 0, buildingArea: '', perCost: ''};
|
|
|
- IDMapping[tender.ID]['buildingArea'] = '';
|
|
|
+ IDMapping[tender.ID] = {totalCost: 0};
|
|
|
}
|
|
|
- //需要获取的清单固定类别综合合价:工程造价、分部分项、措施项目、安全文明施工专项、规费、其他项目、税金
|
|
|
- let needFlags = [billsFlags.ENGINEERINGCOST, billsFlags.SUB_ENGINERRING, billsFlags.MEASURE,
|
|
|
- billsFlags.SAFETY_CONSTRUCTION, billsFlags.CHARGE, billsFlags.OTHER, billsFlags.TAX];
|
|
|
+ //需要获取的清单固定类别综合合价:总造价
|
|
|
+ let needFlags = [billsFlags.TOTAL_COST];
|
|
|
//获取单位工程汇总金额需要用到的所有清单
|
|
|
let allBills = await billsModel.find({projectID: {$in: tenderIDs}, 'flags.flag': {$in: needFlags}, $or: notDeleted},
|
|
|
'-_id projectID fees flags');
|
|
|
@@ -703,72 +689,34 @@ async function getTendersFeeInfo(tenders) {
|
|
|
let costField = flagFieldMapping[billsFlag];
|
|
|
IDMapping[bills.projectID][costField] = getCommonTotalFee(bills);
|
|
|
}
|
|
|
- //占造价比例、单方造价
|
|
|
- for(let tender of tenders){
|
|
|
- let tenderInfo = IDMapping[tender.ID];
|
|
|
- tenderInfo.rate = '';
|
|
|
- //单方造价
|
|
|
- tenderInfo.perCost = '';
|
|
|
- }
|
|
|
}
|
|
|
return IDMapping;
|
|
|
}
|
|
|
-
|
|
|
+//@param {Array}projectIDs(建设项目ID) @return {Object}
|
|
|
async function getSummaryInfo(projectIDs){
|
|
|
//ID与汇总信息映射
|
|
|
let IDMapping = {};
|
|
|
//固定清单类别与汇总金额字段映射
|
|
|
let flagFieldMapping = {};
|
|
|
- flagFieldMapping[billsFlags.ENGINEERINGCOST] = 'engineeringCost';
|
|
|
- flagFieldMapping[billsFlags.SUB_ENGINERRING] = 'subEngineering';
|
|
|
- flagFieldMapping[billsFlags.MEASURE] = 'measure';
|
|
|
- flagFieldMapping[billsFlags.SAFETY_CONSTRUCTION] = 'safetyConstruction';
|
|
|
- flagFieldMapping[billsFlags.OTHER] = 'other';
|
|
|
- flagFieldMapping[billsFlags.CHARGE] = 'charge';
|
|
|
- flagFieldMapping[billsFlags.TAX] = 'tax';
|
|
|
+ flagFieldMapping[billsFlags.TOTAL_COST] = 'totalCost';
|
|
|
let projects = await projectModel.find({ID: {$in : projectIDs}, projType: projectType.project, $or: [{deleteInfo: null}, {'deleteInfo.deleted': false}]});
|
|
|
//设置建设项目的总建筑面积
|
|
|
for(let project of projects){
|
|
|
- let grossArea = '';
|
|
|
- if(project.property && project.property.basicInformation){
|
|
|
- for(let basicInfo of project.property.basicInformation){
|
|
|
- if(basicInfo.key === 'basicInfo'){
|
|
|
- for(let k of basicInfo.items){
|
|
|
- if(k.key === 'grossArea'){
|
|
|
- grossArea = k.value;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- IDMapping[project.ID] = {engineeringCost: 0, subEngineering: 0, measure: 0, safetyConstruction: 0, other: 0, charge: 0, tax: 0, rate: 0, buildingArea: grossArea, perCost: ''};
|
|
|
+ IDMapping[project.ID] = {totalCost: 0};
|
|
|
}
|
|
|
-
|
|
|
- //单项工程
|
|
|
- let engineerings = await projectModel.find({ParentID: {$in : projectIDs}, projType: projectType.engineering, $or: [{deleteInfo: null}, {'deleteInfo.deleted': false}]});
|
|
|
//单位工程
|
|
|
let tenders = [];
|
|
|
- let engIDs = [];
|
|
|
- for(let eng of engineerings){
|
|
|
- engIDs.push(eng.ID);
|
|
|
- IDMapping[eng.ID] = {engineeringCost: 0, subEngineering: 0, measure: 0, safetyConstruction: 0, other: 0, charge: 0, tax: 0, rate: 0, buildingArea: '', perCost: ''};
|
|
|
- }
|
|
|
- if(engIDs.length > 0){
|
|
|
- tenders = await projectModel.find({ParentID: {$in : engIDs}, projType: projectType.tender, $or: [{deleteInfo: null}, {'deleteInfo.deleted': false}]});
|
|
|
+ if(projectIDs.length > 0){
|
|
|
+ tenders = await projectModel.find({ParentID: {$in : projectIDs}, projType: projectType.tender, $or: [{deleteInfo: null}, {'deleteInfo.deleted': false}]});
|
|
|
}
|
|
|
let tenderIDs = [];
|
|
|
if(tenders.length > 0){
|
|
|
for(let tender of tenders){
|
|
|
tenderIDs.push(tender.ID);
|
|
|
- IDMapping[tender.ID] = {engineeringCost: 0, subEngineering: 0, measure: 0, safetyConstruction: 0, other: 0, charge: 0, tax: 0, rate: 0, buildingArea: '', perCost: '',changeMark:tender.changeMark,property:tender.property};
|
|
|
- let buildingArea = getBuildingArea(tender.property.projectFeature);
|
|
|
- if(buildingArea){
|
|
|
- IDMapping[tender.ID]['buildingArea'] = buildingArea;
|
|
|
- }
|
|
|
+ IDMapping[tender.ID] = {totalCost: 0, changeMark:tender.changeMark};//property:tender.property
|
|
|
}
|
|
|
- //需要获取的清单固定类别综合合价:工程造价、分部分项、措施项目、安全文明施工专项、规费、其他项目、税金
|
|
|
- let needFlags = [billsFlags.ENGINEERINGCOST, billsFlags.SUB_ENGINERRING, billsFlags.MEASURE,
|
|
|
- billsFlags.SAFETY_CONSTRUCTION, billsFlags.CHARGE, billsFlags.OTHER, billsFlags.TAX];
|
|
|
+ //需要获取的清单固定类别综合合价:总造价
|
|
|
+ let needFlags = [billsFlags.TOTAL_COST];
|
|
|
//获取单位工程汇总金额需要用到的所有清单
|
|
|
let allBills = await billsModel.find({projectID: {$in: tenderIDs}, 'flags.flag': {$in: needFlags}, $or: [{deleteInfo: null}, {'deleteInfo.deleted': false}]},
|
|
|
'-_id projectID fees flags');
|
|
|
@@ -778,36 +726,9 @@ async function getSummaryInfo(projectIDs){
|
|
|
let costField = flagFieldMapping[billsFlag];
|
|
|
IDMapping[bills.projectID][costField] = getCommonTotalFee(bills);
|
|
|
}
|
|
|
- //进行单项工程级别的汇总
|
|
|
- for(let tender of tenders){
|
|
|
- summarizeToParent(IDMapping[tender.ParentID], IDMapping[tender.ID]);
|
|
|
- }
|
|
|
//进行建设项目级别的汇总
|
|
|
- for(let eng of engineerings){
|
|
|
- summarizeToParent(IDMapping[eng.ParentID], IDMapping[eng.ID]);
|
|
|
- }
|
|
|
- //占造价比例、单方造价
|
|
|
- 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];
|
|
|
- projectInfo.rate = 100;
|
|
|
- projectInfo.perCost = projectInfo.buildingArea.toString().trim() === '' || projectInfo.buildingArea == 0 ?
|
|
|
- projectInfo.buildingArea.toString().trim() : scMathUtil.roundTo(projectInfo.engineeringCost / projectInfo.buildingArea, perCostDecimal);
|
|
|
+ summarizeToParent(IDMapping[tender.ParentID], IDMapping[tender.ID]);
|
|
|
}
|
|
|
}
|
|
|
return IDMapping;
|