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

  • 相关阅读:
    WHERE col1=val1 AND col2=val2;index exists on col1 and col2, the appropriate rows can be fetched directly
    MySQL 交集 实现方法
    MBProgressHUD的使用
    Xcode4 使用 Organizer 分析 Crash logs(转)
    SimpleXML 使用详细例子
    PHP的XML Parser(转)
    iPhone,iPhone4,iPad程序启动画面的总结 (转)
    Pop3得到的Email 信件格式介绍
    yii总结
    隐藏Tabbar的一些方法
  • 原文地址:https://www.cnblogs.com/zsg88/p/12204975.html
Copyright © 2011-2022 走看看