/************************************************************************************************** @Author: 黄千龙 @Name: EquipmentCoverageTargetBatch @CreateDate: 22/03/2022 @Description: 是否续签率目标(分母) @Version 1.0 *****************************************************************************************************/ global class EquipmentRenewTargetBatch implements Database.Batchable,Database.Stateful { public String query; public Date toDayTime = Date.today(); public Date start_date1 ; public Date end_date1 ; public Date start_date2 ; public Date end_date2 ; public Date deadlineTime; public String OCSM_Period_half; public String OCSM_Period = 'FY'+toDayTime.year(); private BatchIF_Log__c iflog; public List < String > accountIdList; global EquipmentRenewTargetBatch() { this.query = query; } global EquipmentRenewTargetBatch(List < String > accountIdList) { this.query = query; this.accountIdList = accountIdList; } global Database.QueryLocator start(Database.BatchableContext bc) { iflog = new BatchIF_Log__c(); iflog.Type__c = 'PushNotification'; iflog.Log__c = 'EquipmentRenewTargetBatch 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() >= 4 && toDayTime.month() <= 9) { start_date1 = Date.newInstance(toDayTime.year()-1,4,1); end_date1 = Date.newInstance(toDayTime.year()-1,12,31); start_date2 = Date.newInstance(toDayTime.year(),1,1); end_date2 = Date.newInstance(toDayTime.year(),6,30); deadlineTime = Date.newInstance(toDayTime.year(),3,31); }else{ start_date1 = Date.newInstance(toDayTime.year()-1,10,1); end_date1 = Date.newInstance(toDayTime.year(),6,30); start_date2 = Date.newInstance(toDayTime.year(),7,1); end_date2 = Date.newInstance(toDayTime.year(),12,31); deadlineTime = Date.newInstance(toDayTime.year(),9,30); } if (accountIdList != null && accountIdList.size() > 0) { // 保有设备不为零件停产 query ='select Id,Hospital__c,CurrentContract_F__r.IF_Target_Renew__c,CurrentContract__c,CurrentContract__r.Contract_End_Date__c,CurrentContract__r.Contract_Start_Date__c,Product2.ServiceCategory__c,CurrentContract__r.Status__c,Product2.Category3__c,Product2.Category4__c' + ' from Asset where IF_StopParts_production__c != \'1\' and Hospital__c in :accountIdList and Product2.ServiceCategory__c != null' // 测试不开启 +' and CurrentContract_F__r.IF_Target_Renew__c = \'1\'' + ' and ((CurrentContract__r.Contract_End_Date__c>= :start_date1 and CurrentContract__r.Contract_End_Date__c<= :end_date1) ' +' or (CurrentContract__r.Contract_End_Date__c>= :start_date2 and CurrentContract__r.Contract_End_Date__c<= :end_date2)) order by hospital__c'; }else{ // 保有设备不为零件停产 query ='select Id,Hospital__c,CurrentContract_F__r.IF_Target_Renew__c,CurrentContract__c,CurrentContract__r.Contract_End_Date__c,CurrentContract__r.Contract_Start_Date__c,Product2.ServiceCategory__c,CurrentContract__r.Status__c,Product2.Category3__c,Product2.Category4__c' + ' from Asset where IF_StopParts_production__c != \'1\' and Product2.ServiceCategory__c != null ' // 测试不开启 +' and CurrentContract_F__r.IF_Target_Renew__c = \'1\'' + ' and ((CurrentContract__r.Contract_End_Date__c>= :start_date1 and CurrentContract__r.Contract_End_Date__c<= :end_date1) ' +' or (CurrentContract__r.Contract_End_Date__c>= :start_date2 and CurrentContract__r.Contract_End_Date__c<= :end_date2)) order by hospital__c'; } return Database.getQueryLocator(query); } global void execute(Database.BatchableContext BC, list Assets) { List asots = new List(); List accIds = new List(); Map asotMap = new Map(); for (Asset ass : Assets) { accIds.add(ass.Hospital__c); } List asotList = [select Id,Renew_Target_Rigid_Mirror_2__c,Renew_Target_Soft_Mirror_2__c,Renew_Target_Correlation_Lightsource__c,Account_HP__c,OCSM_Period_half__c from Account_Service_Of_Target__c where Account_HP__c in :accIds and OCSM_Period_half__c = :OCSM_Period_half and OCSM_Period__c = :OCSM_Period]; if (asotList != null) { for (Account_Service_Of_Target__c asot : asotList) { for (Id accid : accIds) { if (asot.Account_HP__c == accid) { asotMap.put(accid,asot); } } } } List AssetsTarget = new List(); for (Asset ass : Assets) { // 分母 /*1H考核对象: 1)、2021.4.1-2021.12.31合同结束且截止2022.3.31未续签的设备; 2)、2022.1.1-2022.6.30合同结束,不论该设备是否续签 2H考核对象: 1)、2021.10.1-2022.6.30合同结束且截止2022.9.30未续签的设备; 2)、2022.7.1-2022.12.31 合同结束,不论该设备是否续签 */ // 续签目标(硬) Integer mirror_1 = 0; // 续签目标(软) Integer mirror_2 = 0; //续签目标(周边) Integer mirror_3 = 0; Boolean result = true; if (ass.Product2.ServiceCategory__c != null) { if ( ass.CurrentContract__r.Contract_End_Date__c != null && ass.CurrentContract__r.Contract_End_Date__c>=start_date1&&ass.CurrentContract__r.Contract_End_Date__c<=end_date1){ if (ass.CurrentContract__c == null || ass.CurrentContract__r.Status__c == '合同结束') { ass.IF_Renewalrate_Target_Asset__c = '1'; AssetsTarget.add(ass); result = false; } if (result) { if (ass.CurrentContract__r.Contract_Start_Date__c != null && ass.CurrentContract__r.Contract_Start_Date__c <= deadlineTime) { ass.IF_Renewalrate_Target_Asset__c = '1'; AssetsTarget.add(ass); } } } if (ass.CurrentContract__r.Contract_End_Date__c != null && ass.CurrentContract__r.Contract_End_Date__c>=start_date2&&ass.CurrentContract__r.Contract_End_Date__c<=end_date2) { ass.IF_Renewalrate_Target_Asset__c = '1'; AssetsTarget.add(ass); } } if (ass.Product2.ServiceCategory__c == '硬性镜') { mirror_1++; } if(ass.Product2.ServiceCategory__c =='软性镜'){ mirror_2++; } if (ass.Product2.ServiceCategory__c == '周边') { mirror_3++; } if (asotMap.containsKey(ass.Hospital__c)) { Account_Service_Of_Target__c asotOne = new Account_Service_Of_Target__c(); asotOne = asotMap.get(ass.Hospital__c); asotOne.Renewalrate_Target_Account__c = true; asotOne.Renew_Target_Rigid_Mirror_2__c += mirror_1; asotOne.Renew_Target_Soft_Mirror_2__c += mirror_2; asotOne.Renew_Target_Correlation_Lightsource__c += mirror_3; if (!asots.contains(asotOne)) { asots.add(asotOne); } }else{ Account_Service_Of_Target__c asot1 = new Account_Service_Of_Target__c(); asot1.Account_HP__c = ass.Hospital__c; asot1.Renewalrate_Target_Account__c = true; asot1.Renew_Target_Rigid_Mirror_2__c = mirror_1; asot1.Renew_Target_Soft_Mirror_2__c = mirror_2; asot1.Renew_Target_Correlation_Lightsource__c = mirror_3; asot1.OCSM_Period__c = OCSM_Period; asot1.OCSM_Period_half__c = OCSM_Period_half; asotMap.put(ass.hospital__c,asot1); if (!asots.contains(asot1)) { asots.add(asot1); } } } if (AssetsTarget!=null) { try { Oly_TriggerHandler.bypass('AssetTrigger'); update AssetsTarget; } catch (Exception e) { iflog.ErrorLog__c += 'ERROR'+'['+'update AssetsTarget:'+']'+e.getMessage()+'\n'; } } if (asots!=null) { try { UpSert asots; } catch (Exception e) { iflog.ErrorLog__c += 'ERROR'+'['+'UpSert asots:'+']'+e.getMessage()+'\n'; } } } global void finish(Database.BatchableContext BC) { iflog.Log__c += '\nEquipmentRenewTargetBatch 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; } }