global class EquipmentRenewBatch 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; private BatchIF_Log__c iflog; global EquipmentRenewBatch() { this.query = ''; iflog = new BatchIF_Log__c(); iflog.Type__c = 'PushNotification'; iflog.Log__c = 'EquipmentRenewBatch start\n'; iflog.ErrorLog__c = ''; insert iflog; } global Database.QueryLocator start(Database.BatchableContext bc) { if (toDayTime.month() >= 4 && toDayTime.month() <= 9) { this.start_date1 = Date.newInstance(toDayTime.year()-1,4,1); this.end_date1 = Date.newInstance(toDayTime.year()-1,12,31); this.start_date2 = Date.newInstance(toDayTime.year(),1,1); this.end_date2 = Date.newInstance(toDayTime.year(),6,30); this.deadlineTime = Date.newInstance(toDayTime.year(),3,31); }else{ this.start_date1 = Date.newInstance(toDayTime.year()-1,10,1); this.end_date1 = Date.newInstance(toDayTime.year(),6,30); this.start_date2 = Date.newInstance(toDayTime.year(),7,1); this.end_date2 = Date.newInstance(toDayTime.year(),12,31); this.deadlineTime = Date.newInstance(toDayTime.year(),9,30); } query+='select Id,(select Id,CurrentContract__c,CurrentContract__r.Contract_End_Date__c,CurrentContract__r.Contract_Start_Date__c,CurrentContract__r.New_Contract_TypeF_Text__c,Product2.ServiceCategory__c,CurrentContract__r.Status__c' + ' from Asset_Hospital__r where CurrentContract__r.Contract_End_Date__c >= :start_date1 and CurrentContract__r.Contract_End_Date__c <= :end_date2)' + ' from Account'; return Database.getQueryLocator(query); } global void execute(Database.BatchableContext BC, list Accounts) { List asotList = new List(); for (Account acc : Accounts) { Account_Service_Of_Target__c asot = new Account_Service_Of_Target__c(); List AssetsTarget = new List(); List AssetsReal = new List(); // 实际续签数:设备数 Integer mirror_1 = 0; // 续签目标:设备数 Integer mirror_2 = 0; for (Asset ass : acc.Asset_Hospital__r) { // 分子 //1. 设备关联的合同类型是“续签合同” 2. 在2023年3月31日前系统生效完毕 if (ass.CurrentContract__r.Contract_End_Date__c <= Date.newInstance(toDayTime.year()+1,3,31) && ass.CurrentContract__r.New_Contract_TypeF_Text__c == '续签合同') { // 标记为是否续签实际设备 ass.IF_Renewalrate_Real_Asset__c = '1'; AssetsReal.add(ass); mirror_1++; } // 分母 /*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 合同结束,不论该设备是否续签 */ Boolean result = true; if (ass.Product2.ServiceCategory__c != null) { if (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; mirror_2++; } if (result) { if (ass.CurrentContract__r.Contract_Start_Date__c <= deadlineTime) { ass.IF_Renewalrate_Target_Asset__c = '1'; AssetsTarget.add(ass); mirror_2++; } } } if (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); mirror_2++; } } if (AssetsReal!=null) { try { update AssetsReal; } catch (Exception e) { iflog.ErrorLog__c += 'ERROR'+'['+'update AssetsReal:'+']'+e.getMessage()+'\n'; } } if (AssetsTarget!=null) { try { update AssetsTarget; } catch (Exception e) { iflog.ErrorLog__c += 'ERROR'+'['+'update AssetsTarget:'+']'+e.getMessage()+'\n'; } } } asot.Account_HP__c = acc.id; // asot.Finish_Asset__c = mirror_1; // asot.AssetContinueTaget__c = mirror_2; // asotList.add(asot); } // if (asotList!=null) { // try { // insert asotList; // } // catch (Exception e) { // iflog.ErrorLog__c += 'ERROR'+'['+'insert asotList:'+']'+e.getMessage()+'\n'; // } // } } global void finish(Database.BatchableContext BC) { iflog.Log__c += '\nEquipmentRenewBatch 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; } }