All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 4m42s
新增物联网卡独立管理模块,支持单卡查询、批量导入和状态管理。主要变更包括: 功能特性: - 新增物联网卡 CRUD 接口(查询、分页列表、删除) - 支持 CSV/Excel 批量导入物联网卡 - 实现异步导入任务处理和进度跟踪 - 新增 ICCID 号码格式校验器(支持 Luhn 算法) - 新增 CSV 文件解析工具(支持编码检测和错误处理) 数据库变更: - 移除 iot_card 和 device 表的 owner_id/owner_type 字段 - 新增 iot_card_import_task 导入任务表 - 为导入任务添加运营商类型字段 测试覆盖: - 新增 IoT 卡 Store 层单元测试 - 新增 IoT 卡导入任务单元测试 - 新增 IoT 卡集成测试(包含导入流程测试) - 新增 CSV 工具和 ICCID 校验器测试 文档更新: - 更新 OpenAPI 文档(新增 7 个 IoT 卡接口) - 归档 OpenSpec 变更提案 - 更新 API 文档规范和生成器指南 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2.5 KiB
2.5 KiB
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- 导入任务详情