Files
wms-saas/docs/database/01-er-overview.md
T
2026-09-30 11:11:54 +08:00

101 lines
3.6 KiB
Markdown

# ER 关系
Phase 1 锁定的核心模型。表结构见同目录各领域文件。退货、物流主数据、平台店铺、登录 / API 日志不在本图中,留到对应 Phase。
关联一律用业务编码,并始终带 `tenant_code`。
```mermaid
erDiagram
wms_tenant ||--o{ wms_user : tenant_code
wms_tenant ||--o{ wms_role : tenant_code
wms_role ||--o{ wms_user_role : role_code
wms_user ||--o{ wms_user_role : user_code
wms_role ||--o{ wms_role_permission : role_code
wms_permission ||--o{ wms_role_permission : permission_code
wms_warehouse ||--o{ wms_zone : warehouse_code
wms_zone ||--o{ wms_location : zone_code
wms_customer ||--o{ wms_product : customer_code
wms_product ||--o{ wms_sku : product_code
wms_sku ||--o{ wms_sku_barcode : sku_code
wms_sku ||--o{ wms_pack_spec : sku_code
wms_sku ||--o{ wms_inventory : sku_code
wms_location ||--o{ wms_inventory : location_code
wms_batch ||--o{ wms_inventory : batch_no
wms_inventory ||--o{ wms_stock_log : movement
wms_inbound ||--o{ wms_inbound_line : inbound_no
wms_inbound_line ||--o{ wms_inbound_receipt : line_no
wms_inbound_line ||--o{ wms_inbound_putaway : line_no
wms_order ||--o{ wms_order_line : order_no
wms_order ||--o{ wms_outbound : order_no
wms_outbound ||--o{ wms_outbound_line : outbound_no
wms_outbound_line ||--o{ wms_outbound_allocation : line_no
wms_wave ||--o{ wms_wave_outbound : wave_no
wms_outbound ||--o{ wms_wave_outbound : outbound_no
wms_outbound_allocation ||--o{ wms_pick_task : allocation_no
wms_outbound ||--o{ wms_package : outbound_no
wms_package ||--o{ wms_package_line : package_no
wms_outbound ||--o{ wms_shipment : outbound_no
```
## 库存落在哪一行
余额行的粒度:
`tenant_code + customer_code + warehouse_code + location_code + sku_code + batch_no`
货主(`customer_code`)必须在粒度里。租户是仓配公司,客户是 3PL 的货主,两家客户的库存不能混在一行。
在途、尚未落到库位时,`location_code` 为空字符串,表示虚拟在途位置。
## 数量怎么变
在手库存(不含在途):
`available_qty + reserved_qty + picked_qty + hold_qty + damaged_qty`
| 业务 | 数量桶 |
| --- | --- |
| 入库确认 | 在途 `+` |
| 收货到收货位 | 在途 `-`,收货位可用或残损 `+` |
| 上架 | 源库位可用 `-`,目标库位可用 `+` |
| 分配 | 可用 `-`,预占 `+` |
| 取消分配 | 预占 `-`,可用 `+` |
| 拣货 | 预占 `-`,已拣 `+` |
| 发货 | 已拣 `-`(离开仓库) |
| 冻结 / 解冻 | 可用与冻结对转 |
| 转残 / 转良 | 可用与残损对转 |
| 调整、盘点确认 | 对应桶按差额 `+/-` |
每一次桶的变化写一行 `wms_stock_log`。同一次业务动作的多行共用 `movement_no`。余额更新与流水插入在同一数据库事务中。
## 单据链
```
订单 wms_order
→ 出库单 wms_outbound
→ 分配 wms_outbound_allocation
→ 波次 wms_wave(可无,则按单拣货)
→ 拣货任务 wms_pick_task
→ 包裹 wms_package
→ 发货 wms_shipment
```
第一阶段业务上一单一张出库单。表结构允许多张出库单指向同一 `order_no`,后续拆单不用改表。
入库不经过订单:
```
入库单 → 明细 → 收货记录 → 上架记录 → 库存余额 + 流水
```
收货差异不单独建表,用明细上的 `expected_qty - received_qty` 得出。
## 状态日志
入库、出库、订单、波次、调整、盘点的状态变化写 `wms_status_log`(见 [10-saas.md](./10-saas.md))。非法转换在领域层拒绝,不写日志。