# 账户交易记录查询接口文档 ## 概述 本文档描述了账户交易记录查询相关的三个接口,包括充值记录、消费记录和赠送记录的查询功能。 **基础信息:** - 基础路径:`/api/account` - 请求方式:全部使用 POST - 认证要求:所有接口都需要登录认证(@RequireAuth) - 响应格式:统一使用 `CommonResult` 包装 --- ## 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 字段说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | 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 字段说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | 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 字段说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | 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 | 王志维 | 初始版本,创建三个查询接口 | --- ## 联系方式 如有问题,请联系开发团队。