|
@@ -2717,7 +2717,7 @@
|
|
|
closeNode.data.quantityCoe.main = coe
|
|
closeNode.data.quantityCoe.main = coe
|
|
|
closeNode.data.quantityCoe.equipment = coe
|
|
closeNode.data.quantityCoe.equipment = coe
|
|
|
};
|
|
};
|
|
|
- me.calculate(closeNode);
|
|
|
|
|
|
|
+ me.calculate(closeNode, true, true, tenderTypes.ttCalc);
|
|
|
if (isTest) {
|
|
if (isTest) {
|
|
|
let _sp = ` `; // 保留空格,打印对齐
|
|
let _sp = ` `; // 保留空格,打印对齐
|
|
|
let _node = `[行${obj.node.data.tender_rowNo} 索引${obj.nodeIdx}]`;
|
|
let _node = `[行${obj.node.data.tender_rowNo} 索引${obj.nodeIdx}]`;
|
|
@@ -2726,8 +2726,8 @@
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
let root = tender_obj.tenderTree.roots[0];
|
|
let root = tender_obj.tenderTree.roots[0];
|
|
|
- let vArr = getNodeDiffs();
|
|
|
|
|
let propV = getPropV(root);
|
|
let propV = getPropV(root);
|
|
|
|
|
+ let vArr = getNodeDiffs();
|
|
|
let d1 = getRootDiff();
|
|
let d1 = getRootDiff();
|
|
|
|
|
|
|
|
if (isTest){
|
|
if (isTest){
|
|
@@ -2742,7 +2742,6 @@
|
|
|
for (let i = 1; i <= times; i++) {
|
|
for (let i = 1; i <= times; i++) {
|
|
|
// 与目标金额差值在1以内,整数部分已相同,结果很棒。很多时候能达到完美的差值0,但不能用0判断,因为金额取小数时有问题。
|
|
// 与目标金额差值在1以内,整数部分已相同,结果很棒。很多时候能达到完美的差值0,但不能用0判断,因为金额取小数时有问题。
|
|
|
if (Math.abs(d1) < 1) break;
|
|
if (Math.abs(d1) < 1) break;
|
|
|
-
|
|
|
|
|
// 速度优先模式下,结果到达差值范围内,即熔断逼近。
|
|
// 速度优先模式下,结果到达差值范围内,即熔断逼近。
|
|
|
if (calcModel == 2){
|
|
if (calcModel == 2){
|
|
|
if (Math.abs(d1) < propV) break;
|
|
if (Math.abs(d1) < propV) break;
|
|
@@ -2764,7 +2763,7 @@
|
|
|
console.log(`【第 ${i} 轮】调整${_node} ${_coe},${_d}`);
|
|
console.log(`【第 ${i} 轮】调整${_node} ${_coe},${_d}`);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if (Math.abs(d2) > Math.abs(d1)){ // 逼近后差距反而变大,证明过调,回退一步
|
|
|
|
|
|
|
+ if (Math.abs(d2) > Math.abs(d1)){ // 逼近后差值反而变大,证明此轮调节不合适,回退一步,并将结点从列表清除
|
|
|
undoLastApproach(obj);
|
|
undoLastApproach(obj);
|
|
|
vArr.splice(obj.nodeIdx, 1);
|
|
vArr.splice(obj.nodeIdx, 1);
|
|
|
}
|
|
}
|
|
@@ -2774,8 +2773,10 @@
|
|
|
else {d1 = d2}
|
|
else {d1 = d2}
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
- // 系数已处理就绪,直接正算即可。
|
|
|
|
|
- this.calcAllNodesAndSave(calcAllType.catAll, callback, tenderTypes.ttCalc);
|
|
|
|
|
|
|
+ // 重要注释:到这里,所有系数已处理就绪,最后直接全局正算即可。
|
|
|
|
|
+ // 到这一步,被处理的定额、及其受影响的父结点、引用结点等均已正算完成(approach方法、undoLastApproach方法),但都未保存。
|
|
|
|
|
+ // 最后全局正算目的:⑴计算除第一部以外的其它部分 ⑵保存。正算在调用外面完成。
|
|
|
|
|
+ // this.calcAllNodesAndSave(calcAllType.catAll, callback, tenderTypes.ttCalc);
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
setRationMap() {
|
|
setRationMap() {
|
|
@@ -2814,31 +2815,37 @@
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
doTenderCalc(callback) {
|
|
doTenderCalc(callback) {
|
|
|
|
|
+ function getTenderType(){
|
|
|
|
|
+ let rst;
|
|
|
|
|
+ let sOption = calcTools.getTenderCalcType();
|
|
|
|
|
+ if (sOption == 'coeBase')
|
|
|
|
|
+ rst = tenderTypes.ttCalc
|
|
|
|
|
+ else if (sOption == 'priceBase_RCJ')
|
|
|
|
|
+ rst = tenderTypes.ttReverseGLJ
|
|
|
|
|
+ else if (sOption == 'priceBase_ZM')
|
|
|
|
|
+ rst = tenderTypes.ttReverseRation;
|
|
|
|
|
+ return rst;
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
$.bootstrapLoading.start();
|
|
$.bootstrapLoading.start();
|
|
|
- let sOption = calcTools.getTenderCalcType();
|
|
|
|
|
- let tender;
|
|
|
|
|
- if (sOption == 'coeBase')
|
|
|
|
|
- tender = tenderTypes.ttCalc
|
|
|
|
|
- else if (sOption == 'priceBase_RCJ')
|
|
|
|
|
- tender = tenderTypes.ttReverseGLJ
|
|
|
|
|
- else if (sOption == 'priceBase_ZM')
|
|
|
|
|
- tender = tenderTypes.ttReverseRation;
|
|
|
|
|
|
|
+ let tender = getTenderType();
|
|
|
if (tender == tenderTypes.ttReverseGLJ || tender == tenderTypes.ttReverseRation) {
|
|
if (tender == tenderTypes.ttReverseGLJ || tender == tenderTypes.ttReverseRation) {
|
|
|
|
|
+ // 调价计算必须依赖调价树。
|
|
|
if (!tender_obj.tenderTree){
|
|
if (!tender_obj.tenderTree){
|
|
|
tender_obj.createTree();
|
|
tender_obj.createTree();
|
|
|
tender_obj.createTreeNodes();
|
|
tender_obj.createTreeNodes();
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- // 反向调价原理:清理调价缓存 → 从子往父汇总(处理满载) → 从父往子分摊目标金额 → 反向计算调整系数(再由系数计算调后金额)等 → 调后金额逼近(挑结点,改系数,改完正算) → 全局正算、存储
|
|
|
|
|
|
|
+ // 反向调价+逼近原理:
|
|
|
|
|
+ // 清理调价缓存 → 分摊目标金额(从子往父处理满载、从父往子分摊) → 全局反算 → 逼近 → 全局正算、存储
|
|
|
this.reverseTenderInitDatas();
|
|
this.reverseTenderInitDatas();
|
|
|
this.prepareForDistribute(tender_obj.tenderTree.roots[0]);
|
|
this.prepareForDistribute(tender_obj.tenderTree.roots[0]);
|
|
|
this.distributeTargetTotalFee(tender_obj.tenderTree.roots[0]);
|
|
this.distributeTargetTotalFee(tender_obj.tenderTree.roots[0]);
|
|
|
- this.calcAllNodes(calcAllType.catAll, tender); // 先来个反算(计算coe),得到基本的调后值(此值误差大,需要逼近)
|
|
|
|
|
- this.reverseTenderApproach(callback); // 逼近上述调后值
|
|
|
|
|
- }
|
|
|
|
|
- else{
|
|
|
|
|
- this.calcAllNodesAndSave(calcAllType.catAll, callback, tender);
|
|
|
|
|
|
|
+ this.calcAllNodes(calcAllType.catAll, tender); // 先全局反算:得到每定额的coe、基础调后金额(误差大,需逼近)
|
|
|
|
|
+ this.reverseTenderApproach(callback); // 逼近上述基础调后金额
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ // 全局正算(用的是主树,无需调价树)
|
|
|
|
|
+ this.calcAllNodesAndSave(calcAllType.catAll, callback, tenderTypes.ttCalc);
|
|
|
};
|
|
};
|
|
|
};
|
|
};
|
|
|
|
|
|