使用 Apex 获取审批记录

为什么要写这篇文章呢?因为本人在实际的项目中确实遇到了这样的问题,并花了一些时间来寻找解决办法。在此拿出来和大家分享一下。

这篇文章涉及到了 Salesforce 的 Approval Processes 功能,在此我们只做简单的概述,不做过多的介绍。Approval Processes 是 Salesforce 中的审批工作流,用它可以在 Salesforce 中针对某一个对象定制一套审批流程。可以在 Setup -> Build -> Create -> Workflow & Approvals -> Approval Processes 中找到。

言归正传,接着说我们的项目需求,需要声明一下,这个需求只是模拟了真实的场景。客户有四个角色,分别为销售人员,销售经理,区域经理,CEO。销售人员提交一个 Order 到销售经理,销售经理查看并提交给区域经理,区域经理检查没有问题后提交 Order 到 CEO , 当 CEO 审批完成后需要给销售经理和区域经理发送邮件通知。

第一步

首先我们需要创建四种不同角色的用户。

因为用的是 Developer Edition,而一个 Developer Edition 只允许我们创建两个 Salesforce User。所以这里只做陈述,不做实际的演示。

第二步

创建 Order 的 Approval Processes,这里我们需要创建三步审批流程。根据实际的项目需要可以对每一步做过滤条件。在最后一步,也就是 CEO Approve 之后我们需要更新一下 Order 上的字段,以表明这个 Order 被最终批准,我们暂时叫这个字段 Status,下面我们也会用到这个字段。

第三步

在 Order 对象上创建一个 Update Trigger ,当 Status 的值变成最终审批状态时,将触发这个 Trigger, 并查询该 Order 下被审批过的销售经理和区域经理,然后发送邮件通知他们。代码如下:

for(ProcessInstance instance : [select Id, TargetObjectId,  
         (select Id, StepStatus, ActorId from Steps Order by CreatedDate asc limit 2) 
         from ProcessInstance where TargetObjectId in :orderIds 
          order by CreatedDate desc limit 1])
{
    for(ProcessInstanceStep stepProxy : instance.Steps)
    {
        sendEmailUsers.add(stepProxy.ActorId);
    }
}

代码解释

select Id, TargetObjectId, (select Id, StepStatus, ActorId from Steps Order by CreatedDate asc limit 2) from ProcessInstance where TargetObjectId in :orderIds order by CreatedDate desc limit 1  

上面的 SQL 查询获取了 Order 最近一次完成审批流程的记录。其中子查询是获取审批流程中的销售经理和区域经理,为什么要加 limit 2 ,因为这里有三个审批的记录,为了不查询 CEO 的审批记录,我们在子查询的后面加上了 limit 2

结束

如果大家有更好的办法可以在文章下边回复,或者关注我们的公众账号联系我。再此感谢大家的支持。