global class RepairWorkdayBatch implements Database.Batchable { global final String repairId; global RepairWorkdayBatch(String id) { repairId = id; } global Database.QueryLocator start(Database.BatchableContext BC) { String query = 'select id, Repair_Start_Date__c, Repair_Final_Inspection_Date__c, TAT_elapsed_workday__c from Repair__c where Repair_Start_Date__c <> null and Repair_Final_Inspection_Date__c = null'; if (repairId != null && repairId.length() > 0) { query += ' and Id = :repairId'; } return Database.getQueryLocator(query); } global void execute(Database.BatchableContext BC, List rpList) { // 日历查询开始 Date sd = null; // 日历查询截至 Date ed = Date.today(); for (SObject so : rpList) { Repair__c rp = (Repair__c) so; // 日历查询开始 if (sd == null || rp.Repair_Start_Date__c < sd) { sd = rp.Repair_Start_Date__c; } } // 取得日历 Map ocMap = new Map(); if (sd != null) { List ocList = [ select Id, Date__c, IsWorkDay__c from OlympusCalendar__c where Date__c >= :sd and Date__c <= :ed order by Date__c]; for (OlympusCalendar__c oc : ocList) { Date d = oc.Date__c; Decimal iswd = oc.IsWorkDay__c; ocMap.put(d.format(), iswd.intValue()); } } // 设定TAT:修理时长(工作日) List updList = new List(); for (SObject so : rpList) { Repair__c rp = (Repair__c) so; Date d1 = rp.Repair_Start_Date__c; Date d2 = Date.today(); Integer days = 0; if (d1.daysBetween(d2) >= 0) { Repair__c r = new Repair__c(Id = rp.Id); for (Integer i = 0; i <= d1.daysBetween(d2); i++) { Date d = d1 + i; if (ocMap.containsKey(d.format())) { days += ocMap.get(d.format()); } } r.TAT_elapsed_workday__c = days; updList.add(r); } } if (updList.size() > 0) { update updList; } } global void finish(Database.BatchableContext BC) { // 无操作 } }