审批流动态决策:JVS-Logic替代硬编码实现业务规则热更新
摘要
企业审批流程中的业务规则(如审批人判断、条件分支、超时处理)传统上通过硬编码实现,规则变更需要修改代码、编译、测试、上线,周期长达数天。本文以JVS-Logic逻辑引擎为例,展示如何通过可视化编排将审批规则从代码中解耦,实现规则的热更新与动态决策。包含完整的架构设计、代码示例、性能测试及最佳实践。
1. 硬编码审批流的痛点
典型的企业审批流程包含多个决策节点:
根据金额决定审批人(部门经理/总监/总经理)。
根据部门类型路由到不同审批链。
根据紧急程度决定审批时效。
超时自动升级或转交。
传统实现方式是在流程节点中硬编码判断逻辑:
java public String determineApprover(Reimbursement req) { if (req.getAmount() > 100000) { return "总经理"; } else if (req.getAmount() > 50000) { return "总监"; } else if (req.getDept().equals("财务部")) { return "财务经理"; } else { return "部门经理"; } }这种方式的痛点:
规则变更需要修改代码:每次调整审批阈值都要改Java代码。
变更周期长:修改→编译→测试→上线,至少1-2天。
业务人员无法参与:任何规则调整都需要IT介入。
多环境同步困难:开发、测试、生产环境的规则需分别维护。
2. JVS-Logic:可视化业务规则编排
JVS-Logic是JVS低代码平台的核心组件之一,提供可视化服务编排能力。其本质是将复杂的业务逻辑拆分为可复用的原子服务,通过可视化的方式进行编排,实现业务规则自动化。
核心特点:
界面化拖拽配置:通过拖拽连接企业系统/API/数据库等各种基础设施,自助式编排业务自动化执行流程。
热部署:逻辑修改后无需重启应用,秒级生效。
多种触发方式:支持表单事件、定时任务、API调用等多种触发方式。
Groovy脚本支持:复杂逻辑可通过Groovy脚本实现。
3. 审批流动态决策实现
3.1 架构设计
text
┌─────────────────────────────────────────────────────────┐ │ 审批流动态决策架构 │ ├─────────────────────────────────────────────────────────┤ │ 触发层 │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ 表单提交 │ │ 定时任务 │ │ API调用 │ │ │ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │ │ └─────────────────┼─────────────────┘ │ │ ↓ │ │ ┌──────────────────────────────────────────────────┐ │ │ │ JVS-Logic 逻辑引擎 │ │ │ │ ┌────────────┐ ┌────────────┐ ┌──────────┐ │ │ │ │ │ 条件判断 │→│ 变量计算 │→│ 动作执行 │ │ │ │ │ │ 节点 │ │ 节点 │ │ 节点 │ │ │ │ │ └────────────┘ └────────────┘ └──────────┘ │ │ │ └──────────────────────────────────────────────────┘ │ │ ↓ │ │ 执行层 │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ 设置审批人 │ │ 发送通知 │ │ 更新流程 │ │ │ └──────────────┘ └──────────────┘ └──────────────┘ │ └─────────────────────────────────────────────────────────┘
3.2 审批规则配置
场景:报销审批流程,规则如下:
金额≤5000:部门经理审批。
5000<金额≤50000:总监审批。
金额>50000:总经理审批。
财务部报销额外需财务经理会签。
JVS-Logic配置步骤:
创建逻辑:在JVS-Logic中新建一个逻辑,命名为
approval_rule。拖拽条件判断节点:
text 开始 → 判断金额范围 → [≤5000] → 设置审批人=部门经理 → 结束 → [5000-50000] → 设置审批人=总监 → 结束 → [>50000] → 设置审批人=总经理 → 结束- 添加部门判断分支(在金额判断后):
groovy // Groovy脚本节点:判断部门 def dept = form.getField("department") def approver = context.get("approver") if (dept == "财务部") { context.put("needFinanceSign", true) context.put("financeApprover", "财务经理") }- 保存并发布:逻辑配置完成后保存,立即生效。
3.3 热更新机制
JVS-Logic的热更新基于Groovy脚本动态加载:
java // 逻辑引擎热加载核心机制(简化) public class LogicEngine { private Map<String, CompiledScript> scriptCache = new ConcurrentHashMap<>(); public void execute(String logicId, Map<String, Object> context) { // 检查逻辑是否变更(基于版本号或时间戳) if (isLogicChanged(logicId)) { String script = loadScriptFromDB(logicId); CompiledScript compiled = compileScript(script); scriptCache.put(logicId, compiled); } CompiledScript script = scriptCache.get(logicId); script.eval(context); } }规则变更流程:
业务人员在JVS-Logic后台修改逻辑配置(如将总监审批阈值从50000改为30000)。
点击保存,系统更新数据库中的逻辑定义。
下次执行时,引擎检测到变更,重新加载并编译脚本。
整个过程无需重启应用,约2-5秒生效。
4. 性能测试
测试环境:4核8G,OpenJDK 17,模拟100并发审批请求。
| 场景 | 响应时间(P99) | 说明 |
|---|---|---|
| 首次执行(含编译) | 85ms | Groovy脚本首次编译 |
| 热执行(缓存命中) | 3-5ms | 脚本已编译缓存 |
| 规则变更后首次执行 | 80ms | 重新编译新脚本 |
| 并发100请求 | 25ms | 缓存命中场景 |
5. 与传统硬编码对比
| 维度 | 硬编码方式 | JVS-Logic |
|---|---|---|
| 规则变更时间 | 1-2天(含测试部署) | 2-5分钟(业务自助) |
| 业务人员参与度 | 无(需IT介入) | 高(可视化配置) |
| 规则版本管理 | Git(需代码合并) | 内置版本历史 |
| 多环境同步 | 手动(代码分支) | 导出导入配置 |
| 回滚能力 | Git revert + 重新部署 | 一键回滚历史版本 |
| 审计追踪 | 代码提交记录 | 操作日志 + 变更记录 |
6. 最佳实践
1. 规则分层设计
将复杂规则拆分为多个子逻辑,通过逻辑引用组合。
避免单个逻辑过于庞大(建议不超过20个节点)。
2. 脚本与配置分离
简单条件判断使用可视化配置。
复杂计算(如多条件组合、数学运算)使用Groovy脚本。
3. 测试与验证
在JVS-Logic中,每个逻辑都支持在线测试。
输入模拟数据,验证输出结果后再发布。
4. 变更审批
建议对生产环境的逻辑变更设置审批流程。
JVS-Logic支持操作日志审计,可追溯每次变更。
7. 总结
JVS-Logic通过可视化服务编排和Groovy脚本支持,将审批流的业务规则从代码中解耦,实现了规则的热更新与动态决策。业务人员可直接在Web界面修改审批规则,无需等待IT排期。对于审批流程频繁调整、需要快速响应业务变化的企业,这是一套高效的解决方案。
标签:#逻辑引擎 #审批流 #热更新 #JVS-Logic #业务编排