# ad_reward_record — 看激励视频发奖记录(S2S 回调) > 模型 `app/models/ad_reward.py` | 关联接口 [ad-pangle-callback](../api/ad-pangle-callback.md) / [ad-reward-status](../api/ad-reward-status.md) | [← 表索引](./README.md) 每条 = 穿山甲一次发奖回调。`trans_id` 唯一做幂等键(穿山甲会重试,同号只发一次)。`reward_date`(北京时间日期串)给"每日上限"计数用,按日期串等值查。 ## 字段 | 列 | 类型 | 约束 / 默认 | 说明 | |---|---|---|---| | `id` | Integer | PK, autoincrement | | | `trans_id` | String(64) | UNIQUE, index, NOT NULL | 穿山甲交易号(幂等键) | | `user_id` | Integer | FK→user.id, index, NOT NULL | 归属用户(回调 media_extra 带回) | | `coin` | Integer | NOT NULL, default 0 | 实发金币(capped 时为 0) | | `status` | String(16) | NOT NULL, default `granted` | `granted`(已发)/ `capped`(当日超限未发) | | `reward_date` | String(10) | index, NOT NULL | 北京时间日期串 `YYYY-MM-DD`,按它统计当日次数 | | `reward_name` | String(64) | nullable | 穿山甲上报奖励名(参考,不作发奖依据) | | `raw` | String(1024) | nullable | 回调原始参数(审计排查) | | `created_at` | DateTime(tz) | server_default now(), index | 时间 | ## 索引与约束 - PK: `id`;UNIQUE + index: `trans_id`;index: `user_id`、`reward_date`、`created_at` ## 关系 - `user_id` → `user.id`(多对一) ## 说明 - 三道闸:验签不过 403 → `trans_id` 唯一幂等(并发 catch IntegrityError)→ 当日次数 ≥ `DAILY_AD_REWARD_LIMIT` 记 `capped` 不发币。 - 发币复用 `grant_coins(biz_type='ad_reward', ref_id=trans_id)`。