基于 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
英文地址,請注明出處:http://en.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;理解之后…