activiti流程变量

news2024/11/26 5:31:42

activiti流程变量

定义
流程变量在Activiti 中是一个十分重要的角色,流程运转时,需要靠流程变量,业务系统和activiti 结合时少不了流程变量,流程变量就是activiti 在管理工作流时根据管理需要而设置的变量。比如:在出差申请流程流转是如果出差天数大于三天则需要总经理审批,否者只需要认识审批,出差天数就可以设置为流程变量,在流程流转时使用。

类型
如果将实体 存入到流程变量中,则实体必须实现序列化接口serializable,为了防止由于新增字段无法反序列化,需要横撑serialVersionUid

作用域:
流程变量的作用域可以是一个流程实例(processInstence),或者一个任务(Task),或者一个执行实例(execution)

Local变量
任务和执行实例仅仅是针对一个任务和一个执行实例的范围,范围没有流程实例大,成为local变量。

    Local 变量由于在不同的任务或不同的执行实例中,作用域互不影响,变量名可以相同没有影响,Local变量也可以和global变量名相同,没有影响!

流程变量的使用方法
- 在属性上使用UEL表达式
可以在assignee 处设置UEL表达式,表达式的值为任务的负责人,比如:${assigness},assigness 就是一个流程变量名称

    - 在连线上使用UEL表达式,决定流程走向
    比如:${price<10000},price 就是一个流程变量名称,uel表达式结果为一个布尔类型

实例
员工创建出差申请单,由部门经理审核,部门经理审核通过后,出差三天以下由财务直接审批,三天以上先由总经理审核,总经理审核通过再由财务审批。
在这里插入图片描述
设置流程实例的三种方式

方式一:启动流程时设置流程变量
在启动流程时设置流程变量,变量的作用域是整个流程实例。
通过Map<key,value>设置流程变量,map中可以设置多个变量,这个key就是流程变量的名字

/**
 * 发起一个流程
 */
@Test
public void test3(){
    ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
    // 发起流程 需要通过 runtimeService来实现
    RuntimeService runtimeService = engine.getRuntimeService();
    // 定义流程变量信息
    Map<String,Object> map = new HashMap<>();
    map.put("assignee1","张三");
    map.put("assignee2","李四");
    map.put("ass1","变量1");
    map.put("ass2",299);
    map.put("ass3","湖南长沙");
    map.put("ass4","波哥666");
    // 通过流程定义ID来启动流程  返回的是流程实例对象
    ProcessInstance processInstance = runtimeService
            .startProcessInstanceById("holiday1:1:42503",map);
    System.out.println("processInstance.getId() = " + processInstance.getId());
    System.out.println("processInstance.getDeploymentId() = " + processInstance.getDeploymentId());
    System.out.println("processInstance.getDescription() = " + processInstance.getDescription());
}

方式二:在任务办理时设置流程变量
在完成任务时设置流程变量,该流程变量只有在该任务完成后其它结点才可使用该变量,它的作用域是整个流程实
例,如果设置的流程变量的 key 在流程实例中已存在相同的名字则后设置的变量替换前边设置的变量。

方式三:通过当前流程实例设置
通过流程实例id 设置全局变量,该流程实例必须未执行完成。

    @Test
    public void test_completeTask(){
        RepositoryServicerepositoryService =   processEngine().getRepositoryService();
        Map<String,Object>varlues = new HashMap();
        varlues.put("applyTitle","test_请假申请流程");
        varlues.put("applyTime","7天");
        TaskServicetaskService =processEngine().getTaskService();

        taskService.complete("5005",varlues);

}

通过任务实例来设置流程变量


    @Test
    public void testProcessInstanceIdSetVariables() {
        //        1.获取引擎
        ProcessEngineConfiguration configuration =
                ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
                        "activiti.cfg.xml", "processEngineConfiguration");
        ProcessEngine processEngine = configuration.buildProcessEngine();
        // 获取 RuntimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();
        List<ProcessInstance> processInstances = runtimeService.createProcessInstanceQuery().processDefinitionKey("evection-global").list();
 
        Evection evection = new Evection();
        evection.setNum(2d);
        for (ProcessInstance instance : processInstances) {
            runtimeService.setVariables("17501", Map.of("assigness02", "王经理"
                    , "assigness03", "李总经理"
                    , "evection", evection));
        }
    }

Local 流程变量的设置
local流程变量的作用域只在当前任务节点下可用
添加


@Test
    public void testTaskCompleteSetLocalVariables() {
        //        1.获取引擎
        ProcessEngineConfiguration configuration =
                ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
                        "activiti.cfg.xml", "processEngineConfiguration");
        ProcessEngine processEngine = configuration.buildProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        List<Task> tasks = taskService.createTaskQuery().taskAssignee("").list();
        for (Task task : tasks) {
//            System.out.println(task.getId());
            taskService.setVariableLocal(task.getId(),"evection","local-variable");
        }
    }

查看

 @Test
    public void testTaskCompleteGetLocalVariables() {
        //        1.获取引擎
        ProcessEngineConfiguration configuration =
                ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
                        "activiti.cfg.xml", "processEngineConfiguration");
        ProcessEngine processEngine = configuration.buildProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        List<Task> tasks = taskService.createTaskQuery().taskAssignee("王经理").list();
        for (Task task : tasks) {
            System.out.println(taskService.getVariableLocal("22502", "evection"));
        }
    }

如果任务完成后,可以通过查看历史信息进行查看

@Test
    public void testFindHisLocalVariable() {
        //        1.获取引擎
        ProcessEngineConfiguration configuration =
                ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
                        "activiti.cfg.xml", "processEngineConfiguration");
        ProcessEngine processEngine = configuration.buildProcessEngine();
        HistoryService historyService = processEngine.getHistoryService();
        List<HistoricTaskInstance> instances = historyService.createHistoricTaskInstanceQuery().includeTaskLocalVariables().list();
        for (HistoricTaskInstance instance : instances) {
            System.out.println("==============================");
            System.out.println("任务id:" + instance.getId());
            System.out.println("任务名称:" + instance.getName());
            System.out.println("任务负责人:" + instance.getAssignee());
            System.out.println("任务local变量:" + instance.getTaskLocalVariables());
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1023801.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JADE盲分离算法仿真

JADE算法原理 JADE 算法首先通过去均值预白化等预处理过程得到解相关的混合信号&#xff0c;预处理后的信号构建的协方差矩阵变为单位阵&#xff0c;为后续的联合对角化奠定基础&#xff1b;其次&#xff0c;通过建立四阶累积量矩阵&#xff0c;利用高阶累积量的统计独立性等性…

React+Node——next.js 构建前后端项目

一、安装全局依赖 npm i -g create-next-app二、创建next项目 create-next-app react-next-demo //或 create-next-app react-next-demo --typescript三、加载mysql依赖 npm i -S mysql2四、运行项目 npm run dev五、创建db文件目录&#xff0c;目录下创建index.ts import…

WebRTC系列--sdp协商中的answer编解码协商过程

关于createAnswer的流程在前面的文章WebRTC系列-SDP之CreateAnswer这篇文章中有详细的分析。 这篇文章主要对于MediaSessionDescriptionFactory的AddAudioContentForAnswer做详细的分析,也就是说对于音频编码的匹配也是在这个方法里实现: 首先主要的函数调用如下图: 这篇文…

怒赞,阿里P8推荐的Java面试宝典:41个专题PDF(史上最全+面试必备)

《尼恩Java面试宝典》 40岁老架构师 尼恩 经过对大量 Java面试题 的不断梳理、迭代&#xff0c; 编著成5000页的《尼恩Java面试宝典》&#xff0c;致力于体系化&#xff0c; 系统化&#xff0c;形象化 梳理&#xff0c;形成一个大的知识体系&#xff0c;从而帮助大家 进大厂&a…

20-SpringCloudAlibaba-1

一 Spring Cloud Alibaba简介 什么是Spring Cloud Alibaba Spring Cloud Alibaba致力于提供微服务开发的一站式解决方案。 此项目包含开发分布式应用微服务的必需组件&#xff0c;方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。 为什么要推出Sp…

Python处理英文文档(添加音标和翻译)

Python处理英文文档&#xff08;添加音标和翻译&#xff09; Python处理英文文档单词标注音标英文翻译对word文档的操作方法整合待改进之处 Python处理英文文档 上英语课的时候老师总喜欢找人读文章和翻译文章&#xff0c;一点点的准备太浪费时间&#xff0c;就用Python写了一…

已解决 Python Error: ImportError: No module named ‘module_name‘

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页: &#x1f405;&#x1f43e;猫头虎的博客&#x1f390;《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f996…

人声分离网站,帮你快速提取视频中的人声和背景音乐

今天给大家带来一个可以分离人声的网站——音分轨&#xff0c;他运用人工智能算法可以将音频中的人声部分和音乐部分分离&#xff0c;使我们的视频制作过程可以更方便。 我们点击右下角“选择文件”上传一个音频&#xff0c;上传好音频后&#xff0c;人工智能就开始处理我们上传…

同步 -- 信号量

本篇文章基于Linux-6.5源码 建议&#xff1a;搭配Linux源码观看更佳 struct semaphore {raw_spinlock_t lock; // 保护信号量的自旋锁unsigned int count; // 最大同时可访问临界区的进程数量struct list_head wait_list; // 等待队列&#xff0c;wait_list指…

linux 磁盘命令之du和df命令

du相关的命令: du -ah 显示所有目录或文件所占空间 du -KG 显示所有目录或文件所占空间 块大小K为单位 du -BM 显示所有目录或文件所占空间 块大小M为单位 du -BG 显示所有目录或文件所占空间 块大小G为单位du -sh [目录名] 返回该目录的大小 du -sm [文件夹] 返回该文…

5.2 磁盘CRC32完整性检测

CRC校验技术是用于检测数据传输或存储过程中是否出现了错误的一种方法&#xff0c;校验算法可以通过计算应用与数据的循环冗余校验&#xff08;CRC&#xff09;检验值来检测任何数据损坏。通过运用本校验技术我们可以实现对特定内存区域以及磁盘文件进行完整性检测&#xff0c;…

Java“牵手”天猫商品列表页数据采集+天猫商品价格数据排序,天猫API接口申请指南

天猫开放平台接口获取商品列表和详情数据&#xff0c;具体步骤如下&#xff1a; 在开放平台注册并创建一个应用&#xff0c;获取到 App Key 和 App Secret等信息。使用获取到的信息进行签名和认证&#xff0c;获取 Access Token。调用开放平台提供的接口&#xff0c;传入商品 …

PM3398B-6P-1–3P-E 借助物联网和人工智能解决方案

PM3398B-6P-1–3P-E 借助物联网和人工智能解决方案 油砂中的卡车发动机捕获大量数据&#xff0c;如振动、温度、压力和吞吐量等参数。但是这些数据大部分都没有被使用。借助物联网和人工智能解决方案&#xff0c;您可以轻松利用这些数据获得有用的见解。这些见解有助于您提高发…

1.wifi开发,wifi连接初次连接电脑没有识别,搭建环境

wifi连接初次连接电脑没有识别 1.不识别可能是线的问题&#xff0c;即使wifi的灯亮了&#xff0c;虽然串口却没有找到。所以解决方法就是重新来一个usb的线 一。初步使用 &#xff08;1&#xff09;使用ESP烧写工具&#xff08;选择esp8266&#xff09; &#xff08;2&#xf…

TienChin 渠道管理-添加渠道

在我们平时新建一个全新的 Java 类&#xff0c;这个类需要存放的包不存在&#xff0c;可以使用如下的方式进行创建&#xff1a; 含义就是说&#xff0c;将 ChannelVO 这个类放在 vo 这个包当中&#xff0c;如果存在则不创建&#xff0c;存在就将新建的类放入其中。 ChannelVO /…

2000-2018年各省能源消费和碳排放数据

2000-2018年各省能源消费和碳排放数据 1、时间&#xff1a;2000-2018年 2、范围&#xff1a;30个省市 3、指标&#xff1a;id、year、ENERGY、COAL、碳排放倒数*100 4、来源&#xff1a;能源年鉴 5、指标解释&#xff1a; 2018年碳排放和能源数据为插值法推算得到 碳排放…

SpringBoot接口中如何直接返回图片数据

SpringBoot接口中如何直接返回图片数据 目录 接口直接返回图片数据 起因 类似这种 根据个人经验 优雅的实现图片返回 接口直接返回图片数据 起因 最近在做涉及到分享推广的业务&#xff0c;需要由业务员分享二维码进入推广页面&#xff0c;由于是新项目&#xff0c;前期…

Vue.js基本语法上

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《Spring与Mybatis集成整合》《springMvc使用》 ⛺️ 生活的理想&#xff0c;为了不断更新自己 ! 目录 1.插值 1.1 文本 1.2 v-v-html 1.3 数据双向绑定数据(v-model) 1.4 属性&#xff…

fork函数

二.fork函数 2.1函数原型 fork()函数在 C 语言中的原型如下&#xff1a; #include <unistd.h>pid_t fork(void);其中pid_t是一个整型数据类型&#xff0c;用于表示进程ID。fork()函数返回值是一个pid_t类型的值&#xff0c;具体含义如下&#xff1a; 如果调用fork()的…

Vue3 菜鸟入门(一)超详细:介绍、安装、打包、创建项目、目录结构、起步等

【学习笔记】Vue3 菜鸟入门&#xff08;一&#xff09;超详细&#xff1a;介绍、安装、打包、创建项目、目录结构、起步等 关键词&#xff1a;Vue 、Vue 3、Java、Spring Boot、Idea、数据库、一对一、培训、教学本文主要内容含Vue3介绍、安装、打包、创建项目、目录结构、起步…