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

5.9 KiB
Raw Blame History

时卡在确认订单页面不显示问题 - 完整分析

日期: 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修复数据库中的时卡数据推荐

适用场景: 时卡数据本身有问题(状态、日期等)

步骤:

  1. 执行诊断SQL

    • 文件位置:Archive/peidu-temp-files/sql/[一次性]诊断时卡不显示问题-2026-01-25.sql
    • 修改SQL中的手机号为实际值
    • 依次执行查询1-4查看结果
  2. 根据诊断结果执行修复

    问题1status 不是 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;
    

    问题2expire_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;
    

    问题3start_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;
    
  3. 验证修复结果

    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的查询结果
  • 浏览器控制台的日志输出
  • 后端接口的返回数据