|  | @@ -343,10 +343,10 @@ let executeObj = {
 | 
	
		
			
				|  |  |                  for (let glj of me.treeNode.data.gljList) {
 | 
	
		
			
				|  |  |                      let price = 0;
 | 
	
		
			
				|  |  |                      if (base.gljTypes.indexOf(glj.type) >= 0) {
 | 
	
		
			
				|  |  | -                        if (base.calcType == baseCalc){ price = parseFloat(glj["basePrice"]);}
 | 
	
		
			
				|  |  | -                        else if (base.calcType == adjustCalc){price = parseFloat(glj["adjustPrice"]);}
 | 
	
		
			
				|  |  | -                        else if (base.calcType == budgetCalc){price = parseFloat(glj["marketPrice"]);}
 | 
	
		
			
				|  |  | -                        else if (base.calcType == diffCalc){
 | 
	
		
			
				|  |  | +                        if (base.calcType == baseCalcType.baseCalc){ price = parseFloat(glj["basePrice"]);}
 | 
	
		
			
				|  |  | +                        else if (base.calcType == baseCalcType.adjustCalc){price = parseFloat(glj["adjustPrice"]);}
 | 
	
		
			
				|  |  | +                        else if (base.calcType == baseCalcType.budgetCalc){price = parseFloat(glj["marketPrice"]);}
 | 
	
		
			
				|  |  | +                        else if (base.calcType == baseCalcType.diffCalc){
 | 
	
		
			
				|  |  |                              let aprice = glj["adjustPrice"] ? glj["adjustPrice"] : 0;
 | 
	
		
			
				|  |  |                              let mprice = glj["marketPrice"] ? glj["marketPrice"] : 0;
 | 
	
		
			
				|  |  |                              price = (parseFloat(mprice) - parseFloat(aprice)).toDecimal(me.digitDefault);
 | 
	
	
		
			
				|  | @@ -639,32 +639,76 @@ class CalcProgram {
 | 
	
		
			
				|  |  |              };
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        function isBaseFeeType(type){
 | 
	
		
			
				|  |  | +            return ['labour', 'material', 'machine', 'mainMaterial', 'equipment'].indexOf(type) > -1;
 | 
	
		
			
				|  |  | +        };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          // 汇总定额或子清单的费用类别
 | 
	
		
			
				|  |  | -        if (treeNode.calcType == treeNodeCalcType.ctGatherRations || treeNode.calcType == treeNodeCalcType.ctGatherBills){
 | 
	
		
			
				|  |  | +        if (treeNode.calcType == treeNodeCalcType.ctGatherRationsFees || treeNode.calcType == treeNodeCalcType.ctGatherBillsFees){
 | 
	
		
			
				|  |  |              treeNode.data.programID = null;
 | 
	
		
			
				|  |  |              initFees(treeNode);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            let objsArr = (treeNode.calcType == treeNodeCalcType.ctGatherRations) ? project.Ration.getRationsByNode(treeNode) : treeNode.children;
 | 
	
		
			
				|  |  | +            let objsArr = (treeNode.calcType == treeNodeCalcType.ctGatherRationsFees) ? project.Ration.getRationsByNode(treeNode) : treeNode.children;
 | 
	
		
			
				|  |  |              let rst = [];
 | 
	
		
			
				|  |  |              for (let ft of feeType) {
 | 
	
		
			
				|  |  |                  let ftObj = {};
 | 
	
		
			
				|  |  |                  ftObj.fieldName = ft.type;
 | 
	
		
			
				|  |  |                  ftObj.name = ft.name;
 | 
	
		
			
				|  |  | -                let uf = 0, tf = 0, tuf = 0, ttf = 0;
 | 
	
		
			
				|  |  | -                for (let item of objsArr) {
 | 
	
		
			
				|  |  | -                    let data = (treeNode.calcType == treeNodeCalcType.ctGatherRations) ? item : item.data;
 | 
	
		
			
				|  |  | -                    if (data.feesIndex && data.feesIndex[ft.type]) {
 | 
	
		
			
				|  |  | -                        uf = (uf + parseFloat(data.feesIndex[ft.type].unitFee)).toDecimal(me.digitDefault);
 | 
	
		
			
				|  |  | -                        tf = (tf + parseFloat(data.feesIndex[ft.type].totalFee)).toDecimal(me.digitDefault);
 | 
	
		
			
				|  |  | -                        tuf = (tuf + parseFloat(data.feesIndex[ft.type].tenderUnitFee)).toDecimal(me.digitDefault);
 | 
	
		
			
				|  |  | -                        ttf = (ttf + parseFloat(data.feesIndex[ft.type].tenderTotalFee)).toDecimal(me.digitDefault);
 | 
	
		
			
				|  |  | +                let buf = 0, btf = 0, btuf = 0, bttf = 0;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                if (treeNode.calcType == treeNodeCalcType.ctGatherBillsFees){
 | 
	
		
			
				|  |  | +                    for (let item of objsArr) {
 | 
	
		
			
				|  |  | +                        let data = item.data;
 | 
	
		
			
				|  |  | +                        if (data.feesIndex && data.feesIndex[ft.type]) {
 | 
	
		
			
				|  |  | +                            buf = (buf + parseFloat(data.feesIndex[ft.type].unitFee)).toDecimal(me.digitDefault);
 | 
	
		
			
				|  |  | +                            btf = (btf + parseFloat(data.feesIndex[ft.type].totalFee)).toDecimal(me.digitDefault);
 | 
	
		
			
				|  |  | +                            btuf = (btuf + parseFloat(data.feesIndex[ft.type].tenderUnitFee)).toDecimal(me.digitDefault);
 | 
	
		
			
				|  |  | +                            bttf = (bttf + parseFloat(data.feesIndex[ft.type].tenderTotalFee)).toDecimal(me.digitDefault);
 | 
	
		
			
				|  |  | +                        };
 | 
	
		
			
				|  |  | +                    };
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                else if (treeNode.calcType == treeNodeCalcType.ctGatherRationsFees){     // 这里的算法要配合冷姐姐的神图才能看懂^_^
 | 
	
		
			
				|  |  | +                    let sum_rtf = 0, sum_rttf = 0;
 | 
	
		
			
				|  |  | +                    let bq = parseFloat(treeNode.data.quantity ? treeNode.data.quantity : 1);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    for (let data of objsArr) {
 | 
	
		
			
				|  |  | +                        let rq = parseFloat(data.quantity ? data.quantity : 0);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                        let ruf = 0, rtuf = 0, rtf = 0, rttf = 0;
 | 
	
		
			
				|  |  | +                        if (data.feesIndex && data.feesIndex[ft.type]) {
 | 
	
		
			
				|  |  | +                            ruf = parseFloat(data.feesIndex[ft.type].unitFee);
 | 
	
		
			
				|  |  | +                            rtuf = parseFloat(data.feesIndex[ft.type].tenderUnitFee);
 | 
	
		
			
				|  |  | +                            rtf = parseFloat(data.feesIndex[ft.type].totalFee);
 | 
	
		
			
				|  |  | +                            rttf = parseFloat(data.feesIndex[ft.type].tenderTotalFee);
 | 
	
		
			
				|  |  | +                        };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                        if (me.project.projSetting.billsCalcMode === leafBillGetFeeType.rationContent) {
 | 
	
		
			
				|  |  | +                            buf = (buf + (ruf * rq / bq).toDecimal(2)).toDecimal(2);
 | 
	
		
			
				|  |  | +                            btuf = (btuf + (rtuf * rq / bq).toDecimal(2)).toDecimal(2);
 | 
	
		
			
				|  |  | +                        };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                        sum_rtf = (sum_rtf + rtf).toDecimal(2);
 | 
	
		
			
				|  |  | +                        sum_rttf = (sum_rttf + rttf).toDecimal(2);
 | 
	
		
			
				|  |  | +                    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    if (me.project.projSetting.billsCalcMode === leafBillGetFeeType.rationPrice || me.project.projSetting.billsCalcMode === leafBillGetFeeType.rationPriceConverse) {
 | 
	
		
			
				|  |  | +                        buf = (sum_rtf / bq).toDecimal(2);
 | 
	
		
			
				|  |  | +                        btuf = (sum_rttf / bq).toDecimal(2);
 | 
	
		
			
				|  |  | +                    };
 | 
	
		
			
				|  |  | +                    if (isBaseFeeType(ft.type) || (me.project.projSetting.billsCalcMode === leafBillGetFeeType.rationPriceConverse && ft.type == "common")){
 | 
	
		
			
				|  |  | +                        btf = sum_rtf;
 | 
	
		
			
				|  |  | +                        bttf = sum_rttf;
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    else{
 | 
	
		
			
				|  |  | +                        btf = (buf * bq).toDecimal(2);
 | 
	
		
			
				|  |  | +                        bttf = (btuf * bq).toDecimal(2);
 | 
	
		
			
				|  |  |                      };
 | 
	
		
			
				|  |  |                  };
 | 
	
		
			
				|  |  | -                ftObj.unitFee = uf.toDecimal(me.digit);
 | 
	
		
			
				|  |  | -                ftObj.totalFee = tf.toDecimal(me.digit);
 | 
	
		
			
				|  |  | -                ftObj.tenderUnitFee = tuf.toDecimal(me.digit);
 | 
	
		
			
				|  |  | -                ftObj.tenderTotalFee = ttf.toDecimal(me.digit);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +                ftObj.unitFee = buf;
 | 
	
		
			
				|  |  | +                ftObj.totalFee = btf;
 | 
	
		
			
				|  |  | +                ftObj.tenderUnitFee = btuf;
 | 
	
		
			
				|  |  | +                ftObj.tenderTotalFee = bttf;
 | 
	
		
			
				|  |  |                  checkFee(treeNode, ftObj);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  rst.push(ftObj);
 | 
	
	
		
			
				|  | @@ -742,25 +786,26 @@ class CalcProgram {
 | 
	
		
			
				|  |  |          let isRation = treeNode.sourceType === me.project.Ration.getSourceType();
 | 
	
		
			
				|  |  |          let isBill = treeNode.sourceType === me.project.Bills.getSourceType();
 | 
	
		
			
				|  |  |          let isBillPriceCalc = me.project.projSetting.billsCalcMode === leafBillGetFeeType.billsPrice;
 | 
	
		
			
				|  |  | +        let isLeafBill = me.isLeafBill(treeNode);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          if (isRation){
 | 
	
		
			
				|  |  |              treeNode.calcType = treeNodeCalcType.ctRationCalcProgram;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        else if (me.isLeafBill(treeNode)) {
 | 
	
		
			
				|  |  | +        else if (isLeafBill) {
 | 
	
		
			
				|  |  |              if (treeNode.children && treeNode.children.length > 0){
 | 
	
		
			
				|  |  | -                me.calcLeafBillChildren(treeNode);
 | 
	
		
			
				|  |  | +                // me.calcLeafBillChildren(treeNode);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                if (isBillPriceCalc)                        // 清单单价计算模式下的叶子清单:取自己的计算程序ID,找到自己的计算程序计算
 | 
	
		
			
				|  |  | +                if (isBillPriceCalc)                        // 清单单价计算模式下的叶子清单:取自己的计算程序ID,找到自己的计算程序计算。(汇总清单所有定额的工料机)
 | 
	
		
			
				|  |  |                      treeNode.calcType = treeNodeCalcType.ctBillCalcProgram;
 | 
	
		
			
				|  |  |                  else                                        // 前三种计算模式下的叶子清单:汇总定额的计算程序的费用类别
 | 
	
		
			
				|  |  | -                    treeNode.calcType = treeNodeCalcType.ctGatherRations;
 | 
	
		
			
				|  |  | +                    treeNode.calcType = treeNodeCalcType.ctGatherRationsFees;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              else{                                          // 公式计算
 | 
	
		
			
				|  |  |                  treeNode.calcType = treeNodeCalcType.ctCalcBaseValue;
 | 
	
		
			
				|  |  |              };
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          else if (isBill)                                 // 父清单:汇总子清单的费用类别
 | 
	
		
			
				|  |  | -            treeNode.calcType = treeNodeCalcType.ctGatherBills;
 | 
	
		
			
				|  |  | +            treeNode.calcType = treeNodeCalcType.ctGatherBillsFees;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          me.InnerCalc(treeNode);
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -848,6 +893,7 @@ class CalcProgram {
 | 
	
		
			
				|  |  |      // 重新计算叶子清单下的所有子结点:如定额、工料机定额等(calculate算法基于定额、工料机定额的计算结果是正确的,实际上有时它们的计算结果并不是最新的)
 | 
	
		
			
				|  |  |      calcLeafBillChildren(treeNode){
 | 
	
		
			
				|  |  |          let me = this;
 | 
	
		
			
				|  |  | +        if(!me.isLeafBill(treeNode)) return;
 | 
	
		
			
				|  |  |          if (treeNode.children && treeNode.children.length > 0) {
 | 
	
		
			
				|  |  |              let needSaveNodes = [];
 | 
	
		
			
				|  |  |              for (let child of treeNode.children){
 |