|  | @@ -98,28 +98,16 @@ let defaultBillTemplate = {
 | 
	
		
			
				|  |  |      ]
 | 
	
		
			
				|  |  |  };*/
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -const priceTypes = {ptBasePrice: 1, ptAdjustPrice: 2, ptMarketPrice: 3, ptDiffPrice: 4};
 | 
	
		
			
				|  |  | -const cpFeeTypes = [
 | 
	
		
			
				|  |  | -    {type: 'direct', name: '直接费'},
 | 
	
		
			
				|  |  | -    {type: 'labour', name: '人工费'},
 | 
	
		
			
				|  |  | -    {type: 'material', name: '材料费'},
 | 
	
		
			
				|  |  | -    {type: 'machine', name: '机械费'},
 | 
	
		
			
				|  |  | -    {type: 'mainMaterial', name: '主材费'},
 | 
	
		
			
				|  |  | -    {type: 'equipment', name: '设备费'},
 | 
	
		
			
				|  |  | -    {type: 'manage', name: '企业管理费'},
 | 
	
		
			
				|  |  | -    {type: 'profit', name: '利润'},
 | 
	
		
			
				|  |  | -    {type: 'risk', name: '风险费'},
 | 
	
		
			
				|  |  | -    {type: 'labourDiff', name: '人工价差'},
 | 
	
		
			
				|  |  | -    {type: 'materialDiff', name: '材料价差'},
 | 
	
		
			
				|  |  | -    {type: 'machineDiff', name: '机械价差'},
 | 
	
		
			
				|  |  | -    {type: 'adjustLabour', name: '调整人工费'},
 | 
	
		
			
				|  |  | -    {type: 'adjustMachineLabour', name: '调整机上人工费'},
 | 
	
		
			
				|  |  | -    {type: 'estimate', name: '暂估费'},
 | 
	
		
			
				|  |  | -    {type: 'fee1', name: '甲供材料费'},
 | 
	
		
			
				|  |  | -    {type: 'common', name: '工程造价'}
 | 
	
		
			
				|  |  | -];
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -let nodeTools = {
 | 
	
		
			
				|  |  | +let calcTools = {
 | 
	
		
			
				|  |  | +    getNodeByFlag: function (flag) {
 | 
	
		
			
				|  |  | +        let bill = cbTools.findBill(flag);
 | 
	
		
			
				|  |  | +        if (bill) return this.getNodeByID(bill.ID)
 | 
	
		
			
				|  |  | +        else return null;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    getNodeByID: function (ID){
 | 
	
		
			
				|  |  | +        return cbTools.getNodeByID(ID);
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      isBill: function(treeNode){
 | 
	
		
			
				|  |  |          return treeNode.sourceType === ModuleNames.bills;
 | 
	
		
			
				|  |  |      },
 | 
	
	
		
			
				|  | @@ -135,18 +123,17 @@ let nodeTools = {
 | 
	
		
			
				|  |  |          return treeNode.data.flagsIndex && treeNode.data.flagsIndex.fixed && treeNode.data.flagsIndex.fixed.flag &&
 | 
	
		
			
				|  |  |              treeNode.data.flagsIndex.fixed.flag == fixedFlag.ENGINEERINGCOST;
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |      isRationCategory: function(treeNode){
 | 
	
		
			
				|  |  |          return treeNode.sourceType === ModuleNames.ration;
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  | -    isRation: function(treeNode){
 | 
	
		
			
				|  |  | -        return treeNode.sourceType === ModuleNames.ration && treeNode.data.type === rationType.ration;
 | 
	
		
			
				|  |  | +    isRationItem: function(treeNode){
 | 
	
		
			
				|  |  | +        return this.isRationCategory(treeNode) && treeNode.data.type === rationType.ration;
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      isVolumePrice: function (treeNode) {
 | 
	
		
			
				|  |  | -        return treeNode.sourceType === ModuleNames.ration && treeNode.data.type === rationType.volumePrice;
 | 
	
		
			
				|  |  | +        return this.isRationCategory(treeNode) && treeNode.data.type === rationType.volumePrice;
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      isGljRation: function (treeNode) {
 | 
	
		
			
				|  |  | -        return treeNode.sourceType === ModuleNames.ration && treeNode.data.type === rationType.gljRation;
 | 
	
		
			
				|  |  | +        return this.isRationCategory(treeNode) && treeNode.data.type === rationType.gljRation;
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      initFees: function (treeNode){
 | 
	
	
		
			
				|  | @@ -203,33 +190,6 @@ let nodeTools = {
 | 
	
		
			
				|  |  |              treeNode.changed = true;
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  | -    getCalcType: function (treeNode) {
 | 
	
		
			
				|  |  | -        if (this.isRationCategory(treeNode)){
 | 
	
		
			
				|  |  | -            return treeNodeCalcType.ctRationCalcProgram;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        else if (this.isNullBill(treeNode)){
 | 
	
		
			
				|  |  | -            return treeNodeCalcType.ctNull;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        else if (this.isLeafBill(treeNode)) {
 | 
	
		
			
				|  |  | -            if (treeNode.children && treeNode.children.length > 0){
 | 
	
		
			
				|  |  | -                // 清单单价计算模式下的叶子清单:取自己的计算程序ID,找到自己的计算程序计算。(汇总清单所有定额的工料机)
 | 
	
		
			
				|  |  | -                if (projectObj.project.property.billsCalcMode === leafBillGetFeeType.billsPrice)
 | 
	
		
			
				|  |  | -                    return treeNodeCalcType.ctBillCalcProgram;
 | 
	
		
			
				|  |  | -                else                                        // 前三种计算模式下的叶子清单:汇总定额的计算程序的费用类别
 | 
	
		
			
				|  |  | -                    return treeNodeCalcType.ctGatherRationsFees;
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            else{                                          // 公式计算
 | 
	
		
			
				|  |  | -                return treeNodeCalcType.ctCalcBaseValue;
 | 
	
		
			
				|  |  | -            };
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        else if (this.isBill(treeNode)) {                              // 父清单:汇总子清单的费用类别
 | 
	
		
			
				|  |  | -            return treeNodeCalcType.ctGatherBillsFees;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        else {
 | 
	
		
			
				|  |  | -            return treeNodeCalcType.ctRationCalcProgram;
 | 
	
		
			
				|  |  | -        };
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |      // 参数fieldName值: 'common.totalFee'、'equipment.unitFee'
 | 
	
		
			
				|  |  |      getFee: function (treeNode, fieldName) {
 | 
	
		
			
				|  |  |          let ns = fieldName.split(".");
 | 
	
	
		
			
				|  | @@ -240,66 +200,40 @@ let nodeTools = {
 | 
	
		
			
				|  |  |          else
 | 
	
		
			
				|  |  |              return 0;
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  | -    getNodeByFlag: function (flag) {
 | 
	
		
			
				|  |  | -        let bill = cbTools.findBill(flag);
 | 
	
		
			
				|  |  | -        if (bill) return this.getNodeByID(bill.ID)
 | 
	
		
			
				|  |  | -        else return null;
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  | -    getNodeByID: function (ID){
 | 
	
		
			
				|  |  | -        return cbTools.getNodeByID(ID);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -};
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -let assistCalcer = {
 | 
	
		
			
				|  |  | -    // 界面显示的结点的工程量的数值。
 | 
	
		
			
				|  |  | -    uiQuantity: function (treeNode){
 | 
	
		
			
				|  |  | -        return parseFloatPlus(treeNode.data.quantity).toDecimal(decimalObj.decimal("quantity", treeNode));
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  | -    // 界面显示的工料机价格,包括定额价、市场价等。参数 price 传入一个普通的价格数值即可。
 | 
	
		
			
				|  |  | -    uiGLJPrice: function (price){
 | 
	
		
			
				|  |  | -        if (price)
 | 
	
		
			
				|  |  | -            return parseFloat(price).toDecimal(decimalObj.glj.unitPrice)
 | 
	
		
			
				|  |  | -        else return 0;
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  | -    // 界面显示的工料机数量。参数 quantity 传入一个普通的数量数值即可。
 | 
	
		
			
				|  |  | -    uiGLJQuantity: function (quantity){
 | 
	
		
			
				|  |  | -        if (quantity)
 | 
	
		
			
				|  |  | -            return parseFloat(quantity).toDecimal(decimalObj.glj.quantity)
 | 
	
		
			
				|  |  | -        else return 0;
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  |      rationBaseFee: function (treeNode, gljTypes, priceType){
 | 
	
		
			
				|  |  |          if (!treeNode.data.gljList) return 0;
 | 
	
		
			
				|  |  | -        let result = 0;
 | 
	
		
			
				|  |  | -        let me = this;
 | 
	
		
			
				|  |  | +        let me = this, result = 0;
 | 
	
		
			
				|  |  |          for (let glj of treeNode.data.gljList) {
 | 
	
		
			
				|  |  |              let price = 0, temp = 0;
 | 
	
		
			
				|  |  |              if (gljTypes.indexOf(glj.type) >= 0) {
 | 
	
		
			
				|  |  |                  if (priceType == priceTypes.ptDiffPrice){
 | 
	
		
			
				|  |  |                      let aprice = me.uiGLJPrice(glj["adjustPrice"]);
 | 
	
		
			
				|  |  |                      let mprice = me.uiGLJPrice(glj["marketPrice"]);
 | 
	
		
			
				|  |  | -                    temp = (me.uiGLJQuantity(glj["quantity"]) * mprice).toDecimal(decimalObj.ration.unitPrice) - (me.uiGLJQuantity(glj["quantity"]) * aprice).toDecimal(decimalObj.ration.unitPrice);
 | 
	
		
			
				|  |  | +                    temp = (me.uiGLJQty(glj["quantity"]) * mprice).toDecimal(decimalObj.ration.unitPrice) - (me.uiGLJQty(glj["quantity"]) * aprice).toDecimal(decimalObj.ration.unitPrice);
 | 
	
		
			
				|  |  |                      temp = temp.toDecimal(decimalObj.ration.unitPrice);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |                  else {
 | 
	
		
			
				|  |  |                      if (priceType == priceTypes.ptBasePrice){ price = me.uiGLJPrice(glj["basePrice"]);}
 | 
	
		
			
				|  |  |                      else if (priceType == priceTypes.ptAdjustPrice){price = me.uiGLJPrice(glj["adjustPrice"]);}
 | 
	
		
			
				|  |  |                      else if (priceType == priceTypes.ptMarketPrice){price = me.uiGLJPrice(glj["marketPrice"]);}
 | 
	
		
			
				|  |  | -                    temp = (me.uiGLJQuantity(glj["quantity"]) * price).toDecimal(decimalObj.ration.unitPrice);
 | 
	
		
			
				|  |  | +                    temp = (me.uiGLJQty(glj["quantity"]) * price).toDecimal(decimalObj.process);
 | 
	
		
			
				|  |  |                  };
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                result = (result + temp).toDecimal(decimalObj.ration.unitPrice);
 | 
	
		
			
				|  |  | +                result = (result + temp).toDecimal(decimalObj.process);
 | 
	
		
			
				|  |  |              };
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        result = result.toDecimal(decimalObj.ration.unitPrice);
 | 
	
		
			
				|  |  |          return result;
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      machineLabourFee: function (gljArr) {
 | 
	
		
			
				|  |  |          if (!gljArr) return 0;
 | 
	
		
			
				|  |  | -        let result = 0, mdSum = 0;
 | 
	
		
			
				|  |  | +        let result = 0;
 | 
	
		
			
				|  |  |          for (let glj of gljArr) {
 | 
	
		
			
				|  |  |              if (glj.type == gljType.GENERAL_MACHINE) {
 | 
	
		
			
				|  |  |                  // 获取机械组成物
 | 
	
		
			
				|  |  |                  let mds = projectObj.project.composition.getCompositionByGLJ(glj);
 | 
	
		
			
				|  |  |                  if (!mds) mds = [];
 | 
	
		
			
				|  |  | +                let mdSum = 0;
 | 
	
		
			
				|  |  |                  for (let md of mds) {
 | 
	
		
			
				|  |  |                      if (md.type == gljType.MACHINE_LABOUR) {
 | 
	
		
			
				|  |  |                          let q = md["consumption"] ? md["consumption"] : 0;
 | 
	
	
		
			
				|  | @@ -317,10 +251,10 @@ let assistCalcer = {
 | 
	
		
			
				|  |  |      estimateFee: function (treeNode, isBase = false){
 | 
	
		
			
				|  |  |          let me = this, sumU = 0, sumT = 0;
 | 
	
		
			
				|  |  |          // 父清单暂估费的汇总计算走计算程序逻辑,不在这里。
 | 
	
		
			
				|  |  | -        if (nodeTools.isTotalCostBill(treeNode)){
 | 
	
		
			
				|  |  | +        if (me.isTotalCostBill(treeNode)){
 | 
	
		
			
				|  |  |              let nodes = projectObj.project.mainTree.roots;
 | 
	
		
			
				|  |  |              for (let node of nodes){
 | 
	
		
			
				|  |  | -                if (nodeTools.isTotalCostBill(node)) break;
 | 
	
		
			
				|  |  | +                if (me.isTotalCostBill(node)) break;
 | 
	
		
			
				|  |  |                  let eU = 0, eT = 0;
 | 
	
		
			
				|  |  |                  if (node.data.feesIndex && node.data.feesIndex.estimate){
 | 
	
		
			
				|  |  |                      eU = node.data.feesIndex.estimate.unitFee;
 | 
	
	
		
			
				|  | @@ -351,12 +285,12 @@ let assistCalcer = {
 | 
	
		
			
				|  |  |                              for (let md of mds){
 | 
	
		
			
				|  |  |                                  if (md.isEstimate){
 | 
	
		
			
				|  |  |                                      let isExist = false;
 | 
	
		
			
				|  |  | -                                    let mdQ = (me.uiGLJQuantity(glj.quantity) * me.uiGLJQuantity(md.consumption)).toDecimal(decimalObj.process);
 | 
	
		
			
				|  |  | +                                    let mdQ = (me.uiGLJQty(glj.quantity) * me.uiGLJQty(md.consumption)).toDecimal(decimalObj.process);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                                      for (let obj of GLJObjs){
 | 
	
		
			
				|  |  |                                          if (gljOprObj.getIndex(md, gljKeyArray) == gljOprObj.getIndex(obj, gljKeyArray)){
 | 
	
		
			
				|  |  |                                              isExist = true;
 | 
	
		
			
				|  |  | -                                            obj.quantity = (me.uiGLJQuantity(obj.quantity) + mdQ).toDecimal(decimalObj.process);
 | 
	
		
			
				|  |  | +                                            obj.quantity = (me.uiGLJQty(obj.quantity) + mdQ).toDecimal(decimalObj.process);
 | 
	
		
			
				|  |  |                                              break;
 | 
	
		
			
				|  |  |                                          }
 | 
	
		
			
				|  |  |                                      };
 | 
	
	
		
			
				|  | @@ -371,16 +305,16 @@ let assistCalcer = {
 | 
	
		
			
				|  |  |              };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              for (let obj of GLJObjs){
 | 
	
		
			
				|  |  | -                sumU = sumU + (me.uiGLJQuantity(obj.quantity) * me.uiGLJPrice(obj.marketPrice)).toDecimal(decimalObj.process);
 | 
	
		
			
				|  |  | +                sumU = sumU + (me.uiGLJQty(obj.quantity) * me.uiGLJPrice(obj.marketPrice)).toDecimal(decimalObj.process);
 | 
	
		
			
				|  |  |                  sumU = sumU.toDecimal(decimalObj.process);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                let q = (me.uiGLJQuantity(obj.quantity) * me.uiQuantity(treeNode)).toDecimal(decimalObj.process);
 | 
	
		
			
				|  |  | +                let q = (me.uiGLJQty(obj.quantity) * me.uiNodeQty(treeNode)).toDecimal(decimalObj.glj.quantity);
 | 
	
		
			
				|  |  |                  sumT = sumT + (q * me.uiGLJPrice(obj.marketPrice)).toDecimal(decimalObj.process);
 | 
	
		
			
				|  |  |                  sumT = sumT.toDecimal(decimalObj.process);
 | 
	
		
			
				|  |  |              };
 | 
	
		
			
				|  |  |              sumU = sumU.toDecimal(decimalObj.bills.unitPrice);
 | 
	
		
			
				|  |  |              if (projectObj.project.property.zanguCalcMode == zanguCalcType.common){
 | 
	
		
			
				|  |  | -                sumT = (me.uiQuantity(treeNode) * sumU).toDecimal(decimalObj.bills.totalPrice);
 | 
	
		
			
				|  |  | +                sumT = (me.uiNodeQty(treeNode) * sumU).toDecimal(decimalObj.bills.totalPrice);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              else if (projectObj.project.property.zanguCalcMode == zanguCalcType.gatherMaterial){
 | 
	
		
			
				|  |  |                  sumT = sumT.toDecimal(decimalObj.bills.totalPrice);
 | 
	
	
		
			
				|  | @@ -390,7 +324,7 @@ let assistCalcer = {
 | 
	
		
			
				|  |  |          if (isBase)
 | 
	
		
			
				|  |  |              return sumU
 | 
	
		
			
				|  |  |          else
 | 
	
		
			
				|  |  | -            nodeTools.checkFeeField(treeNode, {'fieldName': 'estimate', 'unitFee': sumU, 'totalFee': sumT});
 | 
	
		
			
				|  |  | +            me.checkFeeField(treeNode, {'fieldName': 'estimate', 'unitFee': sumU, 'totalFee': sumT});
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      marketPriceToBase: function (treeNode, baseName) {
 | 
	
		
			
				|  |  |          if (treeNode.data.type != rationType.volumePrice && treeNode.data.type != rationType.gljRation) return;
 | 
	
	
		
			
				|  | @@ -415,56 +349,138 @@ let assistCalcer = {
 | 
	
		
			
				|  |  |                  'quantity': 1,
 | 
	
		
			
				|  |  |                  'type': treeNode.data.subType      // 注意:这里要取subType
 | 
	
		
			
				|  |  |              };
 | 
	
		
			
				|  |  | -            result = assistCalcer.machineLabourFee([glj]);
 | 
	
		
			
				|  |  | +            result = me.machineLabourFee([glj]);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          else if (
 | 
	
		
			
				|  |  |              (treeNode.data.type == rationType.gljRation) &&
 | 
	
		
			
				|  |  |              ((treeNode.data.subType === gljType.LABOUR && baseName === '人工费价差') ||
 | 
	
		
			
				|  |  | -            (baseMaterialTypes.includes(treeNode.data.subType) && baseName === '材料费价差') ||
 | 
	
		
			
				|  |  | -            (treeNode.data.subType === gljType.GENERAL_MACHINE && baseName === '机械费价差'))
 | 
	
		
			
				|  |  | +                (baseMaterialTypes.includes(treeNode.data.subType) && baseName === '材料费价差') ||
 | 
	
		
			
				|  |  | +                (treeNode.data.subType === gljType.GENERAL_MACHINE && baseName === '机械费价差'))
 | 
	
		
			
				|  |  |          ) {
 | 
	
		
			
				|  |  |              let aprice = me.uiGLJPrice(treeNode.data.adjustPrice);
 | 
	
		
			
				|  |  |              let mprice = me.uiGLJPrice(treeNode.data.marketUnitFee);
 | 
	
		
			
				|  |  |              result = (mprice - aprice).toDecimal(decimalObj.ration.unitPrice);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          return result;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    getCalcType: function (treeNode) {
 | 
	
		
			
				|  |  | +        if (this.isRationCategory(treeNode)){
 | 
	
		
			
				|  |  | +            return treeNodeCalcType.ctRationCalcProgram;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        else if (this.isNullBill(treeNode)){
 | 
	
		
			
				|  |  | +            return treeNodeCalcType.ctNull;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        else if (this.isLeafBill(treeNode)) {
 | 
	
		
			
				|  |  | +            if (treeNode.children && treeNode.children.length > 0){
 | 
	
		
			
				|  |  | +                // 清单单价计算模式下的叶子清单:取自己的计算程序ID,找到自己的计算程序计算。(汇总清单所有定额的工料机)
 | 
	
		
			
				|  |  | +                if (projectObj.project.property.billsCalcMode === leafBillGetFeeType.billsPrice)
 | 
	
		
			
				|  |  | +                    return treeNodeCalcType.ctBillCalcProgram;
 | 
	
		
			
				|  |  | +                else                                        // 前三种计算模式下的叶子清单:汇总定额的计算程序的费用类别
 | 
	
		
			
				|  |  | +                    return treeNodeCalcType.ctGatherRationsFees;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            else{                                          // 公式计算
 | 
	
		
			
				|  |  | +                return treeNodeCalcType.ctCalcBaseValue;
 | 
	
		
			
				|  |  | +            };
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        else if (this.isBill(treeNode)) {                              // 父清单:汇总子清单的费用类别
 | 
	
		
			
				|  |  | +            return treeNodeCalcType.ctGatherBillsFees;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        else {
 | 
	
		
			
				|  |  | +            return treeNodeCalcType.ctRationCalcProgram;
 | 
	
		
			
				|  |  | +        };
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    cutNodeForSave(treeNode){
 | 
	
		
			
				|  |  | +        let me = this;
 | 
	
		
			
				|  |  | +        /*  subType、quantity、calcBase、programID、marketUnitFee等等字段较为特殊,它们的改变一定会触发计算并导致计算
 | 
	
		
			
				|  |  | +            结果的变化,从而引发保存动作。将这些字段放在该位置跟计算结果一起保存,可减少前端跟后端的通讯频率。              */
 | 
	
		
			
				|  |  | +        let data = {
 | 
	
		
			
				|  |  | +            projectID: projectObj.project.ID(),
 | 
	
		
			
				|  |  | +            ID: treeNode.data.ID,
 | 
	
		
			
				|  |  | +            unit: treeNode.data.unit,   //对清单来说,改变单位,工程量精度会跟着改变从而影响计算。
 | 
	
		
			
				|  |  | +            subType: treeNode.data.subType,
 | 
	
		
			
				|  |  | +            quantity: treeNode.data.quantity,
 | 
	
		
			
				|  |  | +            calcBase: treeNode.data.calcBase,
 | 
	
		
			
				|  |  | +            calcBaseValue: treeNode.data.calcBaseValue,
 | 
	
		
			
				|  |  | +            programID: treeNode.data.programID,
 | 
	
		
			
				|  |  | +            marketUnitFee: treeNode.data.marketUnitFee,
 | 
	
		
			
				|  |  | +            marketTotalFee: treeNode.data.marketTotalFee,
 | 
	
		
			
				|  |  | +            fees: treeNode.data.fees,
 | 
	
		
			
				|  |  | +            isFromDetail:treeNode.data.isFromDetail,
 | 
	
		
			
				|  |  | +            feeRate: treeNode.data.feeRate,
 | 
	
		
			
				|  |  | +            feeRateID: treeNode.data.feeRateID,
 | 
	
		
			
				|  |  | +            contain: treeNode.data.contain,
 | 
	
		
			
				|  |  | +            quantityEXP: treeNode.data.quantityEXP,
 | 
	
		
			
				|  |  | +            summaryFees: treeNode.data.summaryFees
 | 
	
		
			
				|  |  | +        };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 定额大类
 | 
	
		
			
				|  |  | +        if (me.isRationCategory(treeNode)) {
 | 
	
		
			
				|  |  | +            data.isSubcontract = treeNode.data.isSubcontract;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //定额类型的工料机做特殊处理
 | 
	
		
			
				|  |  | +            if(me.isGljRation(treeNode)){
 | 
	
		
			
				|  |  | +                data.code = treeNode.data.code;
 | 
	
		
			
				|  |  | +                data.projectGLJID = treeNode.data.projectGLJID;
 | 
	
		
			
				|  |  | +                delete data.marketUnitFee;
 | 
	
		
			
				|  |  | +            };
 | 
	
		
			
				|  |  | +        };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 优化掉 undefined 属性
 | 
	
		
			
				|  |  | +        data = JSON.parse(JSON.stringify(data));
 | 
	
		
			
				|  |  | +        return data;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    uiNodeQty: function (treeNode){
 | 
	
		
			
				|  |  | +        return parseFloatPlus(treeNode.data.quantity).toDecimal(decimalObj.decimal("quantity", treeNode));
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    // 界面显示的工料机价格,包括定额价、市场价等。参数 price 传入一个普通的价格数值即可。
 | 
	
		
			
				|  |  | +    uiGLJPrice: function (price){
 | 
	
		
			
				|  |  | +        if (price)
 | 
	
		
			
				|  |  | +            return parseFloat(price).toDecimal(decimalObj.glj.unitPrice)
 | 
	
		
			
				|  |  | +        else return 0;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    // 界面显示的工料机数量。参数 quantity 传入一个普通的数量数值即可。
 | 
	
		
			
				|  |  | +    uiGLJQty: function (quantity){
 | 
	
		
			
				|  |  | +        if (quantity)
 | 
	
		
			
				|  |  | +            return parseFloat(quantity).toDecimal(decimalObj.glj.quantity)
 | 
	
		
			
				|  |  | +        else return 0;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -const rationCalcBaser = {
 | 
	
		
			
				|  |  | +const rationCalcBases = {
 | 
	
		
			
				|  |  |      '定额基价人工费': function (node) {
 | 
	
		
			
				|  |  | -        return assistCalcer.rationBaseFee(node, [gljType.LABOUR], priceTypes.ptBasePrice);
 | 
	
		
			
				|  |  | +        return calcTools.rationBaseFee(node, [gljType.LABOUR], priceTypes.ptBasePrice);
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      '定额基价材料费': function (node) {
 | 
	
		
			
				|  |  | -        return assistCalcer.rationBaseFee(node, baseMaterialTypes, priceTypes.ptBasePrice);
 | 
	
		
			
				|  |  | +        return calcTools.rationBaseFee(node, baseMaterialTypes, priceTypes.ptBasePrice);
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      '定额基价机械费': function (node) {
 | 
	
		
			
				|  |  | -        return assistCalcer.rationBaseFee(node, [gljType.GENERAL_MACHINE], priceTypes.ptBasePrice);
 | 
	
		
			
				|  |  | +        return calcTools.rationBaseFee(node, [gljType.GENERAL_MACHINE], priceTypes.ptBasePrice);
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      '定额基价机上人工费': function (node) {
 | 
	
		
			
				|  |  | -        return assistCalcer.machineLabourFee(node.data.gljList);
 | 
	
		
			
				|  |  | +        return calcTools.machineLabourFee(node.data.gljList);
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      '人工费价差': function (node) {
 | 
	
		
			
				|  |  | -        return assistCalcer.rationBaseFee(node, [gljType.LABOUR], priceTypes.ptDiffPrice);
 | 
	
		
			
				|  |  | +        return calcTools.rationBaseFee(node, [gljType.LABOUR], priceTypes.ptDiffPrice);
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      '材料费价差': function (node) {
 | 
	
		
			
				|  |  | -        return assistCalcer.rationBaseFee(node, baseMaterialTypes, priceTypes.ptDiffPrice);
 | 
	
		
			
				|  |  | +        return calcTools.rationBaseFee(node, baseMaterialTypes, priceTypes.ptDiffPrice);
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      '机械费价差': function (node) {
 | 
	
		
			
				|  |  | -        return assistCalcer.rationBaseFee(node, [gljType.GENERAL_MACHINE], priceTypes.ptDiffPrice);
 | 
	
		
			
				|  |  | +        return calcTools.rationBaseFee(node, [gljType.GENERAL_MACHINE], priceTypes.ptDiffPrice);
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      '主材费': function (node) {
 | 
	
		
			
				|  |  | -        return assistCalcer.rationBaseFee(node, [gljType.MAIN_MATERIAL], priceTypes.ptMarketPrice);
 | 
	
		
			
				|  |  | +        return calcTools.rationBaseFee(node, [gljType.MAIN_MATERIAL], priceTypes.ptMarketPrice);
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      '设备费': function (node) {
 | 
	
		
			
				|  |  | -        return assistCalcer.rationBaseFee(node, [gljType.EQUIPMENT], priceTypes.ptMarketPrice);
 | 
	
		
			
				|  |  | +        return calcTools.rationBaseFee(node, [gljType.EQUIPMENT], priceTypes.ptMarketPrice);
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      '人工工日': function (node) {
 | 
	
		
			
				|  |  |          if (!node.data.gljList) return 0;
 | 
	
		
			
				|  |  |          let rst = 0;
 | 
	
		
			
				|  |  |          for (let glj of node.data.gljList) {
 | 
	
		
			
				|  |  |              if (glj.type == gljType.LABOUR) {
 | 
	
		
			
				|  |  | -                rst = rst + (assistCalcer.uiGLJQuantity(glj["quantity"]) * assistCalcer.uiQuantity(node)).toDecimal(decimalObj.process);
 | 
	
		
			
				|  |  | +                rst = rst + (calcTools.uiGLJQty(glj["quantity"]) * calcTools.uiNodeQty(node)).toDecimal(decimalObj.process);
 | 
	
		
			
				|  |  |                  rst = rst.toDecimal(decimalObj.process);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          };
 | 
	
	
		
			
				|  | @@ -491,19 +507,31 @@ const rationCalcBaser = {
 | 
	
		
			
				|  |  |      '甲定设备费': function (node) {
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      '暂估材料费': function (node) {
 | 
	
		
			
				|  |  | -        return assistCalcer.estimateFee(node, true);
 | 
	
		
			
				|  |  | +        return calcTools.estimateFee(node, true);
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      '分包定额基价人工费': function (node) {
 | 
	
		
			
				|  |  | +        if (node.data.isSubcontract) return this.定额基价人工费(node)
 | 
	
		
			
				|  |  | +        else return 0;
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      '分包定额基价材料费': function (node) {
 | 
	
		
			
				|  |  | +        if (node.data.isSubcontract) return this.定额基价材料费(node)
 | 
	
		
			
				|  |  | +        else return 0;
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      '分包定额基价机械费': function (node) {
 | 
	
		
			
				|  |  | +        if (node.data.isSubcontract) return this.定额基价机械费(node)
 | 
	
		
			
				|  |  | +        else return 0;
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      '分包主材费': function (node) {
 | 
	
		
			
				|  |  | +        if (node.data.isSubcontract) return this.主材费(node)
 | 
	
		
			
				|  |  | +        else return 0;
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      '分包设备费': function (node) {
 | 
	
		
			
				|  |  | +        if (node.data.isSubcontract) return this.设备费(node)
 | 
	
		
			
				|  |  | +        else return 0;
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      '分包人工工日': function (node) {
 | 
	
		
			
				|  |  | +        if (node.data.isSubcontract) return this.人工工日(node)
 | 
	
		
			
				|  |  | +        else return 0;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  };
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -663,21 +691,21 @@ let executeObj = {
 | 
	
		
			
				|  |  |          let me = executeObj;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          // 量价、工料机形式的定额, 要把自己的市场单价用于计算程序中的基数。
 | 
	
		
			
				|  |  | -        if (me.treeNode.data.type == rationType.volumePrice || me.treeNode.data.type == rationType.gljRation)
 | 
	
		
			
				|  |  | -            return assistCalcer.marketPriceToBase(me.treeNode, baseName)
 | 
	
		
			
				|  |  | +        if (calcTools.isVolumePrice(me.treeNode) || calcTools.isGljRation(me.treeNode))
 | 
	
		
			
				|  |  | +            return calcTools.marketPriceToBase(me.treeNode, baseName)
 | 
	
		
			
				|  |  |          else{
 | 
	
		
			
				|  |  | -            if (!rationCalcBaser[baseName]){
 | 
	
		
			
				|  |  | +            if (!rationCalcBases[baseName]){
 | 
	
		
			
				|  |  |                  alert('定额基数“' + baseName + '”末定义,计算错误。 (模板 ' + me.template.ID + ',规则 ' + me.tempCalcItem.ID +')');
 | 
	
		
			
				|  |  |                  return 0;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              else
 | 
	
		
			
				|  |  | -                return rationCalcBaser[baseName](me.treeNode);
 | 
	
		
			
				|  |  | +                return rationCalcBases[baseName](me.treeNode);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      HJ: function () {
 | 
	
		
			
				|  |  |          let me = this;
 | 
	
		
			
				|  |  |          let p = me.treeNode.data.calcBaseValue ? me.treeNode.data.calcBaseValue : 0;
 | 
	
		
			
				|  |  | -        let q = assistCalcer.uiQuantity(me.treeNode) ? assistCalcer.uiQuantity(me.treeNode) : 1;
 | 
	
		
			
				|  |  | +        let q = calcTools.uiNodeQty(me.treeNode) ? calcTools.uiNodeQty(me.treeNode) : 1;
 | 
	
		
			
				|  |  |          let u = (p / q).toDecimal(decimalObj.decimal('unitPrice', me.treeNode));
 | 
	
		
			
				|  |  |          return u;
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -889,37 +917,10 @@ class CalcProgram {
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          let me = this;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |          me.project.beginUpdate('');
 | 
	
		
			
				|  |  |          for (let node of treeNodes){
 | 
	
		
			
				|  |  |              if (node.changed){
 | 
	
		
			
				|  |  | -                let data = {
 | 
	
		
			
				|  |  | -                    ID: node.data.ID,
 | 
	
		
			
				|  |  | -                    projectID: me.project.ID(),
 | 
	
		
			
				|  |  | -                    unit:node.data.unit,//对清单来说,改变单位,工程量精度会跟着改变从而影响计算。
 | 
	
		
			
				|  |  | -                    /*  subType、quantity、calcBase、programID、marketUnitFee等等字段较为特殊,它们的改变一定会触发计算并导致计算
 | 
	
		
			
				|  |  | -                    结果的变化,从而引发保存动作。将这些字段放在该位置跟计算结果一起保存,可减少前端跟后端的通讯频率。              */
 | 
	
		
			
				|  |  | -                    subType: node.data.subType,
 | 
	
		
			
				|  |  | -                    quantity: node.data.quantity,
 | 
	
		
			
				|  |  | -                    calcBase: node.data.calcBase,
 | 
	
		
			
				|  |  | -                    calcBaseValue: node.data.calcBaseValue,
 | 
	
		
			
				|  |  | -                    programID: node.data.programID,
 | 
	
		
			
				|  |  | -                    marketUnitFee: node.data.marketUnitFee,
 | 
	
		
			
				|  |  | -                    marketTotalFee: node.data.marketTotalFee,
 | 
	
		
			
				|  |  | -                    fees: node.data.fees,
 | 
	
		
			
				|  |  | -                    isFromDetail:node.data.isFromDetail,
 | 
	
		
			
				|  |  | -                    feeRate: node.data.feeRate,
 | 
	
		
			
				|  |  | -                    feeRateID: node.data.feeRateID,
 | 
	
		
			
				|  |  | -                    contain:node.data.contain,
 | 
	
		
			
				|  |  | -                    quantityEXP:node.data.quantityEXP
 | 
	
		
			
				|  |  | -                };
 | 
	
		
			
				|  |  | -                if (node.data.summaryFees) data.summaryFees = node.data.summaryFees;
 | 
	
		
			
				|  |  | -                if(node.sourceType==ModuleNames.ration && node.data.type==rationType.gljRation){//定额类型的工料机做特殊处理
 | 
	
		
			
				|  |  | -                    data.code=node.data.code;
 | 
	
		
			
				|  |  | -                    data.projectGLJID = node.data.projectGLJID;
 | 
	
		
			
				|  |  | -                    delete data.marketUnitFee;
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +                let data = calcTools.cutNodeForSave(node);
 | 
	
		
			
				|  |  |                  let newData = {'updateType': 'ut_update', 'updateData': data};
 | 
	
		
			
				|  |  |                  me.project.push(node.sourceType, [newData]);
 | 
	
		
			
				|  |  |              }
 | 
	
	
		
			
				|  | @@ -939,10 +940,9 @@ class CalcProgram {
 | 
	
		
			
				|  |  |      innerCalc(treeNode, changedArr){
 | 
	
		
			
				|  |  |          let me = this;
 | 
	
		
			
				|  |  |          // 仅用作树节点显示的工料机不能参与计算。
 | 
	
		
			
				|  |  | -        if (treeNode.sourceType === me.project.ration_glj.getSourceType()) return;
 | 
	
		
			
				|  |  | +        if (treeNode.sourceType === ModuleNames.ration_glj) return;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        treeNode.calcType = nodeTools.getCalcType(treeNode);
 | 
	
		
			
				|  |  | -        // if (treeNode.calcType == treeNodeCalcType.ctCalcBaseValue) return;
 | 
	
		
			
				|  |  | +        treeNode.calcType = calcTools.getCalcType(treeNode);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          function isBaseFeeType(type){
 | 
	
		
			
				|  |  |              return ['labour', 'material', 'machine', 'mainMaterial', 'equipment'].indexOf(type) > -1;
 | 
	
	
		
			
				|  | @@ -961,7 +961,7 @@ class CalcProgram {
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              else{   // 总造价清单只留common, estimate两个费用类别。其它公式清单只留common。
 | 
	
		
			
				|  |  | -                let reserveArr = nodeTools.isTotalCostBill(treeNode)? ['common', 'estimate']:['common'];
 | 
	
		
			
				|  |  | +                let reserveArr = calcTools.isTotalCostBill(treeNode)? ['common', 'estimate']:['common'];
 | 
	
		
			
				|  |  |                  if (treeNode.data.fees && treeNode.data.fees.length > 0){
 | 
	
		
			
				|  |  |                      let feesArr = treeNode.data.fees;
 | 
	
		
			
				|  |  |                      for (let i = 0; i < feesArr.length; i++) {
 | 
	
	
		
			
				|  | @@ -978,7 +978,7 @@ class CalcProgram {
 | 
	
		
			
				|  |  |          // 父清单汇总子项(子清单或定额)的费用类别
 | 
	
		
			
				|  |  |          if (treeNode.calcType == treeNodeCalcType.ctGatherBillsFees || treeNode.calcType == treeNodeCalcType.ctGatherRationsFees){
 | 
	
		
			
				|  |  |              treeNode.data.programID = null;
 | 
	
		
			
				|  |  | -            nodeTools.initFees(treeNode);
 | 
	
		
			
				|  |  | +            calcTools.initFees(treeNode);
 | 
	
		
			
				|  |  |              let nodes = (treeNode.calcType == treeNodeCalcType.ctGatherBillsFees) ? treeNode.children : me.project.Ration.getRationNodes(treeNode);
 | 
	
		
			
				|  |  |              let rst = [];
 | 
	
		
			
				|  |  |              for (let ft of cpFeeTypes) {
 | 
	
	
		
			
				|  | @@ -990,18 +990,19 @@ class CalcProgram {
 | 
	
		
			
				|  |  |                  if (treeNode.calcType == treeNodeCalcType.ctGatherBillsFees){
 | 
	
		
			
				|  |  |                      for (let node of nodes) {
 | 
	
		
			
				|  |  |                          if (node.data.feesIndex && node.data.feesIndex[ft.type]) {
 | 
	
		
			
				|  |  | -                            buf = (buf + parseFloatPlus(node.data.feesIndex[ft.type].unitFee)).toDecimal(decimalObj.process);
 | 
	
		
			
				|  |  | +                            // 父清单不要汇总综合单价。
 | 
	
		
			
				|  |  | +                            // buf = (buf + parseFloatPlus(node.data.feesIndex[ft.type].unitFee)).toDecimal(decimalObj.process);
 | 
	
		
			
				|  |  |                              btf = (btf + parseFloatPlus(node.data.feesIndex[ft.type].totalFee)).toDecimal(decimalObj.process);
 | 
	
		
			
				|  |  | -                            btuf = (btuf + parseFloatPlus(node.data.feesIndex[ft.type].tenderUnitFee)).toDecimal(decimalObj.process);
 | 
	
		
			
				|  |  | +                            // btuf = (btuf + parseFloatPlus(node.data.feesIndex[ft.type].tenderUnitFee)).toDecimal(decimalObj.process);
 | 
	
		
			
				|  |  |                              bttf = (bttf + parseFloatPlus(node.data.feesIndex[ft.type].tenderTotalFee)).toDecimal(decimalObj.process);
 | 
	
		
			
				|  |  |                          };
 | 
	
		
			
				|  |  |                      };
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |                  else if (treeNode.calcType == treeNodeCalcType.ctGatherRationsFees){     // 这里的算法要配合冷姐姐的神图才能看懂^_^
 | 
	
		
			
				|  |  |                      let sum_rtf = 0, sum_rttf = 0;
 | 
	
		
			
				|  |  | -                    let bq = assistCalcer.uiQuantity(treeNode) ? assistCalcer.uiQuantity(treeNode) : 1;
 | 
	
		
			
				|  |  | +                    let bq = calcTools.uiNodeQty(treeNode) ? calcTools.uiNodeQty(treeNode) : 1;
 | 
	
		
			
				|  |  |                      for (let node of nodes) {
 | 
	
		
			
				|  |  | -                        let rq = assistCalcer.uiQuantity(node) ? assistCalcer.uiQuantity(node) : 0;
 | 
	
		
			
				|  |  | +                        let rq = calcTools.uiNodeQty(node) ? calcTools.uiNodeQty(node) : 0;
 | 
	
		
			
				|  |  |                          let ruf = 0, rtuf = 0, rtf = 0, rttf = 0;
 | 
	
		
			
				|  |  |                          if (node.data.feesIndex && node.data.feesIndex[ft.type]) {
 | 
	
		
			
				|  |  |                              ruf = parseFloat(node.data.feesIndex[ft.type].unitFee);
 | 
	
	
		
			
				|  | @@ -1028,8 +1029,8 @@ class CalcProgram {
 | 
	
		
			
				|  |  |                          bttf = sum_rttf;
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                      else{
 | 
	
		
			
				|  |  | -                        btf = (buf * bq).toDecimal(decimalObj.process);
 | 
	
		
			
				|  |  | -                        bttf = (btuf * bq).toDecimal(decimalObj.process);
 | 
	
		
			
				|  |  | +                        btf = (buf.toDecimal(decimalObj.bills.unitPrice) * bq).toDecimal(decimalObj.process);
 | 
	
		
			
				|  |  | +                        bttf = (btuf.toDecimal(decimalObj.bills.unitPrice) * bq).toDecimal(decimalObj.process);
 | 
	
		
			
				|  |  |                      };
 | 
	
		
			
				|  |  |                  };
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -1037,7 +1038,7 @@ class CalcProgram {
 | 
	
		
			
				|  |  |                  ftObj.totalFee = btf.toDecimal(decimalObj.bills.totalPrice);
 | 
	
		
			
				|  |  |                  ftObj.tenderUnitFee = btuf.toDecimal(decimalObj.bills.unitPrice);
 | 
	
		
			
				|  |  |                  ftObj.tenderTotalFee = bttf.toDecimal(decimalObj.bills.totalPrice);
 | 
	
		
			
				|  |  | -                nodeTools.checkFeeField(treeNode, ftObj);
 | 
	
		
			
				|  |  | +                calcTools.checkFeeField(treeNode, ftObj);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  rst.push(ftObj);
 | 
	
		
			
				|  |  |              };
 | 
	
	
		
			
				|  | @@ -1080,24 +1081,24 @@ class CalcProgram {
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              let f = treeNode.data.feeRate ? treeNode.data.feeRate : 100;
 | 
	
		
			
				|  |  | -            let q = assistCalcer.uiQuantity(treeNode) ? assistCalcer.uiQuantity(treeNode) : 1;
 | 
	
		
			
				|  |  | +            let q = calcTools.uiNodeQty(treeNode) ? calcTools.uiNodeQty(treeNode) : 1;
 | 
	
		
			
				|  |  |              let b = treeNode.data.calcBaseValue ? treeNode.data.calcBaseValue : 0;
 | 
	
		
			
				|  |  |              let uf = (b * f * q / 100).toDecimal(decimalObj.bills.unitPrice);
 | 
	
		
			
				|  |  |              let tuf = uf;
 | 
	
		
			
				|  |  |              let tf = (me.project.property.billsCalcMode === leafBillGetFeeType.rationPrice) ? (b * f / 100).toDecimal(decimalObj.bills.totalPrice) : (uf * q).toDecimal(decimalObj.bills.totalPrice);
 | 
	
		
			
				|  |  |              let ttf = tf;
 | 
	
		
			
				|  |  |              deleteUselessFees(treeNode);
 | 
	
		
			
				|  |  | -            nodeTools.checkFeeField(treeNode, {'fieldName': 'common', 'unitFee': uf, 'totalFee': tf});
 | 
	
		
			
				|  |  | +            calcTools.checkFeeField(treeNode, {'fieldName': 'common', 'unitFee': uf, 'totalFee': tf});
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              // 总造价清单还要做单项工程、建设项目的四大项金额汇总
 | 
	
		
			
				|  |  | -            if (nodeTools.isTotalCostBill(treeNode)){
 | 
	
		
			
				|  |  | +            if (calcTools.isTotalCostBill(treeNode)){
 | 
	
		
			
				|  |  |                  // 公式叶子清单没有暂估费,但总造价清单除外。
 | 
	
		
			
				|  |  | -                assistCalcer.estimateFee(treeNode);
 | 
	
		
			
				|  |  | -                nodeTools.initSummaryFee(treeNode);
 | 
	
		
			
				|  |  | +                calcTools.estimateFee(treeNode);
 | 
	
		
			
				|  |  | +                calcTools.initSummaryFee(treeNode);
 | 
	
		
			
				|  |  |                  treeNode.data.summaryFees.totalFee = tf;
 | 
	
		
			
				|  |  | -                treeNode.data.summaryFees.estimateFee = nodeTools.getFee(treeNode, 'estimate.totalFee');
 | 
	
		
			
				|  |  | -                treeNode.data.summaryFees.safetyFee = nodeTools.getFee(nodeTools.getNodeByFlag(fixedFlag.SAFETY_CONSTRUCTION), 'common.totalFee');
 | 
	
		
			
				|  |  | -                treeNode.data.summaryFees.chargeFee = nodeTools.getFee(nodeTools.getNodeByFlag(fixedFlag.CHARGE), 'common.totalFee');
 | 
	
		
			
				|  |  | +                treeNode.data.summaryFees.estimateFee = calcTools.getFee(treeNode, 'estimate.totalFee');
 | 
	
		
			
				|  |  | +                treeNode.data.summaryFees.safetyFee = calcTools.getFee(calcTools.getNodeByFlag(fixedFlag.SAFETY_CONSTRUCTION), 'common.totalFee');
 | 
	
		
			
				|  |  | +                treeNode.data.summaryFees.chargeFee = calcTools.getFee(calcTools.getNodeByFlag(fixedFlag.CHARGE), 'common.totalFee');
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              treeNode.data.calcTemplate = {"calcItems": []};
 | 
	
	
		
			
				|  | @@ -1109,7 +1110,7 @@ class CalcProgram {
 | 
	
		
			
				|  |  |                  if (treeNode.data.type == rationType.volumePrice){
 | 
	
		
			
				|  |  |                      delete treeNode.data.gljList;
 | 
	
		
			
				|  |  |                      let muf = treeNode.data.marketUnitFee ? treeNode.data.marketUnitFee : 0;
 | 
	
		
			
				|  |  | -                    let q = assistCalcer.uiQuantity(treeNode) ? assistCalcer.uiQuantity(treeNode) : 0;
 | 
	
		
			
				|  |  | +                    let q = calcTools.uiNodeQty(treeNode) ? calcTools.uiNodeQty(treeNode) : 0;
 | 
	
		
			
				|  |  |                      treeNode.data.marketTotalFee = (muf * q).toDecimal(decimalObj.ration.totalPrice);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |                  else if (treeNode.data.type == rationType.gljRation){
 | 
	
	
		
			
				|  | @@ -1118,7 +1119,7 @@ class CalcProgram {
 | 
	
		
			
				|  |  |                  else{
 | 
	
		
			
				|  |  |                      treeNode.data.gljList = me.project.ration_glj.getGljArrByRation(treeNode.data.ID);
 | 
	
		
			
				|  |  |                      // 计算程序里没有暂估费的计算规则,会漏掉,所以这里要专门算。
 | 
	
		
			
				|  |  | -                    assistCalcer.estimateFee(treeNode);
 | 
	
		
			
				|  |  | +                    calcTools.estimateFee(treeNode);
 | 
	
		
			
				|  |  |                      fnArr.push('estimate');
 | 
	
		
			
				|  |  |                  };
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -1135,7 +1136,7 @@ class CalcProgram {
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  // 叶子清单自己的计算程序计算,其暂估费也要汇总算。
 | 
	
		
			
				|  |  | -                assistCalcer.estimateFee(treeNode);
 | 
	
		
			
				|  |  | +                calcTools.estimateFee(treeNode);
 | 
	
		
			
				|  |  |                  fnArr.push('estimate');
 | 
	
		
			
				|  |  |              };
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -1147,7 +1148,7 @@ class CalcProgram {
 | 
	
		
			
				|  |  |                  $CE.treeNode = treeNode;
 | 
	
		
			
				|  |  |                  $CE.template = template;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                nodeTools.initFees(treeNode);
 | 
	
		
			
				|  |  | +                calcTools.initFees(treeNode);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  for (let idx of template.compiledSeq) {
 | 
	
		
			
				|  |  |                      let calcItem = template.calcItems[idx];
 | 
	
	
		
			
				|  | @@ -1155,12 +1156,12 @@ class CalcProgram {
 | 
	
		
			
				|  |  |                      let feeRate = parseFloatPlus(calcItem.feeRate) ? parseFloatPlus(calcItem.feeRate).toDecimal(decimalObj.feeRate) : 100;  // 100%
 | 
	
		
			
				|  |  |                      calcItem.unitFee = (eval(calcItem.compiledExpr) * feeRate * 0.01).toDecimal(decimalObj.decimal('unitPrice', treeNode));   // 如果eval()对清单树有影响,就换成小麦的Expression对象再试
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                    let q = assistCalcer.uiQuantity(treeNode) ? assistCalcer.uiQuantity(treeNode) : 0;
 | 
	
		
			
				|  |  | +                    let q = calcTools.uiNodeQty(treeNode) ? calcTools.uiNodeQty(treeNode) : 0;
 | 
	
		
			
				|  |  |                      calcItem.totalFee = (calcItem.unitFee * q).toDecimal(decimalObj.decimal('totalPrice', treeNode));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                      if (calcItem.fieldName) {
 | 
	
		
			
				|  |  |                          fnArr.push(calcItem.fieldName);
 | 
	
		
			
				|  |  | -                        nodeTools.checkFeeField(treeNode, calcItem);
 | 
	
		
			
				|  |  | +                        calcTools.checkFeeField(treeNode, calcItem);
 | 
	
		
			
				|  |  |                      };
 | 
	
		
			
				|  |  |                  };
 | 
	
		
			
				|  |  |                  deleteUselessFees(treeNode, fnArr);
 | 
	
	
		
			
				|  | @@ -1250,7 +1251,7 @@ class CalcProgram {
 | 
	
		
			
				|  |  |      // 计算叶子清单下的所有子结点、自身、所有父结点、公式引用结点(即跟该叶子清单相关的所有结点)。最后打包存储。
 | 
	
		
			
				|  |  |      calcLeafAndSave(treeNode){
 | 
	
		
			
				|  |  |          let me = this;
 | 
	
		
			
				|  |  | -        if(!nodeTools.isLeafBill(treeNode)) return;
 | 
	
		
			
				|  |  | +        if(!calcTools.isLeafBill(treeNode)) return;
 | 
	
		
			
				|  |  |          if (treeNode.children && treeNode.children.length > 0) {
 | 
	
		
			
				|  |  |              let changedNodes = [];
 | 
	
		
			
				|  |  |              for (let child of treeNode.children){
 | 
	
	
		
			
				|  | @@ -1306,7 +1307,7 @@ class CalcProgram {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      // 排除指定项的综合合价计算(用于带循环计算的情况)
 | 
	
		
			
				|  |  |      getTotalFee(excludeNodes){
 | 
	
		
			
				|  |  | -        excludeNodes.push(nodeTools.getNodeByFlag(fixedFlag.ENGINEERINGCOST));
 | 
	
		
			
				|  |  | +        excludeNodes.push(calcTools.getNodeByFlag(fixedFlag.ENGINEERINGCOST));
 | 
	
		
			
				|  |  |          let me = this;
 | 
	
		
			
				|  |  |          let rst = 0;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -1318,7 +1319,7 @@ class CalcProgram {
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                      else{
 | 
	
		
			
				|  |  |                          if (node.sourceType != ModuleNames.ration_glj) {
 | 
	
		
			
				|  |  | -                            rst = (rst + nodeTools.getFee(node, 'common.totalFee')).toDecimal(decimalObj.bills.totalPrice);
 | 
	
		
			
				|  |  | +                            rst = (rst + calcTools.getFee(node, 'common.totalFee')).toDecimal(decimalObj.bills.totalPrice);
 | 
	
		
			
				|  |  |                          };
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                  }
 |