订单拆分与合并策略:复杂场景下的智能决策
引言 在电商场景中,一个看似简单的订单可能面临复杂的履约挑战:商品分布在不同仓库、部分商品是预售、有些需要跨境发货。这时,订单拆分与合并就成为OMS系统的核心能力。 订单拆分与合并不仅仅是技术问题,更是业务策略问题。拆得太细,物流成本高、用户体验差;合得太粗,库存利用率低、发货时效慢。如何在成本、时效、体验之间找到最优解?本文将从第一性原理出发,系统性地探讨这个问题。 为什么需要订单拆分? 业务驱动因素 订单拆分的本质是将一个逻辑订单按照履约能力拆分成多个物理订单。驱动因素包括: 1. 库存分布不一致 用户订单: - 商品A × 2(华东仓有货) - 商品B × 1(华南仓有货) - 商品C × 1(华北仓有货) 拆分策略:按仓库拆分成3个子订单 2. 商品属性差异 用户订单: - 普通商品(现货) - 预售商品(7天后发货) - 大件商品(需要专门配送) 拆分策略:按发货时效和物流方式拆分 3. 跨境与国内混合 用户订单: - 国内商品(保税仓) - 跨境商品(海外直邮) 拆分策略:按清关类型拆分 拆分的核心目标 最大化履约效率:让每个子订单都能快速发货 优化物流成本:减少不必要的拆分 保障用户体验:透明化拆分信息,合理预期 提高库存周转:优先消化滞销库存 订单拆分的典型场景 场景1:跨仓拆分 业务场景: 用户购买了3件商品,分别在上海仓、北京仓、广州仓有库存。 拆分策略: class CrossWarehouseSplitStrategy: """跨仓拆分策略""" def split(self, order, inventory_map): """ 按仓库拆分订单 Args: order: 原始订单 inventory_map: {sku_id: [warehouse_id, stock]} Returns: List[SubOrder]: 子订单列表 """ # 按仓库分组商品 warehouse_groups = defaultdict(list) for item in order.items: warehouse_id = self._find_best_warehouse( item.sku_id, item.quantity, inventory_map, order.delivery_address ) warehouse_groups[warehouse_id].append(item) # 生成子订单 sub_orders = [] for warehouse_id, items in warehouse_groups.items(): sub_order = self._create_sub_order( parent_order=order, warehouse_id=warehouse_id, items=items ) sub_orders.append(sub_order) return sub_orders def _find_best_warehouse(self, sku_id, quantity, inventory_map, delivery_address): """选择最优仓库""" available_warehouses = [ (wh_id, stock) for wh_id, stock in inventory_map.get(sku_id, []) if stock >= quantity ] if not available_warehouses: raise InsufficientStockException(sku_id) # 按距离排序,选择最近的仓库 return self._sort_by_distance( available_warehouses, delivery_address )[0][0] 关键决策点: ...