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方法進行操作。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM