一、系统架构设计
1. 整体架构
- 前端层:用户端小程序/APP + 配送员端APP
- 服务层:订单服务、配送服务、通知服务、API网关
- 数据层:MySQL(订单主数据) + Redis(实时状态缓存) + MongoDB(日志数据)
- 第三方服务:地图API(高德/百度)、短信/推送服务
2. 实时追踪核心组件
- WebSocket服务:建立长连接实现实时数据推送
- 订单状态机:定义订单各状态转换规则
- 位置服务:配送员位置采集与处理
- 事件总线:系统内各服务间通信
二、订单状态设计
1. 订单生命周期状态
```
待支付 → 已支付 → 商家接单 → 商家备货 → 配送员接单 → 配送中 → 已送达 → 已完成
```
2. 状态变更事件
- 支付成功事件
- 商家操作事件(接单/拒单)
- 配送员操作事件(接单/取货/送达)
- 异常事件(取消/退款)
三、实时追踪实现方案
1. 技术选型
- 实时通信:WebSocket + MQTT(轻量级可选)
- 位置服务:GPS定位 + 基站辅助定位
- 数据同步:Redis发布订阅 + 数据库变更捕获(CDC)
2. 配送员位置追踪实现
```java
// 配送员位置上报示例(配送员APP端)
public class DeliveryLocationUploader {
public void uploadLocation(String deliveryId, double latitude, double longitude) {
// 1. 校验配送员身份
// 2. 保存位置到Redis(带时间戳)
redisTemplate.opsForZSet().add(
"delivery:location:" + deliveryId,
new GeoLocation(String.valueOf(latitude + "," + longitude),
new Point(latitude, longitude)),
System.currentTimeMillis()
);
// 3. 发布位置变更事件
eventPublisher.publish("DELIVERY_LOCATION_UPDATED",
new DeliveryLocationEvent(deliveryId, latitude, longitude));
}
}
```
3. 订单状态实时推送实现
```javascript
// 前端WebSocket连接示例
const socket = new WebSocket(wss://api.xiaoxiang.com/order-tracking);
socket.onopen = function() {
// 订阅特定订单
socket.send(JSON.stringify({
type: subscribe,
orderId: 123456
}));
};
socket.onmessage = function(event) {
const data = JSON.parse(event.data);
// 更新订单状态UI
updateOrderStatus(data.status);
// 更新配送员位置
if(data.location) {
updateDeliveryMap(data.location);
}
};
```
4. 服务端推送逻辑
```python
Python Flask WebSocket处理示例
@socketio.on(subscribe)
def handle_subscribe(data):
order_id = data[orderId]
加入订单追踪房间
join_room(order_id)
发送当前状态快照
current_status = get_order_status(order_id)
emit(status_update, current_status, room=order_id)
@socketio.on(disconnect)
def handle_disconnect():
清理资源
pass
订单状态变更时触发
def notify_order_status_change(order_id, new_status):
获取关联的所有连接
rooms = get_rooms_for_order(order_id)
for room in rooms:
emit(status_update, {
status: new_status,
timestamp: datetime.now()
}, room=room)
```
四、关键功能实现
1. 订单状态流处理
```java
// 使用状态机模式处理订单状态转换
public class OrderStateMachine {
public void transition(Order order, OrderEvent event) {
switch(order.getStatus()) {
case PENDING_PAYMENT:
if(event == PAYMENT_SUCCESS) {
order.setStatus(ORDER_CONFIRMED);
notifyStatusChange(order);
}
break;
case ORDER_CONFIRMED:
if(event == MERCHANT_ACCEPTED) {
order.setStatus(PREPARING);
notifyStatusChange(order);
}
break;
// 其他状态转换...
}
}
}
```
2. 配送员位置聚合
```sql
-- 获取配送员最新位置(Redis Geo查询)
GEORADIUS delivery:location:delivery_123 116.404 39.915 1 km WITHCOORD
```
3. 预计送达时间计算
```javascript
// 简单ETA计算示例
function calculateETA(startLocation, endLocation, currentSpeed) {
const distance = getDistance(startLocation, endLocation); // 使用地图API计算距离
const timeInMinutes = distance / (currentSpeed || 15); // 默认速度15km/h
return new Date(Date.now() + timeInMinutes * 60 * 1000);
}
```
五、异常处理与优化
1. 异常场景处理
- 网络中断:前端重连机制 + 离线消息队列
- 位置更新延迟:设置合理的心跳间隔(30-60秒)
- 状态不同步:服务端状态快照机制
2. 性能优化
- 位置数据聚合:按时间窗口合并位置更新
- WebSocket连接管理:按订单维度管理连接
- 缓存策略:热点订单状态缓存
六、测试方案
1. 单元测试:各状态转换逻辑
2. 集成测试:WebSocket连接与消息推送
3. 压力测试:模拟高并发订单状态变更
4. 真实场景测试:配送员移动轨迹模拟
七、部署与监控
1. 容器化部署:Docker + Kubernetes
2. 监控指标:
- WebSocket连接数
- 位置更新频率
- 状态变更延迟
3. 告警规则:
- 连接异常断开
- 位置更新停滞
- 状态变更延迟过高
通过以上方案实现,小象买菜系统可以为用户提供实时的订单状态追踪和配送员位置查看功能,提升用户体验和平台信任度。