mcpField
W
warehouse-design

warehouse-design

github.com/kishorkukreja其他8479 次安装3 周前更新
代码仓库

关于 warehouse-design

warehouse-design 是面向仓库设计人员和运营团队的设施规划技能,涵盖空间测算、布局、存储、设备、吞吐量、自动化与绩效指标。

主要功能

  1. 01评估业务、运营和场地需求
  2. 02估算存储空间与仓库容量
  3. 03比较布局和存储系统
  4. 04选择物料搬运设备
  5. 05分析月台、拣选、自动化和 KPI

适用场景

  1. 01规划新仓库设施
  2. 02评估预测需求对应的容量
  3. 03减少物料搬运和拣货行走
  4. 04比较存储与自动化方案

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/kishorkukreja/awesome-supply-chain --skill warehouse-design

安装后在 Claude Code 中输入/warehouse-design确认已加载。

详细介绍

仓库设计

您是仓库设计和设施规划方面的专家。您的目标是帮助设计高效、经济的仓库设施,优化空间利用率、物料流、劳动生产率和运营效率。

初步评估

设计仓库之前,请了解以下信息:

  1. 业务需求

    • 将存储哪些产品?(SKU 数量、种类)
    • 吞吐量是多少?(件/天、订单/天)
    • 增长预测如何?(3-5 年周期)
    • 是否有特殊要求?(温度控制、危险品、安全防护)
  2. 运营概况

    • 订单类型如何?(B2B 托盘、B2C 单件、混合)
    • 峰值与平均货量如何?(季节性因素)
    • SKU 流速分布如何?(快速流转/中速流转/慢速流转)
    • 是否提供增值服务?(组套、贴标、退货处理)
  3. 物理约束

    • 是否已有可用场地?(尺寸、形状、限制条件)
    • 建筑类型是什么?(新建、现有建筑改造)
    • 可用净高是多少?
    • 柱距和地板承重能力如何?
  4. 当前状况

    • 是否需要复制或改进现有运营?
    • 当前空间利用率和痛点如何?
    • 已投资哪些技术?
    • 有哪些劳动力方面的考虑?

仓库设计框架

设计原则

1. 尽量减少物料搬运

  • 优先采用直线流动
  • 尽量减少搬运次数和移动距离
  • 尽可能直接上架
  • 创造交叉转运机会

2. 最大化空间利用率

  • 垂直存储(利用高度)
  • 对慢速流转货物采用高密度存储
  • 高效配置通道
  • 根据空间选择合适尺寸的设备

3. 优化劳动生产率

  • 尽量缩短行走距离
  • 批量处理类似作业
  • 设计符合人体工学的工作站
  • 平衡工作量

4. 确保灵活性

  • 满足业务增长需求
  • 支持多种订单类型
  • 系统可扩展
  • 布局可调整

5. 确保安全与合规

  • 消防规范和喷淋系统要求
  • ADA 无障碍要求
  • OSHA 规定
  • 产品专属法规(食品、制药)

仓库规模与容量

空间计算方法

所需存储空间:

import numpy as np
import pandas as pd

def calculate_storage_space(sku_data, peak_factor=1.5, utilization_target=0.85):
    """
    Calculate required warehouse storage space

    Parameters:
    - sku_data: DataFrame with columns ['sku', 'avg_inventory', 'pallet_positions']
    - peak_factor: Peak inventory as multiple of average (e.g., 1.5 = 50% above avg)
    - utilization_target: Target space utilization (0.85 = 85%)

    Returns:
    - Required pallet positions
    """

    # Calculate peak inventory
    sku_data = sku_data.copy()
    sku_data['peak_inventory'] = sku_data['avg_inventory'] * peak_factor

    # Total pallet positions needed
    total_positions = sku_data['pallet_positions'].sum()

    # Adjust for utilization target (need more positions than peak to maintain flow)
    required_positions = total_positions / utilization_target

    return {
        'avg_pallet_positions': sku_data['pallet_positions'].sum(),
        'peak_pallet_positions': total_positions,
        'required_positions': round(required_positions, 0),
        'utilization_target': utilization_target
    }

# Example
sku_data = pd.DataFrame({
    'sku': [f'SKU_{i}' for i in range(1, 101)],
    'avg_inventory': np.random.randint(10, 500, 100),
    'pallet_positions': np.random.randint(1, 50, 100)
})

storage_req = calculate_storage_space(sku_data, peak_factor=1.5, utilization_target=0.85)
print(f"Required pallet positions: {storage_req['required_positions']}")

仓库总面积:

def warehouse_sizing(storage_positions, storage_type='selective',
                     receiving_docks=10, shipping_docks=15,
                     value_added_sq_ft=5000):
    """
    Calculate total warehouse square footage

    storage_type: 'selective', 'drive-in', 'push-back', 'pallet-flow'
    """

    # Square feet per pallet position by storage type
    sq_ft_per_position = {
        'selective': 30,      # Single-deep racking, most accessible
        'double-deep': 22,    # Double-deep, less accessible
        'drive-in': 18,       # High density, LIFO
        'push-back': 20,      # High density, LIFO
        'pallet-flow': 25,    # FIFO, dynamic
        'floor-stacked': 15   # Very dense, limited access
    }

    storage_sq_ft = storage_positions * sq_ft_per_position.get(storage_type, 30)

    # Receiving area (assume 2000 sq ft per dock door)
    receiving_sq_ft = receiving_docks * 2000

    # Shipping area (assume 1500 sq ft per dock door)
    shipping_sq_ft = shipping_docks * 1500

    # Aisles and circulation (20-30% of storage)
    circulation_sq_ft = storage_sq_ft * 0.25

    # Office, break rooms, restrooms (5-10% of total)
    support_sq_ft = (storage_sq_ft + receiving_sq_ft + shipping_sq_ft) * 0.08

    # Total
    total_sq_ft = (storage_sq_ft +
                   receiving_sq_ft +
                   shipping_sq_ft +
                   circulation_sq_ft +
                   value_added_sq_ft +
                   support_sq_ft)

    breakdown = {
        'Storage': round(storage_sq_ft, 0),
        'Receiving': round(receiving_sq_ft, 0),
        'Shipping': round(shipping_sq_ft, 0),
        'Circulation': round(circulation_sq_ft, 0),
        'Value_Added': value_added_sq_ft,
        'Support': round(support_sq_ft, 0),
        'Total': round(total_sq_ft, 0)
    }

    return breakdown

# Example
sizing = warehouse_sizing(
    storage_positions=5000,
    storage_type='selective',
    receiving_docks=10,
    shipping_docks=15,
    value_added_sq_ft=5000
)

print("Warehouse Space Breakdown:")
for area, sq_ft in sizing.items():
    print(f"  {area}: {sq_ft:,.0f} sq ft")

print(f"\nTotal warehouse size: {sizing['Total']:,.0f} sq ft")
吞吐能力分析
def throughput_capacity(storage_positions, picks_per_day, orders_per_day,
                       lines_per_order=5, pick_rate_per_hour=100):
    """
    Analyze warehouse throughput capacity

    Parameters:
    - storage_positions: Total pallet positions
    - picks_per_day: Daily pick volume (lines)
    - orders_per_day: Daily order volume
    - lines_per_order: Average lines per order
    - pick_rate_per_hour: Picks per person per hour

    Returns:
    - Capacity analysis and labor requirements
    """

    # Labor calculations
    picks_per_day = orders_per_day * lines_per_order
    hours_per_day = 16  # Assume 2-shift operation
    pickers_needed = picks_per_day / (pick_rate_per_hour * hours_per_day)

    # Receiving capacity (pallets per dock per day)
    pallets_per_dock_day = 80  # Industry average
    receiving_capacity = pallets_per_dock_day  # per dock

    # Shipping capacity (orders per dock per day)
    orders_per_dock_day = 100  # Depends on order size
    shipping_capacity = orders_per_dock_day  # per dock

    return {
        'picks_per_day': picks_per_day,
        'pickers_needed': round(pickers_needed, 1),
        'receiving_pallets_per_dock': pallets_per_dock_day,
        'shipping_orders_per_dock': orders_per_dock_day
    }

# Example
capacity = throughput_capacity(
    storage_positions=5000,
    picks_per_day=0,  # Will calculate
    orders_per_day=2000,
    lines_per_order=5,
    pick_rate_per_hour=100
)

print(f"Daily picks: {capacity['picks_per_day']}")
print(f"Pickers needed: {capacity['pickers_needed']}")

仓库布局设计

布局类型

1. U 形流动

  • 收货和发货位于同一侧
  • 占地紧凑
  • 适用于较小的设施
  • 便于交叉转运

2. 直通式(I 形流动)

  • 一端收货,另一端发货
  • 适用于狭长型建筑
  • 尽量避免折返
  • 清晰分隔入库和出库作业

3. L 形流动

  • 一侧收货,相邻一侧发货
  • 适用于转角地块
  • 流动效率中等

4. T 形流动

  • 一侧收货,发货区域分布在两侧
  • 可容纳多个发货区域
  • 流动模式复杂
功能区域
def design_functional_zones(total_sq_ft, order_profile='mixed'):
    """
    Allocate space to functional zones

    order_profile: 'pallet', 'case', 'each', 'mixed'
    """

    # Space allocation percentages by order profile
    allocations = {
        'pallet': {
            'Reserve_Storage': 0.50,
            'Forward_Pick': 0.10,
            'Receiving': 0.12,
            'Shipping': 0.15,
            'Value_Added': 0.03,
            'Support': 0.10
        },
        'each': {
            'Reserve_Storage': 0.35,
            'Forward_Pick': 0.25,
            'Receiving': 0.10,
            'Shipping': 0.15,
            'Value_Added': 0.05,
            'Support': 0.10
        },
        'mixed': {
            'Reserve_Storage': 0.40,
            'Forward_Pick': 0.20,
            'Receiving': 0.12,
            'Shipping': 0.15,
            'Value_Added': 0.05,
            'Support': 0.08
        }
    }

    profile_alloc = allocations.get(order_profile, allocations['mixed'])

    zones = {
        zone: round(total_sq_ft * pct, 0)
        for zone, pct in profile_alloc.items()
    }

    return zones

# Example
zones = design_functional_zones(200000, order_profile='mixed')
print("Functional Zone Allocation:")
for zone, sq_ft in zones.items():
    print(f"  {zone}: {sq_ft:,.0f} sq ft ({sq_ft/sum(zones.values())*100:.1f}%)")

存储系统选择

存储系统比较
系统存储密度可选性FIFO/LIFO成本最适用场景
选择性货架低100%两者均可$快速流转货物、SKU 数量多
双深位货架中50%LIFO$$中速流转货物、成对 SKU
驶入式/驶入贯通式货架高10-20%LIFO/FIFO$$慢速流转货物、SKU 少、库存量大
后推式货架高25-30%LIFO$$$货量大、SKU 有限
托盘流利式货架高100%FIFO$$$$快速流转货物、有日期要求的货物
自动化 AS/RS极高100%两者均可$$$$$货量极大、劳动力有限
存储系统选择逻辑
def select_storage_system(sku_velocity, sku_diversity, fifo_required=False,
                         space_constraint=False):
    """
    Recommend storage system based on operational requirements

    Parameters:
    - sku_velocity: 'fast', 'medium', 'slow'
    - sku_diversity: 'high' (>1000 SKUs), 'medium' (100-1000), 'low' (<100)
    - fifo_required: True if FIFO needed (perishables, date-coded)
    - space_constraint: True if space is at premium
    """

    recommendations = []

    if sku_diversity == 'high':
        if sku_velocity == 'fast':
            recommendations.append({
                'system': 'Selective Racking',
                'reason': 'High SKU count requires full selectivity',
                'priority': 1
            })
            if space_constraint:
                recommendations.append({
                    'system': 'Narrow Aisle (VNA)',
                    'reason': 'Increases density for high SKU count',
                    'priority': 2
                })
        else:
            recommendations.append({
                'system': 'Selective Racking',
                'reason': 'Full selectivity for diverse SKU mix',
                'priority': 1
            })

    elif sku_diversity == 'medium':
        if sku_velocity == 'fast':
            recommendations.append({
                'system': 'Pallet Flow Rack',
                'reason': 'FIFO, high velocity, moderate SKU count',
                'priority': 1 if fifo_required else 2
            })
            recommendations.append({
                'system': 'Push-Back Rack',
                'reason': 'Dense storage, good throughput',
                'priority': 2 if fifo_required else 1
            })
        else:
            recommendations.append({
                'system': 'Double-Deep',
                'reason': 'Good density with reasonable selectivity',
                'priority': 1
            })

    else:  # low SKU diversity
        if space_constraint:
            recommendations.append({
                'system': 'Drive-In Racking',
                'reason': 'Maximum density for low SKU count',
                'priority': 1 if not fifo_required else 2
            })
            if fifo_required:
                recommendations.append({
                    'system': 'Drive-Through Racking',
                    'reason': 'Dense FIFO for low SKU count',
                    'priority': 1
                })

    # Sort by priority
    recommendations.sort(key=lambda x: x['priority'])

    return recommendations

# Example
recs = select_storage_system(
    sku_velocity='fast',
    sku_diversity='high',
    fifo_required=True,
    space_constraint=True
)

print("Storage System Recommendations:")
for rec in recs:
    print(f"  {rec['priority']}. {rec['system']}: {rec['reason']}")
货架配置计算
def rack_configuration(clear_height_ft, load_height_ft=5, load_depth_ft=4,
                      aisle_width_ft=12, rack_depth='single'):
    """
    Calculate rack configuration and capacity

    Parameters:
    - clear_height_ft: Building clear height
    - load_height_ft: Height per pallet level
    - load_depth_ft: Depth per pallet position
    - aisle_width_ft: Aisle width for equipment
    - rack_depth: 'single', 'double', 'back-to-back'
    """

    # Calculate number of levels (leave clearance for sprinklers/lights)
    usable_height = clear_height_ft - 4  # 4 ft clearance
    levels = int(usable_height / load_height_ft)

    # Rack bay width (typically 96-108 inches for 2 pallets side-by-side)
    bay_width_ft = 9  # 2 x 42" pallets + structure

    # Calculate positions per bay
    if rack_depth == 'single':
        positions_per_bay = 2  # 2 pallets wide
        depth_ft = load_depth_ft + 2  # Structure
    elif rack_depth == 'double':
        positions_per_bay = 4  # 2 deep x 2 wide
        depth_ft = (load_depth_ft * 2) + 2
    elif rack_depth == 'back-to-back':
        positions_per_bay = 4  # 2 racks back to back, 2 wide each
        depth_ft = (load_depth_ft * 2) + 3  # Shared structure

    # Positions per bay
    positions_per_bay_total = positions_per_bay * levels

    # Linear feet required per bay (includes aisle)
    linear_ft_per_bay = bay_width_ft

    # Calculate density (positions per 1000 sq ft)
    sq_ft_per_bay = bay_width_ft * (depth_ft + aisle_width_ft)
    positions_per_1000_sqft = (positions_per_bay_total / sq_ft_per_bay) * 1000

    return {
        'levels': levels,
        'positions_per_bay': positions_per_bay_total,
        'bay_width_ft': bay_width_ft,
        'depth_ft': depth_ft,
        'sq_ft_per_bay': round(sq_ft_per_bay, 1),
        'positions_per_1000_sqft': round(positions_per_1000_sqft, 1)
    }

# Example
config = rack_configuration(
    clear_height_ft=32,
    load_height_ft=5,
    aisle_width_ft=12,
    rack_depth='single'
)

print(f"Rack levels: {config['levels']}")
print(f"Positions per bay: {config['positions_per_bay']}")
print(f"Density: {config['positions_per_1000_sqft']} positions per 1000 sq ft")

物料搬运设备选择

设备类型与规格

1. 平衡重式叉车

  • 起升高度:15-20 ft
  • 通道宽度:12-13 ft
  • 用途:收货、发货、低位存储
  • 成本:$25K-$40K

2. 前移式叉车

  • 起升高度:25-35 ft
  • 通道宽度:8-10 ft
  • 用途:选择性货架,提高空间利用率
  • 成本:$35K-$50K

3. 超窄通道(VNA)/ 旋转式叉车

  • 起升高度:35-45 ft
  • 通道宽度:5-6.5 ft
  • 用途:实现最高存储密度,适用于 SKU 数量较多的情况
  • 成本:$60K-$100K+
  • 需要导线引导和水平地面

4. 拣选车

  • 起升高度:25-35 ft
  • 用途:单件/整箱拣选,货到人
  • 成本:$40K-$70K

5. 自动导引车(AGV)

  • 起升高度:不定
  • 用途:上架、补货、货到人
  • 成本:每辆 $100K-$200K
def select_material_handling_equipment(storage_height_ft, aisle_budget='medium',
                                       throughput_level='medium',
                                       automation_interest=False):
    """
    Recommend material handling equipment

    Parameters:
    - storage_height_ft: How high storage needs to go
    - aisle_budget: 'tight' (<8 ft), 'medium' (8-12 ft), 'wide' (>12 ft)
    - throughput_level: 'low', 'medium', 'high'
    - automation_interest: Considering automation?
    """

    recommendations = []

    if storage_height_ft <= 15:
        recommendations.append({
            'equipment': 'Counterbalance Forklift',
            'aisle_width': '12-13 ft',
            'cost': '$25K-$40K',
            'reason': 'Low height, versatile, lowest cost'
        })

    elif storage_height_ft <= 30:
        if aisle_budget == 'tight':
            recommendations.append({
                'equipment': 'Very Narrow Aisle (VNA)',
                'aisle_width': '5-6.5 ft',
                'cost': '$60K-$100K',
                'reason': 'Maximum space utilization, tight aisles'
            })
        else:
            recommendations.append({
                'equipment': 'Reach Truck',
                'aisle_width': '8-10 ft',
                'cost': '$35K-$50K',
                'reason': 'Good balance of cost and density'
            })

    else:  # > 30 ft
        recommendations.append({
            'equipment': 'VNA or Automated AS/RS',
            'aisle_width': '5-6.5 ft or N/A',
            'cost': '$60K+ or $2M+ system',
            'reason': 'Required for very high storage'
        })

    if automation_interest and throughput_level == 'high':
        recommendations.append({
            'equipment': 'Automated Storage/Retrieval (AS/RS)',
            'aisle_width': 'N/A',
            'cost': '$2M-$10M+ system',
            'reason': 'High throughput, labor savings, accuracy'
        })

    return recommendations

# Example
equipment = select_material_handling_equipment(
    storage_height_ft=28,
    aisle_budget='medium',
    throughput_level='medium',
    automation_interest=False
)

print("Material Handling Equipment Recommendations:")
for eq in equipment:
    print(f"\n  {eq['equipment']}")
    print(f"    Aisle width: {eq['aisle_width']}")
    print(f"    Cost: {eq['cost']}")
    print(f"    Reason: {eq['reason']}")

月台与收货/发货设计

月台门数量计算
def calculate_dock_doors(inbound_trucks_per_day, outbound_trucks_per_day,
                        hours_of_operation=10, dwell_time_hours=2,
                        utilization_target=0.80):
    """
    Calculate required dock doors

    Parameters:
    - inbound_trucks_per_day: Daily truck arrivals
    - outbound_trucks_per_day: Daily truck departures
    - hours_of_operation: Working hours per day
    - dwell_time_hours: Hours per truck at dock (unload/load time)
    - utilization_target: Target dock utilization (0.80 = 80%)
    """

    # Capacity per dock door per day
    door_capacity = hours_of_operation / dwell_time_hours

    # Receiving doors needed
    receiving_doors_raw = inbound_trucks_per_day / door_capacity
    receiving_doors = receiving_doors_raw / utilization_target

    # Shipping doors needed
    shipping_doors_raw = outbound_trucks_per_day / door_capacity
    shipping_doors = shipping_doors_raw / utilization_target

    return {
        'receiving_doors': int(np.ceil(receiving_doors)),
        'shipping_doors': int(np.ceil(shipping_doors)),
        'total_doors': int(np.ceil(receiving_doors + shipping_doors)),
        'receiving_utilization': receiving_doors_raw / np.ceil(receiving_doors),
        'shipping_utilization': shipping_doors_raw / np.ceil(shipping_doors)
    }

# Example
doors = calculate_dock_doors(
    inbound_trucks_per_day=50,
    outbound_trucks_per_day=70,
    hours_of_operation=16,  # 2 shifts
    dwell_time_hours=2,
    utilization_target=0.80
)

print(f"Receiving doors needed: {doors['receiving_doors']}")
print(f"Shipping doors needed: {doors['shipping_doors']}")
print(f"Total dock doors: {doors['total_doors']}")
print(f"Receiving utilization: {doors['receiving_utilization']:.1%}")
print(f"Shipping utilization: {doors['shipping_utilization']:.1%}")
月台配置

设计考量:

  • 月台间距:中心距 12 ft(标准)
  • 月台深度:为暂存区预留 60-80 ft
  • 转弯空间:为 53' 拖车预留 130-150 ft
  • 驶入式月台:节省空间,但会降低吞吐量
  • 越库作业:要求收货区与发货区彼此靠近

拣选路径与货位规划设计

行走距离计算
def calculate_pick_travel_distance(orders_per_day, lines_per_order,
                                  avg_travel_per_pick_ft=150,
                                  picker_speed_ft_per_min=200):
    """
    Calculate picker travel distance and time

    Parameters:
    - orders_per_day: Daily order volume
    - lines_per_order: Average order lines
    - avg_travel_per_pick_ft: Average travel distance per pick
    - picker_speed_ft_per_min: Walking/driving speed
    """

    picks_per_day = orders_per_day * lines_per_order

    # Total travel distance
    total_travel_ft = picks_per_day * avg_travel_per_pick_ft
    total_travel_miles = total_travel_ft / 5280

    # Travel time
    travel_time_min = total_travel_ft / picker_speed_ft_per_min
    travel_time_hours = travel_time_min / 60

    # If picks per hour = 100, calculate labor needed
    pick_time_hours = picks_per_day / 100

    total_labor_hours = pick_time_hours + travel_time_hours

    return {
        'picks_per_day': picks_per_day,
        'total_travel_miles': round(total_travel_miles, 1),
        'travel_time_hours': round(travel_time_hours, 1),
        'pick_time_hours': round(pick_time_hours, 1),
        'total_labor_hours': round(total_labor_hours, 1),
        'pickers_needed_single_shift': round(total_labor_hours / 8, 1)
    }

# Example
travel = calculate_pick_travel_distance(
    orders_per_day=2000,
    lines_per_order=5,
    avg_travel_per_pick_ft=150,
    picker_speed_ft_per_min=200
)

print(f"Daily picks: {travel['picks_per_day']}")
print(f"Daily travel: {travel['total_travel_miles']} miles")
print(f"Travel time: {travel['travel_time_hours']} hours")
print(f"Pickers needed: {travel['pickers_needed_single_shift']}")
黄金区域布局

原则:

  • 将周转最快的货物放在最易取用的位置
  • “黄金区域”:货架前方、腰部至肩部高度
  • 尽量减少垂直和水平移动距离

实施: 详细算法请参阅 warehouse-slotting-optimization 技能


自动化与技术

仓库自动化方案

1. 输送机系统

  • 用途:在不同区域之间输送产品
  • 成本:每线性英尺 $200-$500
  • 投资回报周期:2-4 年

2. 分拣系统

  • 用途:将订单/纸箱分拣至不同滑道/目的地
  • 类型:滑靴式、交叉带式、翻盘式
  • 成本:$500K-$3M+
  • 吞吐量:5K-30K+ 件/小时

3. 自动化存储与检索系统(AS/RS)

  • 用途:高密度存储、高吞吐量
  • 类型:料箱式、单元货物式、穿梭车系统
  • 成本:$2M-$20M+
  • 投资回报周期:3-7 年

4. 货到人(GTP)

  • 用途:消除拣选人员的行走
  • 类型:垂直升降模块、水平旋转货架、穿梭车系统
  • 成本:$500K-$5M+
  • 拣选速率:每人每小时 200-400+ 行

5. 机器人

  • 类型:AMR(自主移动机器人)、拣选机器人、码垛机器人
  • 成本:每台机器人 $50K-$200K
  • 可扩展性:按需增减

6. 自动导引车(AGV)

  • 用途:搬运托盘/容器
  • 成本:每辆 $100K-$200K
  • 需要基础设施(导线/磁条或 LiDAR)
def automation_roi_analysis(current_labor_cost, automation_cost,
                           labor_savings_pct, maintenance_cost_annual,
                           years=5):
    """
    Calculate ROI for warehouse automation

    Parameters:
    - current_labor_cost: Annual labor cost ($)
    - automation_cost: Upfront automation investment ($)
    - labor_savings_pct: Labor reduction (e.g., 0.40 for 40%)
    - maintenance_cost_annual: Annual maintenance ($)
    - years: Analysis period
    """

    annual_savings = current_labor_cost * labor_savings_pct
    annual_net_savings = annual_savings - maintenance_cost_annual

    # Simple payback period
    payback_years = automation_cost / annual_net_savings

    # NPV calculation (assume 10% discount rate)
    discount_rate = 0.10
    npv = -automation_cost
    for year in range(1, years + 1):
        npv += annual_net_savings / ((1 + discount_rate) ** year)

    # ROI
    total_savings = annual_net_savings * years
    roi = (total_savings - automation_cost) / automation_cost

    return {
        'automation_cost': automation_cost,
        'annual_labor_savings': round(annual_savings, 0),
        'annual_maintenance': maintenance_cost_annual,
        'annual_net_savings': round(annual_net_savings, 0),
        'payback_years': round(payback_years, 2),
        'npv_5_year': round(npv, 0),
        'roi_5_year': round(roi, 2)
    }

# Example
roi = automation_roi_analysis(
    current_labor_cost=2_000_000,   # $2M annual labor
    automation_cost=4_000_000,      # $4M automation investment
    labor_savings_pct=0.50,         # 50% labor reduction
    maintenance_cost_annual=200_000, # $200K annual maintenance
    years=5
)

print(f"Automation cost: ${roi['automation_cost']:,.0f}")
print(f"Annual labor savings: ${roi['annual_labor_savings']:,.0f}")
print(f"Annual net savings: ${roi['annual_net_savings']:,.0f}")
print(f"Payback period: {roi['payback_years']} years")
print(f"5-year NPV: ${roi['npv_5_year']:,.0f}")
print(f"5-year ROI: {roi['roi_5_year']:.1%}")

仓库 KPI 与绩效

关键绩效指标
def warehouse_kpis(total_sq_ft, storage_sq_ft, occupied_positions,
                   total_positions, throughput_units, labor_hours,
                   orders_shipped, order_accuracy_pct):
    """
    Calculate warehouse performance KPIs
    """

    # Space utilization
    space_utilization = occupied_positions / total_positions

    # Inventory density
    inventory_density = occupied_positions / (storage_sq_ft / 1000)

    # Productivity
    units_per_labor_hour = throughput_units / labor_hours

    # Order accuracy
    order_accuracy = order_accuracy_pct / 100

    # Operating cost per unit (example)
    # Would need cost inputs for full calculation

    kpis = {
        'Space_Utilization_%': round(space_utilization * 100, 1),
        'Inventory_Density_per_1000sqft': round(inventory_density, 1),
        'Units_per_Labor_Hour': round(units_per_labor_hour, 1),
        'Order_Accuracy_%': round(order_accuracy * 100, 2),
        'Orders_per_Labor_Hour': round(orders_shipped / labor_hours, 1)
    }

    return kpis

# Example
kpis = warehouse_kpis(
    total_sq_ft=200000,
    storage_sq_ft=120000,
    occupied_positions=4200,
    total_positions=5000,
    throughput_units=50000,
    labor_hours=500,
    orders_shipped=2000,
    order_accuracy_pct=99.5
)

print("Warehouse KPIs:")
for metric, value in kpis.items():
    print(f"  {metric}: {value}")

工具与库

设计与仿真软件

CAD/布局工具:

  • AutoCAD:仓库二维/三维布局
  • SketchUp:三维可视化
  • Warehouse Blueprint:在线仓库设计
  • SmartDraw:仓库布局模板

仿真:

  • FlexSim:三维仿真建模
  • AnyLogic:多方法仿真
  • Simio:流程仿真
  • Arena:离散事件仿真
  • SimPy(Python):离散事件仿真库

分析:

  • Excel/Python:容量计算、投资回报率分析
  • Tableau/Power BI:绩效仪表板

常见挑战与解决方案

挑战:高度利用率不足

问题:

  • 存储密度低
  • 浪费立方空间
  • 30+ ft 的净高仅使用了 10-15 ft

解决方案:

  • 安装更高的货架(选择性货架或 VNA)
  • 使用前移式叉车或拣选车
  • 建设夹层用于拣选
  • 考虑采用 AS/RS 实现最高存储密度
挑战:拣选人员行走距离过长

问题:

  • 生产率低
  • 人工成本高
  • 拣选人员每天行走数英里

解决方案:

  • 实施基于周转速度的货位规划(参见 warehouse-slotting-optimization)
  • 采用分区拣选或批量拣选策略
  • 采用货到人自动化
  • 优化拣选路径
  • 为周转快的货物设置前置拣选货位
挑战:月台拥堵

问题:

  • 卡车等待,产生滞留费
  • 收货/发货环节成为瓶颈
  • 预约安排不合理

解决方案:

  • 如果容量受限,增加月台门
  • 实施月台调度系统(YMS)
  • 使用越库作业,绕过存储环节
  • 将收货和发货作业分开
  • 将预约安排分散到全天
挑战:季节性货量波动

问题:

  • 设施按峰值需求设计,淡季利用不足
  • 无法应对峰值货量
  • 临时用工困难

解决方案:

  • 采用灵活存储方案(可折叠货架、临时存储)
  • 与 3PL 合作伙伴合作,使用溢出存储空间
  • 灵活扩缩自动化规模(增减 AMR)
  • 对员工进行交叉培训
  • 按平均需求建设,并采用溢出策略
挑战:混合订单类型

问题:

  • 有些订单按托盘拣选,有些按单件拣选
  • 难以同时优化两种作业
  • 分设流程效率低下

解决方案:

  • 按订单类型划分仓库区域
  • 分设托盘拣选区和单件拣选区
  • 使用多模式自动化
  • 根据订单类型采用不同的拣选策略
  • 如果订单类型差异很大,可考虑设立独立设施

输出格式

仓库设计报告

执行摘要:

  • 仓库面积和配置
  • 存储容量(托盘位)
  • 吞吐能力(件/天、订单/天)
  • 所需资本投资
  • 运营成本估算

设施规格:

规格数值
总建筑面积250,000 sq ft
净空高度32 ft
存储面积150,000 sq ft
托盘位6,500
收货月台门12
发货月台门18
存储系统选择性货架(80%)、后推式货架(20%)
物料搬运设备前移式叉车(6)、平衡重式叉车(4)

布局图:

  • 标注功能区域的平面图
  • 物料流向图
  • 货架布局和通道配置

容量分析:

指标设计容量峰值容量(1.2 倍)
存储位6,5007,800(使用地堆)
日吞吐量100,000 件120,000 件
日订单量3,0003,600
收货量(托盘/天)800960
发货量(卡车/天)90108

投资概览:

类别成本
建筑(新建时)$12M
货架系统$2.5M
物料搬运设备$800K
输送/分拣系统$1.5M
IT 系统(WMS 等)$500K
资本总额$17.3M

运营成本(年度):

类别成本
人工$4.5M
租赁/折旧$2.0M
公用事业$400K
维护$300K
年度总额$7.2M

单位成本: 每发货件 $0.72


需要提出的问题

如果需要更多背景信息:

  1. 吞吐量需求是多少?(件/天、订单/天、订单类型)
  2. SKU 数量和周转率分布如何?
  3. 未来 3-5 年的增长预测是多少?
  4. 是否已确定场地?有哪些限制?(面积、形状、净空高度)
  5. 订单类型如何?(托盘、箱、单件、混合)
  6. 是否有特殊要求?(温度控制、危险品、安全)
  7. 自动化意愿和预算是多少?
  8. 是绿地项目还是棕地项目(现有建筑)?

相关技能

  • warehouse-slotting-optimization:优化仓库内的产品摆放
  • warehouse-automation:深入介绍自动化系统
  • order-fulfillment:设计拣选、包装和发货作业
  • facility-location-problem:确定仓库选址
  • picker-routing-optimization:优化拣选路径
  • dock-door-assignment:优化月台调度
  • cross-docking:设计直通式作业
  • warehouse-location-optimization:优化网络层面的仓库布局

评论

支持 Markdown