global class OpportunityUpdateSendEmailBatch implements Database.Batchable,Database.Stateful { private List idList = null; global OpportunityUpdateSendEmailBatch() { } global OpportunityUpdateSendEmailBatch(List temp) { idList = temp; } global Database.QueryLocator start(Database.BatchableContext bc) { //每日执行,询价今日有更新、三个月未更新、六个月未更新三种情况发邮件提醒,九个月未更新询价取消并发邮件提醒。 Date yesterDay = Date.today().addDays(-1); if(idList != null && idList.size()!=0){ return Database.getQueryLocator([select Id,Name,IsSendEmail__c,IsUpdate__c,OppUpdateDate__c,ThreeMonths__c,SixMonths__c,NineMonths__c,Province__c,ProductSegment__c,OneYear__c, OppUpdateAddress__c,Cancel_Fail_Approve__c,InquiryNumber__c,Cancel_reason_D__c,Cancel_Reason_Text_D__c,CancelReason__c,CancelReasonText__c from Opportunity where (((ProductSegment__c = 'NDT' or ProductSegment__c = 'ANI') and RecordTypeId = '012280000005hjO') or ProductSegment__c = 'RVI' or ProductSegment__c = 'IE' or ProductSegment__c = 'BS') and CreatedBy.IsActive = true and IsSendEmail__c=true and StageName != 'Closed Won' and StageName != 'Closed Lost' and StageName != 'Closed Cancel' and ((IsUpdate__c = true and OppUpdateDate__c > :yesterDay.addMonths(-3)) or (OppUpdateDate__c <= :yesterDay.addMonths(-3) and OppUpdateDate__c > :yesterDay.addMonths(-6) and ThreeMonths__c = false) or (OppUpdateDate__c <= :yesterDay.addMonths(-6) and OppUpdateDate__c > :yesterDay.addMonths(-9) and SixMonths__c = false) or (OppUpdateDate__c <= :yesterDay.addMonths(-9) and OppUpdateDate__c > :yesterDay.addMonths(-12) and NineMonths__c = false) or (OppUpdateDate__c <= :yesterDay.addMonths(-12) and OneYear__c = false)) and Id in :idList]); }else{ return Database.getQueryLocator([select Id,Name,IsSendEmail__c,IsUpdate__c,OppUpdateDate__c,ThreeMonths__c,SixMonths__c,NineMonths__c,Province__c,ProductSegment__c,OneYear__c, OppUpdateAddress__c,Cancel_Fail_Approve__c,InquiryNumber__c,Cancel_reason_D__c,Cancel_Reason_Text_D__c,CancelReason__c,CancelReasonText__c from Opportunity where (((ProductSegment__c = 'NDT' or ProductSegment__c = 'ANI') and RecordTypeId = '012280000005hjO') or ProductSegment__c = 'RVI' or ProductSegment__c = 'IE' or ProductSegment__c = 'BS') and CreatedBy.IsActive = true and IsSendEmail__c=true and StageName != 'Closed Won' and StageName != 'Closed Lost' and StageName != 'Closed Cancel' and ((IsUpdate__c = true and OppUpdateDate__c > :yesterDay.addMonths(-3)) or (OppUpdateDate__c <= :yesterDay.addMonths(-3) and OppUpdateDate__c > :yesterDay.addMonths(-6) and ThreeMonths__c = false) or (OppUpdateDate__c <= :yesterDay.addMonths(-6) and OppUpdateDate__c > :yesterDay.addMonths(-9) and SixMonths__c = false) or (OppUpdateDate__c <= :yesterDay.addMonths(-9) and OppUpdateDate__c > :yesterDay.addMonths(-12) and NineMonths__c = false) or (OppUpdateDate__c <= :yesterDay.addMonths(-12) and OneYear__c = false))]); } } global void execute(Database.BatchableContext BC, list scope) { Date yesterDay = Date.today().addDays(-1); List oppList = new List(); for(Sobject obj : scope){ Opportunity opp = (Opportunity)obj; if(opp.IsUpdate__c == true && opp.OppUpdateDate__c == yesterDay){ if(opp.ProductSegment__c == 'NDT' || opp.ProductSegment__c == 'ANI'){ //分野不同需要发送到不同的人 NDT郭爽:00528000000YVMP ANI李文珺:00528000000YSSm String members = System.label.OppUpdateAddressMember; if (String.isNotBlank(members)) { if(opp.ProductSegment__c == 'NDT'){ opp.OppUpdateAddress2__c = members.split('_')[0]; }else if(opp.ProductSegment__c == 'ANI'){ opp.OppUpdateAddress2__c = members.split('_')[1]; } } String memberId = getMember(opp.ProductSegment__c,opp.Province__c); opp.OppUpdateAddress__c = memberId; if(memberId == '00528000000YVJk'){ opp.OppUpdateAddress__c = '00528000006hJeB'; } opp.IsUpdate__c = false; opp.IsUpdate_temp__c = true; oppList.add(opp); continue; } if(opp.ProductSegment__c == 'RVI'){ opp.IsUpdate__c = false; opp.IsUpdate_temp__c = true; oppList.add(opp); continue; } } if(opp.OppUpdateDate__c <= yesterDay.addMonths(-3) && opp.OppUpdateDate__c > yesterDay.addMonths(-6) && opp.ThreeMonths__c == false){ opp.ThreeMonths_temp__c = true; opp.ThreeMonths__c = true; opp.AutoClosedDate__c = getAutoClosedDate(opp.ProductSegment__c,opp.OppUpdateDate__c); oppList.add(opp); continue; } if (opp.OppUpdateDate__c <= yesterDay.addMonths(-6) && opp.OppUpdateDate__c > yesterDay.addMonths(-9) && opp.SixMonths__c == false) { opp.SixMonths_temp__c = true; opp.SixMonths__c = true; opp.AutoClosedDate__c = getAutoClosedDate(opp.ProductSegment__c,opp.OppUpdateDate__c); oppList.add(opp); continue; } if (opp.OppUpdateDate__c <= yesterDay.addMonths(-9) && opp.OppUpdateDate__c > yesterDay.addMonths(-12) && opp.NineMonths__c == false) { opp.NineMonths_temp__c = true; opp.NineMonths__c = true; opp.AutoClosedDate__c = getAutoClosedDate(opp.ProductSegment__c,opp.OppUpdateDate__c); if(opp.ProductSegment__c == 'NDT' || opp.ProductSegment__c == 'ANI'){ opp.IsSendEmail__c = false; opp.StageName = 'Closed Cancel'; opp.Cancel_Fail_Approve__c = 'Pass'; opp.Cancel_reason_D__c = 'Other'; opp.Cancel_Reason_Text_D__c = '编号为:'+opp.InquiryNumber__c+'的询价,9个月未有进展,已被CRM系统自动取消。'; opp.CancelReason__c = 'Other'; opp.CancelReasonText__c = '编号为:'+opp.InquiryNumber__c+'的询价,9个月未有进展,已被CRM系统自动取消。'; String memberId = getMember(opp.ProductSegment__c,opp.Province__c); opp.OppUpdateAddress__c = memberId; if(memberId == '00528000000YVJk'){ opp.OppUpdateAddress__c = '00528000006hJeB'; } } oppList.add(opp); continue; } if(opp.OppUpdateDate__c <= yesterDay.addMonths(-12) && opp.OneYear__c == false){ if(opp.ProductSegment__c != 'NDT' && opp.ProductSegment__c != 'ANI'){ opp.OneYear__c = true; opp.OneYear_temp__c = true; opp.IsSendEmail__c = false; opp.StageName = 'Closed Cancel'; opp.Cancel_Fail_Approve__c = 'Pass'; opp.Cancel_reason_D__c = 'Other'; opp.Cancel_Reason_Text_D__c = '询价编号'+opp.InquiryNumber__c+',询价名称'+opp.Name+',已经有一年未进行任何信息更新,已经由系统调整为取消状态,不能再进行任何操作,请了解,谢谢'; opp.CancelReasonText__c = '询价编号'+opp.InquiryNumber__c+',询价名称'+opp.Name+',已经有一年未进行任何信息更新,已经由系统调整为取消状态,不能再进行任何操作,请了解,谢谢'; oppList.add(opp); } } } if(oppList.size() >0 ) update oppList; } global void finish(Database.BatchableContext BC) { } private Date getAutoClosedDate(String productSegment,Date oppUpdateDate){ if(productSegment == 'NDT' || productSegment == 'ANI'){ return oppUpdateDate.addMonths(9); }else{ return oppUpdateDate.addMonths(12); } } private String getMember(String type,String province){ if (String.isNotBlank(type) && String.isNotBlank(province)) { if (type == 'NDT') { String NDTGuanZhao = System.label.NDTGuanZhao; String NDTLiuJianHua = System.label.NDTLiuJianHua; String NDTPanWei = System.label.NDTPanWei; String NDTYuDaZhi = System.label.NDTYuDaZhi; if(NDTGuanZhao.indexOf(province) != -1){ return NDTGuanZhao.split('_')[1]; } if(NDTLiuJianHua.indexOf(province) != -1){ return NDTLiuJianHua.split('_')[1]; } if(NDTPanWei.indexOf(province) != -1){ return NDTPanWei.split('_')[1]; } if(NDTYuDaZhi.indexOf(province) != -1){ return NDTYuDaZhi.split('_')[1]; } }else if (type == 'ANI') { String ANIGuanZhao = System.label.ANIGuanZhao; String ANILiuJianHua = System.label.ANILiuJianHua; String ANIPanWei = System.label.ANIPanWei; String ANIYuDaZhi = System.label.ANIYuDaZhi; if(ANIGuanZhao.indexOf(province) != -1){ return ANIGuanZhao.split('_')[1]; } if(ANILiuJianHua.indexOf(province) != -1){ return ANILiuJianHua.split('_')[1]; } if(ANIPanWei.indexOf(province) != -1){ return ANIPanWei.split('_')[1]; } if(ANIYuDaZhi.indexOf(province) != -1){ return ANIYuDaZhi.split('_')[1]; } } } return null; } }