• Activiti流量变量(九)


    1什么是流程变量

    流程变量在 activiti 中是一个非常重要的角色,流程运转有时需要靠流程变量,业务系统和 activiti
    结合时少不了流程变量,流程变量就是 activiti 在管理工作流时根据管理需要而设置的变量。
    比如在请假流程流转时如果请假天数大于 3 天则由总经理审核,否则由人事直接审核, 请假天
    数就可以设置为流程变量,在流程流转时使用。

    注意:虽然流程变量中可以存储业务数据可以通过 activiti api 查询流程变量从而实现 查询业务
    数据,但是不建议这样使用,因为业务数据查询由业务系统负责, activiti 设置流程变量是为了流程
    执行需要而创建 。

    2流程变量类型 

     注意:如果将 pojo 存储到流程变量中,必须实现序列化接口 serializable,为了防止由于新增字段无
    法反序列化,需要生成 serialVersionUID

    3流程变量作用域

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

    变量名不允许重复
    global 变量中变量名不允许重复,设置相同名称的变量,后设置的值会覆盖前设置的变量值。
    Local 变量由于在不同的任务或不同的执行实例中,作用域互不影响,变量名可以相同没有影响。
    Local 变量名也可以和 global 变量名相同,没有影响。

    4流程变量的使用方法

    第一步:设置流程变量
    第二步:通过 UEL 表达式使用流程变量
    1> 可以在 assignee 处设置 UEL 表达式,表达式的值为任务的负责人
    比如: ${assignee}assignee 就是一个流程变量名称
    Activiti 获取 UEL 表达式的值 ,即流程变量 assignee 的值 ,将 assignee 的值作为任务的负责人
    进行任务分配


    2> 可以在连线上设置 UEL 表达式,决定流程走向
    比如: ${price>=10000}${price<10000}: price 就是一个流程变量名称, uel 表达式结果类型为
    布尔类型

    如果 UEL 表达式是 true,要决定 流程执行走向。

    5使用 Global 变量控制流程

    5.1需求:

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

     5.2流程程定义

    请假天数大于等于 3 连线条件:

     

     请假天数小于 3 连线条件:

     

     5.3设置 global 流程变量

    在部门经理审核前设置流程变量,变量值为请假单信息(包括请假天数),部门经理审核后可以根据
    流程变量的值决定流程走向。

    5.3.1 启动流程时设置

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

     先重新部署项目

       //新的请假流程定义的部署
        public static void main(String[] args) {
            //1.得到ProcessEngine
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
            //2.得到RepositoryService对象
            RepositoryService repositoryService = processEngine.getRepositoryService();
    
            //3.部署
            Deployment deploy = repositoryService.createDeployment()
                    .addClasspathResource("diagram/holiday4.bpmn")
                    .addClasspathResource("diagram/holiday4.png")
                    .name("请假流程-流程变量")
                    .deploy();
    
            System.out.println(deploy.getId());
            System.out.println(deploy.getName());
        }

     实体类

    /**
     * 请假实体类:
     *    注意POJO类型,一定要实现Serializable接口,否则在存储这个pojo时就会报异常
     */
    public class Holiday implements Serializable {
        private Integer id;
        private String holidayName;//申请人的名字
        private Date beginDate;//开始时间
        private Date endDate;//结束日期
        private Float num;//请假天数
        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 getNum() {
            return num;
        }
    
        public void setNum(Float num) {
            this.num = num;
        }
    
        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;
        }
    }
    //启动流程实例,同时还要设置流程变量的值
        // act_ge_bytearray
        // act_ru_variable
        public static void main(String[] args) {
            //1.得到ProcessEngine
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
            //2.得到RuntimeService
            RuntimeService runtimeService =  processEngine.getRuntimeService();
    
            //3.流程定义的key问题   myProcess_1
            String key = "myProcess_1";
            Map<String ,Object> map = new HashMap<>();
    
            Holiday holiday = new Holiday();
            holiday.setNum(5F);
            map.put("holiday",holiday);
    
            //4.启动流程实例,并且设置流程变量的值
            ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(key, map);
    
            //5.输出实例信息
            System.out.println(processInstance.getName());
            System.out.println(processInstance.getProcessDefinitionId());
    
        }

    说明:
    startProcessInstanceByKey(processDefinitionKey, variables)流程变量作用域是一个流
    程实例,流程变量使用 Map 存储,同一个流程实例设置变量 map key 相同,后者覆盖前者。

    //完成任务  zhangsan  -----lishi----判断流程变量的请假天数,1天----分支:人事经理存档(zhaoliu)
        public static void main(String[] args) {
            //1.得到ProcessEngine
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
            //2.得到TaskService
            TaskService taskService = processEngine.getTaskService();
    
            //3.查询当前用户是否有任务
            String key = "myProcess_1";
            Task task = taskService.createTaskQuery().processDefinitionKey(key)
                    .taskAssignee("zhaoliu").singleResult();
    
            //4.判断task!=null,说明当前用户有任务
            if(task!=null){
                System.out.println(task);
                taskService.complete(task.getId());
                System.out.println("任务执行完毕");
            }
    
        }

     可以自行测试当天数小于等于3天的时候,是流转不到他的

    5.3.2 任务办理时设置

    在完成任务时设置流程变量,该流程变量只有在该任务完成后其它结点才可使用该变量,它的作用
    域是整个流程实例,如果设置的流程变量的 key 在流程实例中已存在相同的名字则后设置的变量替
    换前边设置的变量。
    这里需要在创建请假单任务完成时设置流程变量

    public class VariableTest2 {
    
    
        //完成任务  zhangsan  -----lishi----判断流程变量的请假天数,1天----分支:人事经理存档(zhaoliu)
        public static void main(String[] args) {
            //1.得到ProcessEngine
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
            //2.得到TaskService
            TaskService taskService = processEngine.getTaskService();
    
            //3.查询当前用户是否有任务
            String key = "myProcess_1";
            Task task = taskService.createTaskQuery().processDefinitionKey(key)
                    .taskAssignee("zhangsan").singleResult();
    
            //初始化一些参数
            Map<String ,Object> map = new HashMap<>();
    
            Holiday holiday = new Holiday();
            holiday.setNum(5F);
            map.put("holiday",holiday);
    
            //4.判断task!=null,说明当前用户有任务
            if(task!=null){
                taskService.complete(task.getId(),map);//完成任务时,设置流程变量的值
                System.out.println("任务执行完毕");
            }
    
        }
    
    
        //启动流程实例
        // act_ge_bytearray
        // act_ru_variable
        public static void main2(String[] args) {
            //1.得到ProcessEngine
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
            //2.得到RuntimeService
            RuntimeService runtimeService =  processEngine.getRuntimeService();
    
            //3.流程定义的key问题   myProcess_1
            String key = "myProcess_1";
            /*Map<String ,Object> map = new HashMap<>();
    
            Holiday holiday = new Holiday();
            holiday.setNum(5F);
            map.put("holiday",holiday);*/
    
            //4.启动流程实例
            ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(key);
    
            //5.输出实例信息
            System.out.println(processInstance.getName());
            System.out.println(processInstance.getProcessDefinitionId());
    
        }
    
    
    
    
    
        //新的请假流程定义的部署
        public static void main1(String[] args) {
            //1.得到ProcessEngine
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
            //2.得到RepositoryService对象
            RepositoryService repositoryService = processEngine.getRepositoryService();
    
            //3.部署
            Deployment deploy = repositoryService.createDeployment()
                    .addClasspathResource("diagram/holiday4.bpmn")
                    .addClasspathResource("diagram/holiday4.png")
                    .name("请假流程-流程变量")
                    .deploy();
    
            System.out.println(deploy.getId());
            System.out.println(deploy.getName());
        }
    }

     5.3.3 通过当前流程实例设置

    通过流程实例 id 设置全局变量,该流程实例必须未执行完成。

    /**
     * 流程变量的测试
     */
    public class VariableTest3 {
    
    
        //完成任务  zhangsan  -----lishi----判断流程变量的请假天数,1天----分支:人事经理存档(zhaoliu)
        public static void main4(String[] args) {
            //1.得到ProcessEngine
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
            //2.得到TaskService
            TaskService taskService = processEngine.getTaskService();
    
            //3.查询当前用户是否有任务
            String key = "myProcess_1";
            Task task = taskService.createTaskQuery().processDefinitionKey(key)
                    .taskAssignee("zhangsan").singleResult();
    
            //初始化一些参数
            Map<String ,Object> map = new HashMap<>();
    
            Holiday holiday = new Holiday();
            holiday.setNum(5F);
            map.put("holiday",holiday);
    
            //4.判断task!=null,说明当前用户有任务
            if(task!=null){
                taskService.complete(task.getId(),map);//完成任务时,设置流程变量的值
                System.out.println("任务执行完毕");
            }
    
        }
    
        //新加入的:通过流程实例id,来测试流程变量
        public static void main(String[] args) {
            //1.得到ProcessEngine
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
            //2.得到RuntimeService
            RuntimeService runtimeService =  processEngine.getRuntimeService();
    
            //3.流程定义的key问题   myProcess_1
            //Map<String ,Object> map = new HashMap<>();
    
            Holiday holiday = new Holiday();
            holiday.setNum(5F);
           // map.put("holiday",holiday);
    
            //4.通过实例id,来设置流程变量
            //第一个参数:流程实例的id
            //第二个参数:流程变量名
            //第三个变量:流程变量名,所对应的值
            runtimeService.setVariable("2501","holiday",holiday);
    
        }
    
    
        //启动流程实例
        // act_ge_bytearray
        // act_ru_variable
        public static void main2(String[] args) {
            //1.得到ProcessEngine
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
            //2.得到RuntimeService
            RuntimeService runtimeService =  processEngine.getRuntimeService();
    
            //3.流程定义的key问题   myProcess_1
            String key = "myProcess_1";
            /*Map<String ,Object> map = new HashMap<>();
    
            Holiday holiday = new Holiday();
            holiday.setNum(5F);
            map.put("holiday",holiday);*/
    
            //4.启动流程实例
            ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(key);
    
            //5.输出实例信息
            System.out.println(processInstance.getName());
            System.out.println(processInstance.getProcessDefinitionId());
            System.out.println(processInstance.getId());
        }
    
    
    
    
    
        //新的请假流程定义的部署
        public static void main1(String[] args) {
            //1.得到ProcessEngine
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
            //2.得到RepositoryService对象
            RepositoryService repositoryService = processEngine.getRepositoryService();
    
            //3.部署
            Deployment deploy = repositoryService.createDeployment()
                    .addClasspathResource("diagram/holiday4.bpmn")
                    .addClasspathResource("diagram/holiday4.png")
                    .name("请假流程-流程变量")
                    .deploy();
    
            System.out.println(deploy.getId());
            System.out.println(deploy.getName());
        }
    }

    操作数据库表
    设置流程变量会在当前执行流程变量表插入记录,同时也会在历史流程变量表也插入记录。
    SELECT * FROM act_ru_variable #当前流程变量表
    记录当前运行流程实例可使用的流程变量,包括 global local 变量
    Id_:主键
    Type_:变量类型
    Name_:变量名称
    Execution_id_:所属流程实例执行 idglobal local 变量都存储
    Proc_inst_id_:所属流程实例 idglobal local 变量都存储
    Task_id_:所属任务 idlocal 变量存储
    Bytearray_serializable 类型变量存储对应 act_ge_bytearray 表的 id
    Double_double 类型变量值
    Long_long 类型变量值
    Text_text 类型变量值
    SELECT * FROM act_hi_varinst #历史流程变量表
    记录所有已创建的流程变量,包括 global local 变量
    字段意义参考当前流程变量表

    6 local流程变量设置

    6.1任务办理时设置

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

    // 办理任务时设置local流程变量
    @Test
    public void completTask() {
    //任务id
    String taskId = "";
    TaskService taskService = processEngine.getTaskService();
    // 定义流程变量
    Map<String, Object> variables = new HashMap<String, Object>();
    Holiday holiday = new Holiday ();
    holiday.setNum(3);
    // 定义流程变量
    Map<String, Object> variables = new HashMap<String, Object>();
    //变量名是holiday,变量值是holiday对象
    variables.put("holiday", holiday);
    // 设置local变量,作用域为该任务
    taskService.setVariablesLocal(tasked, variables);
    taskService.complete(taskId);
    }

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

    6.2通过当前任务设置

    @Test
    public void setLocalVariableByTaskId(){
    //当前待办任务id
    String taskId="1404";
    TaskService taskService = processEngine.getTaskService();
    Holiday holiday = new Holiday ();
    holiday.setNum(3);
    //通过任务设置流程变量
    taskService.setVariableLocal(taskId, "holiday", holiday);
    //一次设置多个值
    //taskService.setVariablesLocal(taskId, variables)
    }

    注意:
    任务 id 必须是当前待办任务 idact_ru_task 中存在。

  • 相关阅读:
    cvxpy 示例代码
    Cora 数据集介绍
    图嵌入
    数学建模
    邮件服务器搭建
    windows安装、使用MongoDB
    Django 特殊查询
    软件测试-软件质量
    软件测试-配置管理(7)
    软件测试-缺陷管理(6)
  • 原文地址:https://www.cnblogs.com/dalianpai/p/11891150.html
Copyright © 2020-2023  润新知