# 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. **数据权限测试**：企业用户只能看到被授权的卡
