239 lines
6.9 KiB
JavaScript
239 lines
6.9 KiB
JavaScript
const express = require('express');
|
|
const router = express.Router();
|
|
const dbConnector = require('../utils/dbConnector');
|
|
|
|
// 获取用户推广信息
|
|
router.get('/info', async (req, res) => {
|
|
try {
|
|
const userId = req.user.id;
|
|
|
|
// 获取或创建推广信息
|
|
let promotion = await dbConnector.query(
|
|
'SELECT * FROM promotions WHERE user_id = ?',
|
|
[userId]
|
|
);
|
|
|
|
if (promotion.length === 0) {
|
|
// 创建新的推广信息
|
|
const promotionCode = generatePromotionCode(userId);
|
|
await dbConnector.query(
|
|
`INSERT INTO promotions
|
|
(user_id, promotion_code, total_invites, successful_orders, total_earnings, available_balance, withdrawn_amount, created_at, updated_at)
|
|
VALUES (?, ?, 0, 0, 0, 0, 0, NOW(), NOW())`,
|
|
[userId, promotionCode]
|
|
);
|
|
|
|
promotion = await dbConnector.query(
|
|
'SELECT * FROM promotions WHERE user_id = ?',
|
|
[userId]
|
|
);
|
|
}
|
|
|
|
// 生成推广链接和二维码(这里简化处理,实际项目中需要生成真实二维码)
|
|
const promotionInfo = {
|
|
promotion_code: promotion[0].promotion_code,
|
|
qr_code_url: `/uploads/qrcodes/promo_${promotion[0].promotion_code}.png`,
|
|
promotion_url: `https://aijianhua.com/promo/${promotion[0].promotion_code}`,
|
|
total_invites: promotion[0].total_invites,
|
|
successful_orders: promotion[0].successful_orders,
|
|
total_earnings: promotion[0].total_earnings,
|
|
available_balance: promotion[0].available_balance,
|
|
withdrawn_amount: promotion[0].withdrawn_amount
|
|
};
|
|
|
|
res.json({
|
|
code: 200,
|
|
message: '获取成功',
|
|
data: promotionInfo
|
|
});
|
|
} catch (error) {
|
|
console.error('获取推广信息失败:', error);
|
|
res.status(500).json({
|
|
code: 500,
|
|
message: '服务器内部错误',
|
|
error: error.message
|
|
});
|
|
}
|
|
});
|
|
|
|
// 获取推广记录
|
|
router.get('/records', async (req, res) => {
|
|
try {
|
|
const userId = req.user.id;
|
|
const { page = 1, limit = 10, type } = req.query;
|
|
const offset = (page - 1) * limit;
|
|
|
|
let query = `
|
|
SELECT 'invite' as type, u.username as user_name, u.phone,
|
|
NULL as order_amount, 10.0 as amount, 'completed' as status, u.created_at
|
|
FROM users u
|
|
WHERE u.invited_by = ?
|
|
`;
|
|
|
|
let countQuery = 'SELECT COUNT(*) as count FROM users WHERE invited_by = ?';
|
|
let queryParams = [userId];
|
|
|
|
if (type === 'order_commission') {
|
|
query = `
|
|
SELECT 'order_commission' as type, u.username as user_name, u.phone,
|
|
o.total_amount as order_amount, o.total_amount * 0.1 as amount,
|
|
'pending' as status, o.created_at
|
|
FROM orders o
|
|
JOIN users u ON o.user_id = u.id
|
|
WHERE u.invited_by = ? AND o.payment_status = 1
|
|
`;
|
|
countQuery = `
|
|
SELECT COUNT(*) as count
|
|
FROM orders o
|
|
JOIN users u ON o.user_id = u.id
|
|
WHERE u.invited_by = ? AND o.payment_status = 1
|
|
`;
|
|
}
|
|
|
|
query += ' ORDER BY created_at DESC LIMIT ? OFFSET ?';
|
|
queryParams.push(parseInt(limit), parseInt(offset));
|
|
|
|
const records = await dbConnector.query(query, queryParams);
|
|
const countResult = await dbConnector.query(countQuery, [userId]);
|
|
const total = countResult[0].count;
|
|
|
|
res.json({
|
|
code: 200,
|
|
message: '获取成功',
|
|
data: {
|
|
records: records,
|
|
pagination: {
|
|
page: parseInt(page),
|
|
limit: parseInt(limit),
|
|
total: total,
|
|
pages: Math.ceil(total / limit)
|
|
}
|
|
}
|
|
});
|
|
} catch (error) {
|
|
console.error('获取推广记录失败:', error);
|
|
res.status(500).json({
|
|
code: 500,
|
|
message: '服务器内部错误',
|
|
error: error.message
|
|
});
|
|
}
|
|
});
|
|
|
|
// 申请提现
|
|
router.post('/withdraw', async (req, res) => {
|
|
try {
|
|
const { amount, payment_method, account_info } = req.body;
|
|
const userId = req.user.id;
|
|
|
|
// 检查可用余额
|
|
const promotion = await dbConnector.query(
|
|
'SELECT available_balance FROM promotions WHERE user_id = ?',
|
|
[userId]
|
|
);
|
|
|
|
if (promotion.length === 0 || promotion[0].available_balance < amount) {
|
|
return res.status(400).json({
|
|
code: 2001,
|
|
message: '可提现余额不足'
|
|
});
|
|
}
|
|
|
|
// 检查最小提现金额
|
|
if (amount < 50) {
|
|
return res.status(400).json({
|
|
code: 2001,
|
|
message: '提现金额不能少于50元'
|
|
});
|
|
}
|
|
|
|
// 创建提现记录
|
|
const result = await dbConnector.query(
|
|
`INSERT INTO withdrawals
|
|
(user_id, amount, payment_method, account_info, status, created_at, updated_at)
|
|
VALUES (?, ?, ?, ?, 'pending', NOW(), NOW())`,
|
|
[userId, amount, payment_method, account_info]
|
|
);
|
|
|
|
// 更新可用余额
|
|
await dbConnector.query(
|
|
'UPDATE promotions SET available_balance = available_balance - ?, updated_at = NOW() WHERE user_id = ?',
|
|
[amount, userId]
|
|
);
|
|
|
|
res.json({
|
|
code: 200,
|
|
message: '提现申请已提交',
|
|
data: {
|
|
withdraw_id: result.insertId,
|
|
amount: amount,
|
|
status: 'processing',
|
|
estimated_arrival: new Date(Date.now() + 2 * 24 * 60 * 60 * 1000).toISOString() // 2天后
|
|
}
|
|
});
|
|
} catch (error) {
|
|
console.error('申请提现失败:', error);
|
|
res.status(500).json({
|
|
code: 500,
|
|
message: '服务器内部错误',
|
|
error: error.message
|
|
});
|
|
}
|
|
});
|
|
|
|
// 获取提现记录
|
|
router.get('/withdrawals', async (req, res) => {
|
|
try {
|
|
const userId = req.user.id;
|
|
const { page = 1, limit = 10 } = req.query;
|
|
const offset = (page - 1) * limit;
|
|
|
|
const withdrawals = await dbConnector.query(
|
|
`SELECT id, amount, payment_method, account_info, status, transaction_id, completed_at, created_at
|
|
FROM withdrawals
|
|
WHERE user_id = ?
|
|
ORDER BY created_at DESC
|
|
LIMIT ? OFFSET ?`,
|
|
[userId, parseInt(limit), parseInt(offset)]
|
|
);
|
|
|
|
const countResult = await dbConnector.query(
|
|
'SELECT COUNT(*) as count FROM withdrawals WHERE user_id = ?',
|
|
[userId]
|
|
);
|
|
const total = countResult[0].count;
|
|
|
|
res.json({
|
|
code: 200,
|
|
message: '获取成功',
|
|
data: {
|
|
withdrawals: withdrawals,
|
|
pagination: {
|
|
page: parseInt(page),
|
|
limit: parseInt(limit),
|
|
total: total,
|
|
pages: Math.ceil(total / limit)
|
|
}
|
|
}
|
|
});
|
|
} catch (error) {
|
|
console.error('获取提现记录失败:', error);
|
|
res.status(500).json({
|
|
code: 500,
|
|
message: '服务器内部错误',
|
|
error: error.message
|
|
});
|
|
}
|
|
});
|
|
|
|
// 生成推广码
|
|
function generatePromotionCode(userId) {
|
|
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
|
|
let code = 'PROMO';
|
|
for (let i = 0; i < 6; i++) {
|
|
code += chars.charAt(Math.floor(Math.random() * chars.length));
|
|
}
|
|
return code + userId.toString().padStart(4, '0');
|
|
}
|
|
|
|
module.exports = router; |