# drools-sample **Repository Path**: Dripping/drools-sample ## Basic Information - **Project Name**: drools-sample - **Description**: drools实验项目 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2025-10-10 - **Last Updated**: 2025-10-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Drools Sample 一个基于 Spring Boot + Drools 的规则引擎实验项目,包含三个典型业务场景: - 个性化推荐(Personalization) - 风控评估(Risk Control) - 定价计算(Pricing) 支持一个可视化的主页用于快速构造请求、运行测试用例并查看结果。 ## 技术栈 - Java 17、Spring Boot 3.3 - Drools 8.x(`drools-engine`、`drools-compiler`、`drools-mvel`) - Thymeleaf + Bootstrap(用于可视化页面) - Maven 构建 ## 目录结构 - `src/main/java/com/example/drools` - `config/KieConfig.java`:加载规则文件(`rules/*.drl`) - `controller/*Controller.java`:REST 接口(推荐/风控/定价) - `service/*Service.java`:封装 Drools 调用、设置 `agenda-group` 焦点、插入/收集事实 - `model/*.java`:事实与结果类型(`UserProfile`、`Context`、`Score`、`Recommendation`、`RiskAssessment`、`PriceAdjustment`) - `dto/*.java`:请求 DTO(简化与完整入参) - `src/main/resources/rules` - `personalization.drl`:个性化推荐规则(`agenda-group "recommendation"`) - `risk-control.drl`:风控规则(`agenda-group "risk-control"`) - `pricing.drl`:定价规则(`agenda-group "pricing"`) - `src/main/resources/templates/index.html`:可视化主页(Thymeleaf) - `src/main/resources/static/js/app.js`:前端交互与请求 - `application.properties`:基础配置(端口、日志等) ## 快速开始 - 先确保安装 JDK 17 与 Maven ```bash mvn spring-boot:run ``` - 访问主页:`http://localhost:8080/` - 页面支持表单输入和预置测试,一键运行查看 JSON 结果 ## 规则与事实建模概览 - 使用 `Score(userId, name, value)` 表示业务指标,如 `creditScore`、`orderQuantity`、`engagement` 等 - 各模块通过 `agenda-group` 分组并在服务层设置焦点,仅触发对应业务规则 - 典型规则示例: - Pricing:“批量购买折扣”:`Score(name == "orderQuantity", value >= 10)` → 插入 `BULK_DISCOUNT` - Risk:“信用分评估”:基于 `creditScore` 阈值插入高/中/低风险 - Personalization:“VIP 推荐”:`segments contains "VIP"` 且 `channel` 为 `mobile/web` 且 `page=="homepage"`,`engagement >= 80` → 插入 `VIP_BANNER` - 兜底与互斥: - 定价默认规则建议使用 `not PriceAdjustment(userId == $u.id)`,仅在无其他命中时触发 - 如需“同一请求只返回一种结果”,可为定价规则使用统一 `activation-group` 并通过 `salience` 决胜 ## REST API 概览与示例 ### 个性化推荐 - 接口:`POST /api/recommend` - 请求体(推荐使用别名字段,后端兼容 `region|location` 与 `engagementScore|score`): ```json { "userId": "vip001", "segments": ["VIP"], "region": "上海", "channel": "mobile", "page": "homepage", "score": 90 } ``` ### 风控评估(简化) - 接口:`POST /api/risk/assess` - 请求体: ```json { "userId": "risk_high_001", "creditScore": 450, "income": 3000.0, "loanAmount": 500000.0, "hasCollateral": false, "employmentYears": 1 } ``` - 说明:服务层设置 `agenda-group "risk-control"`,插入 `UserProfile`、`Context` 与各 `Score`,返回命中规则的评估结果列表 ### 定价计算(简化) - 接口:`POST /api/pricing/calculate` - 请求体(注意字段名与规则一致:`orderQuantity`): ```json { "productId": "BULK_PROD", "basePrice": 500, "customerLevel": "SILVER", "quantity": 100, "season": "SUMMER", "region": "华南" } ``` - 说明:后端会插入 `Score(name="orderQuantity", value=quantity)` 以匹配“批量购买折扣”规则 ## 可视化页面 - 入口:`/`(`index.html`) - 功能:个性化推荐、风控评估、定价计算三大模块的表单、结果展示、预置测试用例、导出结果 - 交互:`app.js` 通过 Ajax 调用后端接口,并对 JSON 结果做格式化展示 ## 常见问题(FAQ) - 字段名不匹配导致规则不触发(例如 `quantity` vs `orderQuantity`):请确保请求中字段映射与规则一致 - 推荐分数量纲不一致(0–10 vs 0–100):后端已兼容并自动转换;如规则调整为 0–10,请同步修改 - 默认规则与折扣并存:为默认规则添加 `not` 条件或使用 `activation-group` 确保互斥 - 未命中默认评估:默认风控规则条件为 `not RiskAssessment(...)`,若已有命中则不会再触发兜底 ## 开发扩展建议 - 新增规则:在对应 `*.drl` 文件中添加 `rule`,保持事实名与服务层插入一致 - 调整优先级与互斥:合理设置 `salience` 与 `activation-group`,避免语义冲突 - 增加事实:在 `model` 中扩展类型,并在 Controller/Service 插入新事实以供规则匹配 ## 许可 - 本项目用于演示与学习,未附带开源许可证,如需用于生产请完善测试与安全审查。