115 lines
4.5 KiB
C#
115 lines
4.5 KiB
C#
using Mapster;
|
||
using Microsoft.AspNetCore.Authorization;
|
||
using Microsoft.AspNetCore.Mvc;
|
||
using Volo.Abp.Application.Services;
|
||
using Volo.Abp.Users;
|
||
using Yi.Framework.AiHub.Application.Contracts.Dtos.Recharge;
|
||
using Yi.Framework.AiHub.Application.Contracts.IServices;
|
||
using Yi.Framework.AiHub.Domain.Entities;
|
||
using Yi.Framework.AiHub.Domain.Managers;
|
||
using Yi.Framework.AiHub.Domain.Shared.Consts;
|
||
using Yi.Framework.AiHub.Domain.Shared.Enums;
|
||
using Yi.Framework.Rbac.Application.Contracts.IServices;
|
||
using Yi.Framework.SqlSugarCore.Abstractions;
|
||
|
||
namespace Yi.Framework.AiHub.Application.Services
|
||
{
|
||
public class RechargeService : ApplicationService, IRechargeService
|
||
{
|
||
private readonly ISqlSugarRepository<AiRechargeAggregateRoot> _repository;
|
||
private readonly ICurrentUser _currentUser;
|
||
private readonly IUserService _userService;
|
||
private readonly IRoleService _roleService;
|
||
private readonly AiRechargeManager _aiMessageManager;
|
||
|
||
public RechargeService(
|
||
ISqlSugarRepository<AiRechargeAggregateRoot> repository,
|
||
ICurrentUser currentUser,
|
||
IUserService userService, IRoleService roleService, AiRechargeManager aiMessageManager)
|
||
{
|
||
_repository = repository;
|
||
_currentUser = currentUser;
|
||
_userService = userService;
|
||
_roleService = roleService;
|
||
_aiMessageManager = aiMessageManager;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 查询已登录的账户充值记录
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
[Route("recharge/account")]
|
||
[Authorize]
|
||
public async Task<List<RechargeGetListOutput>> GetListByAccountAsync()
|
||
{
|
||
var userId = CurrentUser.Id;
|
||
var entities = await _repository._DbQueryable.Where(x => x.UserId == userId)
|
||
.OrderByDescending(x => x.CreationTime)
|
||
.ToListAsync();
|
||
var output = entities.Adapt<List<RechargeGetListOutput>>();
|
||
return output;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 给用户充值VIP
|
||
/// </summary>
|
||
/// <param name="input">充值输入参数</param>
|
||
/// <returns></returns>
|
||
[HttpPost("recharge/vip")]
|
||
public async Task RechargeVipAsync(RechargeCreateInput input)
|
||
{
|
||
DateTime? expireDateTime = null;
|
||
|
||
// 如果传入了月数,计算过期时间
|
||
if (input.Months.HasValue && input.Months.Value > 0)
|
||
{
|
||
// 直接查询该用户最大的过期时间
|
||
var maxExpireTime = await _repository._DbQueryable
|
||
.Where(x => x.RechargeType == RechargeTypeEnum.Vip)
|
||
.Where(x => x.UserId == input.UserId && x.ExpireDateTime.HasValue)
|
||
.MaxAsync(x => x.ExpireDateTime);
|
||
|
||
// 如果最大过期时间大于现在时间,从最大过期时间开始计算
|
||
// 否则从当天开始计算
|
||
DateTime baseDateTime = maxExpireTime.HasValue && maxExpireTime.Value > DateTime.Now
|
||
? maxExpireTime.Value
|
||
: DateTime.Now;
|
||
// 计算新的过期时间
|
||
expireDateTime = baseDateTime.AddMonths(input.Months.Value);
|
||
}
|
||
// 如果月数为空或0,表示永久VIP,ExpireDateTime保持为null
|
||
|
||
// 创建充值记录
|
||
var rechargeRecord = new AiRechargeAggregateRoot
|
||
{
|
||
UserId = input.UserId,
|
||
RechargeAmount = input.RechargeAmount,
|
||
Content = input.Content,
|
||
ExpireDateTime = expireDateTime,
|
||
Remark = input.Remark,
|
||
ContactInfo = input.ContactInfo,
|
||
RechargeType = RechargeTypeEnum.Vip
|
||
};
|
||
|
||
// 保存充值记录到数据库
|
||
await _repository.InsertAsync(rechargeRecord);
|
||
|
||
// 使用UserService给用户添加VIP角色
|
||
await _userService.AddUserRoleByRoleCodeAsync(input.UserId,
|
||
new List<string>() { AiHubConst.VipRole, "default" });
|
||
}
|
||
|
||
/// <summary>
|
||
/// 移除用户vip及角色
|
||
/// </summary>
|
||
[RemoteService(isEnabled: false)]
|
||
public async Task RemoveVipRoleByExpireAsync()
|
||
{
|
||
var expiredUserIds = await _aiMessageManager.RemoveVipByExpireAsync();
|
||
if (expiredUserIds is not null)
|
||
{
|
||
await _roleService.RemoveUserRoleByRoleCodeAsync(expiredUserIds, AiHubConst.VipRole);
|
||
}
|
||
}
|
||
}
|
||
} |