對於審批流中,通過apex代碼進行審批操作一般都需要獲取當前記錄對應的ProcessInstanceWorkitem或者ProcessInstanceStep然后執行Approval.process操作。曾幾何時,一直很狹隘的以為ProcessInstanceWorkItem和ProcessInstanceStep差距很小,差距僅在於ProcessInstanceWorkItem存儲的是審批流的最新的一條,ProcessInstanceStep存儲的是所有的審批步驟。其實這個理解是有一些偏差的。
一. ProcessInstanceWorkItem
文檔上ProcessInstanceWorkItem的解釋為 代表一個用戶的Pending的審批請求。我們知道,審批的情況除了Pending以外還有很多的狀態,比如Approved, Fault, Held, NoResponse, Pending, Reassigned, Rejected,Removed,Started.這些狀態中,只有Pending的狀態下才會在ProcessInstanceWorkItem保留記錄,其他情況下記錄會刪除。因為ProcessInstanceWorkItem只存在Pending狀態,所以ProcessInstanceWorkItem表沒有Status字段,有的情況下就比較多余了。
ProcessInstanceWorkItem相關的查詢:
1.直接查詢 : SELECT CreatedById, CreatedDate, OriginalActorId, IsDeleted, ActorId, SystemModstamp, ProcessInstanceId, Id FROM ProcessInstanceWorkitem
2.通過ProcessInstance進行子查詢: SELECT Id, (SELECT Id, ActorId, ProcessInstanceId FROM Workitems) FROM ProcessInstance
二.ProcessInstanceStep
ProcessInstnceStep為當審批流進行下一步動作的時候便會生成記錄,不像ProcessInstanceWorkitem,它記錄着所有經歷過的步驟以及每個步驟的意見,所以其擁有Status字段用來記錄審批的各個狀態和comments記錄審批意見。
1.直接查詢:SELECT ActorId, Comments, CreatedById, CreatedDate, OriginalActorId, ProcessInstanceId, Id, StepStatus, SystemModstamp FROM ProcessInstanceStep
2.通過ProcessInstance進行子查詢:SELECT Id, (SELECT Id, StepStatus, Comments FROM Steps) FROM ProcessInstance
三.ProcessInstanceHistory
有時候我們需要獲取審批的歷史信息,用來進行相關審批節點的展示。這個時候我們就可以使用ProcessInstanceHistory。ProcessInstanceHistory是salesforce提供的一個只讀的,將ProcessInstanceWorkItem和ProcessInstanceStep結果結合在一起的審批歷史表,通常情況下搜索時建議使用子查詢方式查詢。
通過ProcessInstance進行子查詢:SELECT Id, (SELECT Id, StepStatus, Comments FROM StepsAndWorkitems) FROM ProcessInstance
四.關於審批流
我們在配置審批流的時候,會配置當節點審批通過或者失敗時的操作,比如更新字段或者發郵件等等操作。如果執行了更新的字段操作,觸發了此對象的trigger的時候。在trigger里面如果要是獲取審批狀態有可能獲取不到,因為ProcessInstanceStep或者ProcessInstanceWorkItem是異步生成的。在執行trigger的時候,有可能沒有生成,所以在trigger里面不要寫關於此條記錄的審批狀態等操作。
總結:如果針對正常的審批操作,可以使用ProcessInstanceWorkItem或者ProcessInstanceStep進行操作。針對查詢歷史,使用ProcessInstanceHistory。篇中有錯誤的地方歡迎指出,有問題歡迎留言。