/* wql
apex作业总批量为1时,是正常的不会走finish里,不创建计划的作业.
apex作业总批量为0时,说明电子签收Batch停了,需要重新执行Batch创建计划的作业.
1.该batch主要用于监控15分钟的签收单的计划作业的batch
2.未来可增加条件，监控其他对象的计划的作业

*/
global class monitorUpdateESignBatch implements Database.Batchable < sObject > , Database.Stateful{
    //参数变量
    public String likeStr;
    public String tempLikeStr;

    //执行标识
    public Boolean executeFlag = true;
    //无参构造
    public monitorUpdateESignBatch() {

    }
    //未来扩展用 有参构造
    // public monitorUpdateESignBatch(String likeStr) {
    //     this.likeStr = likeStr;
    // }

    global Database.QueryLocator start(Database.BatchableContext bc) {
        //查询  所有的计划的作业
        String query = 'SELECT Id, CronJobDetailId, CronExpression, CronJobDetail.Name,NextFireTime  FROM CronTrigger ';
        //未来拓展用 查询作业名为其他的计划的作业
        // if(String.isNotBlank(likeStr)){
        //     tempLikeStr = likeStr;
        // }else{
        //     tempLikeStr = 'updateESignFormSchedule00%';
        // }
        tempLikeStr = 'updateESignFormSchedule00%';
        query += ' WHERE CronJobDetail.Name Like :tempLikeStr';

        return Database.getQueryLocator(query);
    }
    global void execute(Database.BatchableContext BC, List<CronTrigger> ctList) {
        
        if(ctList.size()>0){
            for(CronTrigger c:ctList){
                //list 不为0有计划的作业 没有下次运行的时间 也重新执行
                if(c.NextFireTime !=null){
                    executeFlag = false;
                    break;
                }
            }
        }
    }
    global void finish(Database.BatchableContext BC) {
        //标识为true时，重新执行该计划的作业
        system.debug('executeFlag:'+executeFlag);
        //①list 为0 表示计划的作业上没有签收单的计划作业
        //②list 不为0有计划的作业 没有下次运行的时间 也重新执行
        if(executeFlag){
            Database.executeBatch(new updateESignBatch(), 100);
        }
    }
}