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

基于ruoyi-flowable-plus与vform的审批流程动态审批人配置实战

1. 动态审批人配置的核心思路在传统审批流程中审批人通常是固定配置的比如直接指定某个角色或具体人员。但在实际业务中我们经常需要根据流程发起人的组织关系动态确定审批人。比如最常见的场景需要由发起人的直属上级或部门经理来审批。ruoyi-flowable-plus作为优秀的开源工作流框架结合vform强大的表单设计能力可以完美实现这种动态审批逻辑。具体实现路径是通过前端vform配置监听器类型审批人后端编写Java监听器代码动态计算审批人最后将结果注入流程变量。这种方案比硬编码灵活得多后期调整审批规则只需修改监听器逻辑即可。我在多个企业级项目中实践过这种模式最大的优势是审批规则变更时不需要重新部署流程定义。比如某公司突然调整组织架构只需要修改部门经理的查询逻辑所有相关流程会自动适应新规则。2. 前端vform配置改造首先需要在前端审批人选择器中增加监听器选项。原始代码通常只提供固定用户、角色等静态选项我们要新增动态监听器模式// ruoyi-ui/src/plugins/package/penal/task/task-components/UserTask.vue el-radio-group v-modeluserTaskForm.assignType el-radio labelUSER指定用户/el-radio el-radio labelROLE指定角色/el-radio !-- 新增监听器选项 -- el-radio labelLISTENER监听器指定/el-radio /el-radio-group对应的值处理逻辑也需要扩展else if (val LISTENER) { userTaskForm.candidateUsers ${candidateUsers}; userTaskForm.text 监听器指定; }这里有个实际项目中的经验点candidateUsers和assignee的区别。前者用于会签场景多人审批需全部通过后者用于或签场景多人审批只需一人通过。根据业务需求选择合适的方式部门审批通常用或签模式更合理。3. 监听器核心实现逻辑监听器是整个动态审批机制的大脑需要完成以下关键步骤获取流程实例发起人ID根据发起人查询其部门信息确定该部门的审批责任人将结果设置到流程变量具体代码实现示例Component public class DeptLeaderTaskListener implements ExecutionListener { Override public void notify(DelegateExecution execution) { // 1. 获取流程实例信息 ProcessInstance instance SpringUtil.getBean(RuntimeService.class) .createProcessInstanceQuery() .processInstanceId(execution.getProcessInstanceId()) .singleResult(); // 2. 获取发起人信息 String startUserId instance.getStartUserId(); SysUserMapper userMapper SpringUtil.getBean(SysUserMapper.class); // 3. 查询部门领导实际项目需要根据组织架构调整查询逻辑 ListSysUser leaders userMapper.selectLeadersByUserId(Long.valueOf(startUserId)); // 4. 设置审批人变量 ListString leaderIds leaders.stream() .map(user - String.valueOf(user.getUserId())) .collect(Collectors.toList()); execution.setVariable(candidateUsers, leaderIds); } }在实际项目中我遇到过几个典型问题部门可能存在多个负责人需要明确优先级规则跨部门协作时需要特殊处理审批链领导空缺时需要设置代理审批人这些业务异常情况都需要在监听器中妥善处理建议通过配置表来管理各种特殊规则。4. 流程定义配置技巧在流程设计器中进行节点配置时需要注意以下关键点选择正确的监听器事件类型通常使用create事件任务创建时触发监听器类名需要包含完整包路径变量名称需要前后端保持一致在bpmn XML中配置示例如下userTask idleaderApproval name部门审批 extensionElements flowable:executionListener eventcreate classcom.ruoyi.workflow.listener.DeptLeaderTaskListener/ /extensionElements /userTask有个容易踩的坑监听器类必须被Spring容器管理。我遇到过因为忘记加Component注解导致监听器不生效的情况。另外在集群环境下要确保所有节点都能加载到监听器类。5. 调试与问题排查动态审批流程的调试比静态配置复杂分享几个实用技巧流程变量查看在act_ru_variable表可以实时查看生成的审批人列表监听器日志建议在监听器中添加详细日志记录审批人计算过程测试用例覆盖正常部门关系场景部门无负责人场景发起人无部门场景多人领导场景一个典型的日志增强版监听器Component Slf4j public class DeptLeaderTaskListener implements ExecutionListener { Override public void notify(DelegateExecution execution) { log.info(开始执行部门领导审批人计算); // ...原有逻辑... log.info(计算完成审批人列表: {}, leaderIds); } }在性能方面要注意频繁的组织架构查询可能成为瓶颈。我通常会在监听器中添加缓存机制对相同的部门领导查询结果缓存5-10分钟。6. 扩展应用场景除了部门经理审批这种模式还可以应用于更多动态场景项目制审批根据项目ID自动确定项目负责人金额分级审批根据审批金额自动匹配不同层级领导区域联动审批跨区域业务需要区域负责人会签例如实现金额分级审批// 在监听器中添加金额判断 BigDecimal amount (BigDecimal)execution.getVariable(amount); if(amount.compareTo(new BigDecimal(10000)) 0){ // 设置高管审批 } else { // 设置部门审批 }这些扩展都需要在前端配合增加相应的表单字段让监听器能够获取到决策所需的业务数据。7. 性能优化实践在高并发场景下我总结了几点优化经验批量查询优化避免在循环中查询数据库缓存应用对稳定的组织关系进行适当缓存异步处理对非实时性审批使用消息队列索引检查确保用户-部门关联查询使用索引一个带缓存的改进版本Cacheable(value leaderCache, key #deptId) public ListLong getDeptLeaders(Long deptId) { // 数据库查询逻辑 } // 在监听器中调用 ListLong leaderIds leaderService.getDeptLeaders(deptId);缓存有效期需要根据业务特点设置一般组织架构变更不太频繁可以设置30分钟左右的缓存时间。

相关文章:

基于ruoyi-flowable-plus与vform的审批流程动态审批人配置实战

1. 动态审批人配置的核心思路 在传统审批流程中,审批人通常是固定配置的,比如直接指定某个角色或具体人员。但在实际业务中,我们经常需要根据流程发起人的组织关系动态确定审批人。比如最常见的场景:需要由发起人的直属上级或部门…...

Python小白也能搞定:用PCSE和WOFOST进行作物模型敏感性分析的保姆级教程

Python零基础实战:用PCSE/WOFOST实现作物模型敏感性分析全流程指南 引言:为什么选择PythonPCSE进行农业模型研究? 在精准农业和气候变化研究领域,作物生长模型正成为不可或缺的分析工具。作为联合国粮农组织推荐的经典模型&#x…...

如何构建高性能的NextFaster产品搜索系统:从实现到优化的完整指南

如何构建高性能的NextFaster产品搜索系统:从实现到优化的完整指南 【免费下载链接】NextFaster A highly performant e-commerce template using Next.js 项目地址: https://gitcode.com/gh_mirrors/ne/NextFaster NextFaster作为基于Next.js构建的高性能电…...

自感痕迹的原创性与哲学意义

自感痕迹的原创性与哲学意义摘要“自感(活动/状态)即自我”及其核心概念“痕迹”,构成了一套系统性的、跨传统的自我理论。本文旨在阐明这一理论体系的原创性来源与哲学史意义。研究指出,该理论的原创性并非体现于凭空制造全新术语…...

DeepSeek-Coder-V2完全指南:从环境搭建到代码生成实战

DeepSeek-Coder-V2完全指南:从环境搭建到代码生成实战 【免费下载链接】DeepSeek-Coder-V2 DeepSeek-Coder-V2: Breaking the Barrier of Closed-Source Models in Code Intelligence 项目地址: https://gitcode.com/GitHub_Trending/de/DeepSeek-Coder-V2 D…...

mPLUG-Owl3-2B工具评测:消费级GPU上的高效视觉问答解决方案

mPLUG-Owl3-2B工具评测:消费级GPU上的高效视觉问答解决方案 1. 引言:多模态AI的平民化时代 在AI技术快速发展的今天,能够同时理解图像和文本的多模态模型正变得越来越重要。想象一下,当你上传一张照片,AI不仅能识别其…...

终极指南:如何使用Polly.JS实现API版本控制与路径重写

终极指南:如何使用Polly.JS实现API版本控制与路径重写 【免费下载链接】pollyjs Record, Replay, and Stub HTTP Interactions. 项目地址: https://gitcode.com/gh_mirrors/po/pollyjs Polly.JS是一款强大的HTTP交互录制、重放和存根工具,能够帮助…...

BongoCat:让你的桌面充满生命力的互动伙伴

BongoCat:让你的桌面充满生命力的互动伙伴 【免费下载链接】BongoCat 🐱 跨平台互动桌宠 BongoCat,为桌面增添乐趣! 项目地址: https://gitcode.com/gh_mirrors/bong/BongoCat 在数字时代的今天,我们与电脑屏幕…...

ADI AD5940阻抗测量板初体验:从GitHub源码下载到IAR工程编译的完整避坑指南

ADI AD5940阻抗测量开发板实战:从源码获取到工程编译的深度避坑手册 第一次接触ADI的AD5940阻抗测量开发板时,那种既兴奋又忐忑的心情至今记忆犹新。作为一款专为生物阻抗测量设计的高精度前端芯片,AD5940在医疗穿戴设备、体脂分析等领域有着…...

终极指南:MFE-starter如何让Angular与React和平共存的实战方案

终极指南:MFE-starter如何让Angular与React和平共存的实战方案 【免费下载链接】MFE-starter MFE Starter 项目地址: https://gitcode.com/gh_mirrors/mf/MFE-starter 在现代前端开发中,框架冲突是许多开发者面临的头疼问题,尤其是当项…...

seL4通知机制完全指南:高效异步事件处理的终极解决方案

seL4通知机制完全指南:高效异步事件处理的终极解决方案 【免费下载链接】seL4 The seL4 microkernel 项目地址: https://gitcode.com/gh_mirrors/se/seL4 seL4微内核的通知机制是构建高可靠实时系统的核心组件之一,它提供了一种高效、安全的异步事…...

Maven证书验证难题:彻底绕过PKIX path building failed的实战指南

1. 遇到PKIX path building failed?别慌,这是证书验证的锅 最近在项目编译时突然蹦出个"PKIX path building failed"的错误,是不是让你一头雾水?这其实是Maven在下载依赖时遇到了证书验证问题。简单来说,就…...

WiseFlow部署避坑指南:从Docker到PowerShell权限问题的完整解决方案

WiseFlow部署实战手册:从零到一的系统化避坑指南 引言 当你第一次接触WiseFlow这个开源项目时,可能会被它强大的功能所吸引——从自动化任务处理到智能数据分析,这个工具正在改变许多开发者的工作方式。然而,就像大多数技术栈的初…...

告别资源获取繁琐,实现高效资源管理与效率提升

告别资源获取繁琐,实现高效资源管理与效率提升 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader res-downloader是一…...

深度解析RPA格式:如何用unrpa突破Ren‘Py游戏资源的技术壁垒

深度解析RPA格式:如何用unrpa突破RenPy游戏资源的技术壁垒 【免费下载链接】unrpa A program to extract files from the RPA archive format. 项目地址: https://gitcode.com/gh_mirrors/un/unrpa 当你面对一个RenPy引擎开发的视觉小说游戏,想要…...

Seldon Core 2与Triton推理服务器集成:高性能GPU推理实战指南 [特殊字符]

Seldon Core 2与Triton推理服务器集成:高性能GPU推理实战指南 🚀 【免费下载链接】seldon-core An MLOps framework to package, deploy, monitor and manage thousands of production machine learning models 项目地址: https://gitcode.com/gh_mirr…...

如何用Xournal++解决数字笔记三大痛点?超实用指南

如何用Xournal解决数字笔记三大痛点?超实用指南 【免费下载链接】xournalpp Xournal is a handwriting notetaking software with PDF annotation support. Written in C with GTK3, supporting Linux (e.g. Ubuntu, Debian, Arch, SUSE), macOS and Windows 10. Su…...

3个让单机游戏体验翻倍的开源工具:OpenSpeedy完全指南

3个让单机游戏体验翻倍的开源工具:OpenSpeedy完全指南 【免费下载链接】OpenSpeedy 🎮 An open-source game speed modifier. 项目地址: https://gitcode.com/gh_mirrors/op/OpenSpeedy 你是否曾因游戏节奏过慢而失去耐心?或者在重复性…...

BigDL-2.x DLlib深度指南:用Spark DataFrames构建分布式深度学习应用

BigDL-2.x DLlib深度指南:用Spark DataFrames构建分布式深度学习应用 【免费下载链接】BigDL-2.x BigDL: Distributed TensorFlow, Keras and PyTorch on Apache Spark/Flink & Ray 项目地址: https://gitcode.com/gh_mirrors/bi/BigDL-2.x BigDL-2.x是一…...

原神抽卡模拟器:无需安装也能精准规划资源?浏览器端祈愿体验全解析

原神抽卡模拟器:无需安装也能精准规划资源?浏览器端祈愿体验全解析 【免费下载链接】Genshin-Impact-Wish-Simulator Best Genshin Impact Wish Simulator Website, no need to download, 100% running on browser! 项目地址: https://gitcode.com/gh_…...

DASD-4B-Thinking法律咨询效果展示:条款分析与案例参考

DASD-4B-Thinking法律咨询效果展示:条款分析与案例参考 1. 引言 在日常法律咨询中,很多人遇到合同条款看不懂、法律概念不理解的情况,但又不想每次都花钱请律师。DASD-4B-Thinking模型在这方面展现出了令人惊喜的能力,它不仅能清…...

Biliup录制工具终极指南:如何合法合规地进行视频录制与上传

Biliup录制工具终极指南:如何合法合规地进行视频录制与上传 【免费下载链接】biliup 自动直播录制、投稿、twitch、ytb频道搬运工具。命令行投稿(B站)和视频下载工具,提供多种登录方式,支持多p。 项目地址: https://gitcode.com/gh_mirrors…...

SQLPad多租户架构实现:构建企业级SQL查询服务平台的终极指南

SQLPad多租户架构实现:构建企业级SQL查询服务平台的终极指南 【免费下载链接】sqlpad Web-based SQL editor 项目地址: https://gitcode.com/gh_mirrors/sq/sqlpad 在现代企业数据管理中,多租户架构已成为支撑多团队协作的关键技术。SQLPad作为一…...

AITemplate终极指南:动态形状与静态形状性能对比及选择策略

AITemplate终极指南:动态形状与静态形状性能对比及选择策略 【免费下载链接】AITemplate AITemplate is a Python framework which renders neural network into high performance CUDA/HIP C code. Specialized for FP16 TensorCore (NVIDIA GPU) and MatrixCore (…...

终极指南:如何用Scalaz从零构建企业级函数式应用

终极指南:如何用Scalaz从零构建企业级函数式应用 【免费下载链接】scalaz Principled Functional Programming in Scala 项目地址: https://gitcode.com/gh_mirrors/sc/scalaz Scalaz是一个强大的Scala函数式编程库,它提供了丰富的类型类和纯函数…...

智能游戏助手:重新定义MOBA类游戏体验

智能游戏助手:重新定义MOBA类游戏体验 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 在MOBA类游戏的激烈对抗中,每一秒…...

为什么选择Webpack:Awesome-Webpack项目终极指南与核心价值解析

为什么选择Webpack:Awesome-Webpack项目终极指南与核心价值解析 【免费下载链接】awesome-webpack A curated list of awesome Webpack resources, libraries and tools 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-webpack Webpack作为现代前端开…...

GitHub Actions缓存终极升级指南:从v3到v5的平滑迁移路径

GitHub Actions缓存终极升级指南:从v3到v5的平滑迁移路径 【免费下载链接】cache Cache dependencies and build outputs in GitHub Actions 项目地址: https://gitcode.com/gh_mirrors/cach/cache GitHub Actions缓存是加速CI/CD工作流程的关键工具&#xf…...

Batocera.linux主题定制完全指南:打造个性化游戏界面终极教程

Batocera.linux主题定制完全指南:打造个性化游戏界面终极教程 【免费下载链接】batocera.linux batocera.linux 项目地址: https://gitcode.com/gh_mirrors/ba/batocera.linux Batocera.linux是一款强大的开源复古游戏系统,让用户能够在各种硬件上…...

解锁突破平台限制:res-downloader资源获取的创新解决方案

解锁突破平台限制:res-downloader资源获取的创新解决方案 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 当你在微…...