AI-X 抢购控制逻辑 · 后端规格 v3.3 (净值贡献校准曲线 · 最终版)
目标: 10 万付费用户盘。D1-5 预热稀缺, D6 起放量, D12 起全面放开 (供给/单人上限/概率全部取消)。 机制四件, 全部纯后端, 前端 (build aix-v18) 零改动: ① 概率准入 ② 伪装限购(429 火爆) ③ 保底(场次维度, 仅保第一份) ④ 幸运场 保底规则 (v3.2 修正): 失败按"场次"计数, 与点击次数无关 — 一个场次内参与且未中 = 记 1 次, 在 pityN(默认 8) 个不同场次失败后, 下次点击必中。仅 total 持有=0 时计数/生效 (防大户套利); 放行仍受库存约束, 未兑现跨场次/跨日保留直至兑现 ("我有保底, 明天稳中"回访钩子)。 全勤蹲点 (5 场/日) 最迟第 2 天必得第一份。 429 = 火爆退避重试, 409 = 本场结束切下一场, X-Request-Id 幂等 — 前端已按此实现。
1. 15 天参数表 (一个 JSON, 热更新)
| day | supply/场 (默认) | 调参区间 | 日总量 | cap/人/日 | qtymax | baseP | 窗口默认* | 幸运场数 |
|---|---|---|---|---|---|---|---|---|
| 1 | 500 | — | 2500 | 10 | 5 | 0.10 | 3min | 0 |
| 2 | 600 | — | 3000 | 10 | 5 | 0.10 | 3min | 0 |
| 3 | 800 | — | 4000 | 15 | 5 | 0.12 | 4min | 0 |
| 4 | 1000 | — | 5000 | 15 | 5 | 0.12 | 4min | 0 |
| 5 | 1500 | — | 7500 | 20 | 5 | 0.15 | 5min | 0 |
| 6 | 6500 | 6000-7000 | 32500 | 20 | 5 | 0.20 | 6min | 1 |
| 7 | 8500 | 8000-9000 | 42500 | 30 | 5 | 0.25 | 6min | 1 |
| 8 | 10500 | 10000-11000 | 52500 | 30 | 5 | 0.30 | 7min | 1 |
| 9 | 12500 | 12000-13000 | 62500 | 50 | 5 | 0.35 | 7min | 1 |
| 10 | 15500 | 15000-16000 | 77500 | 50 | 10 | 0.45 | 8min | 2 |
| 11 | 21000 | 20000-22000 | 105000 | 80 | 10 | 0.55 | 9min | 2 |
| 12+ | 30000 | 25000-35000+ | 等效敞开 | 不限 | 20 | 跳过概率 | 后台设定 | — |
曲线依据: 净值贡献回归分析 (运营侧) — D1 贡献为负故压至最少种子激活量, D6 起按贡献斜率上抬; "调参区间"即运营的合法调整带, 区间内改数不需重新评审。 D12+ 名义桶 30000/场, 需求逼近再上调或直接设 999999 (等效不限)。
*窗口时长后台完全可控: windowSec 按天 (可细至按场) 热更新; 场次开/关由 /state 的 phase 下发, 前端以服务端 phase 为准 (代码内 170s 仅本地演示兜底), 运营实时调窗口客户端零发版跟随。
节奏认知 (10 万用户盘): D1-5 供给 22,000 份 (更紧的种子期) + 高上限 = 大户吃深度, 普通人靠场次保底得第一份; D6 起 4 倍跳变 (1500→6500/场) — D5 晚间"明日大放量"公告必须与 Meta 再营销素材同日上线, 让需求与供给同步跳, 否则 D6 首日 32,500 份明显抢不完会提前露底。 稀缺感 D6 后由窗口时限维持 (窗口可调 = 运营手里的稀缺旋钮)。 财务口径: D1-5 固定 22,000 份 (110 万硬币); D6-11 中值口径若全量售出 ≈373,000 份 / 1,865 万硬币; D12 起等效敞开随需求走 — 兑付曲线 (日 1% × 30 天) 随销量滚动核算。
配置示例 (aix:cfg, 热更新):
{ "day": 3, "supply": 1000, "cap": 15, "qtymax": 5,
"baseP": 0.12, "windowSec": 240, "luckyN": 0, "pityN": 8 }
pityN 默认 8 (可调 5-10), 单位是"场次"; windowSec 运营可随时热更 (含活动中临时调整)。
2. 判定管线 (POST /api/aix/grab, 共 6 步)
① 网关限流 / bot 评分不过 → 429 (bot 影子限流: 永远火爆, 不封禁)
② 场次不在窗口内 → 409
③ today_cnt(uid) >= cap 或 qty > qtymax → 429 # 伪装限购
④ 保底 (场次维度, 仅第一份): total_cnt(uid)==0 且 fails(uid)>=pityN → 直接放行 (跳过⑤)
放行仍受 ⑥ 库存约束; 未兑现则保底状态跨场次/跨日保留, 直至兑现
⑤ P = baseP × (幸运场 ? 2 : 1); rand() >= P → 429;
失败计数按场次去重: total_cnt==0 且 lastfailsess != 当前场次 → fails+1, lastfailsess=当前场次
(同一场次内点击 N 次只记 1 次失败; 已持有者不计数)
⑥ Lua 原子: 扣本段投放余量 → 成功 200{grabToken}, today_cnt+1, fails=0
余量不足 → 409
D16+ : 跳过 ③④⑤, 只走 ①②⑥ (余量设 999999)。
3. 三段式投放 (每场 3 次定时 INCRBY, 无滴灌)
开场释放 50% · T+40% 窗口时释放 30% · T+70% 窗口时释放 20%。 效果: 迟到 2-3 分钟仍可能中签, 窗口体感被拉满; 售罄 = 桶真实清空, 不虚报。 每场必须在窗口内清空 (售罄仪式感保到 D15 最后一场) — 偏差由 baseP 次日微调。
4. Redis 键 (共 6 个)
aix:{date}:{uid}:cnt 当日已中数 EX 86400
aix:{uid}:fails 保底失败场次数 (仅 total=0 时累计) 首份中签 DEL
aix:{uid}:lastfailsess 最近记失败的场次 id (场次去重) 首份中签 DEL
aix:{uid}:total 历史累计持有数 (保底判定用) 永久
aix:{date}:{sess}:bucket 当段投放余量 三段定时 INCRBY
aix:{date}:lucky 当日幸运场 set 每日 00:05 随机抽, 不公布 EX 86400
aix:cfg 参数 JSON 热更新
aix:req:{requestId} 幂等去重 EX 600
⑥ 的扣量 + 记账 + 清保底在同一 Lua 脚本内完成, 防超卖/超限。
5. 运营 SOP (三条)
- 每日公告一条 (Saluran SHORTPRO): "今日每场投放 {supply} 份 · 明日继续加量"。 铁律: 只报明日, 永不报曲线全貌。预告节点: D5 "明日大放量" · D11 "明起全面开放, 不限量不限购"。
- 波次推送: D1 只推频道订阅+高活跃 (~30%), D3 推 60%, D6 全量 — 用现有推送能力, 无新功能。
- D10-15 Meta 投放同步加码 ("补货了"再营销素材), 需求跟着供给爬。
6. 仪表盘 (4 个指标)
- 首份覆盖率 (持有≥1 的参与用户占比): 高上限模式下 D5 目标 ≥45% (保底驱动), D8 ≥85%
- 保底触发占比 (首份中签中经保底的比例): >40% → baseP 偏低; <10% → 偏高
- 每场售罄用时 vs 窗口: 偏差 >±30% → 次日调 baseP
- 抢购前 30 分钟充值笔数 (蹲点充值转化)
7. 本版明确不做 (防止过度设计)
碎片/必得券/兑换池 · 用户分层加成 (新用户/赢家惩罚/未中补偿) · 多级保底阶梯与连续天数保底 · 连续滴灌投放 · 预约报名制。 "蹲点必有回报"的承诺由 §2-④ 单一保底 (fails≥10 必中) 完整兑现, 不需要以上任何一项。
8. 风控三句
真实分批投放不虚报售罄 · 保底确保坚持者必得 · 规则页披露"每日投放量与限购额度随活动阶段动态调整"。