|  | @@ -51,6 +51,15 @@ let calcTools = {
 | 
	
		
			
				|  |  |      isNullBill: function (treeNode) {
 | 
	
		
			
				|  |  |          return this.isLeafBill(treeNode) && (treeNode.children.length === 0) && (!treeNode.data.calcBase);
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  | +    // 无效的、影响正常计算的行(无意义的空行、没有金额的行等)
 | 
	
		
			
				|  |  | +    isInvalidNode: function (treeNode) {
 | 
	
		
			
				|  |  | +        return !(
 | 
	
		
			
				|  |  | +            treeNode.data &&
 | 
	
		
			
				|  |  | +            treeNode.data.feesIndex &&
 | 
	
		
			
				|  |  | +            treeNode.data.feesIndex.common &&
 | 
	
		
			
				|  |  | +            treeNode.data.feesIndex.common.totalFee
 | 
	
		
			
				|  |  | +        );
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  |      isCalcBaseBill: function(treeNode){
 | 
	
		
			
				|  |  |          return this.isLeafBill(treeNode) && (treeNode.children.length === 0) && (treeNode.data.calcBase);
 | 
	
		
			
				|  |  |      },
 | 
	
	
		
			
				|  | @@ -1823,7 +1832,7 @@ class CalcProgram {
 | 
	
		
			
				|  |  |              me.innerCalcBillCustom(treeNode)
 | 
	
		
			
				|  |  |          // 定额:计算程序
 | 
	
		
			
				|  |  |          else
 | 
	
		
			
				|  |  | -            me.innerCalcRation2(treeNode, tenderType);
 | 
	
		
			
				|  |  | +            me.innerCalcRation(treeNode, tenderType);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          if (!calcTools.isTotalCostBill(treeNode))  // 已在上面的分支中计算过
 | 
	
		
			
				|  |  |              calcTools.estimateFee(treeNode);
 | 
	
	
		
			
				|  | @@ -2072,10 +2081,22 @@ class CalcProgram {
 | 
	
		
			
				|  |  |              if (calcTools.isVP_or_GLJR(treeNode)){
 | 
	
		
			
				|  |  |                  let u = treeNode.data.marketUnitFee ? treeNode.data.marketUnitFee : 0;
 | 
	
		
			
				|  |  |                  let t = (u * nQ).toDecimal(decimalObj.ration.totalPrice);
 | 
	
		
			
				|  |  | -                if (treeNode.data.marketTotalFee != t){
 | 
	
		
			
				|  |  | +                if ((treeNode.data.marketTotalFee != t) ||
 | 
	
		
			
				|  |  | +                    (!treeNode.data.feesIndex || !treeNode.data.feesIndex.common || (treeNode.data.feesIndex.common.totalFee != t))
 | 
	
		
			
				|  |  | +                ){
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |                      treeNode.data.marketTotalFee = t;
 | 
	
		
			
				|  |  | +                    let obj = {};
 | 
	
		
			
				|  |  | +                    obj.fieldName = 'common';
 | 
	
		
			
				|  |  | +                    obj.unitFee = u;
 | 
	
		
			
				|  |  | +                    obj.totalFee = t;
 | 
	
		
			
				|  |  | +                    obj.tenderUnitFee = obj.unitFee;
 | 
	
		
			
				|  |  | +                    obj.tenderTotalFee = obj.totalFee;
 | 
	
		
			
				|  |  | +                    calcTools.checkFeeField(treeNode, obj);
 | 
	
		
			
				|  |  | +                    me.deleteUselessFees(treeNode, budgetFields);
 | 
	
		
			
				|  |  |                      treeNode.changed = true;
 | 
	
		
			
				|  |  |                  } ;
 | 
	
		
			
				|  |  | +                return;
 | 
	
		
			
				|  |  |              };
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -2089,6 +2110,33 @@ class CalcProgram {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              calcTools.initFees(treeNode);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +            // 只有人、材、机、主、设。
 | 
	
		
			
				|  |  | +            let sum = 0;
 | 
	
		
			
				|  |  | +            for (let i = 0; i < 5; i++) {
 | 
	
		
			
				|  |  | +                if (!rationCalcBases[budgetBaseNames[i]]){
 | 
	
		
			
				|  |  | +                    hintBox.infoBox('错误提示', `定额基数${hintBox.font('[' +funcNames[i] + ']')}未定义!`, 1);
 | 
	
		
			
				|  |  | +                    return;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                let obj = {};
 | 
	
		
			
				|  |  | +                obj.fieldName = budgetFields[i];
 | 
	
		
			
				|  |  | +                obj.unitFee = (rationCalcBases[budgetBaseNames[i]](treeNode)).toDecimal(decimalObj.decimal('unitPrice', treeNode));
 | 
	
		
			
				|  |  | +                obj.totalFee = (obj.unitFee * nQ).toDecimal(decimalObj.decimal('totalPrice', treeNode));
 | 
	
		
			
				|  |  | +                obj.tenderUnitFee = obj.unitFee;
 | 
	
		
			
				|  |  | +                obj.tenderTotalFee = obj.totalFee;
 | 
	
		
			
				|  |  | +                sum = sum + obj.unitFee;
 | 
	
		
			
				|  |  | +                calcTools.checkFeeField(treeNode, obj);
 | 
	
		
			
				|  |  | +            };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            let obj = {};
 | 
	
		
			
				|  |  | +            obj.fieldName = 'common';
 | 
	
		
			
				|  |  | +            obj.unitFee = obj.unitFee = sum.toDecimal(decimalObj.decimal('unitPrice', treeNode));
 | 
	
		
			
				|  |  | +            obj.totalFee = (obj.unitFee * nQ).toDecimal(decimalObj.decimal('totalPrice', treeNode));
 | 
	
		
			
				|  |  | +            obj.tenderUnitFee = obj.unitFee;
 | 
	
		
			
				|  |  | +            obj.tenderTotalFee = obj.totalFee;
 | 
	
		
			
				|  |  | +            calcTools.checkFeeField(treeNode, obj);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            me.deleteUselessFees(treeNode, budgetFields);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |              for (let idx of template.compiledSeq) {
 | 
	
		
			
				|  |  |                  let calcItem = template.calcItems[idx];
 | 
	
		
			
				|  |  |                  $CE.tempCalcItem = calcItem;
 | 
	
	
		
			
				|  | @@ -2102,17 +2150,7 @@ class CalcProgram {
 | 
	
		
			
				|  |  |                  let tExpr = analyzer.getCompiledTenderExpr(calcItem.compiledExpr);
 | 
	
		
			
				|  |  |                  calcItem.tenderUnitFee = (eval(tExpr) * feeRate * 0.01).toDecimal(decimalObj.decimal('unitPrice', treeNode));
 | 
	
		
			
				|  |  |                  calcItem.tenderTotalFee = (calcItem.tenderUnitFee * nTQ).toDecimal(decimalObj.decimal('totalPrice', treeNode));
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                if (calcItem.fieldName) {
 | 
	
		
			
				|  |  | -                    fnArr.push(calcItem.fieldName);
 | 
	
		
			
				|  |  | -                    calcTools.checkFeeField(treeNode, calcItem);
 | 
	
		
			
				|  |  | -                };
 | 
	
		
			
				|  |  |              };
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            if (tenderType == tenderTypes.ttReverseRation || tenderType == tenderTypes.ttReverseGLJ)
 | 
	
		
			
				|  |  | -              this.reverseTenderCalc(treeNode, tenderType);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            me.deleteUselessFees(treeNode, fnArr);
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  |      };
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -2613,6 +2651,7 @@ class CalcProgram {
 | 
	
		
			
				|  |  |              let arr = [];
 | 
	
		
			
				|  |  |              for (let i = 0; i < tender_obj.tenderTree.items.length; i++) {
 | 
	
		
			
				|  |  |                  let node = tender_obj.tenderTree.items[i];
 | 
	
		
			
				|  |  | +                if (calcTools.isInvalidNode(node)) continue;
 | 
	
		
			
				|  |  |                  // 量价还是要参与,因为它贡献了金额,如果它的金额比重很大,它退出了,会导致其它结点过调。
 | 
	
		
			
				|  |  |                  // if (calcTools.isRationCategory(node) && (!calcTools.isVP_or_GLJR(node))){
 | 
	
		
			
				|  |  |                  if (calcTools.isRationCategory(node)){
 |