front/docs/仓储模块设计方案.md
zzh 5191d1981f feat: 仓储模块前端、菜单同步扩展及相关页面优化
新增仓储模块页面与 API、店铺授权/店铺订单页面及路由权限目录;
扩展菜单管理同步能力支持二级子菜单与三级按钮;优化公告、仓库地址、下单等页面。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-11 15:19:35 +08:00

48 KiB
Raw Blame History

OMS 仓储模块 — 产品与技术设计方案

版本:v0.3(轻量版 + C_ 表前缀 + 库位 + 入库箱)
基线文档:docs/oms系统设计-050801.md、docs/rbac系统设计-060801.md、docs/前端页面设计规范.md
参考实现:WMS 六页业务逻辑(按需裁剪,不做完整 WMS)
对照仓库:C:\Users\wilso\Desktop\oms0414-back(Fake 框架 + SqlSugar)


0 轻量版总览(推荐阅读)

v0.1 按 WMS 能力完整对标,表多、接口多、状态细。若目标仅是「客户能管 SKU、预报入库、看库存、接店铺单发货」,采用本节 轻量版 即可,全文 §1~§11 中标注 〔轻量〕 / 〔延后〕 处以此为准。

0.1 设计取向

项 v0.1 完整版 v0.3 轻量版(当前)
定位 对标 WMS 仓储子系统 OMS 附属 基础仓储,保留库位与入库箱
仓储表命名 t_wh_* C_ + 表名(如 C_sku、C_inventory)
数据表 18 张 13 张(店铺 4 t_* + 仓储 9 C_*)
后端 Service 6 个 3 个(店铺 2 + 仓储 1)
库存模型 批次 lot + 冻结 + 流水 SKU × 仓库 × 库位 余额,不做 FIFO/流水
入库预报 箱 → SKU + 收货日志 主表 + 箱 + 箱内 SKU(保留箱号)
组合 SKU / 库存同步 / 拆单 一期设计 延后
权限粒度 20+ Action 每页 Query + Save + Delete(库存加 Relocate)

0.2 表清单

命名约定

范围 前缀 示例
仓储模块(本文) C_ C_sku、C_inventory、C_inbound_box
订单 — 店铺(归属订单模块) t_ t_sales_store、t_sales_store_order
系统主数据 t_ t_warehouse_address

订单 — 店铺(4 张,t_ 前缀)

表 说明
t_sales_store 店铺 + Token 合并(Token 加密,列表脱敏)
t_sales_store_order 店铺订单主表
t_sales_store_order_line 订单明细
C_sku_platform_map 平台 SKU → 库内 SKU(发货匹配;归属仓储域,用 C_)

仓储(9 张,C_ 前缀)

表 说明
C_sku 我的 SKU
C_bin_location 库位主数据(按仓库)
C_inventory 库存余额:CustomerId + WarehouseId + SkuId + BinLocationId → Qty
C_inbound_notice 入库预报主表
C_inbound_box 入库箱(箱号/箱唛)
C_inbound_box_line 箱内 SKU 行
C_parcel 我的包裹
C_parcel_item 包裹明细

延后(相对 v0.1 / 原完整版)

原概念 处理
t_sales_store_token 合并进 t_sales_store
t_sales_store_share / 拆单 / 录单表 延后
C_sku_bundle(组合 SKU) 延后
C_stock_movement(库存流水) 延后
C_inbound_receipt_log(收货日志) 延后,状态字段够用

0.3 轻量版核心流程(够用即可)

flowchart LR
  SKU["我的 SKU<br/>C_sku"] --> MAP["平台映射<br/>C_sku_platform_map"]
  MAP --> PSO["店铺订单"]
  BIN["库位<br/>C_bin_location"]
  IBN["入库预报<br/>C_inbound_notice"] --> BOX["入库箱<br/>C_inbound_box"]
  BOX --> INV["库存<br/>C_inventory"]
  BIN --> INV
  PAR["我的包裹<br/>C_parcel"] -->|"上架到库位"| INV
  PSO -->|"匹配库存"| INV
  PSO -->|"生成小包单"| ORD["t_order"]
  1. 我的 SKU:维护库内编码 + 尺重;绑平台 SKU(C_sku_platform_map)。
  2. 库位:按仓库维护 C_bin_location;库存按 库位 记数量。
  3. 入库预报:主表 + 箱号(C_inbound_box)+ 箱内 SKU(C_inbound_box_line);收货上架时写入 C_inventory。
  4. 我的库存:按 SKU 汇总展示,可展开 各库位明细;支持 换库位(不调 FIFO、不记流水)。
  5. 我的包裹:预报快递单号;到仓后上架到指定库位。
  6. 店铺订单:库存匹配时按库位扣减 C_inventory.Qty 并建 t_order。

0.4 轻量版接口原则

  • 每个页面 列表 + 详情 + 保存 + 删除;统计合并为 summary。
  • 仓储一个 WarehouseService(/warehouse/*)。
  • 保留:库位列表、入库箱结构、换库位、上架指定库位。
  • 不做:库存流水、FIFO 批次、冻结量、组合 SKU、平台库存回写。

0.5 轻量版实施顺序

阶段 交付 说明 状态
Step 1 表 SQL + SqlSugar 实体 sql/migrate_warehouse_module.sql + Oms.Domain 实体 已完成
Step 2 接口 WarehouseService + 店铺 Service /warehouse/*、/order/platform-store* 已完成
Step 3 页面 前端 6 页 + 路由 + RBAC 菜单 views/warehouse/*、order/platformStore* 已完成

Step 2 交付物(2026-07-11)

层级 路径
Repository Oms.Domain/WarehouseAggregate/Repositories、Oms.SqlSugarCore/Warehouse/;OrdersAggregate/Repositories(店铺)
DTO Oms.Application/Dtos/Warehouse/、Dtos/PlatformStore/
Service Services/Warehouse/WarehouseService;PlatformStoreService;PlatformStoreOrderService

M1~M4 业务分期

阶段 交付 说明
M1 C_sku + C_bin_location + C_inventory + 入库预报(含箱) 5 张 C_* 表 + 约 12 接口
M2 C_parcel + 库存列表/换库位 +2 张表 + 2 页
M3 店铺授权 + 店铺订单 +3 表 + 2 Service + 2 页
M4 库存匹配 → t_order 打通订单

M4 交付物(2026-07-11)

项 说明
PlatformStoreOrderParcelBuilder 店铺订单 → OrderParcelCreateInput
POST /order/platform-store-order/match-inventory 扣库存 → 创建小包 → 回写 LinkedOrderId
POST /order/platform-store-order/batch-match-inventory 批量匹配
前端 销售产品选择、关联服务单号、批量匹配按钮

1 导读

1.1 这份文档解决什么问题?

将 WMS 中与客户履约相关的 6 个页面 迁入 OMS,拆为两块:

归属 页面 原 WMS 路由(参考)
订单模块(扩展现有 §4) 店铺授权、店铺订单 /order/platform/shop、/order/platform/shop-orderv2
仓储模块(本文新建 §9) 我的包裹、我的库存、我的 SKU、入库预报 /wms/package/package、/wms/stock/myinventory2、/wms/stock/merchants、/wms/stock/warehousingorder

设计原则:

  1. 表名、字段名、接口路径全部重新命名,不沿用 WMS 的 vip_* / wms_* 命名。
  2. 业务逻辑对齐 WMS,在 OMS 会话隔离、分页规范、审计字段上对齐现有 OMS 约定。
  3. 与现有 OMS 模块边界清晰:小包订单(t_order)与仓储库存(C_*)分离;店铺订单通过 C_sku_platform_map 匹配库存。

1.2 与 OMS 其它模块的关系

flowchart TB
  subgraph Order["订单模块 §4"]
    PS["店铺授权<br/>t_sales_store"]
    PSO["店铺订单<br/>t_sales_store_order"]
    PO["小包订单<br/>t_order"]
  end
  subgraph Warehouse["仓储模块 C_*"]
    BIN["库位<br/>C_bin_location"]
    PAR["我的包裹<br/>C_parcel"]
    SKU["我的 SKU<br/>C_sku"]
    INV["库存<br/>C_inventory"]
    IBN["入库预报<br/>C_inbound_notice"]
  end
  subgraph System["系统主数据 §8"]
    WA["仓库地址<br/>t_warehouse_address"]
  end
  subgraph Operation["操作模块 §6"]
    INB["入库扫描<br/>t_inbound_record"]
    OUT["出库扫描<br/>t_outbound_record"]
  end

  PS --> PSO
  PSO -->|"SKU 映射 + 库存匹配"| SKU
  PSO -->|"一键发货 / 录单"| PO
  PAR --> INV
  IBN --> INV
  BIN --> INV
  SKU --> INV
  WA --> PAR
  WA --> IBN
  INB -.->|"小包运单收货"| PO
  OUT -.->|"小包运单出库"| PO
边界 说明
t_order vs t_sales_store_order 前者为 OMS 小包物流订单;后者为电商平台拉取的 店铺履约单,二者通过 LinkedOrderId 可选关联
t_warehouse_address 仓储业务统一引用系统主数据仓库(WarehouseId → t_warehouse_address.Id),不新建客户侧仓库表
t_inbound_record / t_outbound_record 面向 小包运单(WaybillNo)的仓内扫描;与仓储模块的 SKU 入库预报 / 包裹到仓 是不同业务线,表不合并
客户隔离 全模块 CustomerId → t_customer.Id;规则同 OMS §3.3.5 / §4.4.0

1.3 建议阅读路径

角色 路径
产品 / 测试 §2 页面与菜单 → §5 主流程 → §8 枚举
后端 / DBA §3 表结构 → §4 接口 → §7 WMS 对照
前端 §2 → §4 → docs/前端页面设计规范.md

2 页面、路由与权限

2.1 菜单结构

订单(已有 /order)
├── …(查价、下单、我的订单等)
├── 店铺授权          /order/platformStore
└── 店铺订单          /order/platformStoreOrder

仓储(新建 /warehouse)
├── 我的包裹          /warehouse/parcel
├── 我的库存          /warehouse/inventory
├── 我的 SKU          /warehouse/sku
└── 入库预报          /warehouse/inboundNotice

2.2 前端路由(src/router/routes/newModules/)

订单模块扩展(order.ts 追加 children):

path name component permission
platformStore OrderPlatformStore views/order/platformStore/index.vue Order.PlatformStore.Query
platformStoreOrder OrderPlatformStoreOrder views/order/platformStoreOrder/index.vue Order.PlatformStoreOrder.Query

仓储模块新建(warehouse.ts):

path name component permission
parcel WarehouseParcel views/warehouse/parcel/index.vue Warehouse.Parcel.Query
inventory WarehouseInventory views/warehouse/inventory/index.vue Warehouse.Inventory.Query
sku WarehouseSku views/warehouse/sku/index.vue Warehouse.Sku.Query
inboundNotice WarehouseInboundNotice views/warehouse/inboundNotice/index.vue Warehouse.InboundNotice.Query

列表页布局遵循 docs/前端页面设计规范.md:xxx-container、table-toolbar、分页右上角、PaginationPro 默认 30 条。

2.3 RBAC 权限码

格式:{Module}.{Resource}.{Action}(与 RBAC §5.2 一致)。

2.3.1 订单 — 店铺域

权限码 说明
Order.PlatformStore 店铺授权模块
Order.PlatformStore.Query 列表 / 详情
Order.PlatformStore.Create 新增授权 / OAuth 回调落库
Order.PlatformStore.Update 改名、自动发货开关
Order.PlatformStore.Delete 删除店铺
Order.PlatformStoreOrder 店铺订单模块
Order.PlatformStoreOrder.Query 列表 / 详情 / 状态统计
Order.PlatformStoreOrder.Sync 同步平台状态
Order.PlatformStoreOrder.Rts 准备发货(Ready To Ship)
Order.PlatformStoreOrder.AutoMatch 库存匹配生成小包订单
Order.PlatformStoreOrder.Suspend 搁置 / 取消搁置
Order.PlatformStoreOrder.Delete 删除
Order.PlatformStoreOrder.Export 导出
Order.PlatformStoreOrder.Label 获取 / 打印面单
Order.PlatformStoreOrder.Tag 自定义标签

2.3.2 仓储域 〔轻量:每资源 3 个权限即可〕

权限码 说明
Warehouse.Sku.Query / .Save / .Delete 我的 SKU
Warehouse.InboundNotice.Query / .Save / .Delete 入库预报
Warehouse.Parcel.Query / .Save / .Delete 我的包裹
Warehouse.Inventory.Query / .Relocate 我的库存(查询 + 换库位)
Warehouse.BinLocation.Query / .Save 库位维护(管理端/仓库端)

〔延后〕:ApplyStorage、Putaway、Relocate、Adjust、Import、Mapping、Print 等细粒度 Action — 首期 Save 接口内覆盖。

2.4 后端 Service 与路由前缀 〔轻量〕

业务域 Service 类 路由前缀
店铺授权 PlatformStoreService /order/platform-store/*
店铺订单 PlatformStoreOrderService /order/platform-store-order/*
仓储(合并) WarehouseService /warehouse/*

轻量版仓储 一个 Service 即可,按子路径分 SKU / 入库 / 包裹 / 库存。


3 数据表结构设计

遵循 OMS §3.1 公共规范。
轻量版以 §0.2 为准;下列分节含完整版字段,标注 〔延后〕 的表/字段在轻量版中不建。

3.0 轻量版表结构(v0.3 推荐落地)

仓储表一律 C_ 前缀;字段仍用 OMS 驼峰(PascalCase);必备审计字段见 §3.1 公共规范。

3.0.1 t_sales_store(店铺,含 Token)

在 §3.1.1 基础上 合并 Token,新增:AccessToken、RefreshToken、TokenExtraJson(加密,列表脱敏)。

3.0.2 C_sku(我的 SKU)

字段 类型 非空 说明
Id BIGINT 是 主键
CustomerId BIGINT 是 客户
SkuCode VARCHAR(64) 是 库内编码
SkuName VARCHAR(256) 是 名称
SkuImageUrl VARCHAR(512) 否 图片
WeightG / LengthCm / WidthCm / HeightCm DECIMAL 否 尺重
Remark VARCHAR(512) 否 备注
审计字段 — 是

索引:uk_c_sku_code (CustomerId, SkuCode)。

3.0.3 C_bin_location(库位)

字段 类型 非空 说明
Id BIGINT 是 主键
WarehouseId BIGINT 是 → t_warehouse_address.Id
BinCode VARCHAR(32) 是 库位编码,如 A-01-02
BinName VARCHAR(64) 否 展示名称
ZoneCode VARCHAR(32) 否 库区
IsEnabled TINYINT 是 是否启用,默认 1
Remark VARCHAR(512) 否 备注
审计字段 — 是

索引:uk_c_bin_wh_code (WarehouseId, BinCode)。

库位为 仓库级主数据(不按客户拆分);库存余额按客户 + 库位区分。

3.0.4 C_inventory(库存余额)

字段 类型 非空 说明
Id BIGINT 是 主键
CustomerId BIGINT 是 客户
WarehouseId BIGINT 是 仓库
SkuId BIGINT 是 → C_sku.Id
BinLocationId BIGINT 是 → C_bin_location.Id
Qty INT 是 可用数量(匹配时直接扣减)
审计字段 — 是

唯一索引:uk_c_inventory (CustomerId, WarehouseId, SkuId, BinLocationId)。

「我的库存」列表:按 SkuId 聚合 SUM(Qty);详情/换库位:按 BinLocationId 展开。
不做冻结量、FIFO 批次、库存流水表。

3.0.5 C_inbound_notice + C_inbound_box + C_inbound_box_line(入库预报,含箱号)

主表 C_inbound_notice

字段 类型 说明
CustomerId BIGINT 客户
WarehouseId BIGINT 仓库
NoticeNo VARCHAR(32) IN + 雪花
MarkReference VARCHAR(64) 唛头
InboundType VARCHAR(16) normal / return
ReceiptStatus VARCHAR(16) forecasted → received → completed
ExpectedArrivalTime DATETIME 可选
ActualArrivalTime DATETIME 收货时写入
Remark VARCHAR(512)

箱表 C_inbound_box

字段 类型 说明
InboundNoticeId BIGINT 主表
BoxSeqNo VARCHAR(16) 箱序号
MarkBoxNo VARCHAR(64) 箱唛号/箱号
WeightG DECIMAL(10,2) 箱重(g),可选
LengthCm / WidthCm / HeightCm DECIMAL 箱尺寸,可选
IsReceived TINYINT 是否已收货

箱内 SKU 行 C_inbound_box_line

字段 类型 说明
InboundBoxId BIGINT 箱
SkuId BIGINT → C_sku.Id
SkuCode VARCHAR(64) 冗余编码
PlannedQty INT 计划数量
ReceivedQty INT 实收数量
BinLocationId BIGINT 上架库位(收货确认时填入)

收货上架逻辑:confirm-receive 按箱清点 → 按行 ReceivedQty + BinLocationId 累加 C_inventory.Qty → 主表 completed。

3.0.6 C_parcel + C_parcel_item(我的包裹)

主表:TrackingNo、CarrierName、WarehouseId、LifecycleStatus(inTransit / arrived / stored)、ArrivalTime、Remark。

明细:ProductName、Quantity、SkuId(上架时关联)、BinLocationId(上架库位,可选)。

3.0.7 C_sku_platform_map(平台 SKU 映射)

字段 类型 说明
CustomerId BIGINT 客户
StoreId BIGINT → t_sales_store.Id
PlatformSku VARCHAR(128) 平台 listing SKU
SkuId BIGINT → C_sku.Id
SkuCode VARCHAR(64) 冗余

索引:uk_c_sku_map (StoreId, PlatformSku)。

3.0.8 t_sales_store_order(店铺订单,字段精简)

保留核心字段 + 明细行;MappedSkuId 指向 C_sku.Id。拆单/录单表延后。


3.1 订单模块 — 店铺授权

3.1.1 销售店铺表 t_sales_store

字段名 类型 非空 说明
Id BIGINT 是 主键
CustomerId BIGINT 是 客户 Id
PlatformCode VARCHAR(32) 是 平台:lazada / shopee / tiktok / temu / manual
StoreNickname VARCHAR(128) 是 店铺昵称(用户自定义)
PlatformStoreId VARCHAR(64) 否 平台侧店铺 Id
PlatformAccount VARCHAR(128) 否 平台账号
SiteCountry VARCHAR(8) 否 开户站点国家码
SellerId VARCHAR(64) 否 平台卖家 Id
AuthStatus VARCHAR(16) 是 active / expired / revoked
AuthTime DATETIME 否 授权时间
TokenExpireTime DATETIME 否 Access Token 过期
RefreshExpireTime DATETIME 否 Refresh Token 过期
IsAutoFulfill TINYINT 是 是否自动发货,默认 0
SortOrder INT 否 排序
Remark VARCHAR(512) 否 备注
IsDeleted / 审计字段 — 是 见 §3.1 公共规范

索引:idx_sales_store_customer (CustomerId, IsDeleted);uk_sales_store_platform (CustomerId, PlatformCode, PlatformStoreId) 唯一(PlatformStoreId 为空时 manual 店铺允许多条)。

3.1.2 店铺授权凭证表 t_sales_store_token 〔轻量:合并至 3.0.1,不单独建表〕

敏感字段加密存储;列表接口 不返回 AccessToken / RefreshToken 明文。

字段名 类型 非空 说明
Id BIGINT 是 主键
StoreId BIGINT 是 → t_sales_store.Id
AccessToken VARCHAR(2048) 否 加密
RefreshToken VARCHAR(2048) 否 加密
TokenType VARCHAR(32) 否 默认 Bearer
Scope VARCHAR(512) 否 授权范围
ExtraJson JSON 否 平台扩展(如 Lazada 多站点 userId)
IsDeleted / 审计字段 — 是

3.1.3 店铺共享表 t_sales_store_share 〔延后〕

字段名 类型 非空 说明
Id BIGINT 是 主键
StoreId BIGINT 是 主店铺
SharedCustomerId BIGINT 是 被共享的子客户 Id
IsDeleted / 审计字段 — 是

3.2 订单模块 — 店铺订单

3.2.1 店铺订单表 t_sales_store_order

字段名 类型 非空 说明
Id BIGINT 是 主键
CustomerId BIGINT 是 客户 Id
StoreId BIGINT 是 → t_sales_store.Id
PlatformCode VARCHAR(32) 是 冗余平台码
PlatformOrderNo VARCHAR(64) 是 平台订单号
OrderCountry VARCHAR(8) 否 订单国家
ItemCount INT 否 商品行数
TotalAmount DECIMAL(18,4) 否 订单总额
Currency VARCHAR(8) 否 币种
PaymentMethod VARCHAR(64) 否 付款方式
PlatformOrderTime DATETIME 否 平台下单时间
PlatformPayTime DATETIME 否 平台付款时间
FulfillStatus VARCHAR(32) 是 履约状态,见 §8.1
PlatformStatus VARCHAR(64) 否 平台原始状态码
PlatformStatusLabel VARCHAR(128) 否 平台状态展示文案
ShippingLabelNo VARCHAR(64) 否 面单号
ShippingLabelUrl VARCHAR(512) 否 面单文件 URL
IsMultiLabel TINYINT 是 是否多面单/拆单
DeliveryMethod VARCHAR(64) 否 运输方式 code
DeliveryMethodLabel VARCHAR(128) 否 运输方式展示
DeliveryStatus VARCHAR(32) 否 物流子状态
ShippingCarrier VARCHAR(64) 否 物流承运商
PickupType VARCHAR(32) 否 取件类型:pickup / dropoff
CustomTags VARCHAR(512) 否 用户自定义标签,逗号分隔
IsSuspended TINYINT 是 是否搁置
PresaleDays INT 否 预售天数
BuyerRemark VARCHAR(1024) 否 买家备注
SellerPickRemark VARCHAR(1024) 否 卖家拣货备注
SellerPickRemarkTime DATETIME 否 拣货备注时间
WarehouseId BIGINT 否 发货仓库 → t_warehouse_address.Id
LinkedOrderId BIGINT 否 关联 OMS 小包订单 t_order.Id
LastSyncTime DATETIME 否 最近同步时间
StatusChangedTime DATETIME 否 状态变更时间
SystemShipTime DATETIME 否 系统发货时间
SystemLabelPrintTime DATETIME 否 系统打印面单时间
SystemPushTime DATETIME 否 推送到出库时间
IsDeleted / 审计字段 — 是

索引:uk_store_order_no (StoreId, PlatformOrderNo);idx_store_order_customer_status (CustomerId, FulfillStatus, PlatformOrderTime)。

3.2.2 店铺订单明细表 t_sales_store_order_line

字段名 类型 非空 说明
Id BIGINT 是 主键
StoreOrderId BIGINT 是 → t_sales_store_order.Id
PlatformLineId VARCHAR(64) 否 平台行 Id / itemId
PlatformSku VARCHAR(128) 否 平台 SKU
ProductName VARCHAR(512) 否 商品名称
ProductImageUrl VARCHAR(512) 否 商品图
ProductUrl VARCHAR(512) 否 商品链接
VariantText VARCHAR(256) 否 规格属性
UnitPrice DECIMAL(18,4) 否 单价
Quantity INT 是 数量
Currency VARCHAR(8) 否 币种
IsShipExcluded TINYINT 是 是否拒绝发货
MappedSkuId BIGINT 否 映射的仓储 SKU → C_sku.Id
IsDeleted / 审计字段 — 是

3.2.3 店铺订单快速录单表 t_sales_store_order_draft 〔延后〕

3.2.4 店铺订单拆单表 t_sales_store_order_split 〔延后〕


3.3 仓储模块 — 我的包裹

3.3.1 客户包裹表 C_parcel

字段名 类型 非空 说明
Id BIGINT 是 主键
CustomerId BIGINT 是 客户 Id
WarehouseId BIGINT 是 → t_warehouse_address.Id
TrackingNo VARCHAR(64) 是 快递单号
CarrierName VARCHAR(64) 否 快递公司
SourcePlatform VARCHAR(32) 否 来源平台(淘宝、拼多多等)
ParcelCategory VARCHAR(16) 是 single 一票一单 / multi 一票多单 / unclaimed 待认领 / stock 库存件
LifecycleStatus VARCHAR(16) 是 见 §8.2:inTransit / arrived / unclaimed / expired
PurchaseOrderNo VARCHAR(64) 否 采购订单号(与 OMS 小包无关)
BizScene VARCHAR(16) 否 业务场景,如 consolidation 集运
ImageUrl VARCHAR(512) 否 包裹图片
LengthCm DECIMAL(10,2) 否 长(cm)
WidthCm DECIMAL(10,2) 否 宽(cm)
HeightCm DECIMAL(10,2) 否 高(cm)
VolumeCbm DECIMAL(12,4) 否 体积
WeightKg DECIMAL(10,3) 否 重量(kg)
ArrivalTime DATETIME 否 到仓时间
LinkedSkuId BIGINT 否 关联仓储 SKU
Remark VARCHAR(512) 否 备注
IsDeleted / 审计字段 — 是

索引:uk_c_parcel_tracking (CustomerId, TrackingNo, WarehouseId);idx_c_parcel_status (CustomerId, LifecycleStatus)。

3.3.2 包裹明细表 C_parcel_item

字段名 类型 非空 说明
Id BIGINT 是 主键
ParcelId BIGINT 是 → C_parcel.Id
ProductName VARCHAR(512) 否 商品名称
ProductCategory VARCHAR(64) 否 商品分类
Quantity INT 是 数量
ImageUrl VARCHAR(512) 否 图片
AttributeText VARCHAR(256) 否 属性
SkuId BIGINT 否 库内 SKU(上架时关联)
SkuCode VARCHAR(64) 否 冗余编码
BinLocationId BIGINT 否 上架库位
IsDeleted / 审计字段 — 是

3.4 仓储模块 — 我的 SKU

3.4.1 仓储 SKU 主表 C_sku

字段名 类型 非空 说明
Id BIGINT 是 主键
CustomerId BIGINT 是 客户 Id
SkuCode VARCHAR(64) 是 库内 SKU 编码
SkuName VARCHAR(256) 是 SKU 名称
SkuImageUrl VARCHAR(512) 否 图片
CategoryCode VARCHAR(64) 否 分类
IsBundle TINYINT 是 是否组合 SKU
WeightG DECIMAL(10,2) 否 重量(g)
LengthCm DECIMAL(10,2) 否 长(cm)
WidthCm DECIMAL(10,2) 否 宽(cm)
HeightCm DECIMAL(10,2) 否 高(cm)
ReferencePrice DECIMAL(18,4) 否 参考价
Currency VARCHAR(8) 否 币种
Remark VARCHAR(512) 否 备注
IsDeleted / 审计字段 — 是

索引:uk_c_sku_code (CustomerId, SkuCode)。

3.4.2 组合 SKU 子项表 C_sku_bundle_item 〔延后〕

3.4.3 平台 SKU 映射表 C_sku_platform_map

字段名 类型 非空 说明
Id BIGINT 是 主键
CustomerId BIGINT 是 客户 Id
StoreId BIGINT 是 → t_sales_store.Id
PlatformSku VARCHAR(128) 是 平台 listing SKU
PlatformProductId VARCHAR(64) 否 平台商品 Id
SkuId BIGINT 是 → C_sku.Id
SkuCode VARCHAR(64) 是 冗余库内编码
IsDeleted / 审计字段 — 是

索引:uk_c_sku_map (StoreId, PlatformSku)。


3.5 仓储模块 — 我的库存

3.5.1 库存余额表 C_inventory(见 §3.0.4)

3.5.2 库位表 C_bin_location(见 §3.0.3)

3.5.3 库存流水表 C_stock_movement 〔延后〕


3.6 仓储模块 — 入库预报

3.6.1 入库预报主表 C_inbound_notice

字段名 类型 非空 说明
Id BIGINT 是 主键
CustomerId BIGINT 是 客户 Id
WarehouseId BIGINT 是 仓库
NoticeNo VARCHAR(32) 是 入库单号,规则 IN + 雪花 Id
MarkReference VARCHAR(64) 否 唛头参考号
InboundType VARCHAR(16) 是 normal 普通 / return 退货
ReceiptStatus VARCHAR(16) 是 见 §8.4
FirstMileCarrier VARCHAR(64) 否 头程物流
FirstMileTrackingNo VARCHAR(64) 否 头程单号
ExpectedArrivalTime DATETIME 否 预计到货
ActualArrivalTime DATETIME 否 实际到货
IsException TINYINT 是 是否异常件
ExceptionNote VARCHAR(1024) 否 异常说明
ExceptionImageUrls VARCHAR(2048) 否 异常图片,分号分隔
CustomerFeedback TINYINT 否 客户是否已确认异常
Remark VARCHAR(512) 否 备注
IsDeleted / 审计字段 — 是

索引:uk_c_inbound_notice_no (NoticeNo);idx_c_inbound_customer_status (CustomerId, ReceiptStatus)。

3.6.2 入库箱表 C_inbound_box(见 §3.0.5)

字段名 类型 非空 说明
Id BIGINT 是 主键
InboundNoticeId BIGINT 是 → C_inbound_notice.Id
BoxSeqNo VARCHAR(16) 是 箱序号
MarkBoxNo VARCHAR(64) 否 箱唛号/箱号
WeightG DECIMAL(10,2) 否 箱重(g)
LengthCm / WidthCm / HeightCm DECIMAL(10,2) 否 箱尺寸
IsReceived TINYINT 是 是否已收货
审计字段 — 是

3.6.3 入库箱 SKU 行表 C_inbound_box_line(见 §3.0.5)

字段名 类型 非空 说明
Id BIGINT 是 主键
InboundBoxId BIGINT 是 → C_inbound_box.Id
SkuId BIGINT 是 → C_sku.Id
SkuCode VARCHAR(64) 是 冗余编码
PlannedQty INT 是 计划入库数量
ReceivedQty INT 否 实收数量
BinLocationId BIGINT 否 上架库位(收货时填)
审计字段 — 是

3.6.4 入库收货日志表 C_inbound_receipt_log 〔延后〕


4 接口设计

分页:{ items, total };默认 pageSize=30。客户隔离同 §6。
轻量版接口以 §4.0 为准;§4.1~§4.6 为完整版参考。

4.0 轻量版接口清单(推荐)

仓储 WarehouseService — 共 20 个

页面 方法 路径 说明
SKU POST /warehouse/sku/list 列表
SKU GET /warehouse/sku/detail 详情
SKU POST /warehouse/sku/save 新增/编辑
SKU POST /warehouse/sku/delete 删除
SKU POST /warehouse/sku/bind-mapping 绑定平台 SKU
库位 POST /warehouse/bin-location/list 按仓库查库位
库位 POST /warehouse/bin-location/save 新增/编辑库位
入库 POST /warehouse/inbound/list 列表
入库 GET /warehouse/inbound/detail 详情含 boxes[].lines[]
入库 POST /warehouse/inbound/save 新增/编辑(含箱号,仅 forecasted)
入库 POST /warehouse/inbound/delete 删除
入库 POST /warehouse/inbound/confirm-receive 按箱收货上架 → 写 C_inventory
入库 GET /warehouse/inbound/summary 状态 Tab 数量
包裹 POST /warehouse/parcel/list 列表
包裹 POST /warehouse/parcel/save 新增/编辑
包裹 POST /warehouse/parcel/delete 删除
包裹 POST /warehouse/parcel/putaway 到仓上架(指定 binLocationId)
库存 POST /warehouse/inventory/list 按 SKU 聚合列表
库存 GET /warehouse/inventory/bin-detail 某 SKU 各库位明细
库存 POST /warehouse/inventory/relocate 换库位(源库位 → 目标库位)

店铺 — 共 14 个(首期可再砍)

页面 方法 路径 说明
授权 POST /order/platform-store/list 列表
授权 POST /order/platform-store/auth-url OAuth
授权 POST /order/platform-store/save 改名等
授权 POST /order/platform-store/delete 删除
订单 POST /order/platform-store-order/list 列表
订单 GET /order/platform-store-order/detail 详情
订单 GET /order/platform-store-order/summary 状态统计(合并多个 count 接口)
订单 POST /order/platform-store-order/sync-status 同步
订单 POST /order/platform-store-order/ready-to-ship RTS
订单 POST /order/platform-store-order/match-inventory 库存匹配 → t_order
订单 POST /order/platform-store-order/fetch-label 面单
订单 POST /order/platform-store-order/toggle-suspend 搁置
订单 POST /order/platform-store-order/delete 删除

入库 save 请求(含箱号)

{
  "id": 0,
  "warehouseId": 1,
  "markReference": "MARK-001",
  "inboundType": "normal",
  "remark": "",
  "boxes": [
    {
      "boxSeqNo": "1",
      "markBoxNo": "BOX-001",
      "weightG": 1200,
      "lengthCm": 40,
      "widthCm": 30,
      "heightCm": 20,
      "lines": [
        { "skuId": 1001, "skuCode": "SKU-A001", "plannedQty": 50 }
      ]
    }
  ]
}

confirm-receive 请求要点:按箱提交实收数量及每行 binLocationId,服务端 upsert C_inventory。

库存匹配:按 C_sku_platform_map 解析 SKU,从指定库位(或默认库位)扣减 C_inventory.Qty;不足则失败;不记流水。


4.1 订单 — 店铺授权 /order/platform-store/*(完整版参考)

接口 方法 路径 说明
店铺列表 POST /order/platform-store/list 分页;筛 platformCode、storeNickname、授权到期
授权 URL POST /order/platform-store/auth-url 获取 OAuth 跳转地址
OAuth 回调落库 POST /order/platform-store/auth-callback 各平台 token 写入 t_sales_store_token
店铺详情 GET /order/platform-store/detail id
改名 POST /order/platform-store/rename id, storeNickname
删除 POST /order/platform-store/delete ids[]
自动发货开关 POST /order/platform-store/toggle-auto-fulfill ids[], enabled
到期提醒统计 GET /order/platform-store/expiration-stats 即将过期 / 已过期数量
状态统计 POST /order/platform-store/dashboard-stats 按平台汇总店铺与订单数

列表请求示例

{
  "page": 1,
  "pageSize": 30,
  "platformCode": "shopee",
  "storeNickname": "",
  "expirationFilter": "normal"
}

expirationFilter:normal / within7days / expired。

列表响应 items[] 关键字段:id, platformCode, platformName, storeNickname, platformAccount, siteCountry, authStatus, authTime, tokenExpireTime, isAutoFulfill, createTime。

平台子接口(建议内聚于 PlatformStoreService,路径带平台段):

平台 路径前缀
Shopee /order/platform-store/shopee/*
Lazada /order/platform-store/lazada/*
TikTok /order/platform-store/tiktok/*

4.2 订单 — 店铺订单 /order/platform-store-order/*

接口 方法 路径 说明
订单列表 POST /order/platform-store-order/list 分页 + 多 Tab 状态
状态统计 POST /order/platform-store-order/status-count 各履约状态数量
待发货统计 GET /order/platform-store-order/pending-ship-count
取消单统计 GET /order/platform-store-order/canceled-count
订单详情 GET /order/platform-store-order/detail 含 lines[]、拆单、草稿
准备发货 RTS POST /order/platform-store-order/ready-to-ship 单条
批量 RTS POST /order/platform-store-order/batch-ready-to-ship
库存匹配下单 POST /order/platform-store-order/match-inventory 按 SKU 映射扣库存并创建 t_order 草稿
批量库存匹配 POST /order/platform-store-order/batch-match-inventory
同步平台状态 POST /order/platform-store-order/sync-status
搁置 / 取消搁置 POST /order/platform-store-order/toggle-suspend
删除 POST /order/platform-store-order/delete ids[]
获取面单 POST /order/platform-store-order/fetch-label 返回 shippingLabelUrl
更新标签 POST /order/platform-store-order/update-tags id, customTags
快速录单 POST /order/platform-store-order/add-draft 写入 t_sales_store_order_draft
导出 POST /order/platform-store-order/export 异步或同步文件流

列表请求关键字段

{
  "page": 1,
  "pageSize": 30,
  "platformCode": "shopee",
  "fulfillStatus": "pending",
  "platformOrderNo": "",
  "shippingLabelNo": "",
  "storeId": null,
  "isSuspended": false,
  "orderTimeStart": "2026-01-01",
  "orderTimeEnd": "2026-04-01",
  "searchType": "orderNo",
  "searchKeyword": ""
}

searchType:orderNo(平台单号)/ labelNo(面单号)/ whSku(库内 SKU)。

列表响应 items[] 关键字段:id, storeId, storeNickname, platformCode, platformOrderNo, orderCountry, totalAmount, currency, platformOrderTime, fulfillStatus, fulfillStatusLabel, shippingLabelNo, shippingLabelUrl, isMultiLabel, deliveryMethodLabel, customTags, isSuspended, presaleDays, lines[](含 platformSku, productName, quantity, isShipExcluded), linkedOrderId。

库存匹配下单逻辑(对齐 WMS matchSkuInventoryOrder)

  1. 校验店铺订单归属与 fulfillStatus 允许发货。
  2. 按 C_sku_platform_map 解析每行 MappedSkuId;未映射行失败。
  3. 按库位扣减 C_inventory.Qty(优先默认库位或请求指定 binLocationId)。
  4. 调用 OMS CreateParcelCoreAsync 创建小包订单草稿,回写 LinkedOrderId。
  5. 更新店铺订单 fulfillStatus。

4.3 仓储 — 我的包裹 /warehouse/parcel/*

接口 方法 路径 说明
包裹列表 POST /warehouse/parcel/list 按 lifecycleStatus Tab
状态统计 POST /warehouse/parcel/status-count 各状态数量
包裹详情 GET /warehouse/parcel/detail 含 items[]
新增 POST /warehouse/parcel/create
编辑 POST /warehouse/parcel/update
删除 POST /warehouse/parcel/delete ids[]
申请入库 POST /warehouse/parcel/apply-storage 到仓包裹进入库存流程

列表请求:lifecycleStatus(inTransit/arrived/unclaimed/expired)、warehouseId、trackingNo、parcelCategory、productName(模糊搜明细)。

创建请求

{
  "warehouseId": 1,
  "trackingNo": "SF1234567890",
  "carrierName": "顺丰",
  "parcelCategory": "single",
  "remark": "",
  "items": [
    {
      "productName": "手机壳",
      "quantity": 2,
      "imageUrl": "",
      "attributeText": "黑色"
    }
  ]
}

4.4 仓储 — 我的库存 /warehouse/inventory/*

接口 方法 路径 说明
库存汇总列表 POST /warehouse/inventory/list 已入库 SKU 维度
在途列表 POST /warehouse/inventory/in-transit-list 已到仓未上架(对齐 WMS packageList3)
状态统计 GET /warehouse/inventory/status-count 已到仓 / 已入库数量
库位明细 GET /warehouse/inventory/bin-detail 某 SKU 多库位
上架 POST /warehouse/inventory/putaway 包裹或 SKU 上架
换库位 POST /warehouse/inventory/relocate
调整数量 POST /warehouse/inventory/adjust-qty 多库位批量调整
更新尺重 POST /warehouse/inventory/update-dimension
库存流水 POST /warehouse/inventory/movement-list 分页
导出 POST /warehouse/inventory/export

库存列表请求:whSkuCode, productName, availabilityFilter(available/replenish/all)、warehouseId, sortBy(putawayTime/availableQty)。

列表响应 items[]:whSkuId, whSkuCode, skuName, availableQty, onHandQty, frozenQty, binLocationCode, lengthCm, widthCm, heightCm, weightG, putawayTime, parcelTrackingNo(来源包裹)。


4.5 仓储 — 我的 SKU /warehouse/sku/*

接口 方法 路径 说明
SKU 列表 POST /warehouse/sku/list 分页
类型统计 GET /warehouse/sku/type-count 普通 / 组合数量
详情 GET /warehouse/sku/detail 含映射、组合子项
新增 POST /warehouse/sku/create
编辑 POST /warehouse/sku/update
删除 POST /warehouse/sku/delete
批量删除 POST /warehouse/sku/batch-delete
批量导入 POST /warehouse/sku/import Excel
组合 SKU 导入 POST /warehouse/sku/import-bundle
映射详情 GET /warehouse/sku/mapping-detail whSkuId
批量绑定平台 SKU POST /warehouse/sku/bind-platform-sku
导入映射 POST /warehouse/sku/import-mapping
打印 SKU 标签 POST /warehouse/sku/print-label 返回 PDF URL

列表请求:skuCode, skuName, isBundle, mappingStatus(mapped/unmapped/all), sortBy。

列表响应:id, skuCode, skuName, skuImageUrl, isBundle, weightG, lengthCm, widthCm, heightCm, referencePrice, currency, mappingCount, onHandQty, inboundPendingQty, binLocationCode。


4.6 仓储 — 入库预报 /warehouse/inbound-notice/*

接口 方法 路径 说明
列表 POST /warehouse/inbound-notice/list 分页
状态统计 POST /warehouse/inbound-notice/status-count
详情 GET /warehouse/inbound-notice/detail 含 boxes[].lines[]
新增 POST /warehouse/inbound-notice/create
编辑 POST /warehouse/inbound-notice/update 仅 receiptStatus=forecasted 可编辑
删除 POST /warehouse/inbound-notice/delete
导入校验 POST /warehouse/inbound-notice/import-validate 箱号导入预检
导入保存 POST /warehouse/inbound-notice/import-save
异常信息 GET /warehouse/inbound-notice/exception-detail
标记异常 POST /warehouse/inbound-notice/mark-exception
取消异常 POST /warehouse/inbound-notice/clear-exception
确认收货 POST /warehouse/inbound-notice/confirm-receive 客户侧确认到仓
SKU 清点 POST /warehouse/inbound-notice/inspect
打印标签 POST /warehouse/inbound-notice/print-label PDF
生成单号 GET /warehouse/inbound-notice/next-no 可选预取

创建请求

{
  "warehouseId": 1,
  "markReference": "MARK-001",
  "inboundType": "normal",
  "remark": "",
  "boxes": [
    {
      "boxSeqNo": "1",
      "markBoxNo": "BOX-001",
      "weightG": 1200,
      "lengthCm": 40,
      "widthCm": 30,
      "heightCm": 20,
      "lines": [
        {
          "whSkuId": 1001,
          "whSkuCode": "SKU-A001",
          "plannedQty": 50
        }
      ]
    }
  ]
}

服务端生成 noticeNo = IN + SnowflakeId。

列表响应关键字段:id, noticeNo, markReference, warehouseId, warehouseName, inboundType, receiptStatus, receiptStatusLabel, expectedArrivalTime, actualArrivalTime, skuSummary, receivedSkuSummary, receiveProgress, boxCount, receivedBoxCount, isException, createTime。


5 主业务流程

5.1 店铺授权 → 拉单

sequenceDiagram
  participant U as 客户
  participant OMS as OMS API
  participant Plat as 电商平台

  U->>OMS: 获取 auth-url
  OMS-->>U: OAuth URL
  U->>Plat: 授权
  Plat-->>OMS: auth-callback(code)
  OMS->>OMS: 写入 t_sales_store + token
  Note over OMS,Plat: 定时任务拉取店铺订单
  OMS->>Plat: 拉单 API
  OMS->>OMS: upsert t_sales_store_order
  • 平台订单 定时同步 + 手动「同步状态」;Token 过期前刷新(各平台 Adapter)。
  • Manual 店铺:无 OAuth,支持手工录入订单(二期)。

5.2 店铺订单 → 小包发货

  1. 用户在「店铺订单」筛选 fulfillStatus=pending。
  2. 操作「库存匹配」:映射 → 扣库存 → 创建 t_order。
  3. 或操作「准备发货」:调平台 RTS API → 更新 fulfillStatus。
  4. 获取平台面单 → 可关联 OMS 出库流程。

5.3 入库预报 → 库存

  1. 客户维护 C_sku → 创建入库预报(C_inbound_notice + 箱号 C_inbound_box + 箱内行 C_inbound_box_line)→ ReceiptStatus=forecasted。
  2. 仓库 confirm-receive:按箱清点,每行指定 BinLocationId → 累加 C_inventory.Qty → completed。
  3. 不做清点/上架多态、收货日志表。

5.4 我的包裹 → 库存

  1. 客户登记快递单号 → inTransit。
  2. 到仓 → arrived;putaway 指定 SkuId + BinLocationId → 累加 C_inventory → stored。

6 客户数据隔离

与 OMS §4.4.0 对齐,扩展至仓储模块:

规则 说明
隔离键 effectiveCustomerId = t_customer.Id
列表 强制 CustomerId = effectiveCustomerId
单条读写 先查主表 CustomerId,不匹配返回「数据不存在」
子客户 与订单模块策略统一(推荐归并主客户 Id)
关联表 通过主表 OrderId / ParcelId / InboundNoticeId 间接隔离
管理员 loginType=0 可传 customerId 查指定客户(与现网订单一致)

7 WMS 对照表(实现参考,非字段拷贝)

WMS 概念 WMS 表/字段 OMS 设计
店铺 vip_shop t_sales_store + t_sales_store_token
店铺订单 vip_shop_ord t_sales_store_order
订单明细 vip_shop_ord_pro t_sales_store_order_line
包裹 vip_package C_parcel
包裹明细 vip_package_pro C_parcel_item
库存余额 vip_package_inventory C_inventory(按库位)
库位 storage_id / storageText C_bin_location
库存流水 wms_stock_record C_stock_movement
商品 SKU wms_goods_sku C_sku
组合 SKU wms_goods_sku_combine C_sku_bundle_item
平台映射 wms_shop_mapping_products_contact C_sku_platform_map
入库单 wms_warehousing_order C_inbound_notice
入库箱 wms_warehousing_box C_inbound_box
箱内 SKU wms_warehousing_box_goods C_inbound_box_line
收货日志 wms_warehousing_order_inbound_log C_inbound_receipt_log
会员 vipId CustomerId
仓库 whseId WarehouseId → t_warehouse_address
WMS 接口前缀 OMS 接口前缀
/vip/shop/* /order/platform-store/*
/vip/ord/* /order/platform-store-order/*
/vip/package/* /warehouse/parcel/*、/warehouse/inventory/*
/wms/warehousing/sku/* /warehouse/sku/*
/wms/warehousing/order/* /warehouse/inbound/*

8 枚举与常量

8.1 店铺订单履约状态 FulfillStatus

值 说明 WMS 对应
all 全部(筛选用) 0
pending 待处理 pending
toShip 待发货 toBeShipped
canceled 已取消 cancel
suspended 已搁置 suspended
shipped 已发货 shipped
completed 已完成 completed

8.2 包裹生命周期 LifecycleStatus

轻量版(3 态):inTransit / arrived / stored

值 说明 WMS pkgStatus
inTransit 待到仓 1
arrived 已到仓 2
stored 已入库 —
unclaimed 待认领 〔延后〕 3
expired 已到期 〔延后〕 4

8.3 库存变动类型 MovementType 〔延后,轻量版不建流水表〕

值 说明
inbound 入库上架
allocate 订单分配冻结
release 释放冻结
outbound 出库扣减
adjust 人工调整
relocate 换库位

8.4 入库预报状态 ReceiptStatus

轻量版(3 态):forecasted → received → completed

值 说明 WMS adopt
forecasted 已预报 N
received 已到仓待确认 B/C 合并
completed 已入库 Y
inspecting / putaway / exception 〔延后〕

8.5 平台编码 PlatformCode

值 平台
lazada Lazada
shopee Shopee
tiktok TikTok Shop
temu Temu
manual 手工店铺

9 实施分期建议 〔轻量版见 §0.5〕

阶段 范围 交付物
M1 SKU + 入库预报 + 库存余额 3 表 + WarehouseService 10 个接口 + 2 页
M2 包裹 + 库存只读页 +2 表 + 6 接口 + 2 页
M3 店铺授权 + 店铺订单 +3 表 + 2 Service + 2 页
M4 库存匹配 → t_order 打通订单

完整版分期(v0.1,仅供参考)

阶段 范围
P0~P4 见原表

10 附录:迁移脚本

一步建表(推荐)

sql/migrate_warehouse_module.sql   -- 仓储 C_* 9 张 + 店铺 t_sales_* 3 张

执行后需在 Oms.Domain 中已有对应实体(Step 1 已落地)。


11 待决事项(评审时确认)

  1. 子客户订单归属:与订单模块统一。
  2. 库位维护入口:C_bin_location 放仓储菜单还是系统仓库管理 — 建议 仓库地址详情页 或仓储下子页。
  3. 默认库位:每仓库是否预置一个 DEFAULT 库位,简化客户上架。
  4. 包裹是否 M1 必做:主路径若为入库预报,包裹可 M2。
  5. 平台首期范围:Shopee / Lazada / TikTok 择几先做。

文档结束。实现时以 docs/oms系统设计-050801.md §3 公共规范与 docs/rbac系统设计-060801.md 权限模型为准;若与本文冲突,以评审结论更新本文档版本号。