# 03 — 设备列表批量展示预计最终到期

**What to build:** 运营人员和代理人员查看设备列表时，每台设备都能看到与资产详情完全一致的“预计套餐到期时间”、剩余自然日、推算状态和临期标记。列表复用统一批量 Query，不按设备逐条读取套餐，也不改变普通设备列表既有筛选、分页和排序。

**Blocked by:** `.scratch/ur46-estimated-final-expiry/issues/01-admin-asset-detail-estimated-final-expiry.md` — 01 — 后台资产详情统一展示预计最终到期

**Status:** done（后端）

- [x] 架构主通道为 Query；复用 01 已建立的批量入口和纯计算核心，完整收口普通设备列表的预计最终到期投影，不迁移设备绑定、设备管理写操作、套餐生命周期或未触碰的列表逻辑。
- [x] 设备列表每项明确返回预计日期、剩余自然日、推算状态、状态中文名称和临期标记；非 `exact` 时 nullable 字段返回 `null`，查询错误遵循统一错误规范。
- [x] 一次批量加载本页全部设备的参与使用记录和必要历史套餐兜底数据，再按资产分组计算；不得逐设备调用单资产 Query 或产生其他 N+1 查询。
- [x] 同一台设备在列表批量入口和详情单资产入口得到完全一致的结果，包含历史快照回退、等待激活、异常数据和已过期负数天数场景。
- [x] Count 与 Fetch 保持原有相同过滤条件，新增投影不改变总数；普通设备列表继续使用原有稳定排序，不按预计日期或临期程度重新排序。
- [ ] 后台和代理端设备列表统一显示“预计套餐到期时间”，四种状态分别展示精确日期、待激活后起算、—、数据异常；前端不叠加套餐时长或自行计算剩余天数。（前端任务，不纳入后端交付）
- [ ] `is_expiring=true` 时仅应用约定临期颜色，不引入 UR#33 的独立临期列表、0～3 天置顶、Dashboard 或通知行为。（前端任务，不纳入后端交付）
- [x] HTTP 集成测试覆盖四种状态、nullable 字段、详情与列表一致性、原筛选和分页不变；使用每页 100 台设备的代表性数据验证固定查询数量并满足项目性能目标。
- [ ] 前端验收普通设备列表排序不变、翻页稳定，当前套餐自身到期时间不再作为资产摘要中的第二个汇总到期字段。（前端任务，不纳入后端交付）
