审批规则引擎:条件审批、会签、或签、顺序审批、并行审批
说实话,规则引擎这东西,我刚开始接触时觉得就是个if-else的复杂版。后来在双人审批系统里踩过几次坑,才真正理解为什么需要专门的引擎来做这件事。
简单说,审批规则引擎就是一套可配置的决策逻辑。它决定了:
谁审批?几个人批?按什么顺序批?满足什么条件才能过?
本章我把常见的五种模式拆开讲。每种我都会给个真实场景,再说说坑在哪儿。
1. 条件审批
条件审批,说白了就是根据业务数据走不同的审批链。比如报销单:金额≤1000走直线主管,1000~5000加财务经理,超5000再加CFO。
我在一个合同审批项目里遇到过这种情况:起初把所有条件写死在代码里,后来业务方隔三岔五改金额阈值,改一次发一次版。后来换成了规则引擎,把条件暴露成配置,字段来源、比较符、阈值全都可配。嗯,这个世界清静了。
关键设计点:
- 条件字段必须是表单或上下文里已有的标准化数据(比如金额、部门、风险等级)
- 支持多条件组合:AND / OR / 优先级括号
- 必须有默认分支(兜底审批人)
我曾经踩过的坑:条件顺序很重要。两个条件如果范围有重叠,引擎必须按优先级或顺序匹配第一条就跳出。否则一旦顺序调换,审批结果完全不一样。我会建议在配置界面显式显示匹配顺序。
2. 会签
会签就是“所有人签了才能过”。典型的场景:合同需要法务、财务、业务三方全部同意,缺一不可。
| 属性 | 说明 |
|---|---|
| 参与人 | 预定义列表,或角色组(比如部门经理全部为会签人) |
| 通过规则 | 100% 同意;有人拒绝则整个流程拒绝 |
| 超时处理 | 可设超时自动跳过(需记录)或转为转审 |
| 并行/串行 | 通常会签建议并行发送,节省时间 |
你想想看,如果三个人会签,A批了,B驳回了,这时候C还没看到。系统应该怎样?我的经验是:一旦出现驳回,立即终止其余待办并进入驳回分支。别让C白干。
小技巧:会签人数如果超过5人,建议加“提前通过”逻辑(比如已同意人数超过80%且无人反对,自动通过)。但这些属于高级策略,不是标配。
3. 或签
或签就是“只要有一人同意就过”。常用于紧急审批、轮值审批、随机指定审批人。
举个例子:运维变更审批。三个值班SRE任意一人同意就能执行变更。没必要所有人都同意,浪费时间。
注意:或签不是“优先抢单”,而是“任意一人即可”。实现时我建议把待办同时推送给所有人,谁先处理就采纳谁的结果。后处理的直接忽略,但需要告知“此单据已被xxx审批完毕”,避免混淆。
我曾经碰到的坑:没有加互斥锁。两个人同时点同意,数据库事务没处理好,产生了两个通过记录。后来我在审批回调里加了版本号乐观锁,才解决。多线程并发处理一定要小心。
4. 顺序审批
顺序审批就是一条链,一个一个来,前一个人批完才能到下一个。这其实是传统OA最经典的模式。
- 典型场景:请假审批:直属领导 → 部门总监 → HR
- 特点:审批人有严格的先后关系,不可跳过
- 实现注意:当前环节审批人如果离职或被占用,需要有“转审”或“加签”机制
我在一个金融系统里见过更复杂的顺序审批:中间某个人可以“加签”一个协办人,协办人必须先审,然后原审批人再审。这种串中嵌套的顺序就很考验引擎的节点管理能力。我个人建议在设计数据模型时,用链表结构存审批步骤,每个节点指向下一节点,方便动态插入。
顺序审批 vs 条件审批的区别:顺序审批的节点是固定的,条件审批是动态的。但两者常常结合使用——先按条件选择不同的顺序审批链。
5. 并行审批
并行审批是把单据同时发送给多个审批人,他们各自独立决定。最终结果根据配置决定:是“全部通过才过”还是“任一通过就过”。
注意:并行审批和会签其实很相似,但核心区别在于——并行审批允许不同的审批人有不同的意见,且最终结果可以通过加权计数来决定(比如3人中有2人同意即通过)。而会签必须是100%通过。
| 特性 | 并行审批 | 会签 |
|---|---|---|
| 通过条件 | 可配(全部/多数/任一) | 必须全部通过 |
| 审批人独立性 | 完全独立,结果可不同 | 独立,但失败即终止 |
| 典型场景 | 预算分摊审批(各部门独立确认费用) | 合同合规审查(法务+财务必过) |
嗯,这里要注意:并行审批如果走“多数通过”策略,必须明确“多数”的定义——超过50%?还是超过2/3?边界情况(偶数平票)怎么处理?我在一个项目里就发生过平票,最后系统卡住了。后来加了“由发起人最终决策”的兜底规则才解决。
组合使用是常态
其实大多数生产系统不会只用一种模式。比如:
- 第一步:条件审批(根据金额选链)
- 第二步:并行审批(多部门同时审批)
- 第三步:会签(法务+财务最后双签)
引擎必须支持节点嵌套和模式切换。我个人习惯把整个流程定义为一个有向图,每个节点标记自身模式(条件/会签/或签/顺序/并行),这样扩展性最好。
性能建议:并行审批和会签的并发量高时,注意待办推送到消息队列,不要同步推送。我见过一个系统在500人同时并发会签时,数据库连接池被打爆。改成异步推送后问题解决。