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

基于 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.lryc.cn/news/618157.html

相关文章:

  • 电商双 11 美妆数据分析总结
  • CTO如何通过录音转写和音频降噪,提升企业远程协作效率?
  • 数据分析与可视化
  • 阿里巴巴开源多模态大模型-Qwen-VL系列论文精读(一)
  • Spring Cloud系列—Config配置中心
  • B树索引和B+树索引有什么区别?
  • TinyVue表格重构性能优化详解
  • 从基础编辑器到智能中枢:OpenStation 为 VSCode 注入大模型动力
  • 人工智能+虚拟仿真,助推医学检查技术理论与实践结合
  • MySQL 索引:索引为什么使用 B+树?(详解B树、B+树)
  • 零知开源——基于STM32F407VET6和INA219的功率监测器设计与实现
  • ZKmall开源商城的容灾之道:多地域部署与故障切换如何守护电商系统
  • 【新启航】从人工偏差到机械精度:旋转治具让三维扫描重构数据重复精度提升至 ±0.01mm
  • 解决 HTTP 请求 RequestBody 只能被读取一次的问题
  • 医美产业科技成果展陈中心:连接微观肌肤世界与前沿科技的桥梁
  • 【机器学习】什么是DNN / MLP(全连接深度神经网络, Deep Neural Network / Multilayer Perceptron)?
  • 01. maven的下载与配置
  • http网页部署
  • 微算法科技(NASDAQ:MLGO)开发经典增强量子优化算法(CBQOA):开创组合优化新时代
  • 聆思duomotai_ap sdk适配dooiRobot
  • 基于SpringBoot的课程作业管理系统
  • 【论文阅读】从表面肌电信号中提取神经信息用于上肢假肢控制:新兴途径与挑战
  • iOS 签名证书全生命周期实战,从开发到上架的多阶段应用
  • 数据可视化交互深入理解
  • 论文阅读:Agricultural machinery automatic navigation technology
  • 【论文阅读】RestorerID: Towards Tuning-Free Face Restoration with ID Preservation
  • LeetCode 分割回文串
  • 增加vscode 邮件菜单
  • 论文阅读(九)Locality-Aware Zero-Shot Human-Object Interaction Detection
  • Openlayers基础教程|从前端框架到GIS开发系列课程(24)openlayers结合canva绘制矩形绘制线