Activiti6.0 學習筆記(1)-動態設定任務執行人
最近公司一個管理類專案需要用到流程引擎,技術選型了很久,最終選擇activiti6.0.0.beta3作為本次的流程開發框架。
本次開發週期只有兩個月,團隊內無人對activiti有很深的瞭解,故記錄使用過程中的問題。
本次問題的需求:要求提交報銷資訊後,可以根據提交人的部門資訊、額度資訊等動態設定稽核人;
百度、谷歌了好幾天,找到了不少資料,但是都是activiti 5.x的版本,而activiti 6.0對程式碼進行了重構,所以5.x的版本的方法並不適用。[附上5.x版本中一個比較詳細的例子:http://blog.csdn.net/lovemenghaibin/article/details/50988971 ]
activiti 6.0 對實現動態配置任務節點的完成人有兩種方法:
(1)通過el表示式,在bpmn.xml中設定:
<userTask id="theTask" name="my task" activiti:assignee="${person.id}"/> |
(2)通過程式來控制,實現TaskListener介面,並重寫notify方法,這種方式靈活性比較大,可控性比較強。
在本次需求中,要求根據上一個任務的完成人來確定下一個任務的完成人,網上都是通過查詢出流程所有的節點,然後遞迴比較來查詢下個任務節點(因為要考慮到閘道器的問題),略為複雜;並且activiti 5.x中的ActivityImpl、TaskEntity等類在6.0中都沒有,所以網上找的例子參考價值並不是很大;
琢磨了一天,後面還是決定從資料庫的層面來搞定這個功能,因為activiti 6.0 提供了很強大的資料查詢介面,實現的基本思路是:
(1)在稽核任務上新增一個監聽,監聽稽核任務的【建立(create)】事件;注意:activiti 監聽會在事件執行前完成;
(2)獲取對應的流程例項(ProcessInstance)Id,從歷史中從查詢該任務的上一個任務,並調取相應資訊;
(3)根據上一個任務的資訊,來判斷當前稽核任務需要誰稽核,並設定任務接收人;
public class TaskAsigneeListener implements TaskListener { /** * 複寫TaskListener * */ @Override public void notify(DelegateTask delegateTask) { try { NextTaskUtils taskUtils=new NextTaskUtils(); taskUtils.setTaskAsignee(delegateTask); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
/**
* 設定任務的完成人
* */
public void setTaskAsignee(DelegateTask currTask) {
//獲取例項ID
String processInstanceId= currTask.getProcessInstanceId();
//獲取上面的多個任務
List<HistoricTaskInstance> taskList=historyService.createHistoricTaskInstanceQuery().processInstanceId(processInstanceId).orderByTaskCreateTime().desc().list();
//獲取最後面一個任務,即本任務的上一個任務
HistoricTaskInstance lastTask=taskList.get(0);
//獲取上一個任務的執行人
String lastTaskAsignee=lastTask.getAssignee();
//當前任務
if(lastTaskAsignee!=null&&lastTaskAsignee.equals("zhangsan")) {
currTask.setAssignee("admin");
}else {
currTask.setAssignee("lisi");
}
}
附上activiti 6.0 的使用者手冊:https://www.activiti.org/userguide/--------------------------------------------------------------------------------------------
今天(2018.3.18)測試發現仍有問題,這樣動態設定任務執行人是可以,但是歷史表沒有同步更新,故在歷史表上面新建一個觸發器,來同步更新歷史表中的任務完成人資訊:
BEGIN
UPDATE activiti.act_hi_taskinst SET activiti.act_hi_taskinst.ASSIGNEE_=new.ASSIGNEE_ WHERE activiti.act_hi_taskinst.ID_=new.ID_;
END