# Change: IoT 卡单卡管理与所有权模型重构 ## Why 当前 IoT 卡和设备模型中使用 `owner_type` + `owner_id` 表示所有权,与数据权限使用的 `shop_id` 字段存在冗余,且语义不清晰: - 代理分销给下级时,所有权实际是转移到下级店铺(shop_id 变化) - 企业用户没有"所有权",是通过授权表(EnterpriseCardAuthorization)管理 - 个人客户完全没有所有权概念,是基于 ICCID/设备号操作 同时,业务需要"单卡管理"功能:查看和导入未绑定设备的 IoT 卡,支持大批量 CSV 导入(几万条)并跟踪导入任务状态。 ## What Changes ### 模型重构(**BREAKING**) - **移除 IotCard 的 owner_type/owner_id 字段**:改用 shop_id 表示所有权(NULL=平台所有,有值=店铺所有) - **移除 Device 的 owner_type/owner_id 字段**:同上 - 保留 AssetAllocationRecord 和 CardReplacementRecord 中的 Owner 字段(历史记录追溯用) ### 新增功能 - **单卡列表 API**:查询未绑定设备的 IoT 卡,支持多维度筛选 - **批量导入 ICCID API**:支持 CSV 文件上传,异步处理,支持几万条数据 - **导入任务记录表**:跟踪导入进度、成功/跳过/失败统计及详情 ### ICCID 校验规则调整 - 电信:严格 19 位 - 联通/移动/广电:严格 20 位 - 支持字母数字混合(移动 ICCID 有字母) ## Capabilities ### New Capabilities - `iot-card-import-task`: IoT 卡导入任务管理,包含导入任务模型、进度跟踪、结果详情记录 ### Modified Capabilities - `iot-card`: 移除 owner_type/owner_id 字段,改用 shop_id;新增单卡列表查询;调整 ICCID 校验规则 - `iot-device`: 移除 owner_type/owner_id 字段,改用 shop_id ## Impact ### 数据库变更 - `tb_iot_card` 表:删除 owner_type、owner_id 列 - `tb_device` 表:删除 owner_type、owner_id 列 - 新增 `tb_iot_card_import_task` 表 ### 代码影响 - `internal/model/iot_card.go`:移除 OwnerType、OwnerID 字段 - `internal/model/device.go`:移除 OwnerType、OwnerID 字段 - `internal/model/iot_card_import_task.go`:新增 - `openspec/specs/iot-card/spec.md`:修改所有权相关描述 - `openspec/specs/iot-device/spec.md`:修改所有权相关描述 ### API 影响 - 新增:`GET /api/admin/iot-cards/standalone` - 单卡列表 - 新增:`POST /api/admin/iot-cards/import` - 发起导入任务 - 新增:`GET /api/admin/iot-cards/import-tasks` - 导入任务列表 - 新增:`GET /api/admin/iot-cards/import-tasks/:id` - 导入任务详情