蓝凌的低门槛、可扩展的可视化公式引擎
引言
在实际的 OA、流程管理、数据驱动系统中,我们经常遇到需要对字段进行动态计算、自动赋值、条件分支等逻辑操作。传统做法依赖技术人员手写脚本(如 JavaScript、Groovy、BeanShell 等),门槛高、维护难。
本篇文章将分享我们如何基于 BeanShell
和自研的 FormulaParser
构建了一套低门槛、高扩展性的公式引擎,并通过可视化拖拽方式让非技术用户也能“拼出”可执行的逻辑表达式。
一、需求背景
-
公式功能的高频使用场景:
-
表单字段联动计算;
-
审批流程中的动态条件判断;
-
报表字段的动态汇总和统计;
-
数据赋值规则定义。
-
-
传统方式的问题:
-
函数名/变量写错导致运行失败;
-
用户不懂 Java 语法;
-
无法统一复用函数;
-
安全风险:脚本中可能执行敏感类或反射操作。
-
二、架构设计:公式引擎 FormulaParser
我们使用了 bsh.Interpreter
执行脚本,核心功能包括:
-
✅ 支持变量注入与解析(通过
$变量名$
); -
✅ 支持函数扩展与统一管理;
-
✅ 执行前黑名单校验、防注入;
-
✅ 支持数据上下文绑定;
-
✅ 兼容公式的加密解密执行;
三、拖拽公式编辑器:降低使用门槛
为了解决“不会写脚本”的问题,我们设计了公式可视化编辑器:
-
拖动变量、字段组件到编辑区;
-
支持基本运算符、函数调用、嵌套表达式;
-
实时预览脚本内容;
-
支持一键调试;




四、函数扩展机制:面向开发者友好
我们定义了函数扩展接口 IFormulaFuncProvider
,并支持动态注册,有现成的可扩展配置实现。
<?xml version="1.0" encoding="UTF-8"?>
<pluginxmlns="http://www.example.org/plugin-config"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.example.org/plugin-config ../../plugin.xsd "><extensionpoint="com.landray.kmss.sys.formula"model="com.landray.kmss.km.review.model.KmReviewMain"><itemname="function"><paramname="className"value="com.landray.kmss.km.reviewex.formula.CRMFunctions" /></item></extension>
</plugin>
com.landray.kmss.km.reviewex.formula.CRMFunctions 为类名,方法为静态类,主要方便脚本执行,静态类不需要创建对象,函数相当于静态工具类。

五、底层执行流程图
六、安全机制:黑名单与语法限制
-
禁止脚本中执行危险操作(如
Runtime.getRuntime()
等); -
支持配置黑名单关键字,动态屏蔽;
-
禁止 Unicode 绕过注入;
七、总结
本文介绍了我们如何基于 BeanShell 实现一套高度可定制、支持可视化拖拽的公式引擎。通过技术与体验的结合,我们大幅降低了业务配置逻辑的门槛,也提升了系统的灵活性与安全性。