# 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 轻量版核心流程(够用即可)
```mermaid
flowchart LR
SKU["我的 SKU
C_sku"] --> MAP["平台映射
C_sku_platform_map"]
MAP --> PSO["店铺订单"]
BIN["库位
C_bin_location"]
IBN["入库预报
C_inbound_notice"] --> BOX["入库箱
C_inbound_box"]
BOX --> INV["库存
C_inventory"]
BIN --> INV
PAR["我的包裹
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 其它模块的关系
```mermaid
flowchart TB
subgraph Order["订单模块 §4"]
PS["店铺授权
t_sales_store"]
PSO["店铺订单
t_sales_store_order"]
PO["小包订单
t_order"]
end
subgraph Warehouse["仓储模块 C_*"]
BIN["库位
C_bin_location"]
PAR["我的包裹
C_parcel"]
SKU["我的 SKU
C_sku"]
INV["库存
C_inventory"]
IBN["入库预报
C_inbound_notice"]
end
subgraph System["系统主数据 §8"]
WA["仓库地址
t_warehouse_address"]
end
subgraph Operation["操作模块 §6"]
INB["入库扫描
t_inbound_record"]
OUT["出库扫描
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` 请求(含箱号)**
```json
{
"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` | 按平台汇总店铺与订单数 |
**列表请求示例**
```json
{
"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` | 异步或同步文件流 |
**列表请求关键字段**
```json
{
"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`(模糊搜明细)。
**创建请求**
```json
{
"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` | 可选预取 |
**创建请求**
```json
{
"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 店铺授权 → 拉单
```mermaid
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` 权限模型为准;若与本文冲突,以评审结论更新本文档版本号。*