【仓库】仓库与库区库位、条码赋码、SN码
仓库基础设置模块,由 yudao-module-mes 后端模块的 wm.warehouse、wm.barcode、wm.sn 包实现,是仓储管理的基础设施层,为所有出入库单据和库存管理提供底层支撑。
本文涉及三个子模块:
- 仓库与库区库位:建立
仓库 → 库区 → 库位的三级空间层次结构,所有出入库单据行都需要指定具体的仓库/库区/库位。系统还内置了一个虚拟线边库用于生产领料场景的在制品管理。 - 条码赋码:为仓库、库位、物料、工单等各类业务对象生成条码(二维码/条形码),支持通过配置模板自动或手动赋码,前端根据条码内容渲染条码图片。
- SN 码:为产品物料生成唯一的序列号(Serial Number),按批次方式批量生成,支持分组管理和导出。
本文涉及表如下图所示:

# 1. 仓库与库区库位
仓库与库区库位构成 MES 仓储管理的三级空间层次,分别由 MesWmWarehouseController、MesWmWarehouseLocationController、MesWmWarehouseAreaController 提供接口。
仓库三级层次结构
仓库(Warehouse)
└── 库区(Location)
└── 库位(Area)
- 仓库:最高级别的空间划分,代表一个物理仓库,如"成品仓"、"原材料仓"。
- 库区:仓库内的功能区域划分,如"A 区"、"B 区"。
- 库位:最小的存储单元,对应一个具体的货架/货位,如"A-01-01"。
所有出入库单据行(如采购入库行、生产领料行等)都需要指定到仓库、库区和库位。
如果工厂在管理过程中并未区分库区、库位,可为每个仓库配置一个默认库区,每个库区配置一个默认库位即可。
# 1.1 仓库表结构
省略 creator/create_time/updater/update_time/deleted/tenant_id 等通用字段
CREATE TABLE `mes_wm_warehouse` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`code` varchar(64) NOT NULL COMMENT '仓库编码',
`name` varchar(255) NOT NULL COMMENT '仓库名称',
`address` varchar(500) DEFAULT NULL COMMENT '仓库地址',
`area` decimal(14,2) DEFAULT NULL COMMENT '面积',
`charge_user_id` bigint DEFAULT NULL COMMENT '负责人用户编号',
`frozen` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否冻结',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='MES 仓库';
① charge_user_id 关联 system_users 表的 id 字段,标识仓库负责人。
② frozen 为冻结标识。冻结后该仓库下的所有出入库操作将受到限制。
虚拟线边库
系统默认提供一个编码为 WIP_VIRTUAL_WAREHOUSE 的虚拟线边库(通过 SQL 脚本随模块初始化时创建),用于解决"发料与实际消耗"的解耦问题。
业务背景:在线边库模式下,物料从总仓库发放到车间,但未被工序消耗前,这部分物料属于在制品(WIP)。虚拟线边库在不增加物理库位管理复杂度的前提下,防止生产报工被负库存阻塞。
虚拟线边库同时配套虚拟库区(WIP_VIRTUAL_LOCATION)和虚拟库位(WIP_VIRTUAL_AREA),构成完整的三级层次。
# 1.2 库区表结构
省略 creator/create_time/updater/update_time/deleted/tenant_id 等通用字段
CREATE TABLE `mes_wm_warehouse_location` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`code` varchar(64) NOT NULL COMMENT '库区编码',
`name` varchar(255) NOT NULL COMMENT '库区名称',
`warehouse_id` bigint NOT NULL COMMENT '仓库编号',
`area` decimal(14,2) DEFAULT NULL COMMENT '面积',
`frozen` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否冻结',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='MES 库区';
① warehouse_id 关联 mes_wm_warehouse 表的 id 字段,标识该库区所属的仓库。库区是仓库的下级层次。
② frozen 为冻结标识。冻结后该库区下的所有出入库操作将受到限制。
# 1.3 库位表结构
省略 creator/create_time/updater/update_time/deleted/tenant_id 等通用字段
CREATE TABLE `mes_wm_warehouse_area` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`code` varchar(64) NOT NULL COMMENT '库位编码',
`name` varchar(255) NOT NULL COMMENT '库位名称',
`location_id` bigint NOT NULL COMMENT '库区编号',
`area` decimal(14,2) DEFAULT NULL COMMENT '面积',
`max_load` decimal(14,2) DEFAULT NULL COMMENT '最大载重',
`position_x` int DEFAULT NULL COMMENT '位置 X',
`position_y` int DEFAULT NULL COMMENT '位置 Y',
`position_z` int DEFAULT NULL COMMENT '位置 Z',
`status` tinyint NOT NULL DEFAULT '0' COMMENT '状态',
`frozen` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否冻结',
`allow_item_mixing` bit(1) NOT NULL DEFAULT b'1' COMMENT '是否允许物料混放',
`allow_batch_mixing` bit(1) NOT NULL DEFAULT b'1' COMMENT '是否允许批次混放',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='MES 库位';
① location_id 关联 mes_wm_warehouse_location 表的 id 字段,标识该库位所属的库区。库位是库区的下级层次。
② status 为库位状态,对应 CommonStatusEnum 枚举。
③ frozen 为冻结标识。冻结后该库位的出入库操作将受到限制。
④ allow_item_mixing 为是否允许物料混放。关闭时同一个库位只能存放同一种物料。
⑤ allow_batch_mixing 为是否允许批次混放。关闭时同一库位只能存放同一批次的物料。
# 1.4 管理后台
仓库、库区、库位分别对应 [MES 系统 -> 仓库管理] 下的「仓库设置」「库区设置」「库位设置」菜单,对应 yudao-ui-admin-vue3 项目的 @/views/mes/wm/warehouse 目录。
# 仓库列表
支持按仓库编码、仓库名称等条件搜索。列表展示仓库编码、名称、地址、面积、负责人、冻结状态等信息。新增/修改时填写仓库编码、名称、地址、面积、负责人、是否冻结等。

# 库区列表
支持按库区编码、库区名称、所属仓库等条件搜索。列表展示库区编码、名称、所属仓库、面积、冻结状态等信息。新增/修改时需选择所属仓库。

# 库位列表
支持按库位编码、库位名称、所属库区、所属仓库等条件搜索。列表展示库位编码、名称、所属库区、状态、冻结标识、混放策略等信息。新增/修改时需级联选择仓库→库区,并可设置是否允许物料混放、批次混放。

# 2. 条码赋码
条码赋码���条码配置和条码清单两部分组成。条码配置定义各业务类型的条码生成规则,条码清单存储实际生成的每一条条码记录。分别由 MesWmBarcodeConfigController 和 MesWmBarcodeController 提供接口。
# 2.1 条码配置表结构
省略 creator/create_time/updater/update_time/deleted/tenant_id 等通用字段
CREATE TABLE `mes_wm_barcode_config` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`format` tinyint NOT NULL COMMENT '条码格式',
`biz_type` int NOT NULL COMMENT '业务类型',
`content_format` varchar(500) DEFAULT NULL COMMENT '内容格式模板',
`content_example` varchar(500) DEFAULT NULL COMMENT '内容样例',
`auto_generate_flag` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否自动生成',
`default_template` varchar(500) DEFAULT NULL COMMENT '默认打印模板',
`status` tinyint NOT NULL DEFAULT '0' COMMENT '状态',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='MES 条码配置';
① format 为条码格式,枚举 BarcodeFormatEnum(1=二维码 QR_CODE,2=EAN13,3=CODE39,4=UPC-A)。
② biz_type 为业务类型,枚举 BarcodeBizTypeEnum,定义了可以赋码的业务对象。
同一租户下同一 biz_type 只能有一条条码配置(通过唯一索引 uk_biz_type(biz_type, deleted, tenant_id) 保证)。涵盖仓库、库区、库位、物料、工单、设备、供应商、客户、工作站等多种业务对象。
③ content_format 为内容格式模板,支持 {BUSINESSCODE} 占位符。生成条码内容时,系统将 {BUSINESSCODE} 替换为实际的业务编码。例如配置 ITEM-{BUSINESSCODE},当物料编码为 M001 时,生成的条码内容为 ITEM-M001。
④ auto_generate_flag 为是否自动生成。开启后,当创建相应业务对象(如创建物料)时,系统会自动调用 autoGenerateBarcode 方法生成条码记录,无需手动操作。
⑤ default_template 为默认打印模板(预留字段,暂未使用)。
⑥ status 为启用状态,对应 CommonStatusEnum 枚举。
# 2.2 条码清单表结构
省略 creator/create_time/updater/update_time/deleted/tenant_id 等通用字段
CREATE TABLE `mes_wm_barcode` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`config_id` bigint NOT NULL COMMENT '条码配置编号',
`format` tinyint NOT NULL COMMENT '条码格式',
`biz_type` int NOT NULL COMMENT '业务类型',
`biz_id` bigint DEFAULT NULL COMMENT '业务编号',
`biz_code` varchar(255) DEFAULT NULL COMMENT '业务编码',
`biz_name` varchar(255) DEFAULT NULL COMMENT '业务名称',
`content` varchar(500) NOT NULL COMMENT '条码内容',
`status` tinyint NOT NULL DEFAULT '0' COMMENT '状态',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='MES 条码清单';
① config_id 关联 mes_wm_barcode_config 表的 id 字段,标识生成该条码所使用的配置。创建时自动根据 biz_type 匹配对应的条码配置。
② format 为条码格式,从条码配置中自动带入。前端根据此字段决定渲染二维码还是条形码。
③ biz_type、biz_id、biz_code、biz_name 为关联的业务对象标识。同一 biz_type + biz_id 组合唯一,同一 content 也全局唯一。
④ content 为条码内容,核心字段。前端根据此内容生成条码图片。如果前端未传递,系统会根据条码配置的 content_format 模板和 biz_code 自动生成。
⑤ status 为启用状态,对应 CommonStatusEnum 枚举。
# 2.3 管理后台
条码配置对应 [MES 系统 -> 仓库管理 -> 条码赋码 → 条码配置] 菜单,条码清单对应同菜单下的「条码清单」子页,分别对应 yudao-ui-admin-vue3 项目的 @/views/mes/wm/barcode/config 和 @/views/mes/wm/barcode 目录。
# 条码配置列表
展示所有条码配置,包含条码格式、业务类型、内容格式模板、内容样例、是否自动生成、启用状态等。

# 条码清单列表
支持按业务类型、条码内容、业务编码等条件搜索。列表展示条码格式、业务类型、条码内容、业务编码/名称、状态等信息。

# 生成条码内容
通过 MesWmBarcodeController 的 generateBarcodeContent 方法(GET /mes/wm/barcode/generate-content),传入业务类型(bizType)和业务编码(bizCode),系统使用对应配置的内容格式模板生成条码内容字符串。例如:bizType=600(物料)、bizCode=M001,若配置模板为 ITEM-{BUSINESSCODE},则返回 ITEM-M001。
# 3. SN 码
SN 码(Serial Number,序列号),由 MesWmSnController 提供接口。
# 3.1 表结构
省略 creator/create_time/updater/update_time/deleted/tenant_id 等通用字段
CREATE TABLE `mes_wm_sn` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`uuid` varchar(64) NOT NULL COMMENT '批次 UUID',
`code` varchar(100) NOT NULL COMMENT 'SN 码',
`item_id` bigint NOT NULL COMMENT '物料编号',
`batch_code` varchar(100) DEFAULT NULL COMMENT '批次号',
`work_order_id` bigint DEFAULT NULL COMMENT '生产工单编号',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='MES SN 码';
① uuid 为批次 UUID,标记同一批次生成的 SN 码。每次调用生成接口时,系统自动生成一个 UUID 作为批次标识,方便按批次管理(查看明细、批量删除、导出等)。
② code 为 SN 码,唯一标识一个产品个体。由编码规则自动生成。
③ item_id 关联 mes_md_item 表的 id 字段(必填),标识该 SN 码对应的产品物料,详见 《【基础】物料产品、分类、计量单位》。
④ batch_code 为批次号(选填),可关联批次管理。
⑤ work_order_id 关联 mes_pro_work_order 表的 id 字段(选填),标识该 SN 码关联的生产工单。目前仅作为信息标识存储,暂未在业务流程中引用。
# 3.2 管理后台
对应 [MES 系统 -> 仓库管理 -> SN 码管理] 菜单,对应 yudao-ui-admin-vue3 项目的 @/views/mes/wm/sn 目录。
# 列表(分组视图)
SN 码列表采用分组视图展示,以批次 UUID 为维度聚合显示。每条分组记录展示:物料编码/名称/规格、批次号、SN 数量、创建时间。支持按物料、批次号等条件搜索。
操作列提供:查看明细、导出 SN 明细 Excel、批量删除。

# 生成 SN 码
点击【生成 SN 码】按钮,弹出生成表单,填写物料(必填)、批次号(选填)、生产工单(选填)、生成数量(1~1000)。
系统在一次事务中批量生成指定数量的 SN 码,所有码共享同一个批次 UUID。每条 SN 码通过编码规则自动生成唯一编号。

# 批量删除
按批次 UUID 删除同批次的所有 SN 码。