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

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

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

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

没有任何问题

相关文章
|
5月前
|
人工智能 自然语言处理 搜索推荐
学霸养成计划:AI如何打造你的专属“学习外挂”?
学霸养成计划:AI如何打造你的专属“学习外挂”?
141 0
|
11月前
|
人工智能 监控 安全
《鸿蒙NEXT星盾安全架构:为人工智能服务安全保驾护航》
鸿蒙NEXT的星盾安全架构为人工智能服务提供了全方位的安全保障。通过严格的应用管控、创新的数据访问机制、系统级文件加密、隐私透明管理和高等级安全认证,星盾有效防止恶意应用、保护用户隐私,确保数据传输安全,增强用户信任,推动AI技术健康发展。
533 16
|
4月前
|
人工智能 自然语言处理 分布式计算
AI 驱动传统 Java 应用集成的关键技术与实战应用指南
本文探讨了如何将AI技术与传统Java应用集成,助力企业实现数字化转型。内容涵盖DJL、Deeplearning4j等主流AI框架选择,技术融合方案,模型部署策略,以及智能客服、财务审核、设备诊断等实战应用案例,全面解析Java系统如何通过AI实现智能化升级与效率提升。
345 0
|
5月前
|
NoSQL 数据可视化 API
API数据可视化:从MongoDB到Tableau的数据分析链路
本方案构建从 MongoDB 到 Tableau 的 API 数据可视化链路,涵盖数据获取、清洗、存储与可视化四大环节。采用 Python 抓取并清洗数据,以 MongoDB 存储并优化查询性能,最终通过 Tableau 实现多维可视化分析。内容含完整代码、架构设计与性能优化策略,助力企业快速构建数据驱动的分析体系。
|
9月前
|
存储 文字识别 数据可视化
让你的电脑变得与众不同的冷门小工具
本文推荐了5款冷门但功能强大的小工具:1. MiniBin,轻量级回收站管理工具;2. AltairSimLab,多物理场仿真平台;3. 燃精灵,微信空号检测软件;4. IrfanView,经典图像查看器;5. Folder Size View,磁盘空间分析工具。这些软件体积小巧,功能出色,可大幅提升工作效率。
219 4
|
10月前
|
机器学习/深度学习 存储 算法
基于结构化状态空间对偶性的贝叶斯注意力机制设计与实现
本文介绍了一种贝叶斯风格的注意力机制,用于处理长序列文本预测。传统注意力机制在处理长文本时计算复杂度高,而贝叶斯方法通过引入不确定性建模和领域知识,特别适用于小数据集或需要融入领域知识的场景。
233 3
基于结构化状态空间对偶性的贝叶斯注意力机制设计与实现
|
9月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于贝叶斯优化的自适应马尔科夫链蒙特卡洛(Adaptive-MCMC)算法matlab仿真
本项目基于贝叶斯优化的自适应马尔科夫链蒙特卡洛(Adaptive-MCMC)算法,实现MATLAB仿真,并对比Kawasaki sampler、IMExpert、IMUnif和IMBayesOpt四种方法。核心在于利用历史采样信息动态调整MCMC参数,以高效探索复杂概率分布。完整程序在MATLAB2022A上运行,展示T1-T7结果,无水印。该算法结合贝叶斯优化与MCMC技术,通过代理模型和采集函数优化采样效率。
|
并行计算 算法 数据处理
【MATLAB 】 MODWT 信号分解+模糊熵(近似熵)算法
【MATLAB 】 MODWT 信号分解+模糊熵(近似熵)算法
301 0
|
Python
求解带有限重的三维装箱问题——启发式深度优先搜索算法
求解带有限重的三维装箱问题——启发式深度优先搜索算法
415 4