# Response DTO 规范规范

## MODIFIED Requirements

### Requirement: Response DTO 必须包含状态文字字段

项目所有 Response DTO 中，若包含 int 类型状态字段，必须同时包含对应的 `_name` 或 `_text` 文字字段，用于显示该状态的中文描述。

#### Scenario: 账号列表 Response DTO

- **WHEN** API 返回账号列表（`GET /api/admin/accounts`）
- **THEN** 响应中每个账号对象包含 `status` 字段（int，值：0=禁用，1=启用）
- **THEN** 响应中同时包含 `status_name` 字段（string，值："禁用"或"启用"）
- **THEN** 前端可直接使用 `status_name` 显示在 UI 上，无需维护单独的状态枚举映射表

#### Scenario: 资产详情 Response DTO

- **WHEN** API 返回单个资产信息（`GET /api/admin/assets/:id`）
- **THEN** 响应包含 `status`（int）和 `status_name`（string）
- **WHEN** 资产包含多个状态字段（如 `network_status`、`activation_status`、`online_status`）
- **THEN** 每个状态字段对应一个文字字段：`network_status_name`、`activation_status_name`、`online_status_name`

#### Scenario: 订单详情中的多重状态

- **WHEN** API 返回订单详情（`GET /api/admin/orders/:id`）
- **THEN** 订单对象包含 `payment_status`（int）和 `payment_status_name`（string）
- **THEN** 订单对象包含 `commission_status`（int）和 `commission_status_name`（string）
- **THEN** 若订单还有其他 int 类型状态字段，均配有对应的 `_name` 字段

### Requirement: DTO 文字字段命名规则

状态文字字段的命名应遵循统一规则：`{状态字段名}_name` 或 `{状态字段名}_text`。

#### Scenario: 标准命名

- **WHEN** 定义 DTO 时，状态字段为 `Status`
- **THEN** 文字字段命名为 `StatusName`（推荐）或 `StatusText`
- **WHEN** 状态字段为 `PaymentStatus`
- **THEN** 文字字段命名为 `PaymentStatusName` 或 `PaymentStatusText`

#### Scenario: JSON 序列化一致性

- **WHEN** DTO 序列化为 JSON 返回给客户端
- **THEN** 字段名使用 snake_case（符合项目 API 规范）
  - Go 字段 `Status` → JSON `status`
  - Go 字段 `StatusName` → JSON `status_name`

### Requirement: Service 层自动赋值 `_name` 字段

Service 层在构建 Response DTO 时，应自动赋值 `_name`/`_text` 字段，映射状态常量到中文描述。

#### Scenario: 获取账号详情自动赋值

- **WHEN** `AccountService.GetAccount(ctx, accountID)` 被调用
- **THEN** Service 查询数据库获取账号信息
- **THEN** Service 构建 Response DTO，自动设置 `StatusName = constants.GetAccountStatusName(account.Status)`
- **THEN** 返回完整的 DTO 给 Handler，Handler 直接序列化响应

#### Scenario: 列表查询批量赋值

- **WHEN** `AccountService.ListAccounts(ctx, query)` 被调用
- **THEN** Service 查询数据库获取账号列表
- **THEN** Service 遍历每个账号，批量赋值 `StatusName` 字段
- **THEN** 返回完整列表

### Requirement: 常量映射函数

在 `pkg/constants/` 中为每个业务模块定义 `Get{Module}StatusName(status int) string` 函数，用于映射状态值到中文描述。

#### Scenario: 账号状态映射函数

- **WHEN** Service 层需要获取账号状态的中文描述
- **THEN** 调用 `constants.GetAccountStatusName(status)`
- **THEN** 函数返回：
  - 若 `status == 0`，返回 `"禁用"`
  - 若 `status == 1`，返回 `"启用"`
  - 若状态值未知，返回 `"未知"`（不返回空字符串）

#### Scenario: 订单支付状态映射函数

- **WHEN** Service 层需要获取订单支付状态描述
- **THEN** 调用 `constants.GetOrderPaymentStatusName(status)`
- **THEN** 函数返回对应的中文（如 "待支付"、"已支付"、"已完成" 等）
