上一篇內容是通過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方法進行操作。