salesforce 零基础开发入门学习(九)Approval Process 介绍

在阅读此篇文章前,可以先参考阅读一个前辈总结的关于Approval Process的操作。以下为参考的链接:

http://www.cnblogs.com/mingmingruyuedlut/p/3765777.html

Approval Process用于流程审批,Apex主要涉及到的命名空间和类为Approval命名空间以及System命名空间下的Approval类。

其中Approval命名空间下主要的类为:

  • ProcessRequest
  • ProcessSubmitRequest
  • ProcessWorkitemRequest
  • ProcessResult

下面通过一段代码来进行介绍这些类的作用以及使用方式,此代码copy于官方PDF文档的sample。

 1 public class TestApproval {
 2     void submitAndProcessApprovalRequest() {
 3         // Insert an account
 4         Account a = new Account(Name=‘Test‘,annualRevenue=100.0);
 5         insert a;
 6         User user1 = [SELECT Id FROM User WHERE Alias=‘SomeStandardUser‘];
 7         // Create an approval request for the account
 8         Approval.ProcessSubmitRequest req1 = new Approval.ProcessSubmitRequest();
 9         req1.setComments(‘Submitting request for approval.‘);
10         req1.setObjectId(a.id);
11         // Submit on behalf of a specific submitter
12         req1.setSubmitterId(user1.Id);
13         // Submit the record to specific process and skip the criteria evaluation
14         req1.setProcessDefinitionNameOrId(‘PTO_Request_Process‘);
15         req1.setSkipEntryCriteria(true); // Submit the approval request for the account
16         Approval.ProcessResult result = Approval.process(req1); // Verify the result
17         System.assert(result.isSuccess());
18         System.assertEquals( ‘Pending‘, result.getInstanceStatus(), ‘Instance Status‘+result.getInstanceStatus());
19         // Approve the submitted request
20         // First, get the ID of the newly created item
21         List<Id> newWorkItemIds = result.getNewWorkitemIds();
22         // Instantiate the new ProcessWorkitemRequest object and populate it
23         Approval.ProcessWorkitemRequest req2 = new Approval.ProcessWorkitemRequest();
24         req2.setComments(‘Approving request.‘);
25         req2.setAction(‘Approve‘);
26         req2.setNextApproverIds(new Id[] {UserInfo.getUserId()});
27         // Use the ID from the newly created item to specify the item to be worked
28         req2.setWorkitemId(newWorkItemIds.get(0));
29         // Submit the request for approval
30         Approval.ProcessResult result2 = Approval.process(req2);
31         // Verify the results
32         System.assert(result2.isSuccess(), ‘Result Status:‘+result2.isSuccess());
33         System.assertEquals( ‘Approved‘, result2.getInstanceStatus(), ‘Instance Status‘+result2.getInstanceStatus());
34     }
35 }

注:此代码无法直接运行,如果需要运行此代码,请参照上方的链接为Account表设置名为‘PTO_Request_Process‘的审批流程。

通过上述代码来更好的了解以下的类的使用。

一)ProcessRequest

ProcessRequest类作为ProcessSubmitRequest和ProcessWorkitemRequest类的父类,提供了四个内置方法:

  1. setComments(comments):此方法用于设置审批提交时的审批意见;
  2. setNextApproverIds(ID[] nextApproverIds):此方法用于流程审批的下一级审批者;
  3. getComments():此方法用于获取审批意见;
  4. getNextApproverIds():返回一个作为审批者的用户的用户ID列表。

ProcessRequest封装的方法为最基础的流程审批方法,并且这些方法都是实例化方法。通常新建流程审批的类时并不实例化此类,而是实例化他对应的两个子类。

二)ProcessSubmitRequest

使用此类来提交一条记录到流程审批中,除继承ProcessRequest类方法以外,如下为自身的方法:

  1. setObjectId(recordId):设置指定的sObject的记录ID到流程审批中。如上述sample中,insert一条Account,可以将Account提交到审批流程中,比如annualRevenue字段超过多少情况下执行流程审批
  2. setProcessDefinitionNameOrId(nameOrId):设置流程定义的名称或者编号,记录提交给特定的审批流程。可以在salesforce中通过setup->Create->Workflow&Approvals->Approval Processes设置指定的审批流程,如果设置为null,则遵循标准流程,默认值为null;
  3. setSkipEntryCriteria(skipEntryCriteria):如果skipEntryCriterial设置为true,请求提交则跳过在setProcessDefinitionNameOrId流程设置中的校验,如果没有指定nameOrId则自动忽略此参数,并且按照标准流程顺序走。如果设置为false,或不调用此方法,则不跳过校验;
  4. setSubmittedId(userId):设置需要提交到流程审批的记录的用户ID,这个用户必须是在流程定义设置中允许提交流程的一个用户,如果不设置则默认当前用户;
  5. 相应get方法。

通过此类的方法讲解可以看出此类主要用于将一条数据提交到流程审批时使用。

三)ProcessWorkitemRequest

此类用于当一个记录提交到流程审批后,处理一个流程审批的请求,处理的状态可以分为Approve,Reject,Removed三种情况。除继承ProcessRequest类的方法以外,如下为自身的方法:

  1. setAction(actionType):设置action类型来处理一个流程审批请求,其中actionType可以为一下的值:Approve,Reject,Removed.其中,只有系统管理员可以指定Removed;
  2. setWorkitemId(id):设置被批准,拒绝或者移除的审批请求的编号,此编号可以在ProcessInstanceWorkitem表中获取,此表为salesforce自身封装的表;
  3. 相应的get方法。

通过此类的方法介绍可以看出,此类主要用于对已经提交到流程审批的记录进行审批处理时用到的类。

四)ProcessResult

当提交一条记录到流程审批后,可以通过此类来处理流程审批的结果状态。

此类方法如下:

  1. getEntityId():获取正在被提交到流程审批的记录的编号,可以在ProcessInstanceWorkitem表中看到,对应于此表的字段TargetObjectId值;
  2. getErrors():如果发生错误,返回包含数据库对象错误代码和描述的数组;
  3. getInstanceId():获取流程审批的编号,可以在ProcessInstanceWorkitem表中看到,对应于此表的字段Id值;
  4. getInstanceStatus():获取流程审批的状态,主要有以下的几种:Approved,Reject,Removed,Pending;
  5. getNewWorkitemIds():获取提交到流程审批的新项目的ID,可以有0个或者1个流程审批。可以在ProcessInstanceWorkitem表中看到,对应于此表的Id字段值;
  6. isSuccess():如果审批流程正常提交则返回true,否则返回false。

五)Approval

Approval位于System命名空间下,上述1-4均在Approval命名空间下。

Approval类含有很多方法,这里主要介绍process()方法,其他方法请自行查看官方PDF文档。此方法作用为提交一个新的请求,或者通过或者拒绝已经存在的审批的记录。此方法形参有一项为ProcessRequest,可以指定ProcessSubmitRequest或者ProcessWorkitemRequest类作为参数以实现不同功能,此方法返回类型为Approval.ProcessResult对象。当正确提交一条记录到审批流程后,相应的ProcessInstanceWorkitem表以及ProcessInstance表便新增一条关于此条记录的信息记录。

总结:ProcessRequest作为审批请求的父类,封装了两个重要的方法,扩展的两个子类分别实现不同功能,ProcessSubmitRequest实现将一条记录传到审批流程中,ProcessWorkitemRequest实现审批已经存在审批流程中的记录。

对上述例子进行调整一下,使之可以不通过前辈那种方式(链接在上方)操作。

通过上面介绍可以发现,当将setProcessDefinitionNameOrId()方法参数设置为null或者不调用此方法时,可以不执行上述方法,通过定义父类的setNextApproverIds()方法设置审批用户编号便可以将审批流程跑通,于是上述代码可以做如下变形便直接跑通:

 1 public class TestApproval {
 2     public void submitAndProcessApprovalRequest() {
 3         // Insert an account
 4         Account a = new Account(Name=‘Test‘,annualRevenue=100.0);
 5         insert a;
 6         User user1 = [SELECT Id FROM User WHERE Alias=‘zero‘];
 7         // Create an approval request for the account
 8         Approval.ProcessSubmitRequest req1 = new Approval.ProcessSubmitRequest();
 9         req1.setComments(‘Submitting request for approval.‘);
10         req1.setObjectId(a.id);
11         // Submit on behalf of a specific submitter
12         req1.setSubmitterId(user1.Id);
13         ID[] ids = new ID[]{user1.Id};
14         req1.setNextApproverIds(ids);
15         // Submit the record to specific process and skip the criteria evaluation
16         //req1.setProcessDefinitionNameOrId(‘PTO_Request_Process‘);
17         req1.setSkipEntryCriteria(true); // Submit the approval request for the account
18         Approval.ProcessResult result = Approval.process(req1); // Verify the result
19         System.assert(result.isSuccess());
20         System.assertEquals( ‘Pending‘, result.getInstanceStatus(), ‘Instance Status‘+result.getInstanceStatus());
21         // Approve the submitted request
22         // First, get the ID of the newly created item
23         List<Id> newWorkItemIds = result.getNewWorkitemIds();
24         // Instantiate the new ProcessWorkitemRequest object and populate it
25         Approval.ProcessWorkitemRequest req2 = new Approval.ProcessWorkitemRequest();
26         req2.setComments(‘Approving request.‘);
27         req2.setAction(‘Approve‘);
28         req2.setNextApproverIds(new Id[] {UserInfo.getUserId()});
29         // Use the ID from the newly created item to specify the item to be worked
30         req2.setWorkitemId(newWorkItemIds.get(0));
31         // Submit the request for approval
32         Approval.ProcessResult result2 = Approval.process(req2);
33         // Verify the results
34         System.assert(result2.isSuccess(), ‘Result Status:‘+result2.isSuccess());
35         System.assertEquals( ‘Approved‘, result2.getInstanceStatus(), ‘Instance Status‘+result2.getInstanceStatus());
36     }
37 }

至于在setup->Create->Workflow&Approvals->Approval Processes新建一个自定义的审批流程使用比较好,还是在程序中动态设置下一个审批人比较好,看具体的项目要求吧。至于两者有什么区别,本人并没有太深入了解,有想更好了解的可以查看相关的论坛或者官方文档查看。如果内容有错误的地方,请批评指正,如果有哪里不懂得可以留言和我联系。

时间: 2024-10-13 03:08:30

salesforce 零基础开发入门学习(九)Approval Process 介绍的相关文章

salesforce 零基础开发入门学习(一)Salesforce功能介绍,IDE配置以及资源下载

https://www.cnblogs.com/zero-zyq/p/5275134.html 目前国内已经有很多公司做salesforce,但是国内相关的资料确是少之又少.上个月末跳槽去了新公司,主要做的就是salesforce,不过当时想要看一些相关资料确实比较难.为了避免想要零基础学习的人少走一点弯路,所以整理一下这几天学到的简单的东西,包括登录salesforce后如何操作,如何下载配置IDE等简单入门操作. 一)给大家一些链接方便学习,查找和提问. 1)salesforce开发者官网:

salesforce 零基础开发入门学习(八)数据分页简单制作

本篇介绍通过使用VF自带标签和Apex实现简单的数据翻页功能. 代码上来之前首先简单介绍一下本篇用到的主要知识: 1.ApexPages命名空间 此命名空间下的类用于VF的控制. 主要的类包括但不限于以下: ApexPages.StandardController:当为一个标准Controller定义扩展的时候使用此类.StandardController对象为Salesforce提供的预构建VF的控制器对象引用; ApexPages.Action:使用Action类和方法用于VF自定义控制器和

salesforce 零基础开发入门学习(十二)with sharing 、without sharing 、无声明区别

在salesforce中,声明类大概可以分成三类:分别是可以声明为with sharing,without sharing,以及两者均不声明. 1 public with sharing class A {} 2 3 public without sharing class B{} 4 5 public class C{} 三者区别如下: with sharing:类声明称with sharing类型,则需要走sharing settings中的sharing rules: without sh

salesforce 零基础开发入门学习(二)变量基础知识,集合,表达式,流程控制语句

salesforce如果简单的说可以大概分成两个部分:Apex,VisualForce Page. 其中Apex语言和java很多的语法类似,今天总结的是一些简单的Apex的变量等知识. 有如下几种常用的基本变量Integer,String,Decimal,Double,Long,Boolean,ID. 集合常用的对象:List<T>,Set<T>,Map<T>. 时间日期常用对象:Datetime,Time,Date. 其他:Object,sObject(与数据库相关

salesforce 零基础开发入门学习(七)PickList的value值获取

之前介绍过PickList类型的声明以及赋值,但是如何取出呢?一个sObject对象可以理解为一条数据.通过sObject直接取恐怕很难做到,因为他只会显示一个值.这时候就要用到Schema命名空间中的类与方法以及System命名空间下的Schema类来实现. Schema类 Schema命名空间和Schema类不是同一个概念.Schema类属于System命名空间下,Schema命名空间包含很多类处理Schema元数据信息. Schema类的方法包含schema 信息描述. Schema类主要

salesforce 零基础开发入门学习(十三)salesforce中JSON的使用

JSON作为一种目前流行的轻量级数据交换格式,salesforce也对其有良好的类对其进行封装处理.salesforce中前后台交互时,使用JSON可以将apex的Object对象进行序列化和反序列化. 主要有三个类处理JSON:1.System.JSON;2.System.JSONGenerator;3.System.JSONParser 这些方法如果调用出现错误则抛出JSONException异常. 一) System.JSON 使用JSON类和方法执行往返的序列化和反序列化JSON内容,这

salesforce 零基础开发入门学习(十一)sObject及Schema深入

sObject在salesforce中占有举足轻重的位置,除了在数据库中数据以外,我们还应该关心一下他的元信息.元信息封装在Schema命名空间内. 作为面向对象语言,我们可以畅想一下如果我们是设计人员,应该封装哪些方法.下图为自定义的一个Object. 通过图中的简短描述,我们可以猜测应该封装以下方法: 1.可以获取sObject的label名称,api名称,是否可以访问等; 2.可以获取field的label名称,api名称,字段类型等; 3.如果sObject作为父sObject,可以获取

salesforce 零基础开发入门学习(四)多表关联下的SOQL以及表字段Data type详解

建立好的数据表在数据库中查看有很多方式,本人目前采用以下两种方式查看数据表. 1.采用schema Builder查看表结构以及多表之间的关联关系,可以登录后点击setup在左侧搜索框输入schema Builder 或者build-->schema Builder进入: 2.采用force.com Explorer通过自己写查询语句来查询数据. 此链接为force.com Explorer的下载链接:  http://force-com-explorer-beta.software.infor

20天零基础Linux入门学习到精通视频直播

讲师介绍:老男孩IT教育-李导李老师多年Linux一线实战经验及Linux教学经验,擅长以图形表达讲解抽象概念,善于用 简单易懂的例子讲解重点难点,严肃不失幽默,著有<跟老男孩学Linux三剑客>一书. 本次课程知识点:帮你快速入门linux知识点,让你真正从小白到精通. 本次课程市场价值:599元 报名链接:https://ke.qq.com/course/202854 [课程大纲] 计算机基本组成-Linux服务器硬件基础-linux发展历史 计算机组成简介 服务器核心硬件组成.操作系统组