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

蓝凌EKP产品:低门槛、可扩展、可视化公式引擎应用示例

引言

在实际的 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/13701.html

相关文章:

  • 功能化组件编码流程-2(延续上一章)
  • 《HarmonyOSNext属性动画实战手册:让UI丝滑起舞的魔法指南》
  • 人工智能新范式:从大模型到智能体的演化逻辑
  • 语音信号处理三十——高效多相抽取器(Polyphase+Noble)
  • Java并发编程实战 Day 18:线程池深度剖析与自定义实现
  • 工业自动化网关在饮料行业中的应用:DeviceNet转Modbus RTU协议转换网关案例
  • sssssssssssss
  • 电子电路原理第十八章(有源滤波器)
  • 【C#如何计算从某一个日期到今天过了多少天】2022-4-24
  • 94. 评论日记
  • Linux CPU 亲和性
  • ARM架构下安装mysql8.0
  • Dagster软件定义资产(SDA)完全指南:从概念到落地实践
  • 研发效能提升--质量改进完美闭环
  • TTS走向拟人化时代:数据堂高质量语音资源全面支撑模型升级
  • 库架一体式货架:重塑现代仓储空间的智能解决方案
  • 简单的五子棋实现简介
  • 【【大模型训练】中短序列attention 和MOE层并行方式】(三)
  • 从编辑到安全设置: 如何满足专业文档PDF处理需求
  • 汇编字符串比较函数
  • yapi服务端可视化安装
  • C++设计模式:八股文
  • (简单介绍)EleutherAI
  • MS8188是一款36V高精度低噪声的运算放大器,采用高压斩波技术来实现零温漂的特性,可替代LT1012/ADA4522/MAX44244/TPA1831
  • π0.5与π0区别
  • Mentalab Explore 开源 EEG 软件方案:构建开放兼容的脑电研究生态
  • 动态规划1——线性动态规划
  • 创客匠人助力家庭教育IP破局:从0到1打造创始人个人品牌全攻略
  • Android Compose 自定义滑动进度条
  • RAGFlow迁移到GPU服务器(Docker容器元数据修复)