项目:RatingRecommend | 日期:2026-06-25 前置:本文是
2026-06-24-rating-efficiency-recommend-design.md的扩展 状态:已评审,待放行写库后实施
| # | 决策 | 说明 |
|---|---|---|
| E1 | POP/价值/趋势对推荐仅展示透传 | recommend_efficiency 仍由数仓直接给,推荐降级匹配逻辑不变 |
| E2 | 卡片唯一键 = 数仓 card_id |
去重根基 |
| E3 | POP report 按三机构各一套(PSA/BGS/Nexphostis) | 用明细行存表 |
| E4 | 数仓主动推(HTTP)+ T+1 每日批量 | 本服务被动接收 |
| E5 | 规则/POP/当前价:全量批次替换(batch_no + 指针切换,查询零中断) | 当前快照 |
| E6 | 价格历史:增量追加(每日追加当天价,永久累积,不被全量覆盖) | 趋势数据源 |
| E7 | 数据量小(万级),单次全量推送 + 单事务切换 |
t_rating_recommend_rule(规则主表,加字段)新增:card_id、card_no、current_value、value_change_pct、value_min、value_max、batch_no
唯一约束:(batch_no, card_id);查询索引:(batch_no, series, card_set, year)
t_rating_card_pop(POP 明细,新表)id, card_id, agency, grade_all, grade_10, grade_9, grade_8, grade_7, batch_no
索引:(batch_no, card_id)
t_rating_card_value_history(价格历史,新表,增量累积)id, card_id, price, record_date, create_time
唯一约束:(card_id, record_date)(同卡同日只一条,幂等)
t_rating_recommend_active_batch(生效批次指针,新表,单行)id, active_batch_no, update_time
POST /api/recommend/rule/sync(内部鉴权:Token/签名/IP 白名单)
请求体:
{
"batchNo": "2026062501",
"cards": [
{ "cardId":"...", "cardNo":"066/080", "player":"AIPOM", "year":"2026",
"series":"pokemon.M2.JNP", "cardSet":"BASE", "recommendEfficiency":2,
"currentValue":15, "valueChangePct":7.05, "valueMin":10, "valueMax":45,
"recordDate":"2026-06-25", "todayPrice":15,
"pops":[ {"agency":"PSA","all":660,"g10":25,"g9":152,"g8":220,"g7":458}, ... ] }
]
}
处理(单事务):
(card_id, record_date) UPSERT 当天价(同日幂等)GET /api/recommend/card/detail?cardId={cardId}&period={7d|30d|90d|all}(period 默认 30d)
响应 data = CardDetailVO:
{
"cardId":"...", "cardNo":"066/080", "name":"AIPOM", "year":"2026",
"series":"pokemon.M2.JNP", "cardSet":"BASE", "imageUrl":"...",
"pops":[ {"agency":"PSA","all":660,"g10":25,"g9":152,"g8":220,"g7":458}, ... ],
"value":{"current":15,"changePct":7.05,"min":10,"max":45},
"trend":[ {"date":"2026-06-01","price":12.0}, {"date":"2026-06-25","price":15.0} ]
}
RecommendCardVO 增字段:cardId、cardNo、currentValue、valueChangePct、valueMin、valueMax、pops[]RecommendServiceImpl:三层降级命中规则后,带出 card_id/价值,并按 card_id 补查 POP 明细放入 VObatch_no = 当前生效批次 过滤(读指针表,可缓存 30s)card_id;同批次按 card_id 去重;规则/POP 跨批次全量替换 → 无脏历史(card_id, record_date) 幂等累积,永久保留| 写操作 | 位置 |
|---|---|
| 4 张表 DDL(规则表加列 + POP/历史/指针 新表) | 由大侠手动执行 |
| 规则表/POP 表 DELETE + INSERT(全量替换) | 同步 Service/Mapper |
| 价格历史表 UPSERT(增量) | 同步 Service/Mapper |
| 指针表 UPDATE(切批次) | 同步 Service/Mapper |
| 旧批次异步 DELETE | 同步 Service/Mapper |
推荐查询、趋势查询、POP 查询均为只读 SELECT,不在红线内。
数仓侧需对齐:cardId 稳定性、batchNo 生成规则、pops 三机构口径、每日推送的 recordDate/todayPrice 字段、鉴权方式。