public with sharing class TaskObjectTriggerHandle { public TaskObjectTriggerHandle() { } public void afterUpdateTask(List newList,List oldList,Map newMap,Map oldMap){ List updList = new List(); List compeleteIdList = new List(); List cancelIdList = new List(); List closeIdList = new List(); List postponeIdList = new List(); List unexecutedIdList = new List(); List takeIdList = new List(); for(task__c tsk : newList){ if(tsk.taskStatus__c != oldMap.get(tsk.Id).taskStatus__c){ if(tsk.taskStatus__c == '03 完成'){ compeleteIdList.add(tsk.Id); }else if(tsk.taskStatus__c == '04 取消'){ cancelIdList.add(tsk.Id); }else if(tsk.taskStatus__c == '05 延期'){ postponeIdList.add(tsk.Id); }else if(tsk.taskStatus__c == '06 关闭'){ closeIdList.add(tsk.Id); }else if(tsk.taskStatus__c == '07 未执行'){ unexecutedIdList.add(tsk.Id); }else if(tsk.taskStatus__c == '02 接受'){ takeIdList.add(tsk.Id); } } } /*List compeleteList = [select Id,taskStatus__c,mergeTaskMain__c from task__c where mergeTaskMain__c in :compeleteIdList]; if(compeleteList != null){ for(task__c tsk : compeleteList){ tsk.taskStatus__c = '03 完成'; } update compeleteList; }*/ /* 2021-12-28 注释处理不同类型任务合并内容,只上线相同类型任务合并 List cancelList = [select Id,taskStatus__c,mergeTaskMain__c from task__c where mergeTaskMain__c in :cancelIdList]; if(cancelList != null){ for(task__c tsk : cancelList){ tsk.mergeTaskMain__c = null; } update cancelList; } List postponeList = [select Id,taskStatus__c,mergeTaskMain__c from task__c where mergeTaskMain__c in :postponeIdList]; if(postponeList != null){ for(task__c tsk : postponeList){ tsk.mergeTaskMain__c = null; } update postponeList; } List takeList = [select Id,taskStatus__c,mergeTaskMain__c from task__c where mergeTaskMain__c in :takeIdList]; if(takeList != null){ for(task__c tsk : takeList){ tsk.taskStatus__c = '02 接受'; tsk.ConfirmDate__c = newMap.get(tsk.mergeTaskMain__c).ConfirmDate__c; } update takeList; }*/ /*List closeList = [select Id,taskStatus__c,mergeTaskMain__c from task__c where mergeTaskMain__c in :closeIdList]; if(closeList != null){ for(task__c tsk : closeList){ tsk.taskStatus__c = '06 关闭'; } update closeList; } List unexecutedList = [select Id,taskStatus__c,mergeTaskMain__c from task__c where mergeTaskMain__c in :unexecutedIdList]; if(unexecutedList != null){ for(task__c tsk : unexecutedList){ tsk.taskStatus__c = '07 未执行'; } update unexecutedList; }*/ } //2021-11-04 mzy 任务管理改善 start //当任务新建时,任务名称为*时,根据规则重新修改任务名称 public void updateTaskNameAndOwner(List newList,List oldList,Map newMap,Map oldMap){ System.debug('进入任务触发器'); //定义变量保存记录类型 Id Hcen_TaskId = Schema.SObjectType.task__c.getRecordTypeInfosByDeveloperName().get('HAccountVisit').getRecordTypeId(); Map taskPREMap = gettaskPREMap(); List needUpdate = new List(); Set searchTaskId = new Set(); Set tempSet = new Set(); //2022-01-12 mzy 上级分配的记录类型为其他 的任务可能没有客户,需要把名称变为 其他:任务名称 Set OtherLeadAssig = new Set(); //2022-01-12 mzy 上级分配的记录类型为其他 的任务可能没有客户,需要把名称变为 其他:任务名称 for(Task__c task :newList){ if(task.Id!=null){ //任务名称为*时,且客户不为空时 if('*'.equals(task.Name)&&task.account__c!=null){ searchTaskId.add(task.Id); } //2022-01-12 mzy 上级分配的记录类型为其他 的任务可能没有客户,需要把名称变为 其他:任务名称 if('上级分配任务'.equals(task.TaskDifferent__c)&&task.account__c == null){ tempSet.add(task.Id); } } } //2022-01-12 mzy 上级分配的记录类型为其他 的任务可能没有客户,需要把名称变为 其他:任务名称 start if(tempSet.size()>0){ List tempResult = [SELECT Id,TaskDifferent__c,RecordType.Name FROM Task__c WHERE Id in :tempSet]; if(tempResult.size()>0){ for(Task__c t:tempResult){ if('上级分配任务'.equals(t.TaskDifferent__c)&&'其他'.equals(t.RecordType.Name)){ searchTaskId.add(t.id); OtherLeadAssig.add(t.id); } } } } //2022-01-12 mzy 上级分配的记录类型为其他 的任务可能没有客户,需要把名称变为 其他:任务名称 end System.debug('进入任务触发器的任务:'+searchTaskId); if(searchTaskId.size()>0){ List taskResult = [SELECT Id,Name,TaskDifferent__c,OpportunityId__c,RecordType.Name,taskType__c,OwnerId,account__c,assignee__c,account__r.Name,account__r.OCM_Category__c FROM Task__c WHERE Id in :searchTaskId]; if(taskResult.size()>0){ for(Task__c t :taskResult){ System.debug('类型:'+t.RecordType.Name); System.debug('任务类型:'+taskPREMap.get(t.RecordType.Name)); //2022-01-12 mzy 上级分配的记录类型为其他 的任务可能没有客户,需要把名称变为 其他:任务名称 if(taskPREMap.get(t.RecordType.Name)!=null&&(!OtherLeadAssig.contains(t.Id))){ Task__c tempTsk = new Task__c(); tempTsk.Id = t.Id; //任务的原所有人变为分配者 tempTsk.Assignmenter__c = t.OwnerId; //被分配者变为任务的所有人 if(t.assignee__c!=null){ tempTsk.OwnerId = t.assignee__c; } //如果页面选择询价了,则将询价的以下字段赋值给任务 //询价等级(分配):记录分配时点的询价等级 //预测OCSM签约日(分配):记录分配时点的预测签约日 //询价状态 (分配) : 记录分配时点的询价状态 //询价创建日 (分配) : 记录分配时点的询价创建日 //询价招标日 (分配) : 记录分配时点的询价招标日 //询价中标日 (分配) : 记录分配时点的询价中标日 if(t.OpportunityId__c != null){ Opportunity op = [SELECT Id,Competitor__c,Close_Forecasted_Date__c,Created_Day__c,StageName__c, Bid_Date__c,Closing_Bid_Date__c FROM Opportunity WHERE Id = :t.OpportunityId__c]; if(op!=null){ tempTsk.OppCompetitorDbt__c = op.Competitor__c; tempTsk.CloseForecastedDateDbt__c = op.Close_Forecasted_Date__c; tempTsk.OpportunityStatusDbt__c = op.StageName__c; tempTsk.OppCreateDateDbt__c =op.Created_Day__c; tempTsk.Bid_DateDbt__c =op.Bid_Date__c; tempTsk.Closing_Bid_DateDbt__c =op.Closing_Bid_Date__c; } } //任务类型(如果任务类型为日常拜访时,后台自动判断是否修改为H层拜访) String typetask = t.RecordType.Name; String OCMCategory = t.account__r.OCM_Category__c; if('日常拜访'.equals(typetask)&&('H1'.equals(OCMCategory)||'H0'.equals(OCMCategory))){ tempTsk.RecordTypeId = Hcen_TaskId; } //任务状态 tempTsk.taskStatus__c = '01 分配'; //是否需要反馈 if('上级分配任务'.equals(t.TaskDifferent__c)){ tempTsk.NeedFeedback__c = true; } //任务名称 String tempAcName = t.account__r.Name; tempTsk.Name = taskPREMap.get(typetask).replace('AccountName',tempAcName); needUpdate.add(tempTsk); } //2022-01-12 mzy 上级分配的记录类型为其他 的任务可能没有客户,需要把名称变为 其他:任务名称 if (taskPREMap.get(t.RecordType.Name)!=null&&OtherLeadAssig.contains(t.Id)){ //需要变为 其他:任务名称 Task__c tempTsk = new Task__c(); tempTsk.Id = t.Id; //任务的原所有人变为分配者 tempTsk.Assignmenter__c = t.OwnerId; //被分配者变为任务的所有人 if(t.assignee__c!=null){ tempTsk.OwnerId = t.assignee__c; } //如果页面选择询价了,则将询价的以下字段赋值给任务 //询价等级(分配):记录分配时点的询价等级 //预测OCSM签约日(分配):记录分配时点的预测签约日 //询价状态 (分配) : 记录分配时点的询价状态 //询价创建日 (分配) : 记录分配时点的询价创建日 //询价招标日 (分配) : 记录分配时点的询价招标日 //询价中标日 (分配) : 记录分配时点的询价中标日 if(t.OpportunityId__c != null){ Opportunity op = [SELECT Id,Competitor__c,Close_Forecasted_Date__c,Created_Day__c,StageName__c, Bid_Date__c,Closing_Bid_Date__c FROM Opportunity WHERE Id = :t.OpportunityId__c]; if(op!=null){ tempTsk.OppCompetitorDbt__c = op.Competitor__c; tempTsk.CloseForecastedDateDbt__c = op.Close_Forecasted_Date__c; tempTsk.OpportunityStatusDbt__c = op.StageName__c; tempTsk.OppCreateDateDbt__c =op.Created_Day__c; tempTsk.Bid_DateDbt__c =op.Bid_Date__c; tempTsk.Closing_Bid_DateDbt__c =op.Closing_Bid_Date__c; } } //任务状态 tempTsk.taskStatus__c = '01 分配'; //是否需要反馈 if('上级分配任务'.equals(t.TaskDifferent__c)){ tempTsk.NeedFeedback__c = true; } //任务名称 String tempTskName = '其他:' + t.Name; tempTsk.Name = tempTskName; needUpdate.add(tempTsk); } } if(needUpdate.size()>0){ update needUpdate; } } } } @TestVisible private Map gettaskPREMap(){ Map taskPREMap = new Map(); taskPREMap.put('多年保修任务',' 多年保修消费率预警任务(AccountName)'); taskPREMap.put('询价跟进','用户拜访:AccountName'); taskPREMap.put('H层拜访','用户拜访:AccountName'); taskPREMap.put('OPD','用户拜访:AccountName'); taskPREMap.put('SLA报告书任务','服务合同发放报告书任务(AccountName)'); taskPREMap.put('经销商支持','经销商支持:AccountName'); taskPREMap.put('学术会议跟进','学术会议:CampaignName'); taskPREMap.put('服务季报','用户拜访:AccountName'); taskPREMap.put('目标客户拜访','用户拜访:AccountName'); taskPREMap.put('维修合同任务','用户拜访:AccountName'); taskPREMap.put('日常拜访','用户拜访:AccountName'); taskPREMap.put('其他','其他:AccountName'); return taskPREMap; } //2021-11-04 mzy 任务管理改善 end //2021-11-17 mzy 任务管理改善 start public void updateOverFeedback(List newList,List oldList,Map newMap,Map oldMap){ //需要反馈并且反馈内容不为空,则算反馈完成 Id OPDID = Schema.SObjectType.task__c.getRecordTypeInfosByDeveloperName().get('OPD').getRecordTypeId(); List taskIdList = new List();//2021-12-14 Yjk 完成反馈任务id集合 for(task__c tsk : newList){ if(tsk.NeedFeedback__c&&tsk.FeedbackDescription__c!=null&&tsk.OverFeedback__c != true){ tsk.OverFeedback__c = true; taskIdList.add(tsk.id); } //是否需要反馈 if('上级分配任务'.equals(tsk.TaskDifferent__c)){ tsk.NeedFeedback__c = true; } //2021-11-17 yjk opd类型新建时给产品明细赋值 if(OPDID.equals(tsk.RecordTypeId) && '上级分配任务'.equals(tsk.TaskDifferent__c) && tsk.HopeCompletionDate__c != null && tsk.PlanProdDetail__c != null){ Integer hopeMonth = tsk.HopeCompletionDate__c.month(); String[] details = tsk.PlanProdDetail__c.split(';'); String prodectDetail = ''; for(String dtl : details){ prodectDetail =prodectDetail+dtl +':'+hopeMonth+'月;'; } tsk.ProductDetails__c = prodectDetail; } } //发送邮件 List sendMails = new List(); if(taskIdList.size() > 0){ List newTaskList = [select id,Name,TaskDifferent__c,PlanProdDetail__c,HopeCompletionDate__c,taskType__c,Assignmenter__r.email,NeedFeedback__c ,FeedbackDescription__c,OverFeedback__c from task__c where id in :taskIdList]; for(task__c tsk : newTaskList){ String title = ''; String body = ''; title = tsk.name + ' 任务已反馈'; body += '您好:
'; body += '任务名为"'+tsk.name+'"的任务已反馈,
'; //body += System.Label.OPD_Report; body += '具体结果请查阅链接,' +URL.getSalesforceBaseUrl().toExternalForm() + Label.feedbackTaskId+ '
'; body += '谢谢!'; Messaging.SingleEmailMessage messageNEW = new Messaging.SingleEmailMessage(); messageNEW.setSubject(title); messageNEW.setHtmlBody(body); messageNEW.setCharset('UTF-8'); System.debug('用户邮箱112212:'+tsk.Assignmenter__r.Email); messageNEW.setToAddresses(new list{tsk.Assignmenter__r.Email}); //messageNEW.setCcAddresses(new list{'yangjieke@prec-tech.com','miaoziyang@prec-tech.com'}); //setCcAddresses if(tsk.Assignmenter__r.Email != null){ sendMails.add(messageNEW); } } } if (sendMails.size() > 0) { Messaging.Email[] allMails = new Messaging.Email[]{}; for(Integer j = 0; j < sendMails.size(); j++) { allMails.add(sendMails.get(j)); } System.debug('所有邮件:'+allMails); Messaging.SendEmailResult[] results = Messaging.sendEmail(allMails); System.debug('results 结果 :'+results); for (Integer i = 0; i < results.size(); i++) { if (results[i].success == false) { system.debug('=====send mail error:' + results[i].errors[0].message); } } } } //2021-11-17 mzy 任务管理改善 end //2021-11-29 mzy 任务管理改善 start public void BeforeCheck(List newList,List oldList,Map newMap,Map oldMap){ //分配者: // 对当前医院有权限的人(主担当,产品担当,FSE),保存检查是否有权限 —— 请协助确认是否只能选科室担当人 //客户Id Set accountIdset = new Set(); //客户List List alist = new List(); //客户Map //key:科室Id v:担当 Map> amap = new Map>(); //key:科室Id v:产品担当 Map> amap_product = new Map>(); //key:科室Id v:产品担当文本名 Map> amap_productSet = new Map>(); //定义Set存放所有产品担当文本名 Set largeSet = new Set(); //科室 //key:科室Id v:科室 Map amap_Act = new Map(); for(task__c tsk : newList){ if('上级分配任务'.equals(tsk.TaskDifferent__c)&&tsk.account__c != null){ accountIdset.add(tsk.account__c); } if('上级分配任务'.equals(tsk.TaskDifferent__c)){ tsk.distributeReason__c = '上级分配'; } } //查询当前客户的主担当,产品担当,FSE if(accountIdset.size()>0){ alist = [SELECT Id,Hospital__c,Hospital__r.OwnerId,Hospital__r.GI_Main__c,Hospital__r.GI_Main__r.isActive, Hospital__r.BF_owner__c,Hospital__r.BF_owner__r.isActive ,Hospital__r.ET_owner__c ,Hospital__r.ET_owner__r.isActive , Hospital__r.SP_Main__c ,Hospital__r.SP_Main__r.isActive,Hospital__r.URO_owner_ID__c,Hospital__r.URO_owner_ID__r.isActive , Hospital__r.GYN_owner__c,Hospital__r.GYN_owner__r.isActive,Hospital__r.ENT_owner_ID__c,Hospital__r.ENT_owner_ID__r.isActive, Hospital__r.FSE_SP_Main_Leader__c,Hospital__r.FSE_SP_Main_Leader__r.isActive, Hospital__r.FSE_GI_Main_Leader__c,Hospital__r.FSE_GI_Main_Leader__r.isActive ,Department_Class__c,Department_Class__r.Department_Class_Label__c, Hospital__r.GI_Product_Leader__c,Hospital__r.BF_Product_Leader__c,Hospital__r.ET_Product_Leader__c, Hospital__r.GS_Product_Leader__c,Hospital__r.URO_Produc_Leader__c,Hospital__r.Energy_LeaderStr__c, Hospital__r.GYN_Product_Leader__c,Hospital__r.ENT_Product_Leader__c,Hospital__r.FSE_SP_Vice_Leader__c, Hospital__r.FSE_GI_Vice_Leader__c FROM Account WHERE Id in :accountIdset]; if(alist.size()>0){ for(Account tempa:alist){ String deptlabel = tempa.Department_Class__r.Department_Class_Label__c; List tempAlist = new List(); if('消化科'.equals(deptlabel)){ //用户启用 if(tempa.Hospital__r.GI_Main__r.isActive){ tempAlist.add(tempa.Hospital__r.GI_Main__c); } String tempProd = tempa.Hospital__r.GI_Product_Leader__c; if(String.isNotBlank(tempProd)){ if(tempProd.contains(',')){ largeSet.addAll(tempProd.split(',')); }else{ largeSet.add(tempProd); } } } if('呼吸科'.equals(deptlabel)){ //用户启用 if(tempa.Hospital__r.BF_owner__r.isActive){ tempAlist.add(tempa.Hospital__r.BF_owner__c); } String tempProd = tempa.Hospital__r.BF_Product_Leader__c; if(String.isNotBlank(tempProd)){ if(tempProd.contains(',')){ largeSet.addAll(tempProd.split(',')); }else{ largeSet.add(tempProd); } } } if('普外科'.equals(deptlabel)){ //用户启用 if(tempa.Hospital__r.SP_Main__r.isActive){ tempAlist.add(tempa.Hospital__r.SP_Main__c); } String tempProd = tempa.Hospital__r.GS_Product_Leader__c; if(String.isNotBlank(tempProd)){ if(tempProd.contains(',')){ largeSet.addAll(tempProd.split(',')); }else{ largeSet.add(tempProd); } } } if('泌尿科'.equals(deptlabel)){ //用户启用 if(tempa.Hospital__r.URO_owner_ID__r.isActive){ tempAlist.add(tempa.Hospital__r.URO_owner_ID__c); } String tempProd = tempa.Hospital__r.URO_Produc_Leader__c; if(String.isNotBlank(tempProd)){ if(tempProd.contains(',')){ largeSet.addAll(tempProd.split(',')); }else{ largeSet.add(tempProd); } } } if('妇科'.equals(deptlabel)){ //用户启用 if(tempa.Hospital__r.GYN_owner__r.isActive){ tempAlist.add(tempa.Hospital__r.GYN_owner__c); } String tempProd = tempa.Hospital__r.GYN_Product_Leader__c; if(String.isNotBlank(tempProd)){ if(tempProd.contains(',')){ largeSet.addAll(tempProd.split(',')); }else{ largeSet.add(tempProd); } } } if('耳鼻喉科'.equals(deptlabel)){ //用户启用 if(tempa.Hospital__r.ENT_owner_ID__r.isActive){ tempAlist.add(tempa.Hospital__r.ENT_owner_ID__c); } String tempProd = tempa.Hospital__r.ENT_Product_Leader__c; if(String.isNotBlank(tempProd)){ if(tempProd.contains(',')){ largeSet.addAll(tempProd.split(',')); }else{ largeSet.add(tempProd); } } } if('ET'.equals(deptlabel)){ //用户启用 if(tempa.Hospital__r.ET_owner__r.isActive){ tempAlist.add(tempa.Hospital__r.ET_owner__c); } String tempProd = tempa.Hospital__r.ET_Product_Leader__c; if(String.isNotBlank(tempProd)){ if(tempProd.contains(',')){ largeSet.addAll(tempProd.split(',')); }else{ largeSet.add(tempProd); } } } tempAlist.add(tempa.Hospital__r.OwnerId); // if(tempa.Hospital__r.FSE_SP_Main_Leader__r.isActive){ // tempAlist.add(tempa.Hospital__r.FSE_SP_Main_Leader__c); // } amap.put(tempa.Id,tempAlist); amap_Act.put(tempa.Id,tempa); } if(largeSet.size()>0){ //根据别名查询启用的用户 List uselist = [SELECT Id,Alias FROM User Where IsActive = true and Alias in :largeSet]; if(uselist.size()>0){ for(Account tempa:alist){ String deptlabel = tempa.Department_Class__r.Department_Class_Label__c; List uids = new List(); for(User u :uselist){ if('消化科'.equals(deptlabel) && tempa.Hospital__r.GI_Product_Leader__c.contains(u.Alias) ){ uids.add(u.Id); } if('呼吸科'.equals(deptlabel) &&tempa.Hospital__r.BF_Product_Leader__c.contains(u.Alias)){ uids.add(u.Id); } if('普外科'.equals(deptlabel) &&tempa.Hospital__r.GS_Product_Leader__c.contains(u.Alias)){ uids.add(u.Id); } if('泌尿科'.equals(deptlabel) &&tempa.Hospital__r.URO_Produc_Leader__c.contains(u.Alias)){ uids.add(u.Id); } if('妇科'.equals(deptlabel) &&tempa.Hospital__r.GYN_Product_Leader__c.contains(u.Alias)){ uids.add(u.Id); } if('耳鼻喉科'.equals(deptlabel) &&tempa.Hospital__r.ENT_Product_Leader__c.contains(u.Alias)){ uids.add(u.Id); } if('ET'.equals(deptlabel) &&tempa.Hospital__r.ET_Product_Leader__c.contains(u.Alias)){ uids.add(u.Id); } } if(amap.get(tempa.Id)!=null){ List tempList = amap.get(tempa.Id); if(uids.size()>0){ tempList.addAll(uids); } amap.put(tempa.Id,tempList); } } } } } } for(task__c tsk : newList){ if('上级分配任务'.equals(tsk.TaskDifferent__c)&&tsk.account__c != null){ if(amap_Act.get(tsk.account__c)!=null){ List ActlistV= amap.get(tsk.account__c); if(!ActlistV.contains(tsk.assignee__c)){ tsk.assignee__c.addError('请选择对当前科室有权限的人员进行分配!'); break; } } } } } //2021-11-29 mzy 任务管理改善 end }