
前言
举个例子: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}
至此我们已经实现了动态配置任务候选人。