一、概念
-
我们在开发的时候,有一种情况是这样的,
我们有一个任务,可以让多个用户中的任何一个人办理即可,比如某个审批任务,
张三,李四,王五他们中的任何一人办理下都行,这时候,我们用到多用户任务分配。
1.1 方式一:直接流程图配置中写死
- 查看任务的时候需要如下
/** * 查看任务 */ @Test public void findTask(){ List<Task> taskList=processEngine.getTaskService() // 任务相关Service .createTaskQuery() // 创建任务查询 //.taskAssignee("李四") // 指定某个人 .taskCandidateUser("张三") // 候选人查询 .list(); for(Task task:taskList){ System.out.println("任务ID:"+task.getId()); System.out.println("任务名称:"+task.getName()); System.out.println("任务创建时间:"+task.getCreateTime()); System.out.println("任务委派人:"+task.getAssignee()); System.out.println("流程实例ID:"+task.getProcessInstanceId()); } }
- 启动流程后,任务表中的ASSIGNEE_为空
- 身份联系表如下图,可知在流程图里配置的用户 全是参与者participant,然后还有一份候选人candidate,候选人绑定任务id,参与者绑定流程实例ID,这里我们可以通过Activiti的接口来增加或者减少候选人
- 我们用张三,李四,王五中的任何一人,都能查询到任务,最后任何一人完整任务即可;
1.2 方式二:使用流程变量
- 启动流程的时候设置流程变量的值,其他的和上面一样
/** * 启动流程实例 */ @Test public void start(){ Map<String,Object> variables=new HashMap<String,Object>(); variables.put("userIds", "张三,李四,王五"); ProcessInstance pi=processEngine.getRuntimeService() // 运行时Service .startProcessInstanceByKey("multiUserProcess2",variables); // 流程定义表的KEY字段值 System.out.println("流程实例ID:"+pi.getId()); System.out.println("流程定义ID:"+pi.getProcessDefinitionId()); }
1.3 分配方式三 TaskListener监听实现
- 定义一个监听类 MyTaskListener 实现 TaskListener接口
public class MyTaskListener implements TaskListener{ /** * */ private static final long serialVersionUID = 1L; public void notify(DelegateTask delegateTask) { // TODO Auto-generated method stub delegateTask.addCandidateUser("张三"); delegateTask.addCandidateUser("李四"); delegateTask.addCandidateUser("王五"); } }
- 画流程图