peixue-dev/Archive/peidu-temp-files/docs/🔍预约页面与日历数据不一致问题诊断-2026-01-24.md

7.7 KiB
Raw Blame History

🔍 预约页面与日历数据不一致问题诊断

日期: 2026-01-24
问题: 预约页面显示62个待服务订单但日历只显示6个订单


📋 问题描述

用户反馈:

"我的预约页面有62个待服务但是日历和我的预约中不同步我认为应该保持一致"

数据对比:

  • 我的预约页面: 显示 62 个待服务订单
  • 服务日历页面: 只显示 6 个订单
  • 差异: 56 个订单没有显示在日历上

🔍 可能的原因

1. 查询条件不同

我的预约页面查询条件:

// 可能查询所有状态的订单
SELECT * FROM `order` 
WHERE user_id = ? 
AND deleted = 0
ORDER BY create_time DESC

日历页面查询条件:

// CalendarServiceImpl.java
.in("status", Arrays.asList(1, 2, 3, 4))
.between("service_date", startDate, endDate)

关键差异:

  • 日历只查询 status IN (1,2,3,4) 的订单
  • 日历只查询指定日期范围内的订单
  • status=0 (待支付) 的订单不会显示在日历上

2. 日期范围限制

日历页面只查询当前月份的订单:

// 当前是 2026年1月
startDate = '2026-01-01'
endDate = '2026-01-31'

问题:

  • 如果订单的 service_date 在其他月份,不会显示
  • 如果订单的 service_date 为空或无效,不会显示

3. 订单状态分布

可能的状态分布:

  • status=0 (待支付): 可能有很多订单
  • status=1 (待服务): 62个
  • status=2 (进行中): 少量
  • status=3 (已完成): 少量
  • status=4 (已取消): 少量

如果62个都是待服务状态但日历只显示6个说明:

  • 56个订单的 service_date 不在当前月份
  • 或者 service_date 字段为空

🔍 需要检查的SQL

SQL 1: 检查订单状态分布

-- 检查用户的订单状态分布
SELECT 
    status,
    CASE status
        WHEN 0 THEN '待支付'
        WHEN 1 THEN '待服务'
        WHEN 2 THEN '进行中'
        WHEN 3 THEN '已完成'
        WHEN 4 THEN '已取消'
        ELSE '未知'
    END AS status_text,
    COUNT(*) AS count
FROM `order`
WHERE user_id = 1
AND deleted = 0
GROUP BY status
ORDER BY status;

SQL 2: 检查待服务订单的日期分布

-- 检查待服务订单的日期分布
SELECT 
    DATE_FORMAT(service_date, '%Y-%m') AS month,
    COUNT(*) AS count
FROM `order`
WHERE user_id = 1
AND status = 1
AND deleted = 0
GROUP BY DATE_FORMAT(service_date, '%Y-%m')
ORDER BY month;

SQL 3: 检查1月份的订单

-- 检查2026年1月的订单
SELECT 
    id,
    order_no,
    status,
    CASE status
        WHEN 0 THEN '待支付'
        WHEN 1 THEN '待服务'
        WHEN 2 THEN '进行中'
        WHEN 3 THEN '已完成'
        WHEN 4 THEN '已取消'
        ELSE '未知'
    END AS status_text,
    service_date,
    time_slot,
    service_name
FROM `order`
WHERE user_id = 1
AND deleted = 0
AND service_date >= '2026-01-01'
AND service_date <= '2026-01-31'
ORDER BY service_date, time_slot;

SQL 4: 检查日历查询条件匹配的订单

-- 模拟日历的查询条件
SELECT 
    id,
    order_no,
    status,
    CASE status
        WHEN 0 THEN '待支付'
        WHEN 1 THEN '待服务'
        WHEN 2 THEN '进行中'
        WHEN 3 THEN '已完成'
        WHEN 4 THEN '已取消'
        ELSE '未知'
    END AS status_text,
    service_date,
    time_slot,
    service_name
FROM `order`
WHERE user_id = 1
AND deleted = 0
AND status IN (1, 2, 3, 4)  -- 日历的状态筛选
AND service_date >= '2026-01-01'
AND service_date <= '2026-01-31'
ORDER BY service_date, time_slot;

SQL 5: 检查不在日历显示范围的订单

-- 检查为什么有些订单不在日历上显示
SELECT 
    id,
    order_no,
    status,
    CASE status
        WHEN 0 THEN '待支付'
        WHEN 1 THEN '待服务'
        WHEN 2 THEN '进行中'
        WHEN 3 THEN '已完成'
        WHEN 4 THEN '已取消'
        ELSE '未知'
    END AS status_text,
    service_date,
    time_slot,
    service_name,
    CASE 
        WHEN status = 0 THEN '状态为待支付,日历不显示'
        WHEN service_date IS NULL THEN '服务日期为空'
        WHEN service_date < '2026-01-01' THEN '日期早于1月'
        WHEN service_date > '2026-01-31' THEN '日期晚于1月'
        ELSE '应该显示但未显示'
    END AS reason
FROM `order`
WHERE user_id = 1
AND deleted = 0
AND status = 1  -- 只看待服务的订单
AND (
    status NOT IN (1, 2, 3, 4)
    OR service_date IS NULL
    OR service_date < '2026-01-01'
    OR service_date > '2026-01-31'
)
ORDER BY service_date;

💡 解决方案

方案1: 修改日历查询条件,包含待支付订单

如果业务上待支付的订单也应该显示在日历上:

// CalendarServiceImpl.java
// 修改前
.in("status", Arrays.asList(1, 2, 3, 4))

// 修改后 - 包含待支付订单
.in("status", Arrays.asList(0, 1, 2, 3, 4))

方案2: 日历支持查看所有月份的订单

当前日历只显示当前月份,可以:

  1. 添加"查看全部"选项
  2. 支持切换到其他月份
  3. 在统计中显示其他月份的订单数量

方案3: 在预约页面添加日期筛选

让预约页面也支持按月份筛选,与日历保持一致:

// 添加月份筛选
<picker mode="date" fields="month" @change="onMonthChange">
  <view>{{ selectedMonth || '全部月份' }}</view>
</picker>

方案4: 统一查询逻辑

确保两个页面使用相同的查询条件:

// 创建统一的订单查询服务
public interface OrderQueryService {
    // 统一的查询方法
    List<Order> getUserOrders(Long userId, OrderQueryDTO query);
}

// 查询条件DTO
public class OrderQueryDTO {
    private List<Integer> statuses;  // 状态列表
    private LocalDate startDate;     // 开始日期
    private LocalDate endDate;       // 结束日期
    private Boolean includeAllDates; // 是否包含所有日期
}

🎯 推荐方案

短期方案: 修改日历查询条件

  1. 包含待支付订单 (如果业务需要)
  2. 添加日期范围提示 - 告诉用户当前只显示本月订单
  3. 添加"查看全部"按钮 - 跳转到预约列表查看所有订单

长期方案: 统一数据展示逻辑

  1. 统一查询条件 - 两个页面使用相同的筛选逻辑
  2. 添加筛选器 - 支持按状态、日期筛选
  3. 数据同步 - 确保两个页面显示的数据一致

📝 立即执行的检查步骤

步骤1: 执行诊断SQL

-- 在Navicat中执行上面的5个SQL
-- 查看订单的状态分布和日期分布

步骤2: 查看后端日志

查看 CalendarServiceImpl 的日志输出:
- 查询条件是什么
- 返回了多少条数据
- 是否有异常

步骤3: 查看前端控制台

// 在日历页面查看控制台输出
console.log('[日历] 日程数据:', res)
console.log('[日历] 转换后的日程数据:', this.scheduleData)

🔍 预期发现

根据问题描述,最可能的情况是:

  1. 62个待服务订单中:

    • 6个订单的 service_date 在 2026年1月
    • 56个订单的 service_date 在其他月份或为空
  2. 或者:

    • 部分订单的 status=0 (待支付)
    • 日历不显示待支付订单

下一步操作

  1. 执行诊断SQL - 确认订单的状态和日期分布

  2. 根据结果决定修复方案:

    • 如果是日期问题 → 添加月份切换功能
    • 如果是状态问题 → 修改查询条件包含待支付订单
    • 如果是数据问题 → 修复订单的 service_date 字段
  3. 修改代码 - 实施选定的方案

  4. 测试验证 - 确保两个页面数据一致


诊断时间: 2026-01-24
下一步: 执行诊断SQL确认问题根源