# Change: 企业卡授权管理模块 ## Why 代理商需要将卡授权给企业客户使用: 1. 授权前预检(检查卡是否绑定设备,整体授权) 2. 将卡授权给企业(不改变归属,只是让企业能看到) 3. 回收卡授权 4. 查询企业被授权的卡列表 5. 企业对授权卡执行停机/复机操作 **核心设计**:卡的归属始终是代理商,企业通过授权表"看到"被授权的卡。 ## What Changes ### 新增 API 接口 | 方法 | 路径 | 说明 | |------|------|------| | POST | `/api/admin/enterprises/:id/allocate-cards/preview` | 授权预检 | | POST | `/api/admin/enterprises/:id/allocate-cards` | 授权卡 | | POST | `/api/admin/enterprises/:id/recall-cards` | 回收授权 | | GET | `/api/admin/enterprises/:id/cards` | 企业卡列表 | | POST | `/api/admin/enterprises/:id/cards/:card_id/suspend` | 停机 | | POST | `/api/admin/enterprises/:id/cards/:card_id/resume` | 复机 | ### 技术实现 - 新增 Handler:`internal/handler/admin/enterprise_card.go` - 新增 Service:`internal/service/enterprise_card/service.go` - 新增 DTO:`internal/model/dto/enterprise_card_dto.go` - 新增 Store:`internal/store/postgres/enterprise_card_authorization_store.go` ### 业务逻辑 **授权预检**: 1. 接收 ICCID 列表 2. 检查每张卡是否存在、是否有权限 3. 检查卡是否绑定设备 4. 如果绑定设备,获取设备下所有卡 5. 返回分配预览(独立卡、设备包、失败项) **授权卡**: 1. 验证企业存在且归属当前代理商 2. 验证卡属于当前代理商 3. 如果卡绑定设备,整体授权设备下所有卡 4. 创建授权记录(不修改卡的 owner) **回收授权**: 1. 验证授权记录存在且有效 2. 更新授权记录状态为已回收 3. 卡的 owner 不变 **GORM Callback 修改**: - 企业用户查询卡时,通过授权表过滤 ## Impact ### 影响的规范 - **新增 Capability**:`enterprise-card-authorization` ### 影响的代码 **新增文件**(约 600 行): - `internal/handler/admin/enterprise_card.go`(~150 行) - `internal/service/enterprise_card/service.go`(~300 行) - `internal/model/dto/enterprise_card_dto.go`(~100 行) - `internal/store/postgres/enterprise_card_authorization_store.go`(~50 行) **修改文件**: - `pkg/gorm/callback.go`(企业用户卡查询特殊处理) ### 兼容性 - ✅ 向后兼容:新增 API ### 风险评估 - **中等风险**:涉及 GORM Callback 修改 - **缓解措施**:充分测试数据权限过滤 ## Dependencies - 依赖提案:`add-commission-model-changes`、`add-enterprise-management` - 依赖现有模型:`Enterprise`、`IotCard`、`Device`、`DeviceSimBinding` ## Testing Strategy 1. **单元测试**:授权/回收逻辑 2. **集成测试**:完整授权流程 3. **数据权限测试**:企业用户只能看到被授权的卡