## Why

现有代理商需要通过开放接口对接套餐购买、卡状态、流量、实名和预充值钱包数据，但当前能力主要面向后台管理端，依赖后台登录态，不适合直接给第三方系统调用。需要新增一套签名校验的代理开放接口，在不暴露虚流量语义的前提下复用现有代理套餐、钱包支付和卡套餐数据能力。

功能 ID：feature-20260511-agent-open-api

## What Changes

- 新增代理开放接口域，提供账号密码、请求参数、时间戳、随机串和 `sign` 的调用校验。
- 新增单卡开放查询接口：卡流量查询、卡状态查询、卡实名状态查询。
- 新增代理开放套餐列表接口，分页返回代理可购买套餐，复用后台代理套餐列表的权限过滤，并返回生效零售价。
- 新增代理预充值钱包开放接口：余额查询、流水列表查询。
- 新增代理钱包套餐购买开放接口：一次只允许一个套餐编码，支持多张卡分开购买，允许部分成功并返回失败卡原因。
- 流量展示对外只返回真实业务口径字段：总流量、换算后的已用流量、剩余流量；不暴露虚流量、展示倍率、停机阈值等内部字段。
- 新增开放接口 DTO、Handler、Service、Store/查询方法和路由注册，继续遵守 Handler → Service → Store → Model 分层。
- 新增接口文档注册，确保 OpenAPI 文档生成器包含开放接口。
- 不新增外部依赖，签名使用 Go 标准库 HMAC-SHA256；继续使用 Fiber、GORM、Viper、Zap、Redis。

## Capabilities

### New Capabilities

- `agent-open-api`: 定义代理开放接口的认证签名、卡查询、套餐列表、钱包余额/流水和钱包购买套餐能力。

### Modified Capabilities

无。现有后台套餐、订单、钱包和资产查询能力仅作为实现复用点，不改变其既有接口契约。

## Impact

- 影响代码范围：
  - `internal/handler/openapi/`：新增代理开放接口 Handler。
  - `internal/service/agent_open_api/`：新增开放接口编排服务，复用套餐、订单、钱包、资产解析等现有服务。
  - `internal/model/dto/`：新增开放接口请求和响应 DTO。
  - `internal/model/`：复用现有账号、店铺、卡、套餐和钱包模型，不新增开放接口账号授权模型。
  - `internal/store/postgres/`：复用现有账号和店铺 Store，必要时补充按套餐编码、卡标识、钱包流水的查询方法。
  - `internal/routes/`：新增 `/api/open/v1` 路由组。
  - `pkg/constants/`：新增开放接口相关常量、Redis nonce 防重放 key 生成函数。
  - `pkg/errors/`：补充开放接口认证、签名、时间戳、重放相关错误码。
  - `cmd/api/docs.go` 与 `cmd/gendocs/main.go`：注册新增 Handler，保证文档生成覆盖。
- 数据影响：
  - 不新增开放接口账号授权表；所有启用状态的代理账号默认可调用开放接口。
  - Redis 记录开放接口 nonce，防止时间窗内重放。
- 性能影响：
  - 列表接口分页，默认 20，最大 100。
  - 签名校验只做轻量 HMAC、bcrypt 校验和 Redis nonce 写入。
  - 流量查询按单卡读取当前/待生效套餐，避免设备级聚合和大范围扫描。
