global class ContactInstructCountNSetNullBatch implements Database.Batchable, Database.Stateful { public String query; private Date today = Date.today(); private Date mon1stDate = Date.newInstance(today.year(), today.month(), 1); private Date monLastDate = mon1stDate.addMonths(1).addDays(-1); private Date lastMon1stDate = Date.newInstance(today.year(), today.month(), 1).addMonths(-1); private Date lastMonLastDate = mon1stDate.addDays(-1); private Integer month = today.month(); private Boolean mon1stDateFlag = today == mon1stDate; private Boolean april_11Flag = today == Date.newInstance(today.year(), 4, 11); global Integer totalCount = 0; // 总件数 global Integer failedCount = 0; global List emailMessages = new List(); global String specifiedYearMonth; global Integer specifiedMonth; Boolean IsNeedExecute = false; // 2021-03-03 mzy WLIG-BYHD79 SFDC环境batch合并调查 是否符合执行条件 global ContactInstructCountNSetNullBatch() { } //手动清空上一财年的数据 global ContactInstructCountNSetNullBatch(Boolean april_11Flag) { this.april_11Flag = april_11Flag; } //没有实际用途,跑测试程序使用 global ContactInstructCountNSetNullBatch(Integer month) { this.month = month; } //指定去跑某年某月数据 global ContactInstructCountNSetNullBatch(String specifiedYearMonth) { this.specifiedYearMonth = specifiedYearMonth; } //2021-03-03 mzy WLIG-BYHD79 SFDC环境batch合并调查 start global ContactInstructCountNSetNullBatch(Boolean tempNeedExecute , Boolean needExecute) { this.IsNeedExecute = needExecute; } //2021-03-03 mzy WLIG-BYHD79 SFDC环境batch合并调查 end global Database.QueryLocator start(Database.BatchableContext bc) { //Integer specifiedMonth ; String query = ' Select Id,Name,Instruct_report__r.ReportDate__c,Instruct_report__r.Status__c,ContactID__c '; //query += ', ContactID__r.Instruct_Count1__c,ContactID__r.Instruct_Count2__c,'; //query += ' ContactID__r.Instruct_Count3__c,ContactID__r.Instruct_Count4__c,'; //query += ' ContactID__r.Instruct_Count5__c,ContactID__r.Instruct_Count6__c,'; //query += ' ContactID__r.Instruct_Count7__c,ContactID__r.Instruct_Count8__c,'; //query += ' ContactID__r.Instruct_Count9__c,ContactID__r.Instruct_Count10__c,'; //query += ' ContactID__r.Instruct_Count11__c,ContactID__r.Instruct_Count12__c'; query += ' from Instructed_staff__c '; query += ' where Instruct_report__r.Status__c = \'批准\''; if (april_11Flag) { query = sqlConditionspell(13, mon1stDateFlag, query); } else if (String.isNotBlank(specifiedYearMonth)) { specifiedMonth = Integer.valueOf(specifiedYearMonth.split(',')[1]); query = sqlConditionspell(specifiedMonth, mon1stDateFlag, query); } else { query = sqlConditionspell(month, mon1stDateFlag, query); } if (mon1stDateFlag) { query += ' AND Instruct_report__r.ReportDate__c >= :lastMon1stDate'; query += ' AND Instruct_report__r.ReportDate__c <= :lastMonLastDate'; } else if (String.isNotBlank(specifiedYearMonth)) { Integer specifiedYear = Integer.valueOf(specifiedYearMonth.split(',')[0]); Date startDate = Date.newInstance(specifiedYear, specifiedMonth, 1); Date endDate = startDate.addMonths(1).addDays(-1); system.debug('startDate--->' + startDate); system.debug('endDate--->' + endDate); query += ' AND Instruct_report__r.ReportDate__c >= :startDate'; query += ' AND Instruct_report__r.ReportDate__c <= :endDate'; } else { query += ' AND Instruct_report__r.ReportDate__c >= :mon1stDate'; query += ' AND Instruct_report__r.ReportDate__c <= :monLastDate'; } // 2021-03-03 mzy WLIG-BYHD79 SFDC环境batch合并调查 start // 4月2日至4月10日外每天 不满足运行时间,可以使查询到的结果为空 //Date mon1stDate = Date.newInstance(today.year(), today.month(), 1); Date inexecutionDateStart = Date.newInstance(today.year(), 4, 2); Date inexecutionDateEnd = Date.newInstance(today.year(), 4, 10); Boolean inexecutionDateFlag = (inexecutionDateStart <= today) && (today <= inexecutionDateEnd); System.debug('query__C : ' + inexecutionDateFlag + ' mon1stDate :' + mon1stDate + ' monLastDate :' + monLastDate); if (inexecutionDateFlag && IsNeedExecute == true) { query = 'Select Id from Instructed_staff__c where Name = \'\' AND Name != \'\' '; } //2021-03-03 mzy WLIG-BYHD79 SFDC环境batch合并调查 end system.debug('query→→→SetNull' + query); System.debug(Database.getQueryLocator(query)); return Database.getQueryLocator(query); } global void execute(Database.BatchableContext BC, list InstructedstaffList) { Map updateContactMap = new Map(); system.debug('InstructedstaffList------->' + InstructedstaffList); Savepoint sp = Database.setSavepoint(); totalCount += InstructedstaffList.size(); try { for (Instructed_staff__c staff : InstructedstaffList) { Contact contact = new Contact(); contact.Id = staff.ContactID__c; if (april_11Flag) { //清空之前应该有一个备份 contact = StatisticsInstructedStaffBatch.updateInstruct_CountN(13, mon1stDateFlag, contact, 0); } else if (String.isNotBlank(specifiedYearMonth)) { specifiedMonth = Integer.valueOf(specifiedYearMonth.split(',')[1]); contact = StatisticsInstructedStaffBatch.updateInstruct_CountN(specifiedMonth, mon1stDateFlag, contact, 0); } else { contact = StatisticsInstructedStaffBatch.updateInstruct_CountN(month, mon1stDateFlag, contact, 0); } updateContactMap.put((Id)staff.ContactID__c, contact); } if (updateContactMap.size() > 0) { update updateContactMap.values(); } } catch (Exception e) { Database.rollback(sp); emailMessages.add(e.getMessage()); System.debug(emailMessages); failedCount += InstructedstaffList.size(); System.debug(failedCount); } } global void finish(Database.BatchableContext BC) { // sendFieldEmail(); // 2021-03-03 mzy WLIG-BYHD79 SFDC环境batch合并调查 start // 4月2日至4月10日外每天 不满足运行时间,可以使查询到的结果为空 //Date mon1stDate = Date.newInstance(today.year(), today.month(), 1); Date inexecutionDateStart = Date.newInstance(today.year(), 4, 2); Date inexecutionDateEnd = Date.newInstance(today.year(), 4, 10); Boolean inexecutionDateFlag = (inexecutionDateStart <= today) && (today <= inexecutionDateEnd); System.debug('query__C : ' + inexecutionDateFlag + ' mon1stDate :' + mon1stDate + ' monLastDate :' + monLastDate); if ((inexecutionDateFlag && IsNeedExecute == true) || (IsNeedExecute == false)) { if (String.isNotBlank(specifiedYearMonth)) { Database.executebatch(new StatisticsInstructedStaffBatch(specifiedYearMonth, true), 100); } else { Database.executebatch(new StatisticsInstructedStaffBatch(), 100); } } //2021-03-03 mzy WLIG-BYHD79 SFDC环境batch合并调查 start if (!Test.isRunningTest() && IsNeedExecute == true) { //batch里调用下一个batch时,希望跟原有的Schedule里面传的条数保持一致 Id execBTId = Database.executebatch(new UpdateThreeMonthlyContactBatch(true), 50); } //2021-03-03 mzy WLIG-BYHD79 SFDC环境batch合并调查 end } public void sendFieldEmail() { PretechBatchEmailUtil be = new PretechBatchEmailUtil(); //String[] toList = new String[] {UserInfo.getUserEmail()}; String[] toList = new String[] {'xinhonglu@prec-tech.com'}; 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, '', false); be.send(); } } global static String sqlConditionspell(Integer month, Boolean mon1stDateFlag, String query) { switch on month { when 1 { if (mon1stDateFlag) { query += ' AND ContactID__r.Instruct_Count12__c != 0'; } else { query += ' AND ContactID__r.Instruct_Count1__c != 0'; } } when 2 { if (mon1stDateFlag) { query += ' AND ContactID__r.Instruct_Count1__c != 0'; } else { query += ' AND ContactID__r.Instruct_Count2__c != 0'; } } when 3 { if (mon1stDateFlag) { query += ' AND ContactID__r.Instruct_Count2__c != 0'; } else { query += ' AND ContactID__r.Instruct_Count3__c != 0'; } } when 4 { if (mon1stDateFlag) { query += ' AND ContactID__r.Instruct_Count3__c != 0'; } else { query += ' AND ContactID__r.Instruct_Count4__c != 0'; } } when 5 { if (mon1stDateFlag) { query += ' AND ContactID__r.Instruct_Count4__c != 0'; } else { query += ' AND ContactID__r.Instruct_Count5__c != 0'; } } when 6 { if (mon1stDateFlag) { query += ' AND ContactID__r.Instruct_Count5__c != 0'; } else { query += ' AND ContactID__r.Instruct_Count6__c != 0'; } } when 7 { if (mon1stDateFlag) { query += ' AND ContactID__r.Instruct_Count6__c != 0'; } else { query += ' AND ContactID__r.Instruct_Count7__c != 0'; } } when 8 { if (mon1stDateFlag) { query += ' AND ContactID__r.Instruct_Count7__c != 0'; } else { query += ' AND ContactID__r.Instruct_Count8__c != 0'; } } when 9 { if (mon1stDateFlag) { query += ' AND ContactID__r.Instruct_Count8__c != 0'; } else { query += ' AND ContactID__r.Instruct_Count9__c != 0'; } } when 10 { if (mon1stDateFlag) { query += ' AND ContactID__r.Instruct_Count9__c != 0'; } else { query += ' AND ContactID__r.Instruct_Count10__c != 0'; } } when 11 { if (mon1stDateFlag) { query += ' AND ContactID__r.Instruct_Count10__c != 0'; } else { query += ' AND ContactID__r.Instruct_Count11__c != 0'; } } when 12 { if (mon1stDateFlag) { query += ' AND ContactID__r.Instruct_Count11__c != 0'; } else { query += ' AND ContactID__r.Instruct_Count12__c != 0'; } } when 13 { query += ' AND ( '; query += ' ContactID__r.Instruct_Count1__c != 0 OR ContactID__r.Instruct_Count2__c != 0 OR '; query += ' ContactID__r.Instruct_Count3__c != 0 OR ContactID__r.Instruct_Count4__c != 0 OR '; query += ' ContactID__r.Instruct_Count5__c != 0 OR ContactID__r.Instruct_Count6__c != 0 OR '; query += ' ContactID__r.Instruct_Count7__c != 0 OR ContactID__r.Instruct_Count8__c != 0 OR '; query += ' ContactID__r.Instruct_Count9__c != 0 OR ContactID__r.Instruct_Count10__c != 0 OR '; query += ' ContactID__r.Instruct_Count11__c != 0 OR ContactID__r.Instruct_Count12__c != 0 '; query += ' )'; } } return query; } }