# 数据库设计 **本文引用的文件** - [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) ## 目录 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["实体类
WmsMaterial/WmsWarehouse/WmsBin/WmsInventory/WmsStorage/VStorage"] M1["Mapper XML
WmsStructuralPackageMapper.xml
WmsInCostcenterBackTicketMapper.xml"] C1["MyBatis配置
MysqlDataSourceConfig.java"] I1["审计拦截器
AuditInnerInterceptor.java"] end subgraph "通用(common)" D1["DTO/VO
InventoryInDTO/InventoryVO"] end subgraph "管理端(admin)" R1["Redis初始化
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
InventoryInDTO/InventoryVO"] DTO --> REPO["Repository层
实体类/映射XML"] REPO --> MP["MyBatis-Plus
SqlSessionFactory"] MP --> DB["数据库"] MP --> PLG["插件
分页/乐观锁"] MP --> TH["TypeHandler
UTC时间处理"] MP --> AUD["审计拦截器
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)