# 提案：Gateway API 统一封装

## Why

当前项目需要调用外部 Gateway API 来实现物联网卡和设备的生命周期管理功能（状态查询、停复机、设备控制等）。Gateway API 具有以下特点：

1. **复杂的认证机制**：需要 AES-128-ECB 加密 + MD5 签名
2. **多个接口**：14 个 API（流量卡 7 个 + 设备 7 个）
3. **多场景调用**：Handler 层业务逻辑 + Asynq 定时任务批量同步
4. **缺乏统一封装**：调用逻辑分散，加密签名重复实现

本变更旨在**封装 Gateway API 为统一的能力模块**，提供类型安全的接口、统一的错误处理和配置管理，供 Service 层和 Asynq 任务调用。

## What Changes

### 1. Gateway 客户端封装
- 新增 `internal/gateway/` 包，提供 Gateway API 的统一封装
- 实现 AES-128-ECB 加密 + MD5 签名机制
- 封装 14 个 API 接口（流量卡 7 个 + 设备 7 个）
- 提供类型安全的请求/响应结构体

### 2. 配置集成
- 在 `pkg/config/config.go` 中添加 `GatewayConfig` 配置结构
- 支持环境变量配置：`JUNHONG_GATEWAY_BASE_URL`、`JUNHONG_GATEWAY_APP_ID`、`JUNHONG_GATEWAY_APP_SECRET`
- 配置项包括：BaseURL、AppID、AppSecret、Timeout

### 3. 错误处理
- 在 `pkg/errors/codes.go` 中定义 Gateway 相关错误码（1110-1119）
- 统一错误处理：加密失败、签名失败、请求超时、响应格式错误

### 4. 依赖注入
- 在 `internal/bootstrap/` 中初始化 Gateway 客户端
- 注入到需要调用 Gateway API 的 Service

### 5. 测试覆盖
- 单元测试：加密/签名函数验证
- 集成测试：实际调用 Gateway API 验证

## Capabilities

### New Capabilities

- `gateway-client`: Gateway API 统一客户端，提供 14 个接口的类型安全封装
- `gateway-crypto`: AES-128-ECB 加密 + MD5 签名工具函数

### Modified Capabilities

- `config-management`: 添加 Gateway 配置支持
- `error-handling`: 添加 Gateway 相关错误码
- `dependency-injection`: 在 bootstrap 中初始化 Gateway 客户端

## Impact

### 代码变更

| 文件/目录 | 变更类型 | 说明 |
|-----------|----------|------|
| `internal/gateway/client.go` | 新增 | Gateway 客户端主体（Client 结构体 + doRequest） |
| `internal/gateway/crypto.go` | 新增 | AES 加密 + MD5 签名函数 |
| `internal/gateway/flow_card.go` | 新增 | 流量卡 7 个 API 方法封装 |
| `internal/gateway/device.go` | 新增 | 设备 7 个 API 方法封装 |
| `internal/gateway/models.go` | 新增 | 请求/响应 DTO 定义 |
| `internal/gateway/client_test.go` | 新增 | 单元测试和集成测试 |
| `pkg/config/config.go` | 修改 | 添加 GatewayConfig 结构体 |
| `pkg/errors/codes.go` | 修改 | 添加 Gateway 错误码（1110-1119） |
| `internal/bootstrap/bootstrap.go` | 修改 | 初始化 Gateway 客户端 |

### Gateway API 接口列表

**流量卡 API（7个）**：
1. `/flow-card/status` - 流量卡状态查询
2. `/flow-card/flow` - 流量使用查询
3. `/flow-card/realname-status` - 实名认证状态查询
4. `/flow-card/cardStop` - 流量卡停机
5. `/flow-card/cardStart` - 流量卡复机
6. `/flow-card/realname-link` - 获取实名认证跳转链接
7. `/flow-card/batch-query` - 批量查询（未来扩展）

**设备 API（7个）**：
1. `/device/info` - 获取设备信息
2. `/device/slot-info` - 获取设备卡槽信息
3. `/device/speed-limit` - 设置设备限速
4. `/device/wifi` - 设置设备 WiFi
5. `/device/switch-card` - 设备切换卡
6. `/device/reset` - 设备恢复出厂设置
7. `/device/reboot` - 设备重启

### 配置变更

**新增环境变量**：
```bash
JUNHONG_GATEWAY_BASE_URL=https://lplan.whjhft.com/openapi
JUNHONG_GATEWAY_APP_ID=60bgt1X8i7AvXqkd
JUNHONG_GATEWAY_APP_SECRET=BZeQttaZQt0i73moF
JUNHONG_GATEWAY_TIMEOUT=30
```

### 依赖

- 无新增外部依赖
- 使用标准库：`crypto/aes`、`crypto/md5`、`encoding/base64`、`net/http`

## 预期收益

| 指标 | 变更前 | 变更后 |
|------|--------|--------|
| Gateway 调用代码重复 | 每次调用重复加密签名 | 统一封装，零重复 |
| 错误处理一致性 | 不一致 | 统一错误码 |
| 类型安全 | 手动序列化，易出错 | 强类型 DTO，编译时检查 |
| 测试覆盖率 | 0% | 90%+ |
| 配置管理 | 硬编码 | 统一配置 |

## 风险与缓解

| 风险 | 影响 | 缓解措施 |
|------|------|---------|
| AES-ECB 模式安全性 | 低（外部系统要求） | 文档注明，无法改变 |
| 签名算法兼容性 | 中（签名不匹配导致认证失败） | 先实现端到端测试验证签名 |
| Gateway 响应格式变更 | 中（解析失败） | 统一错误处理，兼容性版本 |

## 后续计划

1. **阶段 1（本次变更）**：
   - 实现 Gateway 客户端基础封装
   - 支持同步模式（14 个接口）
   - 集成到 Service 层

2. **阶段 2（未来优化）**：
   - 实现异步模式回调接口
   - 添加批量查询接口
   - 实现请求重试和超时控制

3. **阶段 3（性能优化）**：
   - 添加响应缓存（Redis）
   - 实现请求限流（防止 Gateway 过载）
   - 监控和告警集成

## 验收标准

- [ ] Gateway 客户端成功调用所有 14 个 API 接口
- [ ] 加密/签名验证通过（与 Gateway 文档一致）
- [ ] 错误处理覆盖所有异常场景（网络错误、响应格式错误等）
- [ ] 单元测试覆盖率 ≥ 90%
- [ ] 集成测试验证真实 Gateway API 调用
- [ ] 配置通过环境变量成功加载
- [ ] 文档完整（API 文档、使用示例、错误码说明）
