条件路由与超时
一笔 800 元的打车费和一笔 80 万元的采购不该走同一条流程。条件路由让审批链按单据数据(金额、类型、部门等)决定走多长、经过谁:小额免审,大额层层加码。每个节点上还挂着时限,审批人迟迟不处理时由系统代为推进。
1 · 金额到审批链的映射
| 金额区间 | 审批链 | 级数 |
|---|---|---|
| ≤ ¥1,000 | 免审,条件命中即 auto-skip 整条链,直接落 approved | 0 |
| ¥1,000 < 额 ≤ ¥5,000 | 直属主管 | 1 |
| ¥5,000 < 额 ≤ ¥50,000 | 直属主管 → 部门总监 | 2 |
| > ¥50,000 | 直属主管 → 部门总监 → 财务 VP | 3 |
区间必须写成互不重叠的形式。写成一列「≤ 1000 / ≤ 5000 / ≤ 50000」看着简洁,却把边界的归属交给了求值顺序:同一份配置在「首个命中即返回」与「最后命中覆盖」两种引擎下会得出不同的链路,而这类差异往往要等到一笔恰好 5000 元的单子才暴露。
这张映射表本身是一份策略(policy),把条件映到走向。它从代码里的 if/else 抽成数据之后,业务方可以在后台自行配置阈值而无需改代码,与 RBAC 与策略引擎是同一套思路。
2 · 时限与超时动作
串行链最怕卡住:审批人休假、离职或单纯忘了,整条链就堵死。每个节点因此都该配一个时限(SLA)与到点之后的动作:auto-approve、auto-reject、escalate(升级给上级)或催办提醒。
选哪一个不是技术问题而是责任归属问题。auto-approve 把「没人看」变成「已通过」,风险留在了组织内部;auto-reject 把成本转嫁给发起人,让其重新提单;escalate 不替任何人做决定,只是换一个人来做,因而是三者中唯一不产生「无人对结果负责」的选项。金额较大的节点上应优先考虑它。
警示 · 超时是系统代审,审计必须如实标注。触发超时后审计动作记的是 system 而非某位审批人,并写明「因超时由系统代为通过」。把系统自动通过伪装成某人点头,会让事后审计追到一个根本没看过这张单的人,这是审批系统里代价最高的一类记录失真。