Skip to main content

系统概要设计文档

1. 项目概述​

1.1 项目背景​

BSG-WM 是一款面向仓库管理的综合性解决方案,旨在实现仓库入库、出库流程的数字化管理,并与 NetSuite ERP 系统进行无缝对接,提升企业仓储运营效率。

1.2 项目组成​

组成部分技术栈部署方式职责说明
后端服务Java 25 + Spring Boot 4.0.5容器化部署核心业务逻辑、数据处理、NetSuite集成
前端PC管理平台Vue 3 + TypeScript + Element Plus静态资源部署仓库管理后台、数据分析、日志查询
安卓APPAndroid NativeAPK分发移动端扫码入库/出库操作

1.3 核心业务目标​

业务目标描述
序列号管理实现商品序列号的全生命周期追踪(入库→在库→出库)
入库管理采购订单转化为入库单,记录入库明细
出库管理销售订单转化为出库单,完成发货操作
扫码操作通过移动端APP扫描序列号完成出入库确认
NetSuite集成与NetSuite ERP系统实时同步业务数据
日志审计完整记录所有操作日志,支持追溯审计

2. 技术架构​

2.1 系统架构图​

┌─────────────────────────────────────────────────────────────────────┐
│ 外部系统层 │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────────┐ │
│ │ NetSuite │ │ 安卓APP │ │ PC管理平台 │ │
│ │ ERP系统 │ │ (扫码操作) │ │ (后台管理) │ │
│ └──────┬───────┘ └──────┬───────┘ └──────────┬───────────┘ │
└─────────┼───────────────────┼────────────────────────┼──────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────────────────────────────────────┐
│ API网关层 │
│ ┌─────────────────────────────────────┐ │
│ │ Spring Security + JWT │ │
│ │ TokenAuthenticationFilter │ │
│ └─────────────────────────────────────┘ │
└────────────────────────────┬────────────────────────────────────────┘
│
┌────────────────────────────▼────────────────────────────────────────┐
│ 业务服务层 │
│ ┌──────────┐ ┌──────────────┐ ┌──────────────┐ ┌────────────────┐ │
│ │ Auth │ │ NetSuite │ │ ItemSn │ │ LogService │ │
│ │ Service │ │ Service │ │ Service │ │ (审计日志) │ │
│ └──────────┘ └──────────────┘ └──────────────┘ └────────────────┘ │
└────────────────────────────┬────────────────────────────────────────┘
│
┌────────────────────────────▼────────────────────────────────────────┐
│ 数据访问层 │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ JPA │ │ Redis │ │ JDBC │ │
│ │ Repository │ │ Cache │ │ Template │ │
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │
└─────────┼───────────────────┼───────────────────┼──────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────────────────────────────────────┐
│ 数据存储层 │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ MySQL │ │ Redis │ │
│ │ (业务数据/日志) │ │ (缓存/Token) │ │
│ └──────────────────┘ └──────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘

2.2 技术选型​

分类技术版本选型理由
语言Java25LTS版本,性能稳定,支持虚拟线程
框架Spring Boot4.0.5社区成熟,生态完善,便于快速构建RESTful服务
数据库MySQL8.0+开源稳定,事务支持完善,适合企业级应用
缓存Redis7.0+高性能缓存,支持分布式锁和数据持久化
ORMSpring Data JPA3.2.x简化数据访问层开发,支持自动生成SQL
安全Spring Security6.2.x成熟的安全框架,支持JWT认证
API文档SpringDoc OpenAPI3.0.x自动生成API文档,便于前后端协作
监控OpenTelemetry2.21.x分布式追踪、指标监控一体化方案

3. 核心业务实体​

3.1 实体关系图​

User ──────────────────────────────────────────────────────────┐
│ │
│ 1:N │
▼ ▼
ItemSn ◄────────── ItemSnScanLog ─────────── ItemSnImportLog
│ │
│ ▼
│ ┌─────────────────────┐
│ │ │
│ ▼ ▼
│ ItemReceiptLog ItemFulfillmentLog
│ │ │
│ └─────────┬───────────┘
│ │
│ ▼
│ ItemFulfillmentShipStatusLog

3.2 核心实体定义​

ItemSn(序列号实体)

字段名类型说明约束
idLong主键自增
itemSnString序列号唯一,非空
itemIdString商品ID关联NetSuite
itemNameString商品名称-
itemStatusString状态(receipt/fulfill/inactive)枚举
warehouseLocationIdString仓库位置ID-
purchaseOrderIdString采购订单ID-
itemReceiptIdString入库单ID-
salesOrderIdString销售订单ID-
itemFulfillmentIdString出库单ID-
containerNoString集装箱号-
palletSnString托盘号-

User(用户实体)

字段名类型说明约束
idLong主键自增
usernameString用户名唯一,非空
passwordString密码(加密存储)非空
nicknameString昵称-
avatarString头像URL-
validBoolean是否有效默认true

ItemSnScanLog(扫描日志)

字段名类型说明约束
idLong主键自增
itemSnString扫描的序列号非空
scanRelatedString关联类型(IR/IF)枚举
relatedFrIdString关联单据ID-
userIdLong操作人ID非空
usernameString操作人姓名-
submitResultString提交结果(success/fail)-
failReasonString失败原因-

4. 核心业务流程​

4.1 入库流程​

流程说明:

  1. 仓库人员使用安卓APP扫描商品序列号
  2. 系统验证序列号有效性并关联入库单
  3. 更新序列号状态为"已入库"(receipt)
  4. 同步数据至NetSuite系统
  5. 记录操作日志供审计追溯

4.2 出库流程​

流程说明:

  1. 仓库人员使用安卓APP扫描待出库商品
  2. 系统验证序列号状态必须为"已入库"状态
  3. 更新序列号状态为"已出库"(fulfill)
  4. 同步数据至NetSuite系统

4.3 NetSuite单据转换流程​


5. API接口设计​

5.1 认证接口​

API路径HTTP方法Controller功能描述
/api/auth/loginPOSTAuthController用户登录
/api/auth/refreshPOSTAuthController刷新Token
/api/auth/logoutPOSTAuthController用户登出

5.2 序列号管理接口​

API路径HTTP方法Controller功能描述
/api/item-snGETItemSnController分页查询序列号列表
/api/item-sn/idGETItemSnController查询单个序列号详情
/api/item-snPOSTItemSnController新增序列号
/api/item-sn/idPUTItemSnController更新序列号信息
/api/item-sn/idDELETEItemSnController删除序列号
/api/item-sn/importPOSTItemSnController批量导入序列号

5.3 NetSuite集成接口​

API路径HTTP方法Controller功能描述
/api/netsuite/recordPOSTNetSuiteController调用NetSuite REST API记录数据
/api/netsuite/queryPOSTNetSuiteController调用NetSuite SuiteQL查询
/api/netsuite/tokenGETNetSuiteController获取NetSuite OAuth2 Token
/api/netsuite/image/uploadPOSTNetSuiteController上传图片至NetSuite
/api/netsuite/image/attachPOSTNetSuiteController图片附加到记录

5.4 日志查询接口​

API路径HTTP方法Controller功能描述
/api/log/item-receiptGETItemReceiptLogController查询入库日志
/api/log/item-fulfillmentGETItemFulfillmentLogController查询出库日志
/api/log/item-sn-scanGETItemSnScanLogController查询扫描日志
/api/log/loginGETLoginLogController查询登录日志

6. 数据库设计​

6.1 核心表结构​

item_sn 表(序列号表)

CREATE TABLE wm.item_sn
(
id BIGINT AUTO_INCREMENT PRIMARY KEY,
item_sn VARCHAR(100) NOT NULL UNIQUE,
item_id VARCHAR(50),
item_name VARCHAR(200),
item_status VARCHAR(20) DEFAULT 'inactive',
warehouse_location_id VARCHAR(50),
warehouse_location_name VARCHAR(200),
purchase_order_id VARCHAR(50),
purchase_order_no VARCHAR(50),
item_receipt_id VARCHAR(50),
item_receipt_no VARCHAR(50),
sales_order_id VARCHAR(50),
sales_order_no VARCHAR(50),
item_fulfillment_id VARCHAR(50),
item_fulfillment_no VARCHAR(50),
data_file_id VARCHAR(50),
container_no VARCHAR(50),
pallet_sn VARCHAR(50),
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
valid BOOLEAN DEFAULT TRUE,
version BIGINT DEFAULT 0
);

CREATE INDEX idx_item_sn_status ON wm.item_sn (item_status);
CREATE INDEX idx_item_sn_item_id ON wm.item_sn (item_id);

item_sn_scan_log 表(扫描日志表)

CREATE TABLE wm.item_sn_scan_log
(
id BIGINT AUTO_INCREMENT PRIMARY KEY,
item_id VARCHAR(50),
item_sn VARCHAR(100) NOT NULL,
item_name VARCHAR(200),
scan_related VARCHAR(20) NOT NULL,
related_fr_id VARCHAR(50),
related_fr_no VARCHAR(50),
related_order_id VARCHAR(50),
related_order_no VARCHAR(50),
container_no VARCHAR(50),
pallet_sn VARCHAR(50),
user_id BIGINT NOT NULL,
username VARCHAR(100),
trace_id VARCHAR(64),
submit_result VARCHAR(20),
fail_reason TEXT,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX idx_scan_log_item_sn ON wm.item_sn_scan_log (item_sn);
CREATE INDEX idx_scan_log_user ON wm.item_sn_scan_log (user_id);
CREATE INDEX idx_scan_log_time ON wm.item_sn_scan_log (create_time);

user 表(用户表)

CREATE TABLE wm.user
(
id BIGINT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(100) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
nickname VARCHAR(100),
avatar VARCHAR(500),
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
valid BOOLEAN DEFAULT TRUE,
version BIGINT DEFAULT 0
);

7. 安全设计​

7.1 认证机制​

组件职责说明
JWT Token身份凭证用户登录成功后颁发,有效期内免登录
TokenAuthenticationFilter过滤器拦截请求,验证Token有效性
RedisToken存储存储活跃Token,支持登出失效

7.2 NetSuite集成安全​

安全措施说明
OAuth 2.0使用JWT Bearer Token方式认证
证书加密私钥存储于配置文件,运行时加载
Token缓存获取的OAuth2 Token缓存至Redis,有效期59分钟
请求签名每次请求携带签名信息防止篡改

7.3 数据安全​

安全措施说明
密码加密使用BCrypt算法加密存储
参数校验使用Bean Validation进行输入校验
SQL注入防护使用JPA参数化查询
XSS防护前端自动转义,后端进行内容过滤

8. 部署与集成​

8.1 依赖服务​

服务版本用途
MySQL8.0+主数据库,存储业务数据
Redis7.0+缓存、Token存储、分布式锁
NetSuite-ERP系统集成

8.2 配置说明​

数据库连接配置(application.yaml)

spring:
datasource:
url: jdbc:mysql://mysql:3306/wm?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: ${MYSQL_USERNAME:root}
password: ${MYSQL_PASSWORD:}
data:
redis:
host: ${REDIS_HOST:redis}
port: ${REDIS_PORT:6379}

NetSuite配置(application.yaml)

app:
netsuite:
oauth2:
client-id: ${NETSUITE_OAUTH2_CLIENT_ID}
cert-id: ${NETSUITE_OAUTH2_CERT_ID}
account-id: ${NETSUITE_OAUTH2_ACCOUNT_ID}
private-key-path: /conf/netsuite/oauth2/private.pem
scope: restlets,rest_webservices,suite_analytics
script:
restlet-uri: https://xxx.app.netsuite.com/app/site/hosting/restlet.nl?
image-upload: script=xxx&deploy=1
image-attach: script=xxx&deploy=1

8.3 Docker部署​

后端服务已包含Dockerfile,支持容器化部署:

FROM openjdk:25-jdk-slim
WORKDIR /app
COPY target/server-0.0.1.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

9. 监控与日志​

9.1 监控体系​

监控维度实现方式说明
健康检查Spring Actuator/actuator/health
指标监控Micrometer + OpenTelemetry自定义指标采集
分布式追踪OpenTelemetry请求链路追踪
日志采集Logback + OpenTelemetry Appender结构化日志输出

9.2 日志分级​

级别用途输出位置
DEBUG开发调试信息仅开发环境
INFO业务操作日志控制台+文件
WARN警告信息控制台+文件
ERROR错误异常信息控制台+文件+告警

10. 代码结构​

10.1 后端目录结构​

server/src/main/java/run/ice/bsg/wm/server/
├── api/ # API接口定义
├── config/ # 配置类
├── constant/ # 常量定义
├── controller/ # REST控制器
├── entity/ # JPA实体类
├── enums/ # 枚举类型
├── error/ # 异常处理
├── filter/ # 过滤器
├── handler/ # 异常处理器
├── helper/ # 辅助工具类
├── interceptor/ # 拦截器
├── model/ # 请求/响应模型
├── repository/ # 数据访问层
├── service/ # 业务服务层
├── util/ # 通用工具类
└── ServerApplication.java # 启动类

10.2 前端目录结构​

admin/src/
├── api/ # API接口封装
├── components/ # 公共组件
├── config/ # 配置文件
├── directives/ # 自定义指令
├── layout/ # 布局组件
├── router/ # 路由配置
├── store/ # 状态管理
├── utils/ # 工具函数
├── views/ # 页面视图
├── App.vue # 根组件
└── main.ts # 入口文件

11. 关键业务枚举​

11.1 ActionType(操作类型)​

枚举值说明
purchaseorder_transform_itemreceipt采购订单转入库单
customrecord_scanning_data扫描数据提交
salesorder_transform_itemfulfillment销售订单转出库单
patch_itemfulfillment_shipstatus更新出库单发货状态

11.2 ItemStatus(序列号状态)​

枚举值说明
inactive未激活
receipt已入库
fulfill已出库

11.3 ScanRelated(扫描关联类型)​

枚举值说明
IR关联入库单(ItemReceipt)
IF关联出库单(ItemFulfillment)

12. 扩展规划​

12.1 可扩展功能​

功能模块描述优先级
库存盘点支持定期盘点和差异处理高
库存预警库存低于阈值时自动提醒中
报表分析出入库统计、库存周转率分析中
移动端增强支持离线操作、条码打印低

12.2 性能优化方向​

优化项说明
读写分离数据库主从复制,查询走从库
缓存策略热点数据多级缓存
异步处理日志记录等非核心操作异步化
批量操作支持批量导入导出

文档版本: v1.0
创建日期: 2026-06-04
适用项目: BSG-WM 仓库管理系统