Files
soul/app/api/admin/referral/route.ts

250 lines
6.5 KiB
TypeScript

// app/api/admin/referral/route.ts
// 分销模块管理API
import { NextRequest, NextResponse } from 'next/server'
// 模拟分销数据
let referralRecords = [
{
id: 'REF_001',
referrerId: 'user_001',
referrerName: '张三',
inviteCode: 'ABC123',
totalReferrals: 5,
totalOrders: 3,
totalCommission: 267.00,
paidCommission: 200.00,
pendingCommission: 67.00,
commissionRate: 0.9,
status: 'active',
createdAt: new Date('2025-01-01').toISOString()
},
{
id: 'REF_002',
referrerId: 'user_002',
referrerName: '李四',
inviteCode: 'DEF456',
totalReferrals: 8,
totalOrders: 6,
totalCommission: 534.00,
paidCommission: 400.00,
pendingCommission: 134.00,
commissionRate: 0.9,
status: 'active',
createdAt: new Date('2025-01-03').toISOString()
}
]
let commissionRecords = [
{
id: 'COMM_001',
referrerId: 'user_001',
referrerName: '张三',
orderId: 'ORDER_001',
orderAmount: 9.9,
commissionAmount: 8.91,
commissionRate: 0.9,
status: 'paid',
createdAt: new Date('2025-01-10').toISOString(),
paidAt: new Date('2025-01-12').toISOString()
}
]
// GET: 获取分销概览或列表
export async function GET(req: NextRequest) {
const { searchParams } = new URL(req.url)
const type = searchParams.get('type') || 'list'
const page = parseInt(searchParams.get('page') || '1')
const pageSize = parseInt(searchParams.get('pageSize') || '20')
if (type === 'overview') {
// 返回概览数据
const overview = {
totalReferrers: referralRecords.length,
activeReferrers: referralRecords.filter(r => r.status === 'active').length,
totalReferrals: referralRecords.reduce((sum, r) => sum + r.totalReferrals, 0),
totalOrders: referralRecords.reduce((sum, r) => sum + r.totalOrders, 0),
totalCommission: referralRecords.reduce((sum, r) => sum + r.totalCommission, 0),
paidCommission: referralRecords.reduce((sum, r) => sum + r.paidCommission, 0),
pendingCommission: referralRecords.reduce((sum, r) => sum + r.pendingCommission, 0),
averageCommission: referralRecords.reduce((sum, r) => sum + r.totalCommission, 0) / referralRecords.length
}
return NextResponse.json({
success: true,
overview
})
}
// 返回列表数据
const start = (page - 1) * pageSize
const end = start + pageSize
const paginatedRecords = referralRecords.slice(start, end)
return NextResponse.json({
success: true,
records: paginatedRecords,
pagination: {
page,
pageSize,
total: referralRecords.length,
totalPages: Math.ceil(referralRecords.length / pageSize)
}
})
}
// POST: 创建分销记录或处理佣金
export async function POST(req: NextRequest) {
try {
const body = await req.json()
const { action, data } = body
if (action === 'create_referrer') {
// 创建推广者
const { userId, userName, commissionRate } = data
const newReferrer = {
id: `REF_${Date.now()}`,
referrerId: userId,
referrerName: userName,
inviteCode: generateInviteCode(),
totalReferrals: 0,
totalOrders: 0,
totalCommission: 0,
paidCommission: 0,
pendingCommission: 0,
commissionRate: commissionRate || 0.9,
status: 'active',
createdAt: new Date().toISOString()
}
referralRecords.push(newReferrer)
return NextResponse.json({
success: true,
message: '推广者创建成功',
referrer: newReferrer
})
}
if (action === 'pay_commission') {
// 支付佣金
const { referrerId, amount, note } = data
const referrer = referralRecords.find(r => r.referrerId === referrerId)
if (!referrer) {
return NextResponse.json(
{ error: '推广者不存在' },
{ status: 404 }
)
}
if (amount > referrer.pendingCommission) {
return NextResponse.json(
{ error: '支付金额超过待支付佣金' },
{ status: 400 }
)
}
referrer.paidCommission += amount
referrer.pendingCommission -= amount
return NextResponse.json({
success: true,
message: '佣金支付成功',
referrer
})
}
return NextResponse.json(
{ error: '未知操作' },
{ status: 400 }
)
} catch (error) {
return NextResponse.json(
{ error: '操作失败' },
{ status: 500 }
)
}
}
// PUT: 更新分销记录
export async function PUT(req: NextRequest) {
try {
const body = await req.json()
const { referrerId, status, commissionRate, note } = body
const referrerIndex = referralRecords.findIndex(r => r.referrerId === referrerId)
if (referrerIndex === -1) {
return NextResponse.json(
{ error: '推广者不存在' },
{ status: 404 }
)
}
referralRecords[referrerIndex] = {
...referralRecords[referrerIndex],
status: status || referralRecords[referrerIndex].status,
commissionRate: commissionRate !== undefined ? commissionRate : referralRecords[referrerIndex].commissionRate,
note: note || referralRecords[referrerIndex].note,
updatedAt: new Date().toISOString()
}
return NextResponse.json({
success: true,
message: '推广者信息更新成功',
referrer: referralRecords[referrerIndex]
})
} catch (error) {
return NextResponse.json(
{ error: '更新失败' },
{ status: 500 }
)
}
}
// DELETE: 删除分销记录
export async function DELETE(req: NextRequest) {
try {
const { searchParams } = new URL(req.url)
const referrerId = searchParams.get('id')
if (!referrerId) {
return NextResponse.json(
{ error: '推广者ID不能为空' },
{ status: 400 }
)
}
const referrerIndex = referralRecords.findIndex(r => r.referrerId === referrerId)
if (referrerIndex === -1) {
return NextResponse.json(
{ error: '推广者不存在' },
{ status: 404 }
)
}
referralRecords.splice(referrerIndex, 1)
return NextResponse.json({
success: true,
message: '推广者删除成功'
})
} catch (error) {
return NextResponse.json(
{ error: '删除失败' },
{ status: 500 }
)
}
}
// 生成邀请码
function generateInviteCode(): string {
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
let code = ''
for (let i = 0; i < 6; i++) {
code += chars.charAt(Math.floor(Math.random() * chars.length))
}
return code
}