瀏覽代碼

反向调价逼近算法

chenshilong 4 年之前
父節點
當前提交
90547963b6
共有 1 個文件被更改,包括 25 次插入24 次删除
  1. 25 24
      web/building_saas/main/js/models/calc_program.js

+ 25 - 24
web/building_saas/main/js/models/calc_program.js

@@ -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);