// 更新联系人上的开展状态 和 带教时长（月）
global class UpdateMeetingToContactBatch implements Database.Batchable<sObject> {

	list<String> idlist;
	Boolean IsNeedExecute = false; // 2021-03-03  mzy  WLIG-BYHD79  SFDC环境batch合并调查  是否符合执行条件

	global UpdateMeetingToContactBatch() {
		idList = null;
	}
	global UpdateMeetingToContactBatch(List<String> idlist) {
		this.idList = idlist;
	}
	global UpdateMeetingToContactBatch(Boolean needExecute) {
		idList = null;
		IsNeedExecute = needExecute;  // 2021-03-03  mzy  WLIG-BYHD79  SFDC环境batch合并调查  
	}

	global Database.QueryLocator start(Database.BatchableContext BC) {
		string query = '';
		query = 'select id from contact where Campaign__c != null';
		if (idList != null && idList.size() > 0) {
			query += ' and id in: idList';
		}
		system.debug('query:' + query);
		return Database.getQueryLocator(query);
	}

	global void execute(Database.BatchableContext BC, List<contact> contactlist) {
		Date tempToday = Date.today();
		Date sixMonthAgo = tempToday.addMonths(-6);
		list<ID> allcontactID = new list<ID>();
		for (contact tempContact : contactlist) {
			allcontactID.add(tempContact.id);
		}
              
		// 开展状态为开展中的客户人员汇集
		set<ID> ongoingContactSet = new set<ID>();
		list<MeetingManagement__c> MeetingManagementList =
		    [select id, Contact__c
		     from MeetingManagement__c
		     where CreatedDate__c >= : sixMonthAgo
		     and Contact__c in: contactlist
		     and (
		     (pollingTime__c !=0 and pollingTime__c != null) or
		     (VisitTime__c !=0 and VisitTime__c != null) or
		     (InspectTime__c !=0 and InspectTime__c != null) or
		     (InspectEquipmentTime__c !=0 and InspectEquipmentTime__c != null) or
		     (TeachingTime__c !=0 and TeachingTime__c != null) or
		     (MaintenanceReportTime__c !=0 and MaintenanceReportTime__c != null)
		     )
		    ];

		for (MeetingManagement__c temMeetingManagement : MeetingManagementList) {
			ongoingContactSet.add(temMeetingManagement.Contact__c);
		}

		// 带教时长（月）计算
		map<id, integer> ContactInstructTime = new map<id, integer>();
		List<AggregateResult> InstructedStaffList =
		    [select count(id) Cnt_Id, ContactID__c
		     from Instructed_staff__c
		     where  ContactID__c in: allcontactID
		     and Instruct_report__r.Status__c = '批准'
		                                        group by ContactID__c];

		for (AggregateResult temAgg : InstructedStaffList) {
			ContactInstructTime.put((ID) temAgg.get('ContactID__c'), integer.valueof(temAgg.get('Cnt_Id')));
		}
		list<Contact> UpdateContactList = new list<Contact>();
		for (ID contactID : allcontactID) {
			Contact temContact = new Contact(id = contactID);
			if (ongoingContactSet.Contains(contactID)) {
				temContact.ProcessingWorkStatus__c = '开展中';
			} else {
				temContact.ProcessingWorkStatus__c = '未开展';
			}
			if (ContactInstructTime.containskey(contactID)) {
				temContact.teachMonth__c = ContactInstructTime.get(contactID);
			} else {
				temContact.teachMonth__c = 0;
			}
			UpdateContactList.add(temContact);
		}
		if (UpdateContactList.size() > 0) {
			update UpdateContactList;
		}

	}

	global void finish(Database.BatchableContext BC) {
		//2021-03-03  mzy  WLIG-BYHD79  SFDC环境batch合并调查  start
        if(!Test.isRunningTest() &&IsNeedExecute==true){
        	//因Batch中构造方法已有单个Boolean参数,因此创建了两个参数的构造方法
        	//batch里调用下一个batch时，希望跟原有的Schedule里面传的条数保持一致
           Id execBTId = Database.executebatch(new ContactInstructCountNSetNullBatch(true,true),100);
        }
		//2021-03-03  mzy  WLIG-BYHD79  SFDC环境batch合并调查 end

	}

}