SpringBoot3+Flowable 审批条件分支实战:请假天数/金额如何编译成排他网关表达式

发布时间:2026/8/14 9:14:29
SpringBoot3+Flowable 审批条件分支实战:请假天数/金额如何编译成排他网关表达式 SpringBoot3Flowable 审批条件分支实战请假天数/金额如何编译成排他网关表达式一句话条件分支的本质是「业务字段 → 流程变量 →${表达式}→ 排他网关只走一条」编译错变量名、数字被加引号、没有默认分支比画错节点更常见。▲ 四步链路单据字段写入 variables规则编译成表达式ExclusiveGateway 只选一条缺省走 defaultFlow为什么业务里总有人把「if」写进 Service痛点写在 Java if-else写在流程条件分支请假 3 天加 HR改代码、发版、回归设计器改表达式重新发布模型出差金额加总监每个单据一份硬编码同一套网关变量名换一下部门/公司不同审批链策略类爆炸deptId/companyId进变量预览下一关是谁很难模拟用同一套变量走网关模拟企业审批的分流规则会变。把它沉到 Flowable 排他网关业务单据只负责把「能比较的数」塞进流程变量。流程模型列表里请假、出差这类单据都是现成入口▲ 流程模型SIMPLE 设计器里的「条件分支」节点发布后编译成 ExclusiveGateway请假台账则是最直观的业务侧天数算出来之后必须进变量day否则网关表达式永远匹配不上。▲ 请假列表发起时按起止时间算出 day作为条件分支左值一、三种网关条件分支只用「排他」网关BPMN走出几条典型场景排他 ExclusiveGateway条件分支恰好一条可走默认请假天数、金额阈值包容 InclusiveGateway包容分支所有满足条件的多部门会签前分流并行 ParallelGateway并行分支全部出口同时知会财务行政RuoyiOffice 的 SIMPLE 设计器里「条件分支」节点转换成ExclusiveGateway并且强制要求一条默认序列流——条件全不中时不能把流程卡死。并行分支在实现上用包容网关、出口条件写成${true}那是为了引擎对并行汇聚的兼容不要和条件分支混用同一套心智。二、变量从哪来没有左值表达式就是摆设排他网关比较的是Flowable 流程变量不是数据库字段名。发起流程时必须variables.put(...)。2.1 请假自己算day请假单用起止时间算出天数显式放入变量longdayLocalDateTimeUtil.between(startTime,endTime).toDays();leaveMapper.insert(leave);MapString,ObjectvarsnewHashMap();vars.put(day,day);// 条件分支左值${day 3}processInstanceApi.createProcessInstance(userId,newCreateReq().setProcessDefinitionKey(oa_leave).setVariables(vars).setBusinessKey(String.valueOf(leave.getId())));演示库里请假模型的条件分支文案就是表达式${day 3}。变量名必须叫day写成leaveDay会整条走默认分支看起来「条件配了但从不加签」。2.2 出差标准字段 业务扩展出差申请走通用「标准六字段」抽取单据编号、事由、部门、公司再补业务比较项MapString,ObjectvarsBpmProcessVariableUtils.buildBillVariables(saveReqVO);vars.put(totalDays,saveReqVO.getTotalDays());vars.put(estimatedCost,saveReqVO.getEstimatedCost());processInstanceApi.submitProcessInstance(userId,newCreateReq().setProcessDefinitionKey(oa_business_trip).setVariables(vars).setBusinessKey(String.valueOf(bill.getId())));出差列表用来核对预算、天数是否真的进了单进了单才进得了网关。▲ 出差申请totalDays / estimatedCost 进入流程变量后才能配「金额大于 N 走总监」2.3 引擎还会自动塞组织变量发起时还会写入deptId、deptName、companyId、companyName、billCode。设计器里用「部门 ID 等于某某」做分支靠的就是这批自动变量不必每个 Service 再手写一遍。2.4 CUSTOM 单据配置导出字段复杂业务表单用印、合同字段很多不会全量进流程变量。模型上可配processVariableFieldssource单据 Java 字段→variable表达式左值。提交时按配置反射取出并同时按字段名和变量名各写一份兼容设计器选useMode还是sealUseMode。铁律条件里出现的名字发起时必须已经 put 进去。三、两种条件类型规则 vs 表达式SIMPLE 设计器条件类型只有两个类型枚举适用编译结果条件规则RULE 2产品/实施在界面点选字段、操作符、值${( var:getOrDefault(day, null) 3 )}条件表达式EXPRESSION 1研发直接写${...}原样回写引擎不再改写规则编译的核心节选// RULE每条规则 → 操作符模板组内 / ||组间再拼ListStringpartsrules.stream().map(rule-{OpCodeopOpCode.fromCode(rule.getOpCode());if(op.isUnary()){// 为空 / 不为空只用左值returnString.format(op.getSymbol(),rule.getLeftSide());}StringrightNumberUtil.isNumber(rule.getRightSide())?rule.getRightSide():\rule.getRightSide()\;// 非数字加引号returnString.format(op.getSymbol(),rule.getLeftSide(),right);}).toList();return${String.join(and? : || ,groups)};比较操作一律包一层var:getOrDefault(左值, null)避免变量缺失时 UEL 直接抛错把流程打挂。常用操作符界面编译片段等于 / 不等于/!大于 / 大于等于/小于 / 小于等于/包含 / 不包含var:contains为空 / 不为空 null || 及其否定数字不要加引号。右值3编译成 3右值高编译成 高。把天数填成字符串3和 Long 类型的day比较会踩类型坑表现为「明明大于 3 却不走 HR」。表达式模式适合${day 3 estimatedCost 5000}这种规则 UI 拼不舒服的组合。代价是没有编译器帮你转义写错变量名只能运行期发现。四、排他网关运行时只选一条 默认兜底转换时条件分支节点 →ExclusiveGateway标记为默认的那条 SequenceFlow →gateway.setDefaultFlow(id)每条条件边带conditionExpression引擎走网关时按出口顺序找第一条表达式为 true 的边都不中走defaultFlow。预览「下一关是谁」也用同一套变量模拟排他/包容/并行所以发起页能画出将要经过的节点。发起入口▲ 发起流程选请假/出差模型后变量在提交瞬间写入网关在引擎里立刻求值五、落地清单与反例场景变量条件示例注意请假加 HRday${day 3}用 between 算整天半天策略要自己约定出差加总监estimatedCost规则大于 5000BigDecimal 进变量右值写数字外借印章加分管sealUseMode等于 2CUSTOM 必须配置导出字段分子公司不同链companyId等于某 ID发起时自动写入条件全不中—默认分支禁止不配 defaultFlow反例条件写${leaveDays 3}代码 put 的是day→ 永远默认分支。规则右值填3天→ 被当成字符串和数字比失败。并行网关当条件分支用 → 多条同时走审批人重复。在 Service 里再 if 一遍「3 天换流程 Key」→ 和网关双头管理必分叉。六、建议测试矩阵day 3走默认day 4走 HR边界是还是要和产品对齐未 put 的变量应走默认而不是 500金额5000.00与右值5000能比过改模型后重新发布旧实例仍走旧定义发起页「预计节点」与真实待办一致CUSTOM 单据改了字段名同步改 processVariableFieldsFAQQ1条件规则和表达式怎么选A实施可点选的用 RULE跨字段、函数、括号嵌套用 EXPRESSION。同一网关上不要混用两套互相覆盖的口径。Q2为什么必须有默认分支A排他网关不允许「零出口」。SIMPLE 转换时找不到 defaultFlow 会直接断言失败发布都过不了。Q3变量该用 Long 还是 StringA要比大小用数字类型枚举/模式用数字或短码不要用中文当右值除非你确认左值也是中文。Q4并行和条件能嵌套吗A可以。先排他再并行是常见「分流后再会签」。不要在并行出口上再写互斥金额条件语义会乱。Q5旧请假数据没有 day 怎么办A历史实例变量已经冻结。只影响新发起迁移脚本改不了正在跑的网关快照。和 RuoyiOffice 的对应关系能力位置概念请假day变量OA 请假发起出差天数/预算变量OA 出差提交标准六字段 导出字段流程变量工具RULE/EXPRESSION 编译SIMPLE 模型转 BPMNExclusiveGateway defaultFlow条件分支节点转换下一节点预览按变量模拟网关完整后端GitCodehttps://gitcode.com/ruoyioffice/ruoyi-office AtomGithttps://atomgit.com/ruoyioffice/ruoyi-office前端GitCodehttps://gitcode.com/ruoyioffice/ruoyi-office-vben总结条件分支是排他网关不是 Java if单据只负责把可比较的值放进 variables。RULE 编译 var:getOrDefault降低空变量风险数字与字符串的引号规则必须清楚。变量名对齐比画流程图更重要day和leaveDays差一个字母HR 永远等不到。默认分支是安全网也是产品语义「其余情况走主管」。下一篇讲同一张单在不同节点上字段如何变成可写 / 只读 / 隐藏 / 必填。⭐ GitCodehttps://gitcode.com/ruoyioffice/ruoyi-office · AtomGithttps://atomgit.com/ruoyioffice/ruoyi-office 点星夏日活动攒积分。在线体验https://www.ruoyioffice.com商业版源码授权https://www.ruoyioffice.com/contact · 企业微信RuoyiOffice关键词SpringBoot3、Flowable、ExclusiveGateway、条件分支、流程变量、请假天数、出差审批、Vue3