/**************************************************************************************************
@Author: 黄千龙
@Name: CoverageTargetHPBatch
@CreateDate: 13/04/2022
@Description: 覆盖率目标医院
@Version 1.0
*****************************************************************************************************/
global class CoverageTargetHPBatch implements Database.Batchable<sObject>,Database.Stateful {
    public String query;
    private BatchIF_Log__c iflog;
    public List < String > accountIdList;
    global CoverageTargetHPBatch() {
        this.query = query;
    }

    global CoverageTargetHPBatch(List < String > accountIdList) {
        this.query = query;
        this.accountIdList = accountIdList;
    }

    global Database.QueryLocator start(Database.BatchableContext bc) {
        system.debug('执行start');
        iflog = new BatchIF_Log__c();
        iflog.Type__c = 'PushNotification';
        iflog.Log__c  = 'CoverageTargetHPBatch start\n';
        iflog.ErrorLog__c = '';
        insert iflog;
        String query = 'SELECT Id,Name,IF_Coverage_Target_HP__c FROM Account WHERE Is_Active__c =\'有効\' AND RecordType.DeveloperName  =\'HP\' AND  ( NOT Name LIKE \'%olympus%\') AND ( NOT Name LIKE \'%TEST%\')';
        if (accountIdList != null && accountIdList.size() > 0) {
            query += ' AND Id IN :accountIdList';
        }
        return Database.getQueryLocator(query);
    }

    global void execute(Database.BatchableContext BC, list<Account> accList) {
        List<String> accIds = new List<String>();
        for(Account acc:accList){
            accIds.add(acc.Id);
        }
        List<Account> updateAccList = new List<Account>();
        for(AggregateResult result:[SELECT count(Id),Hospital__c FROM Asset WHERE Product2.ServiceCategory__c ='软性镜' AND Hospital__c IN: accIds AND (Status = '使用中' or Status = '未使用' or Status = '不明') Group by Hospital__c having count(Id)>=5]){
            Account acc = new Account();
            acc.Id = String.valueOf(result.get('Hospital__c'));
            acc.IF_Coverage_Target_HP__c= '1';
            updateAccList.add(acc);
        }
        Oly_TriggerHandler.bypass('NFM701ControllerHandler');
        Oly_TriggerHandler.bypass('UpdateContractAimAmountHandler');
        update updateAccList; 
    }

    global void finish(Database.BatchableContext BC) {
        iflog.Log__c += '\nCoverageTargetHPBatch end';
        String tmp = iflog.ErrorLog__c;
        if (tmp.length() > 65000) {
            tmp = tmp.substring(0, 65000);
            tmp += ' ...have more lines...';
            iflog.ErrorLog__c = tmp;
        }
        update iflog;
        if (accountIdList != null && accountIdList.size() > 0) {
            database.executeBatch(new EquipmentCoverageTargetBatch(accountIdList),200);
        }else{
            database.executeBatch(new EquipmentCoverageTargetBatch(),200);
        }
        
    }
}