global class LostReportAutoGiveupBatch implements Database.Batchable, Database.Stateful { global List emailMessages = new List(); global Integer totalCount = 0; // 总件数 global Integer failedCount = 0; global Date tdy = Date.today(); /** * コンスタント */ global LostReportAutoGiveupBatch() { } /** * startには、queryを実行、备品Set明细を検索 */ global Database.QueryLocator start(Database.BatchableContext BC) { bp3_Setting__c conf = bp3_Setting__c.getOrgDefaults(); Date autoGiveupDate90 = tdy.addDays(-(conf.Lonar_Auto_GiveUp_Day__c == null ? 90 : Integer.valueOf(conf.Lonar_Auto_GiveUp_Day__c))); Date autoGiveupStartDate = conf.Auto_Giveup_StartDate__c == null ? Date.valueOf('1970-01-01') : conf.Auto_Giveup_StartDate__c; return Database.getQueryLocator( [SELECT Id, LostReport_Status_F__c, LostReport__c, Asset__c FROM LostReport_Detail__c WHERE DeleteLostReport_Detail_Reason__c = null AND CancelLostReport__c = false AND LostReport__r.Asset__c != null AND LostReport__r.LostReport_approval_time__c >= :autoGiveupStartDate AND LostReport__r.LostReport_approval_time__c != null AND LostReport__r.LostReport_approval_time__c <= :autoGiveupDate90 ORDER BY Id] ); } global void execute(Database.BatchableContext BC, List ldList) { Savepoint sp = Database.setSavepoint(); try{ totalCount += ldList.size(); Map assMap = new Map(); List lsList = new List(); for (SObject sa : ldList) { LostReport_Detail__c ld = (LostReport_Detail__c)sa; assMap.put(ld.Asset__c, new Asset(Id = ld.Asset__c , Status = FixtureUtil.assetStatusMap.get(FixtureUtil.AssetStatus.Dai_Fei_Qi.ordinal()) , Tobe_Discarded_Date__c = tdy)); ld.Auto_Lost_item_giveup__c = true; lsList.add(ld); } System.debug(totalCount); update lsList; update assMap.values(); } catch (Exception e) { emailMessages.add(e.getMessage()); failedCount += ldList.size(); Database.rollback(sp); } } global void finish(Database.BatchableContext BC) { BatchEmailUtil be = new BatchEmailUtil(); String[] toList = new String[]{UserInfo.getUserEmail()}; String title = '意识报告自动断念(非集中管理)'; String[] ccList = new String[] {}; if(this.emailMessages.size() == 0){ be.successMail(toList, ccList, title, totalCount); }else{ String emailLabel = 'BatchNotify'; for (OrgWideEmailAddress tmpEmailObj : [SELECT Id, Address, DisplayName FROM OrgWideEmailAddress WHERE DisplayName like :emailLabel]) { ccList.add(tmpEmailObj.Address); } be.failedMail(toList, ccList, title, String.join(this.emailMessages, '\n'), totalCount, totalCount - failedCount, failedCount); } be.send(); } }