/*
 * 为了确保不出现101问题，一次最多只能执行一条数据
 * 这个batch是用作更新历史数据使用
 * 找出来有延期任务的源任务;
 * 把源任务（最开始的这个任务）带到它延期任务廉的任何一个任务去;
 * 查查被动任务，概率很低，但是可能存在超过60天的问题，所以在更新以后需要找一圈任务超过60天的情况;
 */
global class addInitTaskBatch implements Database.Batchable<sObject> {
	public string taskID;
    global addInitTaskBatch(string taskID){
    	this.taskID = taskID;
    }
    global addInitTaskBatch(){
    }
    // 检索有延期任务的任务，不包括已经因为离职，所以已经关闭的任务
    global Database.QueryLocator start(Database.BatchableContext BC) {
        String query = 'SELECT Id,Name,delayTaskP__c, Daily_Report__c , Event__c FROM task__c '
            +'where delayTaskP__c != null '
            + ' and taskStatus__c != \'06 关闭\'';
        if(string.isNotBlank(taskID)){
        	query += ' and ID = \'' + taskID + '\'';
        }
        System.debug('query:'+query);
        return Database.getQueryLocator(query);
    }
    global void execute(Database.BatchableContext BC, List<task__c> tasklist) {
    	main(tasklist);
    }
    @TestVisible
    private void main(List<task__c> tasklist){
    	// 预计要更新的任务List
        list<task__c> updateTaskList = new list<task__c>();
        // 因为每次只有一个初始任务赋值，所以这里取第一个；
        task__c initTask = tasklist[0];
        System.debug('initTask：'+initTask);
        //用作循环递归找所有延期任务，每次都拿最新的延期任务
        //如果这个值是空的那么就可以跳过不执行
        id tempTaskid = initTask.delayTaskP__c;
        while (!string.isblank(tempTaskid)){
            task__c tempTask =
                [select id,delayTaskP__c,Initial_Task__c from task__c
                 where id = : tempTaskid
                ];
            // 赋值初始任务，然后计入要更新的延期任务当中
            System.debug('tempTask:'+tempTask);
            initTask.Initial_Task__c = tempTask.id;
            updateTaskList.clear();
            updateTaskList.add(initTask);
            tempTaskid = tempTask.delayTaskP__c;

        }
        System.debug('updateTaskList:'+updateTaskList);
        if(updateTaskList.size()>0){
            update updateTaskList;
        }
    }
    global void finish(Database.BatchableContext BC) {
    }
}