# 🔍 家长端日历功能问题诊断 **诊断时间**: 2026-01-24 **问题描述**: 家长端日历功能无法显示数据,之前可以看到日历上显示待上课的数量、已完成服务的数量,下方会显示订单,点击订单显示订单详情 --- ## 🔍 问题分析 ### 1. 后端API问题 **文件**: `peidu/backend/src/main/java/com/peidu/service/impl/CalendarServiceImpl.java` **问题1:订单状态筛选错误** ```java // ❌ 当前代码:只查询状态为 2, 3, 4 的订单 queryWrapper.in("status", Arrays.asList(2, 3, 4)) // 待服务、服务中、已完成 ``` **实际订单状态定义**: - 0: 待支付 - 1: 待接单(已支付) - 2: 待服务(已接单) - 3: 服务中 - 4: 已完成 **问题**: - 缺少状态 1(待接单/已支付)的订单 - 家长支付后的订单状态是 1,但日历不显示 **问题2:统计数据状态映射错误** ```java // ❌ 当前代码 stats.put("pendingCount", orders.stream().filter(o -> o.getStatus() == 2).count()); stats.put("ongoingCount", orders.stream().filter(o -> o.getStatus() == 3).count()); stats.put("completedCount", orders.stream().filter(o -> o.getStatus() == 4).count()); ``` **问题**: - `pendingCount` 应该包含状态 1 和 2(待接单 + 待服务) - 统计数据不准确 **问题3:用户ID硬编码** ```java // ❌ Controller中硬编码 private Long getCurrentUserId() { return 1L; // 固定返回用户ID 1 } ``` **问题**: - 所有用户看到的都是用户ID=1的数据 - 无法显示当前登录用户的订单 ### 2. 前端问题 **文件**: `peidu/uniapp/src/user-package/pages/calendar/index.vue` **问题1:日历组件缺失** ```vue ``` **问题**: - 引用了 `@/components/calendar/calendar.vue` 组件 - 但这个组件可能不存在或有问题 **问题2:API调用路径** ```javascript const res = await calendarApi.getAppointments(startDate, endDate) ``` **需要检查**: - `calendarApi` 是否正确定义 - API路径是否正确 --- ## ✅ 修复方案 ### 1. 修复后端订单状态筛选 **修改文件**: `peidu/backend/src/main/java/com/peidu/service/impl/CalendarServiceImpl.java` #### 修复 getAppointments 方法 ```java @Override public List getAppointments(Long userId, LocalDate startDate, LocalDate endDate) { log.info("查询用户预约记录, userId: {}, startDate: {}, endDate: {}", userId, startDate, endDate); // ✅ 修复:包含所有有效状态的订单(1-待接单, 2-待服务, 3-服务中, 4-已完成) QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("user_id", userId) .ge("service_date", startDate) .le("service_date", endDate) .in("status", Arrays.asList(1, 2, 3, 4)) // ✅ 增加状态1 .eq("deleted", 0) .orderByAsc("service_date", "time_slot"); List orders = orderMapper.selectList(queryWrapper); log.info("查询到 {} 条订单记录", orders.size()); return orders.stream() .map(this::convertToAppointmentVO) .collect(Collectors.toList()); } ``` #### 修复 getDailyServices 方法 ```java @Override public List getDailyServices(Long userId, LocalDate date) { log.info("查询指定日期的服务详情, userId: {}, date: {}", userId, date); // ✅ 修复:包含所有有效状态 QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("user_id", userId) .eq("service_date", date) .in("status", Arrays.asList(1, 2, 3, 4)) // ✅ 增加状态1 .eq("deleted", 0) .orderByAsc("time_slot"); List orders = orderMapper.selectList(queryWrapper); log.info("查询到 {} 条服务记录", orders.size()); return orders.stream() .map(this::convertToServiceDetailVO) .collect(Collectors.toList()); } ``` #### 修复 getMonthlyStats 方法 ```java @Override public Map getMonthlyStats(Long userId, Integer year, Integer month) { log.info("查询当月预约统计, userId: {}, year: {}, month: {}", userId, year, month); LocalDate startDate = LocalDate.of(year, month, 1); LocalDate endDate = startDate.plusMonths(1).minusDays(1); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("user_id", userId) .ge("service_date", startDate) .le("service_date", endDate) .eq("deleted", 0); List orders = orderMapper.selectList(queryWrapper); // ✅ 修复:正确统计各状态数量 Map stats = new HashMap<>(); stats.put("totalCount", orders.size()); // 待服务 = 待接单(1) + 待服务(2) stats.put("pendingCount", orders.stream() .filter(o -> o.getStatus() == 1 || o.getStatus() == 2) .count()); // 服务中 stats.put("ongoingCount", orders.stream() .filter(o -> o.getStatus() == 3) .count()); // 已完成 stats.put("completedCount", orders.stream() .filter(o -> o.getStatus() == 4) .count()); return stats; } ``` ### 2. 修复用户ID获取 **修改文件**: `peidu/backend/src/main/java/com/peidu/controller/CalendarController.java` ```java /** * 获取当前用户ID * ✅ 从请求头或token中获取 */ private Long getCurrentUserId() { // 方案1:从请求头获取 HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()) .getRequest(); String userIdStr = request.getHeader("userId"); if (userIdStr != null) { return Long.parseLong(userIdStr); } // 方案2:从session获取 Object userInfo = request.getSession().getAttribute("userInfo"); if (userInfo != null) { // 根据实际UserInfo类结构获取ID return ((UserInfo) userInfo).getId(); } // 默认返回1(仅用于测试) log.warn("无法获取当前用户ID,使用默认值1"); return 1L; } ``` ### 3. 修复状态文本映射 ```java /** * 获取状态文本 * ✅ 修复状态映射 */ private String getStatusText(Integer status) { switch (status) { case 0: return "待支付"; case 1: return "待接单"; // ✅ 修复:已支付,等待陪伴员接单 case 2: return "待服务"; // ✅ 修复:已接单,等待服务 case 3: return "服务中"; case 4: return "已完成"; case -1: return "已取消"; case -2: return "退款中"; case -3: return "已退款"; default: return "未知状态"; } } ``` --- ## 📋 需要修改的文件 1. **后端** - `peidu/backend/src/main/java/com/peidu/service/impl/CalendarServiceImpl.java` - 修复 `getAppointments` 方法的状态筛选 - 修复 `getDailyServices` 方法的状态筛选 - 修复 `getMonthlyStats` 方法的统计逻辑 - 修复 `getStatusText` 方法的状态映射 - `peidu/backend/src/main/java/com/peidu/controller/CalendarController.java` - 修复 `getCurrentUserId` 方法,从请求中获取真实用户ID 2. **前端**(需要进一步检查) - 检查 `@/components/calendar/calendar.vue` 组件是否存在 - 检查 `@/api/index.js` 中的 `calendarApi` 定义 --- ## 🧪 测试步骤 1. **修复后端代码** ```bash cd peidu/backend mvn clean compile ``` 2. **重启后端服务** 3. **测试API** - 访问 `/api/calendar/appointments?startDate=2026-01-01&endDate=2026-01-31` - 检查返回的订单是否包含状态1的订单 4. **测试前端** - 登录家长端 - 进入日历页面 - 检查是否显示订单数据 - 点击日期查看详情 - 点击订单跳转到详情页 --- ## 🎯 预期效果 修复后,家长端日历应该: 1. ✅ 显示所有已支付的订单(状态 1, 2, 3, 4) 2. ✅ 日历上显示每天的订单数量 3. ✅ 统计数据正确显示(总数、待服务、已完成) 4. ✅ 点击日期显示当天的订单列表 5. ✅ 点击订单跳转到订单详情页 6. ✅ 每个用户只看到自己的订单数据 --- ## 📝 注意事项 1. **订单状态定义要统一**:确保前后端对订单状态的理解一致 2. **用户ID获取**:需要根据实际的认证方式调整 3. **日历组件**:如果组件不存在,需要创建或使用第三方组件 4. **数据权限**:确保用户只能看到自己的订单数据