# 发货入口统一设计

## 背景

当前系统同时存在两个发货相关入口：

- `嘉恒仓库 -> 成品库 -> 销售出库`
- `发货与售后 -> 发货管理`

两个入口都会影响发货单、成品库存和后续退货追溯，容易让用户不知道应该在哪里执行发货，也容易造成业务口径重复。

## 目标

采用方案 A：将发货执行入口统一到 `嘉恒仓库 -> 成品库 -> 销售出库`，将 `发货与售后 -> 发货管理` 调整为发货台账/交付查询。

目标效果：

- 新增发货只允许从成品库的销售出库入口办理。
- 发货与售后模块不再新增发货，只查看、筛选、追溯发货记录。
- 销售订单发货和直接客户发货都能扣减成品库存。
- 任意发货明细都能追溯到成品库存批次和来源原材料库存批次号。
- 客户退货继续以发货批次为来源，保持退货库、废料库的追溯能力。

## 业务入口

### 成品库销售出库

`嘉恒仓库 -> 成品库 -> 销售出库` 是唯一新增发货入口。

该入口支持两种模式：

- `销售订单发货`：选择销售订单和销售订单明细，系统带出客户、产品、未发数量、收货人、电话、地址，并按成品库存批次自动拆分出库。
- `直接客户发货`：不绑定销售订单，选择客户、产品和发货数量，系统同样按成品库存批次自动拆分出库。

销售出库需要填写或维护：

- 发货模式
- 销售订单和订单明细，仅销售订单发货时必填
- 收货客户
- 发货人
- 收货人、联系电话、送货地址
- 发货产品
- 发货数量
- 运单号或订单照片
- 运费
- 自动拆分出的成品库存批次明细
- 自动拆分明细中必须直接展示成品批次、来源原材料库存批次号、来源材料摘要，方便发货前确认这批货来自哪批材料

### 发货管理

`发货与售后 -> 发货管理` 调整为发货台账/交付查询。

该页面保留：

- 发货列表
- 发货明细抽屉
- 发货单号、客户、产品、销售订单号、发货时间、发货数量、状态
- 运单号、运费、订单照片
- 成品批次、来源原材料库存批次号、来源材料信息
- 搜索、排序、分页

该页面去除：

- 新增发货按钮
- 新增发货抽屉
- 任何直接创建发货单的入口

## 数据流

成品库销售出库创建成功后统一写入：

- 发货单
- 发货明细
- 成品库存批次扣减
- 成品库库存余额扣减
- 库存流水，类型为 `SALES_OUT`
- 销售订单已发数量，仅销售订单发货时回写
- 发货批次追溯数据，供退货库和废料库使用

销售订单发货链路：

```text
销售订单
-> 销售订单明细
-> 成品库销售出库
-> 发货单
-> 发货明细
-> 成品库存批次
-> 来源原材料库存批次号
```

直接客户发货链路：

```text
客户
-> 成品库销售出库
-> 发货单
-> 发货明细
-> 成品库存批次
-> 来源原材料库存批次号
```

## 追溯规则

每条发货明细必须绑定实际扣减的成品库存批次。

成品库销售出库的自动拆分明细，在提交前就要直接展示追溯字段，而不是只在提交后的台账里展示。

成品库存批次应保留以下来源信息：

- 成品库存批次号
- 来源原材料库存批次号
- 来源材料摘要
- 完工入库或委外入库来源
- 成本相关信息

因此无论是否绑定销售订单，都可以从发货明细倒查：

```text
发货单
-> 发货明细
-> 成品库存批次
-> 来源原材料库存批次号
-> 原材料物料
-> 原材料入库批次
-> 入库成本或采购来源
```

## 退货联动

客户退货继续从发货批次选择来源。

- 可返工的客户退货进入 `退货库 -> 退货入库`。
- 判定报废的客户退货进入 `废料库 -> 退货废料入库`。
- 两种退货都应能通过发货明细追溯到成品批次和来源原材料库存批次号。

直接客户发货也必须支持退货，因为直接客户发货同样生成发货单和发货明细。

## 校验规则

成品库销售出库需要校验：

- 必须选择成品库仓库。
- 必须选择客户。
- 必须选择产品。
- 发货数量必须大于 0。
- 自动拆分出的成品批次数量合计必须等于本次发货数量。
- 成品库存不足时禁止提交。
- 销售订单发货时，发货数量不能超过订单明细未发数量。
- 运单号和订单照片至少填写或上传一个。
- 运费字段保留，允许为 0。

发货管理台账需要保证：

- 不产生库存变更。
- 不产生发货单。
- 仅展示已有发货单、明细、追溯链路和物流信息。

## UI 调整

成品库销售出库抽屉增加发货模式选择：

- 销售订单发货
- 直接客户发货

销售订单发货时展示销售订单和订单明细选择。

直接客户发货时隐藏销售订单相关字段，允许手动选择客户和产品。

自动销售出库明细表建议展示以下列：

- 成品库存批次号
- 来源原材料库存批次号
- 来源材料摘要
- 可发数量
- 本次发货数量
- 本次发货重量

发货管理页面标题建议改为 `发货台账`，页面说明调整为交付查询和批次追溯，不再出现新增发货入口。

## 测试重点

- 成品库销售出库可以创建销售订单发货。
- 成品库销售出库可以创建直接客户发货。
- 发货后成品库存正确扣减。
- 发货后生成 `SALES_OUT` 库存流水。
- 销售订单发货后订单已发数量正确回写。
- 直接客户发货不影响销售订单数量。
- 成品库销售出库自动拆分明细能在提交前展示来源原材料库存批次号。
- 发货管理页面没有新增发货入口。
- 发货管理明细能展示来源原材料库存批次号。
- 退货库和废料库仍能从发货批次选择来源。
