zoukankan      html  css  js  c++  java
  • activiti 7 + springboot2(九) 流程变量的使用

    (一)基本概念

    流程变量就是activiti在管理工作流时根据管理需要而设置的变量。比如在请假流程流转时如果请假天数大于3天则由总经理审核,否则由人事直接审核,请假天数就可以设置为流程变量,在流程流转时使用。

    (二)作用域

    流程变量的作用域默认是一个流程实例(processInstance),也可以是一个任务(task)或一个执行实例(execution),这三个作用域流程实例的范围最大,可以称为global变量,任务和执行实例仅仅是针对一个任务和一个执行实例范围,范围没有流程实例大,称为local变量。

    (三)变量类型

     string  java.lang.String
     integer  java.lang.Integer
     short  java.lang.Short
     long  java.lang.Long
     double  java.lang.Double
     date  java.lang.Date
     binary  byte[]
     serializable  java.lang.Serializable 实现

    (四)使用方法

    1)设置流程变量
    2)通过UEL表达式使用流程变量

    • 可以在assignee处设置UEL表达式,表达式的值为任务的负责人,比如:${assignee},assignee就是一个流程变量名称,Activiti获取UEL表达式的值,即流程变量assignee的值,将assignee的值作为任务的负责人进行任务分配。
    • 可以在连线上设置UEL表达式,决定流程走向,比如:${price>=10000}和${price<10000}:price就是一个流程变量名称,uel表达式结果类型为布尔类型,如果UEL表达式是true,要决定流程执行走向。

    (五)使用Global变量控制流程

    流程:员工创建请假申请单,由部门经理审核,部门经理审核通过后请假3天及以下由人事直接审核,3天以上先由总经理审核,总经理审核通过再由人事审核存档。

    测试代码:

    package com.activiti.example;
    
    import java.io.Serializable;
    import java.util.Date;
    
    /**
     * 请假实体
     * 必须实现序列化接口serializable,为了防止由于新增字段无法反序列化,需要生成serialVersionUID
     */
    
    public class Holiday implements Serializable {
        private static final long serialVersionUID = 373046364072498634L;
    
        private Integer id;
        /**
         * 申请人的名字
         */
        private String holidayName;
        /**
         * 开始时间
         */
        private Date beginDate;
        /**
         * 结束日期
         */
        private Date endDate;
        /**
         * 请假天数
         */
        private Float days;
        /**
         * 事由
         */
        private String reason;
        /**
         * 请假类型
         */
        private String type;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getHolidayName() {
            return holidayName;
        }
    
        public void setHolidayName(String holidayName) {
            this.holidayName = holidayName;
        }
    
        public Date getBeginDate() {
            return beginDate;
        }
    
        public void setBeginDate(Date beginDate) {
            this.beginDate = beginDate;
        }
    
        public Date getEndDate() {
            return endDate;
        }
    
        public void setEndDate(Date endDate) {
            this.endDate = endDate;
        }
    
        public Float getDays() {
            return days;
        }
    
        public void setDays(Float days) {
            this.days = days;
        }
    
        public String getReason() {
            return reason;
        }
    
        public void setReason(String reason) {
            this.reason = reason;
        }
    
        public String getType() {
            return type;
        }
    
        public void setType(String type) {
            this.type = type;
        }
    }

     1)启动流程时设置

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

        /**
         * 启动一个实例
         * 动态设置设置assignee和假期变量
         */
        @Test
        public void startProcessInstance() {
            Holiday holiday = new Holiday();
            holiday.setDays(5F);
    
    
            Map<String, Object> variables = new HashMap<>();
            //设置assignee
            variables.put("user1","张三");
            variables.put("user2","李四");
            variables.put("user3","王五");
            //定义流程变量holiday
            variables.put("holiday", holiday);
    
            //启动流程实例,同时还要设置流程定义的变量值
            ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess_1", variables);
            System.out.println("流程实例id:" + processInstance.getProcessInstanceId());
        }

    2)任务办理时设置

        /**
         * 完成任务
         */
        @Test
        public void completeTask() {
            String assignee = "张三";
            Task task = taskService.createTaskQuery().processDefinitionKey("myProcess_1").taskAssignee(assignee).singleResult();
    
            Holiday holiday = new Holiday();
            holiday.setDays(4F);
            //初始化一些参数
            Map<String, Object> map = new HashMap<>();
            map.put("holiday", holiday);
    
            if (task != null) {
                taskService.complete(task.getId(), map);//完成任务时,设置流程变量的值
                System.out.println("任务执行完毕");
            }
        }

    3)通过当前流程实例设置

    executionId必须当前未结束流程实例的执行id,通常此id设置流程实例的id。也可以通过runtimeService.getVariable()获取流程变量。

        /**
         * 通过当前流程实例设置变量
         */
        @Test
        public void setGlobalVariableByExecutionId() {
            String executionId = "9d5079d9-38e3-11ea-903f-30b49ec7161f";
    
            Holiday holiday = new Holiday();
            holiday.setDays(3F);
            runtimeService.setVariable(executionId, "holiday", holiday);
            System.out.println(runtimeService.getVariable(executionId, "holiday"));
        }

    4)通过当前任务设置

        @Test
        public void setGlobalVariableByTaskId() {
            String taskId = "73eb4a5b-38e4-11ea-ba62-30b49ec7161f";
    
            Holiday holiday = new Holiday();
            holiday.setDays(5F);
            Map<String, Object> variables = new HashMap<>();
            variables.put("holiday", holiday);
    
            taskService.setVariable(taskId, "holiday", holiday);
            System.out.println(taskService.getVariable(taskId, "holiday"));
        }

     (六)设置local流程变量

    1)任务办理时设置

    任务办理时设置local流程变量,当前运行的流程实例只能在该任务结束前使用,任务结束该变量无法在当前流程实例使用,可以通过查询历史任务查询。

    设置作用域为任务的local变量,每个任务可以设置同名的变量,互不影响。

        /**
         * 任务完成时,设置local变量,作用域为该任务
         */
        @Test
        public void completeTaskLocal() {
            String taskId = "73eb4a5b-38e4-11ea-ba62-30b49ec7161f";
    
            Map<String, Object> variables = new HashMap<>();
            Holiday holiday = new Holiday();
            holiday.setDays(3F);
            variables.put("holiday", holiday);
    
            //设置local变量,作用域为该任务
            taskService.setVariablesLocal(taskId, variables);
            taskService.complete(taskId);
        }

    (七)查询历史流程变量

        /**
         * 查询历史流程变量
         */
        @Test
        public void queryHistoricLocalVariables() {
            HistoricTaskInstanceQuery historicTaskInstanceQuery = historyService.createHistoricTaskInstanceQuery();
            List<HistoricTaskInstance> list = historicTaskInstanceQuery.includeTaskLocalVariables()
                    .finished().list();
    
            for (HistoricTaskInstance hti : list) {
                System.out.println("============================");
                System.out.println("任务id:" + hti.getId());
                System.out.println("任务名称:" + hti.getName());
                System.out.println("任务负责人:" + hti.getAssignee());
                System.out.println("任务local变量:" + hti.getTaskLocalVariables());
            }
        }

    源代码下载  https://download.csdn.net/download/zsg88/12109277

  • 相关阅读:
    Prometheus+mysql+grafana
    Ant+JMeter+Jenkins接口自动化平台搭建
    MySQL配置文件my.cnf的解析
    jmeter上传图片接口+下载文件接口
    python 正则表达式
    Python接口自动化基础---cookie绕过登录
    Python接口自动化基础---token鉴权
    Python接口自动化基础---session关联接口
    Python接口自动化基础---post请求
    Python接口自动化基础---get请求
  • 原文地址:https://www.cnblogs.com/zsg88/p/12204975.html
Copyright © 2011-2022 走看看