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

前言

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

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


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


Activiti動態分配任務候選人

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

1.變量方式。

2.監聽方式。

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


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



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,表字段如下:


Mapper相關腳本如下:

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