## Context

系统中换货流程已有完整的数据记录：
- `ExchangeOrder` 表存有 `old_asset_id`、`old_asset_identifier`、`new_asset_id`、`new_asset_identifier`，形成资产的"世代链"
- `Order` 表通过提案一新增的 `asset_identifier` 快照字段，可直接按标识符查询订单
- `Device`/`IotCard` 表有 `generation` 字段记录当前世代编号

当前缺失的是：把这三张表的信息串联起来，给管理员呈现"这个资产在各世代的订单全貌"。

## Goals / Non-Goals

**Goals:**
- 新增 `GET /api/admin/assets/:identifier/orders` 接口，默认返回本代订单
- 支持 `include_previous=true` 参数，追溯换货链返回前代订单（明确标注世代）
- 分页支持

**Non-Goals:**
- C 端不暴露跨代订单（C 端用户视角只关心当前资产本代）
- 修改订单数据本身（只读接口）
- 跨代订单的聚合统计（如历代总充值额），留给未来迭代

## Decisions

### 决策 1：通过 ExchangeOrder 逆向追溯前代资产 ID

**查询逻辑**：
```
给定 identifier（当前资产）：
  1. 通过注册表/Resolve 得到 asset_type + asset_id（当前代）
  2. 查当前资产的订单：WHERE asset_identifier = identifier（直接走快照字段）
  3. 若 include_previous=true：
     a. 查 ExchangeOrder WHERE new_asset_id = asset_id（找到换货记录）
     b. 得到 old_asset_id + old_asset_identifier（前代标识符）
     c. 查前代订单：WHERE asset_identifier = old_asset_identifier
     d. 递归至无更多前代（链式追溯，最多向前追溯 N 代，防止死循环）
  4. 合并结果，按世代分组，每条订单附加 generation 字段
```

**理由**：直接使用 `asset_identifier` 快照字段查询，无需 JOIN；换货链通过 ExchangeOrder 逆向遍历，逻辑清晰。

### 决策 2：响应结构按世代分组，不跨代混合排序

**选择**：响应分为 `current_generation`（本代）和 `previous_generations`（前代数组）两个区块

**备选方案**：全部打平按时间排序。问题：管理员看到时间线上跳跃的世代可能产生困惑（订单时间早于资产创建时间）

**理由**：分区块展示逻辑清晰——管理员一眼能看出"这是这台设备自己的订单"vs"这是上一台的历史"

### 决策 3：限制追溯深度，防止换货链过长

最大追溯世代数为 **10 代**，超出则截断并在响应中说明（`truncated: true`）。实际业务中换货链极少超过 3 代，此限制仅为安全保障。

### 决策 4：本接口依赖提案一的 asset_identifier 快照字段

若提案一未完成（Order 表无 `asset_identifier` 字段），本接口降级为通过 `iot_card_id`/`device_id` 查询（只支持本代，不支持 include_previous）。实际按提案一完成后实现。

## Risks / Trade-offs

| 风险 | 缓解措施 |
|------|---------|
| **换货链查询产生多次 DB 往返** | 每代一次 ExchangeOrder 查询 + 一次 Order 查询；链深度有限（≤10），总查询次数可控；可加 Redis 缓存换货链 |
| **旧订单 asset_identifier 为空**（提案一之前创建的订单）| 本接口限定只查有 `asset_identifier` 快照的订单；旧订单通过 `iot_card_id`/`device_id` fallback 查询补充，明确标注"旧格式订单" |
| **include_previous 导致响应体过大** | 分页仅对本代订单生效；前代订单默认返回最近 20 条，不支持前代分页（前代是历史归档，数量有限） |

## Migration Plan

1. 依赖提案一完成（`Order.asset_identifier` 字段存在）
2. 实现 `exchange_order_store.FindChainByNewAssetID()`
3. 实现 `asset_service.GetOrders()`
4. 注册路由和 Handler
5. 更新文档生成器

## Open Questions

- 无
