peixue-dev/Archive/peidu-temp-files/docs/[一次性]时卡不显示问题-完整分析-2026-01-25.md

193 lines
5.9 KiB
Markdown
Raw 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.

# 时卡在确认订单页面不显示问题 - 完整分析
**日期:** 2026-01-25
**问题:** 用户在"我的时卡"页面能看到时卡,但在确认订单页面选择时卡时显示"暂无可用时卡"
---
## 🔍 问题原因
### 1. 后端接口过滤条件严格
**接口路径:** `/api/timecard/available`
**SQL查询条件**
```sql
SELECT * FROM time_card
WHERE user_id = #{userId}
AND status = 1 -- ⚠️ 必须是"进行中"状态
AND remaining_hours > 0 -- ⚠️ 剩余时长必须大于0
AND expire_date > CURDATE() -- ⚠️ 到期日期必须大于今天
AND deleted = 0
ORDER BY expire_date ASC
```
### 2. 可能的问题点
| 检查项 | 要求 | 可能的问题 |
|--------|------|------------|
| **status** | 必须等于 1进行中 | 时卡状态可能是 0未激活或其他值 |
| **remaining_hours** | 必须大于 0 | 剩余时长可能为 0 或负数 |
| **expire_date** | 必须大于今天 | 到期日期可能为空或已过期 |
| **deleted** | 必须等于 0 | 时卡可能被标记为已删除 |
### 3. "我的时卡"页面为什么能显示?
"我的时卡"页面可能调用的是 `/api/timecard/list` 接口,该接口的过滤条件较少,只要 `user_id` 匹配就会返回。
---
## 🛠️ 解决方案
### 方案A修复数据库中的时卡数据推荐
**适用场景:** 时卡数据本身有问题(状态、日期等)
**步骤:**
1. **执行诊断SQL**
- 文件位置:`Archive/peidu-temp-files/sql/[一次性]诊断时卡不显示问题-2026-01-25.sql`
- 修改SQL中的手机号为实际值
- 依次执行查询1-4查看结果
2. **根据诊断结果执行修复**
**问题1status 不是 1**
```sql
UPDATE time_card
SET status = 1, update_time = NOW()
WHERE user_id = (SELECT id FROM user WHERE phone = '你的手机号' LIMIT 1)
AND status != 1
AND remaining_hours > 0
AND deleted = 0;
```
**问题2expire_date 为空或已过期**
```sql
UPDATE time_card
SET expire_date = DATE_ADD(CURDATE(), INTERVAL 1 YEAR), update_time = NOW()
WHERE user_id = (SELECT id FROM user WHERE phone = '你的手机号' LIMIT 1)
AND (expire_date IS NULL OR expire_date <= CURDATE())
AND deleted = 0;
```
**问题3start_date 为空**
```sql
UPDATE time_card
SET start_date = CURDATE(), update_time = NOW()
WHERE user_id = (SELECT id FROM user WHERE phone = '你的手机号' LIMIT 1)
AND start_date IS NULL
AND deleted = 0;
```
3. **验证修复结果**
```sql
SELECT
id,
card_name,
status,
remaining_hours,
expire_date
FROM time_card
WHERE user_id = (SELECT id FROM user WHERE phone = '你的手机号' LIMIT 1)
AND status = 1
AND remaining_hours > 0
AND expire_date > CURDATE()
AND deleted = 0;
```
### 方案B临时修改前端代码已实施
**适用场景:** 快速测试,确认是否是接口问题
**已修改内容:**
-`timecardApi.getAvailableCards(userId)` 改为 `timecardApi.getList({ params: { userId } })`
- 添加详细的调试日志
**测试步骤:**
1. 重新编译前端
2. 在确认订单页面打开浏览器控制台
3. 查看日志输出:
- `🔍 [时卡诊断] 加载时卡信息用户ID: xxx`
- `🔍 [时卡诊断] getList 返回结果: xxx`
- `🔍 [时卡诊断] 解析后的时卡列表: xxx`
**如果使用 getList 能显示时卡:**
- 说明问题确实是 `getAvailableCards` 接口的过滤条件太严格
- 需要执行方案A修复数据
### 方案C修改后端接口逻辑不推荐
**适用场景:** 确认数据正确,但业务逻辑需要调整
**修改内容:**
- 放宽 `getAvailableCards` 的过滤条件
- 例如:允许 `expire_date` 为空,或者不检查到期日期
**⚠️ 注意:** 这种方案可能导致用户使用已过期的时卡,不建议采用。
---
## 📊 诊断检查清单
执行诊断SQL后检查以下项目
- [ ] **用户ID是否正确** - 确认查询的是正确的用户
- [ ] **时卡是否存在** - 查询1应该返回时卡记录
- [ ] **status 字段** - 应该是 1进行中
- [ ] **remaining_hours 字段** - 应该大于 0
- [ ] **expire_date 字段** - 应该大于今天,且不为空
- [ ] **deleted 字段** - 应该是 0未删除
- [ ] **start_date 字段** - 建议不为空
---
## 🎯 预期结果
修复后,确认订单页面应该能够:
1. 显示"可用余额xxx小时"
2. 点击"选择时卡支付"能看到时卡列表
3. 选择时卡后能正常扣减时长
---
## 📝 后续优化建议
1. **购买时卡时自动设置字段**
- 购买时自动设置 `status = 1`
- 自动设置 `start_date = 当前日期`
- 自动设置 `expire_date = 1年后`
2. **添加定时任务**
- 每天检查并更新过期的时卡状态
- 每天检查并更新用完的时卡状态
3. **前端提示优化**
- 如果没有可用时卡,提示具体原因(已过期、余额不足等)
- 提供"购买时卡"的快捷入口
---
## 🔗 相关文件
- **诊断SQL** `Archive/peidu-temp-files/sql/[一次性]诊断时卡不显示问题-2026-01-25.sql`
- **执行脚本:** `Archive/peidu-temp-files/scripts/[一次性]诊断时卡问题.bat`
- **前端代码:** `peidu/uniapp/src/order-package/pages/order/create.vue`
- **后端Controller** `peidu/backend/src/main/java/com/peidu/controller/TimeCardController.java`
- **后端Mapper** `peidu/backend/src/main/java/com/peidu/mapper/TimeCardMapper.java`
---
## ✅ 执行步骤总结
1. **执行诊断SQL** - 找出时卡数据的具体问题
2. **执行修复SQL** - 根据诊断结果修复数据
3. **重新编译前端** - 测试修改后的代码
4. **测试功能** - 在确认订单页面选择时卡
5. **查看日志** - 确认接口返回正确的数据
如果问题仍然存在,请提供:
- 诊断SQL的查询结果
- 浏览器控制台的日志输出
- 后端接口的返回数据