• 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集合

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

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

  • 相关阅读:
    [转载]苹果推送通知服务
    Lovekey
    大数阶乘的位数
    大明A+B
    大数取余
    A+Bcoming
    大数取余(C++)
    验证角谷猜想
    麦森数(转)
    大数阶乘的位数(C++)
  • 原文地址:https://www.cnblogs.com/wei-cy/p/12879629.html
Copyright © 2020-2023  润新知