|
@@ -275,7 +275,7 @@ let calcTools = {
|
|
|
|
|
|
// 初始化前先拦截末定义的情况
|
|
|
if (!treeNode.data.feesIndex || !treeNode.data.feesIndex[feeObj.fieldName]){
|
|
|
- if (feeObj.unitFee == 0 && feeObj.totalFee == 0) return;
|
|
|
+ if (feeObj.unitFee == 0 && feeObj.totalFee == 0 && feeObj.tenderUnitFee == 0 && feeObj.tenderTotalFee == 0) return;
|
|
|
}
|
|
|
|
|
|
this.initFeeField(treeNode, feeObj.fieldName);
|
|
@@ -483,91 +483,113 @@ let calcTools = {
|
|
|
result = (result).toDecimal(decimalObj.ration.unitPrice);
|
|
|
return result;
|
|
|
},
|
|
|
- // 总造价清单、叶子清单、定额的暂估费。父清单是汇总子清单的暂估费,走计算程序逻辑,不在这里。
|
|
|
- estimateFee: function (treeNode, isBase, isTender){
|
|
|
- let me = this, sumU = 0, sumT = 0;
|
|
|
- let nodeQ = me.uiNodeQty(treeNode, isTender);
|
|
|
+ // 叶子清单、定额、总造价清单的暂估费。(父级清单是汇总子清单的暂估费,走计算程序逻辑,不在这里)
|
|
|
+ estimateFee: function (treeNode, isBase, isTender){ // isBase, isTender 这两个参数用于基数计算
|
|
|
+ let me = this, sumU = 0, sumT = 0, sumTU = 0, sumTT = 0;
|
|
|
+ let nodeQ = me.uiNodeQty(treeNode);
|
|
|
+ let nodeTQ = me.uiNodeTenderQty(treeNode);
|
|
|
let isGather = (projectObj.project.property.zanguCalcMode == zanguCalcType.gatherMaterial);
|
|
|
|
|
|
// 先汇总数量,再乘市场价。如果是叶子清单,进入这里的gljList中的材料,已经是同类材料跨定额汇总过的了。
|
|
|
function eTFee(){
|
|
|
- if (!treeNode.data.gljList) return 0;
|
|
|
+ let rst = {eT: 0, eTT: 0};
|
|
|
+ if (!treeNode.data.gljList) return rst;
|
|
|
+
|
|
|
let GLJObjs = [];
|
|
|
for (let glj of treeNode.data.gljList) {
|
|
|
if (!allMaterialTypes.includes(glj.type)) continue;
|
|
|
if (glj.isEstimate){
|
|
|
- GLJObjs.push({code: glj.code, name: glj.name, specs: glj.specs, unit: glj.unit, type: glj.type,
|
|
|
- // quantity: (nodeQ * glj.quantity).toDecimal(decimalObj.process),
|
|
|
- quantity: me.uiGLJQty((glj.totalQuantity)).toDecimal(decimalObj.process),
|
|
|
- marketPrice: glj.marketPrice});
|
|
|
+ let q = me.uiGLJQty((glj.totalQuantity)).toDecimal(decimalObj.process);
|
|
|
+ GLJObjs.push({code: glj.code, name: glj.name, specs: glj.specs, unit: glj.unit, type: glj.type, quantity: q,
|
|
|
+ marketPrice: glj.marketPrice, tenderQuantity: glj.tenderQuantity, tenderPrice: glj.tenderPrice});
|
|
|
}
|
|
|
else{ // 组成物
|
|
|
if (!compositionTypes.includes(glj.type)) continue;
|
|
|
let mds = projectObj.project.composition.getCompositionByGLJ(glj);
|
|
|
if (!mds) mds = [];
|
|
|
for (let md of mds){
|
|
|
- if (md.isEstimate){
|
|
|
- let isExist = false;
|
|
|
- // let totalQ = (nodeQ * me.uiGLJQty(glj.quantity)).toDecimal(decimalObj.glj.quantity);
|
|
|
- let totalQ = me.uiGLJQty((glj.totalQuantity)).toDecimal(decimalObj.glj.quantity);
|
|
|
- let mdQ = (totalQ * me.uiGLJQty(md.consumption)).toDecimal(decimalObj.process);
|
|
|
-
|
|
|
- for (let obj of GLJObjs){
|
|
|
- if (gljOprObj.getIndex(md, gljKeyArray) == gljOprObj.getIndex(obj, gljKeyArray)){
|
|
|
- isExist = true;
|
|
|
- obj.quantity = (obj.quantity + mdQ).toDecimal(decimalObj.glj.quantity);
|
|
|
- break;
|
|
|
- }
|
|
|
- };
|
|
|
- if (!isExist)
|
|
|
- GLJObjs.push({code: md.code, name: md.name, specs: md.specs, unit: md.unit, type: md.type,
|
|
|
- quantity: mdQ, marketPrice: md.marketPrice});
|
|
|
- }
|
|
|
+ if (!md.isEstimate) continue;
|
|
|
+ let isExist = false;
|
|
|
+ // let glj_totalQ = (nodeQ * me.uiGLJQty(glj.quantity)).toDecimal(decimalObj.glj.quantity);
|
|
|
+ let glj_totalQ = me.uiGLJQty((glj.totalQuantity)).toDecimal(decimalObj.glj.quantity);
|
|
|
+ let glj_tender_totalQ = (nodeTQ * me.uiGLJQty(glj.tenderQuantity)).toDecimal(decimalObj.glj.quantity);
|
|
|
+
|
|
|
+ let mdQ = (glj_totalQ * me.uiGLJQty(md.consumption)).toDecimal(decimalObj.process);
|
|
|
+ let mdTQ = (glj_tender_totalQ * me.uiGLJQty(md.consumption)).toDecimal(decimalObj.process);
|
|
|
+
|
|
|
+ for (let obj of GLJObjs){
|
|
|
+ if (gljOprObj.getIndex(md, gljKeyArray) == gljOprObj.getIndex(obj, gljKeyArray)){
|
|
|
+ isExist = true;
|
|
|
+ obj.quantity = (obj.quantity + mdQ).toDecimal(decimalObj.glj.quantity);
|
|
|
+ obj.tenderQuantity = (obj.tenderQuantity + mdTQ).toDecimal(decimalObj.glj.quantity);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ if (!isExist)
|
|
|
+ GLJObjs.push({code: md.code, name: md.name, specs: md.specs, unit: md.unit, type: md.type, quantity: mdQ,
|
|
|
+ marketPrice: md.marketPrice, tenderQuantity: mdTQ, tenderPrice: md.tenderPrice});
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
|
|
|
- let rst = 0;
|
|
|
for (let obj of GLJObjs){
|
|
|
- let tp = (me.uiGLJQty(obj.quantity) * me.uiGLJPrice(obj.marketPrice, obj)).toDecimal(decimalObj.bills.totalPrice);
|
|
|
- rst = (rst + tp).toDecimal(decimalObj.bills.totalPrice);
|
|
|
+ let t = (me.uiGLJQty(obj.quantity) * me.uiGLJPrice(obj.marketPrice, obj)).toDecimal(decimalObj.bills.totalPrice);
|
|
|
+ rst.eT = (rst.eT + t).toDecimal(decimalObj.bills.totalPrice);
|
|
|
+
|
|
|
+ let tt = (me.uiGLJQty(obj.tenderQuantity) * me.uiGLJPrice(obj.tenderPrice, obj)).toDecimal(decimalObj.bills.totalPrice);
|
|
|
+ rst.eTT = (rst.eTT + tt).toDecimal(decimalObj.bills.totalPrice);
|
|
|
};
|
|
|
return rst;
|
|
|
};
|
|
|
// 汇总子结点的暂估合价
|
|
|
function eTFeeByChildren(){
|
|
|
- let rst = 0;
|
|
|
+ let rst = {eT: 0, eTT: 0};
|
|
|
for (let node of treeNode.children){
|
|
|
if (node.data.feesIndex && node.data.feesIndex['estimate']) {
|
|
|
- rst = (rst + parseFloatPlus(node.data.feesIndex['estimate'].totalFee)).toDecimal(decimalObj.process);
|
|
|
+ rst.eT = (rst.eT + parseFloatPlus(node.data.feesIndex['estimate'].totalFee)).toDecimal(decimalObj.process);
|
|
|
+ rst.eTT = (rst.eTT + parseFloatPlus(node.data.feesIndex['estimate'].tenderTotalFee)).toDecimal(decimalObj.process);
|
|
|
};
|
|
|
};
|
|
|
- rst = (rst).toDecimal(decimalObj.bills.totalPrice);
|
|
|
+ rst.eT = (rst.eT).toDecimal(decimalObj.bills.totalPrice);
|
|
|
+ rst.eTT = (rst.eTT).toDecimal(decimalObj.bills.totalPrice);
|
|
|
return rst;
|
|
|
};
|
|
|
// 先数量乘市场价,再汇总
|
|
|
function eUFee(){
|
|
|
if (!treeNode.data.gljList) return 0;
|
|
|
- let rst = 0;
|
|
|
+ let rst = {eU: 0, eTU: 0};
|
|
|
for (let glj of treeNode.data.gljList) {
|
|
|
if (!allMaterialTypes.includes(glj.type)) continue;
|
|
|
if (glj.isEstimate){
|
|
|
- rst = rst + (me.uiGLJQty(glj.quantity) * me.uiGLJPrice(glj.marketPrice, glj)).toDecimal(decimalObj.process);
|
|
|
- rst = rst.toDecimal(decimalObj.process);
|
|
|
+ rst.eU = rst.eU + (me.uiGLJQty(glj.quantity) * me.uiGLJPrice(glj.marketPrice, glj)).toDecimal(decimalObj.process);
|
|
|
+ rst.eU = rst.eU.toDecimal(decimalObj.process);
|
|
|
+ // 不能直接用glj.tenderPrice,这个值不可靠。当调价界面删除单价系数后,tenderPrice没有实时计算,取得的值为0
|
|
|
+ // rst.eTU = rst.eTU + (me.uiGLJQty(glj.tenderQuantity) * me.uiGLJPrice(glj.tenderPrice, glj)).toDecimal(decimalObj.process);
|
|
|
+ rst.eTU = rst.eTU + (me.uiGLJQty(glj.tenderQuantity) * me.calcGLJTenderPrice(glj)).toDecimal(decimalObj.process);
|
|
|
+ rst.eTU = rst.eTU.toDecimal(decimalObj.process);
|
|
|
}
|
|
|
- else{ // 组成物
|
|
|
+ else{ // 组成物。
|
|
|
if (!compositionTypes.includes(glj.type)) continue;
|
|
|
let mds = projectObj.project.composition.getCompositionByGLJ(glj);
|
|
|
if (!mds) mds = [];
|
|
|
for (let md of mds){
|
|
|
if (!md.isEstimate) continue;
|
|
|
+
|
|
|
let mdU = (me.uiGLJQty(md.consumption) * me.uiGLJPrice(md.marketPrice)).toDecimal(decimalObj.glj.unitPrice);
|
|
|
- rst = rst + (mdU * me.uiGLJQty(glj.quantity)).toDecimal(decimalObj.process);
|
|
|
- rst = rst.toDecimal(decimalObj.process);
|
|
|
+ rst.eU = rst.eU + (mdU * me.uiGLJQty(glj.quantity)).toDecimal(decimalObj.process);
|
|
|
+ rst.eU = rst.eU.toDecimal(decimalObj.process);
|
|
|
+
|
|
|
+ // 调价时,数量只调到工料机级别,工料机下的组成物不调量(如机械、混凝土)。调价调的是工料机下的组成物的价。
|
|
|
+ let mdTU = (me.uiGLJQty(md.consumption) * me.calcGLJTenderPrice(md)).toDecimal(decimalObj.glj.unitPrice);
|
|
|
+ rst.eTU = rst.eTU + (mdTU * me.calcGLJTenderQty(treeNode, glj)).toDecimal(decimalObj.process);
|
|
|
+ rst.eTU = rst.eTU.toDecimal(decimalObj.process);
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
- rst = rst.toDecimal(decimalObj.bills.unitPrice);
|
|
|
+ rst.eU = rst.eU.toDecimal(decimalObj.bills.unitPrice);
|
|
|
+ rst.eTU = rst.eTU.toDecimal(decimalObj.bills.unitPrice);
|
|
|
return rst;
|
|
|
};
|
|
|
|
|
@@ -576,56 +598,87 @@ let calcTools = {
|
|
|
let nodes = projectObj.project.mainTree.roots;
|
|
|
for (let node of nodes){
|
|
|
if (me.isTotalCostBill(node)) break;
|
|
|
- let eU = 0, eT = 0;
|
|
|
+ let eU = 0, eT = 0, eTU = 0, eTT = 0;
|
|
|
if (node.data.feesIndex && node.data.feesIndex.estimate){
|
|
|
eU = node.data.feesIndex.estimate.unitFee;
|
|
|
eT = node.data.feesIndex.estimate.totalFee;
|
|
|
+ eTU = node.data.feesIndex.estimate.tenderUnitFee;
|
|
|
+ eTT = node.data.feesIndex.estimate.tenderTotalFee;
|
|
|
}
|
|
|
else {
|
|
|
- eU = 0, eT = 0;
|
|
|
+ eU = 0, eT = 0, eTU = 0, eTT = 0;
|
|
|
};
|
|
|
sumU = (sumU + parseFloatPlus(eU)).toDecimal(decimalObj.process);
|
|
|
sumT = (sumT + parseFloatPlus(eT)).toDecimal(decimalObj.process);
|
|
|
+ sumTU = (sumTU + parseFloatPlus(eTU)).toDecimal(decimalObj.process);
|
|
|
+ sumTT = (sumTT + parseFloatPlus(eTT)).toDecimal(decimalObj.process);
|
|
|
};
|
|
|
sumU = (sumU).toDecimal(decimalObj.bills.unitPrice);
|
|
|
sumT = (sumT).toDecimal(decimalObj.bills.totalPrice);
|
|
|
+ sumTU = (sumTU).toDecimal(decimalObj.bills.unitPrice);
|
|
|
+ sumTT = (sumTT).toDecimal(decimalObj.bills.totalPrice);
|
|
|
}
|
|
|
else if (me.isParentBill(treeNode)){ // 父清单不要汇总单价。
|
|
|
- sumT = eTFeeByChildren();
|
|
|
+ let eTFBC = eTFeeByChildren();
|
|
|
+ sumT = eTFBC.eT;
|
|
|
+ sumTT = eTFBC.eTT;
|
|
|
sumU = undefined;
|
|
|
+ sumTU = undefined;
|
|
|
}
|
|
|
else if (me.isLeafBill(treeNode)){
|
|
|
if (projectObj.project.Bills.isEngineerEst(treeNode)){
|
|
|
if (treeNode.data.feesIndex['common'] != undefined){
|
|
|
sumT = treeNode.data.feesIndex['common'].totalFee;
|
|
|
sumU = treeNode.data.feesIndex['common'].unitFee;
|
|
|
+ sumTT = treeNode.data.feesIndex['common'].tenderTotalFee;
|
|
|
+ sumTU = treeNode.data.feesIndex['common'].tenderUnitFee;
|
|
|
}
|
|
|
}
|
|
|
else{
|
|
|
if (isGather){
|
|
|
me.getGLJList(treeNode, false);
|
|
|
- sumT = eTFee();
|
|
|
+ let eTF = eTFee();
|
|
|
+ sumT = eTF.eT;
|
|
|
+ sumTT = eTF.eTT;
|
|
|
}
|
|
|
- else
|
|
|
- sumT = eTFeeByChildren();
|
|
|
+ else{
|
|
|
+ let eTFBC = eTFeeByChildren();
|
|
|
+ sumT = eTFBC.eT;
|
|
|
+ sumTT = eTFBC.eTT;
|
|
|
+ };
|
|
|
|
|
|
let q = nodeQ ? nodeQ : 1;
|
|
|
sumU = (sumT / q).toDecimal(decimalObj.bills.totalPrice);
|
|
|
+ let tq = nodeTQ ? nodeTQ : 1;
|
|
|
+ sumTU = (sumTT / tq).toDecimal(decimalObj.bills.totalPrice);
|
|
|
}
|
|
|
}
|
|
|
else if (me.isRationCategory(treeNode)){
|
|
|
me.getGLJList(treeNode, false);
|
|
|
|
|
|
- sumU = eUFee();
|
|
|
- if (isBase) return sumU;
|
|
|
+ let eUF = eUFee();
|
|
|
+ sumU = eUF.eU;
|
|
|
+ sumTU = eUF.eTU;
|
|
|
+ if (isBase) {
|
|
|
+ if (isTender)
|
|
|
+ return sumTU
|
|
|
+ else
|
|
|
+ return sumU;
|
|
|
+ };
|
|
|
|
|
|
- if (isGather)
|
|
|
- sumT = eTFee()
|
|
|
- else
|
|
|
+ if (isGather){
|
|
|
+ let eTF = eTFee();
|
|
|
+ sumT = eTF.eT;
|
|
|
+ sumTT = eTF.eTT;
|
|
|
+ }
|
|
|
+ else{
|
|
|
sumT = (nodeQ * sumU).toDecimal(decimalObj.ration.totalPrice);
|
|
|
+ sumTT = (nodeTQ * sumTU).toDecimal(decimalObj.ration.totalPrice);
|
|
|
+ }
|
|
|
};
|
|
|
|
|
|
- me.checkFeeField(treeNode, {'fieldName': 'estimate', 'unitFee': sumU, 'totalFee': sumT});
|
|
|
+ me.checkFeeField(treeNode, {'fieldName': 'estimate', 'unitFee': sumU, 'totalFee': sumT,
|
|
|
+ 'tenderUnitFee': sumTU, 'tenderTotalFee': sumTT});
|
|
|
},
|
|
|
marketPriceToBase: function (treeNode, baseName, isTender) {
|
|
|
if (treeNode.data.type != rationType.volumePrice && treeNode.data.type != rationType.gljRation) return;
|
|
@@ -879,7 +932,7 @@ let calcTools = {
|
|
|
calcGLJTenderQty: function (treeNode, glj){
|
|
|
if (treeNode.data.quantityCoe == undefined){
|
|
|
glj.tenderQuantity = glj.quantity;
|
|
|
- return;
|
|
|
+ return glj.tenderQuantity;
|
|
|
};
|
|
|
|
|
|
let qCoe = 1;
|
|
@@ -907,6 +960,7 @@ let calcTools = {
|
|
|
};
|
|
|
}
|
|
|
glj.tenderQuantity = (glj.quantity * qCoe).toDecimal(decimalObj.glj.quantity);
|
|
|
+ return glj.tenderQuantity;
|
|
|
},
|
|
|
calcGLJTenderPrice: function (glj) {
|
|
|
let projGLJ = calcTools.getProjectGLJ(glj);
|
|
@@ -920,6 +974,7 @@ let calcTools = {
|
|
|
};
|
|
|
glj.tenderPrice = (glj.marketPrice * pCoe).toDecimal(decimalObj.glj.unitPrice);
|
|
|
};
|
|
|
+ return glj.tenderPrice;
|
|
|
},
|
|
|
// 界面显示的工料机价格,包括定额价、市场价等。参数 price 传入一个普通的价格数值即可。
|
|
|
uiGLJPrice: function (price, glj){
|