一、系统概述
小象买菜系统需要实现即时订单优先机制,确保用户下单后能够快速响应并优先处理即时配送需求,提升用户体验和平台竞争力。
二、即时订单优先机制设计
1. 订单分类与优先级定义
```python
class OrderPriority(Enum):
IMMEDIATE = 1 即时订单(30分钟内)
URGENT = 2 紧急订单(1小时内)
NORMAL = 3 普通订单(2小时以上)
PRE_ORDER = 4 预约订单
```
2. 核心功能模块
2.1 订单接收与分类
```python
def classify_order(order):
"""
根据订单配送时间要求分类
"""
delivery_time = order.get(delivery_time)
current_time = datetime.now()
if delivery_time:
time_diff = (delivery_time - current_time).total_seconds() / 60
if time_diff <= 30:
return OrderPriority.IMMEDIATE
elif time_diff <= 60:
return OrderPriority.URGENT
else:
return OrderPriority.NORMAL
else:
默认即时订单
return OrderPriority.IMMEDIATE
```
2.2 优先级队列管理
```python
import heapq
class OrderQueue:
def __init__(self):
self.queue = []
self.index = 0 用于处理相同优先级时的顺序
def push(self, order):
priority = order[priority].value
使用元组(优先级, 插入顺序, 订单)确保正确排序
heapq.heappush(self.queue, (priority, self.index, order))
self.index += 1
def pop(self):
if not self.queue:
return None
return heapq.heappop(self.queue)[2] 返回订单对象
```
2.3 骑手分配算法
```python
def assign_rider(orders, riders):
"""
优先分配即时订单给最近且空闲的骑手
"""
immediate_orders = [o for o in orders if o[priority] == OrderPriority.IMMEDIATE]
other_orders = [o for o in orders if o[priority] != OrderPriority.IMMEDIATE]
assigned_orders = []
优先处理即时订单
for order in immediate_orders:
best_rider = find_best_rider(order, riders)
if best_rider:
best_rider[status] = busy
best_rider[current_order] = order
assigned_orders.append(order)
处理其他订单
for order in other_orders:
best_rider = find_best_rider(order, riders)
if best_rider:
best_rider[status] = busy
best_rider[current_order] = order
assigned_orders.append(order)
return assigned_orders
def find_best_rider(order, riders):
简单实现:找最近的空闲骑手
实际应用中应考虑更多因素如骑手方向、负载等
available_riders = [r for r in riders if r[status] == idle]
if not available_riders:
return None
模拟计算距离(实际应用中应使用地理编码服务)
for rider in available_riders:
rider[distance] = calculate_distance(rider[location], order[pickup_address])
按距离排序
available_riders.sort(key=lambda x: x[distance])
return available_riders[0] if available_riders else None
```
3. 数据库设计优化
```sql
-- 订单表增加优先级字段
CREATE TABLE orders (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL,
items JSON NOT NULL,
total_amount DECIMAL(10,2) NOT NULL,
delivery_time DATETIME NOT NULL,
priority TINYINT NOT NULL DEFAULT 3, -- 默认普通订单
status VARCHAR(20) NOT NULL DEFAULT pending,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_priority (priority),
INDEX idx_delivery_time (delivery_time)
);
-- 骑手表
CREATE TABLE riders (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
phone VARCHAR(20) NOT NULL,
current_location POINT NOT NULL,
status VARCHAR(20) NOT NULL DEFAULT idle, -- idle, busy, offline
INDEX idx_rider_status (status)
);
```
三、系统实现关键点
1. 实时订单处理流程
1. 用户下单时,系统根据配送时间自动分类订单优先级
2. 即时订单进入高优先级队列,普通订单进入普通队列
3. 调度系统实时监控订单队列和骑手状态
4. 优先为即时订单分配最近可用的骑手
5. 实时更新订单状态和预计送达时间
2. 骑手端实现
```javascript
// 骑手APP实时推送逻辑
function pushOrderToRider(riderId, order) {
// 检查骑手状态
if (riderStatus[riderId] !== idle) return false;
// 发送订单信息到骑手APP
socket.emit(new_order, {
riderId: riderId,
orderId: order.id,
pickupAddress: order.pickupAddress,
dropoffAddress: order.dropoffAddress,
items: order.items,
priority: order.priority
});
// 更新骑手状态
updateRiderStatus(riderId, busy, order.id);
return true;
}
```
3. 用户端展示
```html
配送信息
预计送达时间: {{ estimatedTime }}
即时订单
<script>
// 根据订单类型显示不同提示
if (order.priority === 1) {
showImmediateOrderNotification();
trackOrderInRealTime(); // 实时追踪
}
```
四、性能优化策略
1. 索引优化:为订单表的优先级和创建时间字段建立复合索引
2. 缓存策略:使用Redis缓存热门区域的骑手位置和订单数据
3. 异步处理:非关键操作(如日志记录、数据分析)采用异步处理
4. 负载均衡:订单处理服务采用多实例部署,通过Nginx负载均衡
5. 数据库分片:按区域对订单数据进行分片存储
五、监控与告警
1. 实时监控即时订单处理时效
2. 监控骑手响应时间和送达准时率
3. 设置阈值告警:
- 即时订单超过10分钟未分配骑手
- 骑手平均响应时间超过3分钟
- 即时订单送达准时率低于95%
六、测试方案
1. 单元测试:验证订单分类逻辑、优先级队列操作
2. 压力测试:模拟高峰时段大量即时订单涌入
3. A/B测试:对比新旧系统在即时订单处理上的表现
4. 灰度发布:先在部分区域上线新机制,观察效果后再全面推广
七、扩展功能
1. 动态加价机制:高峰时段对即时订单实施动态加价
2. 智能预派单:根据用户下单习惯提前预派骑手
3. 多级优先级:在即时订单内再细分不同紧急程度
4. 异常处理:骑手拒单、取消订单等场景的自动重派机制
通过以上设计和实现,小象买菜系统能够有效保障即时订单的优先处理,提升用户满意度和平台运营效率。