250 lines
6.5 KiB
TypeScript
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
|
|
}
|