444 lines
24 KiB
Markdown
444 lines
24 KiB
Markdown
# 数据库设计
|
||
|
||
<cite>
|
||
**本文引用的文件**
|
||
- [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)
|
||
</cite>
|
||
|
||
## 目录
|
||
1. [简介](#简介)
|
||
2. [项目结构](#项目结构)
|
||
3. [核心组件](#核心组件)
|
||
4. [架构总览](#架构总览)
|
||
5. [详细组件分析](#详细组件分析)
|
||
6. [依赖分析](#依赖分析)
|
||
7. [性能考虑](#性能考虑)
|
||
8. [故障排查指南](#故障排查指南)
|
||
9. [结论](#结论)
|
||
10. [附录](#附录)
|
||
|
||
## 简介
|
||
本文件面向NFLG WMS系统的数据库设计与实现,聚焦于核心业务实体(物料、库位、库存、订单等)的ER模型、表结构设计、主外键关系、数据访问层(MyBatis-Plus)实现、SQL优化策略、数据迁移与版本管理、性能优化、数据安全与备份恢复以及数据库管理员的维护与监控方法。文档内容严格基于仓库中的实体类、映射XML与配置类进行归纳总结,并通过图示化方式呈现关键流程与关系。
|
||
|
||
## 项目结构
|
||
WMS系统采用多模块分层架构,数据库相关的核心代码主要分布在以下模块:
|
||
- repository:持久层与实体定义,包含实体类、Mapper接口及XML映射、MyBatis配置与拦截器。
|
||
- common:通用领域对象(DTO/VO)、常量与工具类,用于跨模块的数据传输与业务参数封装。
|
||
- admin:管理端应用,包含启动时的缓存初始化逻辑与业务控制器。
|
||
|
||
下图为与数据库设计直接相关的模块与文件关系概览:
|
||
|
||
```mermaid
|
||
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](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/config/MysqlDataSourceConfig.java#L22-L57)
|
||
- [WmsStructuralPackageMapper.xml:1-28](file://nflg-wms-repository/src/main/resources/mapper/WmsStructuralPackageMapper.xml#L1-L28)
|
||
- [WmsInCostcenterBackTicketMapper.xml:26-42](file://nflg-wms-repository/src/main/resources/mapper/WmsInCostcenterBackTicketMapper.xml#L26-L42)
|
||
- [AuditInnerInterceptor.java:28-62](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/interceptor/AuditInnerInterceptor.java#L28-L62)
|
||
- [InventoryInDTO.java:1-71](file://nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/InventoryInDTO.java#L1-L71)
|
||
- [InventoryVO.java:1-46](file://nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/InventoryVO.java#L1-L46)
|
||
- [RedisDataInitRunner.java:1-38](file://nflg-wms-admin/src/main/java/com/nflg/wms/admin/runner/RedisDataInitRunner.java#L1-L38)
|
||
|
||
章节来源
|
||
- [MysqlDataSourceConfig.java:22-57](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/config/MysqlDataSourceConfig.java#L22-L57)
|
||
- [WmsStructuralPackageMapper.xml:1-28](file://nflg-wms-repository/src/main/resources/mapper/WmsStructuralPackageMapper.xml#L1-L28)
|
||
- [WmsInCostcenterBackTicketMapper.xml:26-42](file://nflg-wms-repository/src/main/resources/mapper/WmsInCostcenterBackTicketMapper.xml#L26-L42)
|
||
- [AuditInnerInterceptor.java:28-62](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/interceptor/AuditInnerInterceptor.java#L28-L62)
|
||
- [InventoryInDTO.java:1-71](file://nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/InventoryInDTO.java#L1-L71)
|
||
- [InventoryVO.java:1-46](file://nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/InventoryVO.java#L1-L46)
|
||
- [RedisDataInitRunner.java:1-38](file://nflg-wms-admin/src/main/java/com/nflg/wms/admin/runner/RedisDataInitRunner.java#L1-L38)
|
||
|
||
## 核心组件
|
||
本节概述与数据库设计直接相关的核心实体与视图,说明其职责与字段含义(字段命名遵循下划线风格,对应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](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsMaterial.java#L17-L126)
|
||
- [WmsWarehouse.java:14-119](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsWarehouse.java#L14-L119)
|
||
- [WmsBin.java:14-89](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsBin.java#L14-L89)
|
||
- [WmsInventory.java:15-71](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsInventory.java#L15-L71)
|
||
- [WmsStorage.java:14-93](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsStorage.java#L14-L93)
|
||
- [VStorage.java:11-37](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/VStorage.java#L11-L37)
|
||
- [WmsInventoryCheckTask.java:15-84](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsInventoryCheckTask.java#L15-L84)
|
||
- [WmsInventoryCheckTaskItem.java:13-52](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsInventoryCheckTaskItem.java#L13-L52)
|
||
- [WmsSrmOrder.java:14-84](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsSrmOrder.java#L14-L84)
|
||
|
||
## 架构总览
|
||
WMS数据库层采用MyBatis-Plus框架,结合分页与乐观锁插件,统一通过SqlSessionFactory装配Mapper XML与TypeHandler。审计拦截器用于记录SQL执行信息(当前处于注释状态,保留扩展能力)。上层通过DTO/VO进行数据传输,仓储层实体承载业务语义与持久化映射。
|
||
|
||
```mermaid
|
||
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](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/config/MysqlDataSourceConfig.java#L30-L57)
|
||
- [AuditInnerInterceptor.java:28-62](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/interceptor/AuditInnerInterceptor.java#L28-L62)
|
||
- [InventoryInDTO.java:1-71](file://nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/InventoryInDTO.java#L1-L71)
|
||
- [InventoryVO.java:1-46](file://nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/InventoryVO.java#L1-L46)
|
||
|
||
## 详细组件分析
|
||
|
||
### 实体类关系图
|
||
```mermaid
|
||
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](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsMaterial.java#L25-L126)
|
||
- [WmsWarehouse.java:22-119](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsWarehouse.java#L22-L119)
|
||
- [WmsBin.java:22-89](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsBin.java#L22-L89)
|
||
- [WmsInventory.java:23-71](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsInventory.java#L23-L71)
|
||
- [WmsStorage.java:22-93](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsStorage.java#L22-L93)
|
||
- [VStorage.java:19-37](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/VStorage.java#L19-L37)
|
||
- [WmsInventoryCheckTask.java:22-84](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsInventoryCheckTask.java#L22-L84)
|
||
- [WmsInventoryCheckTaskItem.java:20-52](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsInventoryCheckTaskItem.java#L20-L52)
|
||
- [WmsSrmOrder.java:22-84](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsSrmOrder.java#L22-L84)
|
||
|
||
章节来源
|
||
- [WmsMaterial.java:17-126](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsMaterial.java#L17-L126)
|
||
- [WmsWarehouse.java:14-119](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsWarehouse.java#L14-L119)
|
||
- [WmsBin.java:14-89](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsBin.java#L14-L89)
|
||
- [WmsInventory.java:15-71](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsInventory.java#L15-L71)
|
||
- [WmsStorage.java:14-93](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsStorage.java#L14-L93)
|
||
- [VStorage.java:11-37](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/VStorage.java#L11-L37)
|
||
- [WmsInventoryCheckTask.java:15-84](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsInventoryCheckTask.java#L15-L84)
|
||
- [WmsInventoryCheckTaskItem.java:13-52](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsInventoryCheckTaskItem.java#L13-L52)
|
||
- [WmsSrmOrder.java:14-84](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsSrmOrder.java#L14-L84)
|
||
|
||
### 数据访问层(MyBatis-Plus)实现
|
||
- 配置要点
|
||
- Mapper扫描路径:com.nflg.wms.repository.mapper
|
||
- Mapper XML位置:classpath*:mapper/**/*.xml
|
||
- 插件:乐观锁、分页(PostgreSQL类型)
|
||
- 类型处理器:UTC时间类型转换
|
||
- 驼峰映射开启、空值setter开启
|
||
- 拦截器
|
||
- 审计拦截器用于记录SQL执行信息(当前为日志记录,未启用完整审计日志写入),保留扩展空间
|
||
|
||
```mermaid
|
||
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 : "封装响应"
|
||
```
|
||
|
||
图表来源
|
||
- [MysqlDataSourceConfig.java:30-57](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/config/MysqlDataSourceConfig.java#L30-L57)
|
||
- [AuditInnerInterceptor.java:30-62](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/interceptor/AuditInnerInterceptor.java#L30-L62)
|
||
|
||
章节来源
|
||
- [MysqlDataSourceConfig.java:22-57](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/config/MysqlDataSourceConfig.java#L22-L57)
|
||
- [AuditInnerInterceptor.java:28-62](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/interceptor/AuditInnerInterceptor.java#L28-L62)
|
||
|
||
### SQL优化策略
|
||
- Mapper XML示例
|
||
- 结构化包装查询:WmsStructuralPackageMapper.search 使用函数对模型集合进行拼接展示,避免应用侧复杂拼接。
|
||
- 模糊查询与条件过滤:WmsInCostcenterBackTicketMapper通过ilike与动态条件组合实现高效检索。
|
||
- 建议
|
||
- 对高频查询字段建立合适索引(如materialNo、warehouseNo、taskNo等)。
|
||
- 控制SELECT字段范围,避免使用SELECT *。
|
||
- 利用分页插件限制结果集大小。
|
||
- 对复杂条件使用绑定变量,避免SQL注入并提升缓存命中率。
|
||
|
||
章节来源
|
||
- [WmsStructuralPackageMapper.xml:1-28](file://nflg-wms-repository/src/main/resources/mapper/WmsStructuralPackageMapper.xml#L1-L28)
|
||
- [WmsInCostcenterBackTicketMapper.xml:26-42](file://nflg-wms-repository/src/main/resources/mapper/WmsInCostcenterBackTicketMapper.xml#L26-L42)
|
||
|
||
### 数据迁移与版本管理
|
||
- 版本管理
|
||
- 通过实体类注释中的“@since 年份”标识版本演进(如2025/2026),便于追踪实体引入时间。
|
||
- 升级策略
|
||
- 新增字段:添加NOT NULL需同时提供默认值或允许NULL,并补充TypeHandler与Mapper适配。
|
||
- 删除字段:先标记弃用,再在后续版本清理。
|
||
- 字段变更:优先向后兼容,必要时提供迁移脚本与回滚方案。
|
||
- 回滚机制
|
||
- 建议在数据库层面保留历史快照与DDL审计日志,确保可回滚至最近稳定版本。
|
||
- 对关键业务表(如库存、盘点任务)执行变更前进行影子测试与数据校验。
|
||
|
||
章节来源
|
||
- [WmsMaterial.java:17-24](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsMaterial.java#L17-L24)
|
||
- [WmsWarehouse.java:14-21](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsWarehouse.java#L14-L21)
|
||
- [WmsBin.java:14-21](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsBin.java#L14-L21)
|
||
- [WmsInventory.java:15-22](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsInventory.java#L15-L22)
|
||
- [WmsStorage.java:14-21](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsStorage.java#L14-L21)
|
||
- [VStorage.java:11-18](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/VStorage.java#L11-L18)
|
||
- [WmsInventoryCheckTask.java:15-22](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsInventoryCheckTask.java#L15-L22)
|
||
- [WmsInventoryCheckTaskItem.java:13-20](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsInventoryCheckTaskItem.java#L13-L20)
|
||
- [WmsSrmOrder.java:14-21](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsSrmOrder.java#L14-L21)
|
||
|
||
### 性能优化建议
|
||
- 查询优化
|
||
- 使用DTO/VO进行窄字段查询,减少网络与序列化开销。
|
||
- 对高频过滤字段建立复合索引,如(materialNo, factoryNo, warehouseNo)。
|
||
- 索引设计
|
||
- 唯一性:对业务主键(如物料no、库位no、任务号taskNo)建立唯一索引。
|
||
- 范围/排序:对时间字段(如createTime、deliveryNoteDate)建立索引以支持排序与范围查询。
|
||
- 缓存策略
|
||
- Redis用于热点数据与序号缓存(如单号序号),启动时初始化,降低数据库压力。
|
||
- 对读多写少的配置类数据可采用本地缓存+分布式缓存双写策略。
|
||
|
||
章节来源
|
||
- [InventoryInDTO.java:1-71](file://nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/InventoryInDTO.java#L1-L71)
|
||
- [InventoryVO.java:1-46](file://nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/InventoryVO.java#L1-L46)
|
||
- [RedisDataInitRunner.java:1-38](file://nflg-wms-admin/src/main/java/com/nflg/wms/admin/runner/RedisDataInitRunner.java#L1-L38)
|
||
|
||
### 数据安全与备份恢复
|
||
- 数据安全
|
||
- 通过乐观锁插件防止并发覆盖写入。
|
||
- 审计拦截器保留SQL执行轨迹,便于问题追溯(可扩展为完整审计日志表)。
|
||
- 备份恢复
|
||
- 建议采用增量+全量备份策略,定期验证恢复流程。
|
||
- 对关键表(库存、盘点任务、出入库单据)制定RPO/RTO目标与演练计划。
|
||
|
||
章节来源
|
||
- [MysqlDataSourceConfig.java:49-56](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/config/MysqlDataSourceConfig.java#L49-L56)
|
||
- [AuditInnerInterceptor.java:28-62](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/interceptor/AuditInnerInterceptor.java#L28-L62)
|
||
|
||
### 维护指南与监控方法
|
||
- 维护指南
|
||
- 定期检查索引使用情况与碎片率,重建或重组索引。
|
||
- 监控慢查询日志,识别并优化热点SQL。
|
||
- 对新增字段与表结构变更进行回归测试。
|
||
- 监控方法
|
||
- 利用MyBatis日志与拦截器输出SQL执行信息。
|
||
- 结合数据库性能视图(如索引使用统计、锁等待)进行容量与瓶颈评估。
|
||
|
||
章节来源
|
||
- [AuditInnerInterceptor.java:30-62](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/interceptor/AuditInnerInterceptor.java#L30-L62)
|
||
|
||
## 依赖分析
|
||
- 组件耦合
|
||
- 实体类之间通过外键语义关联(WmsBin.WarehouseId → WmsWarehouse.Id;WmsStorage.warehouseId/binId → WmsWarehouse/Bin)。
|
||
- 仓储层通过Mapper XML与实体类解耦,便于扩展与测试。
|
||
- 外部依赖
|
||
- MyBatis-Plus插件链:乐观锁、分页。
|
||
- Redisson用于分布式缓存与锁。
|
||
|
||
```mermaid
|
||
graph LR
|
||
BIN["WmsBin"] --> WH["WmsWarehouse"]
|
||
ST["WmsStorage"] --> WH
|
||
ST --> BIN
|
||
INV["WmsInventory"] -.-> ST
|
||
VO["VStorage"] -.-> WH
|
||
```
|
||
|
||
图表来源
|
||
- [WmsBin.java:34-37](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsBin.java#L34-L37)
|
||
- [WmsStorage.java:84-87](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsStorage.java#L84-L87)
|
||
- [VStorage.java:30-36](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/VStorage.java#L30-L36)
|
||
|
||
章节来源
|
||
- [WmsBin.java:34-37](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsBin.java#L34-L37)
|
||
- [WmsStorage.java:84-87](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsStorage.java#L84-L87)
|
||
- [VStorage.java:30-36](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/VStorage.java#L30-L36)
|
||
|
||
## 性能考虑
|
||
- 查询路径优化
|
||
- 使用InventoryInDTO/InventoryVO进行定向查询,避免全表扫描。
|
||
- 对批量入库/出库场景,采用批处理与事务合并提交。
|
||
- 索引策略
|
||
- 主键索引:所有实体主键(自增ID)。
|
||
- 业务主键:物料no、库位no、任务号taskNo等建立唯一索引。
|
||
- 组合索引:(materialNo, factoryNo, warehouseNo)、(warehouseId, enable)等。
|
||
- 缓存与异步
|
||
- 对高频读取的配置与序号使用Redis缓存。
|
||
- 异步处理耗时操作(如报表导出、SAP同步)。
|
||
|
||
## 故障排查指南
|
||
- SQL执行问题
|
||
- 启用审计拦截器日志,定位异常SQL与参数。
|
||
- 检查Mapper XML条件拼接是否正确(如ilike与动态标签)。
|
||
- 并发写入冲突
|
||
- 使用乐观锁插件,捕获并发冲突并提示重试。
|
||
- 时间字段异常
|
||
- 确认TypeHandler对LocalDateTime的UTC转换一致。
|
||
|
||
章节来源
|
||
- [AuditInnerInterceptor.java:30-62](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/interceptor/AuditInnerInterceptor.java#L30-L62)
|
||
- [MysqlDataSourceConfig.java:49-56](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/config/MysqlDataSourceConfig.java#L49-L56)
|
||
|
||
## 结论
|
||
本设计文档基于仓库现有实体与配置,给出了WMS核心业务实体的ER模型、表结构与字段设计、主外键关系、数据访问层实现、SQL优化策略、版本管理与迁移方案、性能优化建议、数据安全与备份恢复以及运维监控方法。建议在后续版本中完善审计日志落地、细化索引策略与缓存治理,并持续进行性能与容量评估。
|
||
|
||
## 附录
|
||
- 关键流程示意(入库)
|
||
```mermaid
|
||
flowchart TD
|
||
Start(["开始"]) --> BuildDTO["组装InventoryInDTO"]
|
||
BuildDTO --> Mapper["调用Mapper执行入库"]
|
||
Mapper --> Inventory["更新WmsInventory"]
|
||
Inventory --> Storage["更新WmsStorage"]
|
||
Storage --> End(["结束"])
|
||
```
|
||
|
||
图表来源
|
||
- [InventoryInDTO.java:1-71](file://nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/InventoryInDTO.java#L1-L71)
|
||
- [WmsInventory.java:15-71](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsInventory.java#L15-L71)
|
||
- [WmsStorage.java:14-93](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsStorage.java#L14-L93) |