2023最新版本Activiti7系列-任务分配

news2024/11/8 15:32:57

任务分配

在这里插入图片描述

1.固定分配

  在指派用户任务的审批人时。我们是直接指派的固定账号。但是为了保证流程设计审批的灵活性。我们需要各种不同的分配方式,所以这节我们就详细的来介绍先在Activiti7中我们可以使用的相关的分配方式.

  固定分配就是我们前面介绍的,在绘制流程图或者直接在流程文件中通过Assignee来指定的方式.

在这里插入图片描述

2. 表达式

  Activiti使用UEL进行表达式解析。UEL代表Unified Expression Language,是EE6规范的一部分(查看EE6规范了解更多信息)。为了在所有环境上支持UEL标准的所有最新特性,我们使用JUEL的修改版本。

  表达式可以用于例如Java服务任务 Java Service tasks, 执行监听器 Execution Listeners, 任务监听器 Task Listeners 与 条件流 Conditional sequence flows。尽管有值表达式与方法表达式两种表达式,通过Activiti的抽象,使它们都可以在需要expression(表达式)的地方使用。

${myVar}
${myBean.myProperty}

2.1 值表达式

  我们在处理的位置通过UEL表达式来占位。

在这里插入图片描述

然后做流程的部署和启动操作:

/**
 * 流程部署操作
 */
@Test
public void test1(){
    // 1.获取ProcessEngine对象
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    // 2.完成流程的部署操作 需要通过RepositoryService来完成
    RepositoryService repositoryService = processEngine.getRepositoryService();
    // 3.完成部署操作
    Deployment deploy = repositoryService.createDeployment()
            .addClasspathResource("flow/test2.bpmn20.xml")
            .name("请假流程-流程变量")
            .deploy(); // 是一个流程部署的行为 可以部署多个流程定义的
    System.out.println(deploy.getId());
    System.out.println(deploy.getName());
}

然后我们发起请假流程:

/**
 * 发起一个流程
 */
@Test
public void test3(){
    ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
    // 发起流程 需要通过 runtimeService来实现
    RuntimeService runtimeService = engine.getRuntimeService();
    // 通过流程定义ID来启动流程  返回的是流程实例对象
    ProcessInstance processInstance = runtimeService
            .startProcessInstanceById("test01:1:12503");
    System.out.println("processInstance.getId() = " + processInstance.getId());
    System.out.println("processInstance.getDeploymentId() = " + processInstance.getDeploymentId());
    System.out.println("processInstance.getDescription() = " + processInstance.getDescription());
}

我们发起流程后。根据流程的设计应该需要进入到人事审批。但是呢。审批的用户是${assign1}是一个流程变量。那么还没有赋值的情况下。那么系统是没有办法识别的。

在这里插入图片描述

我们需要在进入该节点前对流程变量赋值

/**
 * 发起一个流程
 */
@Test
public void test3(){
    ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
    // 发起流程 需要通过 runtimeService来实现
    RuntimeService runtimeService = engine.getRuntimeService();
    // 对流程变量做赋值操作
    Map<String,Object> map = new HashMap<>();
    map.put("assgin1","张三");
    map.put("assign2","李四");
    // 通过流程定义ID来启动流程  返回的是流程实例对象
    ProcessInstance processInstance = runtimeService
            .startProcessInstanceById("test01:1:12503",map);
    System.out.println("processInstance.getId() = " + processInstance.getId());
    System.out.println("processInstance.getDeploymentId() = " + processInstance.getDeploymentId());
    System.out.println("processInstance.getDescription() = " + processInstance.getDescription());
}

然后我们就可以看到对应的表结构中的待办记录

在这里插入图片描述

同时需要了解 : ACT_RU_VARIABLE

在这里插入图片描述

2.2 方法表达式

  方法表达式 Method expression: 调用一个方法,可以带或不带参数。**当调用不带参数的方法时,要确保在方法名后添加空括号(以避免与值表达式混淆)。**传递的参数可以是字面值(literal value),也可以是表达式,它们会被自动解析。例如:

${printer.print()}
${myBean.getAssignee()}
${myBean.addNewOrder('orderName')}
${myBean.doSomething(myVar, execution)}

  myBean是Spring容器中的个Bean对象,表示调用的是bean的addNewOrder方法.我们通过案例来演示下。我们先定义对应的Service

先定义Bean

public class MyBean {

    public String getAssignee(){
        System.out.println("本方法执行了....");
        return "波哥";
    }
}

然后在Spring的配置文件中注册

在这里插入图片描述

然后在绘制流程图的时候就可以对应的指派了。

在这里插入图片描述

然后我们先部署流程

/**
 * 流程部署操作
 */
@Test
public void test1(){
    // 1.获取ProcessEngine对象
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    // 2.完成流程的部署操作 需要通过RepositoryService来完成
    RepositoryService repositoryService = processEngine.getRepositoryService();
    // 3.完成部署操作
    Deployment deploy = repositoryService.createDeployment()
            .addClasspathResource("flow/test3.bpmn20.xml")
            .name("请假流程-方法表达式")
            .deploy(); // 是一个流程部署的行为 可以部署多个流程定义的
    System.out.println(deploy.getId());
    System.out.println(deploy.getName());
}

然后我们发起新的流程。注意在这块我们可以不用添加流程变量信息了。因为人事审批节点的审批人是通过流程方法来赋值的

/**
 * 发起一个流程
 */
@Test
public void test3(){
    ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
    // 发起流程 需要通过 runtimeService来实现
    RuntimeService runtimeService = engine.getRuntimeService();
    // 通过流程定义ID来启动流程  返回的是流程实例对象
    ProcessInstance processInstance = runtimeService
            .startProcessInstanceById("test01:2:27503");
    System.out.println("processInstance.getId() = " + processInstance.getId());
    System.out.println("processInstance.getDeploymentId() = " + processInstance.getDeploymentId());
    System.out.println("processInstance.getDescription() = " + processInstance.getDescription());
}

可以看到操作成功。方法表达式被执行了

在这里插入图片描述

同时待办中的审批人就是方法表达式返回的结果
在这里插入图片描述

3.监听器分配

  可以使用监听器来完成很多Activiti的流程业务。我们在此处使用监听器来完成负责人的指定,那么我们在流程设计的时候就不需要指定assignee。创建自定义监听器:

public class MyFirstListener implements TaskListener {
    /**
     * 监听器触发的回调方法
     * @param delegateTask
     */
    @Override
    public void notify(DelegateTask delegateTask) {
        System.out.println("---->自定义的监听器执行了");
        if(EVENTNAME_CREATE.equals(delegateTask.getEventName())){
            // 表示是Task的创建事件被触发了
            // 指定当前Task节点的处理人
            delegateTask.setAssignee("boge666");
        }

    }
}

在配置流程的时候关联监听器。注意对应的事件。CREATE

在这里插入图片描述

然后我们部署和启动流程后。可以看到自定义的监听器触发了

在这里插入图片描述

而且待办中的任务的处理人就是监听器中设置的信息

在这里插入图片描述

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

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

相关文章

vr沉浸式仿真实训展厅中控系统提高课堂纪律

为解决实训教学过程中“看不到、进不去、成本高、危险大”的问题&#xff0c;VR智能中控系统为职业教育及高等教育老师提供一个数字化、沉浸式、集中管控的实训教学工具。 VR智能中控系统通过对VR教学课堂的实时监控、数据的收集和分析&#xff0c;为气象学院的教学提供更多帮助…

STM32 HAL库 使用 USB HID 配置

STM32 HAL库 HID 配置 STM32 CubeMax 配置修改USB描述符修改HID设备PID VID修改HID报告间隔修改USB报告长度发送和接收发送接收 STM32 CubeMax 配置 我这里使用的是HS接口但使用的是内部FS核。 修改USB描述符 在 usbd_custom_hid_if.c 的 CUSTOM_HID_ReportDesc_HS 或 CUSTO…

python基础----08-----json、pyecharts模块介绍以及折线图、地图、柱状图的绘制

一 python变量和json数据的相互转化 json就是 一种在各个编程语言中流通的数据格式&#xff0c;负责不同编程语言中的数据传递和交互、类似于: 国际通用语言 -英语。 import json if __name__ __main__:# 1. 将python变量转成json(列表->json)# 准备列表&#xff0c;列表内…

css background-position属性

定义 background-position 属性用于设置或获取元素背景图像相对于原点的初始位置。 background-position 基本语法 background-position&#xff1a;背景图片水平位置参数 背景图片垂直位置参数 &#xff1b; background-position 通常使用水平方向以及垂直方向的组合来定义背…

locust的安装和运行的demo

最近开始学习locust&#xff0c;从最初的安装到运行一个简单的demo。 lcoust官网上有介绍安装和使用&#xff1a;https://docs.locust.io/en/stable/installation.html locust 需要的python环境&#xff0c;首先要安装python。 因为本人已经安装了python以及python…

Spring Boot集成WebSocket Demo,简单明了

如果是初次搭建Spring BootWebSocket项目&#xff0c;不需要太复杂&#xff0c;只需要快速上手&#xff0c;那么你搜到的大部分文章可能都不适合你&#xff0c;我的这篇文章以最精简的方式搭建一个可以运行并通信的Spring BootWebSocket的Demo项目&#xff0c;有了根基之后再进…

记录部署ChatGLM大语言模型过程

1.什么是 ChatGLM&#xff1a; ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型&#xff0c;基于 General Language Model 架构&#xff0c;具有 62 亿参数。结合模型量化技术&#xff0c;用户可以在消费级的显卡上进行本地部署&#xff08;INT4 量化级别下最低只需 6GB…

融合创新,着眼全局:泛工具行业增长如何顺势而为?

提到工具&#xff0c;你想到的是什么&#xff1f;办公场景中的扫描、传输、会议等工具&#xff0c;还是生活中帮你记录点滴、培养习惯的监督类APP&#xff0c;亦或者是消费支付买买买、旅游出行预订&#xff0c;甚至回家后的智能家居……工具类应用已经渗入我们工作生活的方方面…

数据结构与算法12:图、广度优先、深度优先

目录 【图】 【图的存储方法】 方法1&#xff1a;邻接矩阵 方法2&#xff1a;邻接链表 【图的算法】 广度优先搜索&#xff08;BFS&#xff09; 深度优先搜索&#xff08;DFS&#xff09; 【图】 在 数据结构与算法09&#xff1a;二叉树 这篇文章中讲述了“树”这种数…

RPC(远程过程调用)与消息队列介绍

文章目录 前言 一、过程调用分类 1.本地调用(Local Procedure Call,简称LPC) 2.远程调用(Remote Procedure Call&#xff0c;简称RPC) 二、API/SDK的区别是什么? 开发过程中,我们经常需要调用别人写的功能 三、WebClient 四、消息服务 目录 前言 一、过程调用分类 1.本…

excel转xmind

有如下excel&#xff0c;我们想把它转为xmind&#xff1b; 一、主流程 先说一下主要的流程&#xff1a; 需要把excel数据复制出来&#xff0c;放到文本编辑器&#xff08;如notepad&#xff09;中&#xff0c;比较乱哈&#xff0c;如下&#xff1a; 然后需要调整成如下格式…

JavaSE-04【方法】

JavaSE-04【方法】 第一章 方法 1.1 方法定义的格式详解 1、方法&#xff1a;就是若干语句的功能集合2、生活案例&#xff1a; 爆米花机&#xff1a; 原料&#xff1a;(玉米、糖) 产物&#xff1a;爆米花 3、方法中的两个重要名词 参数&#xff1a;即原料&#xff0c;就是进…

api接口汇总的平台

大麦网是一个在线购票平台&#xff0c;为音乐会、演唱会、话剧、体育比赛等各类娱乐活动提供门票销售服务。通过大麦网&#xff0c;用户可以轻松购买心仪的演出门票&#xff0c;并享受到良好的购票体验。 为了让更多用户了解到大麦网的商品详情&#xff0c;并能够方便地获取相…

网络协议 — IPv6 互联网协议第 6 版

目录 文章目录 目录IPv6IPv6 数据包格式固定报头扩展头部 IPv6 地址格式IPv6 网络的基本组成元素IPv6 的地址分类和寻址模式单播地址全球唯一地址&#xff08;Global Unique Address&#xff09;唯一本地地址&#xff08;Unique Local Unicast Address&#xff09;链路本地地址…

新手学习eclipse使用

目录 1 工具安装2 安装插件3 创建项目4 启动项目总结 对于新手程序员来说&#xff0c;选择一款趁手的工具还是有必要的。目前IDE比较好使用的是两块IDEA和eclipse&#xff0c;IDEA收费而且每年的费用不低&#xff0c;eclipse免费比较适合使用。 1 工具安装 下载地址&#xff1…

oracle-缩小表空间

刚准备收拾东西准备下班&#xff0c;突然接一个帮忙的事情&#xff0c;11g rac环境数据磁盘组使用率100%了&#xff0c;业务无法使用了&#xff0c;重新开电脑速战速决。 直接登录环境中&#xff0c;计划立刻释放一点点空间出来让业务恢复使用&#xff0c;业务恢复了再考虑增加…

100天精通Golang(基础入门篇)——第4天: Go语言中的变量与常量详解:声明、赋值和使用

&#x1f337; 博主 libin9iOak带您 Go to Golang Language.✨ &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &#x1f30a; 《I…

Shell脚本攻略:expect脚本免交互

目录 目录 一、理论 1.Here Document 2.expect实现免交互 二、实验 1.实验一 2.实验二 3.实验三 4.问题 一、理论 1.Here Document &#xff08;1&#xff09;概念 Here Document也被称为here-document/here-text/heredoc/hereis/here-string/here-script&#xff0c…

MYSQL的卸载、下载、安装、配置一步到位(超详细教程)

MYSQL的卸载、下载、安装、配置一步到位(超详细教程) 一、卸载 1.控制面板卸载 全部卸载 2.卸载数据文件 在安装的时候会有安装地址和数据库地址 找到自己安装数据库的地址&#xff0c;删除MySQL里面的内容 3.删除环境变量 此电脑–>属性–>高级系统设置–>环境变量…

爬虫代理IP池怎么来的,可能遇到哪些问题,怎么解决

目录 前言 一、代理IP对爬虫工作的重要性 二、代理IP池从哪里来 三、爬虫工作中可能会遇到哪些问题 四、怎么解决遇到的问题 总结 前言 爬虫工作离不开代理IP的支持&#xff0c;代理IP在爬虫工作中发挥重要的作用&#xff0c;但爬虫代理IP池从哪里来呢&#xff0c;爬虫工…