# 换货流程升级接口变更说明

## 一、数据库字段新增

### 表：`tb_exchange_order`

新增以下字段，所有换货单相关接口响应均会返回：

| 字段           | 类型            | 说明                                                         |
| ------------ | ------------- | ---------------------------------------------------------- |
| flow_type    | string        | 流程类型：`shipping`（物流换货）或 `direct`（直接换货），历史数据为空时视为 `shipping` |
| shipped_at   | string | null | 发货时间，仅 `shipping` 流程发货后有值                                  |
| completed_at | string | null | 换货完成时间，换货完成后有值                                             |

---

# 二、后台接口变更

## 1. 创建换货单

### POST /api/admin/exchanges

### 新增请求参数

```json
{
  "old_asset_type": "iot_card",
  "old_identifier": "xxx",
  "exchange_reason": "设备损坏",
  "flow_type": "shipping",
  "new_identifier": "yyy",
  "migrate_data": false,
  "remark": null
}
```

### 参数说明

| 字段             | 类型            | 必填         | 说明                                       |
| -------------- | ------------- | ---------- | ---------------------------------------- |
| flow_type      | string        | 否          | 流程类型：`shipping` / `direct`，默认 `shipping` |
| new_identifier | string        | direct 时必填 | 新资产标识符                                   |
| migrate_data   | boolean       | 否          | 是否迁移数据，默认 false                          |
| remark         | string | null | 否          | 备注                                       |

### 不同流程行为差异

| flow_type | 创建后状态(status) | completed_at |
| --------- | ------------- | ------------ |
| shipping  | 1（待填写信息）      | null         |
| direct    | 4（已完成）        | 当前时间         |

### 说明

* shipping 为原有流程
* direct 创建后直接完成
* direct 不需要填写地址
* direct 不需要发货
* direct 不需要确认完成
* 非法 flow_type 返回参数错误

---

## 2. 换货单列表

### GET /api/admin/exchanges

### 新增查询参数

| 参数         | 类型     | 说明                       |
| ---------- | ------ | ------------------------ |
| flow_type  | string | 按流程类型筛选（shipping/direct） |
| identifier | string | 资产标识符模糊查询（同时匹配旧资产、新资产）   |

### 响应新增字段

```json
{
  "flow_type": "shipping",
  "flow_type_name": "物流换货",
  "shipped_at": null,
  "completed_at": null
}
```

---

## 3. 换货单详情

### GET /api/admin/exchanges/:id

### 响应新增字段

```json
{
  "flow_type": "shipping",
  "flow_type_name": "物流换货",
  "shipped_at": null,
  "completed_at": null
}
```

### 说明

对于 direct 类型：

* 收货信息为空
* 物流信息为空

属于正常情况，前端需根据 flow_type 控制相关区块显示。

---

## 4. 发货

### POST /api/admin/exchanges/:id/ship

### 新增限制

仅支持：

```text
flow_type = shipping
```

### 不允许情况

```text
flow_type = direct
```

返回：

```json
{
  "code": 400,
  "message": "流程类型不支持该操作"
}
```

### 前端处理

```javascript
exchange.flow_type === 'shipping'
```

---

## 5. 确认完成

### POST /api/admin/exchanges/:id/complete

### 新增限制

仅支持：

```text
flow_type = shipping
status = 3
```

### 不允许情况

```text
flow_type = direct
```

返回错误。

---

## 6. 取消换货

### POST /api/admin/exchanges/:id/cancel

### 新增限制

允许取消：

```text
flow_type = shipping
status IN (1, 2)
```

### 不允许取消

#### direct 单据

```text
flow_type = direct
```

#### 已发货单据

```text
flow_type = shipping
status = 3
```

返回错误。

---

# 三、客户端接口变更

## 1. 查询进行中的换货单

### GET /api/c/v1/exchange/pending

### 变更后返回规则

仅返回：

```text
flow_type = shipping
status IN (1, 2, 3)
```

### 不返回

```text
flow_type = direct
```

客户端无需特殊处理。

---

## 2. 填写收货地址

### POST /api/c/v1/exchange/:id/shipping-info

### 新增限制

仅支持：

```text
flow_type = shipping
status = 1
```

### 不允许

```text
flow_type = direct
```

返回错误。

---

# 四、前端 UI 改造建议

## 换货单详情页

### 新增展示字段

* 流程类型（flow_type_name）
* 完成时间（completed_at）
* 发货时间（shipped_at）

### 按流程类型控制按钮

#### direct

不显示：

* 发货
* 确认完成
* 取消

#### shipping + status = 1

显示：

* 取消

#### shipping + status = 2

显示：

* 发货
* 取消

#### shipping + status = 3

显示：

* 确认完成

### 信息区块控制

#### direct

隐藏：

* 收货信息
* 物流信息

或者显示：

```text
不适用
```

---

## 创建换货单弹窗

### 新增字段

流程类型：

* 物流换货（shipping）
* 直接换货（direct）

### 选择 direct 时

显示：

* 新资产标识符（必填）
* 是否迁移数据（开关）

对应参数：

```json
{
  "new_identifier": "xxx",
  "migrate_data": true
}
```

### 选择 shipping 时

隐藏：

* 新资产标识符
* 是否迁移数据

---

## 换货单列表页

### 新增表格列

```text
流程类型
```

显示：

```text
物流换货
直接换货
```

### 新增筛选项

```text
流程类型
```

下拉选项：

```text
全部
物流换货（shipping）
直接换货（direct）
```

---

# 五、流程状态说明

## shipping（物流换货）

```text
创建
 ↓
待填写信息（1）
 ↓
待发货（2）
 ↓
已发货（3）
 ↓
已完成（4）
```

## direct（直接换货）

```text
创建
 ↓
已完成（4）
```

---

# 六、状态与操作矩阵

| flow_type | status | 发货 | 确认完成 | 取消 |
| --------- | ------ | -- | ---- | -- |
| shipping  | 1      | ❌  | ❌    | ✅  |
| shipping  | 2      | ✅  | ❌    | ✅  |
| shipping  | 3      | ❌  | ✅    | ❌  |
| shipping  | 4      | ❌  | ❌    | ❌  |
| direct    | 4      | ❌  | ❌    | ❌  |

---

# 七、枚举定义

## flow_type

```json
{
  "shipping": "物流换货",
  "direct": "直接换货"
}
```

## flow_type_name 示例

```json
{
  "flow_type": "shipping",
  "flow_type_name": "物流换货"
}
```

```json
{
  "flow_type": "direct",
  "flow_type_name": "直接换货"
}
```
