一、动态设置任务节点处理人(单人)
上一章节讲到使用 ${user} 即可实现任务节点受理人的动态设置,需要注意的是这个受理人需要在前一个节点设置好,不然运行的时候会报错。例如,我们在启动流程的时候就设置下一个任务节点的受理人,如下图所示:
流程图
任务节点配置
@RequestMapping("singleAssignee")
public void setSingleAssignee() {
//根据bpmn文件部署流程
repositoryService.createDeployment().addClasspathResource("singleAssignee.bpmn").deploy();
// 设置User Task1受理人变量
Map<String, Object> variables = new HashMap<>();
variables.put("user1", "007");
//采用key来启动流程定义并设置流程变量,返回流程实例
ProcessInstance pi = runtimeService.startProcessInstanceByKey("singleAssignee", variables);
String processId = pi.getId();
System.out.println("流程创建成功,当前流程实例ID:"+processId);
// 注意 这里需要拿007来查询,key-value需要拿value来获取任务
List<Task> list = taskService.createTaskQuery().taskAssignee("007").list();
if(list!=null && list.size()>0){
for(org.activiti.engine.task.Task task:list){
System.out.println("任务ID:"+task.getId());
System.out.println("任务的办理人:"+task.getAssignee());
System.out.println("任务名称:"+task.getName());
System.out.println("任务的创建时间:"+task.getCreateTime());
System.out.println("流程实例ID:"+task.getProcessInstanceId());
System.out.println("##################################");
}
}
// 设置User Task2的受理人变量
Map<String, Object> variables1 = new HashMap<>();
variables1.put("user2", "Kevin");
// 因为007只有一个代办的任务,直接完成任务,并赋值下一个节点的受理人user2为Kevin办理
taskService.complete(list.get(0).getId(), variables1);
System.out.println("User Task1被完成了,此时流程已流转到User Task2");
}
运行程序,浏览器访问: http://localhost:8080/activiti/singleAssignee
结果如下所示:
二、动态设置任务节点处理人(多人)
当你的业务需要用到多个人同时处理一个任务,并且需要判断他们是否全部或者部分人处理了任务,才能跳到下一个任务节点时,就需用到此技术。
2.1 画流程图
多个处理人流程图Main config信息
多实例属性配置
2.2 后台代码
@RequestMapping("multiAssignee")
public void setMultiAssignee() {
//根据bpmn文件部署流程
repositoryService.createDeployment().addClasspathResource("MultiAssignee.bpmn").deploy();
// 设置多个处理人变量 这里设置了三个人
Map<String, Object> variables = new HashMap<>();
List<String> userList = new ArrayList<>();
userList.add("user1");
userList.add("user2");
userList.add("user3");
variables.put("userList", userList);
//采用key来启动流程定义并设置流程变量,返回流程实例
ProcessInstance pi = runtimeService.startProcessInstanceByKey("multiAssigneeProcess", variables);
String processId = pi.getId();
System.out.println("流程创建成功,当前流程实例ID:"+processId);
// 查看user1的任务
List<Task> list = taskService.createTaskQuery().taskAssignee("user1").list();
if(list!=null && list.size()>0){
for(org.activiti.engine.task.Task task:list){
System.out.println("任务ID:"+task.getId());
System.out.println("任务的办理人:"+task.getAssignee());
System.out.println("任务名称:"+task.getName());
System.out.println("任务的创建时间:"+task.getCreateTime());
System.out.println("流程实例ID:"+task.getProcessInstanceId());
System.out.println("#######################################");
}
}
// 查看user2的任务
List<Task> list2 = taskService.createTaskQuery().taskAssignee("user2").list();
if(list2!=null && list2.size()>0){
for(org.activiti.engine.task.Task task:list2){
System.out.println("任务ID:"+task.getId());
System.out.println("任务的办理人:"+task.getAssignee());
System.out.println("任务名称:"+task.getName());
System.out.println("任务的创建时间:"+task.getCreateTime());
System.out.println("流程实例ID:"+task.getProcessInstanceId());
System.out.println("#######################################");
}
}
// 查看user3的任务
List<Task> list3 = taskService.createTaskQuery().taskAssignee("user3").list();
if(list3!=null && list3.size()>0){
for(org.activiti.engine.task.Task task:list3){
System.out.println("任务ID:"+task.getId());
System.out.println("任务的办理人:"+task.getAssignee());
System.out.println("任务名称:"+task.getName());
System.out.println("任务的创建时间:"+task.getCreateTime());
System.out.println("流程实例ID:"+task.getProcessInstanceId());
System.out.println("#######################################");
}
}
}
运行程序,浏览器访问: http://localhost:8080/activiti/multiAssignee
结果如下所示:
数据库的ACT_RU_TASK表的数据:
ACT_RU_TASK表数据
三、学习小结
1、实际开发的时候通常会将流程实例id(PROC_INST_ID)字段的值设置到业务表中,虽然存在冗余,但是方便业务和流程关联查找。
2、任务处理人动态设置的时候使用${user},里面的user在后台设置值的时候必须为String,否则会报错!!!
3、多人处理的时候需要设置当前节点的Multi instance的属性,一定要设置完成条件,具体配置可以参考上文图“多实例属性配置”;在设置变量时需设置的key为Collection中${userList}的userList,value为List集合!
Map<String, Object> variables = new HashMap<>();
List<String> userList = new ArrayList<>();
userList.add("user1");
userList.add("user2");
userList.add("user3");
variables.put("userList", userList);
github地址:github源码
网友评论