實現工作流引擎Activiti動態分配任務候選人

實現工作流引擎Activiti動態分配任務候選人

前言

舉個例子:HR的請假審批流程,HR崗位人事變動,今天是A用戶審批,明天可能要換成B用戶審批。

傳統的方式我們都是在流程中將用戶寫死,這種寫法變更流程用戶變動需要重新部署流程,如圖:


實現工作流引擎Activiti動態分配任務候選人

在main config中的candidate user中直接指定任務的候選人。


Activiti動態分配任務候選人

在activiti中任務候選人動態指定有兩種方式:

1.變量方式。

2.監聽方式。

這裡我們主要介紹監聽方式,在eslipse中activiti插件,選擇需要動態配置候選人的流程節點,選擇Listeners項,相關配置如下:


實現工作流引擎Activiti動態分配任務候選人

動態監聽指定這裡介紹兩種方式:


實現工作流引擎Activiti動態分配任務候選人


1.Java Class:

這種方式直接選擇我們的對應監聽類,注意該方式監聽類中無法實現spring beans的注入。

2.Delegate expression

delegateExpression是引用一個JavaDelegate實現bean,具體的操作在這個bean中定義,該方式可以實現spring beans的注入。

java代碼中監聽配置如下:

流程啟動後會自動進入TaskListener監聽查找下一個節點的候選人,我們根據當前流程節點Id查詢流程配置表相關候選人或候選人組,實現動態分配。

注意:@Service("actProcessListener")要與監聽delegateExpression對應。

@Service("actProcessListener")
public class ActProcessListener implements TaskListener {

	/**流程監聽成員變量*/
	private FixedValue processCode;

	@Autowired
	private INodeDao nodeDao;
	
	@Override
	public void notify(DelegateTask delegateTask) {
		String process = String.valueOf(processCode.getValue(delegateTask));
		MySlf4j.textInfo("進入{0}流程節點,當前任務Id:{1}監聽.....", process, delegateTask.getId());
		//根據節點名稱獲取候選人
		List nodeBeans = nodeDao.queryNodeByProcessNode(process);
		for (NodeBean nodeBean : nodeBeans) {
			String candidateUsers = nodeBean.getCandidateUsers();
			String candidateGroups = nodeBean.getCandidateGroups();
			if (!StringUtils.isEmpty(candidateUsers)) {
				String[] users = candidateUsers.split(",");
				for (String userName : users) {
					delegateTask.addCandidateUser(userName);
				}
			}
			if (!StringUtils.isEmpty(candidateGroups)) {
				String[] groups = candidateGroups.split(",");
				for (String groupName : groups) {
					delegateTask.addCandidateGroup(groupName);
				}
			}
		}
	}
}

動態監聽我們是通過建立一張配置表實現:ACT_RE_CONFIG,表字段如下:


實現工作流引擎Activiti動態分配任務候選人

Mapper相關腳本如下:

至此我們已經實現了動態配置任務候選人。


分享到:


相關文章: