## Context

运营需要在资产层查看当前主套餐及所有排队主套餐顺序接续后的预计最终到期时间。该结果依赖后端套餐队列、激活条件与计时规则，前端只负责展示接口结果。

## Goals / Non-Goals

- Goals:
  - 在资产详情、IoT 卡列表和设备列表统一展示“预计套餐到期时间”。
  - 区分可精确预计与待激活后才可计算的状态。
  - 对临期资产提供基于后端剩余天数的视觉提示。
- Non-Goals:
  - 不修改单个套餐明细的“到期时间”展示或套餐队列顺序。
  - 不新增预计到期时间筛选、排序或前端日期计算。
  - 不改变套餐续费、激活或到期规则。

## Decisions

- Decision: 统一使用以下五个后台响应字段：`estimated_final_expires_at`、`days_until_final_expiry`、`expiry_estimate_status`、`expiry_estimate_status_name`、`is_expiring`，不调用额外计算接口。
- Decision: `expiry_estimate_status` 仅使用 `exact`、`waiting_activation`、`none`、`invalid_data`。除 `exact` 外，`estimated_final_expires_at` 和 `days_until_final_expiry` 必须为 `null`；已过期的 `exact` 资产允许返回负数剩余天数。
- Decision: 仅当 `expiry_estimate_status=exact` 且存在 `estimated_final_expires_at` 时格式化展示日期；不可预计状态展示“待激活后起算”。
- Decision: `is_expiring=true` 是临期样式的唯一触发条件，`days_until_final_expiry` 只作为剩余天数展示或样式辅助信息，前端不自行判定临期阈值。
- Decision: 普通卡和设备列表保持既有服务端返回顺序与前端排序行为，不因临期字段重排。
- Alternatives considered: 前端根据当前套餐到期时间、排队套餐时长和计时基准计算最终日期。未采用，因为等待激活和后端队列规则会导致结果不准确。

## Risks / Trade-offs

- 后端缺少预计字段时无法显示最终日期 -> 对空值显示稳定占位，不以当前套餐日期替代。
- 未知 `expiry_estimate_status` 可能导致错误日期展示 -> 仅 `exact` 可显示日期，其他状态显示稳定占位或后端约定的不可预计提示。
- 列表增加时间列会占用宽度 -> 作为可配置动态列，沿用现有横向滚动与列选择能力。

## Migration Plan

1. 扩展资产详情及卡、设备列表类型以保留预计最终到期字段。
2. 将资产详情响应字段映射到页面状态，并在基础信息区域展示。
3. 在卡和设备列表增加预计套餐到期时间列及临期样式。
4. 验证无套餐、仅当前套餐、多个排队套餐和待激活后起算四类响应。
5. 如需回滚，移除新增展示字段和列表列；不涉及数据迁移。

## Open Questions

- 后端若返回未约定的状态值，前端不得按 `estimated_final_expires_at` 是否为空展示日期，应按不可预计状态处理。
