5.3 KiB
5.3 KiB
name, overview, todos, isProject
| name | overview | todos | isProject | |||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 充值后下注返水 | 在下注发生时用现有 `user:recharged` 集合判断是否已充值,仅充值用户额外累计 `rebate_bet`;每日返水改用 `rebate_bet`,不影响 VIP 输钱返利等仍使用全量 `bet`。 |
|
false |
充值后的下注才计入每日返水
背景与缺口
当前实现(DailyRebateLogic)仅在结算/同步时用 userHasDeposit() 过滤,下注额来自共享 Redis 日哈希(slot_pwa UserProfitService::incBet),全天 bet 无差别累计。
因此「同一天先下注、后首充」会把首充前下注也算进返水——与产品「充值后的下注才算」不符。
产品已确认口径
- 开启计时:普通充值 + 签到购(与现网
RechargedUidSetService::add一致) - 历史:仅上线日起按新规则;不回溯历史结算日
约束:同一 Redis 日盈利哈希还被 LoseReturnDeposit(VIP 输钱返利)使用,不能改 bet 语义或阻止未充值用户累计 bet。
flowchart LR
subgraph pwa [slot_pwa]
Bet[WalletService bet]
IncBet[UserProfitService.incBet]
Bet --> IncBet
IncBet --> betField["bet 全量"]
IncBet --> CheckSet["SISMEMBER user:recharged"]
CheckSet --> rebateBetField["充值用户才累加 rebate_bet"]
end
subgraph wallet [slot_wallet]
Recharge[recharge / rechargeSign]
Recharge --> SetUid[SADD user:recharged]
end
subgraph console [slot_console]
Settle[dailyRebateSettle]
Settle --> UseRebateBet["读 rebate_bet 算档"]
end
rebateBetField --> Settle
SetUid --> CheckSet
方案:新增 rebate_bet,下注时用集合判断
1. slot_pwa — 下注时累计 rebate_bet
- 序列化结构:
bet、win、rebate_bet(默认 0,反序列化兼容旧数据) - 新建或复用一个轻量
RechargedUidSetService(读 share RedisSISMEMBER user:recharged) incBet逻辑:bet仍始终+= fee(供输钱返利等)- 若
SISMEMBER user:recharged uid = 1,则rebate_bet += fee - 否则不累加
rebate_bet
性能:每次下注 1 次 SISMEMBER;如下注高频,可对「已充值」状态做短 TTL 本地/Redis 缓存(可选,非必须)。Redis 异常时按未充值处理,宁可少算不可多算。
2. slot_console — 返水只读 rebate_bet
| 文件 | 改动 |
|---|---|
UserProfitEntity |
增加 public int $rebate_bet = 0 |
DailyRebateLogic |
settleOneUserFromProfitHash、readTodayBetFromRedis、syncTodayPending 使用 rebate_bet 作为有效下注(无字段或旧日为 0,禁止 fallback 到 bet,避免误发) |
| 结算日志 | samples 中 bet 字段可改为 rebate_bet 或同时打 bet/rebate_bet 便于对账 |
保留现有 userHasDeposit() 校验(双保险:未在集合内仍 skip)。
3. 部署与验收(更新 daily_rebate_deploy.md)
发布顺序:确认 center/wallet 已有 user:recharged 机制并完成回填 → 发布 slot_pwa → 发布 slot_console(slot_pwa 必须早于次日 dailyRebateSettle cron)
冒烟用例
- 未充值用户下注 →
rebate_bet=0→ 结算 skip / 无可领 - 同日:先下注 100 → 再首充 → 再下注 200 → 仅
rebate_bet=200→ 返水按 200 档位 - 已充值老用户(已在
user:recharged集合)→ 上线后下注直接累计rebate_bet - VIP 输钱返利:仍读
bet,行为不变
不改动的部分
user:rechargedSET 语义不变center不新增共享 Redis keywallet充值成功后写集合的逻辑不变- 领取/活动页
userHasDeposit门槛不变 - 不改动
slot_sdk(无跨服务 HTTP) - 不做历史日
rebate_bet回填
风险与说明
| 项 | 说明 |
|---|---|
| 上线前已在 set 的老用户 | 上线后发生的下注会直接累计 rebate_bet,符合“已充值用户后续下注算返水” |
| 首充与下注并发 | 以下注时 SISMEMBER user:recharged 的结果为准;集合写入前的下注不计入,写入后的下注计入 |
| Redis 异常 | pwa 判断集合失败应记 error 且 不累加 rebate_bet(宁可少算不可多算) |