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

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

上一章节讲到使用 ${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源码

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值