7.7 KiB
7.7 KiB
🔍 预约页面与日历数据不一致问题诊断
日期: 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: 日历支持查看所有月份的订单
当前日历只显示当前月份,可以:
- 添加"查看全部"选项
- 支持切换到其他月份
- 在统计中显示其他月份的订单数量
方案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: 执行诊断SQL
-- 在Navicat中执行上面的5个SQL
-- 查看订单的状态分布和日期分布
步骤2: 查看后端日志
查看 CalendarServiceImpl 的日志输出:
- 查询条件是什么
- 返回了多少条数据
- 是否有异常
步骤3: 查看前端控制台
// 在日历页面查看控制台输出
console.log('[日历] 日程数据:', res)
console.log('[日历] 转换后的日程数据:', this.scheduleData)
🔍 预期发现
根据问题描述,最可能的情况是:
-
62个待服务订单中:
- 6个订单的 service_date 在 2026年1月
- 56个订单的 service_date 在其他月份或为空
-
或者:
- 部分订单的 status=0 (待支付)
- 日历不显示待支付订单
✅ 下一步操作
-
执行诊断SQL - 确认订单的状态和日期分布
-
根据结果决定修复方案:
- 如果是日期问题 → 添加月份切换功能
- 如果是状态问题 → 修改查询条件包含待支付订单
- 如果是数据问题 → 修复订单的 service_date 字段
-
修改代码 - 实施选定的方案
-
测试验证 - 确保两个页面数据一致
诊断时间: 2026-01-24
下一步: 执行诊断SQL,确认问题根源