feat(admin-api): 实现 TD-001 和 TD-002 后端接口
TD-001 - PUT /api/admin/v1/tenants/{tenantId}:
- 新增 UpdateTenantCommand + UpdateTenantCommandHandler
- Controller 新增 Update 端点(tenant:update 权限)
- 校验:租户存在、name 非空、name/contactPhone 冲突返回 409
- 仓储扩展:ITenantRepository.ExistsByNameAsync
TD-002 - GET /api/admin/v1/tenants/{tenantId}/quota-usage-history:
- 新增 CQRS Query/Handler/DTO/Validator
- 支持分页(Page>=1, PageSize 1~100)
- 支持时间范围和 QuotaType 过滤
- 新增 tenant_quota_usage_histories 表(含迁移)
- 写入点:CheckTenantQuotaCommandHandler + PurchaseQuotaPackageCommandHandler
构建验证:dotnet build 通过
数据库迁移:已应用 20251218121053_AddTenantQuotaUsageHistories
This commit is contained in:
@@ -0,0 +1,46 @@
|
||||
using TakeoutSaaS.Domain.Tenants.Enums;
|
||||
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||
|
||||
namespace TakeoutSaaS.Domain.Tenants.Entities;
|
||||
|
||||
/// <summary>
|
||||
/// 租户配额使用历史记录(用于追踪配额上下限与使用量的时间序列变化)。
|
||||
/// </summary>
|
||||
public sealed class TenantQuotaUsageHistory : MultiTenantEntityBase
|
||||
{
|
||||
/// <summary>
|
||||
/// 配额类型。
|
||||
/// </summary>
|
||||
public TenantQuotaType QuotaType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 已使用值(记录时刻的快照)。
|
||||
/// </summary>
|
||||
public decimal UsedValue { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 限额值(记录时刻的快照)。
|
||||
/// </summary>
|
||||
public decimal LimitValue { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 记录时间(UTC)。
|
||||
/// </summary>
|
||||
public DateTime RecordedAt { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 变更类型。
|
||||
/// </summary>
|
||||
public TenantQuotaUsageHistoryChangeType ChangeType { get; set; } = TenantQuotaUsageHistoryChangeType.Snapshot;
|
||||
|
||||
/// <summary>
|
||||
/// 变更量(可选)。
|
||||
/// </summary>
|
||||
public decimal? ChangeAmount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 变更原因(可选)。
|
||||
/// </summary>
|
||||
public string? ChangeReason { get; set; }
|
||||
}
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
namespace TakeoutSaaS.Domain.Tenants.Enums;
|
||||
|
||||
/// <summary>
|
||||
/// 租户配额使用历史变更类型。
|
||||
/// </summary>
|
||||
public enum TenantQuotaUsageHistoryChangeType
|
||||
{
|
||||
/// <summary>
|
||||
/// 初始化(首次建立配额基线)。
|
||||
/// </summary>
|
||||
Init = 0,
|
||||
|
||||
/// <summary>
|
||||
/// 快照(定时或手动记录的当前状态)。
|
||||
/// </summary>
|
||||
Snapshot = 1,
|
||||
|
||||
/// <summary>
|
||||
/// 增加(剩余可用额度增加,例如购买配额包、重置等)。
|
||||
/// </summary>
|
||||
Increase = 2,
|
||||
|
||||
/// <summary>
|
||||
/// 减少(剩余可用额度减少,例如配额消耗等)。
|
||||
/// </summary>
|
||||
Decrease = 3
|
||||
}
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
using TakeoutSaaS.Domain.Tenants.Entities;
|
||||
|
||||
namespace TakeoutSaaS.Domain.Tenants.Repositories;
|
||||
|
||||
/// <summary>
|
||||
/// 租户配额使用历史仓储。
|
||||
/// </summary>
|
||||
public interface ITenantQuotaUsageHistoryRepository
|
||||
{
|
||||
/// <summary>
|
||||
/// 新增历史记录。
|
||||
/// </summary>
|
||||
/// <param name="history">历史记录实体。</param>
|
||||
/// <param name="cancellationToken">取消标记。</param>
|
||||
Task AddAsync(TenantQuotaUsageHistory history, CancellationToken cancellationToken = default);
|
||||
|
||||
/// <summary>
|
||||
/// 持久化。
|
||||
/// </summary>
|
||||
/// <param name="cancellationToken">取消标记。</param>
|
||||
Task SaveChangesAsync(CancellationToken cancellationToken = default);
|
||||
}
|
||||
|
||||
@@ -84,6 +84,15 @@ public interface ITenantRepository
|
||||
/// <returns>存在返回 true,否则 false。</returns>
|
||||
Task<bool> ExistsByCodeAsync(string code, CancellationToken cancellationToken = default);
|
||||
|
||||
/// <summary>
|
||||
/// 判断租户名称是否存在(支持排除指定租户)。
|
||||
/// </summary>
|
||||
/// <param name="name">租户名称。</param>
|
||||
/// <param name="excludeTenantId">排除的租户 ID(用于更新场景)。</param>
|
||||
/// <param name="cancellationToken">取消标记。</param>
|
||||
/// <returns>存在返回 true,否则 false。</returns>
|
||||
Task<bool> ExistsByNameAsync(string name, long? excludeTenantId = null, CancellationToken cancellationToken = default);
|
||||
|
||||
/// <summary>
|
||||
/// 判断联系人手机号是否存在。
|
||||
/// </summary>
|
||||
|
||||
Reference in New Issue
Block a user