此貼是轉載,並不是原創,原創地址 http://www.javashuo.com/article/p-ntqhmnhj-du.htmlhtml
上一篇內容是經過Process Builder(進程生成器)和Approval Processes(批准過程)實現鎖定記錄的功能,有的時候,每每鎖定一條記錄須要不少的限制條件,若是經過Approval Processes(批准過程)的條件判斷寫起來可能很麻煩,有些邏輯經過Apex寫起來很容易,此篇內容爲經過Process Builder(進程生成器)和Apex代碼實現鎖定記錄。ui
需求:對Opportunity表進行判斷是否加鎖或者解鎖。當Delivery/Installation Status這一項的值爲'Completed'狀況下加鎖,爲其餘的值狀況下,若是原來記錄加鎖,則解鎖。spa
一.獲取容許在apex中使用Lock(鎖上)和UnLock(解鎖)記錄的權限:Setup(設置)->Create(建立)->Workflow&Approvals(工做流和批准)->Process Automation Settings(流程自動設置)。點進去將Enable record locking and unlocking in Apex(在 Apex 中啓用記錄鎖定和解鎖)這一項選中並保存。debug
二.Apex代碼實現加鎖解鎖3d
寫代碼以前咱們須要先了解一些基礎知識。當咱們使用Process Builder(進程生成器)選擇Action(操做)爲Apex的時候,咱們須要選擇相關Action(操做)執行的類,此類中的方法必需要是InvocableMethod的一個方法,即須要添加@InvocableMethod註解。一個類中僅容許有一個此註解的方法。code
加鎖的類以下所示:htm
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(進程生成器)blog
1.Setup(設置)->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(解鎖)方法進行操做。