global class rollupToRepairBatch implements Database.Batchable, Database.Stateful { public String query; global Integer totalCount = 0; // 总件数 global Integer failedCount = 0; global List emailMessages = new List(); public List repairId; public boolean isAll = false; global rollupToRepairBatch(List repairId) { this.repairId = repairId; this.isAll = true; } global rollupToRepairBatch(String query) { this.query = query; } global rollupToRepairBatch() { } global rollupToRepairBatch(boolean isAll) { this.isAll = isAll; } global Database.QueryLocator start(Database.BatchableContext bc) { // 20221110 ljh 优化 start Date st = Date.today().addMonths(-36); Datetime startDatetime = Datetime.newInstance(st.year(), st.month(), st.day(), 8, 0, 0); // 20221110 ljh 优化 end if (repairId != null && repairId.size() > 0) { return Database.getQueryLocator( [select Id, if_Rental_Apply__c , Offer_Rental_New__c, Request_approval_day__c, Bollow_Date__c from repair__c where Id in :repairId]); } else if (isAll) { return Database.getQueryLocator( [select Id , if_Rental_Apply__c , Offer_Rental_New__c, Request_approval_day__c, Bollow_Date__c from repair__c ]); } else { // 20221110 ljh 优化 start // return Database.getQueryLocator( // [select Id , // if_Rental_Apply__c , // Offer_Rental_New__c, // Request_approval_day__c, // Bollow_Date__c // from repair__c // where Repair_Completed_Date__c = null Or // Repair_Completed_Date__c >= : // Date.today().addMonths(-12) // ]); return Database.getQueryLocator( [select Id , if_Rental_Apply__c , Offer_Rental_New__c, Request_approval_day__c, Bollow_Date__c from repair__c where Status1__c != '0.取消' and Status1__c != '0.删除' and Status1__c != '5.完毕' and ( (Repair_Completed_Date__c = null and CreatedDate > :startDatetime) Or Repair_Completed_Date__c >= :Date.today().addMonths(-12) ) ]); // 20221110 ljh 优化 end } } global void execute(Database.BatchableContext BC, List repairList) { Savepoint sp = Database.setSavepoint(); map OldRepairMap = new Map(); map updateRepairMap = new Map(); for (Repair__c tempRepair : repairList ) { OldRepairMap.put(tempRepair.id, tempRepair); Repair__c newRepair = new Repair__c(); newRepair.id = tempRepair.id; newRepair.if_Rental_Apply__c = false; newRepair.Offer_Rental_New__c = false; newRepair.Request_approval_day__c = null; newRepair.Bollow_Date__c = null; updateRepairMap.put(tempRepair.id, newRepair); } // 检索备品借出申请 List raList = [SELECT Id, Repair__c, Request_approval_day__c, Cancel_Reason__c, Bollow_Date__c FROM Rental_Apply__c WHERE (Repair__c IN :repairList AND Request_approval_day__c != null AND Cancel_Reason__c != '主动取消') OR (Repair__c IN :repairList AND Bollow_Date__c != null) ]; // 汇总备品借出申请内容到修理 if (raList != null && raList.size() > 0) { for (Rental_Apply__c ra : raList) { if (updateRepairMap.containsKey(ra.Repair__c)) { Repair__c rep = updateRepairMap.get(ra.Repair__c); if (ra.Request_approval_day__c != null && ( ra.Cancel_Reason__c == null || !ra.Cancel_Reason__c.equals('主动取消') ) ) { rep.if_Rental_Apply__c = true; //保存最新的申请日期 rep.Request_approval_day__c = rep.Request_approval_day__c ==null ||ra.Request_approval_day__c > rep.Request_approval_day__c ? ra.Request_approval_day__c : rep.Request_approval_day__c; } if (ra.Bollow_Date__c != null ) { rep.Offer_Rental_New__c = true; //保存最新的出库日 rep.Bollow_Date__c = rep.Bollow_Date__c ==null ||ra.Bollow_Date__c > rep.Bollow_Date__c ? ra.Bollow_Date__c : rep.Bollow_Date__c; } } } } // 对比前后内容,如果没有发生变化,那么就从需要更新的数据中移除 for (repair__c newRepair : OldRepairMap.values()) { repair__c OldRepair = updateRepairMap.get(newRepair.id); if (newRepair.if_Rental_Apply__c == OldRepair.if_Rental_Apply__c && newRepair.Offer_Rental_New__c == OldRepair.Offer_Rental_New__c && newRepair.Request_approval_day__c == OldRepair.Request_approval_day__c && newRepair.Bollow_Date__c == OldRepair.Bollow_Date__c ) { updateRepairMap.remove(newRepair.id); } } // 更新发生变化的修理 Database.SaveResult[] updateRepairResult = Database.update(updateRepairMap.values(), false); for (Database.SaveResult lsrChild : updateRepairResult ) { totalCount += 1; if ( !lsrChild.isSuccess() ) { failedCount += 1; } } } global void finish(Database.BatchableContext BC) { sendFieldEmail(); if (!Test.isRunningTest() && !isAll) { Database.executeBatch(new RollupToMaintenanceContractBatch(), 1); } } @TestVisible private void sendFieldEmail() { PretechBatchEmailUtil be = new PretechBatchEmailUtil(); String[] toList = new String[] {UserInfo.getUserEmail()}; String title = '备品可视化更新修理失败'; String[] ccList = new String[] {}; if (System.Test.isRunningTest()) { be.successMail('', 1); } if (failedCount > 0) { be.failedMail(toList, ccList, title, String.join(this.emailMessages, '\n'), totalCount, totalCount - failedCount, failedCount, '', false); be.send(); } } }