Ver código fonte

调价代码调整

chenshilong 4 anos atrás
pai
commit
9e1428b3e0
1 arquivos alterados com 28 adições e 21 exclusões
  1. 28 21
      web/building_saas/main/js/models/calc_program.js

+ 28 - 21
web/building_saas/main/js/models/calc_program.js

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