feat: 信息流广告改"所见即所得"发奖——直接发客户端小球显示金币

原规则"看满 10 秒(1 份时长)才发整份、不逐份累加",客户端小球显示与
实发口径可能对不上。用户 2026-06-27 拍板「显示多少给多少」。

- schemas/ad.py:FeedRewardIn 新增 display_coin(客户端小球本条显示金币,缺省 0)。
- repositories/ad_feed_reward.py:grant_feed_reward 优先直接发 display_coin,
  钳到本条"1 份满额"(unit_cap = calculate_ad_reward_coin(ecpm, existing_ads+1))
  防刷——合法显示(实际因子2 × 进度 p ≤ 1 份)不被砍,只挡伪造天价值。
- 因子2(LT)改由客户端按 granted 行 COUNT 计入 display_coin,后端只记 granted
  行让计数自增,不再服务端重算份值。
- 旧客户端不传 display_coin → 退回"看满 1 份发整份"兼容,不断币。
- display_coin 为 0 且不足一份 → too_short 不发(不计 LT / 当日上限);
  closed_early / capped 留痕不变。
- api/v1/ad.py:feed_reward 端点透传 display_coin。
This commit is contained in:
2026-06-27 23:12:03 +08:00
parent 3d67749101
commit 2e38d4f340
3 changed files with 34 additions and 17 deletions
+1
View File
@@ -411,6 +411,7 @@ def feed_reward(payload: FeedRewardIn, user: CurrentUser, db: DbSession) -> Feed
app_env=payload.app_env,
our_code_id=payload.our_code_id,
aborted=payload.aborted,
display_coin=payload.display_coin,
)
logger.info(
"feed ad reward user_id=%d event=%s status=%s units=%d coin=%d",