eeecb5faf0
## 背景 / 问题 线上 record 4667:用户在比价等候期看满一条低 eCPM(¥0.43 CPM)的信息流广告(≥10s), 但单份金币按公式 `0.43/1000 × 0.1(档位因子) × 1.0(LT因子) × 10000 = 0.43`,四舍五入成 **0**。 在 `grant_feed_reward` 里 `unit_cap=0` → `coin<=0` → 记 `too_short` 零发。 结果:**用户看满了广告却什么都没拿到**,还被标成"时长不足"。 ## 改动 `app/core/rewards.py` 的 `calculate_ad_reward_coin`(发奖与后台审计对账的**唯一口径**): - 有真实正 eCPM 时,单份金币 floor 到 1(`max(0, …)` → `max(1, …)`)。 - eCPM 缺失 / 为 0 / 非法(没有真实广告价值)时提前 `return 0` —— 不凭空铸币、不破坏 `ecpm_missing` 语义。 关键设计 if ecpm_yuan <= 0: return 0 是防铸币防线:没它的话 reward_video 路径 ecpm="0" 会被 floor 成 1。 不影响防刷:上限仍由 AD_ECPM_MAX_FEN(¥500 CPM)钳顶;LT 因子最低 1.0、从不归零,限流靠每日 500 次上限。 正常量级 eCPM 本就 ≥1,下限不改变其取值(纯回归保护)。 --------- Co-authored-by: guke <guke@autohome.com.cn> Reviewed-on: #205