
前言
舉個例子: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;@Autowiredprivate INodeDao nodeDao;@Overridepublic 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相關腳本如下:
SELECT ID_, PROCESS_ID, PROCESS_NAME, PROCESS_NODE, CANDIDATE_USERS, CANDIDATE_GROUPS FROM ACT_BIZ_NODEUSER AND PROCESS_NODE=#{processNode}
至此我們已經實作了動态配置任務候選人。