天天看點

activiti 工作流_實作工作流引擎Activiti動态配置設定任務候選人前言Activiti動态配置設定任務候選人

activiti 工作流_實作工作流引擎Activiti動态配置設定任務候選人前言Activiti動态配置設定任務候選人

前言

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

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

activiti 工作流_實作工作流引擎Activiti動态配置設定任務候選人前言Activiti動态配置設定任務候選人
在main config中的candidate user中直接指定任務的候選人。

Activiti動态配置設定任務候選人

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

1.變量方式。

2.監聽方式。

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

activiti 工作流_實作工作流引擎Activiti動态配置設定任務候選人前言Activiti動态配置設定任務候選人

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

activiti 工作流_實作工作流引擎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;@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,表字段如下:

activiti 工作流_實作工作流引擎Activiti動态配置設定任務候選人前言Activiti動态配置設定任務候選人

Mapper相關腳本如下:

SELECT ID_, PROCESS_ID, PROCESS_NAME, PROCESS_NODE, CANDIDATE_USERS, CANDIDATE_GROUPS FROM ACT_BIZ_NODEUSER  AND PROCESS_NODE=#{processNode}            

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

繼續閱讀