/************************************************************************************************** @Author: 黄千龙 @Name: EquipmentCoverageTargetBatch @CreateDate: 22/03/2022 @Description: 是否覆盖率目标(分母) @Version 1.0 *****************************************************************************************************/ global class EquipmentCoverageTargetBatch implements Database.Batchable,Database.Stateful { public String query; public Date start_dateH1 ; public Date end_dateH1 ; public List hospIds = new List(); public Date toDayTime = Date.today(); public String OCSM_Period_half; public String OCSM_Period; private BatchIF_Log__c iflog; public List < String > accountIdList; public Date egdTime; global EquipmentCoverageTargetBatch() { this.query = query; OCSM_Period = 'FY'+toDayTime.year(); } global EquipmentCoverageTargetBatch(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 = 'EquipmentRealCoverageBatch start\n'; iflog.ErrorLog__c = ''; insert iflog; if (toDayTime.month() >= 4 && toDayTime.month() <= 9) { OCSM_Period_half = '1H'; }else{ OCSM_Period_half = '2H'; } // 5条以上软性镜医院&&医院有效 egdTime = Date.newInstance(toDayTime.year()+1,3,1); List results = new List(); String groupQuery = 'SELECT count(Id),Hospital__c' + ' FROM Asset' + ' WHERE Product2.ServiceCategory__c =\'软性镜\' AND Is_Active__c =\'有効\' AND RecordType.DeveloperName =\'HP\' '; if (accountIdList != null && accountIdList.size() > 0) { groupQuery += ' AND Hospital__c IN :accountIdList'; } groupQuery += ' Group by Hospital__c having count(Id)>=5'; System.debug(LoggingLevel.INFO, '*** groupQuery: ' + groupQuery); results = Database.query(groupQuery); if(results!=null && results.size() > 0){ for (AggregateResult a1 : results) { hospIds.add(String.valueOf(a1.get('Hospital__c'))); } } return Database.getQueryLocator([SELECT Id,IF_Coverage_Target_HP__c, (SELECT Id,Hospital__c,Hospital__r.IF_Coverage_Target_HP__c,IF_Coverage_Target_Asset__c,IF_Coverage_Real_Asset__c, CurrentContract__r.Contract_End_Date__c,CurrentContract__r.Contract_Conclusion_Date__c,Product2.Category4__c, Product2.ServiceCategory__c,Product2.Category3__c FROM Asset_Hospital__r WHERE Product2.ServiceCategory__c != null AND Product2.Maintenance_Price_Year__c != 0 AND Status != '廃棄' AND Status != '待报废' AND IF_StopParts_production__c != '1' AND ((SerMarGuranteeType__c = null AND Extend_Gurantee_DateTo__c = null) OR (SerMarGuranteeType__c!=null AND Extend_Gurantee_DateTo__c < :egdTime) OR CurrentContract__c = null) ) , (SELECT Id ,Target_Rigid_Mirror_2__c,Target_Soft_Mirror_2__c,Target_Correlation_Lightsource__c,Account_HP__c,OCSM_Period_half__c FROM Account_Servicetarget__r WHERE OCSM_Period_half__c = :OCSM_Period_half AND OCSM_Period__c = :OCSM_Period) FROM Account WHERE Id IN:hospIds]); } global void execute(Database.BatchableContext BC, list accList) { system.debug('执行execute'); List assetList = new List(); List targetObjs = new List(); for(Account acc:accList){ acc.IF_Coverage_Target_HP__c = '1'; // 覆盖目标(硬) Integer mirror_1 = 0; // 覆盖目标(软) Integer mirror_2 = 0; //覆盖目标(周边) Integer mirror_3 = 0; for(Asset ass: acc.Asset_Hospital__r){ ass.IF_Coverage_Target_Asset__c = '1'; assetList.add(ass); if (ass.Product2.ServiceCategory__c == '硬性镜') { mirror_1++; } if(ass.Product2.ServiceCategory__c =='软性镜'){ mirror_2++; } if (ass.Product2.ServiceCategory__c == '周边') { mirror_3++; } } System.debug(LoggingLevel.INFO, '*** mirror_1: ' + mirror_1); System.debug(LoggingLevel.INFO, '*** mirror_2: ' + mirror_2); System.debug(LoggingLevel.INFO, '*** mirror_3: ' + mirror_3); if(acc.Account_Servicetarget__r.size() > 0){ for(Account_Service_Of_Target__c asotOne: acc.Account_Servicetarget__r){ asotOne.Coverage_Target_Account__c = true; asotOne.Target_Rigid_Mirror_2__c += mirror_1; asotOne.Target_Soft_Mirror_2__c += mirror_2; asotOne.Target_Correlation_Lightsource__c += mirror_3; targetObjs.add(asotOne); } }else{ Account_Service_Of_Target__c asot1 = new Account_Service_Of_Target__c(); asot1.Account_HP__c = acc.Id; asot1.Coverage_Target_Account__c = true; asot1.Target_Rigid_Mirror_2__c = mirror_1; asot1.Target_Soft_Mirror_2__c = mirror_2; asot1.Target_Correlation_Lightsource__c = mirror_3; asot1.OCSM_Period__c = OCSM_Period; asot1.OCSM_Period_half__c = OCSM_Period_half; targetObjs.add(asot1); } } Oly_TriggerHandler.bypass('AssetTrigger'); system.debug('执行update AssetsTarget前'); update assetList; system.debug('执行update accList前'); Oly_TriggerHandler.bypass('AccountTrigger'); update accList; UpSert targetObjs; } global void finish(Database.BatchableContext BC) { iflog.Log__c += '\nEquipmentRealCoverageBatch 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; } }