一、系统架构设计
1. 整体架构
- 前端层:用户端APP/小程序 + 骑手端APP + 管理后台
- 服务层:订单服务、配送服务、通知服务、API网关
- 数据层:MySQL(关系型数据)、Redis(缓存)、MongoDB(日志数据)
- 第三方服务:地图API(高德/百度)、短信/推送服务
2. 核心模块
- 订单管理模块
- 配送调度模块
- 实时定位模块
- 通知中心模块
- 数据可视化模块
二、订单实时追踪实现技术
1. 订单状态流转设计
```mermaid
graph TD
A[用户下单] --> B[商家接单]
B --> C[骑手接单]
C --> D[骑手取货]
D --> E[配送中]
E --> F[已完成]
E --> G[异常处理]
```
2. 实时位置追踪实现
方案一:WebSocket长连接
```java
// 服务端WebSocket实现示例
@ServerEndpoint("/order/track/{orderId}")
public class OrderTrackEndpoint {
@OnOpen
public void onOpen(Session session, @PathParam("orderId") String orderId) {
// 订阅订单位置更新
OrderPositionService.subscribe(orderId, session);
}
@OnClose
public void onClose(Session session, @PathParam("orderId") String orderId) {
// 取消订阅
OrderPositionService.unsubscribe(orderId, session);
}
}
```
方案二:轮询+SSE(Server-Sent Events)
```javascript
// 前端SSE实现示例
const eventSource = new EventSource(`/api/orders/${orderId}/track`);
eventSource.onmessage = function(e) {
const data = JSON.parse(e.data);
updateOrderPosition(data);
};
```
3. 骑手位置上报
```java
// 骑手端位置上报接口
@PostMapping("/api/rider/location")
public ResponseEntity<?> updateLocation(
@RequestBody RiderLocationUpdateDTO dto,
@RequestHeader("X-Rider-Token") String token) {
// 验证骑手身份
Rider rider = riderAuthService.validate(token);
// 保存位置到Redis并设置过期时间
redisTemplate.opsForGeo().add(
"rider:locations:" + rider.getRegion(),
new Point(dto.getLng(), dto.getLat()),
rider.getId()
);
// 更新订单关联的骑手位置
orderService.updateRiderLocation(rider.getId(), dto);
return ResponseEntity.ok().build();
}
```
4. 地图轨迹绘制
- 使用地图API的Polyline功能绘制骑手移动轨迹
- 关键点:
- 定期获取骑手位置坐标
- 计算两点间距离和方向
- 优化绘制性能(减少不必要的重绘)
三、关键功能实现
1. 订单状态实时更新
```sql
-- 订单状态变更日志表
CREATE TABLE order_status_log (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
order_id VARCHAR(32) NOT NULL,
status VARCHAR(20) NOT NULL,
status_desc VARCHAR(100),
operator_type ENUM(USER, MERCHANT, RIDER, SYSTEM) NOT NULL,
operator_id VARCHAR(32),
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
INDEX idx_order_id (order_id)
);
```
2. 预计送达时间计算
```python
def calculate_eta(order):
基础时间(取货+配送)
base_time = 30 分钟
距离因素
distance = get_distance(order[pickup_address], order[delivery_address])
distance_factor = distance / 1000 每公里增加时间
交通状况
traffic_condition = get_traffic_condition(order[delivery_address])
traffic_factor = 1.0
if traffic_condition == CONGESTED:
traffic_factor = 1.5
elif traffic_condition == SLOW:
traffic_factor = 1.2
商家准备时间
merchant = get_merchant_info(order[merchant_id])
prep_time = merchant[avg_prep_time]
计算ETA
eta = base_time + (distance_factor * 5) + prep_time
eta *= traffic_factor
return round(eta)
```
3. 异常情况处理
```java
// 异常检测服务
@Service
public class OrderExceptionDetector {
@Autowired
private OrderRepository orderRepository;
@Autowired
private NotificationService notificationService;
@Scheduled(fixedRate = 60000) // 每分钟检查一次
public void detectAbnormalOrders() {
List orders = orderRepository.findByStatusIn(
Arrays.asList("RIDER_PICKUP", "DELIVERING")
);
for (Order order : orders) {
// 1. 骑手位置异常检测(长时间不动)
if (isRiderStuck(order)) {
handleStuckRider(order);
continue;
}
// 2. 配送超时检测
if (isDeliveryOverdue(order)) {
handleOverdueDelivery(order);
}
}
}
private void handleStuckRider(Order order) {
// 重新分配骑手或联系客服
notificationService.sendToCustomer(
order.getCustomerId(),
"检测到配送异常,我们将尽快为您处理"
);
// ...其他处理逻辑
}
}
```
四、性能优化方案
1. 位置数据优化:
- 使用Redis GeoHash存储骑手位置
- 设置合理的位置上报频率(如每30秒一次)
- 对历史位置数据进行压缩存储
2. 消息推送优化:
- 使用长连接而非轮询
- 实现消息合并(短时间内多次更新合并为一次推送)
- 对不同用户设备类型采用不同推送策略
3. 数据库优化:
- 订单状态变更使用单独的日志表
- 对高频查询字段建立索引
- 考虑使用分库分表策略
五、安全与隐私考虑
1. 数据加密:
- 位置数据传输使用HTTPS
- 敏感信息存储加密
2. 权限控制:
- 骑手只能查看自己负责的订单位置
- 用户只能查看自己订单的配送信息
3. 隐私保护:
- 骑手位置数据设置合理的保留期限
- 提供用户隐私设置选项
六、测试方案
1. 单元测试:
- 订单状态流转测试
- 位置计算准确性测试
2. 集成测试:
- 端到端订单追踪流程测试
- 异常场景模拟测试
3. 性能测试:
- 高并发订单追踪测试
- 长时间运行稳定性测试
七、部署方案
1. 容器化部署:
- 使用Docker容器化各个服务
- Kubernetes进行编排管理
2. 监控告警:
- Prometheus + Grafana监控系统指标
- 关键业务指标告警
3. 灰度发布:
- 先在小范围用户中测试新功能
- 逐步扩大用户范围
通过以上方案,可以实现一个稳定、高效的订单实时追踪系统,提升用户体验和平台运营效率。