一、功能概述
订单状态追踪是生鲜电商系统的核心功能之一,它允许用户实时查看订单从下单到配送完成的整个生命周期状态,提升用户体验和信任度。
二、系统架构设计
1. 微服务架构
- 订单服务:处理订单创建、修改、状态变更等核心逻辑
- 支付服务:处理支付相关操作和状态同步
- 仓储服务:管理商品出库、分拣等状态
- 配送服务:跟踪配送员位置和配送状态
- 通知服务:向用户推送状态变更消息
2. 数据库设计
```sql
-- 订单主表
CREATE TABLE orders (
order_id VARCHAR(32) PRIMARY KEY,
user_id VARCHAR(32) NOT NULL,
total_amount DECIMAL(10,2) NOT NULL,
status TINYINT NOT NULL DEFAULT 0 COMMENT 0:待支付 1:已支付待处理 2:处理中 3:已发货 4:配送中 5:已完成 6:已取消,
create_time DATETIME NOT NULL,
update_time DATETIME NOT NULL
);
-- 订单状态历史表
CREATE TABLE order_status_history (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
order_id VARCHAR(32) NOT NULL,
status TINYINT NOT NULL,
status_desc VARCHAR(255),
operator_type TINYINT COMMENT 0:系统 1:用户 2:商家 3:配送员,
operator_id VARCHAR(32),
create_time DATETIME NOT NULL,
FOREIGN KEY (order_id) REFERENCES orders(order_id)
);
-- 配送信息表
CREATE TABLE delivery_info (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
order_id VARCHAR(32) NOT NULL,
courier_id VARCHAR(32),
courier_name VARCHAR(50),
courier_phone VARCHAR(20),
current_location VARCHAR(255),
estimated_arrival_time DATETIME,
actual_arrival_time DATETIME,
FOREIGN KEY (order_id) REFERENCES orders(order_id)
);
```
三、核心功能实现
1. 订单状态流转
```java
public enum OrderStatus {
PENDING_PAYMENT(0, "待支付"),
PAID(1, "已支付待处理"),
PROCESSING(2, "处理中"),
SHIPPED(3, "已发货"),
DELIVERING(4, "配送中"),
COMPLETED(5, "已完成"),
CANCELLED(6, "已取消");
private int code;
private String desc;
// 构造方法、getter等
}
public class OrderService {
public void updateOrderStatus(String orderId, OrderStatus newStatus, String operatorType) {
// 1. 查询订单
Order order = orderRepository.findById(orderId);
if (order == null) {
throw new RuntimeException("订单不存在");
}
// 2. 验证状态流转是否合法
if (!isValidStatusTransition(order.getStatus(), newStatus)) {
throw new RuntimeException("非法状态流转");
}
// 3. 更新订单状态
order.setStatus(newStatus);
order.setUpdateTime(new Date());
orderRepository.save(order);
// 4. 记录状态历史
OrderStatusHistory history = new OrderStatusHistory();
history.setOrderId(orderId);
history.setStatus(newStatus.getCode());
history.setStatusDesc(newStatus.getDesc());
history.setOperatorType(operatorType);
history.setCreateTime(new Date());
orderStatusHistoryRepository.save(history);
// 5. 触发后续操作
triggerStatusActions(orderId, newStatus);
}
private boolean isValidStatusTransition(OrderStatus current, OrderStatus next) {
// 实现状态流转规则验证
// 例如:待支付 -> 已支付 是合法的
// 已完成 -> 处理中 是非法的
}
private void triggerStatusActions(String orderId, OrderStatus newStatus) {
// 根据状态触发不同操作
switch (newStatus) {
case PAID:
// 通知仓储准备商品
warehouseService.prepareItems(orderId);
break;
case SHIPPED:
// 分配配送员
deliveryService.assignCourier(orderId);
break;
case COMPLETED:
// 完成订单,可进行满意度调查
userService.sendSatisfactionSurvey(orderId);
break;
}
}
}
```
2. 实时位置追踪
```javascript
// 前端实现 - 使用WebSocket实时更新配送员位置
const socket = new WebSocket(wss://your-api-domain/ws/delivery-tracking);
socket.onmessage = function(event) {
const data = JSON.parse(event.data);
if (data.type === location_update) {
updateMap(data.orderId, data.latitude, data.longitude);
}
};
function updateMap(orderId, lat, lng) {
// 使用地图API更新配送员位置标记
const marker = getMarkerForOrder(orderId);
marker.setPosition(new google.maps.LatLng(lat, lng));
}
```
3. 状态历史查询
```java
public List
getOrderStatusHistory(String orderId) {
return orderStatusHistoryRepository.findByOrderIdOrderByCreateTimeDesc(orderId);
}
```
四、前端展示实现
1. 订单详情页状态展示
```html
1
订单创建
2023-05-10 10:00:00
2
支付完成
2023-05-10 10:05:00
3
配送中
当前状态
配送员:张三 1381234
当前位置:XX路与XX路交叉口
预计到达:12:30
```
2. 实时地图展示
```javascript
// 使用高德/百度地图API展示配送员位置
function initMap(orderId) {
const map = new AMap.Map(map-container, {
zoom: 15,
center: [116.397428, 39.90923] // 默认北京中心点
});
// 定时获取配送员位置
setInterval(() => {
fetch(`/api/orders/${orderId}/delivery-location`)
.then(response => response.json())
.then(data => {
if (data.latitude && data.longitude) {
const marker = new AMap.Marker({
position: [data.longitude, data.latitude],
map: map
});
map.setCenter([data.longitude, data.latitude]);
}
});
}, 5000); // 每5秒更新一次
}
```
五、关键技术点
1. 状态机模式:确保订单状态只能按照预定义的路径流转
2. 事件溯源:记录所有状态变更事件,便于审计和回溯
3. 实时推送:使用WebSocket或Server-Sent Events实现状态实时更新
4. 地理围栏:结合配送员位置和用户地址,预测准确到达时间
5. 分布式事务:确保订单状态变更与库存、支付等操作的原子性
六、测试策略
1. 单元测试:验证状态流转逻辑的正确性
2. 集成测试:测试各服务间的状态同步
3. 性能测试:模拟高并发订单状态变更场景
4. 用户体验测试:确保状态显示及时、准确、易理解
七、扩展功能
1. 异常状态处理:如配送延迟、商品缺货等特殊情况的处理
2. 多端同步:确保APP、小程序、网页端状态一致
3. 历史轨迹:保存配送员历史位置,支持回放查看
4. 智能预测:基于历史数据预测各状态耗时
通过以上实现,叮咚买菜系统可以为用户提供清晰、实时、准确的订单状态追踪体验,增强用户信任度和满意度。