flowable任务分配方式篇动态部门经理:固定分配、表达式分配、监听器分配

这里写自定义目录标题

  • 1、固定分配
  • 2、表达式分配
      • 在此流程部署了之后,在流程定义信息表中可以看到此流程的相关信息
      • 启动流程
      • 查看我们设置的变量
        • 在task表中,可以看到当前分配人是张三,说明值表达式被解析了
      • 完成任务
        • 在张三完成任务之后,task表中的分配人变成了李四
        • 方法表达式 Method expression:
  • 3、监听器分配 -- 本篇重点,动态指定审批人为发起人的部门经理,原理需要结合 dept表#leader_id,获其他辅助表

1、固定分配

在绘制流程图或者直接在流程文件中通过Assignee来指定的方式。直接是写死的。

2、表达式分配

Flowable使用UEL进行表达式解析。UEL代表Unified Expression Language,是EE6规范的一部分(查看EE6规范了解更多信息)。

表达式可以用于Java服务任务(Java Service task)、执行监听器(Execution Listener)、任务监听器(Task Listener) 与 条件顺序流(Conditional sequence flow)等。尽管有值表达式与方法表达式这两种不同的表达式,Flowable通过抽象,使它们都可以在需要表达式的地方使用。

值表达式 Value expression: 解析为一个值。默认情况下,所有流程变量都可以使用。(若使用Spring)所有的Spring bean也可以用在表达式里。例如:

${myVar}
${myBean.myProperty}

myBean是Spring容器中的个Bean对象,表示调用的是bean的addNewOrder方法

首先新建一个值表达式的例子

可视编辑器–>分配用户–>固定值—>${assignee1}
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在此流程部署了之后,在流程定义信息表中可以看到此流程的相关信息

在这里插入图片描述

启动流程

    /*** 启动流程实例*/@Testpublic void TestDeploymentRun() {ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();RuntimeService runtimeService = processEngine.getRuntimeService();// 流程变量Map<String, Object> variables = new HashMap<String, Object>();variables.put("assignee0", "张三");variables.put("assignee1", "李四");// 启动流程实例// ProcessInstance processInstance = runtimeService.startProcessInstanceById("holidayRequest:1:37504", variables);ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("MyHolidayUI001", variables);System.out.println("processInstance.getProcessDefinitionId() = " + processInstance.getProcessDefinitionId()); // MyHolidayUI001:1:37504System.out.println("processInstance.getProcessDefinitionKey() = " + processInstance.getProcessDefinitionKey());// MyHolidayUI001System.out.println("processInstance.getActivityId() = " + processInstance.getActivityId());System.out.println("processInstance.getId()" + processInstance.getId());// 40001}

查看我们设置的变量

在这里插入图片描述

在task表中,可以看到当前分配人是张三,说明值表达式被解析了

在这里插入图片描述

完成任务

    /*** 完成任务*/@Testpublic void TestCompleteTask() {ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();TaskService taskService = processEngine.getTaskService();Task task = taskService.createTaskQuery().processInstanceId("40001") //根据流程实例编号查找.taskAssignee("张三").singleResult();taskService.complete(task.getId());}
在张三完成任务之后,task表中的分配人变成了李四

在这里插入图片描述

方法表达式 Method expression:

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

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

请注意,表达式支持解析(及比较)原始类型(primitive)、bean、list、array与map。

3、监听器分配 – 本篇重点,动态指定审批人为发起人的部门经理,原理需要结合 dept表#leader_id,获其他辅助表

任务监听器(Task Listener)

我们在此处使用监听器来完成审批人的动态指定,那么我们在流程设计的时候就不需要指定assignee。但是需要指定任务监听器。

在这里插入图片描述

创建自定义监听器:


/*** 动态指定部门经理审批监听器** @return* @author wangl* @date 2023-12-15*/
public class DeptLeaderTaskListener implements TaskListener {private static final Logger LOGGER = LoggerFactory.getLogger(DeptLeaderTaskListener.class);/*** 注入字段(名称与流程设计时字段名称一致) 参数 多个的话用分号隔开 实例 userCode:00004737;status:1*/private FixedValue level;private static final long serialVersionUID = 1L;private TaskService taskService = SpringUtils.getBean(TaskService.class);private ISysDeptService flowThirdService = SpringUtils.getBean(ISysDeptService.class);RuntimeService runtimeService = SpringUtils.getBean(RuntimeService.class);@Overridepublic void notify(DelegateTask delegateTask) {String taskId = delegateTask.getId();// 获取流程发起人ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(delegateTask.getProcessInstanceId()).singleResult();String startUserId = processInstance.getStartUserId();// 获取部门负责人列表List<String> depIds = flowThirdService.getLeaderByUserId(Long.valueOf(startUserId));if (CollectionUtil.isEmpty(depIds)) {LOGGER.warn("申请人[{}] 未指定部门领导人", startUserId);return;}int level_int = Integer.parseInt(level.toString());String leaderId = "";for (int i = 0; i < depIds.size(); i++) {if (i == level_int - 1) {leaderId = depIds.get(i);}}Map<String, Object> variables = taskService.getVariables(taskId);delegateTask.setAssignee(leaderId);variables.put("DeptLeaderTaskListener", leaderId);taskService.setVariables(taskId, variables);}}

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

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

相关文章

遇到DDOS了怎么去防御

DDOS攻击原理是什么 DDoS攻击的工作原理是通过控制发送大量的恶意流量&#xff0c;让目标网站瘫痪或服务器宕机&#xff0c;从而无法正常响应合法流量的访问请求。当你要访问某一主机或网站时&#xff0c;首先&#xff0c;将数据包发送到目标主机&#xff0c;并发出连接请求。…

为什么pmp证书只能对标cspm二级证书?

拿PMP认证可以直接认证CSPM&#xff1f;快来看看你符合哪个等级&#xff01; PMP认证大家了解的可能比较多&#xff0c;它推出的时间较长&#xff0c;并且仅在国内拿到认证的人数也与日俱增。而CSPM相对来说大家就比较陌生了&#xff0c;它是哪些部门发起的&#xff0c;有什么用…

云渲染UE4像素流送搭建(winows、ubuntu单实例与多实例像素流送)

windows/ubuntu20.4下UE4.27.2像素流送 像素流送技术可以将服务器端打包的虚幻引擎应用程序在客户端的浏览器上运行&#xff0c;用户可以通过浏览器操作虚幻引擎应用程序&#xff0c;客户端无需下载虚幻引擎&#xff0c;本文实现两台机器通过物理介质网线实现虚幻引擎应用程序…

【小白专用】C# 压缩文件 ICSharpCode.SharpZipLib.dll效果:

插件描述&#xff1a; ICSharpCode.SharpZipLib.dll 是一个完全由c#编写的Zip, GZip、Tar 、 BZip2 类库,可以方便地支持这几种格式的压缩解压缩, SharpZipLib 的许可是经过修改的GPL&#xff0c;底线是允许用在不开源商业软件中&#xff0c;意思就是免费使用。具体可访问ICSha…

图片素材管理软件Eagle for mac提高素材整理维度

Eagle for mac是一款图片素材管理软件&#xff0c;支持藏网页图片&#xff0c;网页截屏&#xff0c;屏幕截图和标注&#xff0c;自动标签和筛选等功能&#xff0c;让你设计师方便存储需要的素材和查找&#xff0c;提供工作效率。 Eagle mac软件介绍 Eagle mac帮助你成为更好、…

比宜德停业,奥乐齐死磕,硬折扣该怎样长硬不衰?

作者 | 楚文龙 来源 | 洞见新研社 刚刚过去的周末&#xff0c;让零售行业的从业者神经紧绷。因为&#xff0c;12月23日多个信源曝出&#xff0c;社区硬折扣超市比宜德已公告于12月22日起暂停营业。 作为中国第一家&#xff0c;也是唯一一家规模最大的硬折扣社区连锁店零售商&…

计算机视觉五大技术

目前&#xff0c;计算机视觉是深度学习领域最热门的研究领域之一。计算机视觉实际上是一个跨领域的交叉学科&#xff0c;包括计算机科学&#xff08;图形、算法、理论、系统、体系结构&#xff09;&#xff0c;数学&#xff08;信息检索、机器学习&#xff09;&#xff0c;工程…

ERP系统的优缺点有哪些?

企业在考虑引进ERP系统时总是比较谨慎的&#xff0c;毕竟&#xff0c;ERP关乎着企业的整体运营和未来发展。因此&#xff0c;选择适合的ERP系统对企业未来的成功至关重要。要全面评估&#xff0c;看看它到底能给企业带来啥好处&#xff0c;又可能会有啥风险。 看完这篇回答&am…

如何进行块存储管理

目录 块存储概念 块存储&#xff08;云盘&#xff09;扩容 方式一&#xff1a;直接扩容现有云盘 方式二&#xff1a;创建一块新数据盘 方式三&#xff1a;在更换操作系统时&#xff0c;同时更换系统盘 块存储&#xff08;云盘&#xff09;变配 云盘变配操作步骤 块存储概…

【Web】Ctfshow Thinkphp3.2.3代码审计(3)

web574 这题与web573的区别在于进find()前先进了where()处理 跟进where() 我们假设传个1&#xff0c;和id拼接 发现会进到is_string的判断里&#xff0c;让$options[where]array("_string">"1") 之后传入到find()&#xff0c;和web573一样也是以数组…

排查Java OutOfMemoryError(OOM)问题的思路

在Java应用程序开发过程中&#xff0c;我们可能会遇到因为内存溢出&#xff08;OutOfMemoryError&#xff0c;简称OOM&#xff09;造成的程序崩溃。这种问题通常是由于JVM中的堆&#xff08;Heap&#xff09;或方法区&#xff08;Metaspace&#xff09;容量不足以满足程序运行需…

因吹斯汀!只需上传照片,GPT-4V精准识别食物的卡路里和摄入热量

健身和减肥的朋友有福啦&#xff01; 最近一篇文章探索了GPT-4V在膳食评估领域的强大能力&#xff0c;可以根据饮食图片精准判断食物的种类与重量&#xff0c;并给出营养成分的分析&#xff0c;包括碳水化合物、蛋白质、脂肪占比。 最最重要的是&#xff0c;它还能告诉我们这…

如何进行实例管理

目录 修改实例规格 修改网络带宽 网站的访问量每天都比较高&#xff0c;网站明显变慢了&#xff0c;这是怎么回事&#xff1f; 这说明你的网站的并发访问能力已经不足了&#xff0c;并发访问是指同一时间&#xff0c;多个用户请求访问同一个域名下的资源或服务&#xff0c;请…

掌握JWT:解密身份验证和授权的关键技术

JSON Web Token 1、什么是JWT2、JWT解决了什么问题3、早期的SSO认证4、JWT认证5、JWT优势6、JWT结构Header 标头Payload 负载 Signature 签名 7、代码实现添加依赖生成Token认证token 8、工具类9、JWT整合Web10、拦截器校验11、网关路由校验12、解决多用户登录的问题13、客户端…

解决鸡兔同笼问题:使用Python进行编程

解决鸡兔同笼问题&#xff1a;使用Python进行编程 在古代中国的数学书《孙子算经》中&#xff0c;有一个著名的问题称为“鸡兔同笼”问题。这个问题描述了一种情况&#xff0c;在一个笼子里有鸡和兔子&#xff0c;我们知道笼子里头和脚的总数&#xff0c;但不知道具体有多少只…

线程学习(3)-volatile关键字,wait/notify的使用

​ &#x1f495;"命由我作&#xff0c;福自己求"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;线程学习(2)​​​​ 一.volatile关键字 volatile关键字是多线程编程中一个非常重要的概念&#xff0c;它主要有两个功能&#xff1a;保证内存可见性…

面向对象设计与分析40讲(15)简单工厂方法模式

文章目录 定义示例优缺点定义 简单工厂模式是一种创建型模式,用于根据客户端的需求创建对象实例,所谓的需求反映到编程语言里就是传入的参数。 简单工厂模式包括三个主要部分: 工厂类(Simple Factory):这是整个模式的核心。它负责根据客户端的请求来创建并返回相应的对…

Maven依赖管理项目构建工具

文章目录 Maven依赖管理项目构建工具目录一、Maven简介1. Maven介绍2. Maven主要作用理解3. Maven软件工作原理模型图&#xff08;了解&#xff09; 二、Maven安装和配置1. Maven安装2. Maven环境配置3. Maven功能配置4. IDEA配置本地Maven软件 三、基于IDEA创建Maven工程1. 梳…

Anylogic Pro 8.8.x for Mac / for Linux Crack

Digital twins – a step towards a digital enterprise AnyLogic是唯一一个支持创建模拟模型的方法的模拟建模工具&#xff1a;面向过程&#xff08;离散事件&#xff09;、系统动态和代理&#xff0c;以及它们的任何组合。AnyLogic提供的建模语言的独特性、灵活性和强大性使…

自恢复保险丝

自恢复保险丝 常用电子元器件类型 0467.500NRHF 文章目录 自恢复保险丝前言一、自恢复保险丝是什么二、0467.500NRHF总结前言 自恢复保险丝通常用于电子设备、电路板、电视机、计算机、通信设备、充电器、电源适配器等各种电路保护应用。需要注意的是,选择适当的自恢复保险…