如何基于现有库存、提前期和30天销量速率计算补货量?代码求助
库存补货量计算代码优化方案
问题分析
你的现有代码存在核心逻辑错误,导致结果完全不符合预期:
- 未使用现有库存和提前期这两个补货计算的关键数据,这两个是决定补货量的核心因素
- 错误地用所有产品的总销量速率比例分摊补货量,每个SKU的补货应独立计算,而非按销量占比分配固定值
- 安全库存设为固定值10,未结合产品销量波动和提前期风险,不符合实际库存逻辑
正确的补货计算逻辑
通用的库存补货公式(匹配你的人工估算逻辑):
补货量 = max( (日均销量 × 提前期 + 安全库存) - 当前库存, 0 )
日均销量 × 提前期:覆盖补货提前期内的销量需求,避免断货安全库存:应对销量波动、提前期延误等风险,可根据实际情况调整max(..., 0):如果当前库存已足够覆盖需求,无需补货
优化后的代码
reorder_quantities = {} csv_data.each do |row| asin = row['ASIN'] current_stock = row['On Hand'].to_f # 转为数值类型 daily_velocity = row['Last 30 Days'].to_f # 日均销量 lead_time = row['Lead Time'].to_i # 读取提前期(需确保CSV包含该字段) # 自定义安全库存:可设固定值,或按提前期销量的比例动态计算 safety_stock = 10 # 动态计算示例:safety_stock = (daily_velocity * lead_time) * 0.2 # 计算补货量 required_stock = daily_velocity * lead_time + safety_stock reorder_quantity = [required_stock - current_stock, 0].max.round(2) reorder_quantities[asin] = { daily_velocity: daily_velocity, current_stock: current_stock, lead_time: lead_time, safety_stock: safety_stock, reorder_quantity: reorder_quantity } end # 输出结果 reorder_quantities.each do |asin, data| puts "Product: #{asin}, Reorder Quantity: #{data[:reorder_quantity]}" end
适配你的人工估算案例验证
以你给出的人工估算例子为例:
- 案例1:现有库存25,日均销量1.14,假设提前期为45天
- 提前期销量:1.14×45=51.3
- 需求总量:51.3+10=61.3
- 补货量:61.3-25=36.3 → 约40(匹配你的人工估算)
- 案例2:现有库存40,日均销量0.5,假设安全库存设为20、提前期为80天
- 提前期销量:0.5×80=40
- 需求总量:40+20=60
- 补货量:60-40=20(完全匹配你的估算)
额外优化建议
- 确认CSV中
Lead Time字段的单位为天,数值准确 - 安全库存可根据销量波动调整:比如计算过去30天销量的标准差,设置为1-2倍标准差作为安全库存
- 可添加补货上下限:比如补货量低于5件则不补,或单次补货不超过100件
- 若
Last 30 Days是30天总销量而非日均,需先转换:daily_velocity = row['Last 30 Days'].to_f / 30
内容的提问来源于stack exchange,提问作者Zach S
相关产品推荐
相关产品推荐

