Activiti6.0整合SpringBoot2.0学习(二)

一、动态设置任务节点处理人(单人)

上一章节讲到使用 ${user} 即可实现任务节点受理人的动态设置,需要注意的是这个受理人需要在前一个节点设置好,不然运行的时候会报错。例如,我们在启动流程的时候就设置下一个任务节点的受理人,如下图所示:

@RequestMapping("singleAssignee")  
public void setSingleAssignee() {  
    //根据bpmn文件部署流程  
    repositoryService.createDeployment().addClasspathResource("singleAssignee.bpmn").deploy();
    // 设置User Task1受理人变量
    Map 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 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 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 画流程图



2.2 后台代码

@RequestMapping("multiAssignee")  
    public void setMultiAssignee() {    
        //根据bpmn文件部署流程  
        repositoryService.createDeployment().addClasspathResource("MultiAssignee.bpmn").deploy();
        // 设置多个处理人变量 这里设置了三个人
        Map variables = new HashMap<>();
        List 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 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 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 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表的数据:

三、学习小结

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源码

你可能感兴趣的:(Java)