## 1. 前置确认

- [x] 1.1 确认提案一（asset-identifier-standardization）已完成：`tb_order.asset_identifier` 字段存在，B 端资产路由已统一为 `:identifier`

## 2. 数据层：ExchangeOrder Store 扩展

- [x] 2.1 在 `internal/store/postgres/exchange_order_store.go` 新增 `FindByNewAssetID(ctx, assetType, assetID) (*model.ExchangeOrder, error)` 方法：查询 `WHERE new_asset_id = ? AND new_asset_type = ?`，返回该资产的换货来源记录（找不到则返回 nil，表示无前代）

## 3. DTO 层：新增响应结构

- [x] 3.1 在 `internal/model/dto/asset_dto.go` 新增以下结构体：
  - `AssetOrdersRequest`：路径参数 `identifier`，query 参数 `page`、`page_size`、`include_previous`
  - `AssetOrderItem`：单条订单项（order_no、order_type、payment_status、payment_status_text、total_amount、payment_method、paid_at、generation、items、created_at）
  - `GenerationOrders`：单代订单块（generation、identifier、asset_type、total、page、page_size、items）
  - `PreviousGenerationOrders`：前代订单块（generation、identifier、asset_type、exchange_no、exchanged_at、total、items）
  - `AssetOrdersResponse`：完整响应（current_generation、previous_generations、truncated）

## 4. 服务层：GetOrders 方法

- [x] 4.1 在 `internal/service/asset/service.go` 新增 `GetOrders(ctx, identifier, page, pageSize, includePrevious bool) (*dto.AssetOrdersResponse, error)` 方法：
  - 调用 `Resolve()` 得到 asset_type 和 asset_id
  - 查询本代订单：`orderStore.ListByAssetIdentifier(ctx, identifier, page, pageSize)`
  - 若 `includePrevious=true`：循环调用 `exchangeOrderStore.FindByNewAssetID()` 追溯换货链（最多 10 代）；每代查询前代 `old_asset_identifier` 对应的订单（最多 20 条，无分页）
  - 组装 `AssetOrdersResponse` 返回
- [x] 4.2 在 `internal/store/postgres/order_store.go` 新增 `ListByAssetIdentifier(ctx, identifier, page, pageSize) ([]*model.Order, int64, error)` 方法：查询 `WHERE asset_identifier = ?`，分页，倒序

## 5. Handler 层：新增 Orders Handler

- [x] 5.1 在 `internal/handler/admin/asset.go` 新增 `Orders(c *fiber.Ctx) error` handler：
  - 从路径参数读取 `identifier`；从 query 读取 `page`、`page_size`、`include_previous`
  - 调用 `assetService.GetOrders()`
  - 返回 `response.Success(c, result)`
  - 注释：`// Orders 查询资产历史订单（支持跨代追溯）` + `// GET /api/admin/assets/:identifier/orders`

## 6. 路由层：注册新路由

- [x] 6.1 在 `internal/routes/asset.go` 注册：`assets.Get("/:identifier/orders", h.Asset.Orders)`（注意路由顺序，避免与 `/resolve/:identifier` 冲突）

## 7. 文档生成器更新

- [x] 7.1 在 `cmd/api/docs.go` 和 `cmd/gendocs/main.go` 的 `handlers` 结构体中确认 `AssetHandler` 已包含新的 `Orders` 方法（检查是否需要更新 handler 注册）
- [x] 7.2 执行 `go run cmd/gendocs/main.go` 重新生成 OpenAPI 文档，验证新接口体现

## 8. 验证

- [x] 8.1 构建验证：`go build ./...` 无编译错误
- [x] 8.2 LSP 诊断：对所有修改文件运行 lsp_diagnostics，无错误/警告
- [x] 8.3 接口验证（使用 PostgreSQL MCP + curl）：
  - 查询有订单的资产：`GET /api/admin/assets/:identifier/orders` 返回正确订单列表，含 generation 字段
  - 查询无订单资产：返回 `items: [], total: 0`
  - 查询不存在的 identifier：返回 404
  - 查询换货资产（带 include_previous=true）：`previous_generations` 包含前代订单，附带 exchange_no 和 exchanged_at
  - 查询无前代的资产（带 include_previous=true）：`previous_generations` 为空数组
  - 代理查询无权限资产：返回 403
