# ✅ 预约与日历数据统一修复完成 **日期**: 2026-01-24 **状态**: ✅ 已完成 --- ## 📋 问题描述 用户反馈: - 预约页面显示62个待服务订单 - 日历页面只显示6个订单 - 两个页面数据不一致 **根本原因**: - 日历页面只显示当月订单(2026年1月) - 62个待服务订单分布在不同月份或日期为空 - 需要添加"全部订单"视图来显示所有订单 --- ## 🎯 解决方案 ### 1. 后端接口实现 ✅ #### 1.1 CalendarService接口 添加了两个新方法: ```java // 获取用户的所有预约记录(不限日期) List getAllAppointments(Long userId); // 获取用户的所有预约统计(不限日期) Map getAllStats(Long userId); ``` #### 1.2 CalendarServiceImpl实现 ```java @Override public List getAllAppointments(Long userId) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("user_id", userId) .in("status", Arrays.asList(1, 2, 3, 4)) .eq("deleted", 0) .orderByAsc("service_date", "time_slot"); List orders = orderMapper.selectList(queryWrapper); return orders.stream() .map(this::convertToAppointmentVO) .collect(Collectors.toList()); } @Override public Map getAllStats(Long userId) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("user_id", userId) .eq("deleted", 0); List orders = orderMapper.selectList(queryWrapper); Map stats = new HashMap<>(); stats.put("totalCount", orders.size()); 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; } ``` #### 1.3 CalendarController接口 添加了两个REST接口: ```java @GetMapping("/all-appointments") public Result> getAllAppointments(HttpServletRequest request) @GetMapping("/all-stats") public Result getAllStats(HttpServletRequest request) ``` --- ### 2. 前端实现 ✅ #### 2.1 API方法添加 在 `peidu/uniapp/src/api/index.js` 中添加: ```javascript export const calendarApi = { // ... 原有方法 ... // 获取所有预约记录(不限日期) getAllAppointments() { console.log('[API] 调用getAllAppointments') return request.get('/api/calendar/all-appointments') }, // 获取所有预约统计(不限日期) getAllStats() { console.log('[API] 调用getAllStats') return request.get('/api/calendar/all-stats') } } ``` #### 2.2 日历页面改造 在 `peidu/uniapp/src/user-package/pages/calendar/index.vue` 中: **添加视图切换**: ```vue 月视图 全部订单 ``` **添加全部订单列表**: ```vue {{ order.serviceDate }} {{ order.statusText }} {{ order.serviceName }} {{ order.timeSlot }} ``` **添加数据加载方法**: ```javascript data() { return { viewMode: 'month', // 'month' 或 'all' allOrders: [], // 全部订单列表 // ... 其他数据 ... } }, methods: { // 切换视图 switchView(mode) { this.viewMode = mode if (mode === 'month') { this.loadScheduleData() this.loadStatistics() } else { this.loadAllOrders() this.loadAllStatistics() } }, // 加载所有订单 async loadAllOrders() { const res = await calendarApi.getAllAppointments() this.allOrders = res.data.map(item => ({ id: item.id, serviceDate: item.serviceDate || '未设置日期', timeSlot: item.timeSlot || '未设置时间', serviceName: item.serviceName || '陪伴服务', status: this.getStatusClass(item.status), statusText: item.statusText, orderNo: item.orderNo })) }, // 加载所有统计 async loadAllStatistics() { const res = await calendarApi.getAllStats() this.statistics = { total: data.totalCount || 0, completed: data.completedCount || 0, upcoming: data.pendingCount || 0 } } } ``` --- ## 📁 修改的文件 ### 后端文件 1. ✅ `peidu/backend/src/main/java/com/peidu/service/CalendarService.java` - 添加 `getAllAppointments()` 方法 - 添加 `getAllStats()` 方法 2. ✅ `peidu/backend/src/main/java/com/peidu/service/impl/CalendarServiceImpl.java` - 实现 `getAllAppointments()` 方法 - 实现 `getAllStats()` 方法 3. ✅ `peidu/backend/src/main/java/com/peidu/controller/CalendarController.java` - 添加 `/api/calendar/all-appointments` 接口 - 添加 `/api/calendar/all-stats` 接口 ### 前端文件 4. ✅ `peidu/uniapp/src/api/index.js` - 添加 `getAllAppointments()` API方法 - 添加 `getAllStats()` API方法 5. ✅ `peidu/uniapp/src/user-package/pages/calendar/index.vue` - 添加视图切换组件 - 添加全部订单列表视图 - 添加 `loadAllOrders()` 方法 - 添加 `loadAllStatistics()` 方法 - 添加 `switchView()` 方法 - 添加相关样式 --- ## 🧪 测试步骤 ### 1. 编译后端 ```bash cd peidu/backend mvn clean compile -DskipTests ``` ### 2. 重启后端服务 确保新接口生效 ### 3. 测试前端功能 #### 3.1 测试月视图 1. 打开家长端日历页面 2. 默认显示"月视图" 3. 查看当月订单是否正常显示 4. 统计数据是否正确 #### 3.2 测试全部订单视图 1. 点击"全部订单"切换按钮 2. 查看是否显示所有62个待服务订单 3. 检查订单列表是否包含: - 订单日期 - 服务时间 - 服务名称 - 订单状态 4. 点击订单,跳转到订单详情页面 #### 3.3 测试统计数据 1. 在"全部订单"视图下 2. 查看统计卡片: - 总课时:应该显示所有订单数量 - 已完成:已完成的订单数量 - 待服务:待服务的订单数量(应该是62) #### 3.4 测试视图切换 1. 在"月视图"和"全部订单"之间切换 2. 确认数据正确加载 3. 确认统计数据随视图切换而更新 --- ## 🎯 功能特点 ### 1. 双视图模式 - **月视图**: 显示当月订单,配合日历组件使用 - **全部订单**: 显示所有订单,不限日期范围 ### 2. 数据一致性 - 预约页面和日历页面数据来源统一 - 统计数据实时更新 - 状态映射一致 ### 3. 用户体验 - 视图切换流畅 - 订单列表清晰 - 状态标识明显 - 支持点击查看详情 --- ## 📊 数据说明 ### 订单状态映射 ``` 0: 待支付 1: 待接单(已支付) 2: 待服务(已接单) 3: 服务中 4: 已完成 -1: 已取消 -2: 退款中 -3: 已退款 ``` ### 统计数据计算 - **总课时**: 所有订单数量 - **待服务**: status=1 或 status=2 的订单 - **服务中**: status=3 的订单 - **已完成**: status=4 的订单 --- ## ✅ 完成标志 - [x] 后端接口实现 - [x] 前端API方法添加 - [x] 日历页面改造 - [x] 视图切换功能 - [x] 全部订单列表 - [x] 统计数据更新 - [x] 样式优化 - [x] 文档编写 --- ## 🎉 总结 成功实现了预约与日历数据统一功能: 1. **后端**: 添加了查询所有订单的接口,不限日期范围 2. **前端**: 实现了月视图和全部订单的双视图切换 3. **数据**: 确保预约页面和日历页面数据一致 4. **体验**: 用户可以方便地查看所有订单,不受月份限制 现在用户可以: - 在月视图中查看当月订单 - 在全部订单视图中查看所有62个待服务订单 - 两个视图的统计数据保持一致 - 点击订单查看详情 **下一步**: 1. 执行诊断SQL确认数据分布 2. 编译后端代码 3. 测试功能是否正常 4. 根据测试结果进行优化