当前位置: 首页 > article >正文

基于Flowable全局监听器实现智能节点跳过:告别重复审批

1. 为什么需要智能跳过重复审批节点想象一下这样的场景你设计了一个采购审批流程部门经理需要先后审批采购申请和采购确认两个节点。但当这两个节点都分配给同一位经理时他会在系统里看到两个完全相同的待办事项——先审批一次申请再审批一次确认。这种重复操作不仅浪费时间还会让审批人产生困惑我刚才不是已经批过了吗这就是典型的相邻节点重复审批问题。在Flowable流程引擎中这种情况经常发生在按角色配置审批人时如所有部门经理审批节点多级审批中同一岗位人员连续处理不同阶段会签场景中部分审批人重叠的情况传统解决方案比如在流程设计时添加条件网关或者配置跳过表达式都存在明显缺陷侵入性强需要修改现有流程图定义灵活性差审批人变更时需要重新发布流程维护困难条件逻辑分散在各个网关中2. 全局监听器方案设计原理2.1 核心思路事件驱动架构我们采用非侵入式的全局事件监听方案其工作原理就像给流程引擎安装了一个智能监控摄像头监听所有任务创建事件TASK_CREATED当新任务产生时自动检查其与前置任务的关系发现审批人相同时触发自动跳过机制这种设计有三大优势零改造不影响现有流程图定义动态生效实时判断审批人关系完整记录跳过操作会留下完整日志2.2 关键技术实现点// 监听器配置示例 Configuration public class FlowableGlobListenerConfing implements ApplicationListenerContextRefreshedEvent { Autowired private SpringProcessEngineConfiguration configuration; Override public void onApplicationEvent(ContextRefreshedEvent event) { configuration.getEventDispatcher() .addEventListener(globalTaskCreateListener, FlowableEngineEventType.TASK_CREATED); } }关键判断逻辑需要处理多种流程结构单节点串联A→B→C的线性流程网关分支包含并行网关、排他网关的复杂流程会签场景多审批人场景下的部分重复3. 完整实现步骤详解3.1 基础环境准备首先确保项目中已集成Flowable Spring Boot Starterdependency groupIdorg.flowable/groupId artifactIdflowable-spring-boot-starter/artifactId version6.7.2/version /dependency3.2 核心监听器实现Component public class GlobalTaskCreateListener extends AbstractFlowableEngineEventListener { Override protected void taskCreated(FlowableEngineEntityEvent event) { TaskEntity currentTask (TaskEntity)event.getEntity(); String processInstanceId currentTask.getProcessInstanceId(); // 获取流程定义 Process process repositoryService.getBpmnModel(currentTask.getProcessDefinitionId()) .getMainProcess(); // 获取当前任务对应的流程节点 UserTask currentUserTask (UserTask)process.getFlowElement(currentTask.getTaskDefinitionKey()); // 获取所有流入当前节点的连线 ListSequenceFlow incomingFlows currentUserTask.getIncomingFlows(); // 处理不同类型的上游节点 if(incomingFlows.size() 1) { FlowElement sourceElement incomingFlows.get(0).getSourceFlowElement(); if(sourceElement instanceof UserTask) { checkAndSkip(currentTask, (UserTask)sourceElement); } } } private void checkAndSkip(TaskEntity currentTask, UserTask previousUserTask) { // 实现审批人比对逻辑 String previousApprover getLastApprover(currentTask.getProcessInstanceId()); if(currentTask.getAssignee().equals(previousApprover)) { skipTask(currentTask); } } }3.3 审批人比对策略需要考虑的比对场景包括固定审批人直接比较assignee值表达式审批人如${departmentManager}会签列表多审批人场景下的包含关系动态变量通过流程变量确定的审批人private String getLastApprover(String processInstanceId) { // 从历史记录中获取最近完成的同流程节点任务 HistoricTaskInstance lastTask historyService.createHistoricTaskInstanceQuery() .processInstanceId(processInstanceId) .orderByHistoricTaskInstanceEndTime().desc() .list() .get(0); return lastTask.getAssignee(); }4. 生产环境注意事项4.1 历史记录完整性保障自动跳过操作需要保留完整的审批痕迹添加跳过类型的审批意见记录跳过操作的时间戳保持流程变量的一致性private void skipTask(TaskEntity task) { // 添加跳过记录 taskService.addComment(task.getId(), task.getProcessInstanceId(), SKIP, 自动跳过相同审批人节点); // 完成当前任务 taskService.complete(task.getId()); }4.2 性能优化建议在大流量系统中需要注意使用缓存减少历史记录查询异步处理非关键路径逻辑添加熔断机制防止事件堆积我在实际项目中曾遇到一个典型案例某电商平台的退款审批流程原本需要先后经过客服主管→财务主管→运营总监三级审批。但当这三个角色都由同一个人兼任时采用本方案后平均处理时间从原来的2天缩短到2小时。这种方案特别适合具有以下特征的业务场景审批层级较多的垂直管理体系中小型企业存在岗位兼任情况需要动态调整审批路线的灵活流程实现时最常遇到的坑是网关节点的处理——比如当两个用户任务之间隔着排他网关时需要特殊处理网关的入向流。这时可以通过判断sourceFlowElement类型来区分不同情况。

相关文章:

基于Flowable全局监听器实现智能节点跳过:告别重复审批

1. 为什么需要智能跳过重复审批节点? 想象一下这样的场景:你设计了一个采购审批流程,部门经理需要先后审批"采购申请"和"采购确认"两个节点。但当这两个节点都分配给同一位经理时,他会在系统里看到两个完全相…...

5B00,5B01,5B02,1700,1701,1702,1704,P07清零软件G3800,TS3480 ,TS3380 ,G3000,G1810,TS9020, TS8020,TS3480

下载地址:链接:https://pan.baidu.com/s/1j7Nwv715wX1JL3qidnGyXA?pwd0000 提取码:0000 常见 佳能打印机 型号: G5080 G6080 G7080 G1810 G2810 G3810 G4810 G1800 G2800 G3800 G4800 G5010 G6010 G7010 G1010 G2010 G3010 G4010 G1000 G2000 G3000 G40…...

5B00,5B01,5B02,1700,1701,1702,1704,P07清零软件G3800,TS3480 ,TS3380 ,G3000,G1810,TS9020, TS8020,TS3480秒修复

下载地址:链接:https://pan.baidu.com/s/1j7Nwv715wX1JL3qidnGyXA?pwd0000 提取码:0000 常见 佳能打印机 型号: G5080 G6080 G7080 G1810 G2810 G3810 G4810 G1800 G2800 G3800 G4800 G5010 G6010 G7010 G1010 G2010 G3010 G4010 G1000 G2000 G3000 G40…...

DXVK 2.7.1:Vulkan驱动的Direct3D转换层性能提升15%的技术突破

DXVK 2.7.1:Vulkan驱动的Direct3D转换层性能提升15%的技术突破 【免费下载链接】dxvk Vulkan-based implementation of D3D9, D3D10 and D3D11 for Linux / Wine 项目地址: https://gitcode.com/gh_mirrors/dx/dxvk 一、技术突破:从API翻译到性能…...

Open62541内存泄漏实战:如何用Valgrind揪出隐藏的‘内存杀手‘

Open62541内存泄漏实战:用Valgrind精准定位与修复策略 引言:当OPC UA应用开始"悄悄吃内存" 在工业自动化领域,OPC UA服务器的稳定性直接影响着生产系统的可靠性。最近三个月,我们团队接手了四个因为内存泄漏导致系统崩溃…...

Kangaroo运动控制器Packet Serial通信协议详解

1. Kangaroo运动控制器底层通信技术解析 Kangaroo运动控制器是由RoboClaw系列厂商推出的专用闭环步进/伺服电机驱动模块,其核心价值在于将复杂的PID调节、电流环控制、位置反馈处理等算法固化于硬件中,使上位机仅需通过精简的串行协议即可完成高精度运动…...

SunnyUI的UITreeView控件实战:从拖拽到动态加载的完整指南

SunnyUI的UITreeView控件实战:从拖拽到动态加载的完整指南 在企业级应用开发中,树形结构数据展示几乎是每个.NET开发者都会遇到的场景。传统的WinForms TreeView控件虽然基础功能完善,但在现代UI体验和开发效率上逐渐显得力不从心。SunnyUI框…...

告别重装!用Timeshift给你的Ubuntu系统做个‘时光机’,轻松备份与整盘迁移

用Timeshift打造Ubuntu系统的时光回溯神器:零门槛备份与迁移指南 每次系统崩溃后重装Ubuntu的痛苦,相信不少用户都深有体会——那些精心配置的开发环境、收藏多年的工作文档、调试许久的个性化设置,都可能在一瞬间化为乌有。对于习惯图形化操…...

保姆级教程:用UniApp+佳博打印机实现小票与条形码打印(含完整TSC/ESC指令封装)

UniApp佳博打印机实战:从蓝牙连接到小票打印的全流程解析 在移动零售和仓储管理场景中,蓝牙小票打印是提升工作效率的关键环节。本文将手把手带您实现UniApp与佳博打印机的深度整合,涵盖蓝牙连接管理、TSC/ESC指令封装、40mm50mm小票排版等核…...

三极管实战指南:从NPN到PNP,手把手教你识别与使用(附常见误区解析)

三极管实战指南:从NPN到PNP,手把手教你识别与使用(附常见误区解析) 在电子设计的世界里,三极管就像电路中的"水龙头",控制着电流的流动。无论是简单的LED驱动电路,还是复杂的音频放大…...

双目立体视觉实战:从平行视图到3D电影原理的完整解析

双目立体视觉实战:从平行视图到3D电影原理的完整解析 你是否曾在电影院戴上3D眼镜,被扑面而来的立体效果震撼?这种身临其境的视觉体验,其核心技术正是源于双目立体视觉原理。本文将带你深入探索从平行视图构建到3D电影实现的完整技…...

移动端Transformer加速新范式:EAA注意力机制与SwiftFormer架构解析

1. 移动端Transformer的算力困局与EAA的破局思路 当Transformer架构从NLP领域跨界到计算机视觉时,所有人都被ViT的表现惊艳到了。但当我们兴冲冲地想把这种"视觉Transformer"塞进手机里时,现实给了我们当头一棒——传统的多头自注意力机制&…...

Fedora 42 上 Podman 镜像拉取慢?5分钟搞定国内镜像源配置(保姆级教程)

Fedora 42 上 Podman 镜像拉取慢?5分钟搞定国内镜像源配置(保姆级教程) 刚接触 Fedora 42 的开发者们,是否经常被 Podman 拉取镜像时的蜗牛速度折磨得抓狂?每次看着进度条像老牛拉破车一样缓慢移动,心里是不…...

手把手教你用DrissionPage搭建个人新闻聚合器:自动抓取百度热搜并保存到Excel

用DrissionPage打造智能新闻聚合器:从百度热搜抓取到Excel自动化分析 每天手动刷新闻不仅耗时,还容易错过重要信息。想象一下,如果有个私人助手能自动收集全网热点,整理成结构化的报告,甚至生成直观的可视化图表——这…...

Python 正则表达式详解:从原理到实践

Python 正则表达式详解:从原理到实践 1. 背景与动机 正则表达式(Regular Expression)是一种用于匹配字符串中字符组合的模式,它在文本处理、数据提取、验证等场景中发挥着重要作用。Python 的 re 模块提供了对正则表达式的支持&am…...

Minecraft 1.12.2 彩色渐变字体模组:打造个性化聊天与物品命名

1. RGB Chat模组:让你的Minecraft文字绚丽多彩 还在用单调的白色文字聊天吗?RGB Chat模组彻底改变了Minecraft 1.12.2版本的文字显示方式。这个轻量级模组只有几百KB大小,却能给你的游戏体验带来质的飞跃。我第一次在服务器里看到彩色渐变文字…...

Vue3+Cesium实战:解决404报错与Webpack配置优化指南

1. 为什么你的Cesium地图总是加载失败? 第一次在Vue3项目里集成Cesium时,我也被那些莫名其妙的404报错搞得焦头烂额。明明按照文档配置了,地图就是不显示,控制台一片红。后来才发现,90%的问题都出在资源路径配置上。 C…...

Python箱线图实战:从原理到自定义异常值边界

1. 箱线图的核心原理与构成要素 箱线图(Box Plot)是数据分析中最实用的可视化工具之一,它用五个关键数值概括一组数据的分布特征。很多初学者容易把箱线图的上下边缘误解为数据集的最大最小值,这其实是个常见误区。让我用一个实际…...

深度学习模型可解释性详解:从原理到实践

深度学习模型可解释性详解:从原理到实践 1. 背景与动机 随着深度学习模型在各个领域的广泛应用,模型的可解释性变得越来越重要。深度学习模型通常被视为"黑盒",其内部决策过程难以理解,这在医疗、金融、法律等关键领域应…...

GitLab中文版在Windows Docker部署后,解决‘git clone’和‘git push’失败的几个关键检查点

GitLab中文版Windows Docker部署后git clone和git push故障排查指南 当你终于完成了GitLab中文版在Windows Docker上的部署,准备大展拳脚时,却发现git clone和git push命令频频报错,这种挫败感我深有体会。本文将带你系统排查四个关键环节&am…...

别只改.prettierrc了!从Git配置到CI/CD,一劳永逸解决团队换行符冲突

从Git配置到CI/CD:彻底解决团队协作中的换行符冲突 跨平台协作开发时,换行符问题就像鞋里的一粒沙子——看似微不足道,却能让整个团队步履维艰。当Windows的CRLF遇上Unix的LF,不仅会导致Prettier报出恼人的Delete ␍错误&#xff…...

OpenWrt SDK实战:如何用SDK高效开发自定义驱动和应用

OpenWrt SDK实战:如何用SDK高效开发自定义驱动和应用 在嵌入式开发领域,OpenWrt因其高度模块化和可定制性成为路由器及物联网设备的首选操作系统。但对于需要频繁修改驱动或开发定制应用的工程师来说,每次完整编译整个系统不仅耗时耗力&#…...

嵌入式开发五大常见Bug解析与解决方案

1. 嵌入式开发中的五大常见Bug根源解析在嵌入式系统开发领域,代码质量直接关系到产品的可靠性和稳定性。作为一名经历过多个嵌入式项目的开发者,我深刻体会到某些类型的bug特别顽固且难以排查。这些bug往往在实验室测试中难以复现,却在现场运…...

Ubuntu系统通过命令行与GUI配置以太网固定IPv4地址全指南

1. 为什么需要固定IP地址? 在日常使用Ubuntu系统时,大多数情况下我们都会选择自动获取IP地址(DHCP)。这种方式简单方便,特别适合家庭网络环境。但如果你正在搭建服务器、进行网络调试,或者需要远程访问这台…...

用Python+Matplotlib动手验证:标准DH和改进DH建模同一机械臂,结果真的相同吗?

PythonMatplotlib实战:标准DH与改进DH建模机械臂的等价性验证 机械臂运动学建模是机器人学中的基础课题,而Denavit-Hartenberg(DH)参数法则是其中最经典的建模方法之一。标准DH(sDH)与改进DH(mD…...

MoveIt2的KDL插件不好用?手把手教你自定义关节权重,优化机械臂运动优先级

MoveIt2关节权重调优实战:如何让冗余机械臂按你的想法运动 当机械臂的第七个关节开始不受控制地乱转,而前三个关节却几乎不动时,大多数工程师的第一反应是"这IK算法有问题"。但真相往往是:算法没问题,只是它…...

告别校园网登录页!实测用UDP 53端口“曲线救国”上网的几种姿势与风险提示

校园网络优化:提升连接效率的合法实践指南 校园网络作为师生日常学习研究的重要基础设施,其稳定性和访问效率直接影响教学科研质量。许多用户在使用过程中会遇到认证页面频繁弹出、连接不稳定等问题,这通常与网络架构设计和流量管理策略有关。…...

别再硬调PI参数了!手把手教你用MATLAB/Simulink搞定PMSM FOC电流环整定(附模型下载)

永磁同步电机FOC控制:从电流环整定到系统优化的工程实践 永磁同步电机(PMSM)因其高效率、高功率密度和优异的动态性能,在工业驱动、电动汽车和航空航天等领域得到广泛应用。而磁场定向控制(FOC)作为PMSM的主…...

深入解析MMU:从虚拟地址到物理地址的转换机制

1. 为什么需要虚拟地址? 想象一下你正在玩一个大型多人在线游戏,游戏里每个玩家都有自己的房子、装备和任务进度。如果所有玩家的数据都混在一起存放,你的装备可能会被隔壁玩家不小心拿走,甚至整个游戏世界都会乱套。虚拟地址的出…...

命名实体识别工具:从技术突破到业务价值重构

命名实体识别工具:从技术突破到业务价值重构 【免费下载链接】W2NER 项目地址: https://gitcode.com/gh_mirrors/w2/W2NER 1 解锁NER效率新范式 传统NER为何在长文本中频频失效? 当面对医疗病例中"高血压引发的左心室肥厚导致劳力性呼吸困…...