/************************************************************************************************** @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; public Date geTIme; global EquipmentCoverageTargetBatch() { this.query = query; // OCSM_Period = 'FY'+(toDayTime.year()+1); } global EquipmentCoverageTargetBatch(List < String > accountIdList) { this.query = query; // OCSM_Period = 'FY'+(toDayTime.year()+1); 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'; } if(toDayTime.month() >= 1 && toDayTime.month() <= 3){ OCSM_Period = 'FY'+(toDayTime.year()); }else{ OCSM_Period = 'FY'+(toDayTime.year()+1); } // 5条以上软性镜医院&&医院有效 egdTime = Date.newInstance(toDayTime.year()+1,3,31); geTIme = Date.newInstance(3999,12,31); String query = 'SELECT Id,Hospital__c,Hospital__r.name,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,OwnershipMachine_No__c,SerialNumber ' +' FROM Asset ' +' WHERE Product2.ServiceCategory__c != null ' +' AND OwnershipMachine_No__c!=\'A22004A\' AND OwnershipMachine_No__c!=\'A37026A\' AND OwnershipMachine_No__c!=\'A4676A\' AND OwnershipMachine_No__c!=\'WA02946A\'' +' AND Hospital__r.IF_Coverage_Target_HP__c = \'1\'' +' AND (Product2.Maintenance_Price_Year__c != 0 and Product2.Maintenance_Price_Year__c != null)' +' AND (Status = \'使用中\' or Status = \'未使用\' or Status = \'不明\')'; if (accountIdList != null && accountIdList.size() > 0) { query += ' AND hospital__c IN :accountIdList '; } query += ' AND (IF_StopParts_production__c != \'1\' or Product2.PartSupplyFinishDate__c = null)' +' AND (SerMarGuranteeType__c = null' +' OR (SerMarGuranteeType__c!=null AND Guarantee_period_for_products__c < :egdTime))' +' ORDER BY Hospital__c'; return Database.getQueryLocator(query); } global void execute(Database.BatchableContext BC, list assList) { system.debug('执行execute'); List accIds = new List(); Set OlympusList = new Set(); Integer i = 0; for(Asset ass1:assList){ if (ass1.Hospital__r.name.contains('Olympus社内')) { OlympusList.add(ass1.OwnershipMachine_No__c+ass1.SerialNumber); } accIds.add(ass1.Hospital__c); } List assetList = new List(); Set accIdSet = new Set(); List targetObjs = new List(); Map targetMap = new Map(); for(Account_Service_Of_Target__c target:[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_Service_Of_Target__c WHERE OCSM_Period_half__c = :OCSM_Period_half AND OCSM_Period__c = :OCSM_Period AND Account_HP__c IN:accIds]){ targetMap.put(target.Account_HP__c,target); } // for(asset assOlympus:[select id,name,OwnershipMachine_No__c,SerialNumber // from asset // where Hospital__r.name like '%Olympus社内%']){ // // 把医院名为Olympus社内的型号和机身编码放入set后续做存在判断 // } // Account_Service_Of_Target__c asot = null; for(Asset ass:assList){ if(!accIdSet.contains(ass.Hospital__c)){ if(!targetMap.containskey(ass.Hospital__c)){ // Account_Service_Of_Target__c asot = targetMap.get(ass.Hospital__c); // asot.Target_Rigid_Mirror_2__c = 0; // asot.Target_Soft_Mirror_2__c = 0; // asot.Target_Correlation_Lightsource__c = 0; // }else{ Account_Service_Of_Target__c asot = new Account_Service_Of_Target__c(); asot.Account_HP__c = ass.Hospital__c; asot.Coverage_Target_Account__c = true; asot.Target_Rigid_Mirror_2__c = 0; asot.Target_Soft_Mirror_2__c = 0; asot.Target_Correlation_Lightsource__c = 0; asot.OCSM_Period__c = OCSM_Period; asot.OCSM_Period_half__c = OCSM_Period_half; targetMap.put(ass.Hospital__c,asot); } accIdSet.add(ass.Hospital__c); } ass.IF_Coverage_Target_Asset__c = '1'; // 型号+机身编码 String assTarget = ass.OwnershipMachine_No__c+ass.SerialNumber; if(OlympusList.contains(assTarget)){ ass.IF_Coverage_Target_Asset__c = '0'; } assetList.add(ass); if (!OlympusList.contains(assTarget)){ if (ass.Product2.ServiceCategory__c == '硬性镜') { targetMap.get(ass.Hospital__c).Target_Rigid_Mirror_2__c ++; } if(ass.Product2.ServiceCategory__c =='软性镜'){ targetMap.get(ass.Hospital__c).Target_Soft_Mirror_2__c ++; } if (ass.Product2.ServiceCategory__c == '周边') { targetMap.get(ass.Hospital__c).Target_Correlation_Lightsource__c ++; } } i++; } system.debug('一共有'+i+'个设备'); Oly_TriggerHandler.bypass('AssetTrigger'); Oly_TriggerHandler.bypass('AssetHandlerCheck'); system.debug('执行update AssetsTarget前'); update assetList; system.debug('执行update accList前'); Oly_TriggerHandler.bypass('NFM701ControllerHandler'); Oly_TriggerHandler.bypass('UpdateContractAimAmountHandler'); UpSert targetMap.values(); } 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; } }