activiti的网关(GateWay)

在介绍activiti的基础的时候说到了工作流的使用场景之请假,请假的天数不同,可能需要不同的领导签字,本篇文章讲介绍工作流的网关实现这类场景。

 

activiti中的网关包含以下几种,这里只做下简单的介绍,具体的细节信息可以参考网上资料。

(1)ParallelGeteway:并行网关/异或网关 (多人会签完成,才能启动下一流程)

(2)ExclusiveGateway排他网关(多人之中只能有一个人进行审批,哪个条件为true,则走对应的逻辑)

(3)InclusiveGateway包含网关(集成了并行与排他网关)

(4)EventGateway事件网关(只能连接中间捕获事件)

 

话不多说,开始案例。步骤还是和我上一篇的文章一样,绘画流程图、配置属性--->部署流程--->启动流程--->执行任务

绘画流程图:相信只要你有点流程图的基础,都能看懂流程走向

 配置(重要)

(1)每个节点配置办理人,我这边从上到下,从左到右,分别配置的张三、李四、王二、麻子四个人。

(2)事件到底走哪个分支,这个是需要我们配置的,点击连线,properties下面的main config,找到condition,如图所示,在里面配置条件。注意:这里面是个条件表达式,这个day是可以自行定义的,你也可以取别的参数,在你完成请假申请的时候,传这个参数值就可以了。用专业术语来说,就是配置参数变量的值。

 同样的,另外两条线,也需要配置下Condition的值,最后点击空白处,给该流程起个key和name。我这里起的key是applyLeave,就不做截图展示了。

 

接下来部署流程和启动流程我就一起上代码了。

@Test
    public void ExclusiveGateWay(){
        //发布流程
        Deployment deployment = processEngine.getRepositoryService()
                        .createDeployment()
                        .name("排他网关")        
                        .addClasspathResource("diagrams/exclusiveWay.bpmn")
                        .addClasspathResource("diagrams/exclusiveWay.png")
                        .deploy();
        System.out.println("部署ID:"+deployment.getId());  
        System.out.println("部署名称:"+deployment.getName());
       //启动流程
       ProcessInstance pi =    processEngine.getRuntimeService()
                      .startProcessInstanceByKey("applyLeave");
                     
    }

查询任务

public void MyPersonalTask(){
        String assignee = "张三";
        List<Task> list = processEngine.getTaskService()//与正在执行的任务管理相关的Service
                        .createTaskQuery()//创建任务查询对象
                        /**排序*/
                        .orderByTaskCreateTime().asc()//使用创建时间的升序排列
                        /**返回结果集*/
                        .list();//返回列表
            for(Task task:list){
                System.out.println("任务ID:"+task.getId());
                System.out.println("任务名称:"+task.getName());
                System.out.println("任务的办理人:"+task.getAssignee());
                System.out.println("流程实例ID:"+task.getProcessInstanceId());
                System.out.println("执行对象ID:"+task.getExecutionId());
                System.out.println("流程定义ID:"+task.getProcessDefinitionId());
            }
    }

完成任务

@Test
    public void completeeTask() {
        TaskService taskService = processEngine.getTaskService();
        String taskId = "2408";  //这里的id就是我们上一步通过查看任务,获取的任务id
        Map<String, Object> variables = new HashMap<String, Object>();
        variables.put("day", 7);  //这里设置我们刚才配置参数对应的值,这里设置的7,那么应该到总经理审批
        Task task = taskService.createTaskQuery()
                .taskId(taskId)
                .singleResult();
        taskService.addComment(taskId, task.getProcessInstanceId(), "7天假期审核通过"); //在这里我们可以对任务添加评论
        taskService.complete(taskId, variables);
                    
                     
    }

测试:先是张三提交了7天的申请,现在我们来验证接下来是否到总经理审批,通过截图,证明了我们流程中的排他网关是成功的。

 

并行网关我就不做测试了,感兴趣的朋友可以自己画图配置测试看看,其实通过这篇和上一篇的案例我们可以发现到,工作流只要你流程画好了,配置好了,剩下的都是一样的操作了,部署启动流程,查看任务,完成流程等。

 

最后做下补充:关于上面提到的变量

在实际过程中,我们常常会运用到变量的配置以及值获取等问题。可以通过runtimeService或者taskService来设置变量和获取变量,变量可以设置一个或者多个。对应的表act_ru_variable:正在执行的流程变量表  ;   act_hi_varinst:流程变量历史表

runtimeService.setVariable(executionId, variableName, value)//表示使用执行对象ID,和流程变量的名称,设置流程变量的值(一次只能设置一个值)
//    runtimeService.setVariables(executionId, variables)//表示使用执行对象ID,和Map集合设置流程变量,map集合的key就是流程变量的名称,map集合的value就是流程变量的值(一次设置多个值)
        
//    taskService.setVariable(taskId, variableName, value)//表示使用任务ID,和流程变量的名称,设置流程变量的值(一次只能设置一个值)
//    taskService.setVariables(taskId, variables)//表示使用任务ID,和Map集合设置流程变量,map集合的key就是流程变量的名称,map集合的value就是流程变量的值(一次设置多个值)
   runtimeService.startProcessInstanceByKey(processDefinitionKey, variables);//启动流程实例的同时,可以设置流程变量,用Map集合

流程变量的赋值:可以在启动流程的时候赋值,也可以在某个节点完成任务的时候赋值,这个都是可以的,具体情况看你的业务需求。

 

下一篇我们会讲到另一个常用的点-->监听器。

 

 

posted @ 2020-05-12 23:35  沐言星空  阅读(7402)  评论(0编辑  收藏  举报