193 lines
5.9 KiB
Markdown
193 lines
5.9 KiB
Markdown
# 时卡在确认订单页面不显示问题 - 完整分析
|
||
|
||
**日期:** 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. **根据诊断结果执行修复**
|
||
|
||
**问题1:status 不是 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;
|
||
```
|
||
|
||
**问题2:expire_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;
|
||
```
|
||
|
||
**问题3:start_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的查询结果
|
||
- 浏览器控制台的日志输出
|
||
- 后端接口的返回数据
|