使用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());
    }
}

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

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

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

没有任何问题

相关文章
|
7月前
|
C++
C++的控制流
C++的控制流
|
7月前
|
C语言
if`语句是一种控制流程
if`语句是一种控制流程
43 0
|
7月前
|
C++
第二章:C++中的控制流程
第二章:C++中的控制流程
46 1
|
24天前
控制流
条件语句:根据条件的真假来执行不同的代码块。 if (x > 10) { System.out.println("x is greater than 10"); } else { System.out.println("x is less than or equal to 10"); } switch (day) { case 1: System.out.println("Monday"); break; case 2: System.out.println("Tuesday"); break; default: System.out.println("Other day"); break;
|
6月前
|
C语言
C语言控制流程详解:分支与循环语句
C语言控制流程详解:分支与循环语句
43 0
|
7月前
|
Java 测试技术
Java一分钟之-控制流程:if条件语句与switch
【5月更文挑战第8天】本文探讨了Java编程中的`if`和`switch`控制流程语句,强调了常见问题和易错点。对于`if`语句,需注意使用大括号避免逻辑错误,完整比较操作,以及理解`&&`和`||`的短路行为。在`switch`语句中,要注意只能基于常量进行判断,每个`case`后应有`break`,并提供`default`分支。避免错误的策略包括始终使用大括号、确保清晰的条件、进行代码审查和编写单元测试。掌握这些要点对编写高效、可维护的代码至关重要。
67 0
Java一分钟之-控制流程:if条件语句与switch
|
7月前
|
存储 Serverless Python
函数调用的过程
函数调用的过程
97 0
|
7月前
|
移动开发 C语言
C语言控制流程
C语言控制流程
41 0
|
Java 数据安全/隐私保护
【逻辑控制练习题+方法的使用和重载+函数调用】
【逻辑控制练习题+方法的使用和重载+函数调用】
51 0
|
存储 程序员 编译器
变量的本质分析、内存四区、函数调用模型
变量的本质分析、内存四区、函数调用模型
54 0

热门文章

最新文章