155 lines
6.7 KiB
Markdown
155 lines
6.7 KiB
Markdown
---
|
||
name: 移除 RELEASING 状态
|
||
overview: 移除 Free Credits 玩家主状态 `STATUS_RELEASING(7)`,并同步实现「跨档领取 + 解锁不等待上一档 claim」:后续档进度仅由 package 表表达,玩家主状态停留在第一档生命周期(4/5/6)直至全部完成(10)。
|
||
todos:
|
||
- id: remove-releasing-status
|
||
content: FreeCreditsPlayerModel 删除 STATUS_RELEASING;advanceByRecharge 去掉写入 status=7
|
||
status: completed
|
||
- id: cross-claim-logic
|
||
content: claim() 去掉顺序校验;advanceByRecharge 去掉 nextReadyReleasePackage 解锁门槛
|
||
status: completed
|
||
- id: update-docs-comments
|
||
content: 同步 FreeCreditsLogic/Controller PHPDoc 与 install.sql status 注释
|
||
status: completed
|
||
- id: admin-vue-status-map
|
||
content: slot_admin_vue freeCreditsStats 删除 status=7 映射与筛选项
|
||
status: completed
|
||
- id: migrate-legacy-7
|
||
content: 提供/执行 status=7 历史数据 SQL 修正
|
||
status: completed
|
||
- id: add-tests
|
||
content: 补充跨档 claim 与解锁不等待 claim 的单测/集成测
|
||
status: completed
|
||
isProject: false
|
||
---
|
||
|
||
# 移除 STATUS_RELEASING 并支持跨档领取
|
||
|
||
## 结论
|
||
|
||
**是的,应去掉** [`FreeCreditsLogic.php`](slot_console/app/api/logic/FreeCreditsLogic.php) 第 709 行的 `$player->save(['status' => STATUS_RELEASING])`。
|
||
|
||
**是的,后台展示要改**:[`slot_admin_vue`](backend/slot_admin_vue/src/views/game/freeCreditsStats/index.vue) 的 `PLAYER_STATUS_MAP` 需删除 `7: '后续档释放中'`。
|
||
|
||
**`slot_admin` PHP 无需改**:[`FreeCreditsStatsController.php`](backend/slot_admin/app/game/controller/FreeCreditsStatsController.php) 仅透传 `slot_console` innerapi,不做 status 映射。
|
||
|
||
## 背景:为何 status=7 已无意义
|
||
|
||
原设计里,玩家主状态在「第一档生命周期」之后还有一个独立阶段 `releasing(7)`:
|
||
|
||
```mermaid
|
||
stateDiagram-v2
|
||
direction LR
|
||
firstCashReady: 4 第一档可提现
|
||
firstCashProcessing: 5 第一档处理中
|
||
firstCashDone: 6 第一档已提现
|
||
releasing: 7 后续档释放中
|
||
completed: 10 全部完成
|
||
|
||
firstCashReady --> firstCashProcessing
|
||
firstCashProcessing --> firstCashDone
|
||
firstCashDone --> releasing: 解锁后续档时写入7
|
||
releasing --> completed
|
||
```
|
||
|
||
跨档领取后:
|
||
|
||
- **后续档是否可领、已领多少** → 由 [`free_credits_package.status`](slot_console/app/model/common/FreeCreditsPackageModel.php) 表达(后台已有 `progress_done/total`、`claimed_amount_qf`)
|
||
- **玩家主状态** → 只描述「第一档相关阶段」,全部档位完成时由现有 [`refreshPlayerCompletion()`](slot_console/app/api/logic/FreeCreditsLogic.php) 置为 `10`
|
||
|
||
`STATUS_RELEASING` 在全仓库**仅写入、从未被读取**做分支判断,C 端 [`buildStatus()`](slot_console/app/api/logic/FreeCreditsLogic.php) 原样透出 `player.status`,去掉后不影响 package 列表展示。
|
||
|
||
## 代码改动(slot_console)
|
||
|
||
### 1. 删除 RELEASING 常量与写入
|
||
|
||
文件:[`FreeCreditsPlayerModel.php`](slot_console/app/model/common/FreeCreditsPlayerModel.php)
|
||
|
||
- 删除 `const STATUS_RELEASING = 7` 及注释
|
||
|
||
文件:[`FreeCreditsLogic.php`](slot_console/app/api/logic/FreeCreditsLogic.php) `advanceByRecharge()`
|
||
|
||
- 删除循环内 `$player->save(['status' => STATUS_RELEASING])`
|
||
- 解锁 release 档时**不再改玩家主状态**(保持 4/5/6 等既有值)
|
||
|
||
### 2. 跨档领取:去掉顺序限制
|
||
|
||
文件:[`FreeCreditsLogic.php`](slot_console/app/api/logic/FreeCreditsLogic.php)
|
||
|
||
**claim()** — 删除顺序校验块(约 295–298 行):
|
||
|
||
```php
|
||
$nextReady = FreeCreditsPackageModel::nextReadyReleasePackage($player->id);
|
||
if (is_null($nextReady) || intval($nextReady->id) !== intval($package->id)) {
|
||
throw new BusinessException('Please claim credits in order');
|
||
}
|
||
```
|
||
|
||
保留:`package_type=release`、归属 uid、`status=ready`、幂等 biz_id、失败回滚 ready。
|
||
|
||
**advanceByRecharge()** — 去掉「存在 ready 后续档则不再解锁」门槛(约 695 行):
|
||
|
||
```php
|
||
// 改前
|
||
if ($rechargeAmount < $minRecharge || !is_null(FreeCreditsPackageModel::nextReadyReleasePackage($player->id))) {
|
||
return;
|
||
}
|
||
// 改后:仅校验单笔充值下限
|
||
if ($rechargeAmount < $minRecharge) {
|
||
return;
|
||
}
|
||
```
|
||
|
||
`nextReadyReleasePackage()` 方法可保留(暂无其它引用,后续若 C 端需要「推荐下一档」可复用)。
|
||
|
||
### 3. 文档注释同步
|
||
|
||
- [`FreeCreditsLogic::claim()`](slot_console/app/api/logic/FreeCreditsLogic.php) PHPDoc:去掉「须按 package_no 顺序」
|
||
- [`FreeCreditsController::claim()`](slot_console/app/api/controller/FreeCreditsController.php) PHPDoc:去掉「须为当前可领的下一档 / claim in order」
|
||
- [`install.sql`](slot_console/db/install.sql) `free_credits_player.status` 字段 comment:删除 `7后续释放中`
|
||
|
||
### 4. 历史数据修正(建议一次性 SQL)
|
||
|
||
线上若已有 `status=7` 的记录,应按第一档 package 还原为主状态,避免后台筛选项去掉 7 后显示裸数字:
|
||
|
||
```sql
|
||
UPDATE s_common.free_credits_player p
|
||
INNER JOIN s_common.free_credits_package fp
|
||
ON fp.player_id = p.id AND fp.package_no = 1
|
||
SET p.status = CASE fp.status
|
||
WHEN 2 THEN 5 -- 第一档处理中
|
||
WHEN 3 THEN 6 -- 第一档已完成
|
||
WHEN 1 THEN 4 -- 第一档可提现
|
||
ELSE 6
|
||
END
|
||
WHERE p.status = 7;
|
||
```
|
||
|
||
(若首档 package 不存在,默认 `6` 或按业务确认。)
|
||
|
||
## 后台展示改动(slot_admin_vue)
|
||
|
||
文件:[`freeCreditsStats/index.vue`](backend/slot_admin_vue/src/views/game/freeCreditsStats/index.vue)
|
||
|
||
- 从 `PLAYER_STATUS_MAP` 删除 `7: '后续档释放中'`
|
||
- `playerStatusOptions` 自动随之更新(由 map 生成)
|
||
- **可选兼容**:保留只读展示 `7: '第一档已提现(历史)'` 不加入筛选项,避免迁移前偶发裸数字;迁移 SQL 执行后可删
|
||
|
||
列表「当前状态」列继续读 `record.status`;后续档进度看已有的「完成进度」「已领取金额」「待释放金额」,不再依赖 releasing 主状态。
|
||
|
||
## 测试
|
||
|
||
在 [`slot_console/tests`](slot_console/tests) 补充/调整:
|
||
|
||
| 场景 | 预期 |
|
||
|------|------|
|
||
| 两档均为 ready,claim 较高 package_no | 成功,不再抛 `Please claim credits in order` |
|
||
| 上一档 ready 未 claim,满足充值条件 | `advanceByRecharge` 仍可解锁下一 locked 档 |
|
||
| 解锁 release 档后 | `player.status` 不变(如仍为 `STATUS_FIRST_CASH_DONE`) |
|
||
| 全部 package completed | `player.status` → `10` |
|
||
|
||
## 不在本次范围
|
||
|
||
- [`docs/requirements/首充前免费余额定格与分档释放需求文档.md`](docs/requirements/首充前免费余额定格与分档释放需求文档.md) §16/§20.3 仍写顺序领取与 releasing — 若需文档对齐可另开任务
|
||
- C 端前端(slot_pwa 等)若曾按 `status===7` 做 UI 分支需自查;当前仓库内无引用
|