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

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

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

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

没有任何问题

相关文章
|
安全 Java 关系型数据库
Spring boot整合Activiti7
Spring boot整合Activiti7
3762 0
Spring boot整合Activiti7
|
移动开发 安全 JavaScript
uniapp跨域解决
uniapp跨域解决
|
前端开发 API
uniapp中为什么会出现跨域问题,如何解决
uniapp中为什么会出现跨域问题,如何解决
4727 0
|
3月前
|
Dubbo Java 测试技术
上线别再“一刀切”!Gateway 做流量染色 + 灰度发布,告别线上事故
小富分享:通过Spring Cloud Gateway实现流量染色与灰度发布,为请求打标签(如VIP用户),结合自定义路由规则,实现新版本平滑上线。支持按用户、比例、设备等维度灰度,提升发布安全性,助力高效可控的线上迭代。
351 5
|
3月前
|
数据采集 API
京东:调用用户行为API分析购买路径,优化页面跳转逻辑
京东通过整合用户行为API,构建购买路径分析体系,运用马尔可夫链模型识别高损耗、断裂与冗余路径,优化页面跳转逻辑。实施流程合并、预加载及实时干预策略,转化率提升30.2%,路径缩短34.9%,跳转失败率下降78.7%,实现数据驱动的精细化运营。
348 0
|
4月前
|
人工智能 自然语言处理 分布式计算
AI 驱动传统 Java 应用集成的关键技术与实战应用指南
本文探讨了如何将AI技术与传统Java应用集成,助力企业实现数字化转型。内容涵盖DJL、Deeplearning4j等主流AI框架选择,技术融合方案,模型部署策略,以及智能客服、财务审核、设备诊断等实战应用案例,全面解析Java系统如何通过AI实现智能化升级与效率提升。
384 0
|
存储 Java 关系型数据库
java: 无法访问org.springframework.context.ConfigurableApplicationContext
`亲测可用,之前搜索了很多博客,啥样的都有,就是不介绍报错以及配置用处,根本不懂照抄那些配置是干啥的,稀里糊涂的按照博客搭完也跑不起来,因此记录这个。` `项目背景`:公司项目当前采用http协议+shiro+mysql的登录认证方式,而现在想支持ldap协议认证登录然后能够访问自己公司的项目网站。 `举例说明`:假设我们公司有自己的门户网站,现在我们收购了一家公司,他们数据库采用ldap存储用户数据,那么为了他们账户能登陆我们公司项目所以需要集成,而不是再把他们的账户重新在mysql再创建一遍,万一人家有1W个账户呢,不累死了且也不现实啊。
383 11
|
移动开发 前端开发 安全
uni-app跨域调试你学会了没
uni-app跨域调试你学会了没
424 0
|
人工智能 供应链 监控
【对话CIO】制造业出海,联想的经验与实战
【对话CIO】制造业出海,联想的经验与实战
|
并行计算 算法 数据处理
【MATLAB 】 MODWT 信号分解+模糊熵(近似熵)算法
【MATLAB 】 MODWT 信号分解+模糊熵(近似熵)算法
305 0