3. 审批规则与条件配置方法
3.1 用户场景
某中型企业采购系统的审批流程需要根据订单金额、部门类型、供应商等级、是否紧急采购等条件动态选择审批路径。例如:
- 金额 ≤ 1000元且非紧急 → 部门主管直接审批
- 金额 > 1000元且 ≤ 5000元 → 部门主管 + 财务经理会签
- 金额 > 5000元或紧急采购 → 需要总经理审批,并抄送法务
- 供应商等级为“黑名单”时 → 无论金额多少,自动驳回
审批配置人员需要一种直观、灵活的方式定义这些规则,而不是硬编码到代码中。
3.2 业务问题
- 硬编码不可维护: 规则写在业务代码中,每次调整都需要开发修改、测试、发版,周期长、风险高。
- 逻辑组合复杂: 多条件(金额、部门、供应商、紧急度)需要支持 AND、OR、NOT 组合,普通配置界面难以表达。
- 路由不可控: 不同条件组合可能导向不同审批节点,甚至触发异常干预(驳回、转人工、加签),需要动态路由引擎。
- 验证困难: 规则配置后缺乏可视化验证,上线后才发现逻辑漏洞,造成审批错误。
3.3 用户访谈
访谈对象:采购流程管理员(张姐)、IT接口人(陈工)
| 访谈要点 | 用户原话 | 需求提炼 |
|---|---|---|
| 规则配置方式 | “我希望能像写简单公式一样配,不要让我写代码。” | 可视化条件表达式编辑器,支持字段选择、运算符、值输入。 |
| 逻辑组合 | “有时候是‘金额大并且是紧急’,有时候是‘部门是销售或者金额小于1000’。” | 支持括号分组,AND/OR/NOT 逻辑运算符。 |
| 动态路由 | “条件满足时候走到张三那,不满足走到李四那,有时候还要抄送王五。” | 条件路由节点:每个条件分支指向不同审批人/节点。 |
| 测试验证 | “配完了能不能模拟一下,看看不同情况走哪个流程?” | 规则沙箱测试:输入模拟数据,展示实际路由结果。 |
3.4 需求拆解
- REQ-3-1 条件表达式引擎: 提供字段(金额、部门、供应商等级等) + 运算符(>, <, =, in, contains, startsWith 等) + 值(固定值或变量)构建原子条件。
- REQ-3-2 逻辑组合器: 支持 AND、OR、NOT 组合多个原子条件,可嵌套括号分组,最终生成一棵布尔表达式树。
- REQ-3-3 动态路由规则: 配置“条件分支 → 审批节点”映射:每个分支包含条件表达式,匹配时选择对应路由;可设置默认路由、驳回条件、抄送条件。
- REQ-3-4 规则验证沙箱: 允许管理员输入模拟审批上下文(字段值),系统实时计算并展示最终路由节点。
3.5 方案表达
3.5.1 条件表达式语法
使用 JSON 格式定义条件表达式树,每个节点为 { "type": "operator" | "field" | "value", ... }。
{
"type": "AND",
"children": [
{ "type": "GT", "field": "amount", "value": 1000 },
{ "type": "NOT",
"children": [
{ "type": "EQ", "field": "dept", "value": "行政" }
]
}
]
}
UI 层可视化展示为树形条件分组块,用户通过拖拽字段和逻辑节点自由组合。
3.5.2 动态路由规则表
| 优先级 | 条件表达式 | 路由目标 | 附加动作 |
|---|---|---|---|
| 1 | supplier_rank == "blacklist" | REJECT(自动驳回) | 短信通知发起人 |
| 2 | amount > 5000 OR is_urgent == true | 总经理审批节点 | 抄送法务 |
| 3 | amount > 1000 AND amount ≤ 5000 | 部门主管+财务经理会签 | — |
| 4 | 默认(其他所有情况) | 部门主管审批 | — |
规则引擎从优先级最高至最低依次判断,命中后立即路由,不再继续匹配。
3.5.3 动态路由流程(SVG)
💡 实现要点: 配置界面采用“条件块+拖拽连接”的积木式设计,每个条件块可折叠、可编辑。后端引擎采用责任链模式,按优先级顺序调用条件匹配器,匹配成功即退出。
3.6 指标验证
| 指标 | 目标值 | 验证方式 |
|---|---|---|
| 规则配置效率 | 新增一条规则 ≤ 3分钟(含测试) | 记录 10 位管理员首次配置 5 条规则的平均耗时 |
| 表达式解析正确率 | 100% | 自动生成 100 组随机测试数据,对比引擎结果与预期结果 |
| 规则组合测试覆盖率 | ≥ 95% 的场景路径被沙箱覆盖 | 根据历史审批日志提取 200 条真实数据,沙箱回放验证 |
| 动态路由响应时间 | 单次路由计算 ≤ 50ms | JMeter 压测 1000 并发,95分位响应时间 |
3.7 验收标准
- ✅ 条件表达式编辑器支持:数值比较、字符串匹配(等于、包含、开头)、枚举值选择、日期比较。
- ✅ 逻辑运算符 AND/OR/NOT 可嵌套使用,支持括号优先级控制。
- ✅ 规则优先级可排序(拖拽调整),支持启用/禁用单条规则。
- ✅ 沙箱测试:输入模拟数据后,界面展示路由结果(命中规则、路由节点、抄送列表)。
- ✅ 规则引擎返回结果包含:匹配规则ID、路由节点ID、附加动作列表(驳回/抄送/加签/转交)。
⚠️ 常见陷阱: 注意条件表达式中的空值处理(如供应商等级为空时,不能抛出异常,应该按“未配置”处理);规则优先级设计时需考虑默认兜底规则,避免没有匹配时审批流程断掉。
3.8 交付物模板
| 交付物名称 | 内容说明 | 格式 |
|---|---|---|
| 条件表达式规范文档 | JSON Schema 定义、运算符列表、示例 | .md / .pdf |
| 动态路由规则配置UI原型 | Axure/Figma 交互稿(含条件块拖拽、优先级调整、沙箱面板) | .rp / .fig |
| 规则引擎接口API定义 | RESTful 接口:新增规则、更新规则、条件测试、路由计算 | Swagger / OpenAPI YAML |
| 测试用例集 | 覆盖黑名单、金额区间、紧急采购、多条件组合等场景 | Excel / JSON |
| 验收测试报告模板 | 指标验证结果表、缺陷清单、签名页 | .docx |