salesforce 零基础学习(三十六)通过Process Builder以及Apex代码实现锁定记录( Lock Record)

上一篇内容是通过Process Builder和Approval Processes实现锁定记录的功能,有的时候,往往锁定一条记录需要很多的限制条件,如果通过Approval Processes的条件判断写起来可能很麻烦,有些逻辑通过Apex写起来很容易,此篇内容为通过Process Builder 和Apex代码实现锁定记录。

需求:对Opportunity表进行判断是否加锁或者解锁。当Delivery/Installation Status这一项的值为'Completed'情况下加锁,为其他的值情况下,如果原来记录加锁,则解锁。

一.获取允许在apex中使用Lock 和UnLock记录的权限:Setup->Build->Create->Workflow&Approvals->Process Automation Settings。点进去将Enable record locking and unlocking in Apex这一项选中。

二.Apex代码实现加锁解锁

写代码之前我们需要先了解一些基础知识。当我们使用Process Builder选择Action为Apex的时候,我们需要选择相关Action执行的类,此类中的方法必须要是InvocableMethod的一个方法,即需要添加@InvocableMethod注解。一个类中仅允许有一个此注解的方法。

加锁的类如下所示:

 1 public class RecordLockController {
 2     @InvocableMethod(label='Lock Opportunities' description='Lock opportunities and return the record ids') 
 3     public static List<Id> lockRecord(List<Id> opportunityIds) {
 4         system.debug('=========opportunityIds=======' + opportunityIds);
 5         system.debug('---------userName-------' + UserInfo.getUserName());
 6         List<ID> alreadyLockedList = new List<ID>();
 7         Map<Id,Boolean> isLockedMap = Approval.isLocked(opportunityIds);
 8         for(Id currentOpportunityId : opportunityIds) {
 9             Boolean isCurrentOpportunityLocked = isLockedMap.get(currentOpportunityId) == null ? false : isLockedMap.get(currentOpportunityId);
10             if(!isCurrentOpportunityLocked) {
11                 Approval.LockResult lockResult = Approval.lock(currentOpportunityId);
12                 if(lockResult.isSuccess()) {
13                     alreadyLockedList.add(currentOpportunityId);
14                 } else {
15                     for(Database.Error error : lockResult.getErrors()) {
16                         System.debug('error message : ' + error.getMessage());
17                     }
18                 }
19             }
20         }
21         system.debug(alreadyLockedList);
22         return alreadyLockedList;
23     }
24     
25     
26 }

解锁的类如下所示

 1 public class UnLockRecordController {
 2     @InvocableMethod(label='UnLock Opportunities' description='UnLock Opportunities and return the record ids')
 3     public static List<ID> unlockRecords(List<ID> opportunityIds) {
 4         system.debug('=========opportunityIds=======' + opportunityIds);
 5         system.debug('---------userName-------' + UserInfo.getUserName());
 6         List<ID> alreadyUnLockedList = new List<ID>();
 7         Map<Id,Boolean> isLockedMap = Approval.isLocked(opportunityIds);
 8         for(Id currentOpportunityId : opportunityIds) {
 9             Boolean isCurrentOpportunityLocked = isLockedMap.get(currentOpportunityId) == null ? false : isLockedMap.get(currentOpportunityId);
10             if(isCurrentOpportunityLocked) {
11                 Approval.UnLockResult unLockResult = Approval.unlock(currentOpportunityId);
12                 if(unLockResult.isSuccess()) {
13                     alreadyUnLockedList.add(currentOpportunityId);
14                 } else {
15                     for(Database.Error error : unLockResult.getErrors()) {
16                         System.debug('error message : ' + error.getMessage());
17                     }
18                 }
19             }
20         }
21         system.debug(alreadyUnLockedList);
22         return alreadyUnLockedList;
23     }
24 }

三.设置Process Builder

1.Setup->Build->Create->Workflow&Approvals->Process Builder.点击进入后选择右上方的new

2.设置相关信息名称

3.选择要操作的Object,这里选择Opportunity

4.设置锁定的条件

5.设置加锁条件所走的Action,我们在Action Type选择Apex代码,并选择相关操作的类,并且要传递参数,程序中传的是ID,这里我们选择Opportunity的ID

6.在FALSE下添加解锁条件

7.添加解锁的Action,选择Apex,选择执行此Action的Apex Class,添加参数,点击save以后点击右上方activate将其激活。

总结:此篇内容仅仅通过很简单的业务逻辑进行加锁解锁,如果业务逻辑复杂,可以自行添加,如果内容有不对的地方欢迎指正,如果有不懂的地方欢迎留言。

如果想通过Permission Set来判断是否可以加锁解锁,也可以设置一个自定义的button,button调用apex代码,代码中通过permission set来判断是否拥有加锁解锁权限,如果拥有此权限则可以通过Approval的lock或者unlock方法进行操作。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CodingToDie

百篇(5):FeignClient 在不同场景中的应用

FeignClient 使用 为了测试方便,这里提供四个项目 user-server user-server-api spring-boot-feign spr...

1.9K5
来自专栏阿杜的世界

ThreadLocal的使用场景

最近项目中遇到如下的场景:在执行数据迁移时,需要按照用户粒度加锁,因此考虑使用排他锁,迁移工具和业务服务属于两个服务,因此需要使用分布式锁。

622
来自专栏battcn

一起学并发编程 - 利用观察者模式监听线程状态

在Java多线程下,我们需要知道当前执行线程的状态是什么比如 运行, 关闭, 异常等状态的通知,而且不仅仅是更新当前页面。

441
来自专栏Golang语言社区

多线程编程10个例子--1

留个纪念,不错的总结。十个例子清晰列举啦多线程编程的奥妙。 VC中多线程使用比较广泛而且实用,在网上看到的教程.感觉写的挺好. 一、问题的提出 编写一个耗时的...

3155
来自专栏分布式系统进阶

ReplicaManager源码解析1-消息同步线程管理

基本上就是作三件事: 构造FetchRequest, 同步发送FetchRequest并接收FetchResponse, 处理FetchResponse, 这三...

872
来自专栏菩提树下的杨过

DateTime在ExtJs中无法正确序列化的问题

这几天在学习ExtJs + Wcf的过程中,发现一个问题,如果Class中有成员的类型为DateTime,即使我们正常标识了[DataMember],序列化成J...

16810
来自专栏JackieZheng

Spring集成RabbitMQ-必须知道的几个概念

上篇《Spring集成RabbiMQ-Spring AMQP新特性》我们了解了最新spring-rabbit的2.0.0.M5版本相较于之前有哪些变化。其实使用...

34210
来自专栏Java学习网

常见的 Java 错误及避免方法之第五集(每集10个错误后续持续发布)

当输入期间意外终止文件或流时,将抛出“EOFException”。 以下是抛出EOFException异常的一个示例,来自JavaBeat应用程序:

623
来自专栏岑玉海

Spark源码系列(三)作业运行过程

作业执行 上一章讲了RDD的转换,但是没讲作业的运行,它和Driver Program的关系是啥,和RDD的关系是啥? 官方给的例子里面,一执行collect方...

2764
来自专栏木宛城主

Unity应用架构设计(1)—— MVVM 模式的设计和实施(Part 1)

初识 MVVM 谈起 MVVM 设计模式,可能第一映像你会想到 WPF/Sliverlight,他们提供了的数据绑定(Data Binding),命令(Comm...

2656

扫码关注云+社区