基于
docs/superpowers/specs/2026-09-17-product-recommendation-rule-engine-design.md
目标:创建 recommendation_rules 表,同步 schema.sql
步骤:
cfc-backend/src/main/resources/schema.sql 末尾追加 CREATE TABLE recommendation_rules (...) 定义(含索引)DatabaseInitializer.java 末尾的 runMigrations() 中添加新迁移(迁移编号递增,当前最大编号搜索确认)mvn clean compile 验证无编译错误文件:
cfc-backend/src/main/resources/schema.sqlcfc-backend/src/main/java/com/etotem/cfc/config/DatabaseInitializer.java目标:基础 CRUD 能力
步骤:
entity/RecommendationRule.java(对应 recommendation_rules 表,字段见设计文档 3.1)mapper/RecommendationRuleMapper.java(使用 MyBatis-Plus,提供按 scene、rule_type、enabled 查询方法)service/RecommendationRuleService.java
listRules(sceneCode, page, size) — 分页列表getRuleById(id) — 详情createRule(rule) — 创建,含参数校验(rule_type 1-5、priority>0、trigger/target 非空等)updateRule(id, rule) — 更新deleteRule(id) — 删除(设 enabled=0,软停用)batchUpdateEnabled(ids, enabled) — 批量启用/停用controller/recommendation/RecommendationRuleAdminController.java
POST /api/admin/recommendation-rules/listPOST /api/admin/recommendation-rules/createPOST /api/admin/recommendation-rules/updatePOST /api/admin/recommendation-rules/deletePOST /api/admin/recommendation-rules/batch-enablemvn clean compile 验证目标:RecommendationRuleEngine.recommend(ctx, limit) 完成 5 种规则计算
步骤:
新建 service/RecommendationRuleEngine.java(实现 RecommendationRuleEngine 接口)
内部方法设计:
loadRules(String sceneCode) — 加载匹配的启用规则,按 priority DESCqueryPurchasedProducts(RecommendationContext ctx) — 查购买记录,返回 Map<Long, Date>(productId → 最早购买日期)buildBaseCandidates(RecommendationContext ctx) — 按场景构建候选池(保留现有维度页推荐逻辑)applyRules(List<RecommendationRule> rules, Set<Long> purchasedIds, List<BaseCandidate> candidates) — 应用所有规则
sortAndTruncate(List<BaseCandidate> candidates, int limit) — 排序截断保留 ProductRecommendationService.getDimensionRecommendations 现有逻辑作为 buildBaseCandidates 的基础实现,但不再直接调用 getPurchasedProductIds,改由引擎统一处理
在 ProductRecommendationController.getDimensionProducts 中:
engine.recommend(ctx, limit),将 RecommendedProduct 映射为现有 Map<String, Object> 格式返回运行 mvn clean compile 验证
目标:规则2 配置从 recommendation_rules 读取,旧 repurchase_reminder_config 不再被代码引用
步骤:
RepurchaseReminderService.scanAndCreateReminders()
repurchase_reminder_config 表recommendation_rules 表中 rule_type=2 AND enabled=1 的规则trigger_product_id → 触发商品delay_days → 复购延迟天数target_product_id → 复购提醒的商品(与 trigger 相同或不同均可)max_reminders → recommendation_rules 表暂无此字段,暂时复用 repurchase_reminder_record 中的已发送次数判断@Scheduled(cron = "0 0 9 * * ?"),不修改触发时间mvn clean compile 验证目标:商城首页、商品详情页、下单成功页的推荐接口
步骤:
POST /api/recommend/mall-home
{ "limit": 10 }engine.recommend(ctx, limit) 其中 scene="mall_home"POST /api/recommend/product-detail
{ "productId": 123, "limit": 6 }engine.recommend(ctx, limit) 其中 scene="product_detail", currentProductId=123POST /api/recommend/after-order
{ "orderId": 456, "limit": 6 }engine.recommend(ctx, limit) 其中 scene="after_order"ProductRecommendationService.getReportRelatedProducts
engine.recommend(ctx, limit) 其中 scene="report_related"mvn clean compile 验证目标:cfc-web 新增「商品推荐规则」管理页面
步骤:
cfc-web/src/views/ 下新建 RecommendationRules.vue
cfc-web/src/router/ 下新增路由 /admin/recommendation-rulescfc-web/src/api/ 下封装推荐规则接口npm run build 验证编译通过目标:规则计算正确,降级场景正常
步骤:
ProductRecommendationEngineTest(或 RecommendationRuleEngineTest)
mvn clean testmvn clean compile 最终验证192.168.16.251:3306 执行迁移,验证接口返回正常| 新增文件 | 说明 |
|---|---|
cfc-backend/.../entity/RecommendationRule.java |
新实体 |
cfc-backend/.../mapper/RecommendationRuleMapper.java |
Mapper |
cfc-backend/.../service/RecommendationRuleService.java |
CRUD Service |
cfc-backend/.../service/RecommendationRuleEngine.java |
引擎核心 |
cfc-backend/.../controller/recommendation/RecommendationRuleAdminController.java |
管理端 Controller |
cfc-web/src/views/RecommendationRules.vue |
管理端页面 |
cfc-web/src/api/recommendationRule.js |
管理端 API 封装 |
| 修改文件 | 说明 |
|---|---|
cfc-backend/.../service/ProductRecommendationService.java |
改为调用引擎 |
cfc-backend/.../service/RepurchaseReminderService.java |
规则2 配置改读 recommendation_rules |
cfc-backend/.../config/DatabaseInitializer.java |
新增 DDL 迁移 |
cfc-backend/src/main/resources/schema.sql |
新增 recommendation_rules 表定义 |
cfc-web/src/router/index.js |
新增路由 |
docs/superpowers/api/API_REFERENCE.md |
同步新增接口文档 |