|
@@ -211,6 +211,16 @@ let calcTools = {
|
|
|
treeNode.data.feesIndex[feeObj.fieldName].totalFee = feeObj.totalFee;
|
|
|
treeNode.changed = true;
|
|
|
};
|
|
|
+
|
|
|
+ if (treeNode.data.feesIndex[feeObj.fieldName].tenderUnitFee != feeObj.tenderUnitFee){
|
|
|
+ treeNode.data.feesIndex[feeObj.fieldName].tenderUnitFee = feeObj.tenderUnitFee;
|
|
|
+ treeNode.changed = true;
|
|
|
+ };
|
|
|
+
|
|
|
+ if (treeNode.data.feesIndex[feeObj.fieldName].tenderTotalFee != feeObj.tenderTotalFee){
|
|
|
+ treeNode.data.feesIndex[feeObj.fieldName].tenderTotalFee = feeObj.tenderTotalFee;
|
|
|
+ treeNode.changed = true;
|
|
|
+ };
|
|
|
},
|
|
|
setFieldValue: function (treeNode, fieldName, value){
|
|
|
if (fieldName.includes('feesIndex')){
|
|
@@ -245,31 +255,29 @@ let calcTools = {
|
|
|
else
|
|
|
return 0;
|
|
|
},
|
|
|
- rationBaseFee: function (treeNode, gljTypes, priceType){
|
|
|
+ rationBaseFee: function (treeNode, gljTypes, priceType, isTender){
|
|
|
if (!treeNode.data.gljList) return 0;
|
|
|
let me = this, result = 0;
|
|
|
let price = 0, temp = 0, temp2 = 0;
|
|
|
for (let glj of treeNode.data.gljList) {
|
|
|
if (gljTypes.indexOf(glj.type) >= 0) {
|
|
|
-/* if (priceType == priceTypes.ptDiffPrice){
|
|
|
- let aprice = me.uiGLJPrice(glj["adjustPrice"]);
|
|
|
- let mprice = me.uiGLJPrice(glj["marketPrice"]);
|
|
|
- temp = (me.uiGLJQty(glj["quantity"]) * mprice).toDecimal(decimalObj.process) - (me.uiGLJQty(glj["quantity"]) * aprice).toDecimal(decimalObj.process);
|
|
|
- temp = temp.toDecimal(decimalObj.process);
|
|
|
- }*/
|
|
|
+ calcTools.calcGLJTenderPrice(glj);
|
|
|
+ calcTools.calcGLJTenderQty(treeNode, glj);
|
|
|
+ let qty = isTender ? me.uiGLJQty(glj["tenderQuantity"]) : me.uiGLJQty(glj["quantity"]);
|
|
|
+ let mprice = isTender ? me.uiGLJPrice(glj["tenderPrice"]) : me.uiGLJPrice(glj["marketPrice"]);
|
|
|
+ let aprice = me.uiGLJPrice(glj["adjustPrice"]);
|
|
|
+
|
|
|
if (priceType == priceTypes.ptDiffPrice){
|
|
|
- let aprice = me.uiGLJPrice(glj["adjustPrice"]);
|
|
|
- let mprice = me.uiGLJPrice(glj["marketPrice"]);
|
|
|
if (aprice != mprice){
|
|
|
- temp = (temp + (me.uiGLJQty(glj["quantity"]) * mprice).toDecimal(decimalObj.process)).toDecimal(decimalObj.process);
|
|
|
- temp2 = (temp2 + (me.uiGLJQty(glj["quantity"]) * aprice).toDecimal(decimalObj.process)).toDecimal(decimalObj.process);
|
|
|
+ temp = (temp + (qty * mprice).toDecimal(decimalObj.process)).toDecimal(decimalObj.process);
|
|
|
+ temp2 = (temp2 + (qty * aprice).toDecimal(decimalObj.process)).toDecimal(decimalObj.process);
|
|
|
}
|
|
|
}
|
|
|
else {
|
|
|
if (priceType == priceTypes.ptBasePrice){ price = me.uiGLJPrice(glj["basePrice"]);}
|
|
|
- else if (priceType == priceTypes.ptAdjustPrice){price = me.uiGLJPrice(glj["adjustPrice"]);}
|
|
|
- else if (priceType == priceTypes.ptMarketPrice){price = me.uiGLJPrice(glj["marketPrice"]);}
|
|
|
- temp = (me.uiGLJQty(glj["quantity"]) * price).toDecimal(decimalObj.process);
|
|
|
+ else if (priceType == priceTypes.ptAdjustPrice){price = aprice;}
|
|
|
+ else if (priceType == priceTypes.ptMarketPrice){price = mprice;}
|
|
|
+ temp = (qty * price).toDecimal(decimalObj.process);
|
|
|
result = (result + temp).toDecimal(decimalObj.process);
|
|
|
};
|
|
|
};
|
|
@@ -284,12 +292,19 @@ let calcTools = {
|
|
|
|
|
|
return result;
|
|
|
},
|
|
|
- machineLabourFee: function (gljArr) {
|
|
|
+ machineLabourFee: function (treeNode, gljArr, isTender) {
|
|
|
if (!gljArr) return 0;
|
|
|
let result = 0;
|
|
|
for (let glj of gljArr) {
|
|
|
if (glj.type == gljType.GENERAL_MACHINE) {
|
|
|
- // 获取机械组成物
|
|
|
+ let gljQ;
|
|
|
+ if (isTender){
|
|
|
+ calcTools.calcGLJTenderQty(treeNode, glj);
|
|
|
+ gljQ = glj.tenderQuantity;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ gljQ = glj.quantity;
|
|
|
+ // 获取机械组成物(调价不深入到组成物)
|
|
|
let mds = projectObj.project.composition.getCompositionByGLJ(glj);
|
|
|
if (!mds) mds = [];
|
|
|
let mdSum = 0;
|
|
@@ -301,16 +316,16 @@ let calcTools = {
|
|
|
mdSum = (mdSum).toDecimal(decimalObj.ration.unitPrice);
|
|
|
}
|
|
|
}
|
|
|
- result = result + (glj["quantity"] * mdSum).toDecimal(decimalObj.ration.unitPrice);
|
|
|
+ result = result + (gljQ * mdSum).toDecimal(decimalObj.ration.unitPrice);
|
|
|
result = (result).toDecimal(decimalObj.ration.unitPrice);
|
|
|
}
|
|
|
}
|
|
|
return result;
|
|
|
},
|
|
|
// 总造价清单、叶子清单、定额的暂估费。父清单是汇总子清单的暂估费,走计算程序逻辑,不在这里。
|
|
|
- estimateFee: function (treeNode, isBase = false){
|
|
|
+ estimateFee: function (treeNode, isBase, isTender){
|
|
|
let me = this, sumU = 0, sumT = 0;
|
|
|
- let nodeQ = me.uiNodeQty(treeNode);
|
|
|
+ let nodeQ = me.uiNodeQty(treeNode, isTender);
|
|
|
let isGather = (projectObj.project.property.zanguCalcMode == zanguCalcType.gatherMaterial);
|
|
|
|
|
|
// 先汇总数量,再乘市场价。如果是叶子清单,进入这里的gljList中的材料,已经是同类材料跨定额汇总过的了。
|
|
@@ -443,7 +458,7 @@ let calcTools = {
|
|
|
|
|
|
me.checkFeeField(treeNode, {'fieldName': 'estimate', 'unitFee': sumU, 'totalFee': sumT});
|
|
|
},
|
|
|
- marketPriceToBase: function (treeNode, baseName) {
|
|
|
+ marketPriceToBase: function (treeNode, baseName, isTender) {
|
|
|
if (treeNode.data.type != rationType.volumePrice && treeNode.data.type != rationType.gljRation) return;
|
|
|
let result = 0, me = this;
|
|
|
if (
|
|
@@ -468,7 +483,7 @@ let calcTools = {
|
|
|
'quantity': 1,
|
|
|
'type': treeNode.data.subType // 注意:这里要取subType
|
|
|
};
|
|
|
- result = me.machineLabourFee([glj]);
|
|
|
+ result = me.machineLabourFee(treeNode, [glj], isTender);
|
|
|
}
|
|
|
else if (
|
|
|
(treeNode.data.type == rationType.gljRation) &&
|
|
@@ -482,7 +497,7 @@ let calcTools = {
|
|
|
}
|
|
|
return result;
|
|
|
},
|
|
|
- partASupplyFee: function (treeNode, baseName) {
|
|
|
+ partASupplyFee: function (treeNode, baseName, isTender) {
|
|
|
if (!treeNode.data.gljList) return 0;
|
|
|
let projectGLJ = projectObj.project.projectGLJ;
|
|
|
|
|
@@ -536,16 +551,26 @@ let calcTools = {
|
|
|
|
|
|
let sum = 0;
|
|
|
for (let glj of treeNode.data.gljList){
|
|
|
+ let gljQ;
|
|
|
+ if (isTender){
|
|
|
+ calcTools.calcGLJTenderQty(treeNode, glj);
|
|
|
+ gljQ = glj.tenderQuantity;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ gljQ = glj.quantity;
|
|
|
+
|
|
|
let X = 1; // 部分甲供系数(默认1,即完全甲供)
|
|
|
let tempSGLJ = supplyGLJsIdx[glj.projectGLJID];
|
|
|
// 当前材料是甲供材料:①普通 ②商品硂等不计组成物的母体材料
|
|
|
if (tempSGLJ) {
|
|
|
// 处理部分甲供
|
|
|
if (baseName.includes('甲供') && (tempSGLJ.supply == supplyType.BFJG)){
|
|
|
- let Q = tempSGLJ.quantity ? tempSGLJ.quantity : 1;
|
|
|
+ // let Q = isTender ? tempSGLJ.tenderQuantity : tempSGLJ.quantity;
|
|
|
+ let Q = tempSGLJ.quantity;
|
|
|
+ Q = Q ? Q : 1;
|
|
|
X = tempSGLJ.supply_quantity / Q;
|
|
|
}
|
|
|
- sum = (sum + glj.basePrice * glj.quantity * X).toDecimal(decimalObj.process);
|
|
|
+ sum = (sum + glj.basePrice * gljQ * X).toDecimal(decimalObj.process);
|
|
|
}
|
|
|
else{ // 当前材料不是甲供材料
|
|
|
if (compT.includes(glj.type)) { // 混凝土等。组成物的母体,母体如果有组成物,则母体无法作为甲供材料,无法设置,此时要看其组成物是否是甲供材料;母体如果没有组成物,则母体有可能成为甲供材料。
|
|
@@ -558,7 +583,7 @@ let calcTools = {
|
|
|
if (baseName.includes('甲供') && (c.supply == supplyType.BFJG)){
|
|
|
X = c.supplyX;
|
|
|
};
|
|
|
- sum = (sum + c.basePrice * c.consumption * glj.quantity * X).toDecimal(decimalObj.process);
|
|
|
+ sum = (sum + c.basePrice * c.consumption * gljQ * X).toDecimal(decimalObj.process);
|
|
|
}
|
|
|
}
|
|
|
};
|
|
@@ -639,6 +664,46 @@ let calcTools = {
|
|
|
uiNodeQty: function (treeNode){
|
|
|
return parseFloatPlus(treeNode.data.quantity).toDecimal(decimalObj.decimal("quantity", treeNode));
|
|
|
},
|
|
|
+ calcNodeTenderQty: function (treeNode){
|
|
|
+ let qCoe = (treeNode.data.rationQuantityCoe == undefined) ? 1 : treeNode.data.rationQuantityCoe;
|
|
|
+ treeNode.data.tenderQuantity = (this.uiNodeQty(treeNode) * qCoe).toDecimal(decimalObj.decimal("quantity", treeNode));
|
|
|
+ },
|
|
|
+ calcGLJTenderQty: function (treeNode, glj){
|
|
|
+ if (treeNode.data.quantityCoe == undefined){
|
|
|
+ glj.tenderQuantity = glj.quantity;
|
|
|
+ return;
|
|
|
+ };
|
|
|
+
|
|
|
+ let qCoe = 1;
|
|
|
+ if (gljType.LABOUR == glj.type){
|
|
|
+ if (treeNode.data.quantityCoe.labour)
|
|
|
+ qCoe = treeNode.data.quantityCoe.labour;
|
|
|
+ }
|
|
|
+ else if (baseMaterialTypes.indexOf(glj.type)){
|
|
|
+ if (treeNode.data.quantityCoe.material)
|
|
|
+ qCoe = treeNode.data.quantityCoe.material;
|
|
|
+ }
|
|
|
+ else if (baseMachineTypes.indexOf(glj.type)){
|
|
|
+ if (treeNode.data.quantityCoe.machine)
|
|
|
+ qCoe = treeNode.data.quantityCoe.machine;
|
|
|
+ }
|
|
|
+ else if (gljType.MAIN_MATERIAL == glj.type){
|
|
|
+ if (treeNode.data.quantityCoe.main)
|
|
|
+ qCoe = treeNode.data.quantityCoe.main;
|
|
|
+ }
|
|
|
+ else if (gljType.EQUIPMENT == glj.type){
|
|
|
+ if (treeNode.data.quantityCoe.equipment)
|
|
|
+ qCoe = treeNode.data.quantityCoe.equipment;
|
|
|
+ };
|
|
|
+
|
|
|
+ glj.tenderQuantity = (glj.quantity * qCoe).toDecimal(decimalObj.glj.quantity);
|
|
|
+ },
|
|
|
+ calcGLJTenderPrice: function (glj) {
|
|
|
+ let pCoe = 1;
|
|
|
+ if (projectObj.project.property.tenderSetting && projectObj.project.property.tenderSetting.gljPriceTenderCoe)
|
|
|
+ pCoe = projectObj.project.property.tenderSetting.gljPriceTenderCoe;
|
|
|
+ glj.tenderPrice = (glj.marketPrice * pCoe).toDecimal(decimalObj.glj.unitPrice);
|
|
|
+ },
|
|
|
// 界面显示的工料机价格,包括定额价、市场价等。参数 price 传入一个普通的价格数值即可。
|
|
|
uiGLJPrice: function (price){
|
|
|
if (price)
|
|
@@ -718,99 +783,109 @@ const calcBaseNames = {
|
|
|
};
|
|
|
|
|
|
const rationCalcBases = {
|
|
|
- '定额基价人工费': function (node) {
|
|
|
- return calcTools.rationBaseFee(node, [gljType.LABOUR], priceTypes.ptBasePrice);
|
|
|
+ '定额基价人工费': function (node, isTender) {
|
|
|
+ return calcTools.rationBaseFee(node, [gljType.LABOUR], priceTypes.ptBasePrice, isTender);
|
|
|
},
|
|
|
- '定额基价材料费': function (node) {
|
|
|
- return calcTools.rationBaseFee(node, baseMaterialTypes, priceTypes.ptBasePrice);
|
|
|
+ '定额基价材料费': function (node, isTender) {
|
|
|
+ return calcTools.rationBaseFee(node, baseMaterialTypes, priceTypes.ptBasePrice, isTender);
|
|
|
},
|
|
|
- '定额基价机械费': function (node) {
|
|
|
- return calcTools.rationBaseFee(node, [gljType.GENERAL_MACHINE], priceTypes.ptBasePrice);
|
|
|
+ '定额基价机械费': function (node, isTender) {
|
|
|
+ return calcTools.rationBaseFee(node, [gljType.GENERAL_MACHINE], priceTypes.ptBasePrice, isTender);
|
|
|
},
|
|
|
- '定额基价机上人工费': function (node) {
|
|
|
- return calcTools.machineLabourFee(node.data.gljList);
|
|
|
+ '定额基价机上人工费': function (node, isTender) {
|
|
|
+ return calcTools.machineLabourFee(node, node.data.gljList, isTender);
|
|
|
},
|
|
|
- '人工费价差': function (node) {
|
|
|
- return calcTools.rationBaseFee(node, [gljType.LABOUR], priceTypes.ptDiffPrice);
|
|
|
+ '人工费价差': function (node, isTender) {
|
|
|
+ return calcTools.rationBaseFee(node, [gljType.LABOUR], priceTypes.ptDiffPrice, isTender);
|
|
|
},
|
|
|
- '材料费价差': function (node) {
|
|
|
- return calcTools.rationBaseFee(node, baseMaterialTypes, priceTypes.ptDiffPrice);
|
|
|
+ '材料费价差': function (node, isTender) {
|
|
|
+ return calcTools.rationBaseFee(node, baseMaterialTypes, priceTypes.ptDiffPrice, isTender);
|
|
|
},
|
|
|
- '机械费价差': function (node) {
|
|
|
- return calcTools.rationBaseFee(node, [gljType.GENERAL_MACHINE], priceTypes.ptDiffPrice);
|
|
|
+ '机械费价差': function (node, isTender) {
|
|
|
+ return calcTools.rationBaseFee(node, [gljType.GENERAL_MACHINE], priceTypes.ptDiffPrice, isTender);
|
|
|
},
|
|
|
- '主材费': function (node) {
|
|
|
- return calcTools.rationBaseFee(node, [gljType.MAIN_MATERIAL], priceTypes.ptMarketPrice);
|
|
|
+ '主材费': function (node, isTender) {
|
|
|
+ return calcTools.rationBaseFee(node, [gljType.MAIN_MATERIAL], priceTypes.ptMarketPrice, isTender);
|
|
|
},
|
|
|
- '设备费': function (node) {
|
|
|
- return calcTools.rationBaseFee(node, [gljType.EQUIPMENT], priceTypes.ptMarketPrice);
|
|
|
+ '设备费': function (node, isTender) {
|
|
|
+ return calcTools.rationBaseFee(node, [gljType.EQUIPMENT], priceTypes.ptMarketPrice, isTender);
|
|
|
},
|
|
|
- '人工工日': function (node) {
|
|
|
+ '人工工日': function (node, isTender) {
|
|
|
if (!node.data.gljList) return 0;
|
|
|
let rst = 0;
|
|
|
+
|
|
|
+ calcTools.uiNodeQty(node)
|
|
|
for (let glj of node.data.gljList) {
|
|
|
if (glj.type == gljType.LABOUR) {
|
|
|
- rst = rst + (calcTools.uiGLJQty(glj["quantity"]) * calcTools.uiNodeQty(node)).toDecimal(decimalObj.process);
|
|
|
+ let gljQ;
|
|
|
+ if (isTender){
|
|
|
+ calcTools.calcGLJTenderQty(node, glj);
|
|
|
+ gljQ = glj.tenderQuantity;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ gljQ = glj.quantity;
|
|
|
+
|
|
|
+ rst = rst + (gljQ * calcTools.uiNodeQty(node)).toDecimal(decimalObj.process);
|
|
|
rst = rst.toDecimal(decimalObj.process);
|
|
|
}
|
|
|
};
|
|
|
return rst.toDecimal(decimalObj.glj.quantity);
|
|
|
},
|
|
|
- '甲供定额基价人工费': function (node) {
|
|
|
- return calcTools.partASupplyFee(node, calcBaseNames.JGDEJJRGF);
|
|
|
+ '甲供定额基价人工费': function (node, isTender) {
|
|
|
+ return calcTools.partASupplyFee(node, calcBaseNames.JGDEJJRGF, isTender);
|
|
|
},
|
|
|
- '甲供定额基价材料费': function (node) {
|
|
|
- return calcTools.partASupplyFee(node, calcBaseNames.JGDEJJCLF);
|
|
|
+ '甲供定额基价材料费': function (node, isTender) {
|
|
|
+ return calcTools.partASupplyFee(node, calcBaseNames.JGDEJJCLF, isTender);
|
|
|
},
|
|
|
- '甲供定额基价机械费': function (node) {
|
|
|
- return calcTools.partASupplyFee(node, calcBaseNames.JGDEJJJXF);
|
|
|
+ '甲供定额基价机械费': function (node, isTender) {
|
|
|
+ return calcTools.partASupplyFee(node, calcBaseNames.JGDEJJJXF, isTender);
|
|
|
},
|
|
|
- '甲供主材费': function (node) {
|
|
|
- return calcTools.partASupplyFee(node, calcBaseNames.JGZCF);
|
|
|
+ '甲供主材费': function (node, isTender) {
|
|
|
+ return calcTools.partASupplyFee(node, calcBaseNames.JGZCF, isTender);
|
|
|
},
|
|
|
- '甲供设备费': function (node) {
|
|
|
- return calcTools.partASupplyFee(node, calcBaseNames.JGSBF);
|
|
|
+ '甲供设备费': function (node, isTender) {
|
|
|
+ return calcTools.partASupplyFee(node, calcBaseNames.JGSBF, isTender);
|
|
|
},
|
|
|
- '甲定定额基价人工费': function (node) {
|
|
|
- return calcTools.partASupplyFee(node, calcBaseNames.JDDEJJRGF);
|
|
|
+ '甲定定额基价人工费': function (node, isTender) {
|
|
|
+ return calcTools.partASupplyFee(node, calcBaseNames.JDDEJJRGF, isTender);
|
|
|
},
|
|
|
- '甲定定额基价材料费': function (node) {
|
|
|
- return calcTools.partASupplyFee(node, calcBaseNames.JDDEJJCLF);
|
|
|
+ '甲定定额基价材料费': function (node, isTender) {
|
|
|
+ return calcTools.partASupplyFee(node, calcBaseNames.JDDEJJCLF, isTender);
|
|
|
},
|
|
|
- '甲定定额基价机械费': function (node) {
|
|
|
- return calcTools.partASupplyFee(node, calcBaseNames.JDDEJJJXF);
|
|
|
+ '甲定定额基价机械费': function (node, isTender) {
|
|
|
+ return calcTools.partASupplyFee(node, calcBaseNames.JDDEJJJXF, isTender);
|
|
|
},
|
|
|
- '甲定主材费': function (node) {
|
|
|
- return calcTools.partASupplyFee(node, calcBaseNames.JDZCF);
|
|
|
+ '甲定主材费': function (node, isTender) {
|
|
|
+ return calcTools.partASupplyFee(node, calcBaseNames.JDZCF, isTender);
|
|
|
},
|
|
|
- '甲定设备费': function (node) {
|
|
|
- return calcTools.partASupplyFee(node, calcBaseNames.JDSBF);
|
|
|
+ '甲定设备费': function (node, isTender) {
|
|
|
+ return calcTools.partASupplyFee(node, calcBaseNames.JDSBF, isTender);
|
|
|
},
|
|
|
- '暂估材料费': function (node) {
|
|
|
- return calcTools.estimateFee(node, true);
|
|
|
+ '暂估材料费': function (node, isTender) {
|
|
|
+ return calcTools.estimateFee(node, true, isTender);
|
|
|
},
|
|
|
- '分包定额基价人工费': function (node) {
|
|
|
- if (node.data.isSubcontract) return this.定额基价人工费(node)
|
|
|
+ '分包定额基价人工费': function (node, isTender) {
|
|
|
+ if (node.data.isSubcontract) return this.定额基价人工费(node, isTender)
|
|
|
else return 0;
|
|
|
},
|
|
|
- '分包定额基价材料费': function (node) {
|
|
|
- if (node.data.isSubcontract) return this.定额基价材料费(node)
|
|
|
+ '分包定额基价材料费': function (node, isTender) {
|
|
|
+ if (node.data.isSubcontract) return this.定额基价材料费(node, isTender)
|
|
|
else return 0;
|
|
|
},
|
|
|
- '分包定额基价机械费': function (node) {
|
|
|
- if (node.data.isSubcontract) return this.定额基价机械费(node)
|
|
|
+ '分包定额基价机械费': function (node, isTender) {
|
|
|
+ if (node.data.isSubcontract) return this.定额基价机械费(node, isTender)
|
|
|
else return 0;
|
|
|
},
|
|
|
- '分包主材费': function (node) {
|
|
|
- if (node.data.isSubcontract) return this.主材费(node)
|
|
|
+ '分包主材费': function (node, isTender) {
|
|
|
+ if (node.data.isSubcontract) return this.主材费(node, isTender)
|
|
|
else return 0;
|
|
|
},
|
|
|
- '分包设备费': function (node) {
|
|
|
- if (node.data.isSubcontract) return this.设备费(node)
|
|
|
+ '分包设备费': function (node, isTender) {
|
|
|
+ if (node.data.isSubcontract) return this.设备费(node, isTender)
|
|
|
else return 0;
|
|
|
},
|
|
|
- '分包人工工日': function (node) {
|
|
|
- if (node.data.isSubcontract) return this.人工工日(node)
|
|
|
+ '分包人工工日': function (node, isTender) {
|
|
|
+ if (node.data.isSubcontract) return this.人工工日(node, isTender)
|
|
|
else return 0;
|
|
|
}
|
|
|
};
|
|
@@ -1004,14 +1079,18 @@ let analyzer = {
|
|
|
});
|
|
|
for (var i = 0; i < atIDArr.length; i++) {
|
|
|
let patt = new RegExp(atIDArr[i]);
|
|
|
- let val = `$CE.at(${IDArr[i]})`;
|
|
|
+ let val = `$CE.at(${IDArr[i]}, false)`;
|
|
|
rst = rst.replace(patt, val);
|
|
|
};
|
|
|
rst = rst.replace(/\[/g, "$CE.base('");
|
|
|
- rst = rst.replace(/\]/g, "')");
|
|
|
+ rst = rst.replace(/\]/g, "', false)");
|
|
|
rst = rst.replace(/L/g, labourCoe);
|
|
|
return rst;
|
|
|
},
|
|
|
+ getCompiledTenderExpr: function (compiledExpr) {
|
|
|
+ let rst = compiledExpr.replace(/false/g, "true");
|
|
|
+ return rst;
|
|
|
+ },
|
|
|
getStatement: function (expression, template) {
|
|
|
let rst = expression;
|
|
|
let atIDArr = analyzer.getAtIDArr(rst);
|
|
@@ -1108,25 +1187,25 @@ let executeObj = {
|
|
|
template: null,
|
|
|
tempCalcItem: null,
|
|
|
|
|
|
- at: function(ID) {
|
|
|
- let me = executeObj;
|
|
|
- let rst = me.template.compiledCalcItems[ID].unitFee;
|
|
|
+ at: function(ID, isTender) {
|
|
|
+ let item = executeObj.template.compiledCalcItems[ID];
|
|
|
+ let rst = isTender ? item.tenderUnitFee : item.unitFee;
|
|
|
rst = parseFloat(rst);
|
|
|
return rst;
|
|
|
},
|
|
|
- base: function(baseName) {
|
|
|
+ base: function(baseName, isTender) {
|
|
|
let me = executeObj;
|
|
|
|
|
|
// 量价、工料机形式的定额, 要把自己的市场单价用于计算程序中的基数。
|
|
|
if (calcTools.isVolumePrice(me.treeNode) || calcTools.isGljRation(me.treeNode))
|
|
|
- return calcTools.marketPriceToBase(me.treeNode, baseName)
|
|
|
+ return calcTools.marketPriceToBase(me.treeNode, baseName, isTender)
|
|
|
else{
|
|
|
if (!rationCalcBases[baseName]){
|
|
|
hintBox.infoBox('系统提示', '定额基数“' + baseName + '”末定义,计算错误。 (模板 ' + me.template.ID + ',规则 ' + me.tempCalcItem.ID +')', 1);
|
|
|
return 0;
|
|
|
}
|
|
|
else
|
|
|
- return rationCalcBases[baseName](me.treeNode);
|
|
|
+ return rationCalcBases[baseName](me.treeNode, isTender);
|
|
|
}
|
|
|
},
|
|
|
HJ: function () {
|
|
@@ -1613,10 +1692,16 @@ class CalcProgram {
|
|
|
if (calcItem.feeRate != undefined)
|
|
|
feeRate = parseFloat(calcItem.feeRate).toDecimal(decimalObj.feeRate);
|
|
|
// console.log(`[${calcItem.ID}]: ${calcItem.compiledExpr}`); // for test.
|
|
|
- calcItem.unitFee = (eval(calcItem.compiledExpr) * feeRate * 0.01).toDecimal(decimalObj.decimal('unitPrice', treeNode)); // 如果eval()对清单树有影响,就换成小麦的Expression对象再试
|
|
|
|
|
|
- let q = calcTools.uiNodeQty(treeNode) ? calcTools.uiNodeQty(treeNode) : 0;
|
|
|
- calcItem.totalFee = (calcItem.unitFee * q).toDecimal(decimalObj.decimal('totalPrice', treeNode));
|
|
|
+ calcItem.unitFee = (eval(calcItem.compiledExpr) * feeRate * 0.01).toDecimal(decimalObj.decimal('unitPrice', treeNode));
|
|
|
+ calcItem.totalFee = (calcItem.unitFee * calcTools.uiNodeQty(treeNode)).toDecimal(decimalObj.decimal('totalPrice', treeNode));
|
|
|
+
|
|
|
+ if (isTender) {
|
|
|
+ calcTools.calcNodeTenderQty(treeNode);
|
|
|
+ let tExpr = analyzer.getCompiledTenderExpr(calcItem.compiledExpr);
|
|
|
+ calcItem.tenderUnitFee = (eval(tExpr) * feeRate * 0.01).toDecimal(decimalObj.decimal('unitPrice', treeNode));
|
|
|
+ calcItem.tenderTotalFee = (calcItem.tenderUnitFee * treeNode.data.tenderQuantity).toDecimal(decimalObj.decimal('totalPrice', treeNode));
|
|
|
+ };
|
|
|
|
|
|
if (calcItem.fieldName) {
|
|
|
fnArr.push(calcItem.fieldName);
|
|
@@ -1634,22 +1719,22 @@ class CalcProgram {
|
|
|
};
|
|
|
|
|
|
// 计算本节点、所有父节点(默认,可选)、公式引用节点(默认,可选)。
|
|
|
- calculate(treeNode, calcParents = true, calcFormulas = true){
|
|
|
+ calculate(treeNode, calcParents = true, calcFormulas = true, isTender = false){
|
|
|
let me = this;
|
|
|
let changedNodes = [];
|
|
|
- me.innerCalc(treeNode, changedNodes);
|
|
|
+ me.innerCalc(treeNode, changedNodes, isTender);
|
|
|
if (treeNode.changed) {
|
|
|
// 计算父结点
|
|
|
if (calcParents){
|
|
|
let curNode = treeNode.parent;
|
|
|
while (curNode){
|
|
|
- me.innerCalc(curNode, changedNodes);
|
|
|
+ me.innerCalc(curNode, changedNodes, isTender);
|
|
|
curNode = curNode.parent;
|
|
|
};
|
|
|
};
|
|
|
// 父结点算完,再计算所有的公式结点(必须先算完父结点,再算公式结点)
|
|
|
if (calcFormulas) {
|
|
|
- me.calcFormulaNodes(changedNodes);
|
|
|
+ me.calcFormulaNodes(changedNodes, isTender);
|
|
|
};
|
|
|
};
|
|
|
|
|
@@ -1662,7 +1747,7 @@ class CalcProgram {
|
|
|
calcAllType.catRations 计算所有定额、工料机形式的定额、量价,因为它们都走自己的计算程序 (改变人工系数、费率值、工料机单价时会用到) 不要用
|
|
|
缺陷:calcAllType.catRations 参数情况不会计算父结点。(calcAllType.catBills 可以,因为清单的父结点也是清单会计算)
|
|
|
*/
|
|
|
- calcAllNodes(calcType = calcAllType.catAll){
|
|
|
+ calcAllNodes(calcType = calcAllType.catAll, isTender){
|
|
|
let me = this;
|
|
|
let changedNodes = [];
|
|
|
function calcNodes(nodes) {
|
|
@@ -1674,17 +1759,17 @@ class CalcProgram {
|
|
|
if (calcType == calcAllType.catAll || calcType == node.sourceType) {
|
|
|
node.calcType = calcTools.getCalcType(node);
|
|
|
if (node.calcType != treeNodeCalcType.ctCalcBaseValue)
|
|
|
- me.innerCalc(node, changedNodes);
|
|
|
+ me.innerCalc(node, changedNodes, isTender);
|
|
|
};
|
|
|
}
|
|
|
};
|
|
|
calcNodes(me.project.mainTree.roots);
|
|
|
- me.calcFormulaNodes(changedNodes);
|
|
|
+ me.calcFormulaNodes(changedNodes, isTender);
|
|
|
return changedNodes;
|
|
|
};
|
|
|
|
|
|
// 计算全部公式项。 (参数意义:将通过本方法后发生改变的节点存入changedArr中)
|
|
|
- calcFormulaNodes(changedArr){
|
|
|
+ calcFormulaNodes(changedArr, isTender){
|
|
|
let me = this;
|
|
|
let formulaNodes = cbTools.getFormulaNodes(true);
|
|
|
if (formulaNodes.length == 0) return;
|
|
@@ -1693,13 +1778,13 @@ class CalcProgram {
|
|
|
projectObj.project.calcBase.calculate(formulaNode, true);
|
|
|
if (projectObj.project.calcBase.success){
|
|
|
// 计算公式结点
|
|
|
- me.innerCalc(formulaNode, changedArr);
|
|
|
+ me.innerCalc(formulaNode, changedArr, isTender);
|
|
|
|
|
|
// 计算父结点
|
|
|
if (formulaNode.changed){
|
|
|
let curNode = formulaNode.parent;
|
|
|
while (curNode){
|
|
|
- me.innerCalc(curNode, changedArr);
|
|
|
+ me.innerCalc(curNode, changedArr, isTender);
|
|
|
curNode = curNode.parent;
|
|
|
};
|
|
|
};
|
|
@@ -1790,8 +1875,8 @@ class CalcProgram {
|
|
|
this.calcNodesAndSave(billNodes, callback);
|
|
|
};
|
|
|
|
|
|
- calcAllNodesAndSave(calcType = calcAllType.catAll, callback){
|
|
|
- let changedNodes = this.calcAllNodes(calcType);
|
|
|
+ calcAllNodesAndSave(calcType = calcAllType.catAll, callback, isTender){
|
|
|
+ let changedNodes = this.calcAllNodes(calcType, isTender);
|
|
|
this.saveNodes(changedNodes, callback);
|
|
|
};
|
|
|
|