global class CampaignSendMailBatch implements Database.Batchable , Database.Stateful { public boolean isService; public boolean isServiceReport; private boolean result; private string Errorstr; private string logstr; global CampaignSendMailBatch(boolean isService) { this.isService = isService; //this.isServiceReport = false; this.result = true; this.Errorstr = ''; this.logstr = ''; } global CampaignSendMailBatch() { this.isService = false; //this.isServiceReport = false; this.result = true; this.Errorstr = ''; this.logstr = ''; } global CampaignSendMailBatch(string ServiceReport) { this.isServiceReport = true; this.isService = false; this.result = true; this.Errorstr = ''; this.logstr = ''; } global Database.QueryLocator start(Database.BatchableContext BC) { if (isServiceReport != null) { return Database.getQueryLocator( [select Id, OwnerId, Owner.Dept__c, Owner.Email, Society_Type__c, Open_scope__c, Name2__c, JingliApprovalManager__c, JingliApprovalManager__r.Email, BuchangApprovalManager__c, BuchangApprovalManager__r.Email, WorkshopPlace__c, Workshop_category__c, StartDate__c, EndDate__c, StartDate, EndDate, CancleReason__c, Mailflg_after45__c, Mailflg_cancel__c, Mailflg_before15__c, Mailflg_before7__c, Mailflg_after3__c // 服务技师培训 2019/1/7 张玉山 start , ServiceDesignDep__c, ServiceDesignDep__r.Email, Province__c, owner.Name, Status, Name, Cover_Area__c, Salesdepartment__c, Mailflg_6Month_service__c, Mailflg_Approval_service__c, Mailflg_before7_service__c, Mailflg_Cancel_Service__c , Mailflgafter3serviceDate__c, Mailflgafter3FinalserviceDate__c, Lesson1Date__c, Lesson2Date__c, Lesson3Date__c, Lesson4Date__c, Lesson5Date__c, Lesson6Date__c, Lesson7Date__c, Lesson8Date__c, FinalExamDate__c, TrainingType__c, TeachingFrequency__c // 服务技师培训 2019/1/7 张玉山 end from Campaign limit 1] ); } return Database.getQueryLocator( [select Id, OwnerId, Owner.Dept__c, Owner.Email, Society_Type__c, Open_scope__c, Name2__c, JingliApprovalManager__c, JingliApprovalManager__r.Email, BuchangApprovalManager__c, BuchangApprovalManager__r.Email, WorkshopPlace__c, Workshop_category__c, StartDate__c, EndDate__c, StartDate, EndDate, CancleReason__c, Mailflg_after45__c, Mailflg_cancel__c, Mailflg_before15__c, Mailflg_before7__c, Mailflg_after3__c // 服务技师培训 2019/1/7 张玉山 start , ServiceDesignDep__c, ServiceDesignDep__r.Email, Province__c, owner.Name, Status, Name, Cover_Area__c, Salesdepartment__c, Mailflg_6Month_service__c, Mailflg_Approval_service__c, Mailflg_before7_service__c, Mailflg_Cancel_Service__c , Mailflgafter3serviceDate__c, Mailflgafter3FinalserviceDate__c, Lesson1Date__c, Lesson2Date__c, Lesson3Date__c, Lesson4Date__c, Lesson5Date__c, Lesson6Date__c, Lesson7Date__c, Lesson8Date__c, FinalExamDate__c, TrainingType__c, TeachingFrequency__c // 服务技师培训 2019/1/7 张玉山 end from Campaign where Mailflg_after45__c = true or Mailflg_cancel__c = true or Mailflg_before15__c = true or Mailflg_before7__c = true or Mailflg_after3__c = true // 服务技师培训 2019/1/7 张玉山 start or (Mailflg_6Month_service__c > 0 and ( Lesson8Date__c < : Date.today() or (Lesson8Date__c = null and Lesson4Date__c < : Date.today()) ) ) or FinalExamDate__c = : Date.today().addDays(-3) or ( Lesson1Date__c = : Date.today().addDays(-3) and TeachingFrequency__c != '连续四天' ) or ( Lesson2Date__c = : Date.today().addDays(-3) and TeachingFrequency__c != '连续四天' ) or ( Lesson3Date__c = : Date.today().addDays(-3) and TeachingFrequency__c != '连续四天') or ( Lesson4Date__c = : Date.today().addDays(-3) and TeachingFrequency__c != '连续四天') or ( Lesson5Date__c = : Date.today().addDays(-3) and TeachingFrequency__c != '连续四天') or ( Lesson6Date__c = : Date.today().addDays(-3) and TeachingFrequency__c != '连续四天') or ( Lesson7Date__c = : Date.today().addDays(-3) and TeachingFrequency__c != '连续四天') or ( Lesson8Date__c = : Date.today().addDays(-3) and TeachingFrequency__c != '连续四天') or Mailflg_Approval_service__c = true or Mailflg_before7_service__c = true or Mailflg_Cancel_Service__c = true // 服务技师培训 2019/1/7 张玉山 end ] ); } global void execute(Database.BatchableContext BC, List campaign) { List campaignList = campaign; List after45_List = new List(); List cancel_List = new List(); List before15_List = new List(); List before7_List = new List(); List after3_List = new List(); // 服务技师培训 2019/1/7 张玉山 start // 检索出批准的带教报告发邮件 List Instruct_reportList = [select Id, Name, Campaign__r.OwnerId, Campaign__r.Owner.Dept__c, Campaign__r.Owner.Email , Campaign__r.Owner.Name , Campaign__r.ServiceDesignDep__c, Campaign__r.ServiceDesignDep__r.Email , Campaign__r.Status, campaign__r.Salesdepartment__c, campaign__r.Province__c, campaign__c, campaign__r.Name from Instruct_report__c where MailFlag_Approved__c = true ]; // 检索出批准的授课、考核报告发邮件 List AssessmentReportList = [select Id, Name, Campaign__r.OwnerId, Campaign__r.Owner.Dept__c, Campaign__r.Owner.Email , Campaign__r.Owner.Name , Campaign__r.ServiceDesignDep__c, Campaign__r.ServiceDesignDep__r.Email , Campaign__r.Status , campaign__r.Salesdepartment__c, campaign__r.Province__c, campaign__c, Type__c, campaign__r.Name from AssessmentReport__c where MailFlag_Approved__c = true ]; /* * 符合发邮件的服务技师培养项目,其中包括: * 考核结束后连续6个月每月第一个工作日提醒填写带教报告 :sixMonthServiceList * 授课三天提醒提交授课报告 : after3ServiceList * 考核三天提醒提交考核报告 : after3FinalServiceList * 主页面审批通过: ApprovalServiceList * 开班前7天提醒 : before7ServiceList * 主页面取消申请审批通过 :CancelServiceList * */ List sixMonthServiceList = new List(); List after3ServiceList = new List(); List after3FinalServiceList = new List(); List ApprovalServiceList = new List(); List before7ServiceList = new List(); List CancelServiceList = new List(); //每月到今天的工作日 Date toDate = Date.today(); Date yesterDate = toDate.addDays(-1); Date mon1stDate = Date.newInstance(toDate.year(), toDate.month(), 1); Integer workdays = UpdateUserTextColBatch.getOlympusWorkDayCount(mon1stDate, toDate); //每月到昨天的工作日 Integer workdays1 = UpdateUserTextColBatch.getOlympusWorkDayCount(mon1stDate, yesterDate); Integer OSFBacth_Execute_Day = Integer.valueOf(System.Label.OSFBacth_Execute_Day); // 服务技师培训 2019/1/7 张玉山 end for (Campaign c : campaignList) { //system.debug('Campaign:' + c); Date startDate = c.StartDate; Date today = Date.today(); if (!isService && isServiceReport == null ) { if (c.Mailflg_after45__c == true) { after45_List.add(c); } if (c.Mailflg_cancel__c == true) { cancel_List.add(c); } if (c.Mailflg_before15__c == true && startDate != null && today.daysBetween(startDate) >= 10) { before15_List.add(c); } if (c.Mailflg_before7__c == true && startDate != null && today.daysBetween(startDate) >= 5) { before7_List.add(c); } if (c.Mailflg_after3__c == true) { after3_List.add(c); } } if (isService && isServiceReport == null) { // 服务技师培训 2019/1/7 张玉山 start // 考核结束后连续6个月每月第一个工作日提醒填写带教报告 if (c.Mailflg_6Month_service__c > 0 && c.Mailflg_6Month_service__c < 7 && workdays1 != OSFBacth_Execute_Day && workdays == OSFBacth_Execute_Day ) { sixMonthServiceList.add(c); } // 授课后三天提醒提交授课报告, 判断今天是否是否是各次授课后三天或者上次发送邮件失败了 if (c.Status != null && c.Status.equals('公开中') && c.TeachingFrequency__c != null && (( c.EndDate__c == Date.today().addDays(-3) && c.TeachingFrequency__c.equals('连续四天')) || (c.TeachingFrequency__c != '连续四天' && ( c.Lesson1Date__c == Date.today().addDays(-3) || c.Lesson2Date__c == Date.today().addDays(-3) || c.Lesson3Date__c == Date.today().addDays(-3) || c.Lesson4Date__c == Date.today().addDays(-3) || c.Lesson5Date__c == Date.today().addDays(-3) || c.Lesson6Date__c == Date.today().addDays(-3) || c.Lesson7Date__c == Date.today().addDays(-3) || c.Lesson8Date__c == Date.today().addDays(-3))) || c.Mailflgafter3serviceDate__c == true ) ) { after3ServiceList.add(c); } if (c.FinalExamDate__c == Date.today().addDays(-3) || c.Mailflgafter3FinalserviceDate__c == true) { after3FinalServiceList.add(c); } if (c.Mailflg_Approval_service__c == true) { ApprovalServiceList.add(c); } if (c.Mailflg_before7_service__c == true && c.Status != '取消' && startDate != null && today.daysBetween(startDate) < 8 && today.daysBetween(startDate) >= 4 ) { before7ServiceList.add(c); } if (c.Mailflg_Cancel_Service__c == true ) { CancelServiceList.add(c); } // 服务技师培训 2019/1/7 张玉山 end } } boolean rs1 = true; boolean rs2 = true; boolean rs3 = true; boolean rs4 = true; boolean rs5 = true; // 服务技师培训 2019/1/7 张玉山 start boolean rs6 = true; boolean rs7 = true; boolean rs14 = true; boolean rs8 = true; boolean rs9 = true; boolean rs10 = true; boolean rs11 = true; boolean rs12 = true; boolean rs13 = true; system.debug('sixMonthServiceList:' + sixMonthServiceList); system.debug('after3ServiceList:' + after3ServiceList); system.debug('after3FinalServiceList:' + after3ServiceList); system.debug('ApprovalServiceList:' + ApprovalServiceList); system.debug('before7ServiceList:' + before7ServiceList); system.debug('CancelServiceList:' + CancelServiceList); system.debug('Instruct_reportList:' + Instruct_reportList); system.debug('AssessmentReportList:' + AssessmentReportList); if (isService && isServiceReport == null) { if (sixMonthServiceList.size() > 0) rs6 = sendMailService(sixMonthServiceList, 'sixMonthService'); if (after3ServiceList.size() > 0) rs7 = sendMailService(after3ServiceList, 'after3Service'); if (after3FinalServiceList.size() > 0) rs14 = sendMailService(after3FinalServiceList, 'after3FinalService'); if (ApprovalServiceList.size() > 0) rs8 = sendMailService(ApprovalServiceList, 'ApprovalService'); if (before7ServiceList.size() > 0) rs9 = sendMailService(before7ServiceList, 'before7Service'); if (CancelServiceList.size() > 0) rs10 = sendMailService(CancelServiceList, 'CancelService'); } if (AssessmentReportList.size() > 0 && isServiceReport != null) rs11 = sendMailAssessmentReport(AssessmentReportList); if (Instruct_reportList.size() > 0 && isServiceReport != null) rs12 = sendMailInstructReport(Instruct_reportList); if (date.today().month() == 11 && date.today().day() == 30 && isServiceReport != null) { rs13 = sendMailAllFSE(); } //sendMailAllFSE(); // 服务技师培训 2019/1/7 张玉山 end if (!isService && isServiceReport == null) { if (after45_List.size() > 0) rs1 = sendMail(after45_List, 'after45'); if (cancel_List.size() > 0) rs2 = sendMail(cancel_List, 'cancel'); if (before15_List.size() > 0) rs3 = sendMail(before15_List, 'before15'); if (before7_List.size() > 0) rs4 = sendMail(before7_List, 'before7'); if (after3_List.size() > 0) rs5 = sendMail(after3_List, 'after3'); } if (rs1 == false) system.debug('=====after45 failer'); if (rs2 == false) system.debug('=====cancel failer'); if (rs3 == false) system.debug('=====before15 failer'); if (rs4 == false) system.debug('=====before7 failer'); if (rs5 == false) system.debug('=====after3 failer'); // 服务技师培训 2019/1/7 张玉山 start if (rs6 == false) system.debug('=====sixMonthService failer'); if (rs7 == false) system.debug('=====after3Service failer'); if (rs14 == false) system.debug('=====after3FinalService failer'); if (rs8 == false) system.debug('=====ApprovalService failer'); if (rs9 == false) system.debug('=====before7Service failer'); if (rs10 == false) system.debug('=====CancelService failer'); if (rs11 == false) system.debug('=====AssessmentReport failer'); if (rs12 == false) system.debug('=====Instruct_report failer'); if (rs13 == false) system.debug('=====sendMailAllFSE failer'); if (isService && isServiceReport == null) { for (Campaign c : campaignList) { if (rs6 && c.Mailflg_6Month_service__c > 0 && workdays1 != OSFBacth_Execute_Day && workdays == OSFBacth_Execute_Day ) { c.Mailflg_6Month_service__c--; } if (!rs7 && after3ServiceList.size() > 0) { c.Mailflgafter3serviceDate__c = true; } else if (after3ServiceList.size() > 0) { c.Mailflgafter3serviceDate__c = false; } if (!rs14 && after3FinalServiceList.size() > 0) { c.Mailflgafter3FinalserviceDate__c = true; } else if (after3FinalServiceList.size() > 0) { c.Mailflgafter3FinalserviceDate__c = false; } if (ApprovalServiceList.size() > 0 && rs8) { c.Mailflg_Approval_service__c = false; } if (before7ServiceList.size() > 0 && rs9) { c.Mailflg_before7_service__c = false; } if (CancelServiceList.size() > 0 && rs10) { c.Mailflg_Cancel_Service__c = false; } } } // 服务技师培训 2019/1/7 张玉山 end if (!isService && isServiceReport == null) { if (rs1 && rs2 && rs3 && rs4 && rs5) { for (Campaign c : campaignList) { if (after45_List.size() > 0) { c.Mailflg_after45__c = false; } if (cancel_List.size() > 0) { c.Mailflg_cancel__c = false; } if (before15_List.size() > 0) { c.Mailflg_before15__c = false; } if ( before7_List.size() > 0) { c.Mailflg_before7__c = false; } if (after3_List.size() > 0) { c.Mailflg_after3__c = false; } } } } if (rs11 && isServiceReport != null) { for (AssessmentReport__c AssessmentReport : AssessmentReportlist) { AssessmentReport.MailFlag_Approved__c = false; } } if (rs12 && isServiceReport != null) { for (Instruct_report__c Instruct_report : Instruct_reportList) { Instruct_report.MailFlag_Approved__c = false; } } // 服务技师培训 2019/1/7 张玉山 start system.debug('AssessmentReportList:' + AssessmentReportList); system.debug('Instruct_reportList:' + Instruct_reportList); system.debug('campaignList:' + campaignList); if (AssessmentReportList.size() > 0 && isServiceReport != null ) update AssessmentReportList; if (Instruct_reportList.size() > 0 && isServiceReport != null ) update Instruct_reportList; //// 服务技师培训 2019/1/7 张玉山 end if (campaignList.size() > 0) update campaignList; } global void finish(Database.BatchableContext BC) { saveResult(); } public void saveResult() { BatchIF_Log__c iflog = new BatchIF_Log__c(); iflog.Type__c = 'PushNotification'; string tempstr = ''; if (isServiceReport != null ) { tempstr = ' isServiceReport '; } else if (isService) { tempstr = ' isService '; } else { tempstr = ' old '; } iflog.Log__c = 'CampaignSendMailBatch start' + tempstr + '\n'; if (result) { iflog.Is_Error__c = 0; iflog.ErrorLog__c = ''; if (logstr.length() > 65000) { logstr = logstr.substring(0, 65000); logstr += ' ...have more lines...'; } iflog.Log__c += '邮件成功发送\n'; iflog.Log__c += logstr; } else { iflog.Is_Error__c = 1; if (Errorstr.length() > 65000) { Errorstr = Errorstr.substring(0, 65000); Errorstr += ' ...have more lines...'; } if (logstr.length() > 65000) { logstr = logstr.substring(0, 65000); logstr += ' ...have more lines...'; } iflog.Log__c += logstr; iflog.ErrorLog__c = Errorstr; } insert iflog; } // 服务技师培训 2019/1/7 张玉山 start // 每年提醒更新学员工作状态 TO所有FSE CC服务企划部窗口 所有职种为销售服务的副经理级及以上人员 public boolean sendMailAllFSE() { boolean rs = true; String[] post = new String[] { '部长', '经理', '副部长', '副经理'}; String[] position = new String[] {'销售服务'}; map userMailMap = new map(); map userManagerMailMap = new map(); List userMailList = [select id, Name, Email, Dept__c, Province__c , OCM_man_province__c, Post__c, Salesdepartment__c from User where IsActive = true and (Profileid = :system.label.ProfileId_2S5 or Profileid = :system.label.ProfileId_2S3 )]; for (User tempUser : userMailList) { userMailMap.put(tempUser.Email, tempUser); } List userManagerMailList = [select id, Name, Email, Dept__c, Province__c , OCM_man_province__c, Post__c, Salesdepartment__c from User where IsActive = true and Post__c = :post and SFDCPosition_C__c = :position and Profileid != : system.label.ProfileId_SystemAdmin and Alias != '经销商活动测试' order by Dept__c, Province__c]; list ServiceUserList = [select id, Name, Email, Dept__c, Province__c , OCM_man_province__c, Post__c, Salesdepartment__c from User where IsActive = true and id = : System.Label.ServiceDesignDep_NC]; for (User tempUser : userManagerMailList) { if (!userMailMap.containskey(tempUser.Email)) { userManagerMailMap.put(tempUser.Email, tempUser); } } for (User tempUser : ServiceUserList) { if (!userMailMap.containskey(tempUser.Email)) { userManagerMailMap.put(tempUser.Email, tempUser); } } List sendMails = new List(); String title = ''; String body = ''; List> toMailsList = new List>(); List> ccMailsList = new List>(); List toMails = new List(); List ccMails = new List(); Integer cnt = 0; Integer ccCnt = 0; for (User userMail : userMailMap.values()) { cnt += 1; if (cnt <= 100) { toMails.add(userMail.Email); } else { toMailsList.add(toMails); toMails = new List(); toMails.add(userMail.Email); cnt = 1; } } toMailsList.add(toMails); for (User userMail : userManagerMailmap.values()) { ccCnt += 1; if (ccCnt <= 25) { ccMails.add(userMail.Email); } else { ccMailsList.add(ccMails); ccMails = new List(); ccMails.add(userMail.Email); ccCnt = 1; } } ccMailsList.add(ccMails); title = '【信息收集】内镜临床工程师受训人员在岗与跟进情况收集'; body += '各位领导、同事:'; body += '
'; body += '
'; body += '您们好!感谢平日对内镜临床工程师培养项目的理解与支持!'; body += '
'; body += '
'; body += '为明确既已培养完成内镜临床工程师的工作开展状态,从而更好的支持现场工作,还请协助更新并反馈以下链接中内镜临床工程师的工作状态,填写表格中“在岗状态”“跟进状态”“是否负责内镜工作”,并保存即可。'; body += '
'; body += '
'; body += '' + URL.getSalesforceBaseUrl().toExternalForm() + '/apex/BmeWorkPage' + '
'; body += '
'; body += '
'; body += '若有不明之处,还请随时联系服务企划部窗口。'; body += '
'; body += '
'; body += '谢谢!'; for (integer i = 0; i < toMailsList.size(); i++ ) { List toMailList = toMailsList[i]; List ccMailList = new List(); if (ccMailsList.size() > i ) { ccMailList = ccMailsList[i]; } Messaging.SingleEmailMessage messageNEW = new Messaging.SingleEmailMessage(); messageNEW.subject = title; //messageNEW.plainTextBody = body; messageNEW.htmlBody = body; messageNEW.setCharset('UTF-8'); messageNEW.toAddresses = toMailList; messageNEW.ccAddresses = ccMailList; sendMails.add(messageNEW); } if (sendMails.size() > 0) { Messaging.SendEmailResult[] results = messaging.sendEmail(sendMails); for (Integer i = 0; i < results.size(); i++) { if (results[i].success == false) { system.debug('=====send mail error:' + results[i].errors[0].message); result = false; Errorstr += 'sendMailAllFSE:' + results[i].errors[0].message + '\n'; rs = false; } } logstr +='sendMailAllFSE 发送结束'; } return rs; } //带教报告 public boolean sendMailInstructReport(List Instruct_reportList) { boolean rs = true; Map deptMap = new Map(); deptMap.put('1.华北', '医疗华北营业本部'); deptMap.put('2.东北', '医疗东北营业本部'); deptMap.put('3.西北', '医疗西北营业本部'); deptMap.put('4.西南', '医疗西南营业本部'); deptMap.put('5.华东', '医疗华东营业本部'); deptMap.put('6.华南', '医疗华南营业本部'); String[] post = new String[] { '部长', '经理', '副部长', '副经理'}; String[] position = new String[] {'销售服务'}; List userMailList = [select id, Name, Email, Dept__c, Province__c , OCM_man_province__c, Post__c, Salesdepartment__c from User where IsActive = true and Post__c = :post and SFDCPosition_C__c = :position and Profileid != : system.label.ProfileId_SystemAdmin and Alias != '经销商活动测试' order by Dept__c, Province__c]; List sendMails = new List(); for (Instruct_report__c Instruct_report : Instruct_reportList) { // 存 2.用户所在省、.职种为销售服务的副经理和经理;3.用户所在本部、职种为销售服务的副部长和部长。 List targetList2 = new List(); for ( user tempUser : userMailList) { if ((tempUser.OCM_man_province__c != null && Instruct_report.campaign__r.Province__c != null && tempUser.OCM_man_province__c.equals(Instruct_report.campaign__r.Province__c) && ( tempUser.Post__c.equals('经理') || tempUser.Post__c.equals('副经理'))) || (tempUser.Salesdepartment__c != null && Instruct_report.campaign__r.Salesdepartment__c != null && tempUser.Salesdepartment__c.equals(Instruct_report.campaign__r.Salesdepartment__c) && ( tempUser.Post__c.equals('部长') || tempUser.Post__c.equals('副部长'))) ) { targetList2.add(tempUser); } } if (Instruct_report.campaign__r.ServiceDesignDep__r != null) { targetList2.add(Instruct_report.campaign__r.ServiceDesignDep__r); } String title = ''; String body = ''; List> toMailsList = new List>(); List toMails = new List(); List ccMailList = new List(); Integer cnt = 0; Integer ccCnt = 0; for (User userMail : targetList2) { cnt += 1; if (cnt <= 100) { toMails.add(userMail.Email); } else { toMailsList.add(toMails); toMails = new List(); toMails.add(userMail.Email); cnt = 1; } } toMailsList.add(toMails); title = Instruct_report.campaign__r.Name + '带教报告'; body += '领导您好:'; body += '
'; body += '
'; body += Instruct_report.campaign__r.Name + '担当' + Instruct_report.campaign__r.Owner.Name + '提交了带教报告,报告具体内容请参照以下链接:
'; body += '' + URL.getSalesforceBaseUrl().toExternalForm() + '/' + Instruct_report.campaign__c + '
'; body += '
'; body += '
'; body += '谢谢!'; for (List toMailList : toMailsList) { Messaging.SingleEmailMessage messageNEW = new Messaging.SingleEmailMessage(); messageNEW.subject = title; //messageNEW.plainTextBody = body; messageNEW.htmlBody = body; messageNEW.setCharset('UTF-8'); messageNEW.toAddresses = toMailList; messageNEW.ccAddresses = ccMailList; sendMails.add(messageNEW); } if (sendMails.size() > 40) { Messaging.SendEmailResult[] results = messaging.sendEmail(sendMails); for (Integer i = 0; i < results.size(); i++) { if (results[i].success == false) { system.debug('=====send mail error:' + results[i].errors[0].message); result = false; Errorstr += 'sendMailInstructReport:' + results[i].errors[0].message + '\n'; rs = false; } } sendMails = new List(); } } system.debug('sendMailInstructReport:' + sendMails); if (sendMails.size() > 0) { Messaging.SendEmailResult[] results = messaging.sendEmail(sendMails); for (Integer i = 0; i < results.size(); i++) { if (results[i].success == false) { system.debug('=====send mail error:' + results[i].errors[0].message); result = false; Errorstr += 'sendMailInstructReport:' + results[i].errors[0].message + '\n'; rs = false; } } } return rs; } // 授课、考核报告 public boolean sendMailAssessmentReport(List AssessmentReportlist) { boolean rs = true; Map deptMap = new Map(); deptMap.put('1.华北', '医疗华北营业本部'); deptMap.put('2.东北', '医疗东北营业本部'); deptMap.put('3.西北', '医疗西北营业本部'); deptMap.put('4.西南', '医疗西南营业本部'); deptMap.put('5.华东', '医疗华东营业本部'); deptMap.put('6.华南', '医疗华南营业本部'); String[] post = new String[] { '部长', '经理', '副部长', '副经理'}; String[] position = new String[] {'销售服务'}; List userMailList = [select id, Name, Email, Dept__c, Province__c , OCM_man_province__c, Post__c, Salesdepartment__c from User where IsActive = true and Post__c = :post and SFDCPosition_C__c = :position and Profileid != : system.label.ProfileId_SystemAdmin and Alias != '经销商活动测试' order by Dept__c, Province__c]; List sendMails = new List(); for (AssessmentReport__c AssessmentReport : AssessmentReportlist) { // 存 2.用户所在省、.职种为销售服务的副经理和经理;3.用户所在本部、职种为销售服务的副部长和部长。 List targetList2 = new List(); for ( user tempUser : userMailList) { if ((tempUser.OCM_man_province__c != null && AssessmentReport.campaign__r.Province__c != null && tempUser.OCM_man_province__c.equals(AssessmentReport.campaign__r.Province__c) && ( tempUser.Post__c.equals('经理') || tempUser.Post__c.equals('副经理'))) || (tempUser.Salesdepartment__c != null && AssessmentReport.campaign__r.Salesdepartment__c != null && tempUser.Salesdepartment__c.equals(AssessmentReport.campaign__r.Salesdepartment__c) && ( tempUser.Post__c.equals('部长') || tempUser.Post__c.equals('副部长'))) ) { targetList2.add(tempUser); } } if (AssessmentReport.campaign__r.ServiceDesignDep__r != null) { targetList2.add(AssessmentReport.campaign__r.ServiceDesignDep__r); } String title = ''; String body = ''; List> toMailsList = new List>(); List toMails = new List(); List ccMailList = new List(); Integer cnt = 0; Integer ccCnt = 0; if (AssessmentReport.Type__c != null && AssessmentReport.Type__c != null && AssessmentReport.Type__c.equals('授课')) { for (User userMail : targetList2) { cnt += 1; if (cnt <= 100) { toMails.add(userMail.Email); } else { toMailsList.add(toMails); toMails = new List(); toMails.add(userMail.Email); cnt = 1; } } toMailsList.add(toMails); title = AssessmentReport.campaign__r.Name + '活动报告'; body += '领导您好:'; body += '
'; body += '
'; body += AssessmentReport.campaign__r.Name + '担当' + AssessmentReport.campaign__r.Owner.Name + '提交了活动报告,报告具体内容请参照以下链接:
'; body += '' + URL.getSalesforceBaseUrl().toExternalForm() + '/' + AssessmentReport.campaign__c + '
'; body += '
'; body += '
'; body += '谢谢!'; } else { if (AssessmentReport.Campaign__r.Owner != null) { toMails.add(AssessmentReport.Campaign__r.Owner.Email); } toMailsList.add(toMails); for (User tempUser : targetList2) { ccMailList.add(tempUser.email); } title = AssessmentReport.Name + '的报告已审批通过,请计划并安排带教跟进工作。'; body += AssessmentReport.campaign__r.owner.Name + '您好:'; body += '
'; body += '
'; body += '恭喜您完成了' + AssessmentReport.Name + '的全部授课及考核工作,辛苦了!
'; body += '接下来,为了帮助学员们更好的学以致用,服务临床,还请面向学员们开展带教活动。
'; body += '建议带教频率为至少每月带教一次,为期半年。
'; body += '建议带教内容包括故障排查(包括内镜系统和周边设备)、辅助学员面向院内人员开展培训、数据分析、以及其它您或学员本人认为需要加强的内容。
'; body += '带教后,还请及时在系统中提交带教报告。
'; body += '若有不明之处,还请随时联系服务企划部窗口。
'; body += '
'; body += '
'; body += '谢谢!'; } for (List toMailList : toMailsList) { Messaging.SingleEmailMessage messageNEW = new Messaging.SingleEmailMessage(); messageNEW.subject = title; //messageNEW.plainTextBody = body; messageNEW.htmlBody = body; messageNEW.setCharset('UTF-8'); messageNEW.toAddresses = toMailList; messageNEW.ccAddresses = ccMailList; sendMails.add(messageNEW); } if (sendMails.size() > 40) { Messaging.SendEmailResult[] results = messaging.sendEmail(sendMails); for (Integer i = 0; i < results.size(); i++) { if (results[i].success == false) { system.debug('=====send mail error:' + results[i].errors[0].message); result = false; Errorstr += 'sendMailAssessmentReport:' + results[i].errors[0].message + '\n'; rs = false; } } sendMails = new List(); } } system.debug('sendMailAssessmentReport:' + sendMails); if (sendMails.size() > 0) { Messaging.SendEmailResult[] results = messaging.sendEmail(sendMails); for (Integer i = 0; i < results.size(); i++) { if (results[i].success == false) { system.debug('=====send mail error:' + results[i].errors[0].message); result = false; Errorstr += 'sendMailAssessmentReport:' + results[i].errors[0].message + '\n'; rs = false; } } } return rs; } //sixMonthService: //after3Service: //ApprovalService: //before7Service: //CancelService: public static string getlessonName(Campaign temcampaign) { string temStr = ''; if (temcampaign.Lesson1Date__c <= Date.today().addDays(-3)) { temStr = '第1次授课'; } if (temcampaign.Lesson2Date__c <= Date.today().addDays(-3)) { temStr = '第2次授课'; } if (temcampaign.Lesson3Date__c <= Date.today().addDays(-3)) { temStr = '第3次授课'; } if (temcampaign.Lesson4Date__c <= Date.today().addDays(-3)) { temStr = '第4次授课'; } if (temcampaign.Lesson5Date__c <= Date.today().addDays(-3)) { temStr = '第5次授课'; } if (temcampaign.Lesson6Date__c <= Date.today().addDays(-3)) { temStr = '第6次授课'; } if (temcampaign.Lesson7Date__c <= Date.today().addDays(-3)) { temStr = '第7次授课'; } if (temcampaign.Lesson8Date__c <= Date.today().addDays(-3)) { temStr = '第8次授课'; } return temstr; } public static string getlessonDate(Campaign temcampaign) { Date temDate; string temStr = ''; if (temcampaign.FinalExamDate__c <= Date.today().addDays(-3)) { temDate = temcampaign.FinalExamDate__c; } if (temcampaign.Lesson1Date__c <= Date.today().addDays(-3)) { temDate = temcampaign.Lesson1Date__c; } if (temcampaign.Lesson2Date__c <= Date.today().addDays(-3)) { temDate = temcampaign.Lesson2Date__c; } if (temcampaign.Lesson3Date__c <= Date.today().addDays(-3)) { temDate = temcampaign.Lesson3Date__c; } if (temcampaign.Lesson4Date__c <= Date.today().addDays(-3)) { temDate = temcampaign.Lesson4Date__c; } if (temcampaign.Lesson5Date__c <= Date.today().addDays(-3)) { temDate = temcampaign.Lesson5Date__c; } if (temcampaign.Lesson6Date__c <= Date.today().addDays(-3)) { temDate = temcampaign.Lesson6Date__c; } if (temcampaign.Lesson7Date__c <= Date.today().addDays(-3)) { temDate = temcampaign.Lesson7Date__c; } if (temcampaign.Lesson8Date__c <= Date.today().addDays(-3)) { temDate = temcampaign.Lesson8Date__c; } if (temDate != null) { temStr = temDate.format(); } return temStr; } public boolean sendMailService(List campaigns, String mailType) { boolean rs = true; Map deptMap = new Map(); deptMap.put('1.华北', '医疗华北营业本部'); deptMap.put('2.东北', '医疗东北营业本部'); deptMap.put('3.西北', '医疗西北营业本部'); deptMap.put('4.西南', '医疗西南营业本部'); deptMap.put('5.华东', '医疗华东营业本部'); deptMap.put('6.华南', '医疗华南营业本部'); String[] post = new String[] { '部长', '经理', '副部长', '副经理'}; String[] position = new String[] {'销售服务'}; List userMailList = [select id, Name, Email, Dept__c, Province__c, OCM_man_province__c, Post__c, Salesdepartment__c from User where IsActive = true and Post__c = :post and SFDCPosition_C__c = :position and Profileid != : system.label.ProfileId_SystemAdmin and Alias != '经销商活动测试' order by Dept__c, Province__c]; List sendMails = new List(); for (Campaign campaign : campaigns) { // 存主担当 List targetList = new List(); targetList.add(campaign.Owner); // 存服务企划部窗口 List targetList2 = new List(); if (campaign.ServiceDesignDep__r != null) { targetList2.add(campaign.ServiceDesignDep__r); } // 存 2.用户所在省、.职种为销售服务的副经理和经理;3.用户所在本部、职种为销售服务的副部长和部长。 List targetList3 = new List(); for ( user tempUser : userMailList) { if ((tempUser.Province__c != null && campaign.Province__c != null && tempUser.Province__c.equals(campaign.Province__c) && ( tempUser.Post__c.equals('经理') || tempUser.Post__c.equals('副经理'))) || (tempUser.Salesdepartment__c != null && campaign.Salesdepartment__c != null && tempUser.Salesdepartment__c.equals(campaign.Salesdepartment__c) && ( tempUser.Post__c.equals('部长') || tempUser.Post__c.equals('副部长'))) ) { targetList3.add(tempUser); } } system.debug('=====targetList:' + targetList.size()); system.debug('=====targetList3:' + targetList3.size()); String title = ''; String body = ''; List> toMailsList = new List>(); List toMails = new List(); List ccMailList = new List(); Integer cnt = 0; Integer ccCnt = 0; // TO 主担当 CC服务企划部窗口 if (mailType.equals('sixMonthService') || mailType.equals('after3Service') ) { for (User userMail : targetList) { toMails.add(userMail.Email); } toMailsList.add(toMails); for (User userMail : targetList2) { ccMailList.add(userMail.Email); } } // TO 主担当 CC服务企划部窗口—所在省销售服务(副)经理&所在本部销售服务(副)部长 else if (mailType.equals('before7Service')) { for (User userMail : targetList) { toMails.add(userMail.Email); } toMailsList.add(toMails); for (User userMail : targetList2) { ccMailList.add(userMail.Email); } for (User userMail : targetList3) { ccMailList.add(userMail.Email); } // to服务企划部窗口&所在省销售服务(副)经理&所在本部销售服务(副)部长 } else if (mailType.equals('ApprovalService') || mailType.equals('CancelService')) { for (User userMail : targetList2) { cnt += 1; toMails.add(userMail.Email); } for (User userMail : targetList3) { cnt += 1; if (cnt <= 100) { toMails.add(userMail.Email); } else { toMailsList.add(toMails); toMails = new List(); toMails.add(userMail.Email); cnt = 1; } } toMailsList.add(toMails); } // HWAG-BBH675 二 start if (mailType.equals('ApprovalService')) { ccMailList.add(System.Label.Campaign_Mail_CC_Label1); } // HWAG-BBH675 二 end Date sDate = campaign.StartDate__c; Date eDate = campaign.EndDate__c; String year = ''; if (sDate != null ) { year = String.valueOf(sDate.year()); } String month = ''; if (sDate != null ) { month = String.valueOf(sDate.month()); } month = month.leftPad(2, '0'); String day = ''; if (sDate != null ) { day = String.valueOf(sDate.day()); } day = day.leftPad(2, '0'); String strSDate = ''; if (sDate != null ) { strSDate = sDate.format(); } String strEDate = ''; if (eDate != null ) { strEDate = eDate.format(); } if (mailType.equals('sixMonthService')) { title = '【提醒】' + campaign.Name + '带教跟进工作的开展'; body += campaign.owner.Name + '您好:'; body += '
'; body += '
'; body += '为了帮助学员们更好的学以致用,服务临床,还请面向学员们开展带教活动。
'; body += '建议带教频率为每月至少带教一次,建议带教内容包括故障排查(包括内镜系统和周边设备)、辅助学员面向院内人员开展培训、数据分析、以及其它您或学员本人认为需要加强的内容。
'; body += '请您合理安排工作,安排本月的带教内容。带教后,还请及时在系统中提交带教报告。
'; body += '若有不明之处,还请随时联系服务企划部窗口。
'; body += '
'; body += '
'; body += '谢谢!'; } else if (mailType.equals('after3Service')) { //生成第X次授课或者最终考核 string SKorKH = getlessonName(campaign) ; string Datestr = getlessonDate(campaign); title = campaign.Name + SKorKH + '已经结束请尽快提交报告书'; body += campaign.owner.Name + '您好!'; body += '
'; body += '
'; body += campaign.Name + SKorKH + '已经结束,请尽快提交相应报告。
'; body += '
'; body += '培训名称:' + campaign.Name + '
'; body += SKorKH + '日期:' + Datestr + '
'; body += '
'; body += '培训链接:' + URL.getSalesforceBaseUrl().toExternalForm() + '/' + campaign.Id + '
'; } else if (mailType.equals('after3FinalService')) { string SKorKH = '最终考核' ; string Datestr = ''; if (campaign.FinalExamDate__c != null) { Datestr = campaign.FinalExamDate__c.format(); } title = campaign.Name + SKorKH + '已经结束请尽快提交报告书'; body += campaign.owner.Name + '您好!'; body += '
'; body += '
'; body += campaign.Name + SKorKH + '已经结束,请尽快提交相应报告。
'; body += '
'; body += '培训名称:' + campaign.Name + '
'; body += SKorKH + '日期:' + Datestr + '
'; body += '
'; body += '培训链接:' + URL.getSalesforceBaseUrl().toExternalForm() + '/' + campaign.Id + '
'; } else if (mailType.equals('ApprovalService')) { title = campaign.Name + '的申请已审批成功。'; body += '领导您好!
'; body += '
'; body += campaign.Name + '已审批通过,该培训班将于' + strSDate + '开班。
'; body += '具体情况请参照以下链接:
' + URL.getSalesforceBaseUrl().toExternalForm() + '/' + campaign.Id + '
'; body += '
请做好相应准备,如有问题请联系服务企划部窗口人员。

谢谢!'; } else if (mailType.equals('before7Service')) { title = campaign.Name + '还有7天召开'; body += campaign.owner.Name + '您好:
'; body += '
'; body += '距离在' + strSDate + '的' + campaign.Name + '还有7天的时间。' + '
'; body += ' ' + URL.getSalesforceBaseUrl().toExternalForm() + '/' + campaign.Id + '
'; body += '请您合理安排工作,做好相应准备。
'; body += '若有不明之处,还请随时联系服务企划部窗口。
'; body += '
谢谢! '; } else if (mailType.equals('CancelService')) { title = campaign.Name + '已取消'; body += '领导您好!
'; body += '
'; body += campaign.Name + '由于以下原因已取消,请您知悉。

'; body += ' 活动计划: ' + URL.getSalesforceBaseUrl().toExternalForm() + '/' + campaign.Id + '
'; body += '取消原因: ' + campaign.CancleReason__c + '
'; body += '
谢谢! '; } for (List toMailList : toMailsList) { Messaging.SingleEmailMessage messageNEW = new Messaging.SingleEmailMessage(); messageNEW.subject = title; //messageNEW.plainTextBody = body; messageNEW.htmlBody = body; messageNEW.setCharset('UTF-8'); messageNEW.toAddresses = toMailList; messageNEW.ccAddresses = ccMailList; sendMails.add(messageNEW); } if (sendMails.size() > 40) { Messaging.SendEmailResult[] results = messaging.sendEmail(sendMails); for (Integer i = 0; i < results.size(); i++) { if (results[i].success == false) { system.debug('=====send mail error:' + results[i].errors[0].message); result = false; Errorstr += 'sendMailService:' + results[i].errors[0].message + '\n'; rs = false; } } sendMails = new List(); } } system.debug('sendMail ' + mailType + ' :' + sendMails); if (sendMails.size() > 0) { Messaging.SendEmailResult[] results = messaging.sendEmail(sendMails); for (Integer i = 0; i < results.size(); i++) { if (results[i].success == false) { system.debug('=====send mail error:' + results[i].errors[0].message); result = false; Errorstr += 'sendMailService:' + results[i].errors[0].message + '\n'; rs = false; } } } return rs; } // 服务技师培训 2019/1/7 张玉山 end public static boolean sendMail(List campaigns, String mailType) { boolean rs = true; Map deptMap = new Map(); deptMap.put('1.华北', '医疗华北营业本部'); deptMap.put('2.东北', '医疗东北营业本部'); deptMap.put('3.西北', '医疗西北营业本部'); deptMap.put('4.西南', '医疗西南营业本部'); deptMap.put('5.华东', '医疗华东营业本部'); deptMap.put('6.华南', '医疗华南营业本部'); String[] post = new String[] {'总监', '部长', '经理', '副部长', '副经理'}; String[] dept = new String[] {'医疗华北营业本部', '医疗东北营业本部', '医疗西北营业本部', '医疗西南营业本部', '医疗华东营业本部', '医疗华南营业本部'}; String[] position = new String[] {'销售推广', '销售市场', '销售服务'}; List userMailList = [select id, Name, Email, Dept__c, Province__c from User where IsActive = true and Post__c = :post and Dept__c = :dept and SFDCPosition_C__c = :position order by Dept__c, Province__c]; List userMail2List = [select id, Name, Email, Dept__c, Province__c from User where IsActive = true and Dept__c = :dept and SFDCPosition_C__c = '行政助理' order by Dept__c, Province__c]; List sendMails = new List(); for (Campaign campaign : campaigns) { String societyType = campaign.Society_Type__c; String openScope = campaign.Open_scope__c; String openScope2 = deptMap.get(openScope); List targetList = new List(); targetList.add(campaign.Owner); if (campaign.JingliApprovalManager__c != null) targetList.add(campaign.JingliApprovalManager__r); if (campaign.BuchangApprovalManager__c != null) targetList.add(campaign.BuchangApprovalManager__r); for (User userMail : userMailList) { if (societyType == '全国') { targetList.add(userMail); } else if (societyType == '本部') { if (userMail.Dept__c == openScope || userMail.Dept__c == openScope2) { targetList.add(userMail); } } else if (societyType == '区域') { if (userMail.Province__c == openScope) { targetList.add(userMail); } } } List target2List = new List(); target2List.add(campaign.Owner); if (campaign.JingliApprovalManager__c != null) target2List.add(campaign.JingliApprovalManager__r); String userDept = campaign.Owner.Dept__c; if (mailType == 'after45' && ( userDept == '医疗华北营业本部' || userDept == '医疗东北营业本部' || userDept == '医疗西北营业本部' || userDept == '医疗西南营业本部' || userDept == '医疗华东营业本部' || userDept == '医疗华南营业本部')) { for (User userMail2 : userMail2List) { if (userDept == userMail2.Dept__c) { target2List.add(userMail2); } } } List target3List = new List(); target3List.add(campaign.Owner); if (campaign.JingliApprovalManager__c != null) target3List.add(campaign.JingliApprovalManager__r); if (campaign.BuchangApprovalManager__c != null) target3List.add(campaign.BuchangApprovalManager__r); system.debug('=====targetList:' + targetList.size()); system.debug('=====target2List:' + target2List.size()); system.debug('=====target3List:' + target3List.size()); String title = ''; String body = ''; List> toMailsList = new List>(); List toMails = new List(); Integer cnt = 0; if (mailType == 'after45') { for (User userMail : target2List) { cnt += 1; if (cnt <= 100) { toMails.add(userMail.Email); } else { toMailsList.add(toMails); toMails = new List(); toMails.add(userMail.Email); cnt = 1; } } toMailsList.add(toMails); } else if (mailType == 'after3') { for (User userMail : target3List) { toMails.add(userMail.Email); } toMailsList.add(toMails); } else { for (User userMail : targetList) { cnt += 1; if (cnt <= 100) { toMails.add(userMail.Email); } else { toMailsList.add(toMails); toMails = new List(); toMails.add(userMail.Email); cnt = 1; } } toMailsList.add(toMails); } Date sDate = campaign.StartDate; Date eDate = campaign.EndDate; String year = String.valueOf(sDate.year()); String month = String.valueOf(sDate.month()); month = month.leftPad(2, '0'); String day = String.valueOf(sDate.day()); day = day.leftPad(2, '0'); String strSDate = sDate.format(); String strEDate = eDate.format(); if (mailType == 'after45') { title = '您登录的' + year + '年' + month + '月' + day + '日召开的' + campaign.Name2__c + '会议计划请您确认并提交审批'; body += '请您确认以下会议是否如期召开,如果召开请提交待审批,请您的领导确认并公开信息给会议区域的同事。
'; body += '
'; body += '如果会议召开日期变更请您修改,如果会议取消,请点击“取消”按钮。
'; body += '
'; body += '学会培训名称:' + campaign.Name2__c + '
'; body += '地点:' + campaign.WorkshopPlace__c + '
'; body += '学会.培训分类:' + campaign.Workshop_category__c + '
'; body += '开始日期:' + strSDate + '
'; body += '结束日期:' + strEDate + '
'; body += '
'; body += '会议链接:' + URL.getSalesforceBaseUrl().toExternalForm() + '/' + campaign.Id + '
'; } else if (mailType == 'cancel') { title = year + '年' + month + '月' + day + '日召开的' + campaign.Name2__c + '会议取消召开'; body += '如题的会议,因' + campaign.CancleReason__c + '的原因,取消召开了,请重新进行工作安排。
'; body += '
'; body += '学会培训名称:' + campaign.Name2__c + '
'; body += '地点:' + campaign.WorkshopPlace__c + '
'; body += '学会.培训分类:' + campaign.Workshop_category__c + '
'; body += '
'; body += '会议链接:' + URL.getSalesforceBaseUrl().toExternalForm() + '/' + campaign.Id + '
'; } else if (mailType == 'before15') { title = year + '年' + month + '月' + day + '日召开的' + campaign.Name2__c + '会议还有15天召开'; body += '您好!
'; body += '
'; body += year + '年' + month + '月' + day + '日召开的' + campaign.Name2__c + '会议还有15天召开,请您提前安排好工作按时参加,莅临展台请着深色正装。
'; body += '
'; body += '开展地点:' + campaign.WorkshopPlace__c + '
'; body += '
'; body += '谢谢!
'; body += '
'; body += '具体的会议信息请参考以下的链接:
'; body += '会议链接:' + URL.getSalesforceBaseUrl().toExternalForm() + '/' + campaign.Id + '
'; } else if (mailType == 'before7') { title = year + '年' + month + '月' + day + '日召开的' + campaign.Name2__c + '会议还有7天召开'; body += '您好!
'; body += '
'; body += year + '年' + month + '月' + day + '日召开的' + campaign.Name2__c + '会议还有7天召开,请您提前安排好工作按时参加,莅临展台请着深色正装。
'; body += '
'; body += '开展地点:' + campaign.WorkshopPlace__c + '
'; body += '
'; body += '谢谢!
'; body += '
'; body += '具体的会议信息请参考以下的链接:
'; body += '会议链接:' + URL.getSalesforceBaseUrl().toExternalForm() + '/' + campaign.Id + '
'; } else if (mailType == 'after3') { title = campaign.Name2__c + '已经结束请尽快提交报告书'; body += '您好!
'; body += '
'; body += campaign.Name2__c + '会议已经结束,请尽快提交会议报告。
'; body += '
'; body += '学会培训名称:' + campaign.Name2__c + '
'; body += '地点:' + campaign.WorkshopPlace__c + '
'; body += '学会.培训分类:' + campaign.Workshop_category__c + '
'; body += '开始日期:' + strSDate + '
'; body += '结束日期:' + strEDate + '
'; body += '
'; body += '会议链接:' + URL.getSalesforceBaseUrl().toExternalForm() + '/' + campaign.Id + '
'; } List ccMailList = new List(); //ccMailList.add('it_prectech@olympus.com.cn'); //ccMailList.add('ling_zhu@olympus.com.cn'); // 会议召开前15天提醒邮件增加如下规则发送 if (mailType == 'before15') { if (campaign.Workshop_category__c == 'TTC' || campaign.Workshop_category__c == 'NTC' || campaign.Workshop_category__c == '服务医工学会' || campaign.Workshop_category__c == '服务护理学会') { // TTC、NTC、服务医工学会、服务护理学会→王茗芳 ccMailList.add(System.Label.Campaign_Mail_CC_Label1); } else if (campaign.Workshop_category__c == '经销商服务培训') { // 经销商服务培训→袁俊生 ccMailList.add(System.Label.Campaign_Mail_CC_Label2); } } for (List toMailList : toMailsList) { Messaging.SingleEmailMessage messageNEW = new Messaging.SingleEmailMessage(); messageNEW.subject = title; //messageNEW.plainTextBody = body; messageNEW.htmlBody = body; messageNEW.setCharset('UTF-8'); messageNEW.toAddresses = toMailList; messageNEW.ccAddresses = ccMailList; sendMails.add(messageNEW); } if (sendMails.size() > 40) { Messaging.SendEmailResult[] results = messaging.sendEmail(sendMails); for (Integer i = 0; i < results.size(); i++) { if (results[i].success == false) { system.debug('=====send mail error:' + results[i].errors[0].message); rs = false; } } sendMails = new List(); } } if (sendMails.size() > 0) { Messaging.SendEmailResult[] results = messaging.sendEmail(sendMails); for (Integer i = 0; i < results.size(); i++) { if (results[i].success == false) { system.debug('=====send mail error:' + results[i].errors[0].message); rs = false; } } } return rs; } }