feat(dealer): 添加客户列表功能并优化邀请流程

- 新增客户列表页面,实现客户数据获取和筛选功能
- 添加客户状态管理工具函数
- 优化邀请流程,支持绑定推荐关系
- 调整提现功能,增加调试组件
- 修复申请经销商功能中的推荐人ID逻辑
This commit is contained in:
2025-09-03 10:41:06 +08:00
parent 7834124095
commit 0b43a3bc92
18 changed files with 1286 additions and 934 deletions

View File

@@ -1,6 +1,6 @@
import request from '@/utils/request';
import type { ApiResult, PageResult } from '@/api';
import { SERVER_API_URL } from '@/utils/server';
import { BaseUrl } from '@/config/app';
/**
* 小程序码生成参数
@@ -34,6 +34,20 @@ export interface InviteRelationParam {
inviteTime?: string;
}
/**
* 绑定推荐关系参数
*/
export interface BindRefereeParam {
// 推荐人ID
dealerId: number;
// 被推荐人ID (可选,如果不传则使用当前登录用户)
userId?: number;
// 推荐来源
source?: string;
// 场景值
scene?: string;
}
/**
* 邀请统计数据
*/
@@ -96,37 +110,36 @@ export interface InviteRecordParam {
* 生成小程序码
*/
export async function generateMiniProgramCode(data: MiniProgramCodeParam) {
const res = await request.post<ApiResult<string>>(
SERVER_API_URL + '/invite/generate-miniprogram-code',
data
);
if (res.code === 0) {
return res.data;
try {
const url = '/wx-login/getOrderQRCodeUnlimited/' + data.scene;
// 由于接口直接返回图片buffer我们直接构建完整的URL
return `${BaseUrl}${url}`;
} catch (error: any) {
throw new Error(error.message || '生成小程序码失败');
}
return Promise.reject(new Error(res.message));
}
/**
* 生成邀请小程序码
*/
export async function generateInviteCode(inviterId: number, source: string = 'qrcode') {
const scene = `inviter=${inviterId}&source=${source}&t=${Date.now()}`;
export async function generateInviteCode(inviterId: number) {
const scene = `uid_${inviterId}`;
return generateMiniProgramCode({
page: 'pages/index/index',
scene: scene,
width: 430,
width: 180,
checkPath: true,
envVersion: 'release'
envVersion: 'trial'
});
}
/**
* 建立邀请关系
* 建立邀请关系 (旧接口,保留兼容性)
*/
export async function createInviteRelation(data: InviteRelationParam) {
const res = await request.post<ApiResult<unknown>>(
SERVER_API_URL + '/invite/create-relation',
'/invite/create-relation',
data
);
if (res.code === 0) {
@@ -135,12 +148,38 @@ export async function createInviteRelation(data: InviteRelationParam) {
return Promise.reject(new Error(res.message));
}
/**
* 绑定推荐关系 (新接口)
*/
export async function bindRefereeRelation(data: BindRefereeParam) {
try {
const res = await request.post<ApiResult<unknown>>(
'/shop/shop-dealer-referee',
{
dealerId: data.dealerId,
userId: data.userId,
source: data.source || 'qrcode',
scene: data.scene
}
);
if (res.code === 0) {
return res.data;
}
throw new Error(res.message || '绑定推荐关系失败');
} catch (error: any) {
console.error('绑定推荐关系API调用失败:', error);
throw new Error(error.message || '绑定推荐关系失败');
}
}
/**
* 处理邀请场景值
*/
export async function processInviteScene(scene: string, userId: number) {
const res = await request.post<ApiResult<unknown>>(
SERVER_API_URL + '/invite/process-scene',
'/invite/process-scene',
{ scene, userId }
);
if (res.code === 0) {
@@ -154,7 +193,7 @@ export async function processInviteScene(scene: string, userId: number) {
*/
export async function getInviteStats(inviterId: number) {
const res = await request.get<ApiResult<InviteStats>>(
SERVER_API_URL + `/invite/stats/${inviterId}`
`/invite/stats/${inviterId}`
);
if (res.code === 0) {
return res.data;
@@ -167,7 +206,7 @@ export async function getInviteStats(inviterId: number) {
*/
export async function pageInviteRecords(params: InviteRecordParam) {
const res = await request.get<ApiResult<PageResult<InviteRecord>>>(
SERVER_API_URL + '/invite/records/page',
'/invite/records/page',
params
);
if (res.code === 0) {
@@ -181,7 +220,7 @@ export async function pageInviteRecords(params: InviteRecordParam) {
*/
export async function getMyInviteRecords(params: InviteRecordParam) {
const res = await request.get<ApiResult<PageResult<InviteRecord>>>(
SERVER_API_URL + '/invite/my-records',
'/invite/my-records',
params
);
if (res.code === 0) {
@@ -195,7 +234,7 @@ export async function getMyInviteRecords(params: InviteRecordParam) {
*/
export async function validateInviteCode(scene: string) {
const res = await request.post<ApiResult<{ valid: boolean; inviterId?: number; source?: string }>>(
SERVER_API_URL + '/invite/validate-code',
'/invite/validate-code',
{ scene }
);
if (res.code === 0) {
@@ -209,7 +248,7 @@ export async function validateInviteCode(scene: string) {
*/
export async function updateInviteStatus(inviteId: number, status: 'registered' | 'activated') {
const res = await request.put<ApiResult<unknown>>(
SERVER_API_URL + `/invite/update-status/${inviteId}`,
`/invite/update-status/${inviteId}`,
{ status }
);
if (res.code === 0) {
@@ -229,7 +268,7 @@ export async function getInviteRanking(params?: { limit?: number; period?: 'day'
successCount: number;
conversionRate: number;
}>>>(
SERVER_API_URL + '/invite/ranking',
'/invite/ranking',
params
);
if (res.code === 0) {

View File

@@ -6,6 +6,7 @@ import type { ShopDealerUser, ShopDealerUserParam } from './model';
* 分页查询分销商用户记录表
*/
export async function pageShopDealerUser(params: ShopDealerUserParam) {
// 使用新的request方法它会自动处理错误并返回完整的ApiResult
const res = await request.get<ApiResult<PageResult<ShopDealerUser>>>(
'/shop/shop-dealer-user/page',
params

View File

@@ -8,8 +8,8 @@ import {SERVER_API_URL} from "@/utils/server";
*/
export async function pageUsers(params: UserParam) {
const res = await request.get<ApiResult<PageResult<User>>>(
'/system/user/page',
{params}
SERVER_API_URL + '/system/user/page',
params
);
if (res.code === 0) {
return res.data;
@@ -23,9 +23,7 @@ export async function pageUsers(params: UserParam) {
export async function listUsers(params?: UserParam) {
const res = await request.get<ApiResult<User[]>>(
'/system/user',
{
params
}
params
);
if (res.code === 0 && res.data) {
return res.data;