## ADDED Requirements

### Requirement: 换货流程类型支持

系统 SHALL 支持两种换货流程类型：物流换货（shipping）和直接换货（direct），用于满足不同场景下的换货需求。

#### Scenario: 创建物流换货单

- **WHEN** 用户选择"物流换货"类型创建换货单
- **THEN** 换货单状态为"待填写信息"（status=1），flow_type 为 "shipping"
- **AND** 需要后续填写收货信息、发货、确认完成等步骤

#### Scenario: 创建直接换货单

- **WHEN** 用户选择"直接换货"类型并填写新资产标识符创建换货单
- **THEN** 换货单状态为"已完成"（status=4），flow_type 为 "direct"
- **AND** completed_at 字段记录当前时间
- **AND** 无需填写收货信息和发货流程

#### Scenario: 历史数据兼容

- **WHEN** 读取 flow_type 为空的历史换货单
- **THEN** 系统应将其视为"物流换货"（shipping）类型
- **AND** 按照物流换货流程展示和处理

### Requirement: 换货时间戳记录

系统 SHALL 记录换货流程中的关键时间节点，包括发货时间（shipped_at）和完成时间（completed_at）。

#### Scenario: 物流换货发货时间记录

- **WHEN** 物流换货单执行发货操作
- **THEN** shipped_at 字段记录发货时间
- **AND** 换货单状态变更为"已发货"（status=3）

#### Scenario: 物流换货完成时间记录

- **WHEN** 物流换货单确认完成
- **THEN** completed_at 字段记录完成时间
- **AND** 换货单状态变更为"已完成"（status=4）

#### Scenario: 直接换货完成时间记录

- **WHEN** 创建直接换货单
- **THEN** completed_at 字段立即记录创建时间
- **AND** shipped_at 字段为 null（无发货环节）

### Requirement: 创建换货单流程类型选择

用户在创建换货单时 SHALL 能够选择换货流程类型，并根据选择的类型填写相应的必填字段。

#### Scenario: 选择直接换货时必填新资产标识符

- **WHEN** 用户选择"直接换货"类型
- **THEN** 表单必须显示"新资产标识符"输入框（必填）
- **AND** 必须显示"是否迁移数据"开关（可选，默认 false）

#### Scenario: 选择物流换货时隐藏直接换货字段

- **WHEN** 用户选择"物流换货"类型
- **THEN** 表单不显示"新资产标识符"和"是否迁移数据"字段
- **AND** 仅需填写换货原因、旧资产类型和旧资产标识符

#### Scenario: 提交直接换货单参数

- **WHEN** 用户提交直接换货单
- **THEN** 请求参数 MUST 包含 flow_type="direct"、new_identifier 和 migrate_data
- **AND** 后端返回状态为"已完成"的换货单

### Requirement: 换货单列表流程类型筛选

用户在换货单列表页 SHALL 能够按流程类型筛选换货单，并查看流程类型信息。

#### Scenario: 显示流程类型列

- **WHEN** 用户查看换货单列表
- **THEN** 列表 MUST 显示"流程类型"列
- **AND** 该列显示"物流换货"或"直接换货"

#### Scenario: 按流程类型筛选

- **WHEN** 用户在筛选区选择流程类型（全部/物流换货/直接换货）
- **THEN** 列表仅显示选中类型的换货单
- **AND** 查询参数 flow_type 传递对应值（shipping/direct）

#### Scenario: 资产标识符模糊查询

- **WHEN** 用户输入资产标识符进行搜索
- **THEN** 系统同时匹配旧资产标识符和新资产标识符
- **AND** 返回所有匹配的换货单

### Requirement: 换货单详情流程类型展示

换货单详情页 SHALL 根据流程类型动态展示相关信息和时间戳。

#### Scenario: 显示流程类型和时间戳

- **WHEN** 用户查看换货单详情
- **THEN** 详情页 MUST 显示"流程类型"字段（物流换货/直接换货）
- **AND** 对于物流换货，显示"发货时间"（shipped_at，已发货后有值）
- **AND** 对于所有已完成的换货单，显示"完成时间"（completed_at）

#### Scenario: 直接换货隐藏收货和物流信息

- **WHEN** 用户查看直接换货单详情
- **THEN** 详情页不显示"收货信息"区块
- **AND** 详情页不显示"物流信息"区块

#### Scenario: 物流换货正常显示所有信息

- **WHEN** 用户查看物流换货单详情
- **THEN** 详情页显示"收货信息"区块（填写后有值）
- **AND** 详情页显示"物流信息"区块（发货后有值）

## MODIFIED Requirements

### Requirement: 换货单发货操作限制

系统 SHALL 仅允许物流换货单执行发货操作，直接换货单不支持发货。

**原有行为**: 所有状态为"待发货"的换货单均可执行发货操作。

**新行为**: 仅 flow_type="shipping" 且 status=2（待发货）的换货单可执行发货操作。

#### Scenario: 物流换货单可以发货

- **WHEN** 换货单 flow_type="shipping" 且 status=2
- **THEN** 详情页显示"发货"按钮
- **AND** 用户可以填写快递公司、快递单号等信息并提交

#### Scenario: 直接换货单不可发货

- **WHEN** 换货单 flow_type="direct"
- **THEN** 详情页不显示"发货"按钮
- **AND** 如果前端误调用发货接口，后端返回 400 错误："流程类型不支持该操作"

#### Scenario: 前端阻止不合法发货操作

- **WHEN** 详情页加载换货单数据
- **THEN** 前端根据 flow_type 和 status 判断是否显示"发货"按钮
- **AND** 仅在 flow_type="shipping" 且 status=2 时显示

### Requirement: 换货单确认完成操作限制

系统 SHALL 仅允许物流换货单在已发货状态下执行确认完成操作，直接换货单自动完成。

**原有行为**: 状态为"已发货"的换货单可执行确认完成操作。

**新行为**: 仅 flow_type="shipping" 且 status=3（已发货）的换货单可执行确认完成操作。

#### Scenario: 物流换货单可以确认完成

- **WHEN** 换货单 flow_type="shipping" 且 status=3
- **THEN** 详情页显示"确认完成"按钮
- **AND** 用户点击后换货单状态变更为"已完成"

#### Scenario: 直接换货单不可确认完成

- **WHEN** 换货单 flow_type="direct"
- **THEN** 详情页不显示"确认完成"按钮
- **AND** 如果前端误调用完成接口，后端返回 400 错误

#### Scenario: 前端阻止不合法完成操作

- **WHEN** 详情页加载换货单数据
- **THEN** 前端根据 flow_type 和 status 判断是否显示"确认完成"按钮
- **AND** 仅在 flow_type="shipping" 且 status=3 时显示

### Requirement: 换货单取消操作限制

系统 SHALL 仅允许物流换货单在待填写信息或待发货状态下取消，直接换货单和已发货的物流换货单不可取消。

**原有行为**: 状态为"待填写信息"或"待发货"的换货单可取消。

**新行为**: 仅 flow_type="shipping" 且 status IN (1, 2) 的换货单可取消。

#### Scenario: 物流换货单待发货前可取消

- **WHEN** 换货单 flow_type="shipping" 且 status=1 或 status=2
- **THEN** 详情页显示"取消"按钮
- **AND** 用户可以取消换货单

#### Scenario: 物流换货单已发货后不可取消

- **WHEN** 换货单 flow_type="shipping" 且 status=3
- **THEN** 详情页不显示"取消"按钮
- **AND** 如果前端误调用取消接口，后端返回错误

#### Scenario: 直接换货单不可取消

- **WHEN** 换货单 flow_type="direct"
- **THEN** 详情页不显示"取消"按钮
- **AND** 如果前端误调用取消接口，后端返回 400 错误："流程类型不支持该操作"

#### Scenario: 前端阻止不合法取消操作

- **WHEN** 详情页加载换货单数据
- **THEN** 前端根据 flow_type 和 status 判断是否显示"取消"按钮
- **AND** 仅在 flow_type="shipping" 且 status IN (1, 2) 时显示
