|  | @@ -1,59 +1,40 @@
 | 
	
		
			
				|  |  |  /**
 | 
	
		
			
				|  |  |   * Created by Tony on 2017/6/21.
 | 
	
		
			
				|  |  |   */
 | 
	
		
			
				|  |  | -let calcBaseCodeCollection = ["定额基价人工费", "定额基价材料费", "定额基价机械费"
 | 
	
		
			
				|  |  | -    , "定额基价人工费(调整后)", "定额基价材料费(调整后)", "定额基价机械费(调整后)"
 | 
	
		
			
				|  |  | -    , "市场价格人工费", "市场价格材料费", "市场价格机械费"
 | 
	
		
			
				|  |  | -    , "定额基价机上人工费", "主材费", "设备费"
 | 
	
		
			
				|  |  | -];
 | 
	
		
			
				|  |  | -let dummyCalcBaseCodeTypeCollection = [[2], [6], [64]
 | 
	
		
			
				|  |  | -    , [], [], []
 | 
	
		
			
				|  |  | -    , [], [], []
 | 
	
		
			
				|  |  | -    , [], [], []
 | 
	
		
			
				|  |  | -];
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  let executeObj = {
 | 
	
		
			
				|  |  | -    currentTpl : null,
 | 
	
		
			
				|  |  | -    currentRationItem: null,
 | 
	
		
			
				|  |  | -    currentFeeRateFile: null,
 | 
	
		
			
				|  |  | +    calculation : null,
 | 
	
		
			
				|  |  | +    ration: null,
 | 
	
		
			
				|  |  | +    feeRate: null,
 | 
	
		
			
				|  |  |      at: function(ID) {
 | 
	
		
			
				|  |  |          let me = executeObj,
 | 
	
		
			
				|  |  |              rst = 0;
 | 
	
		
			
				|  |  | -        rst = me.currentTpl.compileAssistantObj[ID].unitFee;
 | 
	
		
			
				|  |  | +        rst = me.calculation.compileAssistantObj[ID].unitFee;
 | 
	
		
			
				|  |  |          rst = parseFloat(rst);
 | 
	
		
			
				|  |  |          return rst;
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  | -    base: function(calcBaseCode) {
 | 
	
		
			
				|  |  | +    base: function(calcBaseName) {
 | 
	
		
			
				|  |  |          let me = executeObj, rst = 0,
 | 
	
		
			
				|  |  | -            idx = calcBaseCodeCollection.indexOf(calcBaseCode);
 | 
	
		
			
				|  |  | -        if (idx >= 0) {
 | 
	
		
			
				|  |  | -            if (dummyCalcBaseCodeTypeCollection[idx].length > 0) {
 | 
	
		
			
				|  |  | -                let tmpSum = 0;
 | 
	
		
			
				|  |  | -                for (let glj of me.currentRationItem.data.gljList) {
 | 
	
		
			
				|  |  | -                    if (dummyCalcBaseCodeTypeCollection[idx].indexOf(glj["type"]) >= 0) {
 | 
	
		
			
				|  |  | -                        tmpSum += glj["basePrice"] * glj["quantity"];
 | 
	
		
			
				|  |  | -                    }
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -                rst = tmpSum;
 | 
	
		
			
				|  |  | -            } else {
 | 
	
		
			
				|  |  | -                //rst = 10 + idx; //随便给个数
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        //rst = idx; //暂时返回值,测试用
 | 
	
		
			
				|  |  | +            base = getRationCalcBase(calcBaseName);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if (base != null) {
 | 
	
		
			
				|  |  | +            let price = 0, tmpSum = 0;
 | 
	
		
			
				|  |  | +            for (let glj of me.ration.data.gljList) {
 | 
	
		
			
				|  |  | +                if (base.gljTypes.indexOf(glj.type) >= 0) {
 | 
	
		
			
				|  |  | +                    if (base.calcType == baseCalc){ price = glj["basePrice"];}
 | 
	
		
			
				|  |  | +                    else if (base.calcType == adjustCalc){price = glj["adjustPrice"];}
 | 
	
		
			
				|  |  | +                    else if (base.calcType == budgetCalc){price = glj["marketPrice"];}
 | 
	
		
			
				|  |  | +                    else if (base.calcType == diffCalc){price = glj["marketPrice"] - glj["adjustPrice"];};
 | 
	
		
			
				|  |  | +                };
 | 
	
		
			
				|  |  | +                tmpSum = tmpSum + glj["quantity"] * price;
 | 
	
		
			
				|  |  | +                glj = null;
 | 
	
		
			
				|  |  | +            };
 | 
	
		
			
				|  |  | +            rst = tmpSum;
 | 
	
		
			
				|  |  | +        };
 | 
	
		
			
				|  |  |          return rst;
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      fee: function(feeID) {
 | 
	
		
			
				|  |  |          let me = executeObj, rst = 0;
 | 
	
		
			
				|  |  | -        /*
 | 
	
		
			
				|  |  | -        for (let fee of me.currentFeeRateFile) {
 | 
	
		
			
				|  |  | -            if (fee.ID == feeID) {
 | 
	
		
			
				|  |  | -                rst = fee.rate;
 | 
	
		
			
				|  |  | -                break;
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        /*/
 | 
	
		
			
				|  |  |          if (me.compiledFeeRateFile["fee_" + feeID]) rst = me.compiledFeeRateFile["fee_" + feeID].rate;
 | 
	
		
			
				|  |  | -        //*/
 | 
	
		
			
				|  |  |          return rst;
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      factor: function(factorCode) {
 | 
	
	
		
			
				|  | @@ -63,11 +44,11 @@ let executeObj = {
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -class calculation {
 | 
	
		
			
				|  |  | -    init(calcTpl, calFee){
 | 
	
		
			
				|  |  | +class Calculation {
 | 
	
		
			
				|  |  | +    init(calcTemplate, feeRate){
 | 
	
		
			
				|  |  |          let me = this;
 | 
	
		
			
				|  |  | -        me.calcTpl = calcTpl;
 | 
	
		
			
				|  |  | -        me.calFee = calFee;
 | 
	
		
			
				|  |  | +        me.calcTemplate = calcTemplate;
 | 
	
		
			
				|  |  | +        me.feeRate = feeRate;
 | 
	
		
			
				|  |  |          me.hasCompiled = false;
 | 
	
		
			
				|  |  |      };
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -101,9 +82,6 @@ class calculation {
 | 
	
		
			
				|  |  |              return rst;
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  |          let private_parse_ref = function(item, itemIdx){
 | 
	
		
			
				|  |  | -            //let expr = item.expression.split('at(').join('@(');
 | 
	
		
			
				|  |  | -            //item.expression = expr;
 | 
	
		
			
				|  |  | -            //console.log('expression: ' + expr);
 | 
	
		
			
				|  |  |              let idx = item.expression.indexOf('@(', 0);
 | 
	
		
			
				|  |  |              while (idx >= 0) {
 | 
	
		
			
				|  |  |                  let ID = private_extract_ID(item.expression, idx);
 | 
	
	
		
			
				|  | @@ -122,47 +100,46 @@ class calculation {
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |                  idx = item.expression.indexOf('@(', idx + ID.length + 3);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -            if (me.calcTpl.compiledSeq.indexOf(itemIdx) < 0) {
 | 
	
		
			
				|  |  | -                me.calcTpl.compiledSeq.push(itemIdx);
 | 
	
		
			
				|  |  | +            if (me.calcTemplate.compiledSeq.indexOf(itemIdx) < 0) {
 | 
	
		
			
				|  |  | +                me.calcTemplate.compiledSeq.push(itemIdx);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  |          let private_setup_seq = function(item, itemIdx){
 | 
	
		
			
				|  |  | -            if (me.calcTpl.compiledSeq.indexOf(itemIdx) < 0) {
 | 
	
		
			
				|  |  | +            if (me.calcTemplate.compiledSeq.indexOf(itemIdx) < 0) {
 | 
	
		
			
				|  |  |                  private_parse_ref(item, itemIdx);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  |          let private_compile_items = function() {
 | 
	
		
			
				|  |  | -            for (let idx of me.calcTpl.compiledSeq) {
 | 
	
		
			
				|  |  | -                let item = me.calcTpl.calcItems[idx];
 | 
	
		
			
				|  |  | +            for (let idx of me.calcTemplate.compiledSeq) {
 | 
	
		
			
				|  |  | +                let item = me.calcTemplate.calcItems[idx];
 | 
	
		
			
				|  |  |                  item.compiledExpr = item.expression.split('@(').join('$CE.at(');
 | 
	
		
			
				|  |  |                  item.compiledExpr = item.compiledExpr.split('base(').join('$CE.base(');
 | 
	
		
			
				|  |  |                  item.compiledExpr = item.compiledExpr.split('fee(').join('$CE.fee(');
 | 
	
		
			
				|  |  |                  item.compiledExpr = item.compiledExpr.split('factor(').join('$CE.factor(');
 | 
	
		
			
				|  |  | -                //console.log(item.compiledExpr);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  |          let private_comile_feeFile = function() {
 | 
	
		
			
				|  |  | -            if (me.calFee) {
 | 
	
		
			
				|  |  | +            if (me.feeRate) {
 | 
	
		
			
				|  |  |                  me.compiledFee = {};
 | 
	
		
			
				|  |  | -                for (let fee of me.calFee) {
 | 
	
		
			
				|  |  | +                for (let fee of me.feeRate) {
 | 
	
		
			
				|  |  |                      me.compiledFee["fee_" + fee.ID] = fee;
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        if (me.calcTpl && me.calcTpl.calcItems && me.calcTpl.calcItems.length > 0) {
 | 
	
		
			
				|  |  | -            me.calcTpl.compiledSeq = [];
 | 
	
		
			
				|  |  | +        if (me.calcTemplate && me.calcTemplate.calcItems && me.calcTemplate.calcItems.length > 0) {
 | 
	
		
			
				|  |  | +            me.calcTemplate.compiledSeq = [];
 | 
	
		
			
				|  |  |              me.compileAssistantObj = {};
 | 
	
		
			
				|  |  |              //1. first round -> prepare
 | 
	
		
			
				|  |  |              private_comile_feeFile();
 | 
	
		
			
				|  |  | -            for (let i = 0; i < me.calcTpl.calcItems.length; i++) {
 | 
	
		
			
				|  |  | -                let item = me.calcTpl.calcItems[i];
 | 
	
		
			
				|  |  | +            for (let i = 0; i < me.calcTemplate.calcItems.length; i++) {
 | 
	
		
			
				|  |  | +                let item = me.calcTemplate.calcItems[i];
 | 
	
		
			
				|  |  |                  me.compileAssistantObj[item.ID] = item;
 | 
	
		
			
				|  |  |                  me.compileAssistantObj[item.ID + "_idx"] = i;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              //2. second round -> go!
 | 
	
		
			
				|  |  | -            for (let i = 0; i < me.calcTpl.calcItems.length; i++) {
 | 
	
		
			
				|  |  | -                private_setup_seq(me.calcTpl.calcItems[i], i);
 | 
	
		
			
				|  |  | +            for (let i = 0; i < me.calcTemplate.calcItems.length; i++) {
 | 
	
		
			
				|  |  | +                private_setup_seq(me.calcTemplate.calcItems[i], i);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              if (me.errs.length == 0) {
 | 
	
		
			
				|  |  |                  private_compile_items();
 | 
	
	
		
			
				|  | @@ -172,18 +149,34 @@ class calculation {
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      };
 | 
	
		
			
				|  |  | -    calculate( $RATION){
 | 
	
		
			
				|  |  | +    calculate($RATION){         // 参数$RATION也可以是清单
 | 
	
		
			
				|  |  |          let me = this;
 | 
	
		
			
				|  |  |          if ($RATION && me.hasCompiled) {
 | 
	
		
			
				|  |  |              let $CE = executeObj;
 | 
	
		
			
				|  |  | -            $CE.currentRationItem = $RATION;
 | 
	
		
			
				|  |  | -            $CE.currentTpl = me;
 | 
	
		
			
				|  |  | -            $CE.currentFeeRateFile = me.calFee;
 | 
	
		
			
				|  |  | +            $CE.ration = $RATION;
 | 
	
		
			
				|  |  | +            $CE.calculation = me;
 | 
	
		
			
				|  |  | +            $CE.feeRate = me.feeRate;
 | 
	
		
			
				|  |  |              $CE.compiledFeeRateFile = me.compiledFee;
 | 
	
		
			
				|  |  | -            for (let idx of me.calcTpl.compiledSeq) {
 | 
	
		
			
				|  |  | -                let item = me.calcTpl.calcItems[idx];
 | 
	
		
			
				|  |  | -                item.unitFee = eval(item.compiledExpr);
 | 
	
		
			
				|  |  | -                item.totalFee = item.unitFee * 3;     // AAAAA 5为测试值 $RATION.data.Quantity
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            if (!$RATION.fees) {
 | 
	
		
			
				|  |  | +                $RATION.fees = [];
 | 
	
		
			
				|  |  | +                $RATION.feesIndex = {};
 | 
	
		
			
				|  |  | +            };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            for (let idx of me.calcTemplate.compiledSeq) {
 | 
	
		
			
				|  |  | +                let calcItem = me.calcTemplate.calcItems[idx];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                // 这两项用于界面显示。
 | 
	
		
			
				|  |  | +                calcItem.unitFee = eval(calcItem.compiledExpr);   // AAAAA 如果eval()对清单树有影响,就换成小麦的Expression对象再试
 | 
	
		
			
				|  |  | +                calcItem.totalFee = calcItem.unitFee * 3;     // AAAAA 测试值,因目前定额无数量(保存不上) $RATION.data.Quantity
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                // 费用同步到定额
 | 
	
		
			
				|  |  | +                // 引入小麦的字段检测后,快速切换定额出现计算卡顿现象,过多的循环造成。这里把她的代码拆出来,减少微循环。
 | 
	
		
			
				|  |  | +                if (!$RATION.feesIndex[calcItem.type]){
 | 
	
		
			
				|  |  | +                    calcFees.addFee($RATION, calcItem.type);
 | 
	
		
			
				|  |  | +                };
 | 
	
		
			
				|  |  | +                $RATION.feesIndex[calcItem.type].unitFee = calcItem.unitFee;
 | 
	
		
			
				|  |  | +                $RATION.feesIndex[calcItem.type].totalFee = calcItem.totalFee;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 |