/** * 邀请有礼功能相关API */ import { USE_MOCK } from '@/utils/config'; import { mockInviteRecords, mockInviteStats, mockActivityInfo, mockInviteCode } from '@/mock/invite'; export enum InviteStatus { PENDING = 'pending', ACTIVATED = 'activated', REWARDED = 'rewarded', FAILED = 'failed' } export enum InviteStatusLabel { PENDING = '待激活', ACTIVATED = '已激活', REWARDED = '奖励已发放', FAILED = '发放失败' } export interface InviteCodeResponse { code: string; inviteUrl: string; expireTime?: string; } export interface BindInviteParams { inviteCode: string; } export interface BindInviteResponse { success: boolean; message: string; // 双向奖励发放结果 rewardResult?: { inviteeCouponGranted: boolean; // 是否已向被邀请人发券 inviteeCouponName?: string; // 被邀请人获得的优惠券名称 inviteeCouponAmount?: number; // 被邀请人获得的优惠券金额 inviterCouponPending: boolean; // 邀请人奖励是否待发放(需满足条件) triggerCondition?: string; // 触发条件说明 }; } export interface InviteRecord { id: string; inviteePhone: string; inviteeName?: string; status: InviteStatus; inviteTime: string; activateTime?: string; rewardTime?: string; couponName?: string; couponAmount?: number; rewardType?: 'inviter' | 'invitee'; // 奖励类型:inviter=邀请人推荐奖励, invitee=被邀请人新人券 } export interface InviteRecordListResponse { list: InviteRecord[]; total: number; page: number; pageSize: number; } export interface InviteQueryParams { page?: number; pageSize?: number; status?: InviteStatus; } export interface InviteStatistics { totalInvite: number; validInvite: number; rewardCount: number; pendingCount: number; totalRewardAmount: number; // 双向奖励统计 inviterRewardCount?: number; // 邀请人推荐奖励数量 inviteeRewardCount?: number; // 被邀请人新人券发放数量 inviterRewardAmount?: number; // 邀请人推荐奖励总金额 inviteeRewardAmount?: number; // 被邀请人新人券总金额 } export interface ActivityInfo { activityId: string; title: string; description: string; couponName: string; couponAmount: number; startTime: string; endTime: string; rules: string[]; isActive: boolean; // 双向奖励配置 dualRewardConfig?: { inviteeCouponName: string; // 被邀请人新人券名称 inviteeCouponAmount: number; // 被邀请人新人券金额 inviterCouponName: string; // 邀请人推荐奖励券名称 inviterCouponAmount: number; // 邀请人推荐奖励券金额 triggerCondition: string; // 触发条件描述(如"好友完成首单") }; } export interface PosterResponse { posterUrl: string; expireTime: string; } export async function getInviteCode(): Promise { if (USE_MOCK) { return Promise.resolve(mockInviteCode); } const { get } = await import('@/utils/request'); return get('/invite/code'); } export async function bindInviteRelation(params: BindInviteParams): Promise { if (USE_MOCK) { return Promise.resolve({ success: true, message: '邀请关系绑定成功', rewardResult: { inviteeCouponGranted: true, inviteeCouponName: '新人专属优惠券', inviteeCouponAmount: 10, inviterCouponPending: true, triggerCondition: '好友完成首单后发放' } }); } const { post } = await import('@/utils/request'); return post('/invite/bind', params); } export async function getMyInviteRecords(params: InviteQueryParams = {}): Promise { if (USE_MOCK) { const { page = 1, pageSize = 10, status } = params; let list = [...mockInviteRecords]; if (status) { list = list.filter(item => item.status === status); } const total = list.length; const startIndex = (page - 1) * pageSize; return Promise.resolve({ list: list.slice(startIndex, startIndex + pageSize), total, page, pageSize }); } const { get } = await import('@/utils/request'); return get('/invite/my-records', params); } export async function getMyInviteStatistics(): Promise { if (USE_MOCK) { return Promise.resolve(mockInviteStats); } const { get } = await import('@/utils/request'); return get('/invite/my-statistics'); } export async function getActivityInfo(): Promise { if (USE_MOCK) { return Promise.resolve(mockActivityInfo); } const { get } = await import('@/utils/request'); return get('/invite/activity-info'); } export async function generatePoster(): Promise { if (USE_MOCK) { return Promise.resolve({ posterUrl: 'https://example.com/poster/invite_' + Date.now() + '.png', expireTime: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString() }); } const { get } = await import('@/utils/request'); return get('/invite/poster'); }