# 客户、供应商、商品、SKU 约定见 [00-conventions.md](./00-conventions.md)。Phase 1 锁定,Phase 6 写迁移。 `customer` 是货主,不是商城买家。3PL 场景下库存、商品、订单都归属某个货主。 `sku_code` 在租户内唯一。两个货主不能共用同一个 SKU 编码;需要区分时由租户分配不同编码。 ## wms_customer 客户(货主) 用途:租户服务的货主。 | 字段 | 类型 | 可空 | 默认 | 说明 | | --- | --- | --- | --- | --- | | id | BIGINT UNSIGNED | N | AUTO_INCREMENT | 内部主键 | | tenant_code | VARCHAR(32) | N | | 租户编码 | | customer_code | VARCHAR(64) | N | | 客户编码 | | name | VARCHAR(128) | N | | 名称 | | status | VARCHAR(32) | N | active | 状态 | | created_at | TIMESTAMP | Y | | | | updated_at | TIMESTAMP | Y | | | | deleted_at | TIMESTAMP | Y | | 软删除 | 索引: | 名称 | 类型 | 字段 | 支撑的查询 | | --- | --- | --- | --- | | uk_tenant_customer_code | UNIQUE | (tenant_code, customer_code) | 按客户编码查找 | | idx_tenant_status | INDEX | (tenant_code, status) | 列表筛选 | 状态:`active`、`disabled`。 关联:商品、库存、入库、出库、订单带 `customer_code`。 并发 / 审计:已有库存或未完成单据时不能软删。变更写 `wms_operation_log`。 ## wms_supplier 供应商 用途:入库来源。`customer_code` 为空表示租户共用供应商,有值表示该货主的供应商。 | 字段 | 类型 | 可空 | 默认 | 说明 | | --- | --- | --- | --- | --- | | id | BIGINT UNSIGNED | N | AUTO_INCREMENT | 内部主键 | | tenant_code | VARCHAR(32) | N | | 租户编码 | | supplier_code | VARCHAR(64) | N | | 供应商编码 | | customer_code | VARCHAR(64) | Y | | 所属货主,空为租户共用 | | name | VARCHAR(128) | N | | 名称 | | status | VARCHAR(32) | N | active | 状态 | | created_at | TIMESTAMP | Y | | | | updated_at | TIMESTAMP | Y | | | | deleted_at | TIMESTAMP | Y | | 软删除 | 索引: | 名称 | 类型 | 字段 | 支撑的查询 | | --- | --- | --- | --- | | uk_tenant_supplier_code | UNIQUE | (tenant_code, supplier_code) | 按供应商编码查找 | | idx_tenant_customer | INDEX | (tenant_code, customer_code) | 某货主的供应商 | 状态:`active`、`disabled`。 关联:`wms_inbound.supplier_code`、`wms_batch.supplier_code`。 并发 / 审计:被未完成入库单引用时不能软删。 ## wms_product 商品 用途:SKU 的上层商品,归属货主。 | 字段 | 类型 | 可空 | 默认 | 说明 | | --- | --- | --- | --- | --- | | id | BIGINT UNSIGNED | N | AUTO_INCREMENT | 内部主键 | | tenant_code | VARCHAR(32) | N | | 租户编码 | | customer_code | VARCHAR(64) | N | | 货主 | | product_code | VARCHAR(64) | N | | 商品编码,租户内唯一 | | product_name | VARCHAR(255) | N | | 名称 | | status | VARCHAR(32) | N | active | 状态 | | created_at | TIMESTAMP | Y | | | | updated_at | TIMESTAMP | Y | | | | deleted_at | TIMESTAMP | Y | | 软删除 | 索引: | 名称 | 类型 | 字段 | 支撑的查询 | | --- | --- | --- | --- | | uk_tenant_product_code | UNIQUE | (tenant_code, product_code) | 按商品编码查找 | | idx_tenant_customer_status | INDEX | (tenant_code, customer_code, status) | 货主下的商品列表 | 状态:`active`、`disabled`。 关联:`wms_sku.product_code`。 并发 / 审计:下属 SKU 仍存在时不能软删。 ## wms_sku SKU 用途:库存与单据的基本物料。数量的「1」等于本表的基本单位。 | 字段 | 类型 | 可空 | 默认 | 说明 | | --- | --- | --- | --- | --- | | id | BIGINT UNSIGNED | N | AUTO_INCREMENT | 内部主键 | | tenant_code | VARCHAR(32) | N | | 租户编码 | | customer_code | VARCHAR(64) | N | | 货主 | | product_code | VARCHAR(64) | N | | 商品编码 | | sku_code | VARCHAR(64) | N | | SKU 编码,租户内唯一 | | sku_name_cn | VARCHAR(255) | N | | 中文名称 | | sku_name_en | VARCHAR(255) | N | | 英文名称 | | sku_unit | VARCHAR(32) | N | pcs | 基本单位 | | length_cm | DECIMAL(10,2) | Y | | 长,厘米 | | width_cm | DECIMAL(10,2) | Y | | 宽,厘米 | | height_cm | DECIMAL(10,2) | Y | | 高,厘米 | | weight_g | DECIMAL(16,4) | Y | | 重量,克 | | status | VARCHAR(32) | N | active | 状态 | | created_at | TIMESTAMP | Y | | | | updated_at | TIMESTAMP | Y | | | | deleted_at | TIMESTAMP | Y | | 软删除 | 索引: | 名称 | 类型 | 字段 | 支撑的查询 | | --- | --- | --- | --- | | uk_tenant_sku_code | UNIQUE | (tenant_code, sku_code) | 按 SKU 编码查找 | | idx_tenant_customer_product | INDEX | (tenant_code, customer_code, product_code) | 商品下的 SKU | | idx_tenant_customer_status | INDEX | (tenant_code, customer_code, status) | 货主下的 SKU 列表 | 状态:`active`、`disabled`。停用后禁止新的入库与分配,已有库存仍可出完。 关联:条码、包装、库存、单据明细。 并发 / 审计:存在非零库存时不能软删。变更写 `wms_operation_log`。 ## wms_sku_barcode 条码 用途:一个 SKU 多条码。扫描时按租户内条码定位 SKU。 | 字段 | 类型 | 可空 | 默认 | 说明 | | --- | --- | --- | --- | --- | | id | BIGINT UNSIGNED | N | AUTO_INCREMENT | 内部主键 | | tenant_code | VARCHAR(32) | N | | 租户编码 | | sku_code | VARCHAR(64) | N | | SKU 编码 | | barcode | VARCHAR(64) | N | | 条码,租户内唯一 | | barcode_type | VARCHAR(32) | N | unit | 类型 | | created_at | TIMESTAMP | Y | | | | updated_at | TIMESTAMP | Y | | | 索引: | 名称 | 类型 | 字段 | 支撑的查询 | | --- | --- | --- | --- | | uk_tenant_barcode | UNIQUE | (tenant_code, barcode) | 扫码 | | idx_tenant_sku | INDEX | (tenant_code, sku_code) | SKU 的全部条码 | `barcode_type`:`unit` 单品、`case` 箱、`pallet` 托。 关联:`wms_sku.sku_code`。箱、托条码只用于识别 SKU,换算数量以 `wms_pack_spec` 为准。 并发 / 审计:无软删除。解除绑定即删行,并写 `wms_operation_log`。 ## wms_pack_spec 包装规格 用途:相对基本单位的包装。`qty_per_pack` 表示这一包等于多少基本单位。 | 字段 | 类型 | 可空 | 默认 | 说明 | | --- | --- | --- | --- | --- | | id | BIGINT UNSIGNED | N | AUTO_INCREMENT | 内部主键 | | tenant_code | VARCHAR(32) | N | | 租户编码 | | sku_code | VARCHAR(64) | N | | SKU 编码 | | pack_code | VARCHAR(64) | N | | 包装编码,SKU 内唯一 | | name | VARCHAR(128) | N | | 名称 | | qty_per_pack | DECIMAL(16,4) | N | | 含基本单位数量,必须大于 0 | | length_mm | DECIMAL(10,2) | Y | | | | width_mm | DECIMAL(10,2) | Y | | | | height_mm | DECIMAL(10,2) | Y | | | | weight_g | DECIMAL(16,4) | Y | | | | created_at | TIMESTAMP | Y | | | | updated_at | TIMESTAMP | Y | | | 索引: | 名称 | 类型 | 字段 | 支撑的查询 | | --- | --- | --- | --- | | uk_tenant_sku_pack | UNIQUE | (tenant_code, sku_code, pack_code) | 按包装编码查找 | 关联:`wms_sku.sku_code`。库存与单据数量仍记基本单位,不按包装记账。 并发 / 审计:无软删除。修改 `qty_per_pack` 不影响已记账数量。