5.9 KiB
5.9 KiB
时卡在确认订单页面不显示问题 - 完整分析
日期: 2026-01-25
问题: 用户在"我的时卡"页面能看到时卡,但在确认订单页面选择时卡时显示"暂无可用时卡"
🔍 问题原因
1. 后端接口过滤条件严格
接口路径: /api/timecard/available
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:修复数据库中的时卡数据(推荐)
适用场景: 时卡数据本身有问题(状态、日期等)
步骤:
-
执行诊断SQL
- 文件位置:
Archive/peidu-temp-files/sql/[一次性]诊断时卡不显示问题-2026-01-25.sql - 修改SQL中的手机号为实际值
- 依次执行查询1-4,查看结果
- 文件位置:
-
根据诊断结果执行修复
问题1:status 不是 1
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 为空或已过期
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 为空
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; -
验证修复结果
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 } }) - 添加详细的调试日志
测试步骤:
- 重新编译前端
- 在确认订单页面打开浏览器控制台
- 查看日志输出:
🔍 [时卡诊断] 加载时卡信息,用户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 字段 - 建议不为空
🎯 预期结果
修复后,确认订单页面应该能够:
- 显示"可用余额:xxx小时"
- 点击"选择时卡支付"能看到时卡列表
- 选择时卡后能正常扣减时长
📝 后续优化建议
-
购买时卡时自动设置字段
- 购买时自动设置
status = 1 - 自动设置
start_date = 当前日期 - 自动设置
expire_date = 1年后
- 购买时自动设置
-
添加定时任务
- 每天检查并更新过期的时卡状态
- 每天检查并更新用完的时卡状态
-
前端提示优化
- 如果没有可用时卡,提示具体原因(已过期、余额不足等)
- 提供"购买时卡"的快捷入口
🔗 相关文件
- 诊断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
✅ 执行步骤总结
- 执行诊断SQL - 找出时卡数据的具体问题
- 执行修复SQL - 根据诊断结果修复数据
- 重新编译前端 - 测试修改后的代码
- 测试功能 - 在确认订单页面选择时卡
- 查看日志 - 确认接口返回正确的数据
如果问题仍然存在,请提供:
- 诊断SQL的查询结果
- 浏览器控制台的日志输出
- 后端接口的返回数据