# 账户交易记录查询接口文档

## 概述

本文档描述了账户交易记录查询相关的三个接口，包括充值记录、消费记录和赠送记录的查询功能。

**基础信息：**
- 基础路径：`/api/account`
- 请求方式：全部使用 POST
- 认证要求：所有接口都需要登录认证（@RequireAuth）
- 响应格式：统一使用 `CommonResult<T>` 包装

---

## 1. 分页查询充值记录

### 接口信息

- **接口名称**：分页查询充值记录
- **接口路径**：`/api/account/getRechargePageList`
- **请求方式**：POST
- **接口描述**：查询所有的充值记录（transactionType=1），支持分页和条件筛选，默认根据创建时间倒序排列

### 请求参数

**Content-Type**: `application/json`

**请求体参数（AccountTransactionDto）**：

| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| pageNum | Integer | 否 | 当前页码，默认1 |
| pageSize | Integer | 否 | 每页数量，默认10 |
| sortBy | String | 否 | 排序字段 |
| sortDesc | Boolean | 否 | 是否降序，默认true |
| userId | Long | 否 | 用户ID，用于筛选特定用户的充值记录 |
| status | Integer | 否 | 交易状态：1.成功 2.失败 3.处理中 |
| transactionNo | String | 否 | 交易单号，精确匹配 |
| createTimeStart | Date | 否 | 开始时间，格式：yyyy-MM-dd HH:mm:ss |
| createTimeEnd | Date | 否 | 结束时间，格式：yyyy-MM-dd HH:mm:ss |
| deleteFlag | Integer | 否 | 删除标记：0.未删除 1.已删除，默认0 |

**注意**：此接口固定查询 transactionType=1（充值）的记录

### 请求示例

```json
{
  "pageNum": 1,
  "pageSize": 10,
  "userId": 1001,
  "status": 1,
  "createTimeStart": "2025-01-01 00:00:00",
  "createTimeEnd": "2025-12-31 23:59:59"
}
```

### 响应参数

**响应结构**：`CommonResult<PageInfo<AccountTransaction>>`

**PageInfo 字段说明**：

| 参数名 | 类型 | 说明 |
|--------|------|------|
| total | Long | 总记录数 |
| list | Array | 数据列表 |
| pageNum | Integer | 当前页码 |
| pageSize | Integer | 每页数量 |
| pages | Integer | 总页数 |

**AccountTransaction 对象字段**：

| 参数名 | 类型 | 说明 |
|--------|------|------|
| transactionId | Long | 主键ID |
| userId | Long | 用户ID |
| userName | String | 用户名 |
| transactionType | Integer | 交易类型：1.充值 |
| amount | BigDecimal | 交易金额（积分） |
| beforeBalance | BigDecimal | 交易前余额 |
| afterBalance | BigDecimal | 交易后余额 |
| status | Integer | 交易状态：1.成功 2.失败 3.处理中 |
| transactionNo | String | 交易单号 |
| payType | Integer | 支付方式：1.微信 2.支付宝 3.余额支付 |
| businessId | Long | 关联业务ID（套餐ID） |
| businessType | String | 业务类型 |
| callId | String | 调用ID，关联冻结单 |
| remark | String | 交易备注 |
| isExpense | Integer | 是否支出：1.是 0.否 |
| inputToken | Integer | 输入token |
| outputToken | Integer | 输出token |
| totalTokens | Integer | 合计tokens |
| modelName | String | 处理的模型名称 |
| question | String | 对应回答的问题或需求 |
| incomeType | String | 收入类型：recharge(充值)、sign_in(签到奖励) |
| createTime | String | 创建时间，格式：yyyy-MM-dd HH:mm:ss |
| updateTime | String | 更新时间，格式：yyyy-MM-dd HH:mm:ss |
| createBy | String | 创建人 |
| updateBy | String | 更新人 |
| deleteFlag | Integer | 是否删除：0.未删除 1.已删除 |

### 响应示例

```json
{
  "code": 200,
  "message": "success",
  "data": {
    "total": 50,
    "list": [
      {
        "transactionId": 1001,
        "userId": 1001,
        "userName": "张三",
        "transactionType": 1,
        "amount": 10000.00,
        "beforeBalance": 5000.00,
        "afterBalance": 15000.00,
        "status": 1,
        "transactionNo": "TXN202504150001",
        "payType": 1,
        "businessId": 10,
        "businessType": "package_recharge",
        "callId": null,
        "remark": "购买套餐：基础套餐，获得10000积分",
        "isExpense": 0,
        "inputToken": null,
        "outputToken": null,
        "totalTokens": null,
        "modelName": null,
        "question": null,
        "incomeType": "recharge",
        "createTime": "2025-04-15 10:30:00",
        "updateTime": "2025-04-15 10:30:00",
        "createBy": "system",
        "updateBy": "system",
        "deleteFlag": 0
      }
    ],
    "pageNum": 1,
    "pageSize": 10,
    "pages": 5
  }
}
```

---

## 2. 分页查询消费记录（按callId分组）

### 接口信息

- **接口名称**：分页查询消费记录
- **接口路径**：`/api/account/getConsumptionGroupedPageList`
- **请求方式**：POST
- **接口描述**：查询所有的消费记录，按callId进行分组，每组返回一条汇总记录。对于同一个callId的多条记录：
  - **amount字段**：对该callId下所有记录的amount进行**求和**
  - **inputToken字段**：对该callId下所有记录的inputToken进行**求和**
  - **outputToken字段**：对该callId下所有记录的outputToken进行**求和**
  - **totalTokens字段**：对该callId下所有记录的totalTokens进行**求和**
  - **question字段**：取该callId下最早创建的记录的question
  - 其他字段：取该callId下最早创建的记录的值
  
  主要适用于大模型消费场景，可以查看每次对话的总体消费情况。默认根据创建时间倒序排列

### 请求参数

**Content-Type**: `application/json`

**请求体参数（AccountTransactionDto）**：

| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| pageNum | Integer | 否 | 当前页码，默认1 |
| pageSize | Integer | 否 | 每页数量，默认10 |
| sortBy | String | 否 | 排序字段 |
| sortDesc | Boolean | 否 | 是否降序，默认true |
| userId | Long | 否 | 用户ID，用于筛选特定用户的消费记录 |
| status | Integer | 否 | 交易状态：1.成功 2.失败 3.处理中 |
| createTimeStart | Date | 否 | 开始时间，格式：yyyy-MM-dd HH:mm:ss |
| createTimeEnd | Date | 否 | 结束时间，格式：yyyy-MM-dd HH:mm:ss |
| deleteFlag | Integer | 否 | 删除标记：0.未删除 1.已删除，默认0 |

**注意**：
- 此接口固定查询 transactionType IN (3, 7) 的记录（3.购买内容 7.其他）
- 只查询 callId 不为空的记录
- 按 callId 分组，每组返回一条记录
- question 字段取该 callId 下最早创建的记录的 question

### 请求示例

```json
{
  "pageNum": 1,
  "pageSize": 10,
  "userId": 1001,
  "status": 1,
  "createTimeStart": "2025-01-01 00:00:00",
  "createTimeEnd": "2025-12-31 23:59:59"
}
```

### 响应参数

**响应结构**：`CommonResult<PageInfo<ConsumptionGroupedDto>>`

**PageInfo 字段说明**：

| 参数名 | 类型 | 说明 |
|--------|------|------|
| total | Long | 总记录数（按callId分组后的数量） |
| list | Array | 数据列表 |
| pageNum | Integer | 当前页码 |
| pageSize | Integer | 每页数量 |
| pages | Integer | 总页数 |

**ConsumptionGroupedDto 对象字段**：

| 参数名 | 类型 | 说明 |
|--------|------|------|
| transactionId | Long | 主键ID（取该callId下最早的记录ID） |
| userId | Long | 用户ID |
| userName | String | 用户名 |
| transactionType | Integer | 交易类型：3.购买内容 7.其他 |
| amount | BigDecimal | 交易金额（该callId下所有记录的amount**求和**，通常为负数表示消耗） |
| beforeBalance | BigDecimal | 交易前余额（取最早记录的值） |
| afterBalance | BigDecimal | 交易后余额（取最早记录的值） |
| status | Integer | 交易状态：1.成功 2.失败 3.处理中 |
| transactionNo | String | 交易单号 |
| payType | Integer | 支付方式：1.微信 2.支付宝 3.余额支付 |
| businessId | Long | 关联业务ID |
| businessType | String | 业务类型 |
| callId | String | 调用ID，关联冻结单（分组依据） |
| remark | String | 交易备注 |
| isExpense | Integer | 是否支出：1.是 0.否 |
| inputToken | Integer | 输入token（该callId下所有记录的inputToken**求和**） |
| outputToken | Integer | 输出token（该callId下所有记录的outputToken**求和**） |
| totalTokens | Integer | 合计tokens（该callId下所有记录的totalTokens**求和**） |
| modelName | String | 处理的模型名称 |
| question | String | 对应回答的问题或需求（取该callId下最早入库的question） |
| incomeType | String | 收入类型 |
| createTime | String | 创建时间（取该callId下最早的创建时间），格式：yyyy-MM-dd HH:mm:ss |
| updateTime | String | 更新时间，格式：yyyy-MM-dd HH:mm:ss |
| createBy | String | 创建人 |
| updateBy | String | 更新人 |
| deleteFlag | Integer | 是否删除：0.未删除 1.已删除 |

### 响应示例

```json
{
  "code": 200,
  "message": "success",
  "data": {
    "total": 30,
    "list": [
      {
        "transactionId": 2001,
        "userId": 1001,
        "userName": "张三",
        "transactionType": 3,
        "amount": -1500.00,
        "beforeBalance": 15000.00,
        "afterBalance": 13500.00,
        "status": 1,
        "transactionNo": "TXN202504150002",
        "payType": 3,
        "businessId": null,
        "businessType": "ai_model_consumption",
        "callId": "CALL_20250415_001",
        "remark": "AI模型调用消费",
        "isExpense": 1,
        "inputToken": 3000,
        "outputToken": 1500,
        "totalTokens": 4500,
        "modelName": "gpt-4",
        "question": "请帮我分析这段代码的性能问题",
        "incomeType": null,
        "createTime": "2025-04-15 11:00:00",
        "updateTime": "2025-04-15 11:00:00",
        "createBy": "system",
        "updateBy": "system",
        "deleteFlag": 0
      }
    ],
    "pageNum": 1,
    "pageSize": 10,
    "pages": 3
  }
}
```

### 业务说明

**为什么需要按callId分组？**

在大模型调用场景中，一次用户提问（一个callId）可能会产生多条消费记录：
1. 首次冻结费用的记录
2. 实际扣费的记录
3. 可能的退款或调整记录

通过按callId分组并**对金额和token进行求和**，可以将同一次对话的所有相关记录合并展示，便于用户查看：
- **总消费金额**：该次对话总共消耗了多少积分
- **总token用量**：该次对话总共使用了多少input/output token
- **总体消费情况**：一次对话的完整消费概览

**聚合字段说明**：

以下字段会对同一callId下的所有记录进行**SUM求和**：
- `amount`：总金额（通常为负数，表示消耗）
- `inputToken`：总输入token数
- `outputToken`：总输出token数
- `totalTokens`：总token数

**question字段的取值逻辑**：

由于同一个callId可能有多条记录，但question（用户的问题）应该在第一次创建时就确定了，因此取该callId下创建时间最早的记录的question字段。

**其他字段的取值逻辑**：

除上述聚合字段外，其他字段（如transactionId、beforeBalance、afterBalance等）都取该callId下创建时间最早的记录的值。

---

## 3. 分页查询赠送记录

### 接口信息

- **接口名称**：分页查询赠送记录
- **接口路径**：`/api/account/getGiftPageList`
- **请求方式**：POST
- **接口描述**：查询所有的赠送记录（transactionType=6），支持分页和条件筛选，默认根据创建时间倒序排列

### 请求参数

**Content-Type**: `application/json`

**请求体参数（AccountTransactionDto）**：

| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| pageNum | Integer | 否 | 当前页码，默认1 |
| pageSize | Integer | 否 | 每页数量，默认10 |
| sortBy | String | 否 | 排序字段 |
| sortDesc | Boolean | 否 | 是否降序，默认true |
| userId | Long | 否 | 用户ID，用于筛选特定用户的赠送记录 |
| status | Integer | 否 | 交易状态：1.成功 2.失败 3.处理中 |
| transactionNo | String | 否 | 交易单号，精确匹配 |
| createTimeStart | Date | 否 | 开始时间，格式：yyyy-MM-dd HH:mm:ss |
| createTimeEnd | Date | 否 | 结束时间，格式：yyyy-MM-dd HH:mm:ss |
| deleteFlag | Integer | 否 | 删除标记：0.未删除 1.已删除，默认0 |

**注意**：此接口固定查询 transactionType=6（赠送）的记录

### 请求示例

```json
{
  "pageNum": 1,
  "pageSize": 10,
  "userId": 1001,
  "status": 1,
  "createTimeStart": "2025-01-01 00:00:00",
  "createTimeEnd": "2025-12-31 23:59:59"
}
```

### 响应参数

**响应结构**：`CommonResult<PageInfo<AccountTransaction>>`

**PageInfo 字段说明**：

| 参数名 | 类型 | 说明 |
|--------|------|------|
| total | Long | 总记录数 |
| list | Array | 数据列表 |
| pageNum | Integer | 当前页码 |
| pageSize | Integer | 每页数量 |
| pages | Integer | 总页数 |

**AccountTransaction 对象字段**：

| 参数名 | 类型 | 说明 |
|--------|------|------|
| transactionId | Long | 主键ID |
| userId | Long | 用户ID |
| userName | String | 用户名 |
| transactionType | Integer | 交易类型：6.赠送 |
| amount | BigDecimal | 赠送金额（积分） |
| beforeBalance | BigDecimal | 赠送前余额 |
| afterBalance | BigDecimal | 赠送后余额 |
| status | Integer | 交易状态：1.成功 2.失败 3.处理中 |
| transactionNo | String | 交易单号 |
| payType | Integer | 支付方式：通常为null或3 |
| businessId | Long | 关联业务ID |
| businessType | String | 业务类型：gift_balance |
| callId | String | 调用ID，通常为null |
| remark | String | 赠送备注 |
| isExpense | Integer | 是否支出：0.否（赠送为收入） |
| inputToken | Integer | 输入token，通常为null |
| outputToken | Integer | 输出token，通常为null |
| totalTokens | Integer | 合计tokens，通常为null |
| modelName | String | 处理的模型名称，通常为null |
| question | String | 对应回答的问题或需求，通常为null |
| incomeType | String | 收入类型，通常为null |
| createTime | String | 创建时间，格式：yyyy-MM-dd HH:mm:ss |
| updateTime | String | 更新时间，格式：yyyy-MM-dd HH:mm:ss |
| createBy | String | 创建人（通常是管理员） |
| updateBy | String | 更新人 |
| deleteFlag | Integer | 是否删除：0.未删除 1.已删除 |

### 响应示例

```json
{
  "code": 200,
  "message": "success",
  "data": {
    "total": 15,
    "list": [
      {
        "transactionId": 3001,
        "userId": 1001,
        "userName": "张三",
        "transactionType": 6,
        "amount": 5000.00,
        "beforeBalance": 10000.00,
        "afterBalance": 15000.00,
        "status": 1,
        "transactionNo": "GIFT202504150001",
        "payType": null,
        "businessId": null,
        "businessType": "gift_balance",
        "callId": null,
        "remark": "管理员赠送积分",
        "isExpense": 0,
        "inputToken": null,
        "outputToken": null,
        "totalTokens": null,
        "modelName": null,
        "question": null,
        "incomeType": null,
        "createTime": "2025-04-15 14:00:00",
        "updateTime": "2025-04-15 14:00:00",
        "createBy": "admin",
        "updateBy": "admin",
        "deleteFlag": 0
      }
    ],
    "pageNum": 1,
    "pageSize": 10,
    "pages": 2
  }
}
```

---

## 通用说明

### 交易类型枚举

| 值 | 说明 |
|----|------|
| 1 | 充值 |
| 2 | 提现 |
| 3 | 购买内容 |
| 4 | 退款 |
| 5 | 签到奖励 |
| 6 | 赠送 |
| 7 | 其他 |

### 交易状态枚举

| 值 | 说明 |
|----|------|
| 1 | 成功 |
| 2 | 失败 |
| 3 | 处理中 |

### 支付方式枚举

| 值 | 说明 |
|----|------|
| 1 | 微信支付 |
| 2 | 支付宝 |
| 3 | 余额支付 |

### 错误码说明

| 错误码 | 说明 |
|--------|------|
| 200 | 成功 |
| 401 | 未登录或登录已过期 |
| 403 | 权限不足 |
| 500 | 服务器内部错误 |

### 注意事项

1. **认证要求**：所有接口都需要登录后才能访问，请求时需要携带有效的认证token
2. **分页参数**：如果不传分页参数，默认第1页，每页10条
3. **时间格式**：所有时间字段统一使用 `yyyy-MM-dd HH:mm:ss` 格式
4. **排序规则**：所有接口默认按创建时间（create_time）倒序排列，最新的记录在前
5. **数据权限**：如果传入userId参数，可以查询指定用户的记录；如果不传，则查询所有用户的记录（需要相应权限）
6. **软删除**：默认只查询未删除的记录（deleteFlag=0）

### 前端调用示例

```javascript
// 1. 查询充值记录
async function getRechargeList(params) {
  const response = await fetch('/api/account/getRechargePageList', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer ' + token
    },
    body: JSON.stringify({
      pageNum: 1,
      pageSize: 10,
      userId: 1001,
      ...params
    })
  });
  return await response.json();
}

// 2. 查询消费记录（按callId分组）
async function getConsumptionList(params) {
  const response = await fetch('/api/account/getConsumptionGroupedPageList', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer ' + token
    },
    body: JSON.stringify({
      pageNum: 1,
      pageSize: 10,
      userId: 1001,
      ...params
    })
  });
  return await response.json();
}

// 3. 查询赠送记录
async function getGiftList(params) {
  const response = await fetch('/api/account/getGiftPageList', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer ' + token
    },
    body: JSON.stringify({
      pageNum: 1,
      pageSize: 10,
      userId: 1001,
      ...params
    })
  });
  return await response.json();
}
```

---

## 版本历史

| 版本 | 日期 | 作者 | 说明 |
|------|------|------|------|
| v1.0 | 2025-04-15 | 王志维 | 初始版本，创建三个查询接口 |

---

## 联系方式

如有问题，请联系开发团队。
