init
This commit is contained in:
@@ -0,0 +1,100 @@
|
||||
# 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))。非法转换在领域层拒绝,不写日志。
|
||||
Reference in New Issue
Block a user