• Activiti第三篇【连接、排他网关、指定任务处理人、组任务】


    连线

    上面我们已将学过了流程变量了,可以在【任务服务、运行时服务、流程开始、完成某个任务时设置流程变量】,而我们的连接就是流程变量的实际应用了….

    定义流程图

    我们并不是所有的流程都是按一条的路径来走的,我们有的时候会根据条件来走不同的路。当然了,最终该流程是会一步步走完….

    例子:

    重要的信息交由老板来处理,不重要的信息交由经理来处理

    这里写图片描述

    表达式的结果必须是布尔型

    • #{variable==’value’}
    • ${variable==value}

    测试

    我在任务完成时设置流程变量为不重要,那么跳到下一个流程时就是经理来进行处理

    这里写图片描述

    当我设置为重要的时候,那么就是交由老板来处理

    这里写图片描述

    排他网关

    上面我们使用连线的时候用了两个条件 : 要么条件是“重要”,要么条件是“不重要”….如果有另一种情况呢???就是用户把条件输入错了,写成“不知道重不重要”,那么我们的流程怎么走???岂不是奔溃了???

    因此,我们要有一条默认的路来走,就是当该变量不符合任何的条件时,我们也有一条默认的路

    这里写图片描述

    值得注意的是:如果是在Eclipse中使用插件的BPMN流程图,如果使用了排他网关,那么在Idea下是解析不了的

    解决:

    我们只要重新定义BPMN流程图的排他网关就行了,idea中的Activiti插件是不用制定默认流程的,只要我们不设置条件,那就是默认的连接线

    测试

    
    public class ExclusiveGetWay {
        private ProcessEngine processEngine = ProcessEngines
                .getDefaultProcessEngine();
    
        // 部署流程定义,资源来在bpmn格式
        @Test
        public void deployProcessDefi() {
            Deployment deploy = processEngine.getRepositoryService()
                    .createDeployment().name("排他网关流程")
                    .addClasspathResource("ExclusiveGateway.bpmn")
                    .deploy();
    
            System.out.println("部署名称:" + deploy.getName());
            System.out.println("部署id:" + deploy.getId());
        }
    
        // 执行流程,开始跑流程
        @Test
        public void startProcess() {
            String processDefiKey = "bankBill";// bpmn 的 process id属性
            ProcessInstance pi = processEngine.getRuntimeService()
                    .startProcessInstanceByKey(processDefiKey);
    
            System.out.println("流程执行对象的id:" + pi.getId());// Execution 对象
            System.out.println("流程实例的id:" + pi.getProcessInstanceId());// ProcessInstance
                                                                        // 对象
            System.out.println("流程定义的id:" + pi.getProcessDefinitionId());// 默认执行的是最新版本的流程定义
        }
    
        // 查询正在运行任务
        @Test
        public void queryTask() {
            // 取得任务服务
            TaskService taskService = processEngine.getTaskService();
            // 创建一个任务查询对象
            TaskQuery taskQuery = taskService.createTaskQuery();
            // 办理人的任务列表
            List<Task> list = taskQuery.list();
            // 遍历任务列表
            if (list != null && list.size() > 0) {
                for (Task task : list) {
                    System.out.println("任务的办理人:" + task.getAssignee());
                    System.out.println("任务的id:" + task.getId());
                    System.out.println("任务的名称:" + task.getName());
                }
            }
    
        }
    
        // 完成任务
        @Test
        public void compileTask() {
            String taskId = "2404";
            Map<String,Object> params=new HashMap<String, Object>();
            params.put("visitor", 6);
            // taskId:任务id
            processEngine.getTaskService().complete(taskId, params);
    //      processEngine.getTaskService().complete(taskId);
            System.out.println("当前任务执行完毕");
        }
    
    }
    

    我们指定的值并不是VIP也不是后台,那么就会自动去普通窗口中处理

    这里写图片描述


    并行网关

    这里写图片描述

    等待活动

    这里写图片描述

    用户任务

    使用流程变量指定处理人

    我们在快速入门的例子中,是在定义流程图中硬性指定处理人,其实这么干是不够灵活的,我们学了流程变量之后,我们是可以灵活地指定处理人的….

    这里写图片描述

    
        @Test
        public void deployProcessDefi() {
            Deployment deploy = processEngine.getRepositoryService()
                    .createDeployment().name("用户任务指定流程")
                    .addClasspathResource("AppayBill.bpmn")
                    .deploy();
    
            System.out.println("部署名称:" + deploy.getName());
            System.out.println("部署id:" + deploy.getId());
        }
    
        // 执行流程,开始跑流程
        @Test
        public void startProcess() {
            String processDefiKey = "appayBill";// bpmn 的 process id属性
            Map<String,Object> params=new HashMap<String, Object>();
            params.put("userID", "王某某");
            ProcessInstance pi = processEngine.getRuntimeService()
                    .startProcessInstanceByKey(processDefiKey, params);
    
            System.out.println("流程执行对象的id:" + pi.getId());// Execution 对象
            System.out.println("流程实例的id:" + pi.getProcessInstanceId());// ProcessInstance
            // 对象
            System.out.println("流程定义的id:" + pi.getProcessDefinitionId());// 默认执行的是最新版本的流程定义
        }
    
        // 查询正在运行任务
        @Test
        public void queryTask() {
            String assignee="王某某";//指定任务处理人
            // 取得任务服务
            TaskService taskService = processEngine.getTaskService();
            // 创建一个任务查询对象
            TaskQuery taskQuery = taskService.createTaskQuery();
            // 办理人的任务列表
            List<Task> list = taskQuery
                    .taskAssignee(assignee)
                    .list();
            // 遍历任务列表
            if (list != null && list.size() > 0) {
                for (Task task : list) {
                    System.out.println("任务的办理人:" + task.getAssignee());
                    System.out.println("任务的id:" + task.getId());
                    System.out.println("任务的名称:" + task.getName());
                }
            }
    
        }

    这里写图片描述

    使用类指定

    这里写图片描述

    组任务

    直接指定办理人

    这里写图片描述

    使用流程变量

    这里写图片描述

    使用类

    这里写图片描述

  • 相关阅读:
    ReSharper Tips—GotoImplementation
    Possible multiple enumeration of IEnumerable
    Hello, Razor!
    自话自说——POI使用需要注意一个地方
    css中怎么设置透明度的问题
    记录排查国标直播流播放卡顿的问题
    互联网上做广告的优点
    C#、.Net经典面试题集锦(一)
    什么是MFC
    C/S与B/S 的区别
  • 原文地址:https://www.cnblogs.com/zhong-fucheng/p/7554366.html
Copyright © 2020-2023  润新知