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

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

在现代业务规则管理系统中,灵活高效地生成和管理规则至关重要。通过上一部分的DRT 规则模板(请参考:(一)基于业务需求动态生成 DRT 规则模板:事实与动作定义详解)结合业务上的动作定义和事实定义,自动生成 DRL(Drools Rule Language)规则文件,可以根据业务需求自定义和调整规则,从而提高业务的灵活性和响应速度。本文将详细介绍如何根据业务需求动态生成 DRL 规则文件,并结合示例界面图和代码进行说明。

图示示例说明

下图数据是根据事实定义和动作定义,自动初始化数据,业务人员可自行定义,主要包含了规则信息和规则设置两个部分:

在这里插入图片描述

  • 规则信息:包括规则名称、规则分类、规则标识以及是否启用的设置。
  • 规则设置:是否启用左边部分是事实数据,右边部分是动作数据,每一行是一条规则。

生成 DRL 规则文件的代码

以下代码演示了如何根据业务需求动态生成 DRL 规则文件。代码通过读取 JSON 格式的规则定义,过滤和转换数据,然后使用 Drools 提供的 ObjectDataCompiler 来生成 DRL 文件。

代码详解
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import com.fasterxml.jackson.core.type.TypeReference;
import org.drools.template.ObjectDataCompiler;/*** DroolsRuleUtil 类用于根据业务需求动态生成 DRL 规则文件。*/
public class DroolsRuleUtil {/*** 生成 DRL 规则文件。** @param saveReSetPVO 保存规则设置的对象* @return 生成的 DRL 规则字符串*/public static String generateDroolsDrl(SaveReSetPVO saveReSetPVO) {// 检查规则启用标志、规则定义详情和 DRT 模板是否有效if (Objects.equals(saveReSetPVO.getEnableFlag(), ConstantsRe.YES)&& StringUtils.isNotBlank(saveReSetPVO.getDefineDetail())&& StringUtils.isNotBlank(saveReSetPVO.getDrtRuleTemplate())) {// 将 JSON 格式的规则定义转换为 List<Map<String, Object>>List<Map<String, Object>> dataList = JacksonUtil.json2bean(saveReSetPVO.getDefineDetail(),new TypeReference<List<Map<String, Object>>>() {});// 过滤出启用的规则dataList = dataList.stream().filter(e -> Objects.equals(ConvertUtil.createInteger(e.get("enable_flag")), ConstantsRe.YES)).collect(Collectors.toList());if (CollectionUtils.isNotEmpty(dataList)) {// 将空值转换为 "null"for (Map<String, Object> map : dataList) {for (Map.Entry<String, Object> entry : map.entrySet()) {if (StringUtils.isBlank(ConvertUtil.createString(entry.getValue()))) {map.replace(entry.getKey(), "null");}}}// 将 DRT 模板字符串转换为输入流InputStream inputStream = new ByteArrayInputStream(saveReSetPVO.getDrtRuleTemplate().getBytes());// 使用 ObjectDataCompiler 根据模板和数据生成 DRL 规则文件return new ObjectDataCompiler().compile(dataList, inputStream);} else {// 如果数据列表为空,返回 nullreturn null;}}// 如果启用标志、规则定义详情或 DRT 模板无效,返回 nullreturn null;}
}

代码解析

  1. 检查规则启用标志和内容有效性

    • 首先,检查 saveReSetPVO 对象的 enableFlag 是否为启用状态,并确保 defineDetaildrtRuleTemplate 不为空。
  2. 转换和过滤规则定义数据

    • 使用 JacksonUtil.json2bean 将 JSON 格式的规则定义转换为 List<Map<String, Object>>
    • 通过 streamfilter 方法,过滤出 enable_flag 为启用状态的规则。
  3. 处理空值

    • 遍历规则列表,将所有空值转换为字符串 "null",以避免生成规则时出现空值错误。
  4. 生成 DRL 规则文件

    • 将 DRT 模板字符串转换为输入流,使用 Drools 提供的 ObjectDataCompiler 根据模板和数据生成 DRL 规则文件。

业务规则配置示例

根据图示的规则编辑界面,以下是生成的 DRL 规则文件示例:

package org.drools
import com.xinyuan.re.utils.DateUtils
declare SuppliersNumberFactPVOpurchaseMethod: StringprojectStage: StringsuppliersNumber: Integer
end
declare 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

结论

通过以上代码和示例,我们可以根据业务需求动态生成 DRL 规则文件。动态生成的 DRL 文件可以根据不同的业务场景进行定制化,提升了业务规则配置的灵活性和效率。

下一步可以进一步完善规则引擎闭环,包括基于 DRT 规则模板动态配置生成 DRL 规则文件,以及基于业务需求动态调用 DRL 规则文件。通过这些步骤,可以实现更加灵活和高效的业务规则管理系统。

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

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

相关文章

檢測代理IP是否乾淨的方法和工具

代理IP的品質和安全性直接影響到使用效果和安全性。因此&#xff0c;檢測代理IP是否“乾淨”顯得尤為重要。那麼&#xff0c;什麼是“乾淨”的代理IP&#xff1f;如何檢測代理IP是否乾淨呢&#xff1f;本文將為你詳細解答。 什麼是“乾淨”的代理IP&#xff1f; “乾淨”的代…

PHP师生荣誉管理系统—计算机毕业设计源码10079

目 录 摘要 1 绪论 1.1 研究背景 1.2论文结构与章节安排 2 师生荣誉管理系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.…

基于深度学习的智能行人跌倒监测系统详解

基于深度学习的行人跌倒检测系统&#xff08;UI界面YOLOv8/v7/v6/v5代码训练数据集&#xff09; 引言 行人跌倒检测在智能监控、老年人护理、医疗等领域有着广泛的应用。通过深度学习技术&#xff0c;尤其是YOLO&#xff08;You Only Look Once&#xff09;模型&#xff0c;我…

通配符 SSL 证书和 Nginx 配置:深入理解与最佳实践

在当今的网络环境中&#xff0c;确保网站的安全性至关重要。SSL 证书在这方面扮演着关键角色&#xff0c;而通配符 SSL 证书则为管理多个子域名提供了便利。本文将深入探讨通配符 SSL 证书的覆盖范围&#xff0c;并讨论如何在 Nginx 中正确配置它们。 通配符 SSL 证书的覆盖范…

UDP connect 内核源码分析

1 从诡异开始 最近遇到一个线上问题&#xff0c;client 发了一个 udp 请求&#xff0c;服务器回了一个响应&#xff0c;但诡异的是&#xff0c;client 的 log 却看不到对应的处理日志。抓包发现内核发出了一个指示 udp 目的端口不可达的 icmp 报文&#xff0c;类似这样的&#…

ES6语法详解,面试必会,通俗易懂版

目录 Set的基本使用WeakSet 使用Set 和 WeakSet 区别内存泄漏示例&#xff1a;使用普通 Set 保存 DOM 节点如何避免这个内存泄漏MapWeakMap 的使用 Set的基本使用 在ES6之前&#xff0c;我们存储数据的结构主要有两种&#xff1a;数组、对象。 在ES6中新增了另外两种数据结构&a…

Unity Canvas动画:UI元素的动态展示

在Unity中&#xff0c;Canvas是用于管理和展示用户界面&#xff08;UI&#xff09;元素的系统。Canvas动画是UI设计中的重要组成部分&#xff0c;它能够提升用户体验&#xff0c;使界面更加生动和响应用户操作。本文将探讨Unity Canvas动画的基本概念、实现方法以及一些实用的技…

Java面试八股之@Qualifier的作用

Qualifier的作用 Qualifier 是 Spring 框架中的一个非常有用的注解&#xff0c;它主要用于解决在依赖注入过程中出现的歧义问题。当 Spring 容器中有多个相同类型的 Bean 时&#xff0c;Qualifier 可以帮助指明应该使用哪一个具体的 Bean 进行注入。 Qualifier 的作用&#x…

成为git砖家(7): posh-git的安装和使用

文章目录 1. PowerShell 里的 git 默认使用体验不够好2. posh-git 介绍2.1 安装 posh-git2.2 PS1 显示的内容2.3 补全分支 1. PowerShell 里的 git 默认使用体验不够好 在 Windows 系统上&#xff0c;安装了 git for windows 后&#xff0c; git bash 里的体验确实不错。 但是…

C# 获取 Excel 文件的所有文本数据内容

目录 功能需求 范例运行环境 关键代码 组件库引入 获取Excel文件的文本内容 总结 功能需求 获取上传的 EXCEL 文件的所有文本信息并存储到数据库里&#xff0c;可以进一步实现对文件内容资料关键字查询的全文检索。有助于我们定位相关文档&#xff0c;基本实现的步骤如下&…

js 获取当前网站的协议、域名、端口号

在JavaScript中&#xff0c;你可以通过window.location对象来获取当前网站的URL信息&#xff0c;包括协议&#xff08;protocol&#xff09;、域名&#xff08;hostname&#xff09;、端口号&#xff08;port&#xff09;等。以下是如何分别获取这些信息的示例&#xff1a; 1.…

ThreadSanitizer: signal-unsafe call inside of a signal

如果在tsan中出现&#xff1a; ThreadSanitizer: signal-unsafe call inside of a signal (pid149999) 这一类warrning&#xff0c;那么大概率你是犯了下面的错。 https://man7.org/linux/man-pages/man7/signal-safety.7.html https://owasp.org/www-community/vulnerabilitie…

零代码拖拽,轻松搞定GIS场景编辑

在三维GIS领域&#xff0c;编辑场景和处理影像数据通常是一个复杂且费时的过程&#xff0c;但现在有了山海鲸可视化&#xff0c;这一切都变得简单有趣。这款免费可视化工具为您提供了零代码拖拽式编辑的体验&#xff0c;让您无需编程知识就能轻松创建和优化GIS场景。通过直观的…

Hive多维分析函数——With cube、Grouping sets、With rollup

有些指标涉及【多维度】的聚合&#xff0c;大的汇总维度&#xff0c;小的明细维度&#xff0c;需要精细化的下钻。 grouping sets&#xff1a; 多维度组合&#xff0c;组合维度自定义&#xff1b;with cube&#xff1a; 多维度组合&#xff0c;程序自由组合&#xff0c;组合为…

大数据:数据标准化及质量管控方案

本方案是一套全面的解决方案&#xff0c;旨在为企业构建科学、规范的数据管理体系&#xff0c;确保数据的准确性、一致性、完整性、合理性、及时性和有效性&#xff0c;从而支撑业务数据的高效应用与正确决策。以下是对该方案的详细介绍&#xff1a; 一、方案概述 本数据标准…

如何限制 docker 使用cpu

在 Docker 中可以使用多种方法来限制容器对 CPU 的使用&#xff0c;以下是一些常见的方式&#xff1a; 使用 --cpus 参数&#xff08;Docker 1.13 及更高版本&#xff09;&#xff1a;通过该参数指定容器可以使用的最大 CPU 核心数。例如&#xff0c;如果主机有4个核心&#xf…

迎峰度夏,应急备电:应急电源和燃油发电机哪个好?应急电源选购

在电网迎峰度夏的严峻挑战面前&#xff0c;铂陆帝应急电源以其卓越的性能和可靠性&#xff0c;成为了不可或缺的电力保障伙伴。与燃油发电机相比&#xff0c;铂陆帝应急电源在多个方面均展现出显著的优势。 更高效稳定&#xff0c;性能卓越 铂陆帝应急电源具备出色的性能和稳定…

GPIO子系统

1. GPIO子系统视频概述 1.1 GPIO子系统的作用 芯片内部有很多引脚&#xff0c;这些引脚可以接到GPIO模块&#xff0c;也可以接到I2C等模块。 通过Pinctrl子系统来选择引脚的功能(mux function)、配置引脚&#xff1a; 当一个引脚被复用为GPIO功能时&#xff0c;我们可以去设…

PySide(PyQt)的QPropertyAnimation(属性动画)

学不完&#xff0c;根本学不完:(&#xff0c;感觉逐渐陷入了学习深渊。。。 QPropertyAnimation 是 PySide(PyQt) 中一个用于在时间轴上平滑地改变对象属性的类。它常用于制作动画效果&#xff0c;比如移动、缩放或改变透明度等。 基本概念 QPropertyAnimation 是 Qt …

GPT5发布时间预测,即将到来的GPT5

GPT-5&#xff1a;未来的展望与功能预测 随着人工智能技术的飞速发展&#xff0c;生成式预训练模型&#xff08;GPT&#xff09;已经成为自然语言处理领域的核心技术。从 GPT-1 到目前的 GPT-4&#xff0c;每一代模型都带来了显著的进步和变革。那么&#xff0c;GPT-5 的到来将…