|
|
@@ -2122,7 +2122,7 @@
|
|
|
};
|
|
|
|
|
|
if (tenderType == tenderTypes.ttReverseRation || tenderType == tenderTypes.ttReverseGLJ)
|
|
|
- this.calcReverseTender(treeNode, tenderType);
|
|
|
+ this.reverseTenderCalc(treeNode, tenderType);
|
|
|
|
|
|
me.deleteUselessFees(treeNode, fnArr);
|
|
|
};
|
|
|
@@ -2387,6 +2387,22 @@
|
|
|
return me.getTotalFee(baseNodes, excludeNodes, tender);
|
|
|
};
|
|
|
|
|
|
+ // 清理调价缓存数据
|
|
|
+ clearTenderCache(treeNode) {
|
|
|
+ // 这些属性值为什么不定义在一个对象里?因为每次要判断对象是否存在,十分麻烦。不如直接写简单。分散书写,统一处理也很好用。
|
|
|
+ if (treeNode.data.tender_activeTotal) delete treeNode.data.tender_activeTotal;
|
|
|
+ if (treeNode.data.tender_activeTarget) delete treeNode.data.tender_activeTarget;
|
|
|
+ if (treeNode.data.tender_fullLoad) delete treeNode.data.tender_fullLoad;
|
|
|
+ if (treeNode.data.tender_distribute) {
|
|
|
+ delete treeNode.data.targetTotalFee;
|
|
|
+ delete treeNode.data.targetUnitFee;
|
|
|
+ delete treeNode.data.tender_distribute;
|
|
|
+ };
|
|
|
+ if (treeNode.data.tender_diffValuePerCoe) delete treeNode.data.tender_diffValuePerCoe;
|
|
|
+ if (treeNode.data.tender_rowNo) delete treeNode.data.tender_rowNo;
|
|
|
+ if (treeNode.data.tender_previousCoe) delete treeNode.data.tender_previousCoe;
|
|
|
+ };
|
|
|
+
|
|
|
initGljPriceTenderCoe() {
|
|
|
if (projectObj.project.property.tenderSetting && projectObj.project.property.tenderSetting.gljPriceTenderCoe &&
|
|
|
(projectObj.project.property.tenderSetting.gljPriceTenderCoe != 1)) {
|
|
|
@@ -2396,7 +2412,7 @@
|
|
|
};
|
|
|
|
|
|
// 反向调价-初始化调价树、清理缓存数据等
|
|
|
- initReverseTenderDatas() {
|
|
|
+ reverseTenderInitDatas() {
|
|
|
for (let node of tender_obj.tenderTree.items) {
|
|
|
if (node.data.rationQuantityCoe) node.data.rationQuantityCoe = null;
|
|
|
let qcObj = node.data.quantityCoe;
|
|
|
@@ -2414,7 +2430,7 @@
|
|
|
// 反向调价简单计算:只计算当前单一结点,由目标金额计算定额量系数或工料机量系数coe,再根据此coe计算定额的调后量、调后合价。
|
|
|
// ⑴只计算参数指定的一个单一的结点,连父结点、引用结点都不计算。此结点只会是定额、量价、工料机款定额,不会是清单。
|
|
|
// ⑵执行此方法的前提:已在其它地方把总的目标金额分摊好了,此结点已获取目标金额。
|
|
|
- calcReverseTender(treeNode, tender) {
|
|
|
+ reverseTenderCalc(treeNode, tender) {
|
|
|
if (tender == tenderTypes.ttReverseRation) { // 先初始化,使调后单价=调前单价
|
|
|
if (treeNode.data.feesIndex.common && treeNode.data.feesIndex.common.tenderUnitFee != treeNode.data.feesIndex.common.unitFee) {
|
|
|
treeNode.data.feesIndex.common.tenderUnitFee = treeNode.data.feesIndex.common.unitFee;
|
|
|
@@ -2490,22 +2506,6 @@
|
|
|
};
|
|
|
};
|
|
|
|
|
|
- // 清理调价缓存数据
|
|
|
- clearTenderCache(treeNode) {
|
|
|
- // 这些属性值为什么不定义在一个对象里?因为每次要判断对象是否存在,十分麻烦。不如直接写简单。分散书写,统一处理也很好用。
|
|
|
- if (treeNode.data.tender_activeTotal) delete treeNode.data.tender_activeTotal;
|
|
|
- if (treeNode.data.tender_activeTarget) delete treeNode.data.tender_activeTarget;
|
|
|
- if (treeNode.data.tender_fullLoad) delete treeNode.data.tender_fullLoad;
|
|
|
- if (treeNode.data.tender_distribute) {
|
|
|
- delete treeNode.data.targetTotalFee;
|
|
|
- delete treeNode.data.targetUnitFee;
|
|
|
- delete treeNode.data.tender_distribute;
|
|
|
- };
|
|
|
- if (treeNode.data.tender_diffValuePerCoe) delete treeNode.data.tender_diffValuePerCoe;
|
|
|
- if (treeNode.data.tender_rowNo) delete treeNode.data.tender_rowNo;
|
|
|
- if (treeNode.data.tender_previousCoe) delete treeNode.data.tender_previousCoe;
|
|
|
- };
|
|
|
-
|
|
|
// 反向调价-分摊前的准备工作。包括:
|
|
|
// ⑴结点是否满载
|
|
|
// ⑵若是满载,汇总孩子的金额、目标金额给它
|
|
|
@@ -2554,7 +2554,7 @@
|
|
|
// 默认能够执行到这里时每个节点已经被初始化,缓存已删除
|
|
|
treeNode.data.tender_activeTotal = treeNode.data.feesIndex['common'].totalFee;
|
|
|
|
|
|
- // 开始分摊:只分摊自有目标金额、从父结点分摊到的金额(不分摊子结点摊上来的金额)
|
|
|
+ // 开始分摊:只分摊自有目标金额、从父结点分摊到的金额(不分摊子结点汇总上来的金额)
|
|
|
if (calcTools.hasTargetTotalFee(treeNode) && !(treeNode.data.tender_distribute && treeNode.data.tender_distribute == 2)) {
|
|
|
treeNode.data.tender_activeTarget = treeNode.data.targetTotalFee;
|
|
|
|
|
|
@@ -2599,7 +2599,7 @@
|
|
|
};
|
|
|
|
|
|
// 反向调价逼近
|
|
|
- ReverseTenderApproach(callback){
|
|
|
+ reverseTenderApproach(callback){
|
|
|
let me = this;
|
|
|
let G_DIGIT = 0.01; // 系数调整步距(0.1最终结果误差大。0.001目标金额与逼前金额差距大时无法有效逼近)
|
|
|
let times = 100; // 逼近轮数
|
|
|
@@ -2689,7 +2689,7 @@
|
|
|
closeNode.data.quantityCoe.main = (closeNode.data.quantityCoe.main + d).toDecimal(decimalObj.process)
|
|
|
closeNode.data.quantityCoe.equipment = (closeNode.data.quantityCoe.equipment + d).toDecimal(decimalObj.process)
|
|
|
};
|
|
|
- me.calculate(closeNode);
|
|
|
+ me.calculate(closeNode, true, true, tenderTypes.ttCalc);
|
|
|
return {type: 1, node: obj.node, nodeIdx: obj.idx};
|
|
|
}
|
|
|
|
|
|
@@ -2795,11 +2795,12 @@
|
|
|
tender_obj.createTreeNodes();
|
|
|
}
|
|
|
|
|
|
- this.initReverseTenderDatas();
|
|
|
+ // 反向调价原理:清理调价缓存 → 从子往父汇总(处理满载) → 从父往子分摊目标金额 → 反向计算调整系数(再由系数计算调后金额)等 → 调后金额逼近(挑结点,改系数,改完正算) → 全局正算、存储
|
|
|
+ this.reverseTenderInitDatas();
|
|
|
this.prepareForDistribute(tender_obj.tenderTree.roots[0]);
|
|
|
this.distributeTargetTotalFee(tender_obj.tenderTree.roots[0]);
|
|
|
this.calcAllNodes(calcAllType.catAll, tender); // 先来个反算,得到基本的调后值(此值误差大,需要逼近)
|
|
|
- this.ReverseTenderApproach(callback); // 逼近上述调后值
|
|
|
+ this.reverseTenderApproach(callback); // 逼近上述调后值
|
|
|
}
|
|
|
else{
|
|
|
this.calcAllNodesAndSave(calcAllType.catAll, callback, tender);
|