mahjong_group/docs/1.0.0/我的收益页面接口参数说明.md
2026-01-01 14:39:23 +08:00

609 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 我的收益页面接口参数说明
## 📋 页面功能概述
**页面路径**`pages/me/my-earnings-page.vue`
**主要功能**
1. 显示收益统计(待提取收益、已提取收益)
2. 提现功能(申请提现、查看最高可提现金额)
3. 查看收益规则说明
4. 收益记录列表(时间、房号/房名、房费、收益)
5. 提现记录列表(时间、提现金额、状态)
---
## 🔌 接口需求清单
### 接口1获取收益统计信息
#### 基本信息
- **接口路径**:建议 `GET /api/user/GetEarningsSummary``POST /api/user/GetEarningsSummary`
- **调用时机**
- 页面初始化时
- 提现成功后刷新
- **是否需要登录**需要Token
#### 请求参数
无需参数从Token中获取用户信息
#### 返回数据结构
```typescript
interface Response {
code: number; // 0=成功
msg: string; // 消息
data: {
pendingAmount: number; // 待提取收益(元)
extractedAmount: number; // 已提取收益(元)
}
}
```
#### 返回示例
```json
{
"code": 0,
"msg": "ok",
"data": {
"pendingAmount": 120.50,
"extractedAmount": 500.00
}
}
```
#### 页面映射
- `pendingAmount` → 第19行待提取收益
- `extractedAmount` → 第23行已提取收益
---
### 接口2获取收益规则说明
#### 基本信息
- **接口路径**:建议 `GET /api/user/GetEarningsRule``POST /api/user/GetEarningsRule`
- **调用时机**
- 点击"点击查看收益规则"时第35-37行
- 打开规则弹窗时第86-96行
- **是否需要登录**:否(可公开)
#### 请求参数
无需参数
#### 返回数据结构
```typescript
interface Response {
code: number; // 0=成功
msg: string; // 消息
data: {
content: string; // 规则说明正文
}
}
```
#### 返回示例
```json
{
"code": 0,
"msg": "ok",
"data": {
"content": "收益规则说明:\n1. 收益来源于房间预约成功后的分成\n2. 收益可随时提现\n3. 提现将在3-5个工作日内到账\n4. 最低提现金额为10元"
}
}
```
#### 页面映射
- `content` → 第89-93行规则说明弹窗正文
---
### 接口3获取收益记录列表
#### 基本信息
- **接口路径**:建议 `GET /api/user/GetEarningsRecordList``POST /api/user/GetEarningsRecordList`
- **调用时机**
- 页面初始化时currentIndex = 0
- 切换到"收益记录"标签时
- 下拉刷新时
- **是否需要登录**需要Token
#### 请求参数
| 参数名 | 类型 | 必填 | 说明 | 示例 |
|-------|------|------|------|------|
| pageIndex | number | 否 | 页码从1开始 | 1 |
| pageSize | number | 否 | 每页数量 | 20 |
#### 返回数据结构
```typescript
interface Response {
code: number; // 0=成功
msg: string; // 消息
data: EarningsRecordItem[];
}
interface EarningsRecordItem {
id: number; // 记录ID必填
date: string; // 时间格式YYYY/MM/DD 或 YYYY-MM-DD必填
roomNumber: string; // 房号305必填
roomName: string; // 房名,如:大包(必填)
roomFee: number; // 房费(元)(必填)
earnings: number; // 收益(元)(必填)
reservationId?: number; // 预约ID可选
}
```
#### 返回示例
```json
{
"code": 0,
"msg": "ok",
"data": [
{
"id": 1,
"date": "2025/1/1",
"roomNumber": "305",
"roomName": "大包",
"roomFee": 12.00,
"earnings": 0.12,
"reservationId": 123
},
{
"id": 2,
"date": "2025/1/2",
"roomNumber": "306",
"roomName": "中包",
"roomFee": 10.00,
"earnings": 0.10,
"reservationId": 124
}
]
}
```
#### 页面映射
- `date` → 第68行时间
- `roomNumber + roomName` → 第69行305大包
- `roomFee` → 第70行¥12
- `earnings` → 第71行¥0.12
**注意**:页面显示格式为 `{roomNumber}{roomName}`,如:`305大包`
---
### 接口4获取提现记录列表
#### 基本信息
- **接口路径**:建议 `GET /api/user/GetWithdrawRecordList``POST /api/user/GetWithdrawRecordList`
- **调用时机**
- 切换到"提现记录"标签时currentIndex = 1
- 下拉刷新时
- **是否需要登录**需要Token
#### 请求参数
| 参数名 | 类型 | 必填 | 说明 | 示例 |
|-------|------|------|------|------|
| pageIndex | number | 否 | 页码从1开始 | 1 |
| pageSize | number | 否 | 每页数量 | 20 |
#### 返回数据结构
```typescript
interface Response {
code: number; // 0=成功
msg: string; // 消息
data: WithdrawRecordItem[];
}
interface WithdrawRecordItem {
id: number; // 记录ID必填
date: string; // 时间格式YYYY/MM/DD 或 YYYY-MM-DD必填
amount: number; // 提现金额(元)(必填)
status: string; // 状态:提现中/已到账/已拒绝(必填)
statusCode?: number; // 状态码0=提现中1=已到账2=已拒绝(可选)
remark?: string; // 备注(可选)
}
```
#### 返回示例
```json
{
"code": 0,
"msg": "ok",
"data": [
{
"id": 1,
"date": "2025/1/1",
"amount": 100.00,
"status": "提现中",
"statusCode": 0
},
{
"id": 2,
"date": "2024/12/30",
"amount": 50.00,
"status": "已到账",
"statusCode": 1
},
{
"id": 3,
"date": "2024/12/28",
"amount": 200.00,
"status": "已拒绝",
"statusCode": 2,
"remark": "银行卡信息错误"
}
]
}
```
#### 页面映射
- `date` → 第77行时间
- `amount` → 第78行¥12
- `status` → 第79行提现中
---
### 接口5申请提现
#### 基本信息
- **接口路径**:建议 `POST /api/user/ApplyWithdraw`
- **调用时机**
- 点击"申请提现"按钮时第114行
- **是否需要登录**需要Token
#### 请求参数
| 参数名 | 类型 | 必填 | 说明 | 示例 |
|-------|------|------|------|------|
| amount | number | 是 | 提现金额(元) | 100.00 |
#### 返回数据结构
```typescript
interface Response {
code: number; // 0=成功,其他=失败
msg: string; // 消息说明
data?: {
withdrawId?: number; // 提现记录ID可选
}
}
```
#### 返回示例
```json
// 成功
{
"code": 0,
"msg": "提现申请已提交",
"data": {
"withdrawId": 123
}
}
// 失败 - 余额不足
{
"code": 500,
"msg": "提现金额不能超过待提取收益"
}
// 失败 - 金额过小
{
"code": 500,
"msg": "最低提现金额为10元"
}
```
---
### 接口6获取最高可提现金额可选
#### 基本信息
- **接口路径**:建议 `GET /api/user/GetMaxWithdrawAmount` 或使用接口1的 `pendingAmount`
- **调用时机**
- 打开提现弹窗时第98-118行
- 用于显示"最高可提现0.00元"第108行
- **是否需要登录**需要Token
#### 说明
此接口可以复用**接口1获取收益统计信息**中的 `pendingAmount` 字段,无需单独接口。
如果后端需要单独接口可参考接口1的返回结构只返回 `pendingAmount`
---
## 📝 页面数据映射总览
### 收益统计卡片第13-32行
| 显示位置 | 数据来源 | 字段名 |
|---------|---------|--------|
| 第19行待提取收益 | 接口1 | `pendingAmount` |
| 第23行已提取收益 | 接口1 | `extractedAmount` |
| 第108行最高可提现 | 接口1 | `pendingAmount` |
### 收益记录列表第65-73行currentIndex = 0
| 显示位置 | 数据来源 | 字段名 | 显示格式 |
|---------|---------|--------|---------|
| 第68行时间 | 接口3 | `date` | 直接显示 |
| 第69行房号/房名 | 接口3 | `roomNumber` + `roomName` | `{roomNumber}{roomName}` |
| 第70行房费 | 接口3 | `roomFee` | `¥{roomFee}` |
| 第71行收益 | 接口3 | `earnings` | `¥{earnings}` |
### 提现记录列表第74-81行currentIndex = 1
| 显示位置 | 数据来源 | 字段名 | 显示格式 |
|---------|---------|--------|---------|
| 第77行时间 | 接口4 | `date` | 直接显示 |
| 第78行提现金额 | 接口4 | `amount` | `¥{amount}` |
| 第79行状态 | 接口4 | `status` | 直接显示 |
### 规则说明弹窗第86-96行
| 显示位置 | 数据来源 | 字段名 |
|---------|---------|--------|
| 第89-93行规则正文 | 接口2 | `content` |
---
## 🔄 接口调用建议
### 1. 接口定义位置
建议在 `common/server/interface/user.js` 中添加:
```javascript
/**
* 获取收益统计信息
* @returns {Promise<{pendingAmount: number, extractedAmount: number}>}
*/
export const getEarningsSummary = async () => {
const res = await request.getOrCache("user/GetEarningsSummary", {}, 1);
if (res.code == 0) {
return res.data;
}
return { pendingAmount: 0, extractedAmount: 0 };
}
/**
* 获取收益规则说明
* @returns {Promise<string>}
*/
export const getEarningsRule = async () => {
const res = await request.getOrCache("user/GetEarningsRule", {}, 300);
if (res.code == 0) {
return res.data.content;
}
return '';
}
/**
* 获取收益记录列表
* @param {number} pageIndex 页码
* @param {number} pageSize 每页数量
* @returns {Promise<EarningsRecordItem[]>}
*/
export const getEarningsRecordList = async (pageIndex = 1, pageSize = 20) => {
const res = await request.getOrCache(
"user/GetEarningsRecordList",
{ pageIndex, pageSize },
1
);
if (res.code == 0) {
return res.data;
}
return [];
}
/**
* 获取提现记录列表
* @param {number} pageIndex 页码
* @param {number} pageSize 每页数量
* @returns {Promise<WithdrawRecordItem[]>}
*/
export const getWithdrawRecordList = async (pageIndex = 1, pageSize = 20) => {
const res = await request.getOrCache(
"user/GetWithdrawRecordList",
{ pageIndex, pageSize },
1
);
if (res.code == 0) {
return res.data;
}
return [];
}
/**
* 申请提现
* @param {number} amount 提现金额
* @returns {Promise<boolean>}
*/
export const applyWithdraw = async (amount) => {
const res = await request.post("user/ApplyWithdraw", { amount });
if (res.code == 0) {
return true;
}
return false;
}
```
### 2. 页面调用示例
```javascript
import {
getEarningsSummary,
getEarningsRule,
getEarningsRecordList,
getWithdrawRecordList,
applyWithdraw
} from '@/common/server/interface/user.js'
export default {
data() {
return {
currentIndex: 0,
show: false,
reflectShow: false,
dataList: [],
value: '',
pendingAmount: 0.00,
extractedAmount: 0.00,
maxWithdrawAmount: 0.00,
ruleContent: ''
}
},
onLoad() {
this.loadEarningsSummary();
this.loadRuleContent();
this.loadDataList();
},
methods: {
// 加载收益统计
async loadEarningsSummary() {
const data = await getEarningsSummary();
if (data) {
this.pendingAmount = data.pendingAmount || 0.00;
this.extractedAmount = data.extractedAmount || 0.00;
this.maxWithdrawAmount = data.pendingAmount || 0.00;
}
},
// 加载规则内容
async loadRuleContent() {
this.ruleContent = await getEarningsRule();
},
// 加载列表数据
async loadDataList() {
if (this.currentIndex === 0) {
// 收益记录
this.dataList = await getEarningsRecordList(1, 20);
} else {
// 提现记录
this.dataList = await getWithdrawRecordList(1, 20);
}
},
// 切换标签
clickTab(index) {
this.currentIndex = index;
this.loadDataList();
},
// 打开提现弹窗
openWithdrawPopup() {
this.reflectShow = true;
this.loadEarningsSummary(); // 刷新最高可提现金额
},
// 申请提现
async submitWithdraw() {
const amount = parseFloat(this.value);
if (!amount || amount <= 0) {
uni.showToast({
title: '请输入正确的提现金额',
icon: 'none'
});
return;
}
if (amount > this.maxWithdrawAmount) {
uni.showToast({
title: '提现金额不能超过待提取收益',
icon: 'none'
});
return;
}
const success = await applyWithdraw(amount);
if (success) {
uni.showToast({
title: '提现申请已提交',
icon: 'success'
});
this.reflectShow = false;
this.value = '';
// 刷新数据
this.loadEarningsSummary();
if (this.currentIndex === 1) {
this.loadDataList();
}
} else {
uni.showToast({
title: '提现申请失败',
icon: 'none'
});
}
},
// 全部提现
allWithdraw() {
this.value = this.maxWithdrawAmount.toFixed(2);
}
}
}
```
---
## ✅ 必填字段总结
### 接口1获取收益统计
- `pendingAmount` (number) - 待提取收益
- `extractedAmount` (number) - 已提取收益
### 接口2获取收益规则
- `content` (string) - 规则说明正文
### 接口3获取收益记录列表
- `id` (number) - 记录ID
- `date` (string) - 时间
- `roomNumber` (string) - 房号
- `roomName` (string) - 房名
- `roomFee` (number) - 房费
- `earnings` (number) - 收益
### 接口4获取提现记录列表
- `id` (number) - 记录ID
- `date` (string) - 时间
- `amount` (number) - 提现金额
- `status` (string) - 状态
### 接口5申请提现
- 请求参数:`amount` (number) - 提现金额
---
## 📌 注意事项
1. **金额格式**:所有金额字段建议使用 `number` 类型保留2位小数
2. **时间格式**:建议后端返回格式化的时间字符串(如:`2025/1/1` 或 `2025-01-01`
3. **分页支持**:收益记录和提现记录建议支持分页加载
4. **空数据处理**:当没有记录时,返回空数组 `[]`
5. **错误处理**:接口失败时返回 `code != 0`,前端需要处理错误情况
6. **提现金额验证**
- 前端需要验证:不能超过 `pendingAmount`
- 后端需要验证:最低提现金额、余额是否充足等
7. **状态显示**:提现状态建议使用中文显示(提现中/已到账/已拒绝)
---
## 🔍 后续扩展建议
如果后续需要添加以下功能,可以考虑增加字段:
- **收益详情**:点击收益记录查看详情,需要 `reservationId` 字段
- **提现详情**:点击提现记录查看详情,需要 `remark` 字段
- **提现方式**:如果支持多种提现方式,需要增加提现方式字段
- **收益统计图表**:如果需要图表展示,可以增加按时间段的统计数据