Browse Source

Merge remote-tracking branch 'origin/master' into dev

zhangweicheng 4 năm trước cách đây
mục cha
commit
e39a195d6a

+ 0 - 2
web/building_saas/main/html/main.html

@@ -812,7 +812,6 @@
                                             </div>
                                             </div>
 
 
                                         </fieldset>
                                         </fieldset>
-                                        <% if (!projectData.importedByInterface) { %>
                                             <fieldset class="form-group">
                                             <fieldset class="form-group">
                                               <h5>清单限价</h5>
                                               <h5>清单限价</h5>
                                               <div class="mt-1">
                                               <div class="mt-1">
@@ -822,7 +821,6 @@
                                                 <span data-toggle="tooltip" data-placement="bottom" data-original-title="最低限价=清单综合单价*(1-X%)">最低限价 </span><input id="min-price-rate" data-limit="min" class="form-control form-control-sm limit-price-input" value="0" type="text"> %
                                                 <span data-toggle="tooltip" data-placement="bottom" data-original-title="最低限价=清单综合单价*(1-X%)">最低限价 </span><input id="min-price-rate" data-limit="min" class="form-control form-control-sm limit-price-input" value="0" type="text"> %
                                             </div>
                                             </div>
                                             </fieldset>
                                             </fieldset>
-                                            <% } %>
                                     </div>
                                     </div>
                                 </div>
                                 </div>
                                 <!--清单工程精度-->
                                 <!--清单工程精度-->

+ 91 - 64
web/building_saas/main/js/models/calc_program.js

@@ -1081,12 +1081,23 @@
      return projectObj.project.property.valuationType == 'ration';
      return projectObj.project.property.valuationType == 'ration';
    },
    },
 
 
-   getTenderCalcType: function () {
+   getTenderTypeStr: function () {
      let tenderSetting = projectObj.project.property.tenderSetting;
      let tenderSetting = projectObj.project.property.tenderSetting;
      let ct = tenderSetting && tenderSetting.calcPriceOption ? tenderSetting.calcPriceOption : "priceBase_RCJ";
      let ct = tenderSetting && tenderSetting.calcPriceOption ? tenderSetting.calcPriceOption : "priceBase_RCJ";
      if (ct == 'priceBase') ct = 'priceBase_RCJ'; // 兼容旧项目
      if (ct == 'priceBase') ct = 'priceBase_RCJ'; // 兼容旧项目
      return ct;
      return ct;
    },
    },
+   getTenderType: function () {
+     let rst;
+     let sOption = calcTools.getTenderTypeStr();
+     if (sOption == 'coeBase')
+       rst = tenderTypes.ttCalc
+     else if (sOption == 'priceBase_RCJ')
+       rst = tenderTypes.ttReverseGLJ
+     else if (sOption == 'priceBase_ZM')
+       rst = tenderTypes.ttReverseRation;
+     return rst;
+   },
    getProgramArray: function () {
    getProgramArray: function () {
     let array = [];
     let array = [];
     for (let p of projectObj.project.calcProgram.datas.templates) {
     for (let p of projectObj.project.calcProgram.datas.templates) {
@@ -1094,7 +1105,7 @@
     }
     }
     return array;
     return array;
   },
   },
-  getCodeForBlock: function(node){
+   getCodeForBlock: function(node){
     let code = node.data.code;
     let code = node.data.code;
     if (calcTools.isBillProject()){
     if (calcTools.isBillProject()){
         let tempNode = node;
         let tempNode = node;
@@ -1105,12 +1116,19 @@
     };
     };
     return code;
     return code;
   },
   },
-  getCodeFromBlock: function(block){
+   getCodeFromBlock: function(block){
     let code = '';
     let code = '';
     let i = block.data.nodeName.indexOf(' ');
     let i = block.data.nodeName.indexOf(' ');
     if (i != -1) code = block.data.nodeName.slice(0, i);
     if (i != -1) code = block.data.nodeName.slice(0, i);
     return code;
     return code;
-  }
+  },
+   // 取树结点的调价系数。
+   getCoe: function (node, tender) {
+     if (tender == tenderTypes.ttReverseGLJ)
+       return calcTools.isVP_or_GLJR(node) ? node.data.rationQuantityCoe : (node.data.quantityCoe ? node.data.quantityCoe.labour : 0)
+     else if (tender == tenderTypes.ttReverseRation)
+       return node.data.rationQuantityCoe;
+   }
  };
  };
 
 
  let rationCalcBases = {
  let rationCalcBases = {
@@ -2600,7 +2618,7 @@
    };
    };
 
 
    // 反向调价逼近
    // 反向调价逼近
-   reverseTenderApproach(callback){
+   reverseTenderApproach(callback, tender){
      let me = this;
      let me = this;
 
 
      let G_DIGIT = 0.01;      // 系数调整步距(0.1最终结果误差大。0.001目标金额与逼前金额差距大时无法有效逼近)
      let G_DIGIT = 0.01;      // 系数调整步距(0.1最终结果误差大。0.001目标金额与逼前金额差距大时无法有效逼近)
@@ -2609,11 +2627,6 @@
      let diffProp = 0.0001;   // 计算模式=2(速度优先)时有效。 计算可接受的差值D。差值D = 根结点金额 * diffProp
      let diffProp = 0.0001;   // 计算模式=2(速度优先)时有效。 计算可接受的差值D。差值D = 根结点金额 * diffProp
      let isTest = true;       // 测试
      let isTest = true;       // 测试
 
 
-     // 取树结点的调价系数。
-     function getCoe(node){
-       return (calcTools.isVP_or_GLJR(node)) ? node.data.rationQuantityCoe : node.data.quantityCoe.labour;
-     }
-
      // 按指定的比例获取可接受的差值:如目标金额的万分之一。
      // 按指定的比例获取可接受的差值:如目标金额的万分之一。
      function getPropV(node){
      function getPropV(node){
        let v = parseFloat((node.data.targetTotalFee * diffProp).toFixed(0));   // node.data.feesIndex.common.totalFee
        let v = parseFloat((node.data.targetTotalFee * diffProp).toFixed(0));   // node.data.feesIndex.common.totalFee
@@ -2634,7 +2647,7 @@
          // 量价还是要参与,因为它贡献了金额,如果它的金额比重很大,它退出了,会导致其它结点过调。
          // 量价还是要参与,因为它贡献了金额,如果它的金额比重很大,它退出了,会导致其它结点过调。
          // if (calcTools.isRationCategory(node) && (!calcTools.isVP_or_GLJR(node))){
          // if (calcTools.isRationCategory(node) && (!calcTools.isVP_or_GLJR(node))){
          if (calcTools.isRationCategory(node)){
          if (calcTools.isRationCategory(node)){
-           let coe = getCoe(node);
+           let coe = calcTools.getCoe(node, tender);
            if (coe!= 0) {
            if (coe!= 0) {
              let diff = Math.abs(node.data.feesIndex.common.tenderTotalFee - node.data.feesIndex.common.totalFee);
              let diff = Math.abs(node.data.feesIndex.common.tenderTotalFee - node.data.feesIndex.common.totalFee);
              node.data.tender_diffValuePerCoe  = (diff * G_DIGIT / coe).toDecimal(decimalObj.process);
              node.data.tender_diffValuePerCoe  = (diff * G_DIGIT / coe).toDecimal(decimalObj.process);
@@ -2683,22 +2696,29 @@
          return {type: 2, node: undefined, nodeIdx: -1};    // arr 被清空了
          return {type: 2, node: undefined, nodeIdx: -1};    // arr 被清空了
 
 
        let d = (v > 0) ? -G_DIGIT : G_DIGIT;
        let d = (v > 0) ? -G_DIGIT : G_DIGIT;
-       let coe = getCoe(closeNode);
+       let coe = calcTools.getCoe(closeNode, tender);
        if ((coe + d) < 0)
        if ((coe + d) < 0)
          return {type: 3, node: obj.node, nodeIdx: obj.idx};  // 再调的话,系数就变负数了,过调
          return {type: 3, node: obj.node, nodeIdx: obj.idx};  // 再调的话,系数就变负数了,过调
 
 
-       if (calcTools.isVP_or_GLJR(closeNode)){
+       if (tender == tenderTypes.ttReverseRation){
          closeNode.data.tender_previousCoe = closeNode.data.rationQuantityCoe;  // tender_previousCoe: 上一次的调整系数,用于撤回
          closeNode.data.tender_previousCoe = closeNode.data.rationQuantityCoe;  // tender_previousCoe: 上一次的调整系数,用于撤回
          closeNode.data.rationQuantityCoe = (closeNode.data.rationQuantityCoe + d).toDecimal(decimalObj.process);
          closeNode.data.rationQuantityCoe = (closeNode.data.rationQuantityCoe + d).toDecimal(decimalObj.process);
        }
        }
-       else {
-         closeNode.data.tender_previousCoe = closeNode.data.quantityCoe.labour;
-         closeNode.data.quantityCoe.labour = (closeNode.data.quantityCoe.labour + d).toDecimal(decimalObj.process)
-         closeNode.data.quantityCoe.material = (closeNode.data.quantityCoe.material + d).toDecimal(decimalObj.process)
-         closeNode.data.quantityCoe.machine = (closeNode.data.quantityCoe.machine + d).toDecimal(decimalObj.process)
-         closeNode.data.quantityCoe.main = (closeNode.data.quantityCoe.main + d).toDecimal(decimalObj.process)
-         closeNode.data.quantityCoe.equipment = (closeNode.data.quantityCoe.equipment + d).toDecimal(decimalObj.process)
-       };
+       else if (tender == tenderTypes.ttReverseGLJ){
+         if (calcTools.isVP_or_GLJR(closeNode)){
+           closeNode.data.tender_previousCoe = closeNode.data.rationQuantityCoe;
+           closeNode.data.rationQuantityCoe = (closeNode.data.rationQuantityCoe + d).toDecimal(decimalObj.process);
+         }
+         else {
+           closeNode.data.tender_previousCoe = closeNode.data.quantityCoe.labour;
+           closeNode.data.quantityCoe.labour = (closeNode.data.quantityCoe.labour + d).toDecimal(decimalObj.process)
+           closeNode.data.quantityCoe.material = (closeNode.data.quantityCoe.material + d).toDecimal(decimalObj.process)
+           closeNode.data.quantityCoe.machine = (closeNode.data.quantityCoe.machine + d).toDecimal(decimalObj.process)
+           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, true, true, tenderTypes.ttCalc);
        me.calculate(closeNode, true, true, tenderTypes.ttCalc);
        return {type: 1, node: obj.node, nodeIdx: obj.idx};
        return {type: 1, node: obj.node, nodeIdx: obj.idx};
      }
      }
@@ -2707,17 +2727,22 @@
      function undoLastApproach(obj){
      function undoLastApproach(obj){
        let closeNode = obj.node;
        let closeNode = obj.node;
        let coe = closeNode.data.tender_previousCoe;
        let coe = closeNode.data.tender_previousCoe;
-       if (calcTools.isVP_or_GLJR(closeNode)){
+       if (tender == tenderTypes.ttReverseRation){
          closeNode.data.rationQuantityCoe = coe
          closeNode.data.rationQuantityCoe = coe
+       } else if (tender == tenderTypes.ttReverseGLJ){
+         if (calcTools.isVP_or_GLJR(closeNode)){
+           closeNode.data.rationQuantityCoe = coe
+         }
+         else {
+           closeNode.data.quantityCoe.labour = coe
+           closeNode.data.quantityCoe.material = coe
+           closeNode.data.quantityCoe.machine = coe
+           closeNode.data.quantityCoe.main = coe
+           closeNode.data.quantityCoe.equipment = coe
+         };
        }
        }
-       else {
-         closeNode.data.quantityCoe.labour = coe
-         closeNode.data.quantityCoe.material = coe
-         closeNode.data.quantityCoe.machine = coe
-         closeNode.data.quantityCoe.main = 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,23 +2751,24 @@
      }
      }
 
 
      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){
-       let tq = root.data.feesIndex.common.totalFee;
-       let mb = root.data.targetTotalFee;
-       let bbj = root.data.feesIndex.common.tenderTotalFee;
-       let ms = (calcModel == 2) ? `速度优先(0~${propV})` : "精度优先";
-       console.log(`调前${tq}|目标${mb}|调后无逼近${bbj}|差值${d1}|${ms}`);
+       let _tq = `调前${root.data.feesIndex.common.totalFee}`;
+       let _mb = `目标${root.data.targetTotalFee}`;
+       let _wbj = `调后无逼近${root.data.feesIndex.common.tenderTotalFee}`;
+       let _cz = `差值${d1}`;
+       let _js = `轮${times} 系数步距${G_DIGIT}`;
+       let _yx = (calcModel == 2) ? `速度优先(差比${diffProp} 差域0~${propV})` : "精度优先";
+       console.log(`${_tq}|${_mb}|${_wbj}|${_cz}|${_yx}|${_js}`);
      }
      }
 
 
      // 多轮逼进
      // 多轮逼进
      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;
@@ -2758,13 +2784,14 @@
        let d2 = getRootDiff();
        let d2 = getRootDiff();
 
 
        if (isTest){
        if (isTest){
+         let _time = `【第 ${i} 轮】调整`;
          let _node = `[行${obj.node.data.tender_rowNo} 索引${obj.nodeIdx}]`;
          let _node = `[行${obj.node.data.tender_rowNo} 索引${obj.nodeIdx}]`;
-         let _coe = `${obj.node.data.tender_previousCoe} → ${getCoe(obj.node)}`;
+         let _coe = `${obj.node.data.tender_previousCoe} → ${calcTools.getCoe(obj.node, tender)}`;
          let _d = `差值${d1} → ${d2}`;
          let _d = `差值${d1} → ${d2}`;
-         console.log(`【第 ${i} 轮】调整${_node} ${_coe},${_d}`);
+         console.log(`${_time}${_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 +2801,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 +2843,29 @@
    };
    };
 
 
    doTenderCalc(callback) {
    doTenderCalc(callback) {
+
      $.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;
-     if (tender == tenderTypes.ttReverseGLJ || tender == tenderTypes.ttReverseRation) {
-       if (!tender_obj.tenderTree){
-         tender_obj.createTree();
-         tender_obj.createTreeNodes();
+     setTimeout(()=>{
+       let tender = calcTools.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, tender);     // 逼近上述基础调后金额
        }
        }
 
 
-       // 反向调价原理:清理调价缓存 → 从子往父汇总(处理满载) → 从父往子分摊目标金额 → 反向计算调整系数(再由系数计算调后金额)等 → 调后金额逼近(挑结点,改系数,改完正算) → 全局正算、存储
-       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.calcAllNodesAndSave(calcAllType.catAll, callback, tenderTypes.ttCalc);
+     })
+
    };
    };
  };
  };
 
 

+ 6 - 6
web/building_saas/main/js/views/main_tree_col.js

@@ -296,12 +296,12 @@ let MainTreeCol = {
     },
     },
     maxPrice: function (node) {
     maxPrice: function (node) {
       const hasOutPutMaxPriceCol = !!projectObj.project.projSetting.main_tree_col.cols.find(item => item.data.field === 'outPutMaxPrice');
       const hasOutPutMaxPriceCol = !!projectObj.project.projSetting.main_tree_col.cols.find(item => item.data.field === 'outPutMaxPrice');
-      const hasOutPutLitmitPriceCol = !!projectObj.project.projSetting.main_tree_col.cols.find(item => item.data.field === 'outPutLitmitPrice');
-      return projectObj.project.projectInfo.importedByInterface || (hasOutPutMaxPriceCol && (node.data.outPutMaxPrice === undefined || node.data.outPutMaxPrice === false)) || (hasOutPutLitmitPriceCol && (node.data.outPutLimitPrice === undefined || node.data.outPutLimitPrice === false));
+      const hasOutPutLimitPriceCol = !!projectObj.project.projSetting.main_tree_col.cols.find(item => item.data.field === 'outPutLimitPrice');
+      return (hasOutPutMaxPriceCol && (node.data.outPutMaxPrice === undefined || node.data.outPutMaxPrice === false)) || (hasOutPutLimitPriceCol && (node.data.outPutLimitPrice === undefined || node.data.outPutLimitPrice === false));
     },
     },
     minPrice: function (node) {
     minPrice: function (node) {
-      const hasOutPutLitmitPriceCol = !!projectObj.project.projSetting.main_tree_col.cols.find(item => item.data.field === 'outPutLitmitPrice');
-      return projectObj.project.projectInfo.importedByInterface || (hasOutPutLitmitPriceCol && (node.data.outPutLimitPrice === undefined || node.data.outPutLimitPrice === false));
+      const hasOutPutLimitPriceCol = !!projectObj.project.projSetting.main_tree_col.cols.find(item => item.data.field === 'outPutLimitPrice');
+      return (hasOutPutLimitPriceCol && (node.data.outPutLimitPrice === undefined || node.data.outPutLimitPrice === false));
     },
     },
   },
   },
   cellType: {
   cellType: {
@@ -415,14 +415,14 @@ let MainTreeCol = {
     },
     },
     outPutMaxPrice: function (node) {
     outPutMaxPrice: function (node) {
       if (node.sourceType === projectObj.project.Bills.getSourceType()) {
       if (node.sourceType === projectObj.project.Bills.getSourceType()) {
-        return projectObj.project.projectInfo.importedByInterface  || projectObj.project.projectInfo.property.lockBills
+        return projectObj.project.projectInfo.property.lockBills
           ? sheetCommonObj.getReadOnlyCheckBox()
           ? sheetCommonObj.getReadOnlyCheckBox()
           : sheetCommonObj.getCheckBox();
           : sheetCommonObj.getCheckBox();
       }
       }
     },
     },
     outPutLimitPrice: function (node) {
     outPutLimitPrice: function (node) {
       if (node.sourceType === projectObj.project.Bills.getSourceType()) {
       if (node.sourceType === projectObj.project.Bills.getSourceType()) {
-        return projectObj.project.projectInfo.importedByInterface || projectObj.project.projectInfo.property.lockBills
+        return projectObj.project.projectInfo.property.lockBills
           ? sheetCommonObj.getReadOnlyCheckBox()
           ? sheetCommonObj.getReadOnlyCheckBox()
           : sheetCommonObj.getCheckBox();
           : sheetCommonObj.getCheckBox();
       }
       }

+ 17 - 15
web/building_saas/main/js/views/project_view.js

@@ -195,7 +195,7 @@ var projectObj = {
         }
         }
         if (value!=undefined||value!=null) {
         if (value!=undefined||value!=null) {
             if (colSetting.data.decimal) {
             if (colSetting.data.decimal) {
-                value = value.toDecimal(colSetting.data.decimal);   
+                value = value.toDecimal(colSetting.data.decimal);
             }
             }
         } else if (editingText && editingText !== '') {
         } else if (editingText && editingText !== '') {
             value = null;
             value = null;
@@ -523,8 +523,10 @@ var projectObj = {
                 };
                 };
 
 
                 //计算基数赋值要经过解析和标准化,已在calculate里赋值
                 //计算基数赋值要经过解析和标准化,已在calculate里赋值
-                if(fieldName !== 'calcBase')
-                    calcTools.setFieldValue(node, fieldName, value);
+                if(fieldName !== 'calcBase'){
+                  calcTools.setFieldValue(node, fieldName, value);
+                  projectObj.mainController.refreshTreeNode([node]);  // 量价,输入单价x,反算单价x1,第二次输入单价x,单价不再反算。(实际反算了,没刷新)
+                }
 
 
                 project.calcProgram.calcAndSave(node);
                 project.calcProgram.calcAndSave(node);
                 gljOprObj.showRationGLJSheetData();
                 gljOprObj.showRationGLJSheetData();
@@ -559,7 +561,7 @@ var projectObj = {
         projectObj.lastCell = {row: info.row, col: info.col};
         projectObj.lastCell = {row: info.row, col: info.col};
         if(colSetting.data.field === 'quantity'){
         if(colSetting.data.field === 'quantity'){
             SheetDataHelper.hideMoreButton()
             SheetDataHelper.hideMoreButton()
-        }  
+        }
     },
     },
     //repaint 动态下拉框
     //repaint 动态下拉框
     mainSpreadEnterCell: function (sender, info) {
     mainSpreadEnterCell: function (sender, info) {
@@ -581,7 +583,7 @@ var projectObj = {
         let colSetting = projectObj.mainController.setting.cols[info.sheet.getActiveColumnIndex()];
         let colSetting = projectObj.mainController.setting.cols[info.sheet.getActiveColumnIndex()];
         if(colSetting.data.field === 'quantity'){
         if(colSetting.data.field === 'quantity'){
             SheetDataHelper.moveMoreButton(info.sheet)
             SheetDataHelper.moveMoreButton(info.sheet)
-        }    
+        }
     },
     },
     mainSpreadEditStarting: function (sender, info) {
     mainSpreadEditStarting: function (sender, info) {
         let project = projectObj.project;
         let project = projectObj.project;
@@ -634,7 +636,7 @@ var projectObj = {
             }
             }
         }
         }
         if(node.sourceType == ModuleNames.ration){ //在定额编码中双击,如果右侧定额库没有展开,则自动展开。
         if(node.sourceType == ModuleNames.ration){ //在定额编码中双击,如果右侧定额库没有展开,则自动展开。
-          if(node.data.type != rationType.ration) return ;//只有定额类型才需要自动展开,其它都不用 
+          if(node.data.type != rationType.ration) return ;//只有定额类型才需要自动展开,其它都不用
             let libID = node.data.libID;
             let libID = node.data.libID;
             if (node.data.from === 'cpt') {
             if (node.data.from === 'cpt') {
                 libID = node.data.fromUser ? `${rationLibObj.compleRationLibId}*${node.data.fromUser}` : rationLibObj.compleRationLibId;
                 libID = node.data.fromUser ? `${rationLibObj.compleRationLibId}*${node.data.fromUser}` : rationLibObj.compleRationLibId;
@@ -961,8 +963,8 @@ var projectObj = {
                             col.data.formatter = MainTreeCol.getNumberFormatter(decimalObj.ration.unitPrice, true);
                             col.data.formatter = MainTreeCol.getNumberFormatter(decimalObj.ration.unitPrice, true);
                     // }
                     // }
 
 
-                });    
-                that.mainController = TREE_SHEET_CONTROLLER.createNew(that.project.mainTree, that.mainSpread.getActiveSheet(), that.project.projSetting.mainGridSetting);  
+                });
+                that.mainController = TREE_SHEET_CONTROLLER.createNew(that.project.mainTree, that.mainSpread.getActiveSheet(), that.project.projSetting.mainGridSetting);
                 that.mainController.bind('refreshBaseActn', that.refreshBaseActn);
                 that.mainController.bind('refreshBaseActn', that.refreshBaseActn);
                 that.mainController.bind(TREE_SHEET_CONTROLLER.eventName.beforeTreeSelectedChange, that.beforeMainTreeSelectedChange);
                 that.mainController.bind(TREE_SHEET_CONTROLLER.eventName.beforeTreeSelectedChange, that.beforeMainTreeSelectedChange);
                 that.mainController.bind(TREE_SHEET_CONTROLLER.eventName.treeSelectedChanged, that.treeSelectedChanged);
                 that.mainController.bind(TREE_SHEET_CONTROLLER.eventName.treeSelectedChanged, that.treeSelectedChanged);
@@ -994,7 +996,7 @@ var projectObj = {
 
 
 
 
                 //工程量悬浮窗移动事件
                 //工程量悬浮窗移动事件
-                that.mainSpread.bind(GC.Spread.Sheets.Events.TopRowChanged, that.TopRowChanged);    
+                that.mainSpread.bind(GC.Spread.Sheets.Events.TopRowChanged, that.TopRowChanged);
                 //let loadOtherStartTime = +new Date();
                 //let loadOtherStartTime = +new Date();
                 //if(!projectReadOnly){
                 //if(!projectReadOnly){
                     that.loadMainSpreadContextMenu();
                     that.loadMainSpreadContextMenu();
@@ -1178,15 +1180,15 @@ var projectObj = {
 
 
     },
     },
     isInsertEquipmentVisable:function(selected){
     isInsertEquipmentVisable:function(selected){
-      //浙江不管是预算或者工程量清单,都是隐藏,overwrite文件重写   
+      //浙江不管是预算或者工程量清单,都是隐藏,overwrite文件重写
       if(this.project.property.valuationType !=='ration' ){//属于预算项目的情况下,在固定清单可见
       if(this.project.property.valuationType !=='ration' ){//属于预算项目的情况下,在固定清单可见
         //属于的固定清单
         //属于的固定清单
         let belongFlag = cbTools.getBelongFlag(selected);
         let belongFlag = cbTools.getBelongFlag(selected);
         if (belongFlag && belongFlag === fixedFlag.EQUIPMENT_ACQUISITION_FEE) {
         if (belongFlag && belongFlag === fixedFlag.EQUIPMENT_ACQUISITION_FEE) {
             return true;
             return true;
         }
         }
-        return false; 
-      } 
+        return false;
+      }
       return true
       return true
     },
     },
     // 注册自定义插入清单数量
     // 注册自定义插入清单数量
@@ -1850,7 +1852,7 @@ var projectObj = {
             for (let row = selectedArea.row; row < (selectedArea.rowCount + selectedArea.row); row++) {
             for (let row = selectedArea.row; row < (selectedArea.rowCount + selectedArea.row); row++) {
                 const value = sheet.getCell(row, col).text();
                 const value = sheet.getCell(row, col).text();
                 if (!regular.test(value)) {
                 if (!regular.test(value)) {
-                    if(value) notNumber = true; 
+                    if(value) notNumber = true;
                     continue;
                     continue;
                 }
                 }
                 counter++;
                 counter++;
@@ -2462,7 +2464,7 @@ $('#poj-set').on('show.bs.modal', function () {
         setCalcFlag($('#billsPrice'), leafBillGetFeeType.billsPrice, ft);
         setCalcFlag($('#billsPrice'), leafBillGetFeeType.billsPrice, ft);
         setCalcFlag($('#zangu_common'), zanguCalcType.common, zg);
         setCalcFlag($('#zangu_common'), zanguCalcType.common, zg);
         setCalcFlag($('#zangu_gatherMaterial'), zanguCalcType.gatherMaterial, zg);
         setCalcFlag($('#zangu_gatherMaterial'), zanguCalcType.gatherMaterial, zg);
-        
+
         let showAdjustPrice = projectObj.project.projSetting.glj_col?projectObj.project.projSetting.glj_col.showAdjustPrice:false;
         let showAdjustPrice = projectObj.project.projSetting.glj_col?projectObj.project.projSetting.glj_col.showAdjustPrice:false;
         showAdjustPrice === true ? $("#tab_poj-settings-6").show():$("#tab_poj-settings-6").hide();
         showAdjustPrice === true ? $("#tab_poj-settings-6").show():$("#tab_poj-settings-6").hide();
         projDisplayView.init();
         projDisplayView.init();
@@ -3550,4 +3552,4 @@ $('.limit-price-input').bind('input', function () {
         alert(err);
         alert(err);
         $(this).val(orgVal);
         $(this).val(orgVal);
     }
     }
-});
+});

+ 1 - 1
web/building_saas/main/js/views/tender_price_view.js

@@ -429,7 +429,7 @@ let tender_obj={
         let tenderSetting = projectObj.project.property.tenderSetting;
         let tenderSetting = projectObj.project.property.tenderSetting;
         let gljPriceTenderCoe = tenderSetting && tenderSetting.gljPriceTenderCoe?tenderSetting.gljPriceTenderCoe:1;
         let gljPriceTenderCoe = tenderSetting && tenderSetting.gljPriceTenderCoe?tenderSetting.gljPriceTenderCoe:1;
         let showTenderFields = tenderSetting && tenderSetting.showTenderFields?tenderSetting.showTenderFields:false;
         let showTenderFields = tenderSetting && tenderSetting.showTenderFields?tenderSetting.showTenderFields:false;
-        let calcPriceOption = calcTools.getTenderCalcType();
+        let calcPriceOption = calcTools.getTenderTypeStr();
         $('#calcPriceOption').val(calcPriceOption);
         $('#calcPriceOption').val(calcPriceOption);
         $('#gljPriceTenderCoe').val(gljPriceTenderCoe);
         $('#gljPriceTenderCoe').val(gljPriceTenderCoe);
         $('#cbShowTenderFields').prop("checked", showTenderFields);
         $('#cbShowTenderFields').prop("checked", showTenderFields);

+ 75 - 0
web/over_write/js/gansu_2017

@@ -0,0 +1,75 @@
+/**
+ * Created by CSL on 2021/04/25.  甘肃养护计算程序、基数 等覆盖。
+ */
+
+let isGS2017 = true;
+function overwriteRationCalcBases() {
+  if (typeof rationCalcBases == 'undefined') return;
+  for (let key in rationCalcBases) delete rationCalcBases[key];
+
+  rationCalcBases['人工费'] = function (node, isTender) {
+    return calcTools.rationBaseFee(node, [gljType.LABOUR], priceTypes.ptMarketPrice, isTender);
+  };
+  rationCalcBases['材料费'] = function (node, isTender) {
+    return calcTools.rationBaseFee(node, baseMaterialTypes, priceTypes.ptMarketPrice, isTender);
+  };
+  rationCalcBases['施工机械使用费'] = function (node, isTender) {
+    return calcTools.rationBaseFee(node, baseMachineTypes, priceTypes.ptMarketPrice, isTender);
+  };
+  rationCalcBases['施工机械人工费'] = function (node, isTender) {
+    return calcTools.machineDetailFee(node, node.data.gljList, [], gljType.MACHINE_LABOUR, isTender);
+  };
+  rationCalcBases['设备购置费'] = function (node, isTender) {
+    return calcTools.rationBaseFee(node, [gljType.EQUIPMENT], priceTypes.ptMarketPrice, isTender);
+  };
+
+  rationCalcBases['定额人工费'] = function (node, isTender) {
+    return calcTools.rationBaseFee(node, [gljType.LABOUR], priceTypes.ptBasePrice, isTender);
+  };
+  rationCalcBases['定额材料费'] = function (node, isTender) {
+    return calcTools.rationBaseFee(node, baseMaterialTypes, priceTypes.ptBasePrice, isTender);
+  };
+  rationCalcBases['定额施工机械使用费'] = function (node, isTender) {
+    return calcTools.rationBaseFee(node, baseMachineTypes, priceTypes.ptBasePrice, isTender);
+  };
+  rationCalcBases['定额商品砼费'] = function (node, isTender) {
+    return calcTools.rationBaseFee(node, [gljType.COMMERCIAL_CONCRETE, gljType.COMMERCIAL_MORTAR], priceTypes.ptBasePrice, isTender);
+  };
+  rationCalcBases['定额设备费'] = function (node, isTender) {
+    return calcTools.rationBaseFee(node, [gljType.EQUIPMENT], priceTypes.ptBasePrice, isTender);
+  };
+  rationCalcBases['定额外购砼构件费'] = function (node, isTender) {
+    return calcTools.rationBaseFee(node, [gljType.PURCHASE_COMPONENT], priceTypes.ptBasePrice, isTender);
+  };
+  rationCalcBases['定额绿化苗木费'] = function (node, isTender) {
+    return calcTools.rationBaseFee(node, [gljType.GREEN_SEEDLING], priceTypes.ptBasePrice, isTender);
+  };
+};
+
+(function overwriteFeeTypes() {
+  if (typeof cpFeeTypes == 'undefined') return;
+  cpFeeTypes = [
+    { type: 'marketLabour', name: '人工费' },
+    { type: 'marketMaterial', name: '材料费' },
+    { type: 'marketMachine', name: '施工机械使用费' },
+    { type: 'marketMachineLabour', name: '施工机械人工费' },
+    { type: 'marketEquipment', name: '设备购置费' },
+    { type: 'marketDirect', name: '直接费' },
+
+    { type: 'labour', name: '定额人工费' },
+    { type: 'material', name: '定额材料费' },
+    { type: 'machine', name: '定额施工机械使用费' },
+    { type: 'equipment', name: '定额设备费' },
+    { type: 'direct', name: '定额直接费' },
+
+    { type: 'measure', name: '措施费' },
+    { type: 'measure1', name: '措施费I' },
+    { type: 'measure2', name: '措施费II' },
+    { type: 'manage', name: '企业管理费' },
+    { type: 'force', name: '规费' },
+    { type: 'profit', name: '利润' },
+    { type: 'tax', name: '税金' },
+    { type: 'common', name: '建安费' },
+    { type: 'rationCommon', name: '定额建安费' }
+  ];
+})();