1. 程式人生 > >Activiti6.0 學習筆記(1)-動態設定任務執行人

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