从案例角度解析建模平台动态规则引擎

源宝导读:明源云ERP建模平台提供了强大的页面联动规则引擎,原来需要编写代码完成的联动控制逻辑,现在只需要点点鼠标,通过配置完成。本文从实际案例的角度出发,介绍原始的代码逻辑如何转化为引擎规则的过程。

一、背景

    明源云ERP建模平台提供了强大的规则引擎机制,开发或者实施人员只需要通过简单的界面配置就可以完成必填、显隐、颜色等界面交互控制,从需要代码开发转为界面配置,极大提高了业务的交付效率。

    在行业中也存在类似规则配置解决方案,但是大部分支持简单的基于代码转换可视化配置,界面也十分复杂,并且缺少如业务参数、关键字等业务应用场景。所以我们如何深入的结合业务特性并且将界面的学习和使用成本降低到最小,就是我们面临的挑战。

    本文从实际案例的角度出发,介绍原始的代码逻辑如何转化为引擎规则的过程。

二、规则引擎整体架构

  • 设计时(Design-Time):用于规则的可视化配置,配置内容将会存储到配置文件中;

    • 条件配置:规则对应的业务判断逻辑,如“表编辑模式”;

    • 行为配置:将条件绑定到控件对应的组件属性或行为上,如保存按钮在”表单编辑模式“时显示;

  • 元数据(Metadata)

    • 元数据作为设计时和运行时的桥梁,用于存储设计时布局、字段配置、条件配置信息,通过元数据配置文件进行存储,在运行时解析元数据文件输出布局及规则配置;

  • 运行时(Runtime):解析规则配置,将规则和用户行为绑定, 转化为对应代码可执行逻辑;

    • 解析引擎:将设计时中的规则条件、行为配置等解析为可执行函数,保障执行性能;

    • 事件映射:将组件事件、用户操作等交互行为和规则执行函数绑定,触发事件时执行对应规则逻辑;

    • 执行器:在组件触发事件时构造数据上下文,将上下文对象传递到解析引擎生成的可执行函数中,根据函数执行结果分发到对应组件行为;

三、通过代码实现规则业务

    案例:折扣管理中折扣方案应用楼栋或者整栋楼或者单栋楼,涉及到隐藏规则及必填校验规则

“应用范围”为“整个项目”:

“应用范围”为“指定楼栋”:

通过脚本代码如何实现

    首先我们尝试将需求转为代码实现设计:

  • 当”应用范围“为”整个项目“时,楼栋名称隐藏,并且取消必填;

  • 当”应用范围“为”指定楼栋”时,楼栋名称显示,楼栋名称为必填。

    假设我们通过代码来实现上述场景的逻辑,首先我们会订阅“应用范围“的值更改事件,在事件中判断应用范围为”指定楼栋“时设置楼栋名称显示及必填。

// 订阅应用范围值更改事件
usedScope_valuechanged:function(e){// 获取楼栋名称控件var bldList = appform.get('BldList');switch(e.value){case 'all': // 应用范围:整个项目bldList.hide();bldList.setRequired(false);break;case 'one': // 应用范围:指定楼栋// 显示楼栋列表bldList.show();// 楼栋列表设置为必填bldList.setRequired(true);break;}
}


四、规则设计时配置

    基于代码实现我们可以将逻辑抽象为两个部分:

  • 条件:当”应用范围“等于”指定楼栋“

  • 行为:”楼栋名称“设置”必填、显示“都属于对应执行的行为

    如果我们需要将条件再做一次抽象,作为可视化界面可配置的,首先我们将条件翻译为代码:

// 当”应用范围“为”指定楼栋“
if(data.usedScop == 'one'){// todo
}

    我们可以从代码中得出条件包含以下几点:

  • 条件数据来源类型 :条件匹配会有不同的数据来源,一般是当前表单的数据中某个字段,也有场景是通过URL参数或者业务参数作为判断条件;

  • 条件数据来源值:这里的值是字段名称 ”userScope“;

  • 操作符:用于比较的方式,这里是”=“等于符号,其他操作符还有大于、小于、为空判断等等;

  • 匹配值类型:匹配值常见为固定值或者URL参数值等;

  • 匹配值:匹配值类型对应的值,如果是固定值这里是对应的固定值文本。

    我们这里的示例中只有一个条件,实际过程中条件一般会有多个并且还有不同逻辑的组合,所以我们需要考虑多个条件组合及复杂的判断逻辑。

规则行为配置

    条件配置完成后,条件需要和对应控件行为做关联,如“隐藏、必填”等,具体配置逻辑如下:

    “楼栋名称”控件显隐规则:如果“应用范围为指定楼栋”则“显示”:

  • 绑定控件:楼栋名称;

  • 绑定行为:显隐行为;

  • 对应条件:应用范围为指定楼栋;

  • 行为:显示。

五、规则运行时解析机制

    刚才提到的条件及行为都属于设计时的配置或描述,那么在界面运行时如何应用这些配置呢,需要对配置进行解析绑定到对应控件上。

1、将规则配置解析为对应表达式:

// 通过new Function 将规则生成为可执行函数
function rule(e){return e.data.useScope == 'one';
}

2、将规则行为绑定到控件上:

// 订阅应用范围值更改事件
var control = appform.get('usedScope');
control.on('valuechanged', invokeRule);

3、控件触发值改变时执行规则:

//执行规则
function invokeRule(e){var result = rule(e);//执行行为invokeAction(e, result);
}

4、执行组件行为:

function invokeAction(e){var action = e.action;switch(action){case 'show':if(result){e.control.show();}else{e.control.hide();}break;}
}


六、小结

    通过这个模型我们在必填、颜色、加粗、编辑模式、显隐等场景都实现了通过可视化配置,已经满足了80%的交互场景配置。后续面向更加复杂通过在线编码支撑,在规则条件上增加代码段在线编码,如API数据源、算法逻辑等,这样就可以通过规则引擎配置全面托管系统的交互逻辑配置,实现交互简单场景可视化配置、复杂场景低代码开发。

------ END ------

作者简介

文同学: 产品经理,目前负责建模平台的规划工作。

也许您还想看

【复杂系统迁移 NET Core平台系列】之界面层

.NET Core MVC扩展实践

如何解决大批量数据保存的性能问题

招商城科走进武汉研发中心,现场编码解锁平台内核技术

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/310558.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

想基于K8s按需扩展应用程序,可从这几方面入手

马修赫瑟(Matthew Heusser)在花费了十年时间进行编程,测试和项目管理之后,Matt Heusser于2011年创立了自己的公司Excelon Development。该协会前董事会成员Matt还是软件测试人员,是德国波茨坦最具影响力的敏捷测试专业…

windows环境下ELK平台搭建

背景 日志系统主要包括系统日志,应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器的软件,硬件信息,检查配置过程中的错误以及错误发生的原因。通常分析日志可以了解服务器的负荷,性能安全性,从而及时…

EntityFramework Core 3.x上下文构造函数可以注入实例呢?

今天讨论的话题来自一位微信好友遇到问题后请求我的帮助,当然他的意图并不是本文标题,只是我将其根本原因进行了一个概括,接下来我们一起来探索标题的问号最终的答案是怎样的呢?老规矩,首先我们定义如下上下文public c…

SpringCloud常见问题总结(一)

Eureka常见问题 Eureka注册服务慢 默认情况,服务注册到Eureka Server 的过程比较慢。在开发或者测试时候,如果能够加速注册的过程,从而提升工作效率。Spring Cloud官方文档详细描述了该问题的原因并提供了解决方案: //原文 Why…

[剑指offer]面试题21:包含min函数的栈

面试题21:包含min函数的栈 题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。 栈内压入3、4、2、1之后接连两次弹出栈顶数字…

IO 模型知多少

1. 引言同步异步I/O,阻塞非阻塞I/O是程序员老生常谈的话题了,也是自己一直以来懵懵懂懂的一个话题。比如:何为同步异步?何为阻塞与非阻塞?二者的区别在哪里?阻塞在何处?为什么会有多种IO模型&am…

[剑指offer]面试题22:栈的压入、弹出序列

面试题22:栈的压入、弹出序列 题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5 是某栈的压栈序列,序列4、5、3、2、1…

Ubuntu上安装使用Docker

Docker简介 Docker是一个开源的容器引擎,他有助于更快的交付应用。Docker可以将应用程序和基础设施层做隔离,并且能将基础设施当做程序一样进行管理。使用Docker,可以更快的打包,测试以及部署应用程序,并且可以缩短从…

让 .NET 轻松构建中间件模式代码

让 .NET 轻松构建中间件模式代码Intro在 asp.net core 中中间件的设计令人叹为观止,如此高大上的设计何不集成到自己的代码里呢。于是就有了封装了一个简单通用的中间件模板的想法,以后有需要的时候就可以拿来即用。接口定义这里按执行的委托是同步还是异…

[剑指offer]面试题26:复杂链表的复制

面试题26:复杂链表的复制 题目:请实现函数ComplexListNodeClone(ComplexListNodepHead),复制一个复杂链表。在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling 指…

SpringCloud + Docker

Dockerfile构建Docker 镜像 注意这里说的Dockerfile是指的一个文本文件,类似txt,只不过名字是Dockerfile,里面编辑Docker的一些指令,指令作用在于描述构建镜像的细节。如下一个简单的案例,用上一节中下载的nginx镜像来…

红帽借“订阅”模式成开源一哥,首创者升任总裁

4 月 6 日,红帽公司宣布,产品和技术总裁 Paul Cormier 即日起任红帽总裁,并兼任首席执行官。Paul Cormier 是开源商业化“订阅”模式的提出者,这一模式促使红帽达成连续超70个季度的盈利,身价升至340亿美金&#xff0c…

Docker中数据管理

Docker数据管理 生产环境中,对数据进行持久化,或者需要在多个容器直接进行数据共享,这必然涉及到容器的一些数据管理的操作。容器中数据管理主要有两种方式: 数据卷(Data Volumes):容器内数据直…

C#两大知名Redis客户端连接哨兵集群的姿势

前言前面《Docker-Compose搭建Redis高可用哨兵集群》,我的思路是将Redis、Sentinel、Redis Client App链接到同一个网桥网络,这个网桥内的Redis Client App就可以使用ContainerIP访问网桥内任意redis节点。同一网桥网络访问规避了Docker上发生的NAT&…

Docker之Dockerfile详解

使用Dockerfile创建镜像 Dockerfile是一个文本格式的配置文件,我们可以利用Dockerfile来快速的创建一个自定义的镜像。 基本结构 Dockerfile由一行命令语句组成,并且支持以#开头的注释一般包括四个部分:基础镜像信息,维护者信息…

创业的N种死法

点击蓝字关注,回复“职场进阶”获取职场进阶精品资料一份互联网的江湖一直流传着大佬们的创业传奇。马云上厕所几分钟敲定几千万美金融资。王石走投无路靠倒卖玉米赚到上百万从此逆袭。扎克伯格为了获得哈佛美女照片,开发一个小玩意从此改变了世界。传奇…

Docker容器实战思维

Docker成功的基础 Docker的实现用到的基础技术(cgroups, namespace,分层文件系统)在Docker之前已经存在很多年,并且 Linux Containers(LXC)也在很多企业的环境中得到了大量的应用实践,并得到明…

dotNET Core 3.X 请求处理管道和中间件的理解

理解 dotNET Core 中的管道模型,对我们学习 dotNET Core 有很大的好处,能让我们知其然,也知其所以然,这样在使用第三方组件或者自己写一些扩展时,可以避免入坑,或者说避免同样的问题多次入坑。本文分为以下…

了解.NET中的垃圾回收

原文来自互联网,由长沙DotNET技术社区编译。尽管这是一篇来自2009年的古老的文章,但或许能够对你理解GC产生一些作用。 了解.NET中的垃圾回收一旦了解了.NET的垃圾收集器是如何工作的,那么可能会触及.NET应用程序的一些更为神秘的问题时&…

数据结构与算法--数组:二维数组中查找

数组 数组最简单的是数据结构,占据一整块连续的内存并按照顺序存储数据,创建数组时候,我们需要首先指定数组的容量大小,然后根据大小分配内存。即使我们只在数组中存储一个元素,亚需要为所有数据预先分配内存&#xf…