3. 审批规则与条件配置方法

3.1 用户场景

某中型企业采购系统的审批流程需要根据订单金额、部门类型、供应商等级、是否紧急采购等条件动态选择审批路径。例如:

  • 金额 ≤ 1000元且非紧急 → 部门主管直接审批
  • 金额 > 1000元且 ≤ 5000元 → 部门主管 + 财务经理会签
  • 金额 > 5000元或紧急采购 → 需要总经理审批,并抄送法务
  • 供应商等级为“黑名单”时 → 无论金额多少,自动驳回

审批配置人员需要一种直观、灵活的方式定义这些规则,而不是硬编码到代码中。

3.2 业务问题

  1. 硬编码不可维护: 规则写在业务代码中,每次调整都需要开发修改、测试、发版,周期长、风险高。
  2. 逻辑组合复杂: 多条件(金额、部门、供应商、紧急度)需要支持 AND、OR、NOT 组合,普通配置界面难以表达。
  3. 路由不可控: 不同条件组合可能导向不同审批节点,甚至触发异常干预(驳回、转人工、加签),需要动态路由引擎。
  4. 验证困难: 规则配置后缺乏可视化验证,上线后才发现逻辑漏洞,造成审批错误。

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)

动态路由规则匹配流程 审批请求发起 供应商是否为黑名单? 是 自动驳回 否 继续判断 金额>5000 或 紧急? 是 总经理审批(抄送法务) 否 金额 1000-5000? 是 主管+财务会签 否 部门主管审批 优先级规则从上到下匹配
💡 实现要点: 配置界面采用“条件块+拖拽连接”的积木式设计,每个条件块可折叠、可编辑。后端引擎采用责任链模式,按优先级顺序调用条件匹配器,匹配成功即退出。

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