一、系统架构设计
1. 整体架构
采用微服务架构,主要包含以下核心服务:
- 用户服务:处理用户注册、登录、个人信息管理
- 商品服务:管理商品信息、库存、分类
- 订单服务:核心订单处理与状态管理
- 配送服务:骑手管理、配送路线规划
- 通知服务:实时消息推送
- 追踪服务:订单实时位置追踪
2. 技术栈选择
- 前端:React Native/Flutter(跨平台移动端) + Vue/React(管理后台)
- 后端:Spring Cloud/Dubbo(微服务框架)
- 数据库:MySQL(关系型数据) + MongoDB(日志/追踪数据)
- 实时通信:WebSocket + Redis Pub/Sub
- 地图服务:高德/百度地图API
- 消息队列:Kafka/RabbitMQ
二、订单实时追踪核心实现
1. 订单状态机设计
```mermaid
stateDiagram-v2
[*] --> 待支付
待支付 --> 已取消: 用户取消
待支付 --> 待接单: 支付成功
待接单 --> 配送中: 骑手接单
配送中 --> 已完成: 用户确认收货
配送中 --> 异常中: 出现配送问题
异常中 --> 配送中: 问题解决
异常中 --> 已取消: 无法解决
```
2. 实时位置追踪实现
方案一:WebSocket长连接
```java
// 订单服务端WebSocket实现
@ServerEndpoint("/ws/order/{orderId}")
public class OrderTrackingWebSocket {
@OnOpen
public void onOpen(Session session, @PathParam("orderId") String orderId) {
// 订阅订单位置更新
RedisPubSub.subscribe("order:" + orderId + ":location", message -> {
try {
session.getBasicRemote().sendText(message);
} catch (IOException e) {
e.printStackTrace();
}
});
}
// 其他生命周期方法...
}
```
方案二:轮询+SSE(Server-Sent Events)
```javascript
// 前端实现
const eventSource = new EventSource(`/api/order/tracking/${orderId}`);
eventSource.onmessage = (event) => {
const data = JSON.parse(event.data);
updateOrderMap(data.location, data.status);
};
```
3. 骑手位置上报
```java
// 骑手APP端位置上报接口
@PostMapping("/api/rider/location")
public ResponseEntity<?> updateRiderLocation(
@RequestBody RiderLocationUpdateDTO dto) {
// 保存到Redis
redisTemplate.opsForHash().put(
"rider:location:" + dto.getRiderId(),
"timestamp", System.currentTimeMillis(),
"location", dto.getLocation()
);
// 更新关联订单的追踪信息
orderTrackingService.updateOrderLocation(
dto.getOrderId(), dto.getLocation()
);
return ResponseEntity.ok().build();
}
```
三、数据库设计
订单表(orders)
```sql
CREATE TABLE orders (
id VARCHAR(32) PRIMARY KEY,
user_id VARCHAR(32) NOT NULL,
total_amount DECIMAL(10,2) NOT NULL,
status ENUM(PENDING_PAYMENT, PAID, PROCESSING,
SHIPPING, DELIVERED, CANCELLED, EXCEPTION) NOT NULL,
create_time DATETIME NOT NULL,
update_time DATETIME NOT NULL,
rider_id VARCHAR(32),
estimated_arrival DATETIME,
INDEX idx_user (user_id),
INDEX idx_status (status)
);
```
订单追踪日志(order_tracking_log)
```sql
CREATE TABLE order_tracking_log (
id VARCHAR(32) PRIMARY KEY,
order_id VARCHAR(32) NOT NULL,
status VARCHAR(32) NOT NULL,
location POINT NOT NULL,
address VARCHAR(255),
rider_id VARCHAR(32),
event_time DATETIME NOT NULL,
INDEX idx_order (order_id),
SPATIAL INDEX(location)
);
```
四、关键功能实现
1. 订单状态变更处理
```java
@Transactional
public void updateOrderStatus(String orderId, OrderStatus newStatus) {
// 更新订单状态
orderRepository.updateStatus(orderId, newStatus);
// 记录状态变更历史
OrderStatusHistory history = new OrderStatusHistory();
history.setOrderId(orderId);
history.setOldStatus(getCurrentStatus(orderId));
history.setNewStatus(newStatus);
historyRepository.save(history);
// 触发实时通知
if (newStatus == OrderStatus.SHIPPING) {
// 开始追踪
trackingService.startTracking(orderId);
}
}
```
2. 实时地图展示
```javascript
// 前端地图组件
function OrderTrackingMap({ orderId }) {
const [location, setLocation] = useState(null);
const [status, setStatus] = useState(null);
useEffect(() => {
const eventSource = new EventSource(`/api/order/tracking/${orderId}`);
eventSource.onmessage = (event) => {
const data = JSON.parse(event.data);
setLocation(data.location);
setStatus(data.status);
// 更新地图标记
if (mapRef.current && data.location) {
new AMap.Marker({
map: mapRef.current,
position: [data.location.lng, data.location.lat]
});
}
};
return () => eventSource.close();
}, [orderId]);
// 渲染地图...
}
```
五、性能优化措施
1. 位置数据缓存:使用Redis存储骑手实时位置,设置合理TTL
2. 批量更新:骑手位置每5秒批量上报一次,减少网络开销
3. 地理索引:为MongoDB中的位置数据创建2dsphere索引
4. 连接池管理:合理配置WebSocket连接池大小
5. 分区策略:按区域对订单数据进行分区,提高查询效率
六、安全考虑
1. 身份验证:所有追踪接口需验证用户权限
2. 数据脱敏:骑手位置信息仅对关联订单用户可见
3. 频率限制:防止位置上报接口被滥用
4. HTTPS加密:所有通信使用SSL/TLS加密
七、部署方案
1. 容器化部署:使用Docker+Kubernetes进行服务编排
2. 多可用区部署:确保高可用性
3. CDN加速:静态资源通过CDN分发
4. 监控告警:集成Prometheus+Grafana监控系统状态
八、扩展功能建议
1. 预计到达时间(ETA)计算:基于历史数据和实时路况预测
2. 异常检测:自动识别配送异常情况
3. 多级追踪:支持商品级、包裹级追踪
4. 历史轨迹回放:用户可查看订单完整配送路径
通过以上方案实现,小象买菜系统可以为用户提供流畅的订单实时追踪体验,增强用户对平台的信任度和满意度。