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。
public class TestApproval {
void submitAndProcessApprovalRequest() {
// Insert an account
Account a = new Account(Name='Test',annualRevenue=100.0);
insert a;
User user1 = [SELECT Id FROM User WHERE Alias='SomeStandardUser'];
// Create an approval request for the account
Approval.ProcessSubmitRequest req1 = new Approval.ProcessSubmitRequest();
req1.setComments('Submitting request for approval.');
req1.setObjectId(a.id);
// Submit on behalf of a specific submitter
req1.setSubmitterId(user1.Id);
// Submit the record to specific process and skip the criteria evaluation
req1.setProcessDefinitionNameOrId('PTO_Request_Process');
req1.setSkipEntryCriteria(true); // Submit the approval request for the account
Approval.ProcessResult result = Approval.process(req1); // Verify the result
System.assert(result.isSuccess());
System.assertEquals( 'Pending', result.getInstanceStatus(), 'Instance Status'+result.getInstanceStatus());
// Approve the submitted request
// First, get the ID of the newly created item
List<Id> newWorkItemIds = result.getNewWorkitemIds();
// Instantiate the new ProcessWorkitemRequest object and populate it
Approval.ProcessWorkitemRequest req2 = new Approval.ProcessWorkitemRequest();
req2.setComments('Approving request.');
req2.setAction('Approve');
req2.setNextApproverIds(new Id[] {UserInfo.getUserId()});
// Use the ID from the newly created item to specify the item to be worked
req2.setWorkitemId(newWorkItemIds.get(0));
// Submit the request for approval
Approval.ProcessResult result2 = Approval.process(req2);
// Verify the results
System.assert(result2.isSuccess(), 'Result Status:'+result2.isSuccess());
System.assertEquals( 'Approved', result2.getInstanceStatus(), 'Instance Status'+result2.getInstanceStatus());
}
}
注:此代码无法直接运行,如果需要运行此代码,请参照上方的链接为Account表设置名为'PTO_Request_Process'的审批流程。
通过上述代码来更好的了解以下的类的使用。
一)ProcessRequest
ProcessRequest类作为ProcessSubmitRequest和ProcessWorkitemRequest类的父类,提供了四个内置方法:
- setComments(comments):此方法用于设置审批提交时的审批意见;
- setNextApproverIds(ID[] nextApproverIds):此方法用于流程审批的下一级审批者;
- getComments():此方法用于获取审批意见;
- getNextApproverIds():返回一个作为审批者的用户的用户ID列表。
ProcessRequest封装的方法为最基础的流程审批方法,并且这些方法都是实例化方法。通常新建流程审批的类时并不实例化此类,而是实例化他对应的两个子类。
二)ProcessSubmitRequest
使用此类来提交一条记录到流程审批中,除继承ProcessRequest类方法以外,如下为自身的方法:
- setObjectId(recordId):设置指定的sObject的记录ID到流程审批中。如上述sample中,insert一条Account,可以将Account提交到审批流程中,比如annualRevenue字段超过多少情况下执行流程审批
- setProcessDefinitionNameOrId(nameOrId):设置流程定义的名称或者编号,记录提交给特定的审批流程。可以在salesforce中通过setup->Create->Workflow&Approvals->Approval Processes设置指定的审批流程,如果设置为null,则遵循标准流程,默认值为null;
- setSkipEntryCriteria(skipEntryCriteria):如果skipEntryCriterial设置为true,请求提交则跳过在setProcessDefinitionNameOrId流程设置中的校验,如果没有指定nameOrId则自动忽略此参数,并且按照标准流程顺序走。如果设置为false,或不调用此方法,则不跳过校验;
- setSubmittedId(userId):设置需要提交到流程审批的记录的用户ID,这个用户必须是在流程定义设置中允许提交流程的一个用户,如果不设置则默认当前用户;
- 相应get方法。
通过此类的方法讲解可以看出此类主要用于将一条数据提交到流程审批时使用。
三)ProcessWorkitemRequest
此类用于当一个记录提交到流程审批后,处理一个流程审批的请求,处理的状态可以分为Approve,Reject,Removed三种情况。除继承ProcessRequest类的方法以外,如下为自身的方法:
- setAction(actionType):设置action类型来处理一个流程审批请求,其中actionType可以为一下的值:Approve,Reject,Removed.其中,只有系统管理员可以指定Removed;
- setWorkitemId(id):设置被批准,拒绝或者移除的审批请求的编号,此编号可以在ProcessInstanceWorkitem表中获取,此表为salesforce自身封装的表;
- 相应的get方法。
通过此类的方法介绍可以看出,此类主要用于对已经提交到流程审批的记录进行审批处理时用到的类。
四)ProcessResult
当提交一条记录到流程审批后,可以通过此类来处理流程审批的结果状态。
此类方法如下:
- getEntityId():获取正在被提交到流程审批的记录的编号,可以在ProcessInstanceWorkitem表中看到,对应于此表的字段TargetObjectId值;
- getErrors():如果发生错误,返回包含数据库对象错误代码和描述的数组;
- getInstanceId():获取流程审批的编号,可以在ProcessInstanceWorkitem表中看到,对应于此表的字段Id值;
- getInstanceStatus():获取流程审批的状态,主要有以下的几种:Approved,Reject,Removed,Pending;
- getNewWorkitemIds():获取提交到流程审批的新项目的ID,可以有0个或者1个流程审批。可以在ProcessInstanceWorkitem表中看到,对应于此表的Id字段值;
- 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()方法设置审批用户编号便可以将审批流程跑通,于是上述代码可以做如下变形便直接跑通:
public class TestApproval {
public void submitAndProcessApprovalRequest() {
// Insert an account
Account a = new Account(Name='Test',annualRevenue=100.0);
insert a;
User user1 = [SELECT Id FROM User WHERE Alias='zero'];
// Create an approval request for the account
Approval.ProcessSubmitRequest req1 = new Approval.ProcessSubmitRequest();
req1.setComments('Submitting request for approval.');
req1.setObjectId(a.id);
// Submit on behalf of a specific submitter
req1.setSubmitterId(user1.Id);
ID[] ids = new ID[]{user1.Id};
req1.setNextApproverIds(ids);
// Submit the record to specific process and skip the criteria evaluation
//req1.setProcessDefinitionNameOrId('PTO_Request_Process');
req1.setSkipEntryCriteria(true); // Submit the approval request for the account
Approval.ProcessResult result = Approval.process(req1); // Verify the result
System.assert(result.isSuccess());
System.assertEquals( 'Pending', result.getInstanceStatus(), 'Instance Status'+result.getInstanceStatus());
// Approve the submitted request
// First, get the ID of the newly created item
List<Id> newWorkItemIds = result.getNewWorkitemIds();
// Instantiate the new ProcessWorkitemRequest object and populate it
Approval.ProcessWorkitemRequest req2 = new Approval.ProcessWorkitemRequest();
req2.setComments('Approving request.');
req2.setAction('Approve');
req2.setNextApproverIds(new Id[] {UserInfo.getUserId()});
// Use the ID from the newly created item to specify the item to be worked
req2.setWorkitemId(newWorkItemIds.get(0));
// Submit the request for approval
Approval.ProcessResult result2 = Approval.process(req2);
// Verify the results
System.assert(result2.isSuccess(), 'Result Status:'+result2.isSuccess());
System.assertEquals( 'Approved', result2.getInstanceStatus(), 'Instance Status'+result2.getInstanceStatus());
}
}
至于在setup->Create->Workflow&Approvals->Approval Processes新建一个自定义的审批流程使用比较好,还是在程序中动态设置下一个审批人比较好,看具体的项目要求吧。至于两者有什么区别,本人并没有太深入了解,有想更好了解的可以查看相关的论坛或者官方文档查看。如果内容有错误的地方,请批评指正,如果有哪里不懂得可以留言和我联系。
salesforce 零基础开发入门学习(九)Approval Process 介绍的更多相关文章
- 【转载】salesforce 零基础开发入门学习(六)简单的数据增删改查页面的构建
salesforce 零基础开发入门学习(六)简单的数据增删改查页面的构建 VisualForce封装了很多的标签用来进行页面设计,本篇主要讲述简单的页面增删改查.使用的内容和设计到前台页面使用的 ...
- 【转载】salesforce 零基础开发入门学习(五)异步进程介绍与数据批处理Batchable
salesforce 零基础开发入门学习(五)异步进程介绍与数据批处理Batchable 本篇知识参考:https://developer.salesforce.com/trailhead/for ...
- 【转载】salesforce 零基础开发入门学习(四)多表关联下的SOQL以及表字段Data type详解
salesforce 零基础开发入门学习(四)多表关联下的SOQL以及表字段Data type详解 建立好的数据表在数据库中查看有很多方式,本人目前采用以下两种方式查看数据表. 1.采用schem ...
- 【转载】salesforce 零基础开发入门学习(三)sObject简单介绍以及简单DML操作(SOQL)
salesforce 零基础开发入门学习(三)sObject简单介绍以及简单DML操作(SOQL) salesforce中对于数据库操作和JAVA等语言对于数据库操作是有一定区别的.salesfo ...
- 【转载】salesforce 零基础开发入门学习(二)变量基础知识,集合,表达式,流程控制语句
salesforce 零基础开发入门学习(二)变量基础知识,集合,表达式,流程控制语句 salesforce如果简单的说可以大概分成两个部分:Apex,VisualForce Page. 其中Apex ...
- 【转载】salesforce 零基础开发入门学习(一)Salesforce功能介绍,IDE配置以及资源下载
salesforce 零基础开发入门学习(一)Salesforce功能介绍,IDE配置以及资源下载 目前国内已经有很多公司做salesforce,但是国内相关的资料确是少之又少.上个月末跳槽去了新 ...
- salesforce 零基础开发入门学习(一)Salesforce功能介绍,IDE配置以及资源下载
目前国内已经有很多公司做salesforce,但是国内相关的资料确是少之又少.上个月末跳槽去了新公司,主要做的就是salesforce,不过当时想要看一些相关资料确实比较难.为了避免想要零基础学习的人 ...
- salesforce 零基础开发入门学习(三)sObject简单介绍以及简单DML操作(SOQL)
salesforce中对于数据库操作和JAVA等语言对于数据库操作是有一定区别的.salesforce中的数据库使用的是Force.com 平台的数据库,数据表一行数据可以理解成一个sObject变量 ...
- salesforce 零基础开发入门学习(十五)salesforce中formula的使用(不含Date/Time)
本文参考官方的formula介绍PDF:https://resources.docs.salesforce.com/200/latest/en-us/sfdc/pdf/salesforce_usefu ...
随机推荐
- Fire
Fire 分析: 首先,明确题意:b1,b2,--,bn 交换为b2,--,bn,b1,但这并不是意味着只能从b1开始交换,(这点从样例中可以看出),并且也不意味着交换的必须是连续的一串,可以是几个单 ...
- Win7 64位 VS2013环境编译Squirrel 3.0.7
Squirrel是一个类似Lua,但是更面向对象的脚本语言. 国内这个介绍很少,环境配置更是没有任何文章提到,花了点时间搞定了,备忘记录下过程. 首先是下载,写本文时Squirrel最新版本为3.0. ...
- XML解析工具类
public class XmlUtil { /* * 利用dom4j解析xml文件内容,并返回map数据形式 * path是.xml文件所在的路径 */ public static Map<S ...
- mysql 函数(二)
1.space(N) 输出空格 SELECT SPACE(5); -> ' ' 2.replace(str,from_str,to_str) 讲str中的from_str 替换成to_s ...
- 深度解析Java8 – AbstractQueuedSynchronizer的实现分析(上)
本文首发在infoQ :www.infoq.com/cn/articles/jdk1.8-abstractqueuedsynchronizer 前言: Java中的FutureTask作为可异步执行任 ...
- MongoDB学习笔记-01 简介、安装
MongoDB简介 MongoDB是一种强大.灵活.可拓展的存储方式.是一个面向文档(相当于"行"的概念)的数据库. 可拓展:通过添加服务器而增加存储量. Windows下安装 版 ...
- 搭建一个SSH项目框架的步骤
1.导入jar包(38个) 2.配置文件 applicationContext,xml (beans.xml) (数据源.LocalSessionFactoryBean.事务管理器.事务通知.AOP切 ...
- Java-ios推送
之前做的消息推送,向Android和ios客户端推送.这里只说ios的推送,ios的推送最后都会推送到苹果的APNS服务器上,再有APNS服务器推送到ios设备上.因为考虑到这一点,第一版的消息推送苹 ...
- STL学习
//vector的使用 //相当于数组,常用的 添加 删除 清空 测长 操作 #include<iostream> #include<algorithm> #include&l ...
- 基于ejbca构建独立ca系统
ejbca,是一个CA(Certificate Authority)系统软件,CA是数字证书认证中心的简称,主要功能是管理数字证书,包括证书的颁发.销毁.更新等,ejbca实现了CA规范,因此可以用来 ...