使用Globa变量控制流程

简介: 使用Globa变量控制流程

使用Globa变量控制流程

需求

网络异常,图片无法展示
|

流程定义

首先使用流程设计器画一个流程,做全局测试的流程图

需要注意在不同的流程进行不同的uel表达式处理

网络异常,图片无法展示
|

创建流程变量

上面我们已经创建好了流程定义

接下来我们创建流程变量,基本属性如下

package com.itheima.demo.pojo;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
 * @program: Activiti01
 * @description: 出差申请中的流程变量对象
 * @author: 魏一鹤
 * @createDate: 2022-07-22 23:27
 **/
@Data
// 如果不实现序列化就会报错
public class Evection implements Serializable {
    // 主键id
    private long id;
    // 出差天数
    private Double num;
    // 出差单
    private String evectionName;
    // 开始日期
    private Date beginDate;
    // 结束日期
    private Date endDate;
    // 目的地
    private String destination;
    // 出差原因
    private String reason;
}

流程部署

/**
     * 流程部署
     */
    @Test
    public void testDeployment(){
//        1、创建ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        2、获取RepositoryServcie
        RepositoryService repositoryService = processEngine.getRepositoryService();
//        3、使用service进行流程的部署,定义一个流程的名字,把bpmn和png部署到数据中
        Deployment deploy = repositoryService.createDeployment()
                .name("出差申请流程-variables")
                .addClasspathResource("bpmn/evection-global.bpmn")
                .deploy();
//        4、输出部署信息
        System.out.println("流程部署id="+deploy.getId());
        System.out.println("流程部署名字="+deploy.getName());
    }

启动流程部署

网络异常,图片无法展示
|
网络异常,图片无法展示
|

数据库里面也看到部署信息了,说明部署成功率

流程启动时设置变量

/**
 * 启动流程 的时候设置流程变量
 * 设置流程变量num
 * 设置任务负责人
 */
@Test
public void testStartProcess(){
    // 获取流程引擎
    ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
    // 获取RunTimeService
    RuntimeService runtimeService = defaultProcessEngine.getRuntimeService();
    // 流程定义的key
    String key="myEvection2";
    // 流程变量的map
    HashMap<String, Object> variables = new HashMap<>();
    // 创建流程变量
    Evection evection = new Evection();
    // 设置出差日期 2天
    evection.setNum(2d);
    // 把流程变量的pojo放入map
    variables.put("evection",evection);
    // 设定任务负责人 key要和uel表达式保持一致
    variables.put("assignee0","李四");
    variables.put("assignee1","王经理");
    variables.put("assignee2","杨总经理");
    variables.put("assignee3","张财务");
    // 启动流程
    runtimeService.startProcessInstanceByKey(key,variables);
}

运行代码启动流程 在act_ru_variable表里面就可以看到流程的变量了 对应的42501都是他的变量

网络异常,图片无法展示
|

pojo的Serializable序列化接口

前面我们提到流程变量需要实现Serializable接口,那么我们如果不实现会怎么样

先把序列化注释掉

网络异常,图片无法展示
|

启动报错

org.activiti.engine.ActivitiException: couldn't find a variable type that is able to serialize Evection(id=0, num=2.0, evectionName=null, beginDate=null, endDate=null, destination=null, reason=null)

网络异常,图片无法展示
|

然后加回来再次启动

网络异常,图片无法展示
|

启动成功

网络异常,图片无法展示
|

再次验证了pojo必须实现序列化

测试正常(小于3)分支

测试流程变量出差天数小于三天的分支,完成个人任务

因为流程变量在第三部,所以我们需要先完成前两个,也就是运行两次方法,负责人分别是李四和王经理

/**
 * 完成个人任务
 */
@Test
public void completTask(){
    // 获取流程引擎
    ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
    // 获取taskService
    TaskService taskService = defaultProcessEngine.getTaskService();
    // 流程定于的key
    String key="myEvection2";
    // 当前任务负责人
    String assinge="李四";
    // 查询李四下的让分无
    Task task = taskService.createTaskQuery()
            .processDefinitionKey(key)
            .taskAssignee(assinge)
            .singleResult();
    // 判断李四有没有任务
    if(task!=null){
        // 根据任务ID完成任务
        taskService.complete(task.getId());
    }
}

王经理审批过之后,会到财务,因为我们的流程变量是2,符合逻辑

网络异常,图片无法展示
|

测试大于3的分支

因为前面代码我们都写好了,刚才测试的是正常分支,我们这次复制份代码测试流程变量为3天的分支

首先执行部署方法 在数据库看到了部署的流程

/**
     * 流程部署
     */
    @Test
    public void testDeployment(){
//        1、创建ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        2、获取RepositoryServcie
        RepositoryService repositoryService = processEngine.getRepositoryService();
//        3、使用service进行流程的部署,定义一个流程的名字,把bpmn和png部署到数据中
        Deployment deploy = repositoryService.createDeployment()
                .name("出差申请流程-variables-day3")
                .addClasspathResource("bpmn/evection-global.bpmn")
                .deploy();
//        4、输出部署信息
        System.out.println("流程部署id="+deploy.getId());
        System.out.println("流程部署名字="+deploy.getName());
    }

网络异常,图片无法展示
|

然后是启动流程,为了区分,我们把负责人后面都加了day3

/**
 * 启动流程 的时候设置流程变量
 * 设置流程变量num
 * 设置任务负责人
 */
@Test
public void testStartProcess(){
    // 获取流程引擎
    ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
    // 获取RunTimeService
    RuntimeService runtimeService = defaultProcessEngine.getRuntimeService();
    // 流程定义的key
    String key="myEvection2";
    // 流程变量的map
    HashMap<String, Object> variables = new HashMap<>();
    // 创建流程变量
    Evection evection = new Evection();
    // 设置出差日期 3天
    evection.setNum(3d);
    // 把流程变量的pojo放入map
    variables.put("evection",evection);
    // 设定任务负责人 key要和uel表达式保持一致
    variables.put("assignee0","李四day3");
    variables.put("assignee1","王经理day3");
    variables.put("assignee2","杨总经理day3");
    variables.put("assignee3","张财务day3");
    // 启动流程
    runtimeService.startProcessInstanceByKey(key,variables);
}

网络异常,图片无法展示
|

然后完成前两个人的任务

/**
 * 完成个人任务
 */
@Test
public void completTask(){
    // 获取流程引擎
    ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
    // 获取taskService
    TaskService taskService = defaultProcessEngine.getTaskService();
    // 流程定于的key
    String key="myEvection2";
    // 当前任务负责人
    String assinge="李四day3";
    // 查询李四下的让分无
    Task task = taskService.createTaskQuery()
            .processDefinitionKey(key)
            .taskAssignee(assinge)
            .singleResult();
    // 判断李四有没有任务
    if(task!=null){
        // 根据任务ID完成任务
        taskService.complete(task.getId());
    }
}

然后查看数据库 当前的负责人是总经理而不是财务了,说明流程变量生效了

网络异常,图片无法展示
|

继续让总经理审批,下一步是财务

没有任何问题

相关文章
|
2月前
|
C语言
if`语句是一种控制流程
if`语句是一种控制流程
19 0
|
2月前
|
C++
C++的控制流
C++的控制流
|
4月前
|
C++
第二章:C++中的控制流程
第二章:C++中的控制流程
18 1
|
6天前
|
Java 测试技术
Java一分钟之-控制流程:if条件语句与switch
【5月更文挑战第8天】本文探讨了Java编程中的`if`和`switch`控制流程语句,强调了常见问题和易错点。对于`if`语句,需注意使用大括号避免逻辑错误,完整比较操作,以及理解`&&`和`||`的短路行为。在`switch`语句中,要注意只能基于常量进行判断,每个`case`后应有`break`,并提供`default`分支。避免错误的策略包括始终使用大括号、确保清晰的条件、进行代码审查和编写单元测试。掌握这些要点对编写高效、可维护的代码至关重要。
14 0
Java一分钟之-控制流程:if条件语句与switch
|
3月前
|
移动开发 C语言
C语言控制流程
C语言控制流程
10 0
|
8月前
|
C++
C++第3~4章:运算\程序流程结构
C++第3~4章:运算\程序流程结构
47 0
|
11月前
|
C# 容器
【C#本质论 四】操作符和控制流程
【C#本质论 四】操作符和控制流程
57 0
【C#本质论 四】操作符和控制流程
|
11月前
|
Python 容器
Python控制流程,函数
Python控制流程,函数
VBA 控制流程select
VBA 控制流程select
92 0
|
存储 C# Windows