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

【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 规则文件。通过这些步骤,可以实现更加灵活和高效的业务规则管理系统。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Apache ShardingSphere Proxy5.5.0实现MySQL分库分表与读写分离
  • Halcon学习之边缘扩展
  • Java代理模式详解
  • React 的 KeepAlive 实战指南:深度解析组件缓存机制
  • 【网络爬虫技术】(1·绪论)
  • 深度学习高效性网络
  • 2024钉钉杯B题医疗门诊患者及用药数据案例分析
  • SolidWorks设计库的应用
  • 基于Golang+Vue3快速搭建的博客系统
  • 顺序表和单链表的代码实现
  • Ubuntu22.04安装Go语言的几种方式
  • Nginx系列-12 Nginx使用Lua脚本进行JWT校验
  • 【第三天】计算机网络 HTTP请求中常见的状态码 什么是强缓存和协商缓存
  • Spark进化论:从RDD到DataFrame,揭秘Spark SQL如何成为性能引擎的幕后英雄
  • 【数据结构】排序
  • 分享的文章《人生如棋》
  • C++类的相互关联
  • GraphQL学习过程应该是这样的
  • js
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • TCP拥塞控制
  • use Google search engine
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 对超线程几个不同角度的解释
  • 机器学习学习笔记一
  • 自动记录MySQL慢查询快照脚本
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • (003)SlickEdit Unity的补全
  • (C语言)球球大作战
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (HAL库版)freeRTOS移植STMF103
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (翻译)terry crowley: 写给程序员
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (六)Flink 窗口计算
  • (七)Appdesigner-初步入门及常用组件的使用方法说明
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • (转载)Google Chrome调试JS
  • **《Linux/Unix系统编程手册》读书笔记24章**
  • .net core 6 集成和使用 mongodb
  • .NET Framework、.NET Core 、 .NET 5、.NET 6和.NET 7 和.NET8 简介及区别
  • .NET MVC第三章、三种传值方式
  • .net6使用Sejil可视化日志
  • .net8.0与halcon编程环境构建
  • .Net中的设计模式——Factory Method模式
  • @ComponentScan比较
  • [ Algorithm ] N次方算法 N Square 动态规划解决
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [000-002-01].数据库调优相关学习
  • [15] 使用Opencv_CUDA 模块实现基本计算机视觉程序
  • [C#]使用C#部署yolov8-seg的实例分割的tensorrt模型