|  | @@ -29,8 +29,22 @@ let BlockController = {
 | 
	
		
			
				|  |  |          if(blockData == null){
 | 
	
		
			
				|  |  |              return true;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        if(blockData.firstNodeType != blockType.RATION && blockData.isFBFX !=  Bills.isFBFX(selected)){//除了复制定额外,焦点行和复制的块不是来自同一个地方(分部分项工其它)
 | 
	
		
			
				|  |  | -            return true;
 | 
	
		
			
				|  |  | +        if(blockData.firstNodeType != blockType.RATION ){//复制的不是定额
 | 
	
		
			
				|  |  | +          //&& blockData.isFBFX !=  Bills.isFBFX(selected)  
 | 
	
		
			
				|  |  | +          if (this.blockIsFB(blockData.firstNodeType) && !Bills.isFBFX(selected)) return true; //第一层是分部,不允许复制到非分部分项
 | 
	
		
			
				|  |  | +          //分项\补项不允许粘贴到“施工组织措施项目”下
 | 
	
		
			
				|  |  | +          if (this.blockIsFXorBX(blockData.firstNodeType) && Bills.isOrgMeasure(selected)) return true;
 | 
	
		
			
				|  |  | +          
 | 
	
		
			
				|  |  | +          if (blockData.firstNodeType == blockType.BILL && Bills.isFBFX(selected) ) { //如果是清单 到分部分项          
 | 
	
		
			
				|  |  | +            for (let d of blockData.datas) { 
 | 
	
		
			
				|  |  | +               //如果清单有多层,不允许复制 
 | 
	
		
			
				|  |  | +              if (!this.blockIsLeaveBills(d)) return true;
 | 
	
		
			
				|  |  | +              ///如果有清单基数,不允许复制
 | 
	
		
			
				|  |  | +              if (this.ifCalcBase(d.calcBase)) return true;
 | 
	
		
			
				|  |  | +               //如果清单有费率引用,不允许复制
 | 
	
		
			
				|  |  | +              if (gljUtil.isNotEmpty(d.feeRateID)) return true;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          if(this.blockIsFXorBX(blockData.firstNodeType) && this.isFB(selected)){//复制块的第一层是分项或补项,焦点行是分部,且分部有子项并且子项不是分项或补项,则无效。
 | 
	
		
			
				|  |  |              if(selected.children.length && !this.isFXorBX(selected.children[0])){
 | 
	
	
		
			
				|  | @@ -80,10 +94,13 @@ let BlockController = {
 | 
	
		
			
				|  |  |          return false;
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      haveCalcBase : function (node) {
 | 
	
		
			
				|  |  | -        if(node.data.calcBase ==null||node.data.calcBase ==undefined|| node.data.calcBase == ""){
 | 
	
		
			
				|  |  | -            return false;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        return true;
 | 
	
		
			
				|  |  | +      return this.ifCalcBase(node.data.calcBase);
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    ifCalcBase: function (calcBase) {
 | 
	
		
			
				|  |  | +      if (calcBase == null || calcBase == undefined || calcBase == "") {
 | 
	
		
			
				|  |  | +        return false;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      return true;
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      isDXFYorMainEq:function (node) {//焦点行是大项费用或定额下的主材设备
 | 
	
		
			
				|  |  |          if(node.sourceType == ModuleNames.bills && node.data.type == billType.DXFY){//焦点行是大项费用则无效;
 | 
	
	
		
			
				|  | @@ -227,8 +244,8 @@ let BlockController = {
 | 
	
		
			
				|  |  |                  //默认为当前行的后项,可选前项,子项灰显不可选。
 | 
	
		
			
				|  |  |                  setRadioProp('sub_node',{checked:false,disabled:true});
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -            //复制块的第一层是分项,焦点行是分部,且分部下无子项或者子项是分项
 | 
	
		
			
				|  |  | -            if(this.blockIsFXorBX(blockData.firstNodeType)&& this.isFB(selected)){
 | 
	
		
			
				|  |  | +            //复制块的第一层是分项,清单,焦点行是分部,且分部下无子项或者子项是分项
 | 
	
		
			
				|  |  | +            if((blockData.firstNodeType ==blockType.BILL||  this.blockIsFXorBX(blockData.firstNodeType))&& this.isFB(selected)){
 | 
	
		
			
				|  |  |                  if(selected.children.length == 0 || this.isFXorBX(selected.children[0])){
 | 
	
		
			
				|  |  |                      return 'sub';//不弹出选择窗口,直接粘贴为子项。
 | 
	
		
			
				|  |  |                  }
 | 
	
	
		
			
				|  | @@ -315,7 +332,7 @@ let BlockController = {
 | 
	
		
			
				|  |  |                  billUpdate = {type:blockData.datas[0].sourceType,query:{ID:pre.getID()},doc:{NextSiblingID:blockData.datas[0].ID}};
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        let dataMap = this.preparePasteData(blockData.datas,billsIDMap,firstParentID,lastNextID);
 | 
	
		
			
				|  |  | +        let dataMap = this.preparePasteData(blockData.datas,billsIDMap,firstParentID,lastNextID,selected);
 | 
	
		
			
				|  |  |          if(billUpdate){
 | 
	
		
			
				|  |  |              billUpdate.doc.NextSiblingID = billsIDMap[billUpdate.doc.NextSiblingID];
 | 
	
		
			
				|  |  |              updateData.push(billUpdate);
 | 
	
	
		
			
				|  | @@ -456,7 +473,7 @@ let BlockController = {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    preparePasteData : function (datas,billsIDMap,firstParentID,lastNextID) {
 | 
	
		
			
				|  |  | +    preparePasteData : function (datas,billsIDMap,firstParentID,lastNextID,selected) {
 | 
	
		
			
				|  |  |          let me = this;
 | 
	
		
			
				|  |  |          me.datas = _.cloneDeep(projectObj.project.Bills.datas);
 | 
	
		
			
				|  |  |          let bills = [],rations=[],ration_gljs = [],ration_coes = [],quantity_details = [],ration_installations = [],ration_templates=[];
 | 
	
	
		
			
				|  | @@ -469,7 +486,7 @@ let BlockController = {
 | 
	
		
			
				|  |  |                      lastBillID =  datas[i].ID
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -            eachData(datas[i]);
 | 
	
		
			
				|  |  | +            eachData(datas[i],selected);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          for(let f of firstBillIDs){
 | 
	
		
			
				|  |  |              firstIDMap[billsIDMap[f]]  = f //反向映射
 | 
	
	
		
			
				|  | @@ -491,9 +508,9 @@ let BlockController = {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          return {bills:bills,rations:rations,ration_gljs:ration_gljs,ration_coes:ration_coes,quantity_details:quantity_details,ration_installations:ration_installations,ration_templates:ration_templates};
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        function eachData(data) {
 | 
	
		
			
				|  |  | +        function eachData(data,selected) {
 | 
	
		
			
				|  |  |              if(data.sourceType == 'bills'){
 | 
	
		
			
				|  |  | -                let tem_b = createBillsData(data);
 | 
	
		
			
				|  |  | +                let tem_b = createBillsData(data,selected);
 | 
	
		
			
				|  |  |                  bills.push(tem_b);
 | 
	
		
			
				|  |  |                  for(let d of data.quantity_details){
 | 
	
		
			
				|  |  |                      quantity_details.push(createQuantityDetails(d,tem_b,'bills'));
 | 
	
	
		
			
				|  | @@ -598,7 +615,8 @@ let BlockController = {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        function createBillsData(billsData) { //ID、重新生成code
 | 
	
		
			
				|  |  | +      function createBillsData(billsData, selected) { //ID、重新生成code
 | 
	
		
			
				|  |  | +            let Bills = projectObj.project.Bills;
 | 
	
		
			
				|  |  |              let temData = _.cloneDeep(billsData);
 | 
	
		
			
				|  |  |              //删除旧数据
 | 
	
		
			
				|  |  |              if(temData.children && temData.children.length>0){//如果是有子项,说明是计算得到的,要删除重新计算,没有子项,但是fees有值,说明是自已输入的,值要一起粘贴
 | 
	
	
		
			
				|  | @@ -611,8 +629,12 @@ let BlockController = {
 | 
	
		
			
				|  |  |              delete  temData.__v;
 | 
	
		
			
				|  |  |              delete  temData.sourceType;
 | 
	
		
			
				|  |  |              delete  temData.quantityCoe;
 | 
	
		
			
				|  |  | -            delete  temData.rationQuantityCoe;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +            delete temData.rationQuantityCoe;
 | 
	
		
			
				|  |  | +            //从分项、补项 到清单
 | 
	
		
			
				|  |  | +            if ((temData.type == billType.FX || temData.type == billType.BX) && !Bills.isFBFX(selected)) temData.type = billType.BILL;
 | 
	
		
			
				|  |  | +            //从清单到分部分项
 | 
	
		
			
				|  |  | +            if (temData.type == billType.BILL && Bills.isFBFX(selected)) temData.type = billType.FX;
 | 
	
		
			
				|  |  | +          
 | 
	
		
			
				|  |  |              temData.projectID = projectObj.project.ID();
 | 
	
		
			
				|  |  |              let newID = uuid.v1(); //新的清单ID
 | 
	
		
			
				|  |  |              billsIDMap[temData.ID] = newID;
 | 
	
	
		
			
				|  | @@ -709,9 +731,18 @@ let BlockController = {
 | 
	
		
			
				|  |  |      isFXorBX:function (selected) {//是分项或者补项
 | 
	
		
			
				|  |  |          return projectObj.project.Bills.isFXorBX(selected);
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  | +    blockIsFB: function (type) { 
 | 
	
		
			
				|  |  | +      return type == blockType.FB
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  |      blockIsFXorBX: function (type) {
 | 
	
		
			
				|  |  |          return type == blockType.FX||type == blockType.BX;
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  | +    blockIsLeaveBills: function (bills) { 
 | 
	
		
			
				|  |  | +      if (bills.children && bills.children.length > 0) { 
 | 
	
		
			
				|  |  | +        return bills.children[0].sourceType == "ration" //如果子节点是定额,则说明是页子清单
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      return true;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  |      removeBlock:function () {
 | 
	
		
			
				|  |  |          removeLocalCache('project_block');
 | 
	
		
			
				|  |  |      }
 |