# Phase 03.1: 设备 sync-info 读取链路修复 - Discussion Log

> **仅供审计参考。** 不用于规划、研究或执行 Agent 的输入。
> 决策结论见 CONTEXT.md — 本日志保留了讨论过程中的备选项。

**Date:** 2026-03-28
**Phase:** 03.1-sync-info-phase-3-dto
**Areas discussed:** Plan 分组策略、IsCurrent 实现细节、作用域完整性确认（C 端 stub + 实时数据架构）

---

## Plan 分组策略

| 选项 | 说明 | 选中 |
|------|------|------|
| 1 Plan 合并 | 3 修复点同属 DTO 映射缺口，统一处理 | ✓ |
| 2 Plans 分离 | device/service 系 + asset/service 系拆分 | |

**用户选择：** 1 Plan 合并
**备注：** 修复性质单一（DTO 映射缺落），无依赖分拆理由

---

## IsCurrent 实现方式

| 选项 | 说明 | 选中 |
|------|------|------|
| isCurrentMap 标准扩展 | 与 slotMap 同构，在 bindings 遍历时同时构建 | ✓ |
| 直接引用 binding.IsCurrent | 无 map，在 BoundCardInfo 构建时直接访问外层 binding | |

**用户选择：** isCurrentMap 标准扩展
**备注：** 与 asset/service.go 的 slotMap 保持风格一致

---

## 作用域完整性：C 端 stub

| 选项 | 说明 | 选中 |
|------|------|------|
| 一并修复 C 端 stub | 替换 buildMockDeviceRealtime() 为真实 Gateway 数据 | ✓ |
| 仅修复管理端 | C 端 stub 留待后续 Phase | |

**用户选择：** 一并修复

---

## C 端 DeviceRealtimeInfo 修复粒度

| 选项 | 说明 | 选中 |
|------|------|------|
| 只补 DB 存储字段 (3 个) | OnlineStatus/SwitchMode/SoftwareVersion，其余 nil | |
| 完整替换：调用 Gateway | 实时调用 sync-info，返回所有可用字段 | ✓ |
| 推迟到独立 Phase | C 端 stub 修复是独立需求 | |

**用户选择：** 完整替换，调用 Gateway

---

## 设备实时数据架构（新增议题）

**用户补充说明（原文）：**
> "不管是C端还是后台管理或者哪里,查询设备资产的时候其实都是需要实时数据的,这部分实时数据是很关键的...设备不一样,设备他具有离线,在线实时的特性,所以我们直接存没有什么意义,必然只能实时查询"

**架构原则确认：**
- 单卡资产上游属性 → 轮询系统同步到 DB → 查询 DB
- 设备资产上游属性 → 实时从 Gateway 查询（不缓存）
- 设备管理列表 → DB 缓存字段（不需要实时）
- 设备资产详情（B 端 + C 端）→ 实时 Gateway

---

## 关键实时字段优先级

**用户原文：**
> "实时状态要的东西也不多,主要是在线状态,连接设备数,网络信号强度,设备电量"
> "哦还有Wi-Fi密码跟Wi-Fi名称"

**关键字段列表：**
1. 在线状态 (OnlineStatus)
2. 网络信号强度 (Rsrp/Rsrq/Rssi/Sinr)
3. 连接设备数 (MaxClients)
4. 设备电量 (BatteryLevel)
5. WiFi 名称 (SSID)
6. WiFi 密码 (WifiPassword)
7. 当前使用卡 ICCID (CurrentIccid)

---

## Gateway 失败处理

| 选项 | 说明 | 选中 |
|------|------|------|
| 返回部分数据 | DeviceRealtime = null，其他资产信息正常返回 | ✓ |
| 返回错误 | 设备离线/Gateway 超时直接报错 | |

**用户选择：** 返回部分数据
**备注：** 与现有卡资产处理逻辑一致

---

## 查询范围（设备列表 vs 详情）

**用户原文：**
> "除了列表,因为列表要实时状态没有什么意义,但是像详情跟C端我就很需要实时数据了"

**决策：**
- 设备管理列表 → DB 缓存字段（toDeviceResponse 补全 5 字段即可）
- 设备资产详情（GetRealtimeStatus）→ 实时 Gateway

---

## 统一资产视图架构

**用户原文（核心说明）：**
> "我们有设备资产跟单卡资产两种,按照之前的做法其实是大家各有各的详情,我嫌弃麻烦而且不符合业务的要求,所以我们做成统一的口子,这个口子可以看到任意资产的完整生态信息"

**影响：**
- 统一口子 = `asset/service.GetRealtimeStatus()`（管理端）+ `assetService.Resolve()`（C 端）
- 设备详情不走 `device/service.Get()`，走资产视图

---

## B 端 vs C 端 DTO 结构

| 选项 | 说明 | 选中 |
|------|------|------|
| 共享同一结构体 | B/C 端复用 DeviceRealtimeInfo | |
| 独立结构体 | B 端 DeviceGatewayInfo + C 端 DeviceRealtimeInfo | ✓ |

**用户原文：**
> "不能是同一个结构体,要考虑到未来后台管理可能展示的信息在C端不展示的情况"

**决策：** 独立结构体
- B 端：`DeviceGatewayInfo`（asset_dto.go）
- C 端：`DeviceRealtimeInfo`（client_asset_dto.go，已存在）

---

## Agent's Discretion

- `DeviceGatewayInfo` B 端字段集合的最终范围（包含全量还是仅关键字段）
- 防高频调用冷却 Key 策略（C 端每次进详情页都调 Gateway）

## Deferred Ideas

- 设备 Refresh 接口语义重评（"刷新接口对设备意义不大"）→ Phase 4+ 评估
- 防高频调用优化 → Phase 4 运营阶段评估
