• activiti流程变量


    activiti流程变量

    定义
    流程变量在Activiti 中是一个十分重要的角色,流程运转时,需要靠流程变量,业务系统和activiti 结合时少不了流程变量,流程变量就是activiti 在管理工作流时根据管理需要而设置的变量。比如:在出差申请流程流转是如果出差天数大于三天则需要总经理审批,否者只需要认识审批,出差天数就可以设置为流程变量,在流程流转时使用。

    类型
    如果将实体 存入到流程变量中,则实体必须实现序列化接口serializable,为了防止由于新增字段无法反序列化,需要横撑serialVersionUid

    作用域:
    流程变量的作用域可以是一个流程实例(processInstence),或者一个任务(Task),或者一个执行实例(execution)

    Local变量
    任务和执行实例仅仅是针对一个任务和一个执行实例的范围,范围没有流程实例大,成为local变量。

        Local 变量由于在不同的任务或不同的执行实例中,作用域互不影响,变量名可以相同没有影响,Local变量也可以和global变量名相同,没有影响!
    
    • 1

    流程变量的使用方法
    - 在属性上使用UEL表达式
    可以在assignee 处设置UEL表达式,表达式的值为任务的负责人,比如:${assigness},assigness 就是一个流程变量名称

        - 在连线上使用UEL表达式,决定流程走向
        比如:${price<10000},price 就是一个流程变量名称,uel表达式结果为一个布尔类型
    
    • 1
    • 2

    实例
    员工创建出差申请单,由部门经理审核,部门经理审核通过后,出差三天以下由财务直接审批,三天以上先由总经理审核,总经理审核通过再由财务审批。
    在这里插入图片描述
    设置流程实例的三种方式

    方式一:启动流程时设置流程变量
    在启动流程时设置流程变量,变量的作用域是整个流程实例。
    通过Map设置流程变量,map中可以设置多个变量,这个key就是流程变量的名字

    /**
     * 发起一个流程
     */
    @Test
    public void test3(){
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        // 发起流程 需要通过 runtimeService来实现
        RuntimeService runtimeService = engine.getRuntimeService();
        // 定义流程变量信息
        Map<String,Object> map = new HashMap<>();
        map.put("assignee1","张三");
        map.put("assignee2","李四");
        map.put("ass1","变量1");
        map.put("ass2",299);
        map.put("ass3","湖南长沙");
        map.put("ass4","波哥666");
        // 通过流程定义ID来启动流程  返回的是流程实例对象
        ProcessInstance processInstance = runtimeService
                .startProcessInstanceById("holiday1:1:42503",map);
        System.out.println("processInstance.getId() = " + processInstance.getId());
        System.out.println("processInstance.getDeploymentId() = " + processInstance.getDeploymentId());
        System.out.println("processInstance.getDescription() = " + processInstance.getDescription());
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    方式二:在任务办理时设置流程变量
    在完成任务时设置流程变量,该流程变量只有在该任务完成后其它结点才可使用该变量,它的作用域是整个流程实
    例,如果设置的流程变量的 key 在流程实例中已存在相同的名字则后设置的变量替换前边设置的变量。

    方式三:通过当前流程实例设置
    通过流程实例id 设置全局变量,该流程实例必须未执行完成。

        @Test
        public void test_completeTask(){
            RepositoryServicerepositoryService =   processEngine().getRepositoryService();
            Map<String,Object>varlues = new HashMap();
            varlues.put("applyTitle","test_请假申请流程");
            varlues.put("applyTime","7天");
            TaskServicetaskService =processEngine().getTaskService();
    
            taskService.complete("5005",varlues);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    通过任务实例来设置流程变量

    
        @Test
        public void testProcessInstanceIdSetVariables() {
            //        1.获取引擎
            ProcessEngineConfiguration configuration =
                    ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
                            "activiti.cfg.xml", "processEngineConfiguration");
            ProcessEngine processEngine = configuration.buildProcessEngine();
            // 获取 RuntimeService
            RuntimeService runtimeService = processEngine.getRuntimeService();
            List<ProcessInstance> processInstances = runtimeService.createProcessInstanceQuery().processDefinitionKey("evection-global").list();
     
            Evection evection = new Evection();
            evection.setNum(2d);
            for (ProcessInstance instance : processInstances) {
                runtimeService.setVariables("17501", Map.of("assigness02", "王经理"
                        , "assigness03", "李总经理"
                        , "evection", evection));
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    Local 流程变量的设置
    local流程变量的作用域只在当前任务节点下可用
    添加

    
    @Test
        public void testTaskCompleteSetLocalVariables() {
            //        1.获取引擎
            ProcessEngineConfiguration configuration =
                    ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
                            "activiti.cfg.xml", "processEngineConfiguration");
            ProcessEngine processEngine = configuration.buildProcessEngine();
            TaskService taskService = processEngine.getTaskService();
            List<Task> tasks = taskService.createTaskQuery().taskAssignee("").list();
            for (Task task : tasks) {
    //            System.out.println(task.getId());
                taskService.setVariableLocal(task.getId(),"evection","local-variable");
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    查看

     @Test
        public void testTaskCompleteGetLocalVariables() {
            //        1.获取引擎
            ProcessEngineConfiguration configuration =
                    ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
                            "activiti.cfg.xml", "processEngineConfiguration");
            ProcessEngine processEngine = configuration.buildProcessEngine();
            TaskService taskService = processEngine.getTaskService();
            List<Task> tasks = taskService.createTaskQuery().taskAssignee("王经理").list();
            for (Task task : tasks) {
                System.out.println(taskService.getVariableLocal("22502", "evection"));
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    如果任务完成后,可以通过查看历史信息进行查看

    @Test
        public void testFindHisLocalVariable() {
            //        1.获取引擎
            ProcessEngineConfiguration configuration =
                    ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
                            "activiti.cfg.xml", "processEngineConfiguration");
            ProcessEngine processEngine = configuration.buildProcessEngine();
            HistoryService historyService = processEngine.getHistoryService();
            List<HistoricTaskInstance> instances = historyService.createHistoricTaskInstanceQuery().includeTaskLocalVariables().list();
            for (HistoricTaskInstance instance : instances) {
                System.out.println("==============================");
                System.out.println("任务id:" + instance.getId());
                System.out.println("任务名称:" + instance.getName());
                System.out.println("任务负责人:" + instance.getAssignee());
                System.out.println("任务local变量:" + instance.getTaskLocalVariables());
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
  • 相关阅读:
    【工程伦理】脑机接口技术中的伦理问题分析
    R语言ggplot2可视化:使用ggpubr包的ggpie函数可视化饼图(pie chart)、为饼图不同区域添加标签
    Docker之路(三)docker安装nginx实现对springboot项目的负载均衡
    C#多线程学习总结
    系统架构师论文总结【持续更新】
    php出现SSL certificate problem: unable to get local issuer certificate的解决办法
    postgres字符串转数字
    系列二、什么是OOM?什么是StackOverflowError?有哪些方法分析?
    网络基础-RIP协议
    结合大象机器人六轴协作机械臂myCobot 280 ,解决特定的自动化任务和挑战!(下)
  • 原文地址:https://blog.csdn.net/weixin_45817985/article/details/133038902