This commit is contained in:
ray zhou
2026-05-29 11:21:40 +08:00
parent 5d6d482efe
commit f71a5c59af
447 changed files with 32245 additions and 116 deletions

View File

@@ -0,0 +1,154 @@
---
name: 移除 RELEASING 状态
overview: 移除 Free Credits 玩家主状态 `STATUS_RELEASING(7)`,并同步实现「跨档领取 + 解锁不等待上一档 claim」后续档进度仅由 package 表表达玩家主状态停留在第一档生命周期4/5/6直至全部完成10
todos:
- id: remove-releasing-status
content: FreeCreditsPlayerModel 删除 STATUS_RELEASINGadvanceByRecharge 去掉写入 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()** — 删除顺序校验块(约 295298 行):
```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) 补充/调整:
| 场景 | 预期 |
|------|------|
| 两档均为 readyclaim 较高 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 分支需自查;当前仓库内无引用