Pārlūkot izejas kodu

更新项目架构文档

jintao.geng 1 nedēļu atpakaļ
vecāks
revīzija
6c7c490ad7
1 mainītis faili ar 113 papildinājumiem un 1 dzēšanām
  1. 113 1
      README.md

+ 113 - 1
README.md

@@ -1 +1,113 @@
-卡牌评级小程序 推荐服务
+卡牌评级小程序 推荐服务
+
+## 架构概览
+
+本服务是卡牌评级小程序的「评级时效推荐 + 卡片行情详情 + 数仓规则同步 + AI 业务助手」中台,采用 DDD 五模块分层。下面先用一张关系图展示三类请求(小程序推荐/详情、内部规则同步、AI 会话)从入口到落库/落 Redis 的调用流转,再用映射表、依赖树与要点说明逐层拆解真实组件。
+
+```
+                          ┌───────────────────────────────────────────┐
+                          │   小程序端 / 内部同步端 (mango-application)   │
+                          │  RecommendController   CardController        │
+                          │  RuleSyncController     AiChatController(SSE) │
+                          └───────────────────────────────────────────┘
+                                              │  @PostMapping + @ApiLog(AOP)
+                                              ▼
+        ┌────────────────────────── 领域服务层 (mango-domain) ──────────────────────────┐
+        │  RecommendServiceImpl   CardDetailServiceImpl   RuleSyncServiceImpl   AiChatService │
+        │        │                      │                      │                    │        │
+        │        ▼ 内存纯算法            │                      │                    ▼        │
+        │  RuleMatcher(L0~L3降级)        │                      │           AgentLoopExecutor  │
+        │  OrderGrouper(按时效分单)      │                      │           ClaudeChatProvider │
+        │  EfficiencyPriceProvider       │                      │           ToolRegistry       │
+        │  LoginUserProvider             │                      │           (工具: 物流查询)   │
+        └────────┬──────────────────────┴──────────┬───────────┴──────────┬───────────────────┘
+                 │ Manager 聚合                     │ Manager 聚合          │
+                 ▼                                  ▼                       ▼
+        ┌─────────────── Manager 层 (mango-manager) ───────────────┐   ┌──── 横切 / 外部依赖 ────┐
+        │ RatingRecommendRuleManager  CardPopManager               │   │ Feign:                  │
+        │ CardValueHistoryManager     ActiveBatchManager           │   │  rating-app-preorder    │
+        │ UserAddressManager                                       │   │  rating-app-order       │
+        └────────────────────────┬─────────────────────────────────┘   │  order-service          │
+                                  │ @Mapper 单表 SQL                     │  pay-service            │
+                                  ▼                                      │ Redis: 会话/字典缓存    │
+        ┌────────── Mapper/XML 层 (mango-infrastructure) ──────────┐   │ Redisson: 分布式锁工具  │
+        │ RatingRecommendRuleMapper  CardPopMapper                 │   │ Shiro: 认证/在线会话    │
+        │ CardValueHistoryMapper     ActiveBatchMapper  ...        │   └─────────────────────────┘
+        └────────────────────────┬─────────────────────────────────┘
+                                  ▼
+                          ┌───────────────┐
+                          │  PostgreSQL    │
+                          │ t_rating_*     │
+                          └───────────────┘
+
+  说明:推荐服务本身不写业务订单库,预订单落库通过 Feign 远程交由 rating-app(PreOrderApiClient)。
+```
+
+#### 详细映射关系表
+
+| 接口分区 | 核心 Controller | 领域 Service | 核心实体(PO) 与表 | 使用场景 |
+|---|---|---|---|---|
+| 小程序-评级时效推荐 `/api/recommend/efficiency` | `RecommendController` | `RecommendServiceImpl` | `RatingRecommendRulePO` → `t_rating_recommend_rule` | 批量卡片按规则匹配推荐时效、按时效分单报价、Feign 生成预订单 |
+| 小程序-卡片详情趋势 `/api/recommend/card/detail` | `CardController` | `CardDetailServiceImpl` | `CardPopPO` → `t_rating_card_pop`;`CardValueHistoryPO` → `t_rating_card_value_history` | 查卡片身份/POP 榜/行情/价格趋势曲线 |
+| 内部-数仓规则同步 `/api/recommend/rule/sync` | `RuleSyncController`(Token 鉴权) | `RuleSyncServiceImpl` | `RatingRecommendRulePO`、`ActiveBatchPO` → `t_rating_recommend_active_batch` | 数仓全量推送规则/POP/价格历史,单事务全量替换 + 切生效批次 |
+| 小程序-AI 业务助手 `/api/ai/chat/stream` | `AiChatController`(SSE 流式) | `AiChatService` | 会话上下文存 Redis(`SessionContextStore`) | 多轮对话 + 工具调用(订单物流查询),Claude 流式打字机输出 |
+
+#### 服务依赖关系
+
+```
+RecommendServiceImpl
+├── RatingRecommendRuleManager      # 批量捞候选规则(按 series+cardSet / series+role)
+├── ActiveBatchManager              # 读当前生效批次号
+├── RuleMatcher (纯算法)            # 分类前提过滤 + L0~L3 降级 + 多候选取舍
+├── OrderGrouper (纯算法)           # 按推荐时效精确分单
+├── EfficiencyPriceProvider ──► order-service  # 拉时效字典(名称+单价)
+├── LoginUserProvider               # 取当前登录用户
+└── PreOrderApiClient ──► rating-app-preorder  # Feign 远程落库预订单
+
+CardDetailServiceImpl
+├── RatingRecommendRuleManager      # 卡片身份+行情
+├── CardPopManager                  # POP 榜明细
+├── CardValueHistoryManager         # 价格趋势
+└── ActiveBatchManager              # 生效批次隔离
+
+RuleSyncServiceImpl
+├── RatingRecommendRuleManager / CardPopManager / CardValueHistoryManager
+└── ActiveBatchManager              # 防回灌校验 + 切换生效批次指针
+
+AiChatService
+├── SessionContextStore ──► Redis   # 多轮会话上下文
+├── AgentLoopExecutor ──► ClaudeChatProvider(anthropic)  # Agent 循环 + 模型调用
+└── ToolRegistry └── OrderLogisticsQueryTool ──► rating-app-order  # 工具回调 Feign
+```
+
+### 关键架构说明
+
+#### 1. **DDD 分层职责**
+- **mango-application**: 启动类 `RatingRecommendApplication`(端口 8094),四个 `app.controller`,接口统一 `@PostMapping`;`@ApiLog` AOP 记录操作日志。
+- **mango-domain**: 领域服务实现、推荐纯算法(`RuleMatcher`/`OrderGrouper`)、Feign 客户端与其封装(`PreOrderApiClient`/`OrderApiClient`)、AI Agent 相关组件。
+- **mango-manager**: `XxxManager` 聚合 Mapper,仅注入 Mapper 接口,做单表查询/批量写的简单封装。
+- **mango-infrastructure**: `@Mapper` 接口 + XML 单表 SQL、`MybatisPlusConfig`(PostgreSQL 分页)。
+- **mango-common**: PO、DTO/Request/Response、枚举、`RecommendProperties`/`AiAssistantProperties` 配置、`RedisUtils`/`RedissonLockUtil` 工具、Shiro 认证等共享内核。
+
+#### 2. **评级时效推荐核心流程(业务主线)**
+- **批量捞规则**: 按 `cardType` 分派收窄键——宝可梦卡(cardType=1)用 `(series, role)`、其它用 `(series, cardSet)`,一次批量查询消除 N+1。
+- **降级匹配**: `RuleMatcher` 先做分类前提过滤(cardType/sportEvent/ipName/team/rule 入参有值才约束),再按 `L0 → L1 → EXACT → L2 → L3` 逐层降级,多候选按「生效时间→推荐时效→id」取最优;全部落空按 `cardType` 兜底默认档。
+- **分单与报价**: `OrderGrouper` 按推荐时效精确分组为多个订单建议;`EfficiencyPriceProvider` 从 order-service 拉时效字典回填名称+单价,缺价降级为「待计算」。
+- **不落业务库**: 推荐服务自身不写订单库,组装 `PreOrderSaveDTO` 后经 `PreOrderApiClient` Feign 远程交由 rating-app 落库并返回 `preOrderNo`。
+
+#### 3. **数仓规则同步与批次隔离**
+- **单事务全量替换**: `@Transactional` 内完成「防回灌校验(新批次号必须大于生效批次) → cardId 去重 → 删本批次残留+批量插 → 价格历史增量 UPSERT → 切生效批次指针 → 清理更早批次(保留新批次+原生效批次供回滚)」。
+- **空批次保护**: 拒绝空 cards 批次,避免全表清空导致推荐全走兜底。
+- **读写隔离**: 所有查询以 `ActiveBatchManager.selectActiveBatchNo()` 的生效批次号为隔离维度,切指针即原子生效。
+- **内部鉴权**: 同步接口用 `X-Sync-Token` 头做 Token 校验,防外部乱调写脏数据。
+
+#### 4. **AI 业务助手(Agent 工具调用)**
+- **SSE 流式**: `AiChatController` 用 `SseEmitter` + 专用线程池 `aiChatExecutor` 打字机式回写。
+- **Agent 循环**: `AgentLoopExecutor` 驱动「模型输出 → 工具调用(tool_use) → 工具结果(tool_result) → 再问模型」的多轮循环,模型侧为 `ClaudeChatProvider`(anthropic)。
+- **工具与身份透传**: `ToolRegistry` 注册工具(如 `OrderLogisticsQueryTool`),工具经 Feign 调 rating-app 时透传 `X-USER-BASE64` 原始用户头做身份隔离。
+- **上下文管理**: `SessionContextStore` 将精简后的多轮上下文(剔除工具中间态)存入 Redis,带 TTL。
+
+#### 5. **外部依赖与横切能力**
+- **Feign 外部服务**: `rating-app-preorder`(预订单落库)、`rating-app-order`(订单/物流工具)、`order-service`(时效字典)、`pay-service`(支付),统一经 `TraceIdFeignInterceptor` 透传链路 ID。
+- **Redis**: 承载 AI 会话上下文与缓存(`GenericJackson2JsonRedisSerializer`)。
+- **Redisson / Shiro**: `RedissonLockUtil` 提供分布式锁模板;Shiro 负责认证与在线会话管理。