美文网首页程序员从入门到放弃
Activiti6.0整合SpringBoot2.0学习(二)

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

作者: KevinZc | 来源:发表于2018-06-06 20:49 被阅读67次

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

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

    相关文章

      网友评论

      • 虾游于海:现在市面上关于springboot2.0和activiti6的教程基本没有,两套框架都是最新版,踩坑之作!

      本文标题:Activiti6.0整合SpringBoot2.0学习(二)

      本文链接:https://www.haomeiwen.com/subject/vaeesftx.html