11 KiB
11 KiB
name, overview, todos, isProject
| name | overview | todos | isProject | ||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 每日返水活动化改造 | 将每日返水从独立档位表方案,改为与首充定格(Free Credits, type=11)一致的活动配置模式:新增活动类型 12、档位写入 recharge_gift_config.ext_config,保留 daily_rebate_record 做用户日统计与领取,综合统计页独立不变。 |
|
false |
每日返水 — 活动化改造方案(对齐首充定格)
背景与纠偏
你已指出:这是活动,应新增活动类型,返水档位在「活动配置」里维护,参考首充定格(Free Credits)。
现有代码库中首充定格模式:
| 层级 | 实现 |
|---|---|
| 配置表 | s_recharge_gift_config(后台称「充值活动配置」) |
| 活动类型 | TYPE_FREE_CREDITS = 11 |
| 业务参数 | ext_config JSON(千分位 _qf 字段) |
| 后台入口 | 活动管理 → 充值活动配置 + edit.vue type==11 表单项 |
| 校验 | ActivityValidate::checkFreeCreditsExt + ActivityController::save/update |
| 运行时查询 | RechargeGiftConfigModel::getFreeCreditsActiveInfo |
| 用户状态 | 独立表 free_credits_player / free_credits_package |
先前中断实现的问题:已创建 daily_rebate_tier_config 独立表及 DailyRebateTierConfig* 后台 — 与产品约定不符,应废弃并改为 ext_config。
可保留部分(逻辑正确,仅需改配置来源):
DailyRebateCalcService— 累进分段计算daily_rebate_record— 用户日返水记录(需加activity_id)DailyRebateSettle/DailyRebateExpire定时任务DailyRebateControllerC 端 info/claimDailyRebateStats*— 综合统计/每日返水统计(独立菜单,同 Free Credits 统计)
flowchart TB
subgraph admin [活动管理 slot_admin]
ActivityUI["activity/edit.vue type=12"]
ActivityAPI["ActivityController + ActivityService"]
end
subgraph config [s_common]
RGC["recharge_gift_config ext_config.tiers"]
DRR["daily_rebate_record"]
end
subgraph runtime [slot_console]
Settle["dailyRebateSettle"]
API["DailyRebateService info/claim"]
end
ActivityUI --> ActivityAPI --> RGC
Settle --> RGC
Settle --> DRR
API --> RGC
API --> DRR
1. 新增活动类型 12 — 每日返水
1.1 常量与模型
RechargeGiftConfigModel增加:const TYPE_DAILY_REBATE = 12; // 每日返水- 新增方法
getDailyRebateActiveInfo(string $source),逻辑复制getFreeCreditsActiveInfo:status=1、type=12、时间窗、source优先于all。 slot_lib/Consts.php增加ACTIVITY_TYPE_DAILY_REBATE = 12(与现有 1–9 并列,便于订单/日志引用)。- 字典
activity_type增加一条(SQL 或后台字典):value=12, label=每日返水(与 type=11「首充定格/Free Credits」同级)。
1.2 ext_config 结构(档位配置)
{
"tiers": [
{ "sort": 1, "min_bet_qf": 0, "max_bet_qf": 1000000, "rate_percent": 3 },
{ "sort": 2, "min_bet_qf": 1000001, "max_bet_qf": 3000000, "rate_percent": 2 },
{ "sort": 3, "min_bet_qf": 3000001, "max_bet_qf": 5000000, "rate_percent": 1 },
{ "sort": 4, "min_bet_qf": 5000001, "max_bet_qf": null, "rate_percent": 0.5 }
]
}
- 金额与全站一致:存储千分位(厘);后台表单用美元展示,提交时
×1000(与 type=11 的toQf一致)。 - 默认种子:可在活动保存时由前端预填 4 档,或提供 migration 插入一条
type=12的 default 活动(source=all)。
1.3 校验
在 ActivityValidate 新增 checkDailyRebateExt(array $extConfig):
tiers非空数组,每档含sort/min_bet_qf/rate_percent;非最后一档max_bet_qf必填。- 复用
DailyRebateCalcService::validateTiersContinuous(入参转为min_bet/max_bet厘)。
在 ActivityController 的 save / update(updateData 时)对 type === 12 调用该校验(与 type=11 并列)。
2. 管理后台 — 活动配置 UI(核心)
参考 type=11,在 activity/edit.vue 增加 formData.type == 12 区块:
| 表单项 | 说明 |
|---|---|
| 返水档位表 | 可增删行:排序、下限($)、上限($,最后一档可空)、比例(%) |
| 规则说明 | 复用活动主表 help 字段(与 Free Credits 一致) |
| 展示时间/生效时间 | 复用现有 show_* / start_time / end_time |
交互约束(与 type=11 相同):
onlyGift计算属性加入12→ 不展示「赠送配置 goods」区块。submit时:type===12→data.goods=[],ext_config.tiers做toQf转换。setFormData时:tiers从_qf还原为美元展示。
activity/index.vue 列表 ext_config 列:type=12 时展示各档比例摘要(类似 type=11 展示门槛)。
删除(不再单独维护档位):
DailyRebateTierConfigController及 Logic/Validate/ModeldailyRebateTierConfig.js与对应 vue(若已创建)menu-daily-rebate.sql中「每日返水档位」菜单项(3082)- 表
daily_rebate_tier_config(不建或迁移后 DROP)
保留菜单:仅「综合统计 → 每日返水统计」(3084),挂在活动管理同级或统计分组下。
3. 运行时改造(slot_console)
3.1 配置读取
- 删除对
DailyRebateTierConfigModel的依赖。 - 通过
RechargeGiftConfigModel::getDailyRebateActiveInfo($source)取活动;无生效活动 → C 端unlocked=false或整活动不可用(与未开 Free Credits 一致)。 - 从
ext_config['tiers']解析为DailyRebateCalcService入参(min_bet/max_bet/rate_percent)。 info()返回的tiers来自当前活动配置;tier_snapshot结算时写入完整 tiers JSON。
3.2 用户记录表
- 增加
activity_id bigint(recharge_gift_config.id),结算/待定时写入。 - 删除
daily_rebate_tier_config建表与种子 SQL。
3.3 结算与领取
DailyRebateSettle:按渠道解析活动配置后再算返利;未充值用户仍跳过。- 领取:继续
TRANSACTION_TYPE_DAILY_REBATE = 65(已在Consts.php规划/部分落地)。
3.4 C 端 API(不变路径)
GET /api/daily-rebate/infoPOST /api/daily-rebate/claim
需校验:当前用户渠道存在生效的 type=12 活动,否则返回活动未开启。
4. 综合统计页(保持独立)
与 Free Credits 统计 相同定位:
- 菜单:综合统计 / 每日返水统计(非活动配置页)
- 实现:沿用已规划的
DailyRebateStatsLogic+dailyRebateStats/index.vue(若 vue 未写完则补全) - 数据源:
daily_rebate_record;筛选/汇总规则不变
5. 与首充定格的差异对照
| 项 | Free Credits (11) | 每日返水 (12) |
|---|---|---|
| ext_config | 门槛、分档金额、Banner | tiers 累进档位 |
| 用户状态表 | free_credits_player/package | daily_rebate_record |
| 统计页 | Free Credits 统计 | 每日返水统计 |
| 充值门槛 | 首充定格业务 | 历史充值过即可(wallet r>0) |
| 计费基础 | 定格池 | 当日 user_profit_daily.bet |
6. 实施步骤(建议顺序)
- 活动类型与 ext_config 契约:Model 常量 +
getDailyRebateActiveInfo+ ActivityValidate + ActivityController + 字典 SQL。 - 后台 activity/edit.vue + index.vue:type=12 档位表 UI 与 qf 换算。
- 重构 DailyRebateService:读活动 ext_config;record 加
activity_id。 - 清理:移除 tier 独立表/Controller/菜单;更新
daily_rebate.sql。 - 补全:统计 vue、PWA 流水类型 65、单元测试仍用 tiers 数组驱动 CalcService。
- 验收:后台新建 type=12 活动 → 用户下注 → 日切结算 → 领取 → 统计页数字一致。
7. 验收要点
- 仅在「充值活动配置」可创建/编辑 type=12,档位保存后
ext_config.tiers正确落库。 - 同渠道多条 type=12 时行为与 type=11 一致(优先具体 source)。
- 改档位仅影响新结算日(
tier_snapshot审计旧记录)。 - 不再出现「每日返水档位」独立菜单。
- $2000 下注 → 次日返水 $50,与累进公式一致。
Definition of Done(硬规则对齐)
grep -r DailyRebateService ~/Documents/project/www/slot --include='*.php'→ 无命中(排除 vendor)DailyRebateController对齐FreeCreditsController(BaseController+ Logic + Validate)- 已删除 orphan:
slot_admin_vue下dailyRebateTierConfig/*、api/game/dailyRebateTierConfig.js ~/.cursor/hooks/verify-slot-backend.sh输出PASS