mahjong_group/server/CoreCms.Net.Services/SQ/SQEarningsServices.cs
2026-01-01 14:35:52 +08:00

478 lines
16 KiB
C#

/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2025/12/7
* Description: 收益服务实现
***********************************************************************/
using CoreCms.Net.Configuration;
using CoreCms.Net.IRepository;
using CoreCms.Net.IRepository.UnitOfWork;
using CoreCms.Net.IServices;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.ViewModels.Basics;
using CoreCms.Net.Model.ViewModels.UI;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
namespace CoreCms.Net.Services
{
/// <summary>
/// 收益服务实现
/// </summary>
public class SQEarningsServices : BaseServices<SQEarningsRecord>, ISQEarningsServices
{
private readonly ISQEarningsRecordRepository _dal;
private readonly ISQWithdrawRecordRepository _withdrawRecordRepository;
private readonly ICoreCmsUserRepository _userRepository;
private readonly IUnitOfWork _unitOfWork;
public SQEarningsServices(
IUnitOfWork unitOfWork,
ISQEarningsRecordRepository dal,
ISQWithdrawRecordRepository withdrawRecordRepository,
ICoreCmsUserRepository userRepository)
{
_dal = dal;
base.BaseDal = dal;
_unitOfWork = unitOfWork;
_withdrawRecordRepository = withdrawRecordRepository;
_userRepository = userRepository;
}
#region API方法
/// <summary>
/// 获取收益统计信息
/// </summary>
public async Task<EarningsSummaryDto> GetEarningsSummaryAsync(int userId)
{
var user = await _unitOfWork.GetDbClient().Queryable<CoreCmsUser>()
.Where(u => u.id == userId)
.FirstAsync();
if (user == null)
{
return new EarningsSummaryDto
{
pendingAmount = 0,
extractedAmount = 0
};
}
return new EarningsSummaryDto
{
pendingAmount = user.pending_earnings,
extractedAmount = user.withdrawn_earnings
};
}
/// <summary>
/// 获取收益记录列表
/// </summary>
public async Task<List<EarningsRecordDto>> GetEarningsRecordListAsync(int userId, int pageIndex = 1, int pageSize = 20)
{
var records = await _unitOfWork.GetDbClient().Queryable<SQEarningsRecord>()
.Where(r => r.user_id == userId)
.OrderBy(r => r.create_time, OrderByType.Desc)
.Skip((pageIndex - 1) * pageSize)
.Take(pageSize)
.ToListAsync();
return records.Select(r => new EarningsRecordDto
{
id = r.id,
date = r.create_time.ToString("yyyy/M/d"),
roomNumber = r.room_number ?? "",
roomName = r.room_name ?? "",
roomFee = r.room_fee,
earnings = r.earnings,
reservationId = r.reservation_id,
type = r.type,
typeName = r.type == 1 ? "佣金" : "鸽子费"
}).ToList();
}
/// <summary>
/// 获取提现记录列表
/// </summary>
public async Task<List<WithdrawRecordDto>> GetWithdrawRecordListAsync(int userId, int pageIndex = 1, int pageSize = 20)
{
var records = await _unitOfWork.GetDbClient().Queryable<SQWithdrawRecord>()
.Where(r => r.user_id == userId)
.OrderBy(r => r.apply_time, OrderByType.Desc)
.Skip((pageIndex - 1) * pageSize)
.Take(pageSize)
.ToListAsync();
return records.Select(r => new WithdrawRecordDto
{
id = r.id,
date = r.apply_time.ToString("yyyy/M/d"),
amount = r.amount,
status = GetStatusName(r.status),
statusCode = r.status,
remark = r.remark ?? ""
}).ToList();
}
/// <summary>
/// 获取状态名称
/// </summary>
private string GetStatusName(int status)
{
return status switch
{
0 => "提现中",
1 => "已到账",
2 => "已拒绝",
_ => "未知"
};
}
/// <summary>
/// 申请提现
/// </summary>
public async Task<WebApiCallBack> ApplyWithdrawAsync(int userId, decimal amount)
{
var jm = new WebApiCallBack();
try
{
// 验证金额
if (amount <= 0)
{
jm.status = false;
jm.msg = "提现金额必须大于0";
return jm;
}
// 获取用户信息
var user = await _unitOfWork.GetDbClient().Queryable<CoreCmsUser>()
.Where(u => u.id == userId)
.FirstAsync();
if (user == null)
{
jm.status = false;
jm.msg = "用户不存在";
return jm;
}
// 验证余额是否充足
if (amount > user.pending_earnings)
{
jm.status = false;
jm.msg = "提现金额不能超过待提取收益";
return jm;
}
// 开启事务
try
{
_unitOfWork.BeginTran();
// 创建提现记录
var withdrawRecord = new SQWithdrawRecord
{
user_id = userId,
amount = amount,
status = 0, // 提现中
apply_time = DateTime.Now,
remark = null
};
var insertResult = await _unitOfWork.GetDbClient().Insertable(withdrawRecord).ExecuteReturnIdentityAsync();
if (insertResult <= 0)
{
_unitOfWork.RollbackTran();
jm.status = false;
jm.msg = "创建提现记录失败";
return jm;
}
// 扣减待提现收益
var updateResult = await _unitOfWork.GetDbClient().Updateable<CoreCmsUser>()
.SetColumns(u => u.pending_earnings == u.pending_earnings - amount)
.Where(u => u.id == userId && u.pending_earnings >= amount)
.ExecuteCommandAsync();
if (updateResult <= 0)
{
_unitOfWork.RollbackTran();
jm.status = false;
jm.msg = "扣减待提取收益失败,请重试";
return jm;
}
_unitOfWork.CommitTran();
jm.status = true;
jm.msg = "提现申请已提交";
jm.data = new { withdrawId = insertResult };
}
catch
{
_unitOfWork.RollbackTran();
throw;
}
}
catch (Exception ex)
{
jm.status = false;
jm.msg = "提现申请失败:" + ex.Message;
}
return jm;
}
#endregion
#region
/// <summary>
/// 添加收益(后台手动添加)
/// </summary>
public async Task<WebApiCallBack> AddEarningsAsync(int userId, int? reservationId, int? roomId, string roomNumber, string roomName, decimal roomFee, decimal earnings, int type, string remark, int operatorId)
{
var jm = new WebApiCallBack();
try
{
// 验证金额
if (earnings <= 0)
{
jm.status = false;
jm.msg = "收益金额必须大于0";
return jm;
}
// 获取用户信息
var user = await _unitOfWork.GetDbClient().Queryable<CoreCmsUser>()
.Where(u => u.id == userId)
.FirstAsync();
if (user == null)
{
jm.status = false;
jm.msg = "用户不存在";
return jm;
}
// 开启事务
try
{
_unitOfWork.BeginTran();
// 创建收益记录
var earningsRecord = new SQEarningsRecord
{
user_id = userId,
reservation_id = reservationId,
room_id = roomId,
room_number = roomNumber,
room_name = roomName,
room_fee = roomFee,
earnings = earnings,
type = type,
remark = remark,
create_time = DateTime.Now,
operator_id = operatorId
};
var insertResult = await _unitOfWork.GetDbClient().Insertable(earningsRecord).ExecuteReturnIdentityAsync();
if (insertResult <= 0)
{
_unitOfWork.RollbackTran();
jm.status = false;
jm.msg = "创建收益记录失败";
return jm;
}
// 增加用户待提现收益
var updateResult = await _unitOfWork.GetDbClient().Updateable<CoreCmsUser>()
.SetColumns(u => u.pending_earnings == u.pending_earnings + earnings)
.Where(u => u.id == userId)
.ExecuteCommandAsync();
if (updateResult <= 0)
{
_unitOfWork.RollbackTran();
jm.status = false;
jm.msg = "更新用户收益失败";
return jm;
}
_unitOfWork.CommitTran();
jm.status = true;
jm.msg = "添加收益成功";
jm.data = new { earningsId = insertResult };
}
catch
{
_unitOfWork.RollbackTran();
throw;
}
}
catch (Exception ex)
{
jm.status = false;
jm.msg = "添加收益失败:" + ex.Message;
}
return jm;
}
/// <summary>
/// 处理提现申请(同意/拒绝/已打款)
/// </summary>
public async Task<WebApiCallBack> ProcessWithdrawAsync(int withdrawId, int status, int operatorId, string remark = null)
{
var jm = new WebApiCallBack();
try
{
// 获取提现记录
var withdrawRecord = await _unitOfWork.GetDbClient().Queryable<SQWithdrawRecord>()
.Where(r => r.id == withdrawId)
.FirstAsync();
if (withdrawRecord == null)
{
jm.status = false;
jm.msg = "提现记录不存在";
return jm;
}
if (withdrawRecord.status != 0)
{
jm.status = false;
jm.msg = "该提现申请已处理";
return jm;
}
// 开启事务
try
{
_unitOfWork.BeginTran();
// 更新提现记录状态
var updateWithdraw = await _unitOfWork.GetDbClient().Updateable<SQWithdrawRecord>()
.SetColumns(r => r.status == status)
.SetColumns(r => r.process_time == DateTime.Now)
.SetColumns(r => r.operator_id == operatorId)
.SetColumnsIF(!string.IsNullOrEmpty(remark), r => r.remark == remark)
.Where(r => r.id == withdrawId)
.ExecuteCommandAsync();
if (updateWithdraw <= 0)
{
_unitOfWork.RollbackTran();
jm.status = false;
jm.msg = "更新提现记录失败";
return jm;
}
// 根据状态处理
if (status == 1) // 已到账
{
// 增加已提现收益
await _unitOfWork.GetDbClient().Updateable<CoreCmsUser>()
.SetColumns(u => u.withdrawn_earnings == u.withdrawn_earnings + withdrawRecord.amount)
.Where(u => u.id == withdrawRecord.user_id)
.ExecuteCommandAsync();
}
else if (status == 2) // 已拒绝
{
// 退还待提现收益
await _unitOfWork.GetDbClient().Updateable<CoreCmsUser>()
.SetColumns(u => u.pending_earnings == u.pending_earnings + withdrawRecord.amount)
.Where(u => u.id == withdrawRecord.user_id)
.ExecuteCommandAsync();
}
_unitOfWork.CommitTran();
jm.status = true;
jm.msg = status == 1 ? "已标记为已到账" : (status == 2 ? "已拒绝该申请" : "处理成功");
}
catch
{
_unitOfWork.RollbackTran();
throw;
}
}
catch (Exception ex)
{
jm.status = false;
jm.msg = "处理失败:" + ex.Message;
}
return jm;
}
#endregion
#region
/// <summary>
/// 重写异步插入方法
/// </summary>
public new async Task<AdminUiCallBack> InsertAsync(SQEarningsRecord entity)
{
return await _dal.InsertAsync(entity);
}
/// <summary>
/// 重写异步更新方法
/// </summary>
public new async Task<AdminUiCallBack> UpdateAsync(SQEarningsRecord entity)
{
return await _dal.UpdateAsync(entity);
}
/// <summary>
/// 重写删除指定ID的数据
/// </summary>
public new async Task<AdminUiCallBack> DeleteByIdAsync(object id)
{
return await _dal.DeleteByIdAsync(id);
}
/// <summary>
/// 重写删除指定ID集合的数据(批量删除)
/// </summary>
public new async Task<AdminUiCallBack> DeleteByIdsAsync(int[] ids)
{
return await _dal.DeleteByIdsAsync(ids);
}
#endregion
#region
/// <summary>
/// 重写根据条件查询分页数据
/// </summary>
public new async Task<IPageList<SQEarningsRecord>> QueryPageAsync(
Expression<Func<SQEarningsRecord, bool>> predicate,
Expression<Func<SQEarningsRecord, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
int pageSize = 20, bool blUseNoLock = false)
{
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize, blUseNoLock);
}
#endregion
}
}