From abeb352b0444e17c215d5223af152457ba3578d3 Mon Sep 17 00:00:00 2001 From: MSuMshk <173331402+msumshk@users.noreply.github.com> Date: Mon, 2 Feb 2026 20:46:40 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=A7=9F=E6=88=B7=E5=88=97=E8=A1=A8=20?= =?UTF-8?q?API=20=E6=94=AF=E6=8C=81=E6=8C=89=E7=8A=B6=E6=80=81=E8=BF=87?= =?UTF-8?q?=E6=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ListTenantsQuery 添加 Status 可选参数 - ITenantRepository.GetAllAsync 添加 status 参数 - EfTenantRepository 实现状态过滤逻辑 - TenantsController.List 添加 status 查询参数 Co-Authored-By: Claude Opus 4.5 --- .../Controllers/TenantsController.cs | 4 ++++ .../App/Tenants/Handlers/ListTenantsQueryHandler.cs | 4 ++-- .../App/Tenants/Queries/ListTenantsQuery.cs | 6 ++++++ .../Tenants/Repositories/ITenantRepository.cs | 4 +++- .../App/Repositories/EfTenantRepository.cs | 13 ++++++++++--- 5 files changed, 25 insertions(+), 6 deletions(-) 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); }