peixue-dev/Archive/peidu-temp-files/docs/🔍家长端日历无数据问题诊断-2026-01-24.md

5.4 KiB

🔍 家长端日历无数据问题诊断

诊断时间: 2026-01-24
问题: 日历页面显示"暂无订单数据",统计数字都是0

问题分析

可能的原因

  1. 数据库中没有订单数据

    • 当前用户没有创建任何订单
    • 订单的service_date不在当前月份
  2. 用户ID获取错误

    • 后端获取的userId与实际登录用户不匹配
    • JWT token中的userId字段不正确
  3. 订单状态不符合查询条件

    • 订单状态不在 [1,2,3,4] 范围内
    • 订单被标记为deleted=1
  4. 日期格式问题

    • 前端传递的日期格式与后端期望不一致
    • LocalDate解析失败

诊断步骤

步骤1: 检查数据库中的订单数据

执行SQL: peidu/sql/🔍检查日历数据-2026-01-24.sql

-- 查看所有订单
SELECT id, order_no, user_id, service_date, status, deleted
FROM `order`
WHERE deleted = 0
ORDER BY service_date DESC
LIMIT 20;

检查点:

  • 是否有订单数据?
  • user_id是否正确?
  • service_date是否在2026年1月?
  • status是否在 [1,2,3,4] 范围?
  • deleted是否为0?

步骤2: 检查后端日志

查看后端控制台输出:

[CalendarController] 获取预约记录, startDate: 2026-01-01, endDate: 2026-01-31
[CalendarController] 当前用户ID: [实际的用户ID]
[CalendarServiceImpl] 查询用户预约记录, userId: [用户ID], startDate: 2026-01-01, endDate: 2026-01-31
[CalendarServiceImpl] 查询到 X 条订单记录

检查点:

  • 用户ID是否正确?
  • 日期范围是否正确?
  • 查询到的订单数量是多少?

步骤3: 检查前端请求

在浏览器开发者工具中查看Network:

Request URL: http://localhost:8080/api/calendar/appointments?startDate=2026-01-01&endDate=2026-01-31
Request Method: GET
Status Code: 200 OK

检查点:

  • 请求是否成功(200)?
  • 请求参数是否正确?
  • 响应数据中是否有records?

步骤4: 检查JWT Token

查看请求头中的Authorization:

Authorization: Bearer [JWT Token]

解析token,检查payload中的userId字段。

解决方案

方案1: 创建测试数据

如果数据库中没有订单数据,执行:

# 在MySQL中执行
source peidu/sql/🚀创建日历测试数据-2026-01-24.sql

这将为用户ID=1创建6条测试订单:

  • 1月10日 - 已完成
  • 1月15日 - 待服务
  • 1月20日 - 待接单
  • 1月24日 - 服务中(今天)
  • 1月25日 - 待服务(明天)
  • 1月28日 - 待服务

方案2: 修复用户ID获取

如果用户ID获取错误,已在 CalendarController 中修复:

private Long getCurrentUserId(HttpServletRequest request) {
    // 优先获取userId
    Object userIdObj = request.getAttribute("userId");
    if (userIdObj != null) {
        return Long.valueOf(userIdObj.toString());
    }
    
    // 尝试获取teacherId
    Object teacherIdObj = request.getAttribute("teacherId");
    if (teacherIdObj != null) {
        return Long.valueOf(teacherIdObj.toString());
    }
    
    return 1L; // 默认值
}

方案3: 检查订单状态

确保订单状态正确:

-- 更新订单状态为待服务
UPDATE `order`
SET status = 2
WHERE user_id = 1
  AND service_date >= CURDATE()
  AND status = 0
  AND deleted = 0;

方案4: 检查deleted字段

确保订单没有被软删除:

-- 恢复被删除的订单
UPDATE `order`
SET deleted = 0
WHERE user_id = 1
  AND service_date >= '2026-01-01'
  AND deleted = 1;

测试验证

1. 重新编译后端

cd peidu/backend
mvn clean compile

2. 重启后端服务

确保后端服务重启以加载新代码。

3. 刷新前端页面

在微信开发者工具中:

  1. 点击"编译"按钮
  2. 进入家长端
  3. 访问"服务日历"页面
  4. 查看是否显示数据

4. 验证数据显示

预期结果:

  • 日历上有彩色标记的日期
  • 统计数字显示正确(总课时、已完成、待服务)
  • 点击日期可以查看当天的服务详情

调试技巧

1. 查看后端日志

# 查看最新的日志
tail -f peidu/backend/logs/app.log

2. 使用Postman测试API

GET http://localhost:8080/api/calendar/appointments
Headers:
  Authorization: Bearer [你的token]
Params:
  startDate: 2026-01-01
  endDate: 2026-01-31

3. 在前端添加调试日志

async loadScheduleData() {
    console.log('[日历] 开始加载数据')
    console.log('[日历] startDate:', this.getMonthStart())
    console.log('[日历] endDate:', this.getMonthEnd())
    
    const res = await calendarApi.getAppointments(startDate, endDate)
    
    console.log('[日历] API响应:', res)
    console.log('[日历] 订单数量:', res.data?.length || 0)
}

常见问题

Q1: 为什么我的用户看不到数据?

A: 检查用户ID是否正确。每个用户只能看到自己的订单(user_id匹配)。

Q2: 为什么统计数字都是0?

A: 检查订单的service_date是否在当前月份,以及status是否在有效范围内。

Q3: 为什么日历上没有标记?

A: 前端需要根据订单的service_date在日历上显示标记。检查scheduleData数组是否有数据。

Q4: 如何切换到其他月份?

A: 点击日历上的左右箭头切换月份,会自动重新加载该月的数据。

下一步

如果以上方案都无法解决问题,请:

  1. 提供后端完整日志
  2. 提供前端控制台输出
  3. 提供数据库查询结果
  4. 提供Network请求详情

这样可以更准确地定位问题。