提交
This commit is contained in:
@@ -238,16 +238,16 @@ class TransferService {
|
||||
}
|
||||
|
||||
// 获取转账列表
|
||||
async getTransfers(filters = {}, pagination = {}) {
|
||||
async getTransfers(filters = {}, pagination = {},user_type = 'user_to_user') {
|
||||
const db = getDB();
|
||||
const {page = 1, limit = 10, sort = 'created_at', order = 'desc'} = pagination;
|
||||
const pageNum = parseInt(page, 10) || 1;
|
||||
const limitNum = parseInt(limit, 10) || 10;
|
||||
const offset = (pageNum - 1) * limitNum;
|
||||
|
||||
let whereClause = 'WHERE 1=1';
|
||||
let whereClause = 'WHERE 1=1 ';
|
||||
const params = [];
|
||||
|
||||
whereClause += `AND transfer_type='${user_type}'`;
|
||||
// 构建查询条件
|
||||
if (filters.user_id) {
|
||||
whereClause += ' AND (from_user_id = ? OR to_user_id = ?)';
|
||||
@@ -284,7 +284,98 @@ class TransferService {
|
||||
const validSortFields = ['id', 'amount', 'created_at', 'updated_at', 'status'];
|
||||
const sortField = validSortFields.includes(sort) ? sort : 'created_at';
|
||||
const sortOrder = order && order.toLowerCase() === 'asc' ? 'ASC' : 'DESC';
|
||||
|
||||
|
||||
const orderClause = `ORDER BY t.${sortField} ${sortOrder}`;
|
||||
|
||||
try {
|
||||
// 获取总数
|
||||
const [countResult] = await db.execute(
|
||||
`SELECT COUNT(*) as total
|
||||
FROM transfers t
|
||||
LEFT JOIN users fu ON t.from_user_id = fu.id
|
||||
LEFT JOIN users tu ON t.to_user_id = tu.id
|
||||
${whereClause}`,
|
||||
params
|
||||
);
|
||||
const total = countResult[0].total;
|
||||
|
||||
// 获取数据
|
||||
const [transfers] = await db.execute(
|
||||
`SELECT t.*,
|
||||
fu.username as from_username,
|
||||
fu.real_name as from_real_name,
|
||||
tu.username as to_username,
|
||||
tu.real_name as to_real_name
|
||||
FROM transfers t
|
||||
LEFT JOIN users fu ON t.from_user_id = fu.id
|
||||
LEFT JOIN users tu ON t.to_user_id = tu.id
|
||||
${whereClause} ${orderClause}
|
||||
LIMIT ${limitNum}
|
||||
OFFSET ${offset}`,
|
||||
params
|
||||
);
|
||||
|
||||
return {
|
||||
transfers,
|
||||
pagination: {
|
||||
page: pageNum,
|
||||
limit: limitNum,
|
||||
total,
|
||||
pages: Math.ceil(total / limitNum)
|
||||
}
|
||||
};
|
||||
} catch (error) {
|
||||
logger.error('Failed to get transfers', {error: error.message, filters});
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
async getTransfersHistory(filters = {}, pagination = {},user_type = 'user_to_user') {
|
||||
const db = getDB();
|
||||
const {page = 1, limit = 10, sort = 'created_at', order = 'desc'} = pagination;
|
||||
const pageNum = parseInt(page, 10) || 1;
|
||||
const limitNum = parseInt(limit, 10) || 10;
|
||||
const offset = (pageNum - 1) * limitNum;
|
||||
|
||||
let whereClause = 'WHERE 1=1 ';
|
||||
const params = [];
|
||||
whereClause += `AND transfer_type != '${user_type}'`;
|
||||
// 构建查询条件
|
||||
if (filters.user_id) {
|
||||
whereClause += ' AND (from_user_id = ? OR to_user_id = ?)';
|
||||
params.push(filters.user_id, filters.user_id);
|
||||
}
|
||||
|
||||
if (filters.status) {
|
||||
whereClause += ' AND status = ?';
|
||||
params.push(filters.status);
|
||||
}
|
||||
|
||||
if (filters.transfer_type) {
|
||||
whereClause += ' AND transfer_type = ?';
|
||||
params.push(filters.transfer_type);
|
||||
}
|
||||
|
||||
if (filters.start_date) {
|
||||
whereClause += ' AND created_at >= ?';
|
||||
params.push(filters.start_date);
|
||||
}
|
||||
|
||||
if (filters.end_date) {
|
||||
whereClause += ' AND created_at <= ?';
|
||||
params.push(filters.end_date);
|
||||
}
|
||||
|
||||
if (filters.search) {
|
||||
whereClause += ' AND (fu.username LIKE ? OR fu.real_name LIKE ? OR tu.username LIKE ? OR tu.real_name LIKE ?)';
|
||||
const searchPattern = `%${filters.search}%`;
|
||||
params.push(searchPattern, searchPattern, searchPattern, searchPattern);
|
||||
}
|
||||
|
||||
// 构建排序子句
|
||||
const validSortFields = ['id', 'amount', 'created_at', 'updated_at', 'status'];
|
||||
const sortField = validSortFields.includes(sort) ? sort : 'created_at';
|
||||
const sortOrder = order && order.toLowerCase() === 'asc' ? 'ASC' : 'DESC';
|
||||
|
||||
const orderClause = `ORDER BY t.${sortField} ${sortOrder}`;
|
||||
|
||||
try {
|
||||
@@ -357,53 +448,6 @@ class TransferService {
|
||||
return transfers[0] || null;
|
||||
}
|
||||
|
||||
// 更新用户余额(新的余额系统)
|
||||
async updateUserBalance(transfer) {
|
||||
const {from_user_id, to_user_id, amount, transfer_type} = transfer;
|
||||
|
||||
const db = getDB();
|
||||
|
||||
// 扣除发送方余额(使用行锁防止并发问题)
|
||||
if (transfer_type === TRANSFER_TYPES.USER_TO_USER || transfer_type === TRANSFER_TYPES.USER_TO_SYSTEM) {
|
||||
if (from_user_id) {
|
||||
await db.execute(
|
||||
'UPDATE users SET balance = balance - ? WHERE id = ?',
|
||||
[amount, from_user_id]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// 增加接收方余额
|
||||
if (transfer_type === TRANSFER_TYPES.SYSTEM_TO_USER || transfer_type === TRANSFER_TYPES.USER_TO_USER) {
|
||||
await db.execute(
|
||||
'UPDATE users SET balance = balance + ? WHERE id = ?',
|
||||
[amount, to_user_id]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// 使用指定连接更新用户余额(用于事务处理)
|
||||
async updateUserBalanceWithConnection(transfer, connection) {
|
||||
const {from_user_id, to_user_id, amount, transfer_type} = transfer;
|
||||
|
||||
// 扣除发送方余额(使用行锁防止并发问题)
|
||||
if (transfer_type === TRANSFER_TYPES.USER_TO_USER || transfer_type === TRANSFER_TYPES.USER_TO_SYSTEM) {
|
||||
if (from_user_id) {
|
||||
await connection.execute(
|
||||
'UPDATE users SET balance = balance - ? WHERE id = ?',
|
||||
[amount, from_user_id]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// 增加接收方余额
|
||||
if (transfer_type === TRANSFER_TYPES.SYSTEM_TO_USER || transfer_type === TRANSFER_TYPES.USER_TO_USER) {
|
||||
await connection.execute(
|
||||
'UPDATE users SET balance = balance + ? WHERE id = ?',
|
||||
[amount, to_user_id]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// 用户确认收到转账
|
||||
async confirmReceived(transferId, userId) {
|
||||
|
||||
Reference in New Issue
Block a user