个人编程网站

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

进销存系统批次管理与效期预警实现

为什么需要批次管理

对于食品、药品、化妆品等行业,商品的批次和有效期管理是合规经营的硬性要求。即使是一般商贸企业,批次管理也能帮助实现先进先出(FIFO),降低库存积压和过期损耗。

批次编码规则设计

批次号需要具备唯一性和可读性,推荐格式:

批次号 = 商品编码(6位) + 入库日期(YYYYMMDD) + 流水号(3位)
示例:A01001-20250524-001

数据库表结构设计

采用"库存主表 + 批次明细表"的双层结构:

-- 库存主表(按商品汇总)
CREATE TABLE inventory (
  id BIGINT PRIMARY KEY,
  product_id VARCHAR(20) NOT NULL,
  warehouse_id VARCHAR(20) NOT NULL,
  quantity DECIMAL(18,4) DEFAULT 0,
  amount DECIMAL(18,4) DEFAULT 0,
  UNIQUE KEY uk_product_warehouse (product_id, warehouse_id)
);

-- 批次明细表
CREATE TABLE inventory_batch (
  id BIGINT PRIMARY KEY,
  product_id VARCHAR(20) NOT NULL,
  warehouse_id VARCHAR(20) NOT NULL,
  batch_no VARCHAR(30) NOT NULL,
  production_date DATE,
  expiry_date DATE,
  quantity DECIMAL(18,4) DEFAULT 0,
  remaining_qty DECIMAL(18,4) DEFAULT 0,
  INDEX idx_expiry (expiry_date),
  INDEX idx_product (product_id, warehouse_id)
);

先进先出(FIFO)出库算法

出库时按批次入库时间先后顺序扣减库存:

async function fifoOut(productId, warehouseId, outQty) {
  const batches = await db.query(
    `SELECT * FROM inventory_batch
     WHERE product_id = ? AND warehouse_id = ? AND remaining_qty > 0
     ORDER BY production_date ASC, id ASC`,
    [productId, warehouseId]
  );

  let remaining = outQty;
  const details = [];

  for (const batch of batches) {
    if (remaining <= 0) break;
    const deduct = Math.min(remaining, batch.remaining_qty);
    batch.remaining_qty -= deduct;
    remaining -= deduct;
    await db.update('inventory_batch', { remaining_qty: batch.remaining_qty }, { id: batch.id });
    details.push({ batch_no: batch.batch_no, quantity: deduct });
  }

  if (remaining > 0) {
    throw new Error('库存不足,缺少数量:' + remaining);
  }

  return details;
}

效期预警机制

设置三级预警阈值:

预警级别 触发条件 处理方式
黄色预警 距到期 90 天 系统消息提醒采购/库管
橙色预警 距到期 30 天 邮件 + 站内信,优先出库
红色预警 距到期 7 天或已过期 冻结库存,人工处理

定时预警任务

-- 每日凌晨执行
SELECT
  product_id, batch_no, expiry_date,
  DATEDIFF(expiry_date, CURDATE()) as days_left,
  remaining_qty
FROM inventory_batch
WHERE remaining_qty > 0
  AND DATEDIFF(expiry_date, CURDATE()) <= 90
ORDER BY expiry_date ASC;

总结

批次管理是进销存系统的核心能力之一。通过合理的表结构设计、FIFO 出库算法和多级效期预警,可以有效降低企业的库存损耗风险,满足行业合规要求。

下一篇:进销存系统智能补货算法与需求预测 →