引言
库存预警和智能补货是库存管理自动化的核心,可以避免缺货和积压,提升运营效率。本文将探讨预警机制设计和智能补货算法实现。
1. 库存预警机制
1.1 库存下限预警
触发条件:
当前库存 < 安全库存
预警级别:
黄色预警:50% < 当前库存/安全库存 < 100%
橙色预警:20% < 当前库存/安全库存 < 50%
红色预警:当前库存/安全库存 < 20%
Java实现:
public class InventoryAlertService {
public String checkAlert(Inventory inventory) {
int currentQty = inventory.getAvailableQty();
int safetyStock = inventory.getSafetyStock();
if (safetyStock == 0) return "NONE";
double ratio = (double) currentQty / safetyStock;
if (ratio >= 1.0) {
return "NONE"; // 无预警
} else if (ratio >= 0.5) {
return "YELLOW"; // 黄色预警
} else if (ratio >= 0.2) {
return "ORANGE"; // 橙色预警
} else {
return "RED"; // 红色预警
}
}
@Scheduled(cron = "0 */30 * * * ?") // 每30分钟检查一次
public void checkInventoryAlerts() {
List<Inventory> inventories = inventoryMapper.selectAll();
for (Inventory inventory : inventories) {
String alertLevel = checkAlert(inventory);
if (!"NONE".equals(alertLevel)) {
// 发送预警通知
sendAlert(inventory, alertLevel);
// 触发补货流程
if ("RED".equals(alertLevel) || "ORANGE".equals(alertLevel)) {
triggerReplenishment(inventory);
}
}
}
}
}
1.2 库存上限预警
触发条件:
当前库存 > 最大库存
问题:
- 占用仓储空间
- 资金占用过多
- 可能积压呆滞
Java实现:
public void checkOverstockAlert(Inventory inventory) {
int currentQty = inventory.getAvailableQty();
int maxStock = inventory.getMaxStock();
if (currentQty > maxStock) {
// 发送超库存预警
AlertMessage alert = new AlertMessage();
alert.setLevel("WARNING");
alert.setMessage(String.format(
"SKU %s 库存超标: 当前%d件, 最大%d件",
inventory.getSku(), currentQty, maxStock
));
alertService.send(alert);
// 建议促销清仓
promotionService.suggestPromotion(inventory.getSku());
}
}
1.3 呆滞预警
定义:
- 一级预警:60天无销售
- 二级预警:90天无销售
- 三级预警:180天无销售
Java实现:
public void checkSlowMovingAlert() {
LocalDate today = LocalDate.now();
// 查询所有SKU的最后销售日期
List<InventoryWithLastSale> inventories = inventoryMapper.selectWithLastSaleDate();
for (InventoryWithLastSale inventory : inventories) {
if (inventory.getLastSaleDate() == null) continue;
long daysSinceLastSale = ChronoUnit.DAYS.between(inventory.getLastSaleDate(), today);
String alertLevel = null;
if (daysSinceLastSale >= 180) {
alertLevel = "LEVEL_3"; // 三级预警(死库存)
} else if (daysSinceLastSale >= 90) {
alertLevel = "LEVEL_2"; // 二级预警(呆滞库存)
} else if (daysSinceLastSale >= 60) {
alertLevel = "LEVEL_1"; // 一级预警(慢销库存)
}
if (alertLevel != null) {
// 发送呆滞预警
sendSlowMovingAlert(inventory, alertLevel, daysSinceLastSale);
// 建议处理措施
if ("LEVEL_3".equals(alertLevel)) {
// 报废处理
suggestDisposal(inventory);
} else if ("LEVEL_2".equals(alertLevel)) {
// 促销清仓
suggestClearance(inventory);
}
}
}
}
2. 智能补货算法
2.1 基于销售预测补货
原理:
- 预测未来N天销量
- 计算需补货量 = 预测销量 - 当前库存 + 安全库存
移动平均法:
public BigDecimal forecastByMovingAverage(List<BigDecimal> history, int period) {
if (history.size() < period) {
return BigDecimal.ZERO;
}
// 取最近period天的平均值
return history.stream()
.skip(history.size() - period)
.reduce(BigDecimal.ZERO, BigDecimal::add)
.divide(BigDecimal.valueOf(period), 2, RoundingMode.HALF_UP);
}
指数平滑法:
public BigDecimal forecastByExponentialSmoothing(List<BigDecimal> history, double alpha) {
if (history.isEmpty()) return BigDecimal.ZERO;
BigDecimal forecast = history.get(0);
for (int i = 1; i < history.size(); i++) {
BigDecimal actual = history.get(i);
forecast = actual.multiply(BigDecimal.valueOf(alpha))
.add(forecast.multiply(BigDecimal.valueOf(1 - alpha)));
}
return forecast;
}
2.2 基于库存周转补货
原理:
- 目标周转天数:30天
- 补货量 = 30天预测销量 - 当前库存
Java实现:
public int calculateReplenishmentByTurnover(String sku, int targetTurnoverDays) {
// 1. 获取日均销量
BigDecimal dailySales = salesDataService.getDailyAverage(sku, 30);
// 2. 计算目标库存
int targetStock = dailySales.multiply(BigDecimal.valueOf(targetTurnoverDays))
.setScale(0, RoundingMode.UP)
.intValue();
// 3. 获取当前库存
int currentStock = inventoryService.getAvailableQty(sku);
// 4. 计算补货量
int replenishQty = targetStock - currentStock;
return Math.max(replenishQty, 0); // 不能为负数
}
2.3 基于ROP补货
原理:
- 当前库存 ≤ ROP时触发补货
- 补货量 = EOQ
Java实现:
@Component
public class ROPReplenishmentService {
public void checkAndReplenish() {
List<Inventory> inventories = inventoryMapper.selectAll();
for (Inventory inventory : inventories) {
int currentQty = inventory.getAvailableQty();
int rop = inventory.getReorderPoint();
if (currentQty <= rop) {
// 触发补货
int eoq = calculateEOQ(inventory.getSku());
createPurchaseOrder(inventory.getSku(), eoq);
log.info("触发ROP补货: sku={}, currentQty={}, rop={}, replenishQty={}",
inventory.getSku(), currentQty, rop, eoq);
}
}
}
private int calculateEOQ(String sku) {
// EOQ = √(2DS/H)
ProductCost cost = productService.getCost(sku);
BigDecimal annualDemand = salesDataService.getAnnualDemand(sku);
BigDecimal orderingCost = new BigDecimal("500"); // 订货成本
BigDecimal holdingCost = cost.getUnitCost().multiply(new BigDecimal("0.2")); // 持有成本率20%
BigDecimal eoq = BigDecimal.valueOf(Math.sqrt(
2 * annualDemand.doubleValue() * orderingCost.doubleValue()
/ holdingCost.doubleValue()
));
return eoq.setScale(0, RoundingMode.UP).intValue();
}
}
3. 补货策略优化
3.1 最小起订量(MOQ)
规则:
实际补货量 = max(计算补货量, MOQ)
Java实现:
public int adjustForMOQ(int calculatedQty, String sku) {
Supplier supplier = supplierService.getSupplier(sku);
int moq = supplier.getMinimumOrderQuantity();
if (calculatedQty < moq) {
log.info("补货量低于MOQ: calculated={}, moq={}, adjusted={}",
calculatedQty, moq, moq);
return moq;
}
return calculatedQty;
}
3.2 包装单位
规则:
- 向上取整至整箱
- 减少拆箱损耗
Java实现:
public int adjustForPackingUnit(int calculatedQty, String sku) {
Product product = productService.getProduct(sku);
int packingUnit = product.getPackingUnit(); // 每箱数量
// 向上取整至整箱
int boxes = (int) Math.ceil((double) calculatedQty / packingUnit);
int adjustedQty = boxes * packingUnit;
log.info("调整为整箱: calculated={}, packingUnit={}, boxes={}, adjusted={}",
calculatedQty, packingUnit, boxes, adjustedQty);
return adjustedQty;
}
3.3 运输成本优化
规则:
- 凑整车/整柜
- 降低单位运输成本
Java实现:
public int adjustForTransportCost(int calculatedQty, String sku) {
TransportInfo transport = transportService.getInfo(sku);
int fullTruckLoad = transport.getFullTruckLoad(); // 整车装载量
double currentLoad = (double) calculatedQty / fullTruckLoad;
// 如果接近整车(90%以上),凑整车
if (currentLoad >= 0.9 && currentLoad < 1.0) {
log.info("凑整车: calculated={}, fullTruckLoad={}, adjusted={}",
calculatedQty, fullTruckLoad, fullTruckLoad);
return fullTruckLoad;
}
return calculatedQty;
}
4. 综合补货系统
4.1 智能补货引擎
@Service
public class IntelligentReplenishmentEngine {
public ReplenishmentPlan generatePlan(String sku) {
// 1. 预测未来30天销量
BigDecimal forecast = forecastService.predict(sku, 30);
// 2. 获取当前库存
int currentStock = inventoryService.getAvailableQty(sku);
// 3. 获取安全库存
int safetyStock = inventoryService.getSafetyStock(sku);
// 4. 计算基础补货量
int baseQty = forecast.intValue() - currentStock + safetyStock;
if (baseQty <= 0) {
return null; // 无需补货
}
// 5. 应用各种调整
int adjustedQty = baseQty;
adjustedQty = adjustForMOQ(adjustedQty, sku);
adjustedQty = adjustForPackingUnit(adjustedQty, sku);
adjustedQty = adjustForTransportCost(adjustedQty, sku);
// 6. 生成补货计划
ReplenishmentPlan plan = new ReplenishmentPlan();
plan.setSku(sku);
plan.setBaseQty(baseQty);
plan.setFinalQty(adjustedQty);
plan.setForecast(forecast);
plan.setCurrentStock(currentStock);
plan.setSafetyStock(safetyStock);
return plan;
}
}
4.2 自动下单
@Component
public class AutoReplenishmentTask {
@Autowired
private IntelligentReplenishmentEngine engine;
@Scheduled(cron = "0 0 3 * * ?") // 每天凌晨3点
public void autoReplenish() {
log.info("开始自动补货");
List<String> skus = productService.listAllActiveSku();
for (String sku : skus) {
try {
// 生成补货计划
ReplenishmentPlan plan = engine.generatePlan(sku);
if (plan != null) {
// 创建采购订单
PurchaseOrder po = new PurchaseOrder();
po.setSku(sku);
po.setQuantity(plan.getFinalQty());
po.setSupplier(supplierService.getSupplier(sku));
po.setStatus("PENDING");
purchaseOrderService.create(po);
log.info("已创建补货订单: sku={}, qty={}", sku, plan.getFinalQty());
}
} catch (Exception e) {
log.error("自动补货失败: sku={}", sku, e);
}
}
log.info("自动补货完成");
}
}
5. 实战案例:菜鸟网络的智能补货
5.1 业务背景
菜鸟网络管理全国数百个仓库,需要智能补货保证库存充足。
5.2 技术方案
AI预测:
- LSTM神经网络预测销量
- 考虑节假日、促销、天气等因素
- 预测准确率85%+
多仓协同:
- 全国库存可视化
- 智能调拨优化
- 就近补货
自动化:
- 每天自动生成补货计划
- 自动下单给供应商
- 异常自动预警
5.3 优化成果
- 缺货率降低60%
- 库存周转率提升35%
- 补货效率提升80%
6. 总结
库存预警和智能补货是库存管理自动化的核心,可以大幅提升效率。
核心要点:
- 预警机制:库存下限、上限、呆滞
- 补货算法:销售预测、库存周转、ROP
- 策略优化:MOQ、包装单位、运输成本
- 自动化:定时任务、自动下单
在下一篇文章中,我们将探讨库存周转分析与优化,敬请期待!
参考资料
- 菜鸟网络技术博客
- 《供应链管理》教材
- 《库存管理与控制》