Files
Yi.Framework/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Entities/PremiumPackageAggregateRoot.cs
chenchun 3e75792e43 fix: 修复bug - 在可用性检查中支持忽略剩余令牌校验,避免负数用量包被错误过滤
- 将 PremiumPackageAggregateRoot.IsAvailable 增加参数 isVerifyRemainingToken=true,保持默认行为不变,允许按需跳过对 RemainingTokens 的校验。
- 在 UsageStatisticsService 中计算可用包时改为使用 p.IsAvailable(false),仅过滤过期或禁用的包,但不再因 RemainingTokens 为负而将包排除,从而保证统计(如 TotalTokens/RemainingTokens 汇总)包含负数用量的包,修正统计错误。

修改文件:
- Yi.Framework.AiHub.Domain/Entities/PremiumPackageAggregateRoot.cs
- Yi.Framework.AiHub.Application/Services/UsageStatisticsService.cs
2025-10-29 16:34:53 +08:00

134 lines
2.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using SqlSugar;
using Volo.Abp.Domain.Entities.Auditing;
namespace Yi.Framework.AiHub.Domain.Entities;
/// <summary>
/// 尊享包聚合根
/// 用于给VIP扩展额外购买尊享token包
/// </summary>
[SugarTable("Ai_PremiumPackage")]
[SugarIndex($"index_{nameof(UserId)}", nameof(UserId), OrderByType.Asc)]
public class PremiumPackageAggregateRoot : FullAuditedAggregateRoot<Guid>
{
public PremiumPackageAggregateRoot()
{
}
public PremiumPackageAggregateRoot(Guid userId, long totalTokens, string packageName)
{
UserId = userId;
TotalTokens = totalTokens;
RemainingTokens = totalTokens;
PackageName = packageName;
IsActive = true;
}
/// <summary>
/// 用户ID
/// </summary>
public Guid UserId { get; set; }
/// <summary>
/// 包名称
/// </summary>
public string PackageName { get; set; }
/// <summary>
/// 总用量总token数
/// </summary>
public long TotalTokens { get; set; }
/// <summary>
/// 剩余用量剩余token数
/// </summary>
public long RemainingTokens { get; set; }
/// <summary>
/// 已使用token数
/// </summary>
public long UsedTokens { get; set; }
/// <summary>
/// 到期时间
/// </summary>
public DateTime? ExpireDateTime { get; set; }
/// <summary>
/// 是否激活
/// </summary>
public bool IsActive { get; set; }
/// <summary>
/// 购买金额
/// </summary>
public decimal PurchaseAmount { get; set; }
/// <summary>
/// 备注
/// </summary>
public string? Remark { get; set; }
/// <summary>
/// 消耗token
/// </summary>
/// <param name="tokenCount">消耗的token数量</param>
/// <returns>是否消耗成功</returns>
public bool ConsumeTokens(long tokenCount)
{
RemainingTokens -= tokenCount;
UsedTokens += tokenCount;
return true;
}
/// <summary>
/// 检查是否可用
/// </summary>
/// <returns>是否可用</returns>
public bool IsAvailable(bool isVerifyRemainingToken=true)
{
if (!IsActive)
{
return false;
}
if (isVerifyRemainingToken&&RemainingTokens <= 0)
{
return false;
}
if (ExpireDateTime.HasValue && ExpireDateTime.Value < DateTime.Now)
{
return false;
}
return true;
}
/// <summary>
/// 停用尊享包
/// </summary>
public void Deactivate()
{
IsActive = false;
}
/// <summary>
/// 激活尊享包
/// </summary>
public void Activate()
{
IsActive = true;
}
/// <summary>
/// 设置到期时间
/// </summary>
/// <param name="expireDateTime">到期时间</param>
public void SetExpireDateTime(DateTime expireDateTime)
{
ExpireDateTime = expireDateTime;
}
}