diff --git a/src/Api/TakeoutSaaS.AdminApi/Controllers/TenantsController.cs b/src/Api/TakeoutSaaS.AdminApi/Controllers/TenantsController.cs index 9919579..7afeb68 100644 --- a/src/Api/TakeoutSaaS.AdminApi/Controllers/TenantsController.cs +++ b/src/Api/TakeoutSaaS.AdminApi/Controllers/TenantsController.cs @@ -4,6 +4,7 @@ using Microsoft.AspNetCore.Mvc; using TakeoutSaaS.Application.App.Tenants.Commands; using TakeoutSaaS.Application.App.Tenants.Contracts; using TakeoutSaaS.Application.App.Tenants.Queries; +using TakeoutSaaS.Domain.Tenants.Enums; using TakeoutSaaS.Module.Authorization.Attributes; using TakeoutSaaS.Shared.Abstractions.Results; using TakeoutSaaS.Shared.Web.Api; @@ -22,6 +23,7 @@ public sealed class TenantsController(IMediator mediator) : BaseApiController /// 获取租户列表(用于下拉选择器)。 /// /// 关键字(租户名称/编码)。 + /// 租户状态过滤(可选)。 /// 页码(从 1 开始)。 /// 每页条数。 /// 取消标记。 @@ -31,6 +33,7 @@ public sealed class TenantsController(IMediator mediator) : BaseApiController [ProducesResponseType(typeof(ApiResponse>), StatusCodes.Status200OK)] public async Task>> List( [FromQuery] string? keyword, + [FromQuery] TenantStatus? status, [FromQuery] int page = 1, [FromQuery] int pageSize = 20, CancellationToken cancellationToken = default) @@ -39,6 +42,7 @@ public sealed class TenantsController(IMediator mediator) : BaseApiController var query = new ListTenantsQuery { Keyword = keyword, + Status = status, Page = page, PageSize = pageSize }; diff --git a/src/Application/TakeoutSaaS.Application/App/Tenants/Handlers/ListTenantsQueryHandler.cs b/src/Application/TakeoutSaaS.Application/App/Tenants/Handlers/ListTenantsQueryHandler.cs index 8db27b8..06f68b4 100644 --- a/src/Application/TakeoutSaaS.Application/App/Tenants/Handlers/ListTenantsQueryHandler.cs +++ b/src/Application/TakeoutSaaS.Application/App/Tenants/Handlers/ListTenantsQueryHandler.cs @@ -16,8 +16,8 @@ public sealed class ListTenantsQueryHandler(ITenantRepository tenantRepository) /// public async Task> Handle(ListTenantsQuery request, CancellationToken cancellationToken) { - // 1. 查询租户列表 - var tenants = await tenantRepository.GetAllAsync(request.Keyword, cancellationToken); + // 1. 查询租户列表(支持状态过滤) + var tenants = await tenantRepository.GetAllAsync(request.Keyword, request.Status, cancellationToken); // 2. 计算分页参数 var totalCount = tenants.Count; diff --git a/src/Application/TakeoutSaaS.Application/App/Tenants/Queries/ListTenantsQuery.cs b/src/Application/TakeoutSaaS.Application/App/Tenants/Queries/ListTenantsQuery.cs index 44a1920..3aaa8f5 100644 --- a/src/Application/TakeoutSaaS.Application/App/Tenants/Queries/ListTenantsQuery.cs +++ b/src/Application/TakeoutSaaS.Application/App/Tenants/Queries/ListTenantsQuery.cs @@ -1,5 +1,6 @@ using MediatR; using TakeoutSaaS.Application.App.Tenants.Contracts; +using TakeoutSaaS.Domain.Tenants.Enums; using TakeoutSaaS.Shared.Abstractions.Results; namespace TakeoutSaaS.Application.App.Tenants.Queries; @@ -14,6 +15,11 @@ public sealed record ListTenantsQuery : IRequest> /// public string? Keyword { get; init; } + /// + /// 租户状态过滤(可选)。 + /// + public TenantStatus? Status { get; init; } + /// /// 页码(从 1 开始)。 /// diff --git a/src/Domain/TakeoutSaaS.Domain/Tenants/Repositories/ITenantRepository.cs b/src/Domain/TakeoutSaaS.Domain/Tenants/Repositories/ITenantRepository.cs index 217555a..c23bb4c 100644 --- a/src/Domain/TakeoutSaaS.Domain/Tenants/Repositories/ITenantRepository.cs +++ b/src/Domain/TakeoutSaaS.Domain/Tenants/Repositories/ITenantRepository.cs @@ -1,5 +1,6 @@ using TakeoutSaaS.Domain.Billings.Entities; using TakeoutSaaS.Domain.Tenants.Entities; +using TakeoutSaaS.Domain.Tenants.Enums; namespace TakeoutSaaS.Domain.Tenants.Repositories; @@ -37,9 +38,10 @@ public interface ITenantRepository /// 获取所有租户列表(用于下拉选择器)。 /// /// 关键字(租户名称/编码)。 + /// 租户状态过滤(可选)。 /// 取消标记。 /// 租户列表。 - Task> GetAllAsync(string? keyword, CancellationToken cancellationToken = default); + Task> GetAllAsync(string? keyword, TenantStatus? status = null, CancellationToken cancellationToken = default); /// /// 获取租户详情(包含认证、订阅、套餐信息)。 diff --git a/src/Infrastructure/TakeoutSaaS.Infrastructure/App/Repositories/EfTenantRepository.cs b/src/Infrastructure/TakeoutSaaS.Infrastructure/App/Repositories/EfTenantRepository.cs index 6f33571..b0ab35e 100644 --- a/src/Infrastructure/TakeoutSaaS.Infrastructure/App/Repositories/EfTenantRepository.cs +++ b/src/Infrastructure/TakeoutSaaS.Infrastructure/App/Repositories/EfTenantRepository.cs @@ -1,6 +1,7 @@ using Microsoft.EntityFrameworkCore; using TakeoutSaaS.Domain.Billings.Entities; using TakeoutSaaS.Domain.Tenants.Entities; +using TakeoutSaaS.Domain.Tenants.Enums; using TakeoutSaaS.Domain.Tenants.Repositories; using TakeoutSaaS.Infrastructure.App.Persistence; @@ -55,21 +56,27 @@ public sealed class EfTenantRepository(TakeoutAdminDbContext context) : ITenantR } /// - public async Task> GetAllAsync(string? keyword, CancellationToken cancellationToken = default) + public async Task> GetAllAsync(string? keyword, TenantStatus? status = null, CancellationToken cancellationToken = default) { // 1. 构建基础查询 var query = context.Tenants .AsNoTracking() .Where(x => x.DeletedAt == null); - // 2. 应用关键字过滤 + // 2. 应用状态过滤 + if (status.HasValue) + { + query = query.Where(x => x.Status == status.Value); + } + + // 3. 应用关键字过滤 if (!string.IsNullOrWhiteSpace(keyword)) { var normalized = keyword.Trim(); query = query.Where(x => x.Name.Contains(normalized) || x.Code.Contains(normalized)); } - // 3. 返回列表 + // 4. 返回列表 return await query.OrderBy(x => x.Code).ToListAsync(cancellationToken); }