/* * 这个batch的运行是为了给下月所有工作日创建空日报一览 * 创建空日报条件为: * (1) 职种为 销售推广、 销售市场 或 销售服务 且 职位 为一般 、 高级 或 主管 的用户; * (2) 只就工作日创建空日报。 * batch运行参数: * 1)如果什么都不输,就创建符合条件的日报 * 2)如果参数为 1 个string, 则认为其为用户ID,则创建该用户符合条件的日报 * 3)如果参数为 List, 则认为其为用户ID 的List,则创建这些用户符合条件的日报 * 4)如果参数为两个Date, 则创建 所有符合条件的用户,以第一个日期开始,第二个日期前一天为结束,创建空日报 */ global class createEmptyDailyReportBatch implements Database.Batchable , Database.Stateful { String userID; Date StartDate; Date endDate; list userIDList; global List emailMessages = new List(); global Integer totalCount = 0; // 总件数 global Integer failedCount = 0; // Boolean ebFlag = false; global createEmptyDailyReportBatch() { // ebFlag = true; } //判定只要有参数就是手动执行,生成空日报 //yuxiaolin 2020/11/4 start global createEmptyDailyReportBatch(Integer eb) { } //yuxiaolin 2020/11/4 end global createEmptyDailyReportBatch(Date StartDate, Date endDate) { this.StartDate = StartDate; this.endDate = endDate; } global createEmptyDailyReportBatch(String userID) { this.userID = userID; } global createEmptyDailyReportBatch(List userIDList) { this.userIDList = userIDList; } global createEmptyDailyReportBatch(List userIDList,Date StartDate, Date endDate) { this.userIDList = userIDList; this.StartDate = StartDate; this.endDate = endDate; } global Database.QueryLocator start(Database.BatchableContext BC) { /* string query = 'select id from user where IsActive = true and ' + '(Job_Category__c = \'销售推广\' or Job_Category__c = \'销售市场\' or Job_Category__c = \'销售服务\') and ' + '(Post__c = \'一般\' or Post__c = \'高级\' or Post__c = \'主管\') and ' + 'ProfileId not in ( \'00e10000000tiVV\', \'00e10000000NawV\', ' + ' \'00e10000000tiSh\' , \'00e1000000121A3\' , \'00e10000000NbA3\' ' + ' , \'00e10000000NbC9\' , \'00e10000000tk6N\' ) '; */ //WLIG-BUR5Y4 yuxiaolin 2020/10/27 start string query = 'select id from user where IsActive = true and ' + '(Job_Category__c = \'销售推广\' or Job_Category__c = \'销售市场\' or Job_Category__c = \'销售服务\') and ' + '((Post__c = \'一般\' or Post__c = \'高级\' or Post__c = \'主管\') or ((Post__c = \'经理\' or Post__c = \'部长\' or Post__c = \'副部长\'or Post__c = \'副经理\') and (Salesdepartment__c = \'5.华东\' or Salesdepartment__c = \'6.华南\'))) and ' + 'ProfileId not in ( \'00e10000000tiVV\', \'00e10000000NawV\', ' + ' \'00e10000000tiSh\' , \'00e1000000121A3\' , \'00e10000000NbA3\' ' + ' , \'00e10000000NbC9\' , \'00e10000000tk6N\' ) '; //WLIG-BUR5Y4 yuxiaolin 2020/10/27 end if (!System.Test.isrunningTest()) { query += ' and id != \'00510000005sEEM\' '; } if (!string.isblank(userID)) { query += ' and id = :userID '; } if (userIDList != null) { query += ' and id in: userIDList '; } system.debug('id'); return Database.getQueryLocator(query); } global void execute(Database.BatchableContext BC, List userList) { date NextfirstDate = Date.today().toStartOfMonth().addMonths(1); date Next2firstDate = Date.today().toStartOfMonth().addMonths(2); totalCount ++; Savepoint sp = Database.setSavepoint(); try { if (StartDate != null && endDate != null) { NextfirstDate = StartDate; Next2firstDate = endDate; } List UserIdList = new list(); for (User tempUser : userList) { UserIdList.add(tempUser.id); } List existDRList = [select id, Daily_Report_Key__c from Daily_Report__c where Reporter__c in: UserIdList and Reported_Date__c >= :NextfirstDate and Reported_Date__c < : Next2firstDate ]; map ExistDRmap = new map(); for (Daily_Report__c tempDR : existDRList) { ExistDRmap.put(tempDR.Daily_Report_Key__c , tempDR); } list NextMonthWorkDateList = getNextMonthWorkDay(StartDate, endDate); List insertedDRList = new List(); for (ID tempID : UserIdList) { for (Date tempDate : NextMonthWorkDateList ) { if (!ExistDRmap.containsKey( tempDate.format().ReplaceAll('/', '-') + ('' + tempID).substring(0, 15) ) ) { insertedDRList.add(createDR(tempID, tempDate)); } } } if (insertedDRList.size() > 0) { insert insertedDRList; } if (System.Test.isrunningTest()) { throw new ControllerUtil.myException('test。'); } } catch (Exception e) { Database.rollback(sp); emailMessages.add(e.getMessage()); System.debug(emailMessages); failedCount += userList.size(); System.debug(failedCount); } } public static List getNextMonthWorkDay(date NextfirstDate, date Next2firstDate ) { List tempDateList = new List(); if (NextfirstDate == null) { NextfirstDate = Date.today().toStartOfMonth().addMonths(1); } if (Next2firstDate == null) { Next2firstDate = Date.today().toStartOfMonth().addMonths(2); } List workday = [ select Id, Date__c, IsWorkDay__c from OlympusCalendar__c where Date__c >= :NextfirstDate and Date__c < : Next2firstDate and IsWorkDay__c = 1 order by Date__c]; for (OlympusCalendar__c tempOlyDate : workday) { tempDateList.add(tempOlyDate.Date__c); } return tempDateList; } private Daily_Report__c createDR( id userId, Date reportDate) { Daily_Report__c report = new Daily_Report__c(); report.Reporter__c = userId; report.Status__c = '作成中'; report.Daily_Report_Data_Type__c = '通常'; report.Reported_Date__c = reportDate; report.Working_Time_From__c = Datetime.newInstance(reportDate.year(), reportDate.month(), reportDate.day(), 8, 45, 0); report.Working_Time_To__c = Datetime.newInstance(reportDate.year(), reportDate.month(), reportDate.day(), 17, 30, 0); report.OwnerId = userId; return report; } global void finish(Database.BatchableContext BC) { sendFieldEmail(); // if(!test.isRunningTest() && ebFlag == true){ // Database.executebatch(new CreatePassiveTaskBatch(), 10); // } } 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 (emailMessages.size() > 0) { be.failedMail(toList, ccList, title, String.join(this.emailMessages, '\n'), totalCount, totalCount - failedCount, failedCount); be.send(); } } }