SpringBoot+Flowable 审批候选人策略设计:十余种 Strategy + Invoker,一次讲清下一关谁审
SpringBootFlowable 审批候选人策略设计十余种 Strategy Invoker一次讲清下一关谁审演示地址http://ruoyioffice.com | 源码1·GitHubruoyi-office | 源码2·GitCoderuoyi-office | 源码3·Giteeruoyi-office | 微信17156169080备注「RuoYi Office」流程画得再漂亮下一关「没人可审」就全废。硬编码assignee只能应付 demo真实企业要的是按角色、按部门负责人、按发起人自选、按表单里填的「项目经理」……正确姿势是策略模式每个规则一个 StrategyInvoker 统一注册、计算与部署校验。▲ 一屏看清Invoker 注册/分发/校验 → 四类策略组织 · 发起人 · 表单 · 兜底→ candidateStrategy / candidateParam / validateBpmnConfig引言下一关谁审才是流程真正的难题朴素做法后果BPMN 写死 userId换人就改图、发版只支持「指定角色」发起人自选、表单字段全做不了运行时算不出人再报错单据卡死运维救火每种规则 if-else 堆在监听器三个月后无法扩展目标架构一句话设计器写 strategyparam运行时 Invoker 算人部署前先校验。一、策略枚举把「人从哪来」编码化BpmTaskCandidateStrategyEnum用整型策略码区分规则例如分类策略示例组织类角色、部门成员、部门负责人、岗位、用户、用户组发起人相关发起人自己、发起人自选、发起人部门负责人、连续多级负责人审批中自选当前审批人指定下一节点审批人表单类表单内用户字段、表单内部门负责人表达式 / 兜底流程表达式、审批人为空设计器侧把candidateStrategy/candidateParam写入 UserTask 扩展属性运行时再解析。▲ 流程模型是策略配置的入口每个审批节点选一种候选人规则而不是写死工号二、Strategy 接口统一契约publicinterfaceBpmTaskCandidateStrategy{BpmTaskCandidateStrategyEnumgetStrategy();voidvalidateParam(Stringparam);defaultbooleanisParamRequired(){returntrue;}SetLongcalculateUsersByTask(DelegateExecutionexecution,Stringparam);SetLongcalculateUsersByActivity(BpmnModelmodel,StringactivityId,Stringparam,LongstartUserId,StringprocessDefinitionId,MapString,ObjectprocessVariables);}每个策略一个 Spring Bean构造BpmTaskCandidateInvoker时注入ListBpmTaskCandidateStrategy放进strategyMap重复策略码直接 Assert 失败——避免两个实现抢同一个码。三、Invoker计算链路与三道保险运行时核心是calculateUsersByTaskIntegerstrategyBpmnModelUtils.parseCandidateStrategy(flowElement);StringparamBpmnModelUtils.parseCandidateParam(flowElement);SetLonguserIdsgetCandidateStrategy(strategy).calculateUsersByTask(execution,param);removeDisableUsers(userIds);// 去掉禁用账号if(CollUtil.isEmpty(userIds)){// 候选人为空 → 走 ASSIGN_EMPTY 兜底策略userIdsgetCandidateStrategy(ASSIGN_EMPTY).calculateUsersByTask(execution,param);}removeStartUserIfSkip(userIds,flowElement,startUserId);// 发起人跳过配置三道保险值得抄DataPermission(enable false)算候选人时关掉数据权限避免「权限过滤导致找不到审批人」禁用用户剔除账号停用不能继续占坑为空兜底 / 发起人跳过空了走「审批人为空」配置若配置了发起人与审批人相同时跳过则从集合移除只剩一人时不删避免无人可审自动通过 / 自动拒绝的节点直接返回空集合不再算人。▲ 设计器节点配置把策略落到模型部署前 Invoker.validateBpmnConfig 会扫所有 UserTask四、部署前校验宁可发不出去也不要跑到一半卡住userTaskList.forEach(userTask-{// 自动通过/拒绝跳过IntegerstrategyBpmnModelUtils.parseCandidateStrategy(userTask);StringparamBpmnModelUtils.parseCandidateParam(userTask);if(strategynull){throwexception(MODEL_DEPLOY_FAIL_TASK_CANDIDATE_NOT_CONFIG,userTask.getName());}if(candidateStrategy.isParamRequired()StrUtil.isBlank(param)){throwexception(MODEL_DEPLOY_FAIL_TASK_CANDIDATE_NOT_CONFIG,userTask.getName());}getCandidateStrategy(strategy).validateParam(param);});这是产品体验关键错配在发布时报错而不是员工提交后卡在待办黑洞。▲ 策略算对了待办才会落到真人算错了再漂亮的时间轴也救不了五、四类策略怎么选产品视角场景更合适的策略财务岗固定审报销角色 / 岗位「谁的单子谁领导批」发起人部门负责人 / 连续多级提交时指定审批人发起人自选表单选了项目经理表单内用户字段规则很绕、要脚本流程表达式组织变动导致暂时无人审批人为空转管理员/跳过等扩展新规则时加枚举码 → 实现 Strategy Bean → 设计器下拉加一项。Invoker 不用改。六、技术亮点总结设计要点实现方式价值策略模式Strategy Invoker Map新规则可插拔双参数strategy param配置与计算解耦部署校验validateBpmnConfig防无人可审上线算人关数据权限DataPermission(false)避免过滤过头空人兜底ASSIGN_EMPTY流程不僵死发起人跳过removeStartUserIfSkip减少「自己批自己」七、快速体验在线演示http://ruoyioffice.com/web/账号admin/admin123打开流程管理 → 流程模型编辑一个简单流程。点开审批节点切换「指定角色 / 发起人自选 / 发起人部门负责人」等策略并保存发布。故意清空某节点审批人配置再发布确认被校验拦住。发起业务单到待办核对任务是否落到预期人。源码仓库GitHub | GitCode | Gitee常见问题FAQ为什么算候选人要关闭数据权限候选人计算是「系统找谁该审」不是「当前登录人能看哪些数据」。若带着数据权限过滤部门负责人可能被滤掉流程直接断。候选人为空一定会失败吗不一定。会再走「审批人为空」策略转交管理员、自动通过等取决于配置。兜底策略计算时不再剔除禁用用户防止二次清空。发起人自选和审批人自选有什么区别发起人自选提交申请时选本节点审批人。审批人自选当前节点审批时指定下一节点审批人。时机不同。表单内用户字段策略的 param 是什么通常是表单字段名运行时从流程变量里取出用户 ID 再解析。适合「项目经理」「对接人」等随单变化的角色。新策略要改 Flowable 引擎吗不用。扩展属性仍是 strategy/param新增一个实现BpmTaskCandidateStrategy的 Bean 即可被 Invoker 自动注册。结语候选人策略的本质是把「下一关谁审」从硬编码变成可配置、可校验、可扩展的策略族。Invoker 负责注册与兜底设计器负责把规则写进模型——流程才能在组织变动中活下去。你们项目里审批人是写死的还是已经策略化了有没有踩过「部署成功但无人可审」欢迎评论区交流。想要体验 RuoYi Office 的强大功能在线演示http://ruoyioffice.com/web/账号 admin / admin123源码仓库GitHub | GitCode | Gitee技术咨询添加微信17156169080备注「RuoYi Office」⭐如果觉得不错请给个 Star 支持一下

相关新闻

终极Wand-Enhancer解锁指南:从每日2小时限制到永久免费的完整解决方案

终极Wand-Enhancer解锁指南:从每日2小时限制到永久免费的完整解决方案

终极Wand-Enhancer解锁指南:从每日2小时限制到永久免费的完整解决方案 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer 你是否厌倦了Wan…

2026/10/1 16:27:53 阅读更多 →
5分钟实战指南:掌握ViGEmBus虚拟手柄驱动从入门到精通

5分钟实战指南:掌握ViGEmBus虚拟手柄驱动从入门到精通

5分钟实战指南:掌握ViGEmBus虚拟手柄驱动从入门到精通 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 想要在Windows系统上实现专业级的游戏控制…

2026/10/15 6:31:55 阅读更多 →
视频提取文字免费工具有哪些?2026免费工具推荐,无需付费本地离线多端可用

视频提取文字免费工具有哪些?2026免费工具推荐,无需付费本地离线多端可用

想从视频里把语音、字幕提取成可编辑的文字,但不想为各种付费套餐纠结——2026年这类免费工具已经足够丰富,覆盖了从微信小程序、手机APP到电脑软件和在线网站。我一般先用「提词匠」这个小程序,提词匠免安装、免注册,粘贴视频链接…

2026/10/3 1:51:56 阅读更多 →

最新新闻

3PAR存储配置实战:HOST/CPG/VV/WWN五步操作与排错指南

3PAR存储配置实战:HOST/CPG/VV/WWN五步操作与排错指南

简介:《HP 3PAR操作手册》是一份面向存储管理员与运维人员的实用指南,围绕HP 3PAR存储的初始化部署与配置展开,重点介绍管理控制台的登录使用、主机创建、CPG存储池搭建、VV虚拟卷创建及分配等核心操作,适用于数据中心、云计算、虚…

2026/10/16 0:15:13 阅读更多 →
PixiJS跳棋实战:图形渲染、交互与性能优化全链路解析

PixiJS跳棋实战:图形渲染、交互与性能优化全链路解析

1. 为什么选跳棋作为PixiJS入门项目:一个被低估的“图形引擎压力测试场”很多人第一次接触PixiJS,习惯性地从“加载一张图、让它动起来”开始——这没错,但容易陷入“能跑通会用”的幻觉。我带过几期前端图形开发小课,发现一个规律…

2026/10/16 0:15:13 阅读更多 →
使用 MCP 自动化 JxBrowser:把 MCP 配置改到 TaoToken 的完整实践

使用 MCP 自动化 JxBrowser:把 MCP 配置改到 TaoToken 的完整实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:15:13 阅读更多 →
5款AI PPT工具横评:提升职场效率的智能选择

5款AI PPT工具横评:提升职场效率的智能选择

1. 为什么我们需要AI PPT工具?作为一名经常需要制作演示文稿的职场人,我深刻理解传统PPT制作过程中的痛点。每次接到新项目,光是构思内容框架就要耗费大量时间,更别提排版设计、配色搭配这些细节工作了。直到去年开始接触AI PPT工…

2026/10/16 0:15:13 阅读更多 →
Spring Boot多数据源路由原理与分库分表实战避坑指南

Spring Boot多数据源路由原理与分库分表实战避坑指南

简介:本资源是一份面向Java后端开发者与数据库架构学习者的分库分表实战项目包,聚焦高并发、大数据量场景下的数据库水平扩展难题,以Sharding-JDBC为核心框架实现多数据源动态切换与透明化分片。资源包含73个文件,主体为18个Java业…

2026/10/16 0:15:13 阅读更多 →
云服务器上部署Nacos单机版:测试环境微服务注册与配置管理实战

云服务器上部署Nacos单机版:测试环境微服务注册与配置管理实战

1. 为什么单机版Nacos依然是测试环境的刚需做过微服务架构的朋友都清楚,服务注册与配置管理是整个体系的神经中枢。Nacos作为这个中枢的国产开源实现,这几年在中小团队里的普及速度非常快。但很多人第一次在云服务器上装Nacos的时候,会陷入一…

2026/10/16 0:14:12 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →