|  | @@ -553,7 +553,6 @@ const rationCalcBases = {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  let analyzer = {
 | 
	
		
			
				|  |  |      calcTemplate: null,
 | 
	
		
			
				|  |  | -    success: true,
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      standard: function(expr){
 | 
	
		
			
				|  |  |          let str = expr;
 | 
	
	
		
			
				|  | @@ -587,47 +586,59 @@ let analyzer = {
 | 
	
		
			
				|  |  |      isCycleCalc: function (expr) {     // @5+@6  这里已经是ID引用
 | 
	
		
			
				|  |  |          let me = this;
 | 
	
		
			
				|  |  |          
 | 
	
		
			
				|  |  | -        function checkCycle() {
 | 
	
		
			
				|  |  | -            
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        let atIDArr = me.getAtIDArr(expr);
 | 
	
		
			
				|  |  | -        for (let atID of atIDArr){
 | 
	
		
			
				|  |  | -            let ID = atID.slice(1);
 | 
	
		
			
				|  |  | -            let item = me.calcTemplate.compiledCalcItems[ID];
 | 
	
		
			
				|  |  | -            let expression = item.expression;
 | 
	
		
			
				|  |  | -            if (expression.includes(atID)) return false;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +        function isCycle(nodeExpr) {
 | 
	
		
			
				|  |  | +            let atIDArr = me.getAtIDArr(nodeExpr);
 | 
	
		
			
				|  |  | +            for (let atID of atIDArr){
 | 
	
		
			
				|  |  | +                let ID = atID.slice(1);
 | 
	
		
			
				|  |  | +                let item = me.calcTemplate.compiledCalcItems[ID];
 | 
	
		
			
				|  |  | +                if (item.expression.includes(atID)) {
 | 
	
		
			
				|  |  | +                    return true;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                else {
 | 
	
		
			
				|  |  | +                    isCycle(item.expression);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            };
 | 
	
		
			
				|  |  | +            return false;
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        return isCycle(expr);
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  | -    isLegal: function (expr) {
 | 
	
		
			
				|  |  | +    isLegal: function (expr) {   // 调用前必须先标准化
 | 
	
		
			
				|  |  |          let me = this;
 | 
	
		
			
				|  |  | -        let stdExpr = me.standard(expr);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          let invalidChars = /[^0-9\u4e00-\u9fa5\+\-\*\/\(\)\.\[\]F%]/g;
 | 
	
		
			
				|  |  | -        if (invalidChars.test(stdExpr)){
 | 
	
		
			
				|  |  | +        if (invalidChars.test(expr)){
 | 
	
		
			
				|  |  |              alert('表达式中含有无效的字符!');
 | 
	
		
			
				|  |  |              return false;
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          let pattCn = new RegExp(/[\u4E00-\u9FA5]+/gi);
 | 
	
		
			
				|  |  | -        let arrCn = stdExpr.match(pattCn);
 | 
	
		
			
				|  |  | +        let arrCn = expr.match(pattCn);
 | 
	
		
			
				|  |  |          let pattBase = new RegExp(/\[[\u4E00-\u9FA5]+\]/gi);
 | 
	
		
			
				|  |  | -        let arrBase = stdExpr.match(pattBase);
 | 
	
		
			
				|  |  | +        let arrBase = expr.match(pattBase);
 | 
	
		
			
				|  |  |          if (arrCn.length != arrBase.length){
 | 
	
		
			
				|  |  | -            alert('定额基数必须用“[]”括起来!');
 | 
	
		
			
				|  |  | +            for (let cn of arrCn){
 | 
	
		
			
				|  |  | +                let tempBase = `[${cn}]`;
 | 
	
		
			
				|  |  | +                  if (!arrBase.includes(tempBase)){
 | 
	
		
			
				|  |  | +                      alert(`定额基数“${cn}”必须用中括号[]括起来!`);
 | 
	
		
			
				|  |  | +                      return false;
 | 
	
		
			
				|  |  | +                  }
 | 
	
		
			
				|  |  | +            };
 | 
	
		
			
				|  |  | +            // 这里要加一个保险。因为上面的 for 循环在“主材费 + [主材费]” 情况下有Bug
 | 
	
		
			
				|  |  | +            alert('定额基数必须用中括号[]括起来!');
 | 
	
		
			
				|  |  |              return false;
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          for (let base of arrBase){
 | 
	
		
			
				|  |  |              let baseName = base.slice(1, -1);
 | 
	
		
			
				|  |  |              if (!rationCalcBases[baseName]){
 | 
	
		
			
				|  |  | -                alert('定额基数“' + baseName + '”末定义!');
 | 
	
		
			
				|  |  | +                alert('定额基数 [' + baseName + '] 末定义!');
 | 
	
		
			
				|  |  |                  return false;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          // 行引用检测、行引用转ID引用
 | 
	
		
			
				|  |  | -        let arrF = me.getFArr(stdExpr);
 | 
	
		
			
				|  |  | +        let arrF = me.getFArr(expr);
 | 
	
		
			
				|  |  |          for (let F of arrF){
 | 
	
		
			
				|  |  |              let num = F.slice(1);
 | 
	
		
			
				|  |  |              if (num > me.calcTemplate.calcItems.length){
 | 
	
	
		
			
				|  | @@ -636,140 +647,28 @@ let analyzer = {
 | 
	
		
			
				|  |  |              };
 | 
	
		
			
				|  |  |              let id = me.getFID(F);
 | 
	
		
			
				|  |  |              let fn = new RegExp(F, "g");
 | 
	
		
			
				|  |  | -            stdExpr = stdExpr.replace(fn, '@' + id);
 | 
	
		
			
				|  |  | +            expr = expr.replace(fn, `@('${id}')`);
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          // 循环计算
 | 
	
		
			
				|  |  | -        if (me.isCycleCalc(stdExpr)){
 | 
	
		
			
				|  |  | +        if (me.isCycleCalc(expr)){
 | 
	
		
			
				|  |  |              alert('表达式中有循环计算!');
 | 
	
		
			
				|  |  |              return false;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  | -    analyzeCalcBase: function(expr){
 | 
	
		
			
				|  |  | -        // 前提:必须无空格、无特殊符号
 | 
	
		
			
				|  |  | -        function getCalcBase(expr){
 | 
	
		
			
				|  |  | -            let base = '',
 | 
	
		
			
				|  |  | -                iPos1 = -1, iPos2 = -1;
 | 
	
		
			
				|  |  | -            for (let i = 0; i < expr.length; i++) {
 | 
	
		
			
				|  |  | -                if (expr[i] === '['){
 | 
	
		
			
				|  |  | -                    iPos1 = i;
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -                else if (iPos1 != -1 && expr[i]===']'){
 | 
	
		
			
				|  |  | -                    iPos2 = i;
 | 
	
		
			
				|  |  | -                };
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                if (iPos1 != -1 && iPos2 != -1){
 | 
	
		
			
				|  |  | -                    base = expr.slice(iPos1, iPos2 + 1);
 | 
	
		
			
				|  |  | -                    break;
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -            };
 | 
	
		
			
				|  |  | -            return base;
 | 
	
		
			
				|  |  | -        };
 | 
	
		
			
				|  |  | -        function calcBaseToIDExpr(base){
 | 
	
		
			
				|  |  | -            /*// for test. 公路模式,基数到ID
 | 
	
		
			
				|  |  | -            let id = -1;
 | 
	
		
			
				|  |  | -            if (base == '[人工费]'){
 | 
	
		
			
				|  |  | -                id = 111;
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            else if (base == '[材料费]'){
 | 
	
		
			
				|  |  | -                id = 222;
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            else if (base == '[机械费]'){
 | 
	
		
			
				|  |  | -                id = 333;
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            else id = "错误";
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            return "@('" + id + "')";*/
 | 
	
		
			
				|  |  | -            let baseValue = base.slice(1, -1);
 | 
	
		
			
				|  |  | -            return "base('" + baseValue + "')";
 | 
	
		
			
				|  |  | -        };
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        while (expr.indexOf('[') > 0) {
 | 
	
		
			
				|  |  | -            let base = getCalcBase(expr);
 | 
	
		
			
				|  |  | -            let id = calcBaseToIDExpr(base);
 | 
	
		
			
				|  |  | -            let baseValue = base.slice(1, -1);   // []会给下面的正则带来干扰,这里去掉
 | 
	
		
			
				|  |  | -            var pattBase =new RegExp(baseValue, "g");
 | 
	
		
			
				|  |  | -            expr = expr.replace(pattBase, id);
 | 
	
		
			
				|  |  | -            expr = expr.replace(/\[base\('/g, "base('");      // [@('       [base('
 | 
	
		
			
				|  |  | -            expr = expr.replace(/'\)\]/g, "')");        // ')]
 | 
	
		
			
				|  |  | -        };
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        return expr;
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    analyzeLineRef: function(expr){
 | 
	
		
			
				|  |  | -        let me = this;
 | 
	
		
			
				|  |  | -        function isOperator(char){
 | 
	
		
			
				|  |  | -            var operator = "+-*/()";
 | 
	
		
			
				|  |  | -            return operator.indexOf(char) > -1;
 | 
	
		
			
				|  |  | -        };
 | 
	
		
			
				|  |  | -        function lineNumToID(lineNum){
 | 
	
		
			
				|  |  | -            if (lineNum > me.calcTemplate.calcItems.length){
 | 
	
		
			
				|  |  | -                me.success = false;
 | 
	
		
			
				|  |  | -                return '越界';
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            else{
 | 
	
		
			
				|  |  | -                let id = me.calcTemplate.calcItems[lineNum - 1].ID;
 | 
	
		
			
				|  |  | -                return id;
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -        };
 | 
	
		
			
				|  |  | -        // 前提:必须无空格、无特殊符号、标准大写F
 | 
	
		
			
				|  |  | -        function getSection(expr){
 | 
	
		
			
				|  |  | -            let section = '',
 | 
	
		
			
				|  |  | -                iPos1 = -1, iPos2 = -1;
 | 
	
		
			
				|  |  | -            for (let i = 0; i < expr.length; i++) {
 | 
	
		
			
				|  |  | -                if (expr[i] === 'F'){
 | 
	
		
			
				|  |  | -                    iPos1 = i;
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -                else if (iPos1 != -1 && isOperator(expr[i])){
 | 
	
		
			
				|  |  | -                    iPos2 = i;
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -                else if (iPos1 != -1 && i == expr.length - 1){
 | 
	
		
			
				|  |  | -                    iPos2 = i + 1;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                };
 | 
	
		
			
				|  |  | -                if (iPos1 != -1 && iPos2 != -1){
 | 
	
		
			
				|  |  | -                    section = expr.slice(iPos1, iPos2);
 | 
	
		
			
				|  |  | -                    break;
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -            };
 | 
	
		
			
				|  |  | -            return section;
 | 
	
		
			
				|  |  | -        };
 | 
	
		
			
				|  |  | -        function sectionToIDExpr(section){
 | 
	
		
			
				|  |  | -            if (section){
 | 
	
		
			
				|  |  | -                let lineNum = section.slice(1);
 | 
	
		
			
				|  |  | -                if (isNaN(lineNum)){
 | 
	
		
			
				|  |  | -                    me.success = false;
 | 
	
		
			
				|  |  | -                    return '错误';      // 这里的返回提示不能加上section,因为会无限循环
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -                else
 | 
	
		
			
				|  |  | -                    return "@('" + lineNumToID(lineNum) + "')";
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            else return '';
 | 
	
		
			
				|  |  | -        };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        while (expr.indexOf('F') > 0) {
 | 
	
		
			
				|  |  | -            let sec = getSection(expr);
 | 
	
		
			
				|  |  | -            let id = sectionToIDExpr(sec);
 | 
	
		
			
				|  |  | -            var pattSec =new RegExp(sec, "g");
 | 
	
		
			
				|  |  | -            expr = expr.replace(pattSec, id);
 | 
	
		
			
				|  |  | -        };
 | 
	
		
			
				|  |  | -        return expr;
 | 
	
		
			
				|  |  | +        return true;
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |      analyzeUserExpr: function(calcTemplate, calcItem){
 | 
	
		
			
				|  |  |          let me = this;
 | 
	
		
			
				|  |  |          me.calcTemplate = calcTemplate;
 | 
	
		
			
				|  |  |          let expr = calcItem.dispExpr;
 | 
	
		
			
				|  |  | -        // 标准化:处理特殊字符、中文符号、大小写
 | 
	
		
			
				|  |  |          expr = me.standard(expr);
 | 
	
		
			
				|  |  |          calcItem.dispExpr = expr;
 | 
	
		
			
				|  |  | -        // 先换掉计算基数
 | 
	
		
			
				|  |  | -        expr = me.analyzeCalcBase(expr);
 | 
	
		
			
				|  |  | -        // 再换掉行引用
 | 
	
		
			
				|  |  | -        expr = me.analyzeLineRef(expr);
 | 
	
		
			
				|  |  | -        calcItem.expression = expr;
 | 
	
		
			
				|  |  | -        return me.success;
 | 
	
		
			
				|  |  | +        if (me.isLegal(expr)){
 | 
	
		
			
				|  |  | +            calcItem.expression = expr;
 | 
	
		
			
				|  |  | +            return true;
 | 
	
		
			
				|  |  | +        }else
 | 
	
		
			
				|  |  | +            return false;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  };
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -1079,10 +978,12 @@ class CalcProgram {
 | 
	
		
			
				|  |  |              let nodes = (treeNode.calcType == treeNodeCalcType.ctGatherBillsFees) ? treeNode.children : me.project.Ration.getRationNodes(treeNode);
 | 
	
		
			
				|  |  |              let rst = [];
 | 
	
		
			
				|  |  |              for (let ft of cpFeeTypes) {
 | 
	
		
			
				|  |  | +                let isEstimate = ft.name == '暂估费';
 | 
	
		
			
				|  |  |                  let ftObj = {};
 | 
	
		
			
				|  |  |                  ftObj.fieldName = ft.type;
 | 
	
		
			
				|  |  |                  ftObj.name = ft.name;
 | 
	
		
			
				|  |  |                  let buf = 0, btf = 0, btuf = 0, bttf = 0;
 | 
	
		
			
				|  |  | +                let bq = calcTools.uiNodeQty(treeNode) ? calcTools.uiNodeQty(treeNode) : 1;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  if (treeNode.calcType == treeNodeCalcType.ctGatherBillsFees){
 | 
	
		
			
				|  |  |                      for (let node of nodes) {
 | 
	
	
		
			
				|  | @@ -1097,7 +998,6 @@ class CalcProgram {
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |                  else if (treeNode.calcType == treeNodeCalcType.ctGatherRationsFees){     // 这里的算法要配合冷姐姐的神图才能看懂^_^
 | 
	
		
			
				|  |  |                      let sum_rtf = 0, sum_rttf = 0;
 | 
	
		
			
				|  |  | -                    let bq = calcTools.uiNodeQty(treeNode) ? calcTools.uiNodeQty(treeNode) : 1;
 | 
	
		
			
				|  |  |                      for (let node of nodes) {
 | 
	
		
			
				|  |  |                          let rq = calcTools.uiNodeQty(node) ? calcTools.uiNodeQty(node) : 0;
 | 
	
		
			
				|  |  |                          let ruf = 0, rtuf = 0, rtf = 0, rttf = 0;
 | 
	
	
		
			
				|  | @@ -1108,33 +1008,46 @@ class CalcProgram {
 | 
	
		
			
				|  |  |                              rttf = parseFloat(node.data.feesIndex[ft.type].tenderTotalFee);
 | 
	
		
			
				|  |  |                          };
 | 
	
		
			
				|  |  |                          if (me.project.property.billsCalcMode === leafBillGetFeeType.rationContent) {
 | 
	
		
			
				|  |  | -                            buf = (buf + (ruf * rq / bq).toDecimal(decimalObj.process)).toDecimal(decimalObj.process);
 | 
	
		
			
				|  |  | -                            btuf = (btuf + (rtuf * rq / bq).toDecimal(decimalObj.process)).toDecimal(decimalObj.process);
 | 
	
		
			
				|  |  | +                            buf = (buf + (ruf * rq / bq).toDecimal(decimalObj.bills.unitFee)).toDecimal(decimalObj.bills.unitFee);
 | 
	
		
			
				|  |  | +                            btuf = (btuf + (rtuf * rq / bq).toDecimal(decimalObj.bills.unitFee)).toDecimal(decimalObj.bills.unitFee);
 | 
	
		
			
				|  |  |                          };
 | 
	
		
			
				|  |  |                          sum_rtf = (sum_rtf + rtf).toDecimal(decimalObj.process);
 | 
	
		
			
				|  |  |                          sum_rttf = (sum_rttf + rttf).toDecimal(decimalObj.process);
 | 
	
		
			
				|  |  |                      };
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                    if (me.project.property.billsCalcMode == leafBillGetFeeType.rationPriceConverse ||
 | 
	
		
			
				|  |  | -                        me.project.property.billsCalcMode == leafBillGetFeeType.rationPrice) {
 | 
	
		
			
				|  |  | -                        buf = (sum_rtf / bq).toDecimal(decimalObj.process);
 | 
	
		
			
				|  |  | -                        btuf = (sum_rttf / bq).toDecimal(decimalObj.process);
 | 
	
		
			
				|  |  | -                    };
 | 
	
		
			
				|  |  | -                    if (isBaseFeeType(ft.type) ||
 | 
	
		
			
				|  |  | -                        (me.project.property.billsCalcMode === leafBillGetFeeType.rationPrice && ft.type == "common")){
 | 
	
		
			
				|  |  | +                    if (isEstimate){
 | 
	
		
			
				|  |  |                          btf = sum_rtf;
 | 
	
		
			
				|  |  |                          bttf = sum_rttf;
 | 
	
		
			
				|  |  | -                    }
 | 
	
		
			
				|  |  | -                    else{
 | 
	
		
			
				|  |  | -                        btf = (buf.toDecimal(decimalObj.bills.unitPrice) * bq).toDecimal(decimalObj.process);
 | 
	
		
			
				|  |  | -                        bttf = (btuf.toDecimal(decimalObj.bills.unitPrice) * bq).toDecimal(decimalObj.process);
 | 
	
		
			
				|  |  | +                    }else{
 | 
	
		
			
				|  |  | +                        if (me.project.property.billsCalcMode == leafBillGetFeeType.rationPriceConverse ||
 | 
	
		
			
				|  |  | +                            me.project.property.billsCalcMode == leafBillGetFeeType.rationPrice) {
 | 
	
		
			
				|  |  | +                            buf = (sum_rtf / bq).toDecimal(decimalObj.process);
 | 
	
		
			
				|  |  | +                            btuf = (sum_rttf / bq).toDecimal(decimalObj.process);
 | 
	
		
			
				|  |  | +                        };
 | 
	
		
			
				|  |  | +                        if (isBaseFeeType(ft.type) ||
 | 
	
		
			
				|  |  | +                            (me.project.property.billsCalcMode === leafBillGetFeeType.rationPrice && ft.type == "common")){
 | 
	
		
			
				|  |  | +                            btf = sum_rtf;
 | 
	
		
			
				|  |  | +                            bttf = sum_rttf;
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                        else{
 | 
	
		
			
				|  |  | +                            btf = (buf.toDecimal(decimalObj.bills.unitPrice) * bq).toDecimal(decimalObj.process);
 | 
	
		
			
				|  |  | +                            bttf = (btuf.toDecimal(decimalObj.bills.unitPrice) * bq).toDecimal(decimalObj.process);
 | 
	
		
			
				|  |  | +                        };
 | 
	
		
			
				|  |  |                      };
 | 
	
		
			
				|  |  |                  };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                ftObj.unitFee = buf.toDecimal(decimalObj.bills.unitPrice);
 | 
	
		
			
				|  |  |                  ftObj.totalFee = btf.toDecimal(decimalObj.bills.totalPrice);
 | 
	
		
			
				|  |  | -                ftObj.tenderUnitFee = btuf.toDecimal(decimalObj.bills.unitPrice);
 | 
	
		
			
				|  |  |                  ftObj.tenderTotalFee = bttf.toDecimal(decimalObj.bills.totalPrice);
 | 
	
		
			
				|  |  | +                if (isEstimate){
 | 
	
		
			
				|  |  | +                    if (treeNode.calcType == treeNodeCalcType.ctGatherRationsFees){
 | 
	
		
			
				|  |  | +                        ftObj.unitFee = (ftObj.totalFee / bq).toDecimal(decimalObj.bills.unitPrice);
 | 
	
		
			
				|  |  | +                        ftObj.tenderUnitFee = (ftObj.tenderTotalFee / bq).toDecimal(decimalObj.bills.unitPrice);
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                else{
 | 
	
		
			
				|  |  | +                    ftObj.unitFee = buf.toDecimal(decimalObj.bills.unitPrice);
 | 
	
		
			
				|  |  | +                    ftObj.tenderUnitFee = btuf.toDecimal(decimalObj.bills.unitPrice);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |                  calcTools.checkFeeField(treeNode, ftObj);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  rst.push(ftObj);
 | 
	
	
		
			
				|  | @@ -1413,7 +1326,7 @@ class CalcProgram {
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                      else{
 | 
	
		
			
				|  |  |                          if (node.sourceType != ModuleNames.ration_glj) {
 | 
	
		
			
				|  |  | -                            rst = (rst + calcTools.getFee(node, 'common.totalFee')).toDecimal(decimalObj.bills.totalPrice);
 | 
	
		
			
				|  |  | +                            rst = (rst + calcTools.getFee(node, 'common.totalFee')).toDecimal(decimalObj.decimal("totalPrice", node));
 | 
	
		
			
				|  |  |                          };
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                  }
 |