Files
shaguabijia-app-server/docs
guke e8c2ebda13 feat(wallet): 金币记录按 trace_id 聚合比价/领券看广告金币 (#225)
## 背景

「金币变动记录」里看广告金币按**每条广告**统计,一次比价/领券的等候期会连续看多条信息流广告,于是列表刷出一长串「比价奖励 +x」「领券奖励 +x」,淹没其它记录、观感差。

## 改动

把**一次比价 / 一次领券**连续看广告获得的多条金币,按 `trace_id` **聚合成一条**展示(金额取该次会话合计)。

**纯后端**:比价、领券的结算上报都已把本场 `trace_id` 传到 `/feed-reward`(领券自 2026-07-15、客户端 `a98cab8` 起),无需 Android 改动即可生效。

### 具体
- `coin_transaction` 新增 `trace_id` 列 + 索引;`grant_coins` 增 `trace_id` 参数;`grant_feed_reward` 发奖时写入本场 trace_id。
- `GET /api/v1/wallet/coin-transactions` 改为**按 trace_id 分组的游标分页**(CTE 聚合),响应新增 `merged_count`(合并条数,未合并=1)。
- Alembic 迁移:加列 + 索引 + **回填历史**(从 `ad_feed_reward_record` 按 `ref_id == client_event_id` 补 trace_id)。
- 更正 `ad_feed_reward_record.trace_id` 过时注释(领券自 2026-07-15 也带)。
- **只改 App 用户接口**;admin 审计接口(`list_all_coin_transactions`)保持每条一行不动。

## 关键设计

- **分组键**:`biz_type ∈ (feed_ad_reward_comparison, feed_ad_reward_coupon)` 且 `trace_id` 非空 → 按 `trace_id` 合并;其余(激励视频/签到/通用信息流/空 trace 等)每条一行。
- **代表行**取组内 `MAX(id)`(供余额/时间/标题);`amount = SUM`;游标 `rep_id < cursor` 施于**外层**查询——CTE 在用户全量行上分组,**不**按 `id<cursor` 裁剪,避免会话行跨游标时产生「残组」重复(有专门回归测试锁死)。
- 返回 `CoinLedgerRow` dataclass(非 ORM,杜绝把聚合后的 amount 误写回底层流水)。
- SQL 全程 **SQLite/PG 双方言通用**(dev/测试 SQLite,prod PG)。

---------

Co-authored-by: guke <guke@autohome.com.cn>
Reviewed-on: #225
2026-08-07 19:12:58 +08:00
..
2026-07-03 15:00:37 +08:00
2026-07-09 14:24:46 +08:00

文档索引

项目文档结构说明。后续大模型增补/更新文档时,按此分类找到对应目录。


API 接口文档 (api/)

按业务领域分类,每个子目录对应一类接口。

分类目录

目录 分类 URL 前缀 说明
api/auth/ 认证 /api/v1/auth 用户登录(极光一键登录/短信验证码)、Token 刷新(access + refresh)、登出、当前用户信息查询
api/ad/ 广告 /api/v1/ad 穿山甲 S2S 回调验签发奖、激励视频/信息流广告奖励结算、eCPM 上报、发奖状态查询、测试发奖(仅本地)
api/wallet/ 钱包 /api/v1/wallet 账户资产查询(金币/现金余额)、金币与现金流水、兑换规则与执行、绑定/解绑微信、提现申请/状态/记录、免确认收款授权
api/coupon/ 领券 /api/v1/coupon CPS 领券透传(step/session)、引导窗频控(should-show/shown/dismiss/reset)、每日完成状态、累计领券统计
api/compare/ 比价记录 /api/v1/compare 比价记录上报/列表/详情/统计、比价战绩里程碑查询及奖励领取(按成功比价数解锁金币)
api/savings/ 省钱 /api/v1/savings + /api/v1/platform/savings-feed 省钱大作战(battle)、省钱明细/汇总、平台省钱动态 Feed
api/signin/ 签到 /api/v1/signin 每日签到执行、签到加速(看广告多领)、签到状态查询
api/tasks/ 任务 /api/v1/tasks 任务列表查询、任务奖励领取(按 task_key)
api/invite/ 邀请 /api/v1/invite 邀请码/分享链接生成、已邀请列表、邀请绑定(支持 clipboard/manual/fingerprint 三种归因)
api/user/ 用户 /api/v1/user 个人资料编辑(昵称)、头像上传、新手引导状态/完成标记、注销账号
api/device/ 设备 /api/v1/device 设备注册/推送 token 更新、无障碍存活心跳、掉线检测(后置 pull)、告警确认
api/platform/ 平台配置 /api/v1/platform 平台统计数据、Feature Flag 开关、广告配置(穿山甲 ID)、App 版本更新检查(OTA);全部不鉴权
api/intent/ 意图/电商 /api/v1/intent + /api/v1/price + /api/v1/ecom 比价意图识别(Phase 1 单次/多帧/预券)、电商意图识别、比价步进(Phase 2)
api/meituan/ 美团 CPS /api/v1/meituan 美团券列表/信息流/推广链接/销量榜;全部无鉴权
api/other/ 其它 分散 健康检查、CPS 短链重定向(含微信 OAuth)、反馈提交/配置/记录、埋点上报、订单上报、更低价上报、Trace 收尾
api/admin/ 管理后台 /admin/api Admin 独立子应用,二级目录按子资源拆分:auth/(登录)、users/(用户管理/财务操作)、wallet/(流水查询)、withdraws/(提现审核/对账)、feedbacks/(反馈处理)、admins/(管理员管理)、ad/(广告对账/收益);单文件留根:审计日志、数据大盘、跑马灯种子、统计概览
api/internal/ 内部接口 /internal 服务间调用(pricebot→app-server):价格事实回写、店铺映射、启动确认样本、App 版本写入;X-Internal-Secret 鉴权

接口索引入口

完整接口列表(含路径、方法、鉴权方式)见 api/README.md

文档命名规则

单端点文档按 URL 路径命名:{prefix}-{resource}.md(如 wallet-withdraw.mdauth-sms-send.md)。 含子资源的合并文档按族命名(如 device-liveness.md 覆盖 register/heartbeat/liveness/liveness-ack 四个端点)。 文件名唯一确定文档位置:大类目录 + 文件名前缀 → 直接匹配。


数据库文档 (database/)

数据库表结构说明,每表一个文件,database/OVERVIEW.md 为索引入口。


第三方集成 (integrations/)

外部 SDK/API 集成架构与实现说明:integrations/README.md

文件 说明
jiguang.md 极光一键登录(REST 验证 + RSA 解密)
pangle.md 穿山甲广告 S2S 回调
wxpay.md 微信支付 V3(提现/授权)
meituan.md 美团 CPS 网关

开发指南 (guides/)

文件 说明
邀请功能-实现原理与本地测试.md 邀请系统实现细节
CPS发券分发与微信授权.md CPS 发券 + 微信网页授权流程
看广告赚金币上线清单.md 广告功能上线检查清单
待办与技术债.md 待办事项与技术债务

架构与设计 (superpowers/)

需求规格与设计文档,按 YYYY-MM-DD-<topic>-design.md 命名。


后端技术实现 (后端技术实现.md)

后端整体技术架构说明。