当前位置: 首页 > 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.dtcms.com/a/243465.html

相关文章:

  • 【源码】研学报名小程序开发功能分析案例
  • AUTOSAR实战教程--DoIP_03_ 代码分析与调用栈观测(ISOLAR版)
  • 「日立涡旋压缩机」携手企企通,打造AI数智供应链协同新范式
  • Object.defineProperty()详解
  • 智谱的AI Agent :CoCo
  • 快速了解JVM的GC历史
  • 国产linux系统(银河麒麟,统信uos)使用 PageOffice实现word 文档中的table插入新行并赋值
  • 文件加密软件推荐,2025文档加密系统的最新排名
  • EtherCAT至TCP/IP异构网络互联:施耐德M580 PLC对接倍福CX5140解决方案
  • HTML原生日期插件增加周次显示
  • 审计效率升级!Word一键批量给数字添加千位分隔符
  • 科技评论:Jim Keller 的“反向”战略:RISC-V 成为中国应对美国芯片封锁的关键武器
  • AnythingLLM配置Milvus后,上传文档提示向量数据库标识符错误的解决办法
  • Google reCAPTCHA实现
  • milvus 总结
  • Electron-vite【实战】MD 编辑器 -- 编辑区(含工具条、自定义右键快捷菜单、快捷键编辑、拖拽打开文件等)
  • 微服务架构中的 Kafka:异步通信与服务解耦(二)
  • 0611的
  • Intel Boot Guard
  • RAG的5种高效切分策略:提升检索增强生成效果的关键
  • Linux进程管理:创建,终止,等待
  • Linux611 libvirtb ;FTP vsftpd.conf部分配置文件
  • C#简单线程启动的几种方法总结
  • npm包 本地测试流程
  • 为 Nginx 配置 HTTPS(以 n8n 为例)完整教程【CentOS 7】
  • 时序数据库IoTDB数据模型建模实例详解
  • Java使用Selenium反爬虫优化方案
  • Nuxt3 中使用 pnpm 安装的 NuxtImg 使用会提示找不到图片
  • Linux(Centos 7.6)命令详解:whoami
  • 时序数据库Influxdb3 core安装