在阅读此篇文章前,可以先参考阅读一个前辈总结的关于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类的父类,提供了四个内置方法:

  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()方法设置审批用户编号便可以将审批流程跑通,于是上述代码可以做如下变形便直接跑通:

 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 介绍的更多相关文章

  1. 【转载】salesforce 零基础开发入门学习(六)简单的数据增删改查页面的构建

    salesforce 零基础开发入门学习(六)简单的数据增删改查页面的构建   VisualForce封装了很多的标签用来进行页面设计,本篇主要讲述简单的页面增删改查.使用的内容和设计到前台页面使用的 ...

  2. 【转载】salesforce 零基础开发入门学习(五)异步进程介绍与数据批处理Batchable

    salesforce 零基础开发入门学习(五)异步进程介绍与数据批处理Batchable   本篇知识参考:https://developer.salesforce.com/trailhead/for ...

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

    salesforce 零基础开发入门学习(四)多表关联下的SOQL以及表字段Data type详解   建立好的数据表在数据库中查看有很多方式,本人目前采用以下两种方式查看数据表. 1.采用schem ...

  4. 【转载】salesforce 零基础开发入门学习(三)sObject简单介绍以及简单DML操作(SOQL)

    salesforce 零基础开发入门学习(三)sObject简单介绍以及简单DML操作(SOQL)   salesforce中对于数据库操作和JAVA等语言对于数据库操作是有一定区别的.salesfo ...

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

    salesforce 零基础开发入门学习(二)变量基础知识,集合,表达式,流程控制语句 salesforce如果简单的说可以大概分成两个部分:Apex,VisualForce Page. 其中Apex ...

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

    salesforce 零基础开发入门学习(一)Salesforce功能介绍,IDE配置以及资源下载   目前国内已经有很多公司做salesforce,但是国内相关的资料确是少之又少.上个月末跳槽去了新 ...

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

    目前国内已经有很多公司做salesforce,但是国内相关的资料确是少之又少.上个月末跳槽去了新公司,主要做的就是salesforce,不过当时想要看一些相关资料确实比较难.为了避免想要零基础学习的人 ...

  8. salesforce 零基础开发入门学习(三)sObject简单介绍以及简单DML操作(SOQL)

    salesforce中对于数据库操作和JAVA等语言对于数据库操作是有一定区别的.salesforce中的数据库使用的是Force.com 平台的数据库,数据表一行数据可以理解成一个sObject变量 ...

  9. salesforce 零基础开发入门学习(十五)salesforce中formula的使用(不含Date/Time)

    本文参考官方的formula介绍PDF:https://resources.docs.salesforce.com/200/latest/en-us/sfdc/pdf/salesforce_usefu ...

随机推荐

  1. MAC PRO 的网关在哪里

    mac pro的网关就是路由器地址. 1.路由器在系统偏好设置里 2.双击点开此图标 选中1.然后点击高级设置 3.选中TCP/IP,然后查看自己的路由器后边的数字,就是你的mac网关号 4.IPV4 ...

  2. css3简单的图片轮播

    <style> @-webkit-keyframes move{ %{left:0px;} %{left:-500px;} } #wrap{ width:500px; height:100 ...

  3. ruby 学习笔记 1

    写ruby blog  系统的记录下.也是对我学ruby的点滴记录. 先介绍下我的学习环境.系统:ubuntu12.04文档:techotopia ,ruby文档,the hard way learn ...

  4. Java日志系统及框架分析

    最近在考虑将容器(Tomcat)内的应用日志统一成slf4j + logback,主要目的有: 快速定位应用日志输出路径,方便日志的采集: 能动态调整日志的级别,方便线上问题定位: 方便在容器层面做扩 ...

  5. C# GetHashCode与Equals在HashTable表查找时的关系

    using System; using System.Collections.Generic; using System.Text; using Microsoft.Win32; using Syst ...

  6. MVVM 在使用 ItemsSource 之前,项集合必须为空

    今天在做ListBox和Combobox绑定的时候,都出现过“在使用 ItemsSource 之前,项集合必须为空”的错误. Combobox比较简单,代码如下: <ComboBox x:Nam ...

  7. JavaScript 笔记

    function (函数)document(文档 get获得文档中..) <script type="text/javascript"> function yz(){ ...

  8. MyBatis 查询记录时日期字段没有时分秒

    今天发现如果表里面的字段为Date类型时,程序查询出来的数据只有年月日 搜索了下,发现在resultMap里面把这个字段的jdbcType原先为Date,改为Timestamp就行了. 确实可以.

  9. linux redmine 搭建

    redmine搭建过程参考:http://www.tuicool.com/articles/InMbym 注意事项: 配置文件必须以2个空格开始 启动(指定了端口,和绑定的IP): ruby bin/ ...

  10. ubuntu共享文件配置

    目标:实现windows和linux混合组成的操作 系统中可以共享文件,并可以通过机器名互相访问 安装文件共享服务 0.更改本机主机名,修改 /etc/hostname文件和/etc/hosts文件中 ...