/* * 为了确保不出现101问题,一次最多只能执行一条数据 * 这个batch是用作更新历史数据使用 * 找出来有延期任务的源任务; * 把源任务(最开始的这个任务)带到它延期任务廉的任何一个任务去; * 查查被动任务,概率很低,但是可能存在超过60天的问题,所以在更新以后需要找一圈任务超过60天的情况; */ global class addInitTaskBatch implements Database.Batchable { 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 tasklist) { main(tasklist); } @TestVisible private void main(List tasklist){ // 预计要更新的任务List list updateTaskList = new list(); // 因为每次只有一个初始任务赋值,所以这里取第一个; 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) { } }