基于 Easy Rules 的电商订单智能决策系统:构建可扩展的业务规则引擎实践

Easy Rules 是一个轻量级且易于使用的规则引擎,适用于Java应用。下面是一个简单的示例,演示如何使用 Easy Rules 定义和执行规则。

添加依赖

首先,在你的Java项目中添加 Easy Rules 的 Maven 依赖(如果你使用的是Maven构建工具):

<dependency><groupId>org.jeasy</groupId><artifactId>easy-rules-core</artifactId><version>4.3.0</version> <!-- 确保检查最新版本 -->
</dependency>

简单案例

创建规则

接下来,定义一个简单的规则。假设我们有一个业务需求:如果一个人的年龄大于18岁,则认为这个人是成年人。

import org.jeasy.rules.annotation.Action;
import org.jeasy.rules.annotation.Condition;
import org.jeasy.rules.annotation.Fact;
import org.jeasy.rules.annotation.Rule;@Rule(name = "adult rule", description = "if person's age is greater than 18 then he is an adult")
public class AdultRule {@Conditionpublic boolean check(@Fact("age") int age) {return age > 18;}@Actionpublic void execute() throws Exception {System.out.println("You are an adult.");}
}

执行规则

然后,创建一个简单的应用程序来执行这些规则:

import org.jeasy.rules.api.Facts;
import org.jeasy.rules.api.Rules;
import org.jeasy.rules.api.RulesEngine;
import org.jeasy.rules.core.DefaultRulesEngine;public class Application {public static void main(String[] args) {// Create factsFacts facts = new Facts();facts.put("age", 20); // 假设这个人的年龄是20岁// Create rulesRules rules = new Rules();rules.register(new AdultRule());// Create a rules engine and fire rules on known factsRulesEngine rulesEngine = new DefaultRulesEngine();rulesEngine.fire(rules, facts);}
}

在这个例子中,我们首先创建了一些事实(Facts),即这里的人的年龄为20岁。接着,我们定义了一个规则(AdultRule),该规则根据年龄判断是否为成年人。最后,我们使用 DefaultRulesEngine 来触发规则,并基于提供的事实进行评估。

当你运行上述代码时,应该会在控制台看到输出:“You are an adult.” 这表明规则已经成功执行并得出结论。

通过这种方式,你可以轻松地在自己的项目中集成和使用 Easy Rules 来处理各种业务逻辑。它不仅简化了规则的定义过程,还使得维护和更新规则变得更为直观和直接。

当然,下面是一个更复杂的 Easy Rules 使用案例,模拟一个电商场景中的订单处理系统。在这个案例中,我们将根据订单金额、用户等级和促销活动来决定是否应用折扣、是否免运费,以及是否需要额外的审核。

复杂案例

场景描述

  • 用户等级:普通用户(regular)、VIP 用户(vip)
  • 订单金额:大于 100 元可以免运费
  • 促销活动:如果当前有促销活动,所有订单享受 10% 折扣
  • VIP 用户:额外享受 5% 折扣
  • 高价值订单:订单金额超过 500 元,需要额外审核

1. 定义事实类(Facts)

// Order.java
public class Order {private double amount;private String userLevel; // "regular" or "vip"private boolean isPromotionActive;private boolean isFreeShipping;private double finalAmount;private boolean requiresReview;// 构造函数public Order(double amount, String userLevel, boolean isPromotionActive) {this.amount = amount;this.userLevel = userLevel;this.isPromotionActive = isPromotionActive;this.finalAmount = amount;this.isFreeShipping = false;this.requiresReview = false;}// Getter 和 Setter 方法public double getAmount() { return amount; }public String getUserLevel() { return userLevel; }public boolean isPromotionActive() { return isPromotionActive; }public boolean isFreeShipping() { return isFreeShipping; }public void setFreeShipping(boolean freeShipping) { this.isFreeShipping = freeShipping; }public double getFinalAmount() { return finalAmount; }public void setFinalAmount(double finalAmount) { this.finalAmount = finalAmount; }public boolean isRequiresReview() { return requiresReview; }public void setRequiresReview(boolean requiresReview) { this.requiresReview = requiresReview; }@Overridepublic String toString() {return "Order{" +"amount=" + amount +", userLevel='" + userLevel + '\'' +", isPromotionActive=" + isPromotionActive +", isFreeShipping=" + isFreeShipping +", finalAmount=" + finalAmount +", requiresReview=" + requiresReview +'}';}
}

2. 定义多个规则

规则 1:免运费规则
import org.jeasy.rules.annotation.*;
import org.jeasy.rules.api.Facts;@Rule(name = "Free Shipping Rule", priority = 3)
public class FreeShippingRule {@Conditionpublic boolean isEligibleForFreeShipping(@Fact("order") Order order) {return order.getAmount() > 100;}@Actionpublic void applyFreeShipping(@Fact("order") Order order) {order.setFreeShipping(true);System.out.println("免运费已应用:订单金额 > 100元");}
}
规则 2:促销折扣规则
@Rule(name = "Promotion Discount Rule", priority = 2)
public class PromotionDiscountRule {@Conditionpublic boolean isPromotionActive(@Fact("order") Order order) {return order.isPromotionActive();}@Actionpublic void applyPromotionDiscount(@Fact("order") Order order) {double discount = order.getFinalAmount() * 0.10;order.setFinalAmount(order.getFinalAmount() - discount);System.out.println("促销折扣 10% 已应用");}
}
规则 3:VIP 用户额外折扣
@Rule(name = "VIP Discount Rule", priority = 1)
public class VipDiscountRule {@Conditionpublic boolean isVipUser(@Fact("order") Order order) {return "vip".equalsIgnoreCase(order.getUserLevel());}@Actionpublic void applyVipDiscount(@Fact("order") Order order) {double discount = order.getFinalAmount() * 0.05;order.setFinalAmount(order.getFinalAmount() - discount);System.out.println("VIP 用户额外 5% 折扣已应用");}
}
规则 4:高价值订单审核规则
@Rule(name = "High Value Order Review Rule", priority = 0)
public class HighValueOrderReviewRule {@Conditionpublic boolean isHighValueOrder(@Fact("order") Order order) {return order.getAmount() > 500;}@Actionpublic void flagForReview(@Fact("order") Order order) {order.setRequiresReview(true);System.out.println("高价值订单,需人工审核");}
}

3. 主程序执行规则

import org.jeasy.rules.api.*;
import org.jeasy.rules.core.DefaultRulesEngine;public class OrderProcessingExample {public static void main(String[] args) {// 创建订单事实Order order = new Order(550.0, "vip", true); // 金额550,VIP用户,促销中Facts facts = new Facts();facts.put("order", order);// 注册所有规则Rules rules = new Rules();rules.register(new FreeShippingRule());rules.register(new PromotionDiscountRule());rules.register(new VipDiscountRule());rules.register(new HighValueOrderReviewRule());// 创建规则引擎并执行RulesEngine rulesEngine = new DefaultRulesEngine();rulesEngine.fire(rules, facts);// 输出最终订单状态System.out.println("\n最终订单信息:");System.out.println(order);}
}

4. 运行结果输出

免运费已应用:订单金额 > 100元
促销折扣 10% 已应用
VIP 用户额外 5% 折扣已应用
高价值订单,需人工审核最终订单信息:
Order{amount=550.0, userLevel='vip', isPromotionActive=true, isFreeShipping=true, finalAmount=467.5, requiresReview=true}

说明

  • 优先级(priority):数值越小,优先级越高。例如,高价值订单审核规则最后执行,但优先级最高(0),确保它在所有计算后仍能被触发。
  • 规则解耦:每个规则独立,易于维护和测试。
  • 可扩展性:你可以轻松添加新规则,如“节假日双倍积分”、“地区限制”等。

这个案例展示了 Easy Rules 如何处理多条件、多动作的复杂业务逻辑,同时保持代码清晰和可维护性。非常适合中小型系统中实现灵活的业务规则管理。

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

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

相关文章

如何使用gpt进行模型微调?

对 GPT 类大语言模型&#xff08;如 GPT-3、GPT-2、Hugging Face 的 GPT 系列、ChatGLM 等开源或闭源模型&#xff09;进行微调&#xff08;Fine-tuning&#xff09;&#xff0c;目的是让模型在特定任务或领域&#xff08;如法律、医疗、客服、代码生成等&#xff09;上表现更优…

数据可视化与人机交互技术

人机交互技术(HumanComputer Interaction&#xff0c;HCI)是21世纪信息领域需要发展的重大课题。例如&#xff0c;美国21世纪信息技术计划中的基础研究内容定为四项&#xff0c;即软件、人机交互、网络、高性能计算。其目标就是要开发21世纪个性化的信息环境。其中&#xff0…

MP2662GC-0000-Z降压转换器 MPS电源芯片 集成电路IC

MP2662GC-0000-Z 是MPS&#xff08;Monolithic Power Systems&#xff09;公司推出的一款高性能电源管理集成电路&#xff08;PMIC&#xff09;&#xff0c;属于其电池管理或电源转换产品线的一部分。以下是关于该器件的详细解析&#xff1a;1. 核心功能高效电源转换&#xff1…

Go 语言中的切片排序:从原理到实践玩转 sort 包

🚀 Go 语言中的切片排序:从原理到实践玩转 sort 包 在Go语言的日常开发中,切片(Slice)作为动态、灵活的数据结构,几乎无处不在。而排序作为数据处理的基础操作,更是高频需求。 Go标准库中的sort包凭借其优雅的设计和高效的实现,成为切片排序的“瑞士军刀”。本文将带…

PCB焊盘脱落的补救办法与猎板制造优势解析

PCB焊盘脱落是电子维修中常见的问题&#xff0c;轻则导致元件虚焊&#xff0c;重则引发电路板报废。遇到这种情况不必慌张&#xff0c;掌握正确的补救方法能最大限度挽回损失。一、焊盘脱落的应急处理方案若脱落焊盘未完全脱离基板&#xff0c;可用镊子夹住残留部分缓慢抬起&am…

python3.10.6+flask+sqlite开发一个越南留学中国网站的流程与文件组织结构说明

采用python3.10.6flasksqlite技术栈&#xff0c;开发一个越南留学中国网站&#xff08;vietnam-study-in-china&#xff09;。开发流程与文件组织结构说明 一、项目概述与规划 &#xff08;一&#xff09;项目背景与意义 留学趋势分析 近年来&#xff0c;中越两国教育交流日益…

uView Pro 正式开源!70+ Vue3 组件重构完成,uni-app 组件库新晋之星

一、项目背景 uni-app 作为一款优秀的跨平台框架&#xff0c;凭借其“一套代码&#xff0c;多端运行”的理念&#xff0c;受到了广大移动端开发者的青睐。 而在 uni-app 的生态中&#xff0c;uView UI 作为一款基于 Vue2 开发的开源组件库&#xff0c;凭借其丰富的组件、完善…

Qwen3 技术报告 的 Strong-to-Weak Distillation 强到弱蒸馏 和 代码实现

Qwen3 技术报告 的 Strong-to-Weak Distillation 强到弱蒸馏 和 代码实现 flyfish 代码在文末 技术报告就是不一定经过严格的学术期刊同行评审&#xff0c;但具有较强的专业性和实用性。 The post-training pipeline of Qwen3 is strategically designed with two core ob…

一体化步进伺服电机在无人机舱门应用中的应用案例

在无人机的设计过程中&#xff0c;舱门的快速、稳定开合对于无人机的任务执行效率和安全性至关重要。传统的舱门驱动方式存在响应速度慢、控制精度不足等问题&#xff0c;难以满足无人机复杂任务的需求。因此&#xff0c;某客户无人机选择了‌一体化步进伺服电机‌作为舱门的驱…

Ansible 面试题 20250811

1. 你使用过哪些 Ansible 模块? Ansible 常用的模块: file 、copy 、template 、yum 、apt 、service 、user 、group 、shell 、script 、command 、cron 等等。 这些模块可以用来管理文件、软件包、服务、用户、组、计划任务等等。 Docker相关模块: docker_container:用…

安路Anlogic FPGA下载器的驱动安装与测试教程

参考链接&#xff1a;安路下载器JTAG驱动安装 - 米联客(milianke) - 博客园 安路支持几款下载器&#xff1a; AL-LINK在线下载器是基于上海安路信息科技股份科技有限公司全系列 CPLD/FPGA 器件&#xff0c;结合公司自研的 TD 软件&#xff0c;可实现在线 JTAG 程序下载、Chip…

基于深度学习的股票分析和预测系统

摘要 【关键词】 第一章 绪论 1.1 研究背景及意义 1.2 国内外文献综述 1.2.1 国外研究结果 1.2.2 国内研究结果 1.3 本课题主要工作 第二章 相关工作介绍 2.1文本量化方法 2.2 CNN、LSTM模型 2.3评测准确率及收益率 第三章 开发技术介绍 3.1 系统开发平台 3.2平台…

ML基础设施(Machine Learning Infrastructure)

ML基础设施&#xff08;Machine Learning Infrastructure&#xff09; 是指支持机器学习项目从开发到部署全生命周期所需的底层技术架构和工具集合。其核心目标是让数据科学家和工程师能专注于模型创新&#xff0c;而非环境搭建等重复性工作。以下是深度解析&#xff1a;一、ML…

代码随想录刷题Day29

逆波兰表达式求值这是一道经典地使用栈来解决后缀表达式求解的题目。使用栈来求解后缀表达式的流程如下&#xff1a;借助栈的结构&#xff0c;可以求解出原始表达式是&#xff1a;9 &#xff08;-3 - 1&#xff09;* 3 10 / 2 2&#xff0c;在遵照规则过程中&#xff0c;还有…

crew AI笔记[3] - 设计理念

二八法则-task设计最重要80%精力设计tasks&#xff0c;20%精力定义agents花最多的实践定义任务说明清晰定义输入输出增加示例和预期结果来约束输出剩下的精力完善agent的role、goal、backstory1、Agent设计三要素role-goal-backstory框架Role - 职能定义足够具体【作家 &#x…

【李宏毅-2024】第六讲 大语言模型的训练过程1——预训练(Pre-training)

目录概述1. 预训练&#xff08;Pre-training&#xff09;2. 微调&#xff08;Fine-tuning&#xff0c;又称 SFT&#xff0c;Supervised Fine-Tuning&#xff09;3. 对齐&#xff08;Alignment&#xff0c;又称 RLHF 或 DPO 等&#xff09;4 三阶段对比6 第一阶段——自我学习&a…

基于LLVM的memcpy静态分析工具:设计思路与原理解析(C/C++代码实现)

在程序开发中&#xff0c;内存复制操作&#xff08;如memcpy&#xff09;往往是性能瓶颈的关键来源——尤其是大型内存块的复制&#xff0c;可能导致缓存失效、带宽占用过高等问题。为了精准定位这些潜在的性能热点&#xff0c;开发者需要一种能自动识别程序中memcpy调用&#…

使用 Conda 安装 xinference[all](详细版)

1. 安装 Miniconda&#xff08;若未安装&#xff09; Miniconda 是 Anaconda 的轻量版&#xff0c;仅包含 Conda 和 Python&#xff0c;适合服务器环境。 下载并安装 Miniconda 下载地址&#xff1a;Index of /miniconda &#xff0c;可以自行选择适合的版本 # 下载最新版 …

服务器登上去,显示 failed to send WATCHDOG 重启有效吗?

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 当你登录服务器时&#xff0c;看到类似以下提示&#xff1a; failed to send WATCHDOG: Resource temporarily unavailable这通常和系统的 systemd 服务有关&#xff0c;尤其是那些启用了 watchdog&#xff08;看门…

重学React(五):脱围机制一

背景&#xff1a; 之前将React的基础知识以及状态管理相关的知识都过了一遍&#xff0c;查漏补缺的同时对React也有了一些新鲜的认知&#xff0c;接下来这个模块的名字很有意思&#xff1a;脱围机制&#xff0c;内容也比之前的部分难理解一些。但整体看下来&#xff0c;理解之后…