标签:
在阅读此篇文章前,可以先参考阅读一个前辈总结的关于Approval Process的操作。以下为参考的链接:
http://www.cnblogs.com/mingmingruyuedlut/p/3765777.html
Approval Process用于流程审批,Apex主要涉及到的命名空间和类为Approval命名空间以及System命名空间下的Approval类。
其中Approval命名空间下主要的类为:
下面通过一段代码来进行介绍这些类的作用以及使用方式,此代码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类的父类,提供了四个内置方法:
ProcessRequest封装的方法为最基础的流程审批方法,并且这些方法都是实例化方法。通常新建流程审批的类时并不实例化此类,而是实例化他对应的两个子类。
二)ProcessSubmitRequest
使用此类来提交一条记录到流程审批中,除继承ProcessRequest类方法以外,如下为自身的方法:
通过此类的方法讲解可以看出此类主要用于将一条数据提交到流程审批时使用。
三)ProcessWorkitemRequest
此类用于当一个记录提交到流程审批后,处理一个流程审批的请求,处理的状态可以分为Approve,Reject,Removed三种情况。除继承ProcessRequest类的方法以外,如下为自身的方法:
通过此类的方法介绍可以看出,此类主要用于对已经提交到流程审批的记录进行审批处理时用到的类。
四)ProcessResult
当提交一条记录到流程审批后,可以通过此类来处理流程审批的结果状态。
此类方法如下:
五)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新建一个自定义的审批流程使用比较好,还是在程序中动态设置下一个审批人比较好,看具体的项目要求吧。至于两者有什么区别,本人并没有太深入了解,有想更好了解的可以查看相关的论坛或者官方文档查看。如果内容有错误的地方,请批评指正,如果有哪里不懂得可以留言和我联系。
salesforce 零基础开发入门学习(九)Approval Process 介绍
标签:
原文地址:http://www.cnblogs.com/zero-zyq/p/5344278.html