更新服务器信息为新的 IP 地址,调整相关文档和代码中的默认配置,确保部署和连接的一致性。同时,优化订单管理界面,增强商品信息的格式化逻辑,提升用户体验。

This commit is contained in:
乘风
2026-02-05 21:08:28 +08:00
parent 1a95aee112
commit 3ccf331e12
61 changed files with 11231 additions and 311 deletions

View File

@@ -31,11 +31,15 @@ export async function GET(request: NextRequest) {
try {
// 获取分销配置
let distributorShare = DISTRIBUTOR_SHARE
let minWithdrawAmount = 10 // 默认最低提现金额
try {
const config = await getConfig('referral_config')
if (config?.distributorShare) {
distributorShare = config.distributorShare / 100
}
if (config?.minWithdrawAmount) {
minWithdrawAmount = Number(config.minWithdrawAmount)
}
} catch (e) { /* 使用默认配置 */ }
// 1. 获取用户基本信息
@@ -54,15 +58,15 @@ export async function GET(request: NextRequest) {
const user = users[0]
// 2. 获取绑定关系统计(从referral_bindings表
// 2. 获取绑定关系统计(新逻辑:基于 purchase_count
let bindingStats = { total: 0, active: 0, converted: 0, expired: 0 }
try {
const bindings = await query(`
SELECT
COUNT(*) as total,
SUM(CASE WHEN status = 'active' AND expiry_date > NOW() THEN 1 ELSE 0 END) as active,
SUM(CASE WHEN status = 'converted' THEN 1 ELSE 0 END) as converted,
SUM(CASE WHEN status = 'expired' OR (status = 'active' AND expiry_date <= NOW()) THEN 1 ELSE 0 END) as expired
SUM(CASE WHEN status = 'active' AND purchase_count > 0 THEN 1 ELSE 0 END) as converted,
SUM(CASE WHEN status IN ('expired', 'cancelled') OR (status = 'active' AND expiry_date <= NOW()) THEN 1 ELSE 0 END) as expired
FROM referral_bindings
WHERE referrer_id = ?
`, [userId]) as any[]
@@ -125,15 +129,16 @@ export async function GET(request: NextRequest) {
LIMIT 50
`, [userId]) as any[]
// 6. 获取已转化用户列表
// 6. 获取已转化用户列表(新逻辑:有购买记录的活跃绑定)
const convertedBindings = await query(`
SELECT rb.id, rb.referee_id, rb.conversion_date, rb.commission_amount,
SELECT rb.id, rb.referee_id, rb.last_purchase_date as conversion_date,
rb.total_commission as commission_amount, rb.purchase_count,
u.nickname, u.avatar,
(SELECT COALESCE(SUM(amount), 0) FROM orders WHERE user_id = rb.referee_id AND status = 'paid') as order_amount
FROM referral_bindings rb
JOIN users u ON rb.referee_id = u.id
WHERE rb.referrer_id = ? AND rb.status = 'converted'
ORDER BY rb.conversion_date DESC
WHERE rb.referrer_id = ? AND rb.status = 'active' AND rb.purchase_count > 0
ORDER BY rb.last_purchase_date DESC
LIMIT 50
`, [userId]) as any[]
@@ -148,21 +153,44 @@ export async function GET(request: NextRequest) {
LIMIT 50
`, [userId]) as any[]
// 7. 获取收益明细
// 7. 获取待审核提现金额
let pendingWithdrawAmount = 0
try {
const pendingResult = await query(`
SELECT COALESCE(SUM(amount), 0) as pending_amount
FROM withdrawals
WHERE user_id = ? AND status = 'pending'
`, [userId]) as any[]
pendingWithdrawAmount = parseFloat(pendingResult[0]?.pending_amount || 0)
} catch (e) {
console.log('[ReferralData] 获取待审核提现金额失败:', e)
}
// 8. 获取收益明细(包含买家信息和商品详情)
let earningsDetails: any[] = []
try {
earningsDetails = await query(`
SELECT o.id, o.order_sn, o.amount, o.product_type, o.pay_time,
u.nickname as buyer_nickname,
rb.commission_amount
SELECT
o.id,
o.order_sn,
o.amount,
o.product_type,
o.product_id,
o.description,
o.pay_time,
u.nickname as buyer_nickname,
u.avatar as buyer_avatar,
rb.total_commission / rb.purchase_count as commission_per_order
FROM orders o
JOIN users u ON o.user_id = u.id
JOIN referral_bindings rb ON o.user_id = rb.referee_id AND rb.referrer_id = ?
WHERE o.status = 'paid'
WHERE o.status = 'paid' AND o.referrer_id = ?
ORDER BY o.pay_time DESC
LIMIT 30
`, [userId]) as any[]
} catch (e) { /* 忽略 */ }
`, [userId, userId]) as any[]
} catch (e) {
console.log('[ReferralData] 获取收益明细失败:', e)
}
// 8. 计算预估收益
const estimatedEarnings = paymentStats.totalAmount * distributorShare
@@ -181,16 +209,28 @@ export async function GET(request: NextRequest) {
expiredCount: bindingStats.expired,
// === 收益数据 ===
// 已结算收益
earnings: parseFloat(user.earnings) || 0,
// 待结算收益
pendingEarnings: parseFloat(user.pending_earnings) || 0,
// 累计佣金总额(所有获得的佣金)
totalCommission: Math.round((
(parseFloat(user.earnings) || 0) +
(parseFloat(user.pending_earnings) || 0) +
(parseFloat(user.withdrawn_earnings) || 0)
) * 100) / 100,
// 可提现金额pending_earnings
availableEarnings: parseFloat(user.pending_earnings) || 0,
// 待审核金额(提现申请中的金额)
pendingWithdrawAmount: Math.round(pendingWithdrawAmount * 100) / 100,
// 已提现金额
withdrawnEarnings: parseFloat(user.withdrawn_earnings) || 0,
// 已结算收益(保留兼容)
earnings: parseFloat(user.earnings) || 0,
// 待结算收益(保留兼容)
pendingEarnings: parseFloat(user.pending_earnings) || 0,
// 预估总收益
estimatedEarnings: Math.round(estimatedEarnings * 100) / 100,
// 分成比例
shareRate: Math.round(distributorShare * 100),
// 最低提现金额(新增:给小程序使用)
minWithdrawAmount,
// === 推荐码 ===
referralCode: user.referral_code,
@@ -225,6 +265,7 @@ export async function GET(request: NextRequest) {
avatar: b.avatar,
commission: parseFloat(b.commission_amount) || 0,
orderAmount: parseFloat(b.order_amount) || 0,
purchaseCount: parseInt(b.purchase_count) || 0,
conversionDate: b.conversion_date,
status: 'converted'
})),
@@ -244,9 +285,12 @@ export async function GET(request: NextRequest) {
id: e.id,
orderSn: e.order_sn,
amount: parseFloat(e.amount),
commission: parseFloat(e.commission_amount) || parseFloat(e.amount) * distributorShare,
commission: parseFloat(e.commission_per_order) || parseFloat(e.amount) * distributorShare,
productType: e.product_type,
buyerNickname: e.buyer_nickname,
productId: e.product_id,
description: e.description,
buyerNickname: e.buyer_nickname || '用户' + e.id?.toString().slice(-4),
buyerAvatar: e.buyer_avatar,
payTime: e.pay_time
}))
}