《代购集运系统的核心技术:合箱与分箱算法怎么设计?资深架构师详解》
集运是反向海淘业务的心脏。客户从多个淘宝/1688店铺买的东西,送到你的国内仓库,然后你打包成一个包裹发往海外。这个过程中的“合箱”与“分箱”逻辑,是整个集运系统最复杂的算法之一。
我以Taocarts跨境独立站系统的集运模块为例,讲讲合箱分箱的算法设计。
业务场景:
客户A买了3件商品:一件衣服(重0.5kg,体积30x20x5cm)、一个杯子(重0.3kg,体积10x10x10cm)、一个玩偶(重0.8kg,体积40x30x15cm)。
三个商品分别到达国内仓库,入库时间是不同的。
系统需要决定:合箱还是分箱?如果合箱,最终包裹的尺寸和重量怎么计算?
算法核心原则:平衡“运费最优”和“时效可控”。
1. 合箱判断逻辑
python
def should_combine(items):
total_weight = sum(item.weight for item in items)
total_volume = sum(item.volume for item in items)
# 如果总重量超过集运限重(比如30kg),则分箱
if total_weight > MAX_WEIGHT_PER_PACKAGE:
return False
# 如果合并后的体积超过渠道限制(比如长+宽+高 < 200cm),则分箱
if total_volume > MAX_VOLUME:
return False
# 如果商品中有易碎品,建议单独包装
if any(item.fragile for item in items):
return False
return True
2. 分箱策略(贪心算法)
当需要分箱时,系统会尝试将商品分配到多个包裹中,使得总运费最低。常用“首次适应递减法”(First Fit Decreasing):
将所有商品按体积/重量降序排序。
依次将每个商品放入第一个能装下它的箱子。
如果所有现有箱子都放不下,则开新箱子。
3. 体积重 vs 实际重
国际物流中,运费取“实际重”和“体积重”的较大值。体积重 = 长×宽×高/5000(单位:cm,结果kg)。合箱后,不同商品的摆放方向会影响体积重。Taocarts的算法会尝试“旋转”商品来降低总体积,但为了不复杂化,通常采用“简单合并法”:将每个商品的外箱尺寸进行“外包络”(三个商品的长、宽、高各自取最大值后相加)。
4. 用户可干预
Taocarts允许客户在前台选择“合箱策略”:
经济合箱:尽可能合在一起,不管体积重。
快速分箱:每件商品单独打包,发最快的快递(但运费贵)。
指定合箱:客户可以手动勾选哪些商品一起打包。
性能考虑:合箱算法在仓库PDA端执行,需要在0.5秒内完成。Taocarts使用Redis缓存商品尺寸数据,并用C语言扩展实现核心计算,保证了高并发下的响应速度。
如果你正在开发代购系统源码,合箱分箱算法建议从简单的“全部合箱”开始,等业务量大了再迭代智能算法。但数据结构要预留好:商品入库时记录准确的长宽高和重量。