个人编程网站

进销存(JXC)软件开发技术积累与分享

进销存系统智能采购推荐算法

背景概述

传统的采购管理依赖人工经验判断,容易出现库存积压或缺货的情况。智能采购推荐算法通过分析历史销售数据、市场趋势和库存状态,自动生成科学的采购建议,帮助企业优化库存结构,降低运营成本。

算法框架设计

智能采购推荐系统包含以下核心模块:

模块 功能 算法
需求预测 预测未来销售量 ARIMA/LSTM
安全库存计算 确定最优库存水平 概率模型
采购量计算 生成推荐采购数量 EOQ模型
供应商推荐 选择最优供应商 多因素决策

需求预测模型

基于时间序列的销售预测是智能采购的核心:

// 需求预测服务
class DemandForecastService {
  constructor() {
    this.models = new Map();
  }

  // 使用移动平均预测
  movingAverage(data, window = 7) {
    if (data.length < window) return null;
    const recent = data.slice(-window);
    return recent.reduce((a, b) => a + b, 0) / window;
  }

  // 使用指数平滑预测
  exponentialSmoothing(data, alpha = 0.3) {
    let forecast = data[0];
    for (let i = 1; i < data.length; i++) {
      forecast = alpha * data[i] + (1 - alpha) * forecast;
    }
    return forecast;
  }

  // 考虑季节性的预测
  seasonalForecast(historicalData, forecastPeriod, seasonLength = 30) {
    // 计算季节性指数
    const seasonalIndices = this.calculateSeasonalIndex(historicalData, seasonLength);

    // 基础预测(使用线性趋势)
    const trend = this.calculateTrend(historicalData);

    // 生成预测结果
    const forecasts = [];
    for (let i = 0; i < forecastPeriod; i++) {
      const baseValue = trend.base + trend.slope * (historicalData.length + i);
      const seasonIndex = seasonalIndices[i % seasonLength];
      forecasts.push(Math.round(baseValue * seasonIndex));
    }

    return forecasts;
  }

  // 综合预测(融合多种方法)
  hybridForecast(productId, days = 30) {
    const salesData = this.getSalesData(productId);

    // 方法1:移动平均
    const maResult = this.movingAverage(salesData, 7);

    // 方法2:指数平滑
    const esResult = this.exponentialSmoothing(salesData);

    // 方法3:趋势预测
    const trendResult = this.trendForecast(salesData, days);

    // 加权融合
    const weights = { ma: 0.3, es: 0.3, trend: 0.4 };
    const finalResult = Math.round(
      maResult * weights.ma +
      esResult * weights.es +
      trendResult * weights.trend
    );

    return Math.max(0, finalResult); // 确保非负
  }
}

安全库存计算

安全库存是防止缺货的最后防线,计算公式如下:

// 安全库存计算服务
class SafetyStockService {
  // 基于服务水平的安全库存计算
  calculateSafetyStock(dailySales, leadTimeDays, serviceLevel = 0.95) {
    // 计算日均销量和标准差
    const avgDailySales = this.calculateMean(dailySales);
    const stdDailySales = this.calculateStd(dailySales);

    // 计算需求波动
    const demandVariability = stdDailySales / avgDailySales;

    // 计算供应波动(假设供应准时率)
    const supplyVariability = 0.1; // 10%波动

    // 计算Z值(服务水平对应的标准差倍数)
    const z = this.getZScore(serviceLevel);

    // 安全库存公式:Z * sqrt(需求方差*供应时间^2 + 供应方差*平均需求^2)
    const safetyStock = z * Math.sqrt(
      Math.pow(stdDailySales, 2) * leadTimeDays +
      Math.pow(supplyVariability * avgDailySales, 2) * Math.pow(leadTimeDays, 2)
    );

    return Math.ceil(safetyStock);
  }

  // 动态安全库存(根据库存策略调整)
  calculateDynamicSafetyStock(product, currentStock, daysOfCover = 7) {
    const avgDailySales = product.avgDailySales;
    const leadTime = product.supplierLeadTime;

    // 基础安全库存
    const baseSafetyStock = this.calculateSafetyStock(
      product.historicalSales,
      leadTime
    );

    // 根据库存策略调整
    let adjustedStock = baseSafetyStock;

    // 如果当前库存低于安全库存,增加安全库存
    if (currentStock < baseSafetyStock) {
      adjustedStock = baseSafetyStock * 1.5;
    }

    // 考虑季节性因素
    if (this.isPeakSeason()) {
      adjustedStock *= 1.3;
    }

    return Math.ceil(adjustedStock);
  }

  getZScore(serviceLevel) {
    const zScores = {
      0.90: 1.28,
      0.95: 1.65,
      0.99: 2.33
    };
    return zScores[serviceLevel] || 1.65;
  }
}

智能采购推荐

综合各因素生成最终采购建议:

// 智能采购推荐服务
class PurchaseRecommendationService {
  constructor() {
    this.forecastService = new DemandForecastService();
    this.safetyStockService = new SafetyStockService();
  }

  // 生成采购建议
  generateRecommendation(productId) {
    const product = this.getProduct(productId);
    const currentStock = product.currentStock;
    const onOrderQty = product.onOrderQuantity;

    // 1. 需求预测
    const forecastedDemand = this.forecastService.hybridForecast(productId, 30);

    // 2. 计算安全库存
    const safetyStock = this.safetyStockService.calculateDynamicSafetyStock(
      product,
      currentStock
    );

    // 3. 计算采购量
    const availableStock = currentStock + onOrderQty;
    const reorderPoint = safetyStock + forecastedDemand * product.leadTimeDays / 30;

    // 判断是否需要采购
    let recommendedQty = 0;
    let priority = 'normal';

    if (availableStock <= safetyStock) {
      // 库存低于安全库存,紧急采购
      priority = 'urgent';
      recommendedQty = Math.max(
        safetyStock - availableStock + forecastedDemand,
        product.economicOrderQty
      );
    } else if (availableStock <= reorderPoint) {
      // 库存达到再订货点,正常采购
      priority = 'normal';
      recommendedQty = product.economicOrderQty;
    }

    // 4. 供应商推荐
    const supplierRecommendation = this.recommendSupplier(productId, recommendedQty);

    return {
      productId,
      currentStock,
      onOrderQty,
      availableStock,
      safetyStock,
      forecastedDemand,
      reorderPoint,
      priority,
      recommendedQty,
      supplier: supplierRecommendation,
      expectedStockAfterOrder: availableStock + recommendedQty,
      daysOfStock: (availableStock + recommendedQty) / product.avgDailySales
    };
  }

  // EOQ经济订货量计算
  calculateEOQ(annualDemand, orderingCost, holdingCost) {
    return Math.ceil(Math.sqrt(2 * annualDemand * orderingCost / holdingCost));
  }

  // 供应商推荐
  recommendSupplier(productId, qty) {
    const suppliers = this.getSuppliers(productId);

    // 多因素评分
    const scored = suppliers.map(s => ({
      ...s,
      score:
        s.priceScore * 0.4 +
        s.qualityScore * 0.3 +
        s.deliveryScore * 0.2 +
        s.serviceScore * 0.1
    }));

    // 按评分排序
    scored.sort((a, b) => b.score - a.score);

    return scored[0];
  }
}

实施效果

某商贸企业智能采购系统实施效果:

总结

智能采购推荐算法通过数据分析和智能算法,帮助企业实现科学采购决策。在实际应用中,需要结合企业实际情况调整算法参数,并持续优化模型以适应市场变化。

← 下一篇:进销存订单管理模块设计 上篇:进销存系统自动化测试实践 →