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

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

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

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

没有任何问题

相关文章
|
并行计算 算法 数据处理
【MATLAB 】 MODWT 信号分解+模糊熵(近似熵)算法
【MATLAB 】 MODWT 信号分解+模糊熵(近似熵)算法
247 0
|
存储 测试技术
【计算机组成原理】第五章单元测试
【计算机组成原理】第五章单元测试
254 0
|
算法 容灾 专有云
回答面试官:我“腿特长”!阿里云小哥哥小姐姐咋看( 0 x 0 )?
面对特长这个问题,其实有很多小伙伴是很迷茫的。不知道如何准备或如何回答或展示,甚至不知道自己有什么特长怎么办?
3277 0
回答面试官:我“腿特长”!阿里云小哥哥小姐姐咋看( 0 x 0 )?
|
安全 算法 网络协议
Gns3模拟器配置Cisco ASA防火墙
如图所示:  inside主机基本配置 inside>en inside#conf t inside(config)#int f0/0 inside(config-if)#ip add 10.
2239 0
|
XML C# 数据格式
Web系统下Office文档的处理 之OpenXml应用分类资料
本文对常见的处理参考和工具提供一个简要的参考。 对于实际的解决方案参考如下地址(有很多的分类知识) http://blogs.msdn.com/b/ericwhite/archive/2008/10/20/eric-white-s-blog-s-table-of-contents.
1267 0
|
1天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1063 0
|
10天前
|
人工智能 运维 安全
|
1天前
|
弹性计算 Kubernetes jenkins
如何在 ECS/EKS 集群中有效使用 Jenkins
本文探讨了如何将 Jenkins 与 AWS ECS 和 EKS 集群集成,以构建高效、灵活且具备自动扩缩容能力的 CI/CD 流水线,提升软件交付效率并优化资源成本。
242 0
|
8天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
9天前
|
人工智能 测试技术 API
智能体(AI Agent)搭建全攻略:从概念到实践的终极指南
在人工智能浪潮中,智能体(AI Agent)正成为变革性技术。它们具备自主决策、环境感知、任务执行等能力,广泛应用于日常任务与商业流程。本文详解智能体概念、架构及七步搭建指南,助你打造专属智能体,迎接智能自动化新时代。