global without sharing class ConsumTrialNotUploadRemindBatch implements Database.Batchable<sObject> {
    global List<String> emailMessages = new List<String>();
    global Integer totalCount = 0; // 総処理件数
    global Integer totalCountDone = 0; // 処理済件数
    global Integer failedCount = 0; // 処理失敗件数
    global Date today60Ago = Date.today().addDays(-60);
    global Date today1yearAgo = Date.today().addyears(-1); //2021-06-02 mzy 备品课题-1577 

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

    // 2021-03-05  mzy  WLIG-BYHD79  SFDC环境batch合并调查  start
    global ConsumTrialNotUploadRemindBatch(Boolean NeedExecute) {
        this.IsNeedExecute = NeedExecute;
    }
    // 2021-03-05  mzy  WLIG-BYHD79  SFDC环境batch合并调查  end

    global ConsumTrialNotUploadRemindBatch(Integer d) {
        this.today60Ago = Date.today().addDays(-d);
    }

    global ConsumTrialNotUploadRemindBatch() {
    }

    global Database.QueryLocator start(Database.BatchableContext bc) {
        //2021-06-02 mzy 备品课题-1577  start
        //原本的功能点 :
        //“最晚预计使用日+60天”前若未上传试用表或上传的试用表不合格，则每天给申请人推送邮件
        //现在针对借用目的是ET展箱，单独设置---备品中心出库日一年内还没有上传适用表或者不合格的情况，则每天给申请人推送邮件
        return Database.getQueryLocator([
            SELECT Need_Send_Trial_Upload_Email__c
                , HP_received_sign_rich__c
            FROM Consum_Apply__c
            WHERE
            (
                ( demo_purpose2__c != 'ET展箱' AND Asset_loaner_start_date__c < :today60Ago) // 60天前 
                OR 
                ( demo_purpose2__c = 'ET展箱' AND Bollow_Date__c < :today1yearAgo)//1年前
            )
            AND (Consum_Trial_Update_Time__c = null OR HP_received_sign_NG__c = true)  // 未上传试用表或试用表不合格
            AND Shippment_loaner_time__c != null
            AND RA_Status__c != :Consum_ApplyUtil.CaStatusMap.get(Consum_ApplyUtil.CaStatus.Qu_Xiao.ordinal())
            AND RA_Status__c != :Consum_ApplyUtil.CaStatusMap.get(Consum_ApplyUtil.CaStatus.Shan_Chu.ordinal())
            ]);

        //2021-06-02 mzy 备品课题-1577  end
    }

    global void execute(Database.BatchableContext BC, List<Consum_Apply__c> caList) {
        totalCount += caList.size();
        Savepoint sp = Database.setSavepoint();
        try{
            List<Consum_Apply__c> caListUpdate = new List<Consum_Apply__c>();
            for(Consum_Apply__c ca : caList) {
                ca.Need_Send_Trial_Upload_Email__c = true;
                caListUpdate.add(ca);
            }

            FixtureUtil.withoutUpdate(caListUpdate);         
            totalCountDone += caListUpdate.size();
        }
        catch(Exception e) {
            emailMessages.add(e.getMessage());
            failedCount += caList.size();
            Database.rollback(sp);
        }


    }

    global void finish(Database.BatchableContext bc) {
        BatchEmailUtil be = new BatchEmailUtil();
        String[] toList = new String[]{UserInfo.getUserEmail()};
        String emailLabel = 'BatchNotify';
        for (OrgWideEmailAddress tmpEmailObj : [SELECT Id, Address, DisplayName 
                FROM OrgWideEmailAddress
                WHERE DisplayName like :emailLabel]) {
            toList = new String[]{tmpEmailObj.Address};
        }
        String title = '提醒申请人上传耗材试用表';
        List<String> ccList = new List<String>();
        for (Consum_Apply_Meta__mdt camd : [SELECT Id
                    , Key__c
                    , ValueLong__c
                 FROM Consum_Apply_Meta__mdt
                WHERE Package__c = 'ConsumTrialNotUploadRemindBatch'
                  AND (Key__c = 'ErrorMailAddress'
                          OR Key__c = 'ErrorMailTitle'
                      )
                ORDER BY Key__c]) {
            if (camd.Key__c == 'ErrorMailAddress') {
                if (String.isNotBlank(camd.ValueLong__c)) {
                    ccList.addAll(camd.ValueLong__c.split(','));
                }
            }
            else if (camd.Key__c == 'ErrorMailTitle') {
                title = camd.ValueLong__c;
            }
        }
        if (!(totalCountDone == totalCount && 0 == emailMessages.size())) {
            be.failedMail(toList, ccList, title,
                String.join(this.emailMessages, '\n'),
                totalCount, totalCountDone, failedCount);
            be.send();
        }
        //2021-04-21  mzy  add SFDC点检报告更新逻辑修改 start
        if(!Test.isRunningTest() &&IsNeedExecute==true){
            //batch里调用下一个batch时，希望跟原有的Schedule里面传的条数保持一致
            Id execBTId = Database.executebatch(new UpdateInspectionReportAssetBatch(true),10);
        }
        //2021-04-21  mzy  add SFDC点检报告更新逻辑修改 end

    }
    @TestVisible private static void test() {
        if (false == Test.isRunningTest()) return;
        Integer i = 0;
        
    }
}