【Drools】(三)基于业务数据动态调用 DRL 规则文件:详细实现与测试指南

基于业务数据动态调用 DRL 规则文件:详解与实战

在业务规则管理中,DRL 文件(Drools Rule Language 文件)用于定义和执行业务规则。通过动态调用 DRL 文件,我们可以根据不同的业务场景灵活配置和执行定制化的规则,从而提高业务规则配置的灵活性和效率。本文将详细介绍如何基于业务数据动态调用 DRL 规则文件,并提供详细的代码注释和实现步骤,以帮助理解其执行过程。我们还将展示一个测试功能,用于模拟真实场景并验证规则执行的成功与否。

drools介绍,请参考: 探索Drools:Java世界的规则引擎

1. DRT 文件介绍

DRL(Drools Rule Language)文件是用来编写规则的文件格式,基于 DRT 规则模板动态配置生成 DRL 规则文件(更多请看:(一)基于业务需求动态生成 DRT 规则模板:事实与动作定义详解),我们可以根据不同的业务场景创建定制化的规则,提高业务规则配置的灵活性和效率。

下面是: (二)基于业务需求动态生成 DRL 规则文件:事实与动作定义详解

package org.droolsimport com.xinyuan.re.utils.DateUtilsdeclare SuppliersNumberFactPVOpurchaseMethod: StringprojectStage: StringsuppliersNumber: Integer
enddeclare SubmitTaskVerifyMessagestate: inttext: String
endrule "re_openbid_supplier_count_0"when $suppliers_number_fact_p_v_o : SuppliersNumberFactPVO(("00380002,00380024,00380020,00380003" == "null" || purchaseMethod memberOf "00380002,00380024,00380020,00380003") &&("1" == "null" || projectStage == 1) &&("3" == "null" || suppliersNumber < 3));$submit_task_verify_message : SubmitTaskVerifyMessage();then $submit_task_verify_message.setState(2);$submit_task_verify_message.setText("招标的项目,投标人数量少于3个不得开标");
endrule "re_openbid_supplier_count_1"when $suppliers_number_fact_p_v_o : SuppliersNumberFactPVO(("00380002,00380003,00380020,00380024" == "null" || purchaseMethod memberOf "00380002,00380003,00380020,00380024") &&("2" == "null" || projectStage == 2) &&("3" == "null" || suppliersNumber < 3));$submit_task_verify_message : SubmitTaskVerifyMessage();then $submit_task_verify_message.setState(2);$submit_task_verify_message.setText("资审阶段的项目,申请人数量少于3个不得开启");
end
2. 规则测试功能

我们为此专门开发了一个测试功能,可以模拟真实的业务场景,并调用规则执行,返回规则执行结果。通过此功能,可以快速验证规则的正确性和业务适用性。

测试功能界面如图所示:
在这里插入图片描述

在测试功能中,事实定义的数据会自动加载出来,用户可以根据实际需求输入相关参数,点击测试按钮后系统会自动调用规则引擎,返回测试结果。

3. 代码实现详解

下面是完整的代码实现,并附上详细注释,帮助理解其生成过程:

/*** 执行规则** @param ruleEngineContext 规则引擎上下文* @return 执行结果*/
@Override
public ReturnValue<Map<String, Object>> execRule(RuleEngineContext ruleEngineContext) {log.info("---------------执行规则开始---------------");// 获取规则定义GetReDefine getReDefine = reEngineService.getReDefine(ruleEngineContext.getRuleCode());Map<String, Object> actionMap = new HashMap<>();// 检查规则文件是否存在if (StringUtils.isNotBlank(getReDefine.getDrl_rule_file())) {// 获取事实定义GetReFactDefine getReFactDefine = reEngineService.getReFactDefine(getReDefine.getId());// 获取动作定义GetReActionDefine getReActionDefine = reEngineService.getReActionDefine(getReDefine.getId());// 使用 KieHelper 构建规则引擎KieHelper helper = new KieHelper();GetBigColumnRVO getBigColumnRVO = bigColumnFacade.getBigColumn(getReDefine.getDrl_rule_file());helper.addContent(getBigColumnRVO.getZdz(), ResourceType.DRL);log.info("执行规则,drl文件:{}", getBigColumnRVO.getZdz());// 构建 KieBaseKieBase kieBase = helper.build();// 获取事实类型和动作类型FactType factType = kieBase.getFactType(Constants_public.ORG_DRT_PACKAGE_NAME, getReFactDefine.getClass_name());FactType actionType = kieBase.getFactType(Constants_public.ORG_DRT_PACKAGE_NAME, getReActionDefine.getClass_name());log.info("执行规则,事实定义,所属服务:{}", getReFactDefine.getOwn_service());Map<String, Object> bizData;// 如果业务数据为空,则根据业务编号获取业务数据if (ruleEngineContext.getBizData().isEmpty()) {ReturnValue<Map<String, Object>> returnValue = reBizFacade.getBizData(getReFactDefine.getOwn_service(),RuleEngineContext.builder().bizId(ruleEngineContext.getBizId()).implClass(getReFactDefine.getFact_loader()).build());bizData = returnValue.getData();} else {// 使用上下文中的业务数据bizData = ruleEngineContext.getBizData();// 将数值类型的字符串转换为相应的数值类型List<ConditionDefine> conditionDefineList = getReFactDefine.getConditionDefineList();Map<String, Integer> conditionMap = conditionDefineList.stream().collect(Collectors.toMap(ConditionDefine::getFieldCode, ConditionDefine::getFieldType));bizData.forEach((key, val) -> {if (val != null && Objects.equals(conditionMap.get(key), Constants_re.FACT_PROP_TYPE_NUMBER)) {if (ConvertUtil.createString(val).length() >= 8) {bizData.put(key, ConvertUtil.createLong(val));} else {bizData.put(key, ConvertUtil.createInteger(val));}}});}log.info("执行规则,业务数据:{}", bizData);Object factInstance;Object actionInstance;try {// 创建事实实例factInstance = factType.newInstance();factType.setFromMap(factInstance, bizData);// 创建动作实例actionInstance = actionType.newInstance();} catch (InstantiationException | IllegalAccessException e) {throw new RuntimeException(e);}// 创建 KieSessionKieSession kieSession = kieBase.newKieSession();kieSession.insert(factInstance);kieSession.insert(actionInstance);// 执行所有规则kieSession.fireAllRules();// 释放 KieSessionkieSession.dispose();// 获取动作执行后的结果actionMap = actionType.getAsMap(actionInstance);log.info("执行规则,返回数据:{}", actionMap);}log.info("---------------执行规则结束---------------");ReturnValue<Map<String, Object>> returnValue = ReturnValue.newSuccessInstance();returnValue.setData(actionMap);return returnValue;
}
4. 测试功能说明

为了验证规则文件的正确性,我们实现了一个专门的测试功能。用户可以通过界面输入相关参数,模拟真实业务场景,测试规则的执行情况。

测试功能的使用步骤如下:

  1. 选择步骤:从下拉列表中选择需要测试的业务步骤。
  2. 选择时间类型:从下拉列表中选择时间类型。
  3. 输入当前时间和投标截止时间。
  4. 点击“测试”按钮,系统将调用规则引擎执行规则,并在“测试结果”中显示执行结果。

通过此测试功能,可以快速验证不同业务场景下规则的执行效果,确保规则的正确性和适用性。

总结

本文详细介绍了如何基于业务数据动态调用 DRL 规则文件,并通过实际代码示例和详细注释,阐述了整个执行过程。我们还展示了一个专门的测试功能,帮助模拟和验证规则执行的效果。通过这种方式,可以实现业务规则的灵活配置和高效执行,提升业务系统的自动化和智能化水平。

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

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

相关文章

【中项】系统集成项目管理工程师-第8章 信息安全工程-8.3工程体系架构

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

MongoDB 基础知识

一、为什么学习MongoDB MongoDB解决Mysql 的“三高”问题&#xff1a; 1.对数据库高并发写入需求 2.对海量数据高效率存储访问需求 3.对数据库高扩展和高可用的需求 MongoDB 实际应用&#xff1a; 1.社交场景&#xff0c;比如朋友圈&#xff0c;附近的人的地点的存储 2.…

Python for循环迭代原理(迭代器 Iterator)

在使用Python时&#xff0c;我们经常会使用for循环来访问容器对象&#xff08;列表、字符、字典等&#xff09;中的元素。其幕后实际是通过迭代协议来完成的&#xff0c;迭代是一种依次访问对象中元素的方式&#xff0c;for循环在对象上调用iter()函数生成一个迭代器&#xff0…

【Docker】Namespace 空间隔离实战

一、实战目的 了解隔离能力并不是 Docker 提供的&#xff0c;而是操作系统内核提供基本能力。 二、基础知识 1、dd 命令详解 Linux dd 命令用于读取、转换并输出数据。 dd 可从标准输入或文件中读取数据&#xff0c;根据指定的格式来转换数据&#xff0c;再输出到文件、…

Vue3----扩展 element Plug card

扩展 element Plug card 增加全屏&#xff0c;折叠操作项 核心代码 <template><div class"cc-card-component"><el-card v-if"state.isShow" :class"state.class" :bodyStyle"bodyStyle" :shadow"props.shadow…

Vmwar保姆级安装与配置

文章目录 一、官方下载1.访问VMware官方网站&#xff1a;2.选择产品&#xff1a;3.下载安装包&#xff1a; 二、VMware的安装1.运行安装程序2.选择安装位置3.选择安装选项4.完成安装 三、启动VMware Workstation Pro并配置虚拟机1.创建新的虚拟机&#xff1a;2.配置虚拟机硬件 …

【C#】.net core 6.0 webapi 使用core版本的NPOI的Excel读取数据以及保存数据

欢迎来到《小5讲堂》 这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 背景读取并保存NPOI信息NPOI 插件介绍基本功能示例代码写入 Excel 文件…

前端JavaScript处理小数精度问题(最佳实践)

前言&#xff1a; 针对于小数精度问题&#xff0c;本次我们主要推荐两种方式&#xff0c;一种是简单的函数封装&#xff0c;一种是使用第三方库big.js。 方法一&#xff1a; 自封装函数搭配parseFloat和toFixed解决小数精度问题&#xff0c;仅适用于解决一般性小数精度问题&…

【云原生】Kubernetes----k8s免密使用harbor私有仓库

目录 引言 一、搭建Harbor仓库 &#xff08;一&#xff09;关闭防护 &#xff08;二&#xff09;安装docker &#xff08;三&#xff09;安装docker-compose &#xff08;四&#xff09;安装harbor-offline 1.获取安装包 2.修改配置文件 3.启动服务 4.登录仓库验证 二…

营销人看巴黎奥运会,看到了什么?

不同的人眼中的巴黎奥运会是不一样的&#xff1a;环保人士关注奥运场馆的绿色设计&#xff0c;以及赛事期间对可再生能源的利用&#xff1b;旅游博主用镜头捕捉巴黎奥运会每一个精彩瞬间&#xff1b;社会学家在巴黎奥运会看到多元文化的交流与融合…… 那么营销人在巴黎奥运会…

聚观早报 | OPPO Find X8系列电池曝光;小米15 Pro更多影像细节

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 7月30日消息 OPPO Find X8系列电池曝光 小米15 Pro更多影像细节 KeeTa平台已开放便利店入驻 比亚迪方程豹将扩大…

大模型面试之LoRA

LoRA的解释&#xff1a;一种高效微调预训练神经网络的方法 LoRA 解决的问题&#xff1a; &#x1f538; 2021年初&#xff0c;微软与OpenAI合作探索GPT-3的商业可行性。 &#x1f538; 发现仅仅通过提示&#xff08;prompting&#xff09;不足以完成生产任务&#xff0c;例如…

EfficientNet-v2-s图像分类训练(简洁版)

使用torchvision集成的efficientnet-v2-s模型&#xff0c;调用torchvision库中的Oxford IIIT Pet数据集&#xff0c;对模型进行训练。 若有修改要求&#xff0c;可以修改以下部分&#xff1a; train_dataset OxfordIIITPet(root./data, splittrainval, downloadTrue, transfo…

loguru日志模块:简化Python自动化测试的日志管理!

引言 日志是软件开发中的关键组成部分&#xff0c;为开发和测试人员提供了调试和监控应用程序的重要手段。loguru 是一个第三方的 Python 日志库&#xff0c;以其简洁的 API 和自动化的功能脱颖而出。本文将探讨为什么项目中需要日志&#xff0c;loguru 为何受到青睐&#xff…

【Python机器学习】决策树的构造——递归构建决策树

我们可以采用递归的原则处理数据集&#xff0c;递归结束的条件是&#xff1a;程序遍历完所有划分数据集的属性&#xff0c;或者每个分支下的所有实例都具有相同的分类。如果所有实例具有相同的分类&#xff0c;则得到一个叶子节点或者终止块。任何到达叶子节点的数据必然属于叶…

年化27.9%,最大回撤-13.6%的可转债因子策略,结合机器学习特征筛选(附python代码)

原创文章第603篇&#xff0c;专注“AI量化投资、世界运行的规律、个人成长与财富自由"。 我们重新更新了可转债的全量数据&#xff0c;包含全量已经退市的转债。 ——这是与股票市场不一样的地方&#xff0c;股票退市相对少&#xff0c;而转债本身就有退出周期。 因此&…

x264 环路滤波原理系列:x264_frame_deblock_row 函数

x264_frame_deblock_row 函数 功能:该函数对视频帧中的一行宏块(Macroblock)进行去块滤波处理。去块滤波是视频编码中常用的一种技术,用于减少宏块之间的边界不连续性,从而提高视频质量。 函数关系与原理图: 函数原理流程梳理: 局部变量初始化;for 循环处理每个宏块:…

如何借助低代码 + BI 实现国央企数智化转型?

概要 在当前的软件开发时代&#xff0c;许多企业面临着核心技术缺失、专业人才短缺以及产品能力单一等问题&#xff0c;迫切需要加强技术实力&#xff0c;补充和扩展原有的业务和行业能力。将技术与业务需求深度结合&#xff0c;构建适应时代需求的技术业务模式&#xff0c;成…

容易发表的医学SCI期刊推荐,附投稿经验

常笑医学整理了适合医学生、医务工作者进行论文投稿的医学SCI期刊&#xff0c;附期刊详细参数与真实投稿经验&#xff0c;供大家参考。 1、ULTRASOUND IN MEDICINE AND BIOLOGY&#xff08;超声医学和生物学&#xff09; &#xff08;详细投稿信息请点击刊物名称查看&#xff…

MATLAB被360误杀的解决方案

前面被误杀&#xff0c;今天又被误杀。 前面误杀结果是缺少文件&#xff0c;重装MATLAB也不行。 结果重装了操作系统。 这次&#xff0c;看到了提示额外小心。 当时备份了“病毒”文件&#xff0c;结果备份的也被杀了。 解铃还须系铃人 在360安全卫士里面恢复&#xff0c;步骤…