## MODIFIED Requirements

### Requirement: 创建套餐购买订单

系统 SHALL 允许买家创建套餐购买订单。**[BREAKING]** 请求体改为使用资产标识符（identifier），废弃 `iot_card_id`/`device_id` 主键字段；`order_type` 字段由系统根据 identifier 解析结果自动填入，请求体不再接受。

**后台订单创建请求（CreateAdminOrderRequest）**：
```json
{
  "identifier":      "string（资产标识符，ICCID 或 VirtualNo，必填）",
  "package_ids":     "[uint]（套餐 ID 列表，必填，1-10 个）",
  "payment_method":  "string（wallet|offline，必填）"
}
```

**废弃字段**：
- `iot_card_id`（原用于单卡购买）
- `device_id`（原用于设备购买）
- `order_type`（改为系统自动推断）

#### Scenario: 使用 VirtualNo 创建设备订单
- **WHEN** 管理员请求体携带 `{ identifier: "DEV-001", package_ids: [5], payment_method: "wallet" }`
- **THEN** 系统解析 identifier 为设备，自动设置 `order_type = device`，创建设备购买订单

#### Scenario: 使用 ICCID 创建单卡订单
- **WHEN** 管理员请求体携带 `{ identifier: "898600XXXXX", package_ids: [5], payment_method: "wallet" }`
- **THEN** 系统解析 identifier 为独立 IoT 卡（`is_standalone = true`），自动设置 `order_type = single_card`，创建单卡购买订单

#### Scenario: 使用绑定设备的卡 ICCID 创建订单被拒
- **WHEN** 管理员请求体携带 `{ identifier: "898600XXXXX" }` 但该卡 `is_standalone = false`
- **THEN** 系统返回错误"该卡已绑定设备，请前往设备页面购买套餐"，订单不创建

#### Scenario: identifier 不存在
- **WHEN** 请求的 identifier 无法解析到任何资产
- **THEN** 返回错误"资产不存在"，订单不创建

## ADDED Requirements

### Requirement: 订单响应包含资产标识符

订单响应（OrderResponse）SHALL 包含资产标识符字段，前端无需额外请求即可展示资产信息。

**新增响应字段**：
- `asset_identifier`：下单时资产的标识符快照（ICCID 或 VirtualNo）
- `asset_type`：资产类型（`single_card` 对应 `iot_card`，`device` 对应 `device`）

#### Scenario: 查看订单详情时展示资产标识符
- **WHEN** 管理员查询订单详情 `GET /api/admin/orders/:id`
- **THEN** 响应中包含 `asset_identifier`（如 "DEV-001"）和 `asset_type`（如 "device"）
- **THEN** 即使原资产已被删除，`asset_identifier` 仍可读（快照字段）

### Requirement: 订单列表支持按资产标识符过滤

系统 SHALL 在订单列表查询（OrderListRequest）中支持 `identifier` 过滤参数，按照资产标识符精确匹配订单（匹配 `asset_identifier` 快照字段）。

#### Scenario: 按 ICCID 查询该卡的历史订单
- **WHEN** 管理员查询 `GET /api/admin/orders?identifier=898600XXXXX`
- **THEN** 返回 `asset_identifier = "898600XXXXX"` 的所有订单（分页）

#### Scenario: 按设备 VirtualNo 查询该设备的历史订单
- **WHEN** 管理员查询 `GET /api/admin/orders?identifier=DEV-001`
- **THEN** 返回 `asset_identifier = "DEV-001"` 的所有订单（分页）

#### Scenario: 标识符无匹配订单
- **WHEN** 管理员查询不存在订单的 identifier
- **THEN** 返回空列表（`items: []`，`total: 0`），不返回错误
