global class SubAuthorizedBatch implements Database.Batchable<sObject> {
	String testID;
  
	Boolean IsNeedExecute = false; // 2021-03-03  mzy  WLIG-BYHD79  SFDC环境batch合并调查  是否符合执行条件
  
	public SubAuthorizedBatch(string testID) {
	  this.testID = testID;
  
	}
	public SubAuthorizedBatch() {
  
	}
	// 2021-03-03  mzy  WLIG-BYHD79  SFDC环境batch合并调查  start
	public SubAuthorizedBatch(Boolean NeedExecute) {
		this.IsNeedExecute = NeedExecute;
	}
	// 2021-03-03  mzy  WLIG-BYHD79  SFDC环境batch合并调查  end
  
	global Database.QueryLocator start(Database.BatchableContext BC) {
	  Date today = Date.today();
	  Date tomorrow = today.addDays(1);
	  Date twoDayLater = today.addDays(2);
	  //Date twoDayAgo = today.addDays(-2);
	  //Date yesterday = today.addDays(-1);
	  if (!String.isBlank(this.testID)) {
		return Database.getQueryLocator(
				   [select Id, Status__c, IsAuthorize__c, Authorizer__c,
					AuthorizedStartDate__c, AuthorizedEndDate__c, Authorizee__c
					from SubAuthorized__c
					where id = :testID]
			   );
	  }
	  return Database.getQueryLocator(
				 [select Id, Status__c, IsAuthorize__c, Authorizer__c,
				  AuthorizedStartDate__c, AuthorizedEndDate__c, Authorizee__c
				  from SubAuthorized__c
				  where
				  (Status__c = '已批准'
							   and IsAuthorize__c = false
									   and AuthorizedStartDate__c <= : tomorrow
									   and AuthorizedEndDate__c >= : twoDayLater)
				  or
				  (Status__c = '已批准'
							   and IsAuthorize__c = true
									   and AuthorizedEndDate__c <= : tomorrow)
				  or
				  (Status__c = '已取消'
							   and IsAuthorize__c = true
				  )
				 ]
			 );
	}
	global void execute(Database.BatchableContext BC, List<SubAuthorized__c> SubAuthorizedList) {
	  system.debug('---------1-------------SubAuthorizedList:' + SubAuthorizedList);
	  Map<id, SubAuthorized__c> SubAuthorizedMap = new Map<id, SubAuthorized__c> ();
	  Set<User> UpdateUserSet = new Set<User>();
  
	  List<User> UpdateUserList = new List<User>();
  
	  // 获取所有提交人的id
	  for ( SubAuthorized__c SubAuthor : SubAuthorizedList) {
		SubAuthorizedMap.put(SubAuthor.Authorizer__c, SubAuthor);
	  }
	  system.debug('---------2-------------SubAuthorizedMap:' + SubAuthorizedMap);
	  //  检索出提交人为经理部长总监的用户数据（包括作为备份的）
	  list<User> allUserList =
		  [select id, ZongjianApprovalManager_copy__c,
		   TongkuoZongjian_copy__c, BuchangApprovalManager_copy__c,
		   BuchangApprovalManagerSales_copy__c, JingliApprovalManager_copy__c,
		   SalesManager_copy__c, ZongjianApprovalManager__c,
		   TongkuoZongjian__c, BuchangApprovalManager__c,
		   BuchangApprovalManagerSales__c, JingliApprovalManager__c,
		   SalesManager__c, ManagerId , ManagerId_copy__c
		   // SWAG-BEM9EP start
		   ,JingliEquipmentManager__c, JingliEquipmentManager_copy__c
		   ,Buzhang_Equipment_Manager__c, Buzhang_Equipment_Manager_copy__c
		   // SWAG-BEM9EP end
		   from user
		   where
		   ZongjianApprovalManager_copy__c in: SubAuthorizedMap.keyset()
		   or TongkuoZongjian_copy__c in: SubAuthorizedMap.keyset()
		   or BuchangApprovalManager_copy__c in: SubAuthorizedMap.keyset()
		   or BuchangApprovalManagerSales_copy__c in: SubAuthorizedMap.keyset()
		   or JingliApprovalManager_copy__c in: SubAuthorizedMap.keyset()
		   or SalesManager_copy__c in: SubAuthorizedMap.keyset()
		   or ZongjianApprovalManager__c in: SubAuthorizedMap.keyset()
		   or TongkuoZongjian__c in: SubAuthorizedMap.keyset()
		   or BuchangApprovalManager__c in: SubAuthorizedMap.keyset()
		   or BuchangApprovalManagerSales__c in: SubAuthorizedMap.keyset()
		   or JingliApprovalManager__c in: SubAuthorizedMap.keyset()
		   or SalesManager__c in: SubAuthorizedMap.keyset()
		   or ManagerId in : SubAuthorizedMap.keyset()
		   or ManagerId_copy__c in : SubAuthorizedMap.keyset()
		   //SWAG-BEM9EP start
		   or JingliEquipmentManager__c in : SubAuthorizedMap.keyset()
		   or JingliEquipmentManager_copy__c in : SubAuthorizedMap.keyset()
		   or Buzhang_Equipment_Manager__c in : SubAuthorizedMap.keyset()
		  or Buzhang_Equipment_Manager_copy__c in : SubAuthorizedMap.keyset()
		  // SWAG-BEM9EP end
		   ];
  
	  // 设置更新用户数据
	  for (User tempUser : allUserList) {
		boolean IsUpdate = false;
		// 从备份赋值到总监部长经理回来，备份置空
		if (tempUser.ZongjianApprovalManager_copy__c != null &&
				SubAuthorizedMap.containsKey(tempUser.ZongjianApprovalManager_copy__c)
				&& !checkSubAuthorized(SubAuthorizedMap.get(tempUser.ZongjianApprovalManager_copy__c))
		   ) {
		  tempUser.ZongjianApprovalManager__c = tempUser.ZongjianApprovalManager_copy__c;
		  tempUser.ZongjianApprovalManager_copy__c = null;
		  IsUpdate = true;
  
		}
		if (tempUser.TongkuoZongjian_copy__c != null &&
				SubAuthorizedMap.containsKey(tempUser.TongkuoZongjian_copy__c)
				&& !checkSubAuthorized(SubAuthorizedMap.get(tempUser.TongkuoZongjian_copy__c))
		   ) {
		  tempUser.TongkuoZongjian__c = tempUser.TongkuoZongjian_copy__c;
		  tempUser.TongkuoZongjian_copy__c = null;
		  IsUpdate = true;
		}
		if (tempUser.BuchangApprovalManager_copy__c != null &&
				SubAuthorizedMap.containsKey(tempUser.BuchangApprovalManager_copy__c)
				&& !checkSubAuthorized(SubAuthorizedMap.get(tempUser.BuchangApprovalManager_copy__c))
		   ) {
		  tempUser.BuchangApprovalManager__c = tempUser.BuchangApprovalManager_copy__c;
		  tempUser.BuchangApprovalManager_copy__c = null;
		  IsUpdate = true;
		}
		if (tempUser.BuchangApprovalManagerSales_copy__c != null &&
				SubAuthorizedMap.containsKey(tempUser.BuchangApprovalManagerSales_copy__c)
				&& !checkSubAuthorized(SubAuthorizedMap.get(tempUser.BuchangApprovalManagerSales_copy__c))
		   ) {
		  tempUser.BuchangApprovalManagerSales__c = tempUser.BuchangApprovalManagerSales_copy__c;
		  tempUser.BuchangApprovalManagerSales_copy__c = null;
		  IsUpdate = true;
		}
		if (tempUser.JingliApprovalManager_copy__c != null &&
				SubAuthorizedMap.containsKey(tempUser.JingliApprovalManager_copy__c)
				&& !checkSubAuthorized(SubAuthorizedMap.get(tempUser.JingliApprovalManager_copy__c))
		   ) {
		  tempUser.JingliApprovalManager__c = tempUser.JingliApprovalManager_copy__c;
		  tempUser.JingliApprovalManager_copy__c = null;
		  IsUpdate = true;
		}
		if (tempUser.SalesManager_copy__c != null &&
				SubAuthorizedMap.containsKey(tempUser.SalesManager_copy__c)
				&& !checkSubAuthorized(SubAuthorizedMap.get(tempUser.SalesManager_copy__c))
		   ) {
		  tempUser.SalesManager__c = tempUser.SalesManager_copy__c;
		  tempUser.SalesManager_copy__c = null;
		  IsUpdate = true;
		}
  
		if (tempUser.ManagerId_copy__c   != null &&
				SubAuthorizedMap.containsKey(tempUser.ManagerId_copy__c  )
				&& !checkSubAuthorized(SubAuthorizedMap.get(tempUser.ManagerId_copy__c  ))
		   ) {
		  tempUser.ManagerId = tempUser.ManagerId_copy__c;
		  tempUser.ManagerId_copy__c   = null;
		  IsUpdate = true;
		}
		//SWAG-BEM9EP start
		if (tempUser.JingliEquipmentManager_copy__c   != null &&
				SubAuthorizedMap.containsKey(tempUser.JingliEquipmentManager_copy__c  )
				&& !checkSubAuthorized(SubAuthorizedMap.get(tempUser.JingliEquipmentManager_copy__c  ))
		   ) {
		  tempUser.JingliEquipmentManager__c = tempUser.JingliEquipmentManager_copy__c;
		  tempUser.JingliEquipmentManager_copy__c   = null;
		  IsUpdate = true;
		}
  
		if (tempUser.Buzhang_Equipment_Manager_copy__c   != null &&
				SubAuthorizedMap.containsKey(tempUser.Buzhang_Equipment_Manager_copy__c  )
				&& !checkSubAuthorized(SubAuthorizedMap.get(tempUser.Buzhang_Equipment_Manager_copy__c))
		   ) {
		  tempUser.Buzhang_Equipment_Manager__c = tempUser.Buzhang_Equipment_Manager_copy__c;
		  tempUser.Buzhang_Equipment_Manager_copy__c   = null;
		  IsUpdate = true;
		}
		//SWAG-BEM9EP end
  
  
		// 从总监部长经理赋值到备份，总监部长经理设置为转授权人
		if (tempUser.ZongjianApprovalManager__c != null &&
				SubAuthorizedMap.containsKey(tempUser.ZongjianApprovalManager__c)
				&& checkSubAuthorized(SubAuthorizedMap.get(tempUser.ZongjianApprovalManager__c))
		   ) {
		  tempUser.ZongjianApprovalManager_copy__c = tempUser.ZongjianApprovalManager__c;
		  tempUser.ZongjianApprovalManager__c
			  = SubAuthorizedMap.get(tempUser.ZongjianApprovalManager__c).Authorizee__c ;
		  IsUpdate = true;
		}
		if (tempUser.TongkuoZongjian__c != null &&
				SubAuthorizedMap.containsKey(tempUser.TongkuoZongjian__c)
				&& checkSubAuthorized(SubAuthorizedMap.get(tempUser.TongkuoZongjian__c))
		   ) {
		  tempUser.TongkuoZongjian_copy__c = tempUser.TongkuoZongjian__c;
		  tempUser.TongkuoZongjian__c
			  = SubAuthorizedMap.get(tempUser.TongkuoZongjian__c).Authorizee__c ;
		  IsUpdate = true;
		}
		if (tempUser.BuchangApprovalManager__c != null &&
				SubAuthorizedMap.containsKey(tempUser.BuchangApprovalManager__c)
				&& checkSubAuthorized(SubAuthorizedMap.get(tempUser.BuchangApprovalManager__c))
		   ) {
		  tempUser.BuchangApprovalManager_copy__c = tempUser.BuchangApprovalManager__c;
		  tempUser.BuchangApprovalManager__c
			  = SubAuthorizedMap.get(tempUser.BuchangApprovalManager__c).Authorizee__c ;
		  IsUpdate = true;
		}
		if (tempUser.BuchangApprovalManagerSales__c != null &&
				SubAuthorizedMap.containsKey(tempUser.BuchangApprovalManagerSales__c)
				&& checkSubAuthorized(SubAuthorizedMap.get(tempUser.BuchangApprovalManagerSales__c))
		   ) {
		  tempUser.BuchangApprovalManagerSales_copy__c = tempUser.BuchangApprovalManagerSales__c;
		  tempUser.BuchangApprovalManagerSales__c
			  = SubAuthorizedMap.get(tempUser.BuchangApprovalManagerSales__c).Authorizee__c ;
		  IsUpdate = true;
		}
		if (tempUser.JingliApprovalManager__c != null &&
				SubAuthorizedMap.containsKey(tempUser.JingliApprovalManager__c)
				&& checkSubAuthorized(SubAuthorizedMap.get(tempUser.JingliApprovalManager__c))
		   ) {
		  tempUser.JingliApprovalManager_copy__c = tempUser.JingliApprovalManager__c;
		  tempUser.JingliApprovalManager__c
			  = SubAuthorizedMap.get(tempUser.JingliApprovalManager__c).Authorizee__c ;
		  IsUpdate = true;
		}
		if (tempUser.SalesManager__c != null &&
				SubAuthorizedMap.containsKey(tempUser.SalesManager__c)
				&& checkSubAuthorized(SubAuthorizedMap.get(tempUser.SalesManager__c))
		   ) {
		  tempUser.SalesManager_copy__c = tempUser.SalesManager__c;
		  tempUser.SalesManager__c
			  = SubAuthorizedMap.get(tempUser.SalesManager__c).Authorizee__c ;
		  IsUpdate = true;
  
		}
		if (tempUser.ManagerId  != null &&
				SubAuthorizedMap.containsKey(tempUser.ManagerId )
				&& checkSubAuthorized(SubAuthorizedMap.get(tempUser.ManagerId ))
		   ) {
		  tempUser.ManagerId_copy__c = tempUser.ManagerId ;
		  tempUser.ManagerId
			  = SubAuthorizedMap.get(tempUser.ManagerId ).Authorizee__c ;
		  IsUpdate = true;
  
		}
  
		//SWAG-BEM9EP start
		if (tempUser.JingliEquipmentManager__c  != null &&
				SubAuthorizedMap.containsKey(tempUser.JingliEquipmentManager__c )
				&& checkSubAuthorized(SubAuthorizedMap.get(tempUser.JingliEquipmentManager__c ))
		   ) {
		  tempUser.JingliEquipmentManager_copy__c = tempUser.JingliEquipmentManager__c ;
		  tempUser.JingliEquipmentManager__c
			  = SubAuthorizedMap.get(tempUser.JingliEquipmentManager__c ).Authorizee__c ;
		  IsUpdate = true;
  
		}
  
		if (tempUser.Buzhang_Equipment_Manager__c  != null &&
				SubAuthorizedMap.containsKey(tempUser.Buzhang_Equipment_Manager__c )
				&& checkSubAuthorized(SubAuthorizedMap.get(tempUser.Buzhang_Equipment_Manager__c ))
		   ) {
		  tempUser.Buzhang_Equipment_Manager_copy__c = tempUser.Buzhang_Equipment_Manager__c ;
		  tempUser.Buzhang_Equipment_Manager__c
			  = SubAuthorizedMap.get(tempUser.Buzhang_Equipment_Manager__c ).Authorizee__c ;
		  IsUpdate = true;
  
		}
		//SWAG-BEM9EP end
  
		if (IsUpdate) {
		  UpdateUserList.add(tempUser);
		}
	  }
  
  
	  // 先更新经理部长总监改了的用户
	  if (UpdateUserList.size() > 0) {
		update UpdateUserList;
	  }
	  // 设置转授权功能是否授权数据
	  updateSubAuthorizedList(SubAuthorizedList);
  
  
	}
  
	global void finish(Database.BatchableContext BC) {
		// 2021-09-17  mzy  WLIG-BYHD79  SFDC环境batch合并调查  start
		if(!System.Test.isRunningTest() &&IsNeedExecute==true){
			//batch里调用下一个batch时，希望跟原有的Schedule里面传的条数保持一致
			 Id execBTId = Database.executebatch(new UpdateOPDStatusAndReasonBatch(),100);
		  }
		  // 2021-09-17  mzy  WLIG-BYHD79  SFDC环境batch合并调查  end
	}
  
	// 设置转授权功能是否授权数据
	private static void updateSubAuthorizedList(list<SubAuthorized__c> SubAuthorizedList) {
	  List<SubAuthorized__c> updateSubAuthorizedList = new List<SubAuthorized__c>();
	  for ( SubAuthorized__c SubAuthor : SubAuthorizedList) {
		if (checkSubAuthorized(SubAuthor) && !SubAuthor.IsAuthorize__c) {
		  SubAuthor.IsAuthorize__c = true;
		  updateSubAuthorizedList.add(SubAuthor);
		} else if (SubAuthor.IsAuthorize__c) {
		  SubAuthor.IsAuthorize__c = false;
		  updateSubAuthorizedList.add(SubAuthor);
		}
	  }
	  system.debug('---------4-------------updateSubAuthorizedList:' + updateSubAuthorizedList);
	  // 后更新是否授权  ，如果用户更新失败，那么就不会更新是否授权
	  if (updateSubAuthorizedList.size() > 0) {
		update updateSubAuthorizedList;
	  }
  
	}
	// 判断这个转授权是需要转审批还是需要取消转审批
	public static boolean checkSubAuthorized(SubAuthorized__c SubAuthorized) {
	  if (SubAuthorized == null) {
		return false;
	  }
	  Date today = Date.today();
	  Date tomorrow = today.addDays(1);
	  Date twoDayLater = today.addDays(2);
	  if (SubAuthorized.Status__c != null &&
			  SubAuthorized.Status__c.equals('已批准') && SubAuthorized.IsAuthorize__c == false
			  && SubAuthorized.AuthorizedStartDate__c <=  tomorrow
			  && SubAuthorized.AuthorizedEndDate__c >=  twoDayLater
		 ) {
		return true;
	  }
	  return false;
	}
  }