|  | @@ -1,6 +1,7 @@
 | 
	
		
			
				|  |  |  /**
 | 
	
		
			
				|  |  |   * Created by Tony on 2017/6/21.
 | 
	
		
			
				|  |  |   * Modified by CSL, 2017-08-01
 | 
	
		
			
				|  |  | + * 引入多套计算程序、费率同步、人工系数同步、改进基数计算、费字段映射等。
 | 
	
		
			
				|  |  |   */
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  let executeObj = {
 | 
	
	
		
			
				|  | @@ -40,14 +41,40 @@ let executeObj = {
 | 
	
		
			
				|  |  |  };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  class Calculation {
 | 
	
		
			
				|  |  | -/*    init(template, feeRates){
 | 
	
		
			
				|  |  | +    // 先编译公用的基础数据
 | 
	
		
			
				|  |  | +    compilePublics(feeRates, labourCoes, feeTypes){
 | 
	
		
			
				|  |  |          let me = this;
 | 
	
		
			
				|  |  | -        me.template = template;
 | 
	
		
			
				|  |  | -        me.feeRates = feeRates;
 | 
	
		
			
				|  |  | -        me.hasCompiled = false;
 | 
	
		
			
				|  |  | -    };*/
 | 
	
		
			
				|  |  | +        let private_compile_feeFile = function() {
 | 
	
		
			
				|  |  | +            if (feeRates) {
 | 
	
		
			
				|  |  | +                me.compiledFeeRates = {};
 | 
	
		
			
				|  |  | +                for (let rate of feeRates) {
 | 
	
		
			
				|  |  | +                    me.compiledFeeRates["feeRate_" + rate.ID] = rate;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        };
 | 
	
		
			
				|  |  | +        let private_compile_labourCoeFile = function() {
 | 
	
		
			
				|  |  | +            if (labourCoes) {
 | 
	
		
			
				|  |  | +                me.compiledLabourCoes = {};
 | 
	
		
			
				|  |  | +                for (let coe of labourCoes) {
 | 
	
		
			
				|  |  | +                    me.compiledLabourCoes["LabourCoe_" + coe.ID] = coe;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        };
 | 
	
		
			
				|  |  | +        let private_compile_feeType = function() {
 | 
	
		
			
				|  |  | +            if (feeTypes) {
 | 
	
		
			
				|  |  | +                me.compiledFeeTypes = {};
 | 
	
		
			
				|  |  | +                for (let ft of feeTypes) {
 | 
	
		
			
				|  |  | +                    me.compiledFeeTypes[ft.type] = ft.name;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    compile(template, feeRates, labourCoes){
 | 
	
		
			
				|  |  | +        private_compile_feeFile();
 | 
	
		
			
				|  |  | +        private_compile_labourCoeFile();
 | 
	
		
			
				|  |  | +        private_compile_feeType();
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    compileTemplate(template){
 | 
	
		
			
				|  |  |          let me = this;
 | 
	
		
			
				|  |  |          template.hasCompiled = false;
 | 
	
		
			
				|  |  |          template.errs = [];
 | 
	
	
		
			
				|  | @@ -109,44 +136,32 @@ class Calculation {
 | 
	
		
			
				|  |  |                  let item = template.calcItems[idx];
 | 
	
		
			
				|  |  |                  item.compiledExpr = item.expression.split('@(').join('$CE.at(');
 | 
	
		
			
				|  |  |                  item.compiledExpr = item.compiledExpr.split('base(').join('$CE.base(');
 | 
	
		
			
				|  |  | -                //item.compiledExpr = item.compiledExpr.split('rate(').join('$CE.rate(');
 | 
	
		
			
				|  |  | -                //item.compiledExpr = item.compiledExpr.split('factor(').join('$CE.factor(');
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |                  if (item.labourCoeID){
 | 
	
		
			
				|  |  |                      let lc = me.compiledLabourCoes["LabourCoe_" + item.labourCoeID].coe;
 | 
	
		
			
				|  |  |                      item.dispExpr = item.dispExpr.replace(/L/gi, lc.toString());
 | 
	
		
			
				|  |  |                      item.compiledExpr = item.compiledExpr.replace(/L/gi, lc.toString());
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -        };
 | 
	
		
			
				|  |  | -        let private_compile_feeFile = function() {
 | 
	
		
			
				|  |  | -            if (feeRates) {
 | 
	
		
			
				|  |  | -                me.compiledFeeRate = {};
 | 
	
		
			
				|  |  | -                for (let rate of feeRates) {
 | 
	
		
			
				|  |  | -                    me.compiledFeeRate["feeRate_" + rate.ID] = rate;
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -        };
 | 
	
		
			
				|  |  | -        let private_compile_labourCoeFile = function() {
 | 
	
		
			
				|  |  | -            if (labourCoes) {
 | 
	
		
			
				|  |  | -                me.compiledLabourCoes = {};
 | 
	
		
			
				|  |  | -                for (let coe of labourCoes) {
 | 
	
		
			
				|  |  | -                    me.compiledLabourCoes["LabourCoe_" + coe.ID] = coe;
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | +                };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                if (item.feeRateID) {
 | 
	
		
			
				|  |  | +                    item.feeRate = me.compiledFeeRates["feeRate_" + item.feeRateID].rate;
 | 
	
		
			
				|  |  | +                };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                // 字段名映射
 | 
	
		
			
				|  |  | +                item.displayFieldName = me.compiledFeeTypes[item.fieldName];
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          if (template && template.calcItems && template.calcItems.length > 0) {
 | 
	
		
			
				|  |  |              template.compiledSeq = [];
 | 
	
		
			
				|  |  |              template.compiledTemplate = {};
 | 
	
		
			
				|  |  | -            //1. first round -> prepare
 | 
	
		
			
				|  |  | -            private_compile_feeFile();
 | 
	
		
			
				|  |  | -            private_compile_labourCoeFile();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |              for (let i = 0; i < template.calcItems.length; i++) {
 | 
	
		
			
				|  |  |                  let item = template.calcItems[i];
 | 
	
		
			
				|  |  |                  template.compiledTemplate[item.ID] = item;
 | 
	
		
			
				|  |  |                  template.compiledTemplate[item.ID + "_idx"] = i;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -            //2. second round -> go!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |              for (let i = 0; i < template.calcItems.length; i++) {
 | 
	
		
			
				|  |  |                  private_setup_seq(template.calcItems[i], i);
 | 
	
		
			
				|  |  |              }
 | 
	
	
		
			
				|  | @@ -156,7 +171,7 @@ class Calculation {
 | 
	
		
			
				|  |  |              } else {
 | 
	
		
			
				|  |  |                  console.log('errors: ' + template.errs.toString());
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +        };
 | 
	
		
			
				|  |  |      };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      calculate($treeNode){
 | 
	
	
		
			
				|  | @@ -175,13 +190,10 @@ class Calculation {
 | 
	
		
			
				|  |  |              for (let idx of template.compiledSeq) {
 | 
	
		
			
				|  |  |                  let calcItem = template.calcItems[idx];
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                let feeRate = 100;    // 100%
 | 
	
		
			
				|  |  | -                // 下面三项用于界面显示。
 | 
	
		
			
				|  |  | -                if (calcItem.feeRateID) {
 | 
	
		
			
				|  |  | -                    feeRate = me.compiledFeeRate["feeRate_" + calcItem.feeRateID].rate;
 | 
	
		
			
				|  |  | -                    calcItem.feeRate = feeRate;
 | 
	
		
			
				|  |  | -                };
 | 
	
		
			
				|  |  | +                let feeRate = calcItem.feeRate;
 | 
	
		
			
				|  |  | +                if (!feeRate) feeRate = 100;    // 100%
 | 
	
		
			
				|  |  |                  calcItem.unitFee = eval(calcItem.compiledExpr) * feeRate * 0.01;   // 如果eval()对清单树有影响,就换成小麦的Expression对象再试
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |                  let quantity = $treeNode.data.quantity;
 | 
	
		
			
				|  |  |                  if (!quantity) quantity = 0;
 | 
	
		
			
				|  |  |                  calcItem.totalFee = calcItem.unitFee * quantity;
 |