在仓库管理系统的开发中,跟踪库存过期日期需要围绕货品、入库批次、库存变动三个核心维度设计表结构,确保每一批入库货品的过期时间可被精准记录,同时支持按过期时间范围快速筛选库存数据。

核心表结构设计
1. 货品基础信息表 product
存储货品的基础属性,包含货品唯一标识、名称、默认保质期等信息,是库存跟踪的基础参照表。
CREATE TABLE `product` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '货品ID', `product_code` VARCHAR(50) NOT NULL COMMENT '货品编码', `product_name` VARCHAR(100) NOT NULL COMMENT '货品名称', `default_shelf_life` INT UNSIGNED DEFAULT NULL COMMENT '默认保质期(单位:天)', `unit` VARCHAR(20) NOT NULL COMMENT '计量单位', `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_product_code` (`product_code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='货品基础信息表';
2. 入库批次表 inbound_batch
记录每一次货品入库的批次信息,每一批货品对应唯一的过期日期,是跟踪过期日期的核心表。
CREATE TABLE `inbound_batch` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '批次ID', `batch_no` VARCHAR(50) NOT NULL COMMENT '批次号', `product_id` INT UNSIGNED NOT NULL COMMENT '关联货品ID', `inbound_num` INT UNSIGNED NOT NULL COMMENT '入库数量', `remain_num` INT UNSIGNED NOT NULL COMMENT '剩余库存数量', `production_date` DATE NOT NULL COMMENT '生产日期', `expiry_date` DATE NOT NULL COMMENT '过期日期', `inbound_time` DATETIME NOT NULL COMMENT '入库时间', `warehouse_id` INT UNSIGNED NOT NULL COMMENT '所属仓库ID', `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_batch_no` (`batch_no`), KEY `idx_product_expiry` (`product_id`, `expiry_date`), KEY `idx_expiry_date` (`expiry_date`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='入库批次表';
3. 库存变动记录表 inventory_change
记录库存的每一次变动(出库、盘点调整等),保证库存数量变动可追溯,同时关联对应的入库批次。
CREATE TABLE `inventory_change` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '变动记录ID', `batch_id` INT UNSIGNED NOT NULL COMMENT '关联入库批次ID', `change_type` TINYINT NOT NULL COMMENT '变动类型 1-出库 2-盘点减 3-盘点加', `change_num` INT NOT NULL COMMENT '变动数量(正数表示增加,负数表示减少)', `change_time` DATETIME NOT NULL COMMENT '变动时间', `operator_id` INT UNSIGNED NOT NULL COMMENT '操作人ID', `remark` VARCHAR(200) DEFAULT NULL COMMENT '备注', PRIMARY KEY (`id`), KEY `idx_batch_id` (`batch_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='库存变动记录表';
表结构关联逻辑
三个表通过外键关联形成完整的库存跟踪链路:inbound_batch.product_id关联product.id,确定批次对应的货品;inventory_change.batch_id关联inbound_batch.id,确定变动对应的入库批次。每一批货品的过期日期直接存储在inbound_batch.expiry_date字段中,无需重复计算,查询时可直接通过该字段筛选。
过期库存查询示例
以下是查询30天内即将过期的库存的SQL示例,可直接用于系统的过期预警功能:
SELECT p.product_code AS 货品编码, p.product_name AS 货品名称, b.batch_no AS 批次号, b.remain_num AS 剩余数量, b.expiry_date AS 过期日期, DATEDIFF(b.expiry_date, CURDATE()) AS 剩余天数 FROM inbound_batch b JOIN product p ON b.product_id = p.id WHERE b.remain_num > 0 AND b.expiry_date BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 30 DAY) ORDER BY b.expiry_date ASC;
设计注意事项
- 入库时如果货品有默认保质期,可根据生产日期自动计算过期日期,减少人工输入错误
inbound_batch表的remain_num字段建议在入库和出库时通过事务更新,保证数据一致性- 如果系统需要支持多仓库管理,可在
inbound_batch表中增加仓库ID字段,按仓库维度统计过期库存 - 过期日期字段建议使用DATE类型,避免存储时间部分带来的查询误差