feat: 增加尊享包商品及折扣逻辑,完善VIP与尊享包相关接口和数据返回

- 新增尊享包商品类型,支持 5000W 和 10000W Tokens
- 增加尊享包折扣计算与折扣后价格获取方法
- PayService 新增获取商品列表接口,支持尊享包折扣展示
- PayManager 支持尊享包订单金额按折扣计算,并新增获取用户累计充值金额方法
- OpenApiService Anthropic接口增加VIP与尊享包用量校验
- AiGateWayManager 增加尊享包Token扣减逻辑
- AiAccountService 返回用户VIP状态、到期时间及尊享包Token统计信息
This commit is contained in:
ccnetcore
2025-10-12 20:07:58 +08:00
parent 4d09243efd
commit a9e8b2b01f
9 changed files with 360 additions and 50 deletions

View File

@@ -31,6 +31,7 @@ public class AiGateWayManager : DomainService
private readonly AiMessageManager _aiMessageManager;
private readonly UsageStatisticsManager _usageStatisticsManager;
private readonly ISpecialCompatible _specialCompatible;
private PremiumPackageManager? _premiumPackageManager;
public AiGateWayManager(ISqlSugarRepository<AiAppAggregateRoot> aiAppRepository, ILogger<AiGateWayManager> logger,
AiMessageManager aiMessageManager, UsageStatisticsManager usageStatisticsManager,
@@ -43,6 +44,9 @@ public class AiGateWayManager : DomainService
_specialCompatible = specialCompatible;
}
private PremiumPackageManager PremiumPackageManager =>
_premiumPackageManager ??= LazyServiceProvider.LazyGetRequiredService<PremiumPackageManager>();
/// <summary>
/// 获取模型
/// </summary>
@@ -510,6 +514,17 @@ public class AiGateWayManager : DomainService
});
await _usageStatisticsManager.SetUsageAsync(userId.Value, request.Model, data.TokenUsage);
// 扣减尊享token包用量
var totalTokens = (data.TokenUsage?.InputTokens ?? 0) + (data.TokenUsage?.OutputTokens ?? 0);
if (totalTokens > 0)
{
var consumeSuccess = await PremiumPackageManager.ConsumeTokensAsync(userId.Value, totalTokens);
if (!consumeSuccess)
{
_logger.LogWarning($"用户 {userId.Value} 尊享token包扣减失败消耗token数: {totalTokens}");
}
}
}
await response.WriteAsJsonAsync(data, cancellationToken);
@@ -603,6 +618,20 @@ public class AiGateWayManager : DomainService
});
await _usageStatisticsManager.SetUsageAsync(userId, request.Model, tokenUsage);
// 扣减尊享token包用量
if (userId.HasValue && tokenUsage is not null)
{
var totalTokens = tokenUsage.TotalTokens??0;
if (totalTokens > 0)
{
var consumeSuccess = await PremiumPackageManager.ConsumeTokensAsync(userId.Value, totalTokens);
if (!consumeSuccess)
{
_logger.LogWarning($"用户 {userId.Value} 尊享token包扣减失败消耗token数: {totalTokens}");
}
}
}
}
#region Anthropic格式Http响应

View File

@@ -1,6 +1,7 @@
using System.Text.Json;
using Volo.Abp.Domain.Services;
using Volo.Abp.Users;
using Yi.Framework.AiHub.Domain.Entities;
using Yi.Framework.AiHub.Domain.Entities.Pay;
using Yi.Framework.AiHub.Domain.Shared.Enums;
using Yi.Framework.SqlSugarCore.Abstractions;
@@ -16,14 +17,18 @@ public class PayManager : DomainService
private readonly ISqlSugarRepository<PayNoticeRecordAggregateRoot, Guid> _payNoticeRepository;
private readonly ICurrentUser _currentUser;
private readonly ISqlSugarRepository<PayOrderAggregateRoot, Guid> _payOrderRepository;
private readonly ISqlSugarRepository<AiRechargeAggregateRoot, Guid> _rechargeRepository;
public PayManager(
ISqlSugarRepository<PayNoticeRecordAggregateRoot, Guid> payNoticeRepository,
ICurrentUser currentUser, ISqlSugarRepository<PayOrderAggregateRoot, Guid> payOrderRepository)
ICurrentUser currentUser,
ISqlSugarRepository<PayOrderAggregateRoot, Guid> payOrderRepository,
ISqlSugarRepository<AiRechargeAggregateRoot, Guid> rechargeRepository)
{
_payNoticeRepository = payNoticeRepository;
_currentUser = currentUser;
_payOrderRepository = payOrderRepository;
_rechargeRepository = rechargeRepository;
}
/// <summary>
@@ -39,6 +44,8 @@ public class PayManager : DomainService
throw new UserFriendlyException("用户未登录");
}
var userId = _currentUser.GetId();
// 如果是尊享包商品需要验证用户是否为VIP
if (goodsType.IsPremiumPackage())
{
@@ -53,13 +60,27 @@ public class PayManager : DomainService
// 获取商品信息
var goodsName = goodsType.GetDisplayName();
var totalAmount = goodsType.GetTotalAmount();
// 计算订单金额尊享包使用折扣价格VIP服务使用原价
decimal totalAmount;
if (goodsType.IsPremiumPackage())
{
// 获取用户累加充值金额
var totalRechargeAmount = await GetUserTotalRechargeAmountAsync(userId);
// 使用折扣后的价格
totalAmount = goodsType.GetDiscountedPrice(totalRechargeAmount);
}
else
{
// VIP服务使用原价
totalAmount = goodsType.GetTotalAmount();
}
// 创建订单实体
var payOrder = new PayOrderAggregateRoot
{
OutTradeNo = outTradeNo,
UserId = _currentUser.GetId(),
UserId = userId,
UserName = _currentUser.UserName ?? string.Empty,
TotalAmount = totalAmount,
GoodsName = goodsName,
@@ -145,4 +166,19 @@ public class PayManager : DomainService
}
return TradeStatusEnum.WAIT_TRADE;
}
/// <summary>
/// 获取用户累加充值金额
/// </summary>
/// <param name="userId">用户ID</param>
/// <returns>累加充值金额</returns>
public async Task<decimal> GetUserTotalRechargeAmountAsync(Guid userId)
{
var totalAmount = await _rechargeRepository
._DbQueryable
.Where(x => x.UserId == userId )
.SumAsync(x => x.RechargeAmount);
return totalAmount;
}
}