# 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` - 导入任务详情
