global class InventoryTaskAndEmailBatch implements Schedulable, Database.Batchable { public String YYYYMM = null; global void execute(SchedulableContext sc) { Database.executeBatch(new InventoryTaskAndEmailBatch()); } global InventoryTaskAndEmailBatch() { Datetime now = Datetime.now(); YYYYMM = now.format('YYYYMM'); } global Database.QueryLocator start(Database.BatchableContext bc) { return Database.getQueryLocator([SELECT Id, Email, RoleName_wave__c FROM User WHERE Profile.Name = '2B2_备品中心检测&仓库管理(照片)' AND IsActive = true]); } global void execute(Database.BatchableContext BC, list scope) { // 只有每个Q第二个月的最后一天才执行,2、5、8、11 if(!Test.isRunningTest()){ Date today = Date.today(); Integer month = today.month(); if (month != 2 && month != 5 && month != 8 && month != 11) { return; } Integer numberOfDays = Date.daysInMonth(today.year(), today.month()); Date lastDayOfMonth = Date.newInstance(today.year(), today.month(), numberOfDays); if (today != lastDayOfMonth) { return; } } // 北京备品中心人员 List bjUserList = new List(); // 上海备品中心人员 List shUserList = new List(); // 广州备品中心人员 List gzUserList = new List(); for (User uTemp : scope) { if (uTemp.RoleName_wave__c == '备品中心北方管理成员') { bjUserList.add(uTemp); } else if (uTemp.RoleName_wave__c == '备品中心华东管理成员') { shUserList.add(uTemp); } else if (uTemp.RoleName_wave__c == '备品中心南方管理成员') { gzUserList.add(uTemp); } } // 办事处人员 List userProvinceList = new List(); List usrList = [SELECT InventoryUser__c, Label FROM Inventory_User_Permission__mdt WHERE NOT Label like '%备品中心']; if (!usrList.isEmpty() && usrList.size() > 0) { // inventoryUserList for (Inventory_User_Permission__mdt uTemp : usrList) { Id[] usrArray = uTemp.InventoryUser__c.split(','); List uTempList = [SELECT Id, Email, Work_Location__c FROM User WHERE Id In :usrArray]; userProvinceList.addAll(uTempList); } } // 盘点检查计划 List inventoryTaskId = [select Id from RecordType where SobjectType = 'task__c' AND Name = '盘点检查计划']; // 温湿度检查计划 List temperatureHumidityTaskId = [select Id from RecordType where SobjectType = 'task__c' AND Name = '温湿度检查计划']; // 邮件发送人 OrgWideEmailAddress[] owea = [select Id from OrgWideEmailAddress where Address = 'olympus@prec-tech.com']; // 产生任务 List insertTaskList = new List(); // 产生邮件 List emails = new List(); // 北京备品中心 for (User u : bjUserList) { // 盘点检查计划 task__c tTemp1 = setTask(inventoryTaskId[0].Id, u, '盘点检查计划提醒_' + YYYYMM + '_北京 备品中心'); // 温湿度检查计划 task__c tTemp2 = setTask(temperatureHumidityTaskId[0].Id, u, '温湿度检查计划提醒_' + YYYYMM + '_北京 备品中心'); insertTaskList.add(tTemp1); insertTaskList.add(tTemp2); // 盘点检查计划 Messaging.SingleEmailMessage mail1 = setEmail(owea.get(0).Id, u, '盘点检查计划'); // 温湿度检查计划 Messaging.SingleEmailMessage mail2 = setEmail(owea.get(0).Id, u, '温湿度检查计划'); emails.add(mail1); emails.add(mail2); } // 上海备品中心 for (User u : shUserList) { // 盘点检查计划 task__c tTemp1 = setTask(inventoryTaskId[0].Id, u, '盘点检查计划提醒_' + YYYYMM + '_上海 备品中心'); // 温湿度检查计划 task__c tTemp2 = setTask(temperatureHumidityTaskId[0].Id, u, '温湿度检查计划提醒_' + YYYYMM + '_上海 备品中心'); insertTaskList.add(tTemp1); insertTaskList.add(tTemp2); // 盘点检查计划 Messaging.SingleEmailMessage mail1 = setEmail(owea.get(0).Id, u, '盘点检查计划'); // 温湿度检查计划 Messaging.SingleEmailMessage mail2 = setEmail(owea.get(0).Id, u, '温湿度检查计划'); emails.add(mail1); emails.add(mail2); } // 广州备品中心 for (User u : gzUserList) { // 盘点检查计划 task__c tTemp1 = setTask(inventoryTaskId[0].Id, u, '盘点检查计划提醒_' + YYYYMM + '_广州 备品中心'); // 温湿度检查计划 task__c tTemp2 = setTask(temperatureHumidityTaskId[0].Id, u, '温湿度检查计划提醒_' + YYYYMM + '_广州 备品中心'); insertTaskList.add(tTemp1); insertTaskList.add(tTemp2); // 盘点检查计划 Messaging.SingleEmailMessage mail1 = setEmail(owea.get(0).Id, u, '盘点检查计划'); // 温湿度检查计划 Messaging.SingleEmailMessage mail2 = setEmail(owea.get(0).Id, u, '温湿度检查计划'); emails.add(mail1); emails.add(mail2); } // 办事处 办事处没有温湿度盘点计划 for (User u : userProvinceList) { // 盘点检查计划 task__c tTemp1 = setTask(inventoryTaskId[0].Id, u, '盘点检查计划提醒_' + YYYYMM + '_' + u.Work_Location__c); insertTaskList.add(tTemp1); // 盘点检查计划 Messaging.SingleEmailMessage mail1 = setEmail(owea.get(0).Id, u, '盘点检查计划'); emails.add(mail1); } if (!insertTaskList.isEmpty()) { insert insertTaskList; } if (!emails.isEmpty()) { Messaging.sendEmail(emails); } } global void finish(Database.BatchableContext BC) { } public static task__c setTask(String recordtypeId, User uTemp, String taskname) { task__c tTemp = new task__c(); // 盘点检查计划 tTemp.RecordTypeId = recordtypeId; // 任务区分 tTemp.taskDifferent__c = '被动任务'; // 所有人 ID tTemp.OwnerId = uTemp.Id; // 任务名称 tTemp.Name = taskname; // End_Date__c 对应期限 // Finish_Date__c 最终期限 tTemp.PlanEndDate__c = Date.today().addMonths(1); // assignee__c 被分配者 tTemp.assignee__c = uTemp.Id; return tTemp; } public static Messaging.SingleEmailMessage setEmail(String orgWideEmailAddressId, User uTemp, String emailName) { OrgWideEmailAddress[] owea = [select Id from OrgWideEmailAddress where Address = 'olympus@prec-tech.com']; Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage(); String[] toAddresses = new String[] {uTemp.Email}; mail.setToAddresses(toAddresses); mail.setSaveAsActivity(false); mail.setOrgWideEmailAddressId(owea.get(0).Id); mail.setSubject(emailName + '邮件提醒'); mail.setPlainTextBody('您有即将开始的' + emailName + ',请注意。'); return mail; } }