You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP开发需求:按位置将订单均衡分配给对应拣货员

嘿,这个拣货员订单均衡分配的需求太实用了,咱们直接来搞个通用方案,不管你有多少位置、多少拣货员、多少订单都能完美适配~

核心思路

咱们的目标是让每个位置的拣货员分到的订单数尽可能平均,最多只差1个(毕竟如果订单总数没法被拣货员数量整除,肯定有人多拿1个,这是最均衡的结果)。具体逻辑可以拆成这几步:

  • 对每个位置单独处理(不同位置的拣货员和订单是独立的)
  • 先算每个拣货员的「基础订单数」:总订单数 ÷ 拣货员数量(取整数部分)
  • 再算「剩余订单数」:总订单数 % 拣货员数量(也就是分完基础数后多出来的订单)
  • 让前N个拣货员(N等于剩余订单数)各多拿1个订单,剩下的拣货员拿基础数
  • 按这个数量把订单依次分给每个拣货员
通用代码实现(以Python为例)

我写了个可复用的函数,直接套你的数据就行:

def assign_orders_to_pickers(location_orders, pickers):
    # 初始化每个拣货员的分配结果字典
    assignment = {picker: [] for picker in pickers}
    total_orders = len(location_orders)
    picker_count = len(pickers)
    
    # 边界处理:没有拣货员直接返回空分配
    if picker_count == 0:
        return assignment
    
    # 计算基础分配数和额外需要分配的订单数
    base_order_num = total_orders // picker_count
    extra_order_num = total_orders % picker_count
    
    current_order_idx = 0
    for idx, picker in enumerate(pickers):
        # 前extra_order_num个拣货员多拿1个订单
        assign_num = base_order_num + 1 if idx < extra_order_num else base_order_num
        # 截取对应数量的订单分配给当前拣货员
        assignment[picker] = location_orders[current_order_idx:current_order_idx + assign_num]
        current_order_idx += assign_num
    
    return assignment

# 把你的数据整理成结构化的格式
location_picker_map = {
    'location 1': ['picker A', 'picker D'],
    'location 2': ['picker B', 'picker C']
}

location_order_map = {
    'location 1': [
        {'order_id': 'order_001', 'customer name': 'Alice', 'products': ['prod_loc1_01']},
        {'order_id': 'order_002', 'customer name': 'Bob', 'products': ['prod_loc1_02']}
    ],
    'location 2': [
        {'order_id': 'order_003', 'customer name': 'Charlie', 'products': ['prod_loc2_01']},
        {'order_id': 'order_004', 'customer name': 'David', 'products': ['prod_loc2_02']},
        {'order_id': 'order_005', 'customer name': 'Eve', 'products': ['prod_loc2_03']},
        {'order_id': 'order_006', 'customer name': 'Frank', 'products': ['prod_loc2_04']}
    ]
}

# 遍历所有位置完成分配
final_result = {}
for location, pickers in location_picker_map.items():
    orders = location_order_map.get(location, [])
    final_result[location] = assign_orders_to_pickers(orders, pickers)

# 打印分配结果看看
for location, assignments in final_result.items():
    print(f"\n=== {location} 分配结果 ===")
    for picker, assigned_orders in assignments.items():
        print(f"{picker} 分到 {len(assigned_orders)} 个订单:")
        for order in assigned_orders:
            print(f"  - 订单ID: {order['order_id']}, 客户: {order['customer name']}")
运行结果(对应你的示例)

运行上面的代码后,输出会是:

=== location 1 分配结果 ===
picker A 分到 1 个订单:
  - 订单ID: order_001, 客户: Alice
picker D 分到 1 个订单:
  - 订单ID: order_002, 客户: Bob

=== location 2 分配结果 ===
picker B 分到 2 个订单:
  - 订单ID: order_003, 客户: Charlie
  - 订单ID: order_004, 客户: David
picker C 分到 2 个订单:
  - 订单ID: order_005, 客户: Eve
  - 订单ID: order_006, 客户: Frank
额外优化点

如果需要更灵活的分配,可以加这几个小调整:

  • 随机分配订单:如果不想按订单顺序分配,可以在函数开头先打乱订单数组(Python里用import random; random.shuffle(location_orders))
  • 按订单复杂度分配:如果有的订单商品多,可以给订单加权重,然后按权重总和除以拣货员数,再分配
  • 空订单/无拣货员处理:函数已经做了边界处理,就算某个位置没订单或者没拣货员,也不会报错

内容的提问来源于stack exchange,提问作者futureweb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 08:37:53