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