当前位置: 首页 > news >正文

蓝凌的低门槛、可扩展的可视化公式引擎

引言

在实际的 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 实现一套高度可定制、支持可视化拖拽的公式引擎。通过技术与体验的结合,我们大幅降低了业务配置逻辑的门槛,也提升了系统的灵活性与安全性。

http://www.xdnf.cn/news/984313.html

相关文章:

  • 路径=算法=操作:复杂系统行为的统一数学框架
  • vue防止按钮重复点击方案
  • 随记 minio的图片跨域问题
  • Spring | JDK 动态代理与 CGLIB 代理:原理、区别与实战对比
  • Docker部署minio
  • AIStor 的模型上下文协议 (MCP) 服务器:管理功能
  • 什么是 Solana 上的 MEV?一键狙击是如何保护你的代币启动的?
  • ANeko v1.0.3 | 在手机里养只宠物猫 实时互动 动画细腻
  • 递归,回溯,DFS,Floodfill,记忆化搜索
  • 三.Gitee远程操作标签操作
  • Java使用Selenium反爬虫优化方案
  • 力反馈手套:工业虚拟现实培训领域的革新者
  • [蓝桥杯 2024 国 Python B] 设计
  • Spring Security如何拿到登录用户的信息
  • 安卓9.0系统修改定制化____系列讲解导读篇
  • 【C/C++】怎样设计一个合理的函数
  • 咖啡豆缺陷检测:用YOLOv8+TensorFlow实现工业级质检系统
  • 临时抱佛脚v2
  • 费用流学习笔记
  • C++内存池:减少动态分配开销的高效解决方案
  • R语言缓释制剂QBD解决方案之二
  • 如何使用vue2设计提示框组件
  • 解决华为云服务器无法ping通github问题
  • Java NIO 面试全解析:9大核心考点与深度剖析
  • Langfuse 深度使用指南:构建可观测的LLM应用系统
  • 蓝桥杯刷题
  • 腾讯位置商业授权危险地点查询开发指南
  • 【愚公系列】《生产线数字化设计与仿真》009-颜色分类站仿真(设置颜色分类站的仿真序列)
  • AI日报 - 2025年06月11日
  • ElasticSearch配置详解:什么是重平衡