Files
pk10/Docs/PERIOD_ISSUE_FIX.md

320 lines
6.4 KiB
Markdown
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 期号问题快速修复指南
## 问题描述
用户报告:
1. **新游戏显示老游戏的开奖信息** - Xóc Đĩa 显示骰子游戏的历史记录
2. **无法正常下注** - 投注时提示错误
## 根本原因
1. **历史开奖记录是硬编码的** - 前台页面使用固定的示例数据
2. **期号状态可能不正确** - 需要确认期号是否处于 `pending` 状态
---
## 解决方案
### 1. 修改的文件
已修改以下文件以支持动态历史记录:
#### `App/Controllers/Web/HomeController.php`
- 添加获取历史开奖记录的代码
- 传递 `recentPeriods` 变量到视图
#### `App/Views/Web/live.php`
- 将硬编码的历史记录改为动态生成
- 根据游戏类型显示不同的历史记录格式
---
### 2. 验证步骤
#### 步骤1:检查数据库中的期号
```sql
-- 查看所有期号
SELECT id, period_number, game_id, status, created_at
FROM periods
ORDER BY id DESC
LIMIT 10;
-- 应该看到:
-- 骰子游戏(game_id=1)和 Xóc Đĩagame_id=2)的期号分开
```
#### 步骤2:检查当前期号状态
```sql
-- 查看 Xóc Đĩa 的当前期号
SELECT id, period_number, game_id, status, start_time
FROM periods
WHERE game_id = 2
ORDER BY id DESC
LIMIT 1;
-- 状态应该是 'pending'
-- start_time 应该是最近的时间
```
#### 步骤3:如果期号状态不对
```sql
-- 如果状态是 'locked' 或其他,重置为 'pending'
UPDATE periods
SET status = 'pending', start_time = NOW()
WHERE id = [期号ID];
```
#### 步骤4:检查游戏配置
```sql
-- 确认游戏类型正确
SELECT id, name, code, type, status
FROM games;
-- 应该看到:
-- 1 | Tài Xỉu | dice | dice | 1
-- 2 | Xóc Đĩa | xocdia | xocdia | 1
```
---
### 3. 投注失败的常见原因
#### 原因1:期号状态不是 pending
**检查**
```sql
SELECT id, period_number, status FROM periods WHERE game_id = 2 ORDER BY id DESC LIMIT 1;
```
**修复**
```sql
UPDATE periods SET status = 'pending' WHERE id = [期号ID];
```
#### 原因2:投注时间超过60秒
**检查**
```sql
SELECT id, period_number, start_time,
TIMESTAMPDIFF(SECOND, start_time, NOW()) as elapsed_seconds
FROM periods
WHERE game_id = 2
ORDER BY id DESC
LIMIT 1;
-- 如果 elapsed_seconds > 60,说明已经超时
```
**修复**
```sql
-- 重置开始时间
UPDATE periods SET start_time = NOW() WHERE id = [期号ID];
```
#### 原因3:期号不存在
**检查**
```sql
-- 查看是否有 Xóc Đĩa 的期号
SELECT COUNT(*) FROM periods WHERE game_id = 2;
```
**修复**
- 进入后台 → 期号管理
- 选择"Xóc Đĩa"游戏
- 点击"开始下注"
---
### 4. 完整的重置流程
如果问题仍然存在,执行以下完整重置:
```sql
-- 1. 删除 Xóc Đĩa 的所有旧期号(可选,谨慎操作)
-- DELETE FROM periods WHERE game_id = 2;
-- 2. 确认游戏配置正确
UPDATE games SET type = 'xocdia', code = 'xocdia' WHERE name LIKE '%Xóc%';
-- 3. 通过后台创建新期号
-- 进入后台 → 期号管理 → 选择 Xóc Đĩa → 开始下注
```
---
### 5. 前台测试
#### 测试1:访问游戏页面
```bash
# 访问 Xóc Đĩa 游戏
http://yourdomain.com/live?game_id=2
# 应该看到:
# - 期号显示(例如:G220260108001
# - 倒计时(60秒)
# - 历史记录为空或显示 Xóc Đĩa 的历史
```
#### 测试2:投注
1. 选择筹码金额
2. 点击投注区域(双/单 或 精确组合)
3. 点击"ĐẶT CƯỢC"确认
4. 应该看到"Đặt cược thành công!"提示
#### 测试3:查看投注记录
```sql
-- 查看最新的投注记录
SELECT id, user_id, period_id, bet_type, bet_value, amount, status
FROM bets
ORDER BY id DESC
LIMIT 5;
-- 应该看到刚才的投注记录
```
---
### 6. 浏览器控制台调试
打开浏览器开发者工具(F12),查看 Console 和 Network 标签:
#### Console 错误
如果看到错误信息,记录下来:
```
Poll error: ...
Bet error: ...
```
#### Network 请求
查看以下请求是否成功:
1. **期号轮询**`/api/period/current?game_id=2`
- 应该返回:`{"success":true,"data":{...}}`
- 如果返回 `success: false`,说明期号不存在
2. **投注请求**`/api/bet`
- 应该返回:`{"success":true,"new_balance":...}`
- 如果返回 `success: false`,查看 `message` 字段
---
### 7. 后台日志
如果问题仍然存在,检查后台日志:
```bash
# 查看 PHP 错误日志
tail -f /path/to/touzi/Storage/log/error.log
# 或者查看宝塔面板的日志
# 宝塔 → 网站 → 日志 → PHP错误日志
```
---
## 常见错误信息
### "Kỳ quay không tồn tại"(期号不存在)
**原因**:数据库中没有该游戏的 pending 期号
**解决**
1. 进入后台期号管理
2. 选择游戏
3. 点击"开始下注"
---
### "Kỳ quay đã đóng hoặc đang xử lý"(期号已关闭)
**原因**:期号状态不是 `pending`
**解决**
```sql
UPDATE periods SET status = 'pending' WHERE id = [期号ID];
```
---
### "Đã hết thời gian đặt cược"(投注时间已过)
**原因**:距离开始时间超过60秒
**解决**
```sql
UPDATE periods SET start_time = NOW() WHERE id = [期号ID];
```
---
### "Dữ liệu không hợp lệ"(数据无效)
**原因**:前端发送的数据格式不正确
**解决**
1. 检查浏览器 Console 是否有 JavaScript 错误
2. 确认 `currentGameId` 变量是否正确
3. 刷新页面重试
---
## 预防措施
### 1. 定期检查期号状态
```sql
-- 查看所有未结算的期号
SELECT id, period_number, game_id, status, start_time
FROM periods
WHERE status IN ('pending', 'locked', 'drawn')
ORDER BY id DESC;
```
### 2. 自动封盘机制
前台已经实现自动封盘:
- 60秒后自动将 `pending` 改为 `locked`
- 但需要有用户访问页面触发
### 3. 后台操作流程
标准流程:
1. 开始下注(创建 pending 期号)
2. 等待60秒或手动封盘
3. 录入开奖结果(状态变为 drawn)
4. 确认结算(状态变为 settled)
5. 重复步骤1
---
## 联系支持
如果以上步骤都无法解决问题,请提供:
1. **数据库查询结果**
```sql
SELECT * FROM periods WHERE game_id = 2 ORDER BY id DESC LIMIT 3;
SELECT * FROM games WHERE id = 2;
```
2. **浏览器 Console 错误**:截图或复制错误信息
3. **Network 请求详情**
- `/api/period/current?game_id=2` 的响应
- `/api/bet` 的请求和响应
---
**最后更新**: 2026-01-08
**适用版本**: TM68 投注平台