Some checks failed
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Has been cancelled
- 新增 GET /api/admin/devices/by-imei/:imei 接口,支持通过设备号查询设备详情 - 新增 GET /api/admin/iot-cards/by-iccid/:iccid 接口,支持通过ICCID查询单卡详情 - 添加对应的 Service 层方法和 Handler - 更新 OpenAPI 文档 - 添加集成测试并修复测试环境配置(使用环境变量) - 归档已完成的 OpenSpec 变更记录 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
3.7 KiB
3.7 KiB
实现任务清单
1. 数据库迁移
- 1.1 创建迁移文件
migrations/000019_fix_device_sim_binding_constraints.up.sql- 使用
CREATE INDEX CONCURRENTLY添加idx_active_device_slot部分唯一索引 - 为
tb_device_import_task表添加warning_count和warning_items字段
- 使用
- 1.2 创建回滚文件
migrations/000019_fix_device_sim_binding_constraints.down.sql - 1.3 执行迁移并验证索引创建成功
2. 模型层修改
- 2.1 创建
internal/model/device_sim_binding.go文件- 从
internal/model/package.go移动DeviceSimBinding结构体和TableName()方法 - 确保所有 import 和 tag 正确
- 从
- 2.2 从
internal/model/package.go中删除DeviceSimBinding相关代码 - 2.3 修改
internal/model/device_import_task.go- 添加
WarningCount int字段 - 添加
WarningItems ImportResultItems字段(JSONB 类型)
- 添加
- 2.4 运行
go build ./...确保编译通过
3. Store 层修改
- 3.1 修改
internal/store/postgres/device_sim_binding_store.go- 添加
isUniqueViolation(err error) bool辅助函数 - 修改
Create方法,检测唯一约束冲突并返回友好的业务错误 - 根据违反的约束名(
idx_active_device_slot或idx_device_sim_bindings_active_card)返回不同的错误信息
- 添加
- 3.2 添加
github.com/jackc/pgx/v5/pgconn依赖(如果尚未存在)
4. Service 层修改
- 4.1 修改
internal/service/device/binding.goBindCard方法已有应用层检查,无需修改- Store 层的错误处理已足够,Service 层只需透传错误
5. 设备导入任务修改
- 5.1 修改
internal/task/device_import.go中的deviceImportResult结构体- 添加
warningCount int字段 - 添加
warningItems model.ImportResultItems字段
- 添加
- 5.2 修改
processBatch函数添加归属权校验- 在 ICCID 验证循环中添加
card.ShopID != nil检查 - 如果卡已分配给店铺,记录原因
ICCID+"已分配给店铺,不能绑定到平台库存设备"
- 在 ICCID 验证循环中添加
- 5.3 修改
processBatch函数添加部分成功处理逻辑- 当
len(validCardIDs) > 0 && len(cardIssues) > 0时,设备创建后记录到warningItems - 增加
warningCount
- 当
- 5.4 修改
HandleDeviceImport函数- 更新调用
h.importTaskStore.UpdateResult传入warning_count和warning_items
- 更新调用
- 5.5 修改
internal/store/postgres/device_import_task_store.go- 更新
UpdateResult方法签名,添加warningCount和warningItems参数 - 更新 SQL 语句保存新字段
- 更新
6. 测试
- 6.1 编写
internal/store/postgres/device_sim_binding_store_test.go并发绑定测试- 测试同一张卡并发绑定到不同设备
- 测试同一设备插槽并发绑定不同卡
- 验证返回正确的错误信息
- 6.2 编写
internal/task/device_import_test.go归属权校验测试- 测试绑定平台库存卡成功
- 测试绑定已分配店铺的卡失败
- 测试部分成功场景,验证 warning_items 记录正确
- 6.3 运行现有测试确保无回归
go test ./...- 注:tests/unit 和 tests/integration 中存在既有问题(与本次实现无关)
- 本次实现相关测试全部通过(internal/store/postgres、internal/task)
7. 验证与文档
- 7.1 使用 PostgreSQL MCP 验证数据库约束生效
- 手动测试插入重复 (device_id, slot_position, bind_status=1) 记录被拒绝
- 手动测试插入重复 (iot_card_id, bind_status=1) 记录被拒绝
- 7.2 验证 API 响应结构
- 确认设备导入任务结果包含
warning_count和warning_items字段 - 更新了 DTO 和 Service 层映射
- 确认设备导入任务结果包含
- 7.3 更新相关文档(如有必要)
- 本次实现无需额外文档更新