24 KiB
数据库设计
**本文引用的文件** - [WmsMaterial.java](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsMaterial.java) - [WmsWarehouse.java](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsWarehouse.java) - [WmsBin.java](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsBin.java) - [WmsInventory.java](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsInventory.java) - [WmsStorage.java](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsStorage.java) - [VStorage.java](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/VStorage.java) - [WmsInventoryCheckTask.java](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsInventoryCheckTask.java) - [WmsInventoryCheckTaskItem.java](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsInventoryCheckTaskItem.java) - [WmsSrmOrder.java](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsSrmOrder.java) - [InventoryInDTO.java](file://nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/InventoryInDTO.java) - [InventoryVO.java](file://nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/InventoryVO.java) - [MysqlDataSourceConfig.java](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/config/MysqlDataSourceConfig.java) - [AuditInnerInterceptor.java](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/interceptor/AuditInnerInterceptor.java) - [WmsStructuralPackageMapper.xml](file://nflg-wms-repository/src/main/resources/mapper/WmsStructuralPackageMapper.xml) - [WmsInCostcenterBackTicketMapper.xml](file://nflg-wms-repository/src/main/resources/mapper/WmsInCostcenterBackTicketMapper.xml) - [RedisDataInitRunner.java](file://nflg-wms-admin/src/main/java/com/nflg/wms/admin/runner/RedisDataInitRunner.java)目录
简介
本文件面向NFLG WMS系统的数据库设计与实现,聚焦于核心业务实体(物料、库位、库存、订单等)的ER模型、表结构设计、主外键关系、数据访问层(MyBatis-Plus)实现、SQL优化策略、数据迁移与版本管理、性能优化、数据安全与备份恢复以及数据库管理员的维护与监控方法。文档内容严格基于仓库中的实体类、映射XML与配置类进行归纳总结,并通过图示化方式呈现关键流程与关系。
项目结构
WMS系统采用多模块分层架构,数据库相关的核心代码主要分布在以下模块:
- repository:持久层与实体定义,包含实体类、Mapper接口及XML映射、MyBatis配置与拦截器。
- common:通用领域对象(DTO/VO)、常量与工具类,用于跨模块的数据传输与业务参数封装。
- admin:管理端应用,包含启动时的缓存初始化逻辑与业务控制器。
下图为与数据库设计直接相关的模块与文件关系概览:
graph TB
subgraph "持久层(repository)"
E1["实体类<br/>WmsMaterial/WmsWarehouse/WmsBin/WmsInventory/WmsStorage/VStorage"]
M1["Mapper XML<br/>WmsStructuralPackageMapper.xml<br/>WmsInCostcenterBackTicketMapper.xml"]
C1["MyBatis配置<br/>MysqlDataSourceConfig.java"]
I1["审计拦截器<br/>AuditInnerInterceptor.java"]
end
subgraph "通用(common)"
D1["DTO/VO<br/>InventoryInDTO/InventoryVO"]
end
subgraph "管理端(admin)"
R1["Redis初始化<br/>RedisDataInitRunner.java"]
end
E1 --> C1
M1 --> C1
C1 --> I1
D1 --> E1
R1 --> C1
图表来源
- MysqlDataSourceConfig.java:22-57
- WmsStructuralPackageMapper.xml:1-28
- WmsInCostcenterBackTicketMapper.xml:26-42
- AuditInnerInterceptor.java:28-62
- InventoryInDTO.java:1-71
- InventoryVO.java:1-46
- RedisDataInitRunner.java:1-38
章节来源
- MysqlDataSourceConfig.java:22-57
- WmsStructuralPackageMapper.xml:1-28
- WmsInCostcenterBackTicketMapper.xml:26-42
- AuditInnerInterceptor.java:28-62
- InventoryInDTO.java:1-71
- InventoryVO.java:1-46
- RedisDataInitRunner.java:1-38
核心组件
本节概述与数据库设计直接相关的核心实体与视图,说明其职责与字段含义(字段命名遵循下划线风格,对应MyBatis自动驼峰映射)。
-
物料(WmsMaterial)
- 关键字段:no(SAP料号)、describe(描述)、drawingNo(图号)、weight/length/width/height(物理属性)、supplierId(供应商)、requirement(打包要求)、sapState/sapError(SAP同步状态与错误信息)。
- 设计要点:使用自增ID作为主键;提供complete计算字段用于标识是否完成(图片与重量非空)。
-
库存地点(WmsWarehouse)
- 关键字段:no/name(编码/名称)、userName/checkUserName(责任人/盘点责任人)、phone/address(联系方式/地址)、factoryId(所属工厂)、isDisableLocation(是否禁用储位管理)、bigBoxFastReceipt(是否启用大箱一键收货)、sapState/sapError。
- 设计要点:启用布尔字段控制功能开关;与工厂存在隐式关联(通过factoryId)。
-
储位(WmsBin)
- 关键字段:warehouseId(所属库存地点)、no/name(编码/名称)、enable(是否启用)、remark、sapState/sapError。
- 设计要点:与WmsWarehouse构成一对多关系;启用开关便于灵活控制。
-
库存(WmsInventory)
- 关键字段:materialNo/factoryNo/warehouseNo(复合定位)、num(数量)、createBy/updateBy、createTime/updateTime。
- 设计要点:以“物料+工厂+库存地点”为核心维度聚合库存;支持批次/序列号的组合定位由上层DTO负责拼接。
-
存储(WmsStorage)
- 关键字段:materialNo/materialDesc、enable、remark、sapState/sapError、warehouseId/binId(外键指向WmsWarehouse/WmsBin)。
- 设计要点:用于物料在具体库位的存储映射;与库存维度互补。
-
视图(VStorage)
- 关键字段:id、factoryId/factoryName、materialNo、warehouseNo。
- 设计要点:简化查询维度,便于按工厂/物料/库存地点聚合展示。
-
盘点任务(WmsInventoryCheckTask)
- 关键字段:taskNo、state(0-未发布;1-已发布;2-进行中;3-已完成)、startTime/endTime、financeUserName、remark、createBy/updateBy、createTime/updateTime。
- 设计要点:任务生命周期管理;与任务明细表(WmsInventoryCheckTaskItem)配合。
-
盘点任务明细(WmsInventoryCheckTaskItem)
- 关键字段:taskId(关联任务)、warehouseId(盘点库位)、chargeUserName/chargeUserId(盘点负责人)。
- 设计要点:一个任务可覆盖多个库位,支持多人分工。
-
SRM订单(WmsSrmOrder)
- 关键字段:iuCode(工厂)、noteNum(送货单号)、purchaseGroup、waybillNum(运单号)、supplierNum/supplierName、ouCode(公司)、deliveryNoteDate、isCompleted(是否完结)。
- 设计要点:对接SRM系统,记录到货与收货状态。
章节来源
- WmsMaterial.java:17-126
- WmsWarehouse.java:14-119
- WmsBin.java:14-89
- WmsInventory.java:15-71
- WmsStorage.java:14-93
- VStorage.java:11-37
- WmsInventoryCheckTask.java:15-84
- WmsInventoryCheckTaskItem.java:13-52
- WmsSrmOrder.java:14-84
架构总览
WMS数据库层采用MyBatis-Plus框架,结合分页与乐观锁插件,统一通过SqlSessionFactory装配Mapper XML与TypeHandler。审计拦截器用于记录SQL执行信息(当前处于注释状态,保留扩展能力)。上层通过DTO/VO进行数据传输,仓储层实体承载业务语义与持久化映射。
graph TB
APP["业务服务/控制器"] --> DTO["DTO/VO<br/>InventoryInDTO/InventoryVO"]
DTO --> REPO["Repository层<br/>实体类/映射XML"]
REPO --> MP["MyBatis-Plus<br/>SqlSessionFactory"]
MP --> DB["数据库"]
MP --> PLG["插件<br/>分页/乐观锁"]
MP --> TH["TypeHandler<br/>UTC时间处理"]
MP --> AUD["审计拦截器<br/>AuditInnerInterceptor"]
图表来源
- MysqlDataSourceConfig.java:30-57
- AuditInnerInterceptor.java:28-62
- InventoryInDTO.java:1-71
- InventoryVO.java:1-46
详细组件分析
实体类关系图
classDiagram
class WmsMaterial {
+Long id
+String no
+String describe
+Integer version
+BigDecimal weight
+Long supplierId
+Short sapState
+String sapError
}
class WmsWarehouse {
+Long id
+String no
+String name
+Long factoryId
+Boolean isDisableLocation
+Short sapState
+String sapError
}
class WmsBin {
+Long id
+Long warehouseId
+String no
+String name
+Boolean enable
+Short sapState
+String sapError
}
class WmsInventory {
+Long id
+String materialNo
+String factoryNo
+String warehouseNo
+BigDecimal num
+String createBy
+String updateBy
}
class WmsStorage {
+Long id
+String materialNo
+String materialDesc
+Long warehouseId
+Long binId
+Short sapState
+String sapError
}
class VStorage {
+Long id
+Long factoryId
+String factoryName
+String materialNo
+String warehouseNo
}
class WmsInventoryCheckTask {
+Long id
+String taskNo
+Integer state
+LocalDate startTime
+LocalDate endTime
+String financeUserName
}
class WmsInventoryCheckTaskItem {
+Long id
+Long taskId
+Long warehouseId
+String chargeUserName
+Long chargeUserId
}
class WmsSrmOrder {
+Long id
+String iuCode
+String noteNum
+String supplierNum
+String supplierName
+Boolean isCompleted
}
WmsBin --> WmsWarehouse : "属于"
WmsStorage --> WmsWarehouse : "属于"
WmsStorage --> WmsBin : "属于"
WmsInventoryCheckTaskItem --> WmsInventoryCheckTask : "属于"
图表来源
- WmsMaterial.java:25-126
- WmsWarehouse.java:22-119
- WmsBin.java:22-89
- WmsInventory.java:23-71
- WmsStorage.java:22-93
- VStorage.java:19-37
- WmsInventoryCheckTask.java:22-84
- WmsInventoryCheckTaskItem.java:20-52
- WmsSrmOrder.java:22-84
章节来源
- WmsMaterial.java:17-126
- WmsWarehouse.java:14-119
- WmsBin.java:14-89
- WmsInventory.java:15-71
- WmsStorage.java:14-93
- VStorage.java:11-37
- WmsInventoryCheckTask.java:15-84
- WmsInventoryCheckTaskItem.java:13-52
- WmsSrmOrder.java:14-84
数据访问层(MyBatis-Plus)实现
- 配置要点
- Mapper扫描路径:com.nflg.wms.repository.mapper
- Mapper XML位置:classpath*:mapper/**/*.xml
- 插件:乐观锁、分页(PostgreSQL类型)
- 类型处理器:UTC时间类型转换
- 驼峰映射开启、空值setter开启
- 拦截器
- 审计拦截器用于记录SQL执行信息(当前为日志记录,未启用完整审计日志写入),保留扩展空间
sequenceDiagram
participant C as "调用方"
participant S as "Service层"
participant M as "Mapper接口"
participant MP as "MyBatis-Plus"
participant DB as "数据库"
C->>S : "提交业务请求"
S->>M : "调用Mapper方法"
M->>MP : "构建MappedStatement"
MP->>DB : "执行SQL"
DB-->>MP : "返回结果集"
MP-->>M : "映射为实体/DTO"
M-->>S : "返回结果"
S-->>C : "封装响应"
图表来源
章节来源
SQL优化策略
- Mapper XML示例
- 结构化包装查询:WmsStructuralPackageMapper.search 使用函数对模型集合进行拼接展示,避免应用侧复杂拼接。
- 模糊查询与条件过滤:WmsInCostcenterBackTicketMapper通过ilike与动态条件组合实现高效检索。
- 建议
- 对高频查询字段建立合适索引(如materialNo、warehouseNo、taskNo等)。
- 控制SELECT字段范围,避免使用SELECT *。
- 利用分页插件限制结果集大小。
- 对复杂条件使用绑定变量,避免SQL注入并提升缓存命中率。
章节来源
数据迁移与版本管理
- 版本管理
- 通过实体类注释中的“@since 年份”标识版本演进(如2025/2026),便于追踪实体引入时间。
- 升级策略
- 新增字段:添加NOT NULL需同时提供默认值或允许NULL,并补充TypeHandler与Mapper适配。
- 删除字段:先标记弃用,再在后续版本清理。
- 字段变更:优先向后兼容,必要时提供迁移脚本与回滚方案。
- 回滚机制
- 建议在数据库层面保留历史快照与DDL审计日志,确保可回滚至最近稳定版本。
- 对关键业务表(如库存、盘点任务)执行变更前进行影子测试与数据校验。
章节来源
- WmsMaterial.java:17-24
- WmsWarehouse.java:14-21
- WmsBin.java:14-21
- WmsInventory.java:15-22
- WmsStorage.java:14-21
- VStorage.java:11-18
- WmsInventoryCheckTask.java:15-22
- WmsInventoryCheckTaskItem.java:13-20
- WmsSrmOrder.java:14-21
性能优化建议
- 查询优化
- 使用DTO/VO进行窄字段查询,减少网络与序列化开销。
- 对高频过滤字段建立复合索引,如(materialNo, factoryNo, warehouseNo)。
- 索引设计
- 唯一性:对业务主键(如物料no、库位no、任务号taskNo)建立唯一索引。
- 范围/排序:对时间字段(如createTime、deliveryNoteDate)建立索引以支持排序与范围查询。
- 缓存策略
- Redis用于热点数据与序号缓存(如单号序号),启动时初始化,降低数据库压力。
- 对读多写少的配置类数据可采用本地缓存+分布式缓存双写策略。
章节来源
数据安全与备份恢复
- 数据安全
- 通过乐观锁插件防止并发覆盖写入。
- 审计拦截器保留SQL执行轨迹,便于问题追溯(可扩展为完整审计日志表)。
- 备份恢复
- 建议采用增量+全量备份策略,定期验证恢复流程。
- 对关键表(库存、盘点任务、出入库单据)制定RPO/RTO目标与演练计划。
章节来源
维护指南与监控方法
- 维护指南
- 定期检查索引使用情况与碎片率,重建或重组索引。
- 监控慢查询日志,识别并优化热点SQL。
- 对新增字段与表结构变更进行回归测试。
- 监控方法
- 利用MyBatis日志与拦截器输出SQL执行信息。
- 结合数据库性能视图(如索引使用统计、锁等待)进行容量与瓶颈评估。
章节来源
依赖分析
- 组件耦合
- 实体类之间通过外键语义关联(WmsBin.WarehouseId → WmsWarehouse.Id;WmsStorage.warehouseId/binId → WmsWarehouse/Bin)。
- 仓储层通过Mapper XML与实体类解耦,便于扩展与测试。
- 外部依赖
- MyBatis-Plus插件链:乐观锁、分页。
- Redisson用于分布式缓存与锁。
graph LR
BIN["WmsBin"] --> WH["WmsWarehouse"]
ST["WmsStorage"] --> WH
ST --> BIN
INV["WmsInventory"] -.-> ST
VO["VStorage"] -.-> WH
图表来源
章节来源
性能考虑
- 查询路径优化
- 使用InventoryInDTO/InventoryVO进行定向查询,避免全表扫描。
- 对批量入库/出库场景,采用批处理与事务合并提交。
- 索引策略
- 主键索引:所有实体主键(自增ID)。
- 业务主键:物料no、库位no、任务号taskNo等建立唯一索引。
- 组合索引:(materialNo, factoryNo, warehouseNo)、(warehouseId, enable)等。
- 缓存与异步
- 对高频读取的配置与序号使用Redis缓存。
- 异步处理耗时操作(如报表导出、SAP同步)。
故障排查指南
- SQL执行问题
- 启用审计拦截器日志,定位异常SQL与参数。
- 检查Mapper XML条件拼接是否正确(如ilike与动态标签)。
- 并发写入冲突
- 使用乐观锁插件,捕获并发冲突并提示重试。
- 时间字段异常
- 确认TypeHandler对LocalDateTime的UTC转换一致。
章节来源
结论
本设计文档基于仓库现有实体与配置,给出了WMS核心业务实体的ER模型、表结构与字段设计、主外键关系、数据访问层实现、SQL优化策略、版本管理与迁移方案、性能优化建议、数据安全与备份恢复以及运维监控方法。建议在后续版本中完善审计日志落地、细化索引策略与缓存治理,并持续进行性能与容量评估。
附录
- 关键流程示意(入库)
flowchart TD
Start(["开始"]) --> BuildDTO["组装InventoryInDTO"]
BuildDTO --> Mapper["调用Mapper执行入库"]
Mapper --> Inventory["更新WmsInventory"]
Inventory --> Storage["更新WmsStorage"]
Storage --> End(["结束"])
图表来源