## ADDED Requirements

### Requirement: ExchangeOrder 换货单模型定义

系统 SHALL 定义 `ExchangeOrder` 模型并映射到 `tb_exchange_order`，用于承载客户端换货完整生命周期。

模型字段 MUST 至少包含：
- 基础：`id`、`created_at`、`updated_at`、`deleted_at`、`creator`、`updater`
- 单号：`exchange_no`
- 旧资产：`old_asset_type`、`old_asset_id`、`old_asset_identifier`
- 新资产：`new_asset_type`、`new_asset_id`、`new_asset_identifier`
- 收货：`recipient_name`、`recipient_phone`、`recipient_address`
- 物流：`express_company`、`express_no`
- 迁移：`migrate_data`、`migration_completed`、`migration_balance`
- 业务：`exchange_reason`、`remark`、`status`
- 多租户：`shop_id`

`ExchangeOrder` SHALL 嵌入 `BaseModel` 并实现 `TableName() string`，返回 `tb_exchange_order`。

#### Scenario: 创建换货单模型实例
- **WHEN** 系统创建新的换货单记录
- **THEN** 记录 MUST 同时包含旧资产快照、收货信息占位、迁移状态字段和多租户字段

---

### Requirement: 换货状态常量定义

系统 MUST 使用 int 常量定义换货状态：
- `1` 待填写信息
- `2` 待发货
- `3` 已发货待确认
- `4` 已完成
- `5` 已取消

#### Scenario: 状态常量一致性
- **WHEN** Service、Store、Handler 读取或更新换货状态
- **THEN** 各层 MUST 使用统一常量值，禁止硬编码散落魔法数字

---

### Requirement: 换货状态机流转规则

系统 SHALL 执行以下状态机：
- 创建换货单后：`1`
- 客户填写收货信息后：`1 -> 2`
- 后台发货后：`2 -> 3`
- 后台确认完成后：`3 -> 4`
- 取消：仅允许 `1/2 -> 5`

系统 MUST 禁止非法流转（如 `3 -> 5`、`4 -> 2`）。

#### Scenario: 已发货不可取消
- **WHEN** 换货单状态为 `3` 且请求取消
- **THEN** 系统 MUST 拒绝并返回状态流转非法错误

---

### Requirement: 换货单号生成规则

系统 MUST 为每个换货单生成全局可追踪单号，格式为：`EXC + 时间戳片段 + 随机数片段`。

生成规则 SHALL 满足：
- 前缀固定为 `EXC`
- 包含日期/时间信息用于人工排查
- 包含随机片段降低并发冲突概率

#### Scenario: 生成换货单号
- **WHEN** 后台发起换货并创建新单
- **THEN** 系统 MUST 生成形如 `EXC20260319XXXXXX` 的单号并写入 `exchange_no`
