## MODIFIED Requirements

### Requirement: 统一资产解析入口

系统 SHALL 提供统一的资产查找接口，通过任意标识符定位卡或设备，并返回该资产的中等聚合信息。

**API 端点**: `GET /api/admin/assets/resolve/:identifier`

**响应结构（AssetResolveResponse）新增字段**：

*通用字段（device 和 card 均有）*：
- `real_name_at`（`*time.Time`，可为 null）：最近一次完成实名的时间
  - **card 类型**：直接取 `IotCard.first_realname_at`（未实名过则为 null）
  - **device 类型**：当前所有绑定卡 `first_realname_at` 中的最小值（无已实名卡则为 null）

*绑定卡列表字段变更（BoundCardInfo）*：
- `real_name_at`（`*time.Time`，可为 null）：该卡最近一次完成实名的时间，取 `IotCard.first_realname_at`

#### Scenario: 已实名的卡查询实名时间

- **WHEN** 通过标识符解析一张 `real_name_status = 1` 的卡
- **THEN** 响应中 `real_name_at` 返回该卡最近一次 `0→1` 变化时的时间戳

#### Scenario: 未实名的卡查询实名时间

- **WHEN** 通过标识符解析一张 `real_name_status = 0` 的卡
- **THEN** 响应中 `real_name_at` 返回 null

#### Scenario: 设备视角查询实名时间（部分卡已实名）

- **WHEN** 通过标识符解析一台设备，其中绑定了多张卡，部分卡已实名
- **THEN** 响应中 `real_name_at` 返回所有已实名绑定卡中 `first_realname_at` 最小的时间戳

#### Scenario: 设备视角查询实名时间（无已实名卡）

- **WHEN** 通过标识符解析一台设备，其所有绑定卡均未实名
- **THEN** 响应中 `real_name_at` 返回 null

#### Scenario: 设备绑定卡列表实名时间

- **WHEN** 通过标识符解析一台设备，绑定卡列表非空
- **THEN** `cards` 数组中每个 `BoundCardInfo` 的 `real_name_at` 返回各卡自己的 `first_realname_at`（未实名则为 null）

## ADDED Requirements

### Requirement: 手动刷新路径同步写入实名时间

系统 SHALL 在手动刷新路径（`RefreshCardDataFromGateway`）检测到实名状态由非已实名变为已实名（`0→1`）时，同步写入 `first_realname_at`，与轮询路径行为一致。

#### Scenario: 手动刷新触发实名状态变更

- **WHEN** 调用手动刷新接口，网关返回实名状态为已实名，且卡当前状态为未实名
- **THEN** `tb_iot_card.first_realname_at` 被更新为当前时间戳

#### Scenario: 手动刷新时实名状态无变化

- **WHEN** 调用手动刷新接口，网关返回实名状态与卡当前状态相同
- **THEN** `tb_iot_card.first_realname_at` 不被修改
