## Why `/api/admin/iot-cards/standalone` 当前使用硬编码 `WHERE is_standalone = true` 过滤,导致已绑定设备的 IoT 卡完全不可见。运营人员无法在卡管列表中看到这些卡,也无法通过列表查询某张卡目前归属于哪台设备,造成管理盲区。 ## What Changes - **移除硬编码 `is_standalone = true` 过滤**:`is_standalone` 改为可选查询参数,不传时返回全部卡(含绑定设备的卡) - **移除 `virtual_no` 列表过滤参数**:不再支持按卡虚拟号模糊搜索 - **新增 `device_virtual_no` 冗余快照字段**:在 `tb_iot_card` 表新增 `device_virtual_no` 列,记录当前绑定设备的虚拟号(无绑定时为空字符串) - **响应新增 `device_virtual_no` 字段**:列表和详情接口均返回对应的设备虚拟号 - **写入时机快照**:BindCard / UnbindCard / 设备导入(device_import)时同步写入或清空该字段 ## Capabilities ### New Capabilities - `iot-card-device-snapshot`:IoT 卡列表展示绑定设备虚拟号的能力——包括 `device_virtual_no` 快照字段的数据库维护、列表/详情响应扩展、以及 `is_standalone` 可选过滤。 ### Modified Capabilities (无现有 spec 级别的行为变更,仅实现层调整) ## Impact **数据库** - `tb_iot_card` 新增列 `device_virtual_no VARCHAR(100) NOT NULL DEFAULT ''` - 迁移时回填现有绑定数据 **API** - `GET /api/admin/iot-cards/standalone` - 查询参数:移除 `virtual_no`,新增 `is_standalone`(可选布尔) - 响应:新增 `device_virtual_no` 字段 - `GET /api/admin/iot-cards/standalone/:iccid`(详情) - 响应:新增 `device_virtual_no` 字段 **代码** - `internal/model/iot_card.go`:新增字段 - `internal/model/dto/iot_card_dto.go`:修改 Request / Response DTO - `internal/store/postgres/iot_card_store.go`:移除硬编码过滤,支持可选 `is_standalone` 条件 - `internal/service/iot_card/service.go`:传递新过滤参数,填充响应字段 - `internal/service/device/binding.go`:BindCard / UnbindCard 时更新卡字段 - `internal/task/device_import.go`:导入时批量写入 `device_virtual_no`