Files
youzan-datahub/docs/餐饮零售数据中台/implementation_plan.md

147 lines
7.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 搭建 Spring Boot 有赞数据中台服务
基于已完成的设计文档和数据库 DDL`AIMachineSystem/server/` 下搭建 Spring Boot 服务覆盖数据同步、洞察计算、API 接口三层。
## 全局蓝图5 Phase
| Phase | 内容 | 层 | 定时 |
|---|---|---|---|
| **Phase 1** | 订单同步 (`trades.sold.get``dwd_trade_order_detail`) | 同步层 | 每日 02:00 |
| **Phase 2** | 商品同步 + 客户同步 | 同步层 | 每日 02:30 |
| **Phase 3** | 库存流水 + 优惠券 + 退款同步 | 同步层 | 每日 03:00 |
| **Phase 4** | RFM 计算、动销排名、购物篮分析、客群分层 | 洞察层 | 每日 04:00 |
| **Phase 5** | REST API仪表盘接口、导出接口 | 接口层 | 实时 |
## 技术选型确认
- **Java 17** / Spring Boot 3.2.x
- **MyBatis-Plus 3.5.x** (持久层)
- **Spring @Scheduled** (定时任务)
- **RestTemplate** (HTTP 调用有赞 API)
- **有赞应用类型:自用型**`grant_type=silent`,直接用 `client_id + client_secret + kdt_id` 获取 Token
## 项目目录结构
```
server/
├── pom.xml
└── src/main/
├── java/com/chuyishidai/datahub/
│ ├── DataHubApplication.java
│ ├── config/
│ │ └── YouzanConfig.java # 有赞配置 + RestTemplate Bean
│ ├── entity/ # MyBatis-Plus Entity对齐 DDL
│ │ ├── TradeOrderDetail.java
│ │ ├── TradeRefundDetail.java
│ │ ├── ItemSku.java
│ │ ├── CustomerInfo.java
│ │ ├── OfflineStore.java
│ │ ├── InventoryFlow.java
│ │ └── CouponFlow.java
│ ├── mapper/ # MyBatis-Plus Mapper
│ ├── service/
│ │ ├── youzan/ # 有赞 API 基础设施
│ │ │ ├── YouzanTokenService.java # Token 获取与缓存
│ │ │ └── YouzanApiClient.java # API 调用封装
│ │ ├── sync/ # Phase 1-3: 数据同步
│ │ │ ├── TradeSyncService.java
│ │ │ ├── ItemSyncService.java
│ │ │ ├── CustomerSyncService.java
│ │ │ ├── InventorySyncService.java
│ │ │ └── CouponSyncService.java
│ │ └── insight/ # Phase 4: 洞察计算
│ │ ├── ProductInsightService.java
│ │ ├── CustomerInsightService.java
│ │ └── InventoryInsightService.java
│ ├── controller/ # Phase 5: REST API
│ │ ├── ProductController.java
│ │ ├── CustomerController.java
│ │ └── DashboardController.java
│ └── job/ # 定时任务
│ ├── TradeSyncJob.java
│ └── InsightComputeJob.java
└── resources/
└── application.yml
```
## 当前实施范围Phase 1订单同步
### [NEW] pom.xml
Spring Boot 3.2 + MyBatis-Plus + MySQL + Lombok + Jackson
### [NEW] application.yml
数据源、有赞 API 配置、cron 表达式
### [NEW] YouzanTokenService.java
自用型 Token`POST https://open.youzanyun.com/auth/token`body: `client_id + client_secret + grant_type=silent + kdt_id`。缓存至 80% TTL 自动刷新。
### [NEW] YouzanApiClient.java
通用调用:`GET https://open.youzanyun.com/api/{apiName}/{version}?access_token=xxx`,带重试(最多 3 次)。
### [NEW] TradeOrderDetail.java + Mapper
MyBatis-Plus Entity 完全对齐 DDL 的 `dwd_trade_order_detail`
### [NEW] TradeSyncService.java
1.`update_time` 窗口调用 `youzan.trades.sold.get/4.0.4` 分页拉取
2. 展开 `full_order_info_list[].orders[]` 到 SKU 粒度
3. `saveOrUpdateBatch`(基于 `oid` 唯一键UPSERT
### [NEW] TradeSyncJob.java
`@Scheduled(cron = "0 0 2 * * ?")` 每日凌晨 2 点触发,拉取前一天增量。
## 当前实施范围Phase 4商品洞察与会员洞察
### 数据模型设计 (ADM 层) - `sql/phase4_ddl.sql`
1. **`adm_customer_rfm` (客户 RFM 洞察表)**:
- 计算逻辑:基于过去 90 天订单流水,聚合 R最近消费、F消费频次、M消费金额
- 包含 RFM 评分与系统自动划分的客群层级(如重要价值客户、沉睡客户)。
2. **`adm_item_sales_trend` (商品销售趋势表)**:
- 计算逻辑:按天聚合 `dwd_trade_order_detail`,统计各个 SKU 的单量、销量、销售额。用于生成智能订货预测。
3. **`adm_item_basket` (关联销售分析表)**:
- 计算逻辑:采用简化版 Apriori 算法思想,统计同一订单 (tid) 内商品对 (Item A, Item B) 的同现频率与置信度。
4. **`adm_item_repurchase` (商品复购分析表)**:
- 计算逻辑:统计某 SKU 购买过后的用户,在接下来 30 天内再次购买的比例。
### 业务逻辑层设计 (Service)
1. **`CustomerInsightService`**:
- `computeRfm()`: 执行 SQL 统计与评分,生成/更新会员 RFM 白皮书。
- `computeUserTags()`: 针对购买行为(如工作日午餐、高客单价)给用户打标签。
2. **`ProductInsightService`**:
- `computeDailySalesTrend()`: 日终归集单日销售统计。
- `computeBasketRules()`: 统计过去 X 天的热门搭配。
- `computeRepurchaseRates()`: 更新商品的 30 天复购率指标。
3. **`InventoryInsightService`**:
- `computeStockAdvice()`: 基于库存流水和流速,生成次日拿货/备货单。
### 定时任务层设计 (Job)
1. **`InsightComputeJob`**:
- `@Scheduled(cron = "0 0 4 * * ?")` 每日凌晨 4:00 集中触发洞察层计算(由于数据全量计算,放置在凌晨数据同步完成之后)。
## 当前实施范围Phase 5可视化接口层
### API 设计方案
1. **`DashboardController` (核心监控板)**:
- `GET /api/dashboard/overview`: 今日总体指标 (今日实付金额, 今日退款金额, 订单数)
- `GET /api/dashboard/trend`: 近 14 天整体销售趋势变化折线图数据
2. **`ProductController` (商品洞察与预测)**:
- `GET /api/product/advice`: 智能订货单查询 (基于过去 14 天 `adm_item_sales_trend` 动态计算各单品日均流速,输出建议备货量)
- `GET /api/product/basket`: 购物篮高频组合列表 (查询 `adm_item_basket` 置信度排行)
- `GET /api/product/repurchase`: 单品复购率与波士顿矩阵打标查询 (查询 `adm_item_repurchase`)
3. **`CustomerController` (会员金字塔与人群)**:
- `GET /api/customer/rfm/distribution`: RFM 金字塔分布 (各层级人数及金额贡献占比查询)
- `GET /api/customer/tags`: 各类特征人群包人数统计 (查询 `adm_customer_tags`)
### 业务与数据聚合逻辑
由于数据在 Phase 4 已通过定时任务计算沉淀到了 `adm_` 系列汇总表中Phase 5 仅提供轻量级的 `SQL GROUP BY``SELECT` 汇总查询,通过 `JdbcTemplate``MyBatis-Plus` 向前端输出标准 JSON。
## Verification Plan
### Automated Tests
- `cd server && mvn compile` 编译通过验证
### Manual Verification
1. 重启 Spring Boot 服务。
2. 使用 Postman 或浏览器直接测试 `/api/dashboard/overview`, `/api/product/advice` 等接口,验证返回的 JSON 结构。