慚愧慚愧,這麼一個小小的功能整了這麼久。java
仍是先說一下業務場景吧。在工做流中,咱們不免會遇到這樣的狀況,即一個流程的發起者的身份問題。舉個詳細的例子。就拿一個公司的報銷流程來說。多是這樣的。git
沒有優化過的流程圖(實在不想畫了,太費勁了)github
優化過的流程圖express
怎麼樣?看起來是否是清爽了不少?那怎麼執行呢?首先,這篇說的是SkipExpression,因此審批不經過的駁回不在這篇說。ide
流程啓動以後,第一個任務節點就是發起任務的節點。測試
在後續任務中加入一個跳過表達式,好比說表明當前用戶的職責組編號:${execution.getVariable('gId')==2}優化
以後就能夠部署流程圖了。在任務進行的途中將當前處理人的身份組ID以流程變量的形式設置進流程,這樣就能夠作到任務執行到當前任務時自動跳過任務了。嗯。理想是美好的,現實是骨感的,WTF!!!Skip Expression居然沒有工做????設計
哎,上面的想法是好的,由於看到了Skip Expression,顧名思義,就是跳過表達式的意思嘛,怎麼就不起做用呢?好在在github中下載了一份源碼來看。code
在源碼的測試方法中能夠看到在設置流程變量前先設置了一個這東西:**_ACTIVITI_SKIP_EXPRESSION_ENABLED**blog
什麼玩意???Activiti 跳過 表達式 開啓?咦,英語還湊合哈,對就是啓用跳過表達式模式。那麼問題又來了。怎麼呢??這麼多的任務節點,你讓我每次都去加這麼一句流程變量麼??!!鬧呢??別急,我是這樣作的。
import com.edu.hart.modules.constant.ActivitiConstanct; import org.activiti.engine.delegate.DelegateExecution; import org.activiti.engine.delegate.ExecutionListener; import java.util.Map; /** * 任務跳過監聽器 * <p> * create by 葉雲軒 at 2017/12/26 - 16:03 * contact by ycountjavaxuan@outlook.com */ public class SkipListenner implements ExecutionListener { /** * 序列化 */ private static final long serialVersionUID = 3599293834301636975L; @Override public void notify(DelegateExecution execution) { // 獲取流程變量 Map<String, Object> variables = execution.getVariables(); // 開啓支持跳過表達式 ActivitiConstanct.getSkipExpression()就是"_ACTIVITI_SKIP_EXPRESSION_ENABLED" variables.put(ActivitiConstanct.getSkipExpression(), true); // 將修改同步到流程中 execution.setTransientVariables(variables); // 這種方式也行。直接設置流程變量 // execution.setVariable(ActivitiConstanct.getSkipExpression(),true); } }
以後在process的properties中設置Listeners
這樣就能夠了,親測可行的哦~~~~
1. 看源碼不認真,注意到_ACTIVITI_SKIP_EXPRESSION_ENABLED了可是沒有用,就去測試了。最後結果不行,又來看源碼。浪費時間。 2. Activiti仍是很好用的~~~~ 3. 下章寫駁回的實現邏輯,完成任意節點的駁回,即去掉全部的審批網關。精簡設計和開發。