实现工作流引擎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相关脚本如下:

至此我们已经实现了动态配置任务候选人。


分享到:


相關文章: