diff --git a/src/Api/TakeoutSaaS.AdminApi/Controllers/TenantsController.cs b/src/Api/TakeoutSaaS.AdminApi/Controllers/TenantsController.cs index ef06c54..6ca9776 100644 --- a/src/Api/TakeoutSaaS.AdminApi/Controllers/TenantsController.cs +++ b/src/Api/TakeoutSaaS.AdminApi/Controllers/TenantsController.cs @@ -21,22 +21,31 @@ public sealed class TenantsController(IMediator mediator) : BaseApiController /// 获取租户列表(用于下拉选择器)。 /// /// 关键字(租户名称/编码)。 + /// 页码(从 1 开始)。 + /// 每页条数。 /// 取消标记。 - /// 租户列表。 + /// 租户分页列表。 [HttpGet] [PermissionAuthorize("tenant:read")] - [ProducesResponseType(typeof(ApiResponse>), StatusCodes.Status200OK)] - public async Task>> List( + [ProducesResponseType(typeof(ApiResponse>), StatusCodes.Status200OK)] + public async Task>> List( [FromQuery] string? keyword, - CancellationToken cancellationToken) + [FromQuery] int page = 1, + [FromQuery] int pageSize = 20, + CancellationToken cancellationToken = default) { // 1. 构造查询 - var query = new ListTenantsQuery { Keyword = keyword }; + var query = new ListTenantsQuery + { + Keyword = keyword, + Page = page, + PageSize = pageSize + }; // 2. 执行查询 var result = await mediator.Send(query, cancellationToken); - // 3. 返回租户列表 - return ApiResponse>.Ok(result); + // 3. 返回租户分页列表 + return ApiResponse>.Ok(result); } } diff --git a/src/Application/TakeoutSaaS.Application/App/Tenants/Handlers/ListTenantsQueryHandler.cs b/src/Application/TakeoutSaaS.Application/App/Tenants/Handlers/ListTenantsQueryHandler.cs index c511ae2..672db5a 100644 --- a/src/Application/TakeoutSaaS.Application/App/Tenants/Handlers/ListTenantsQueryHandler.cs +++ b/src/Application/TakeoutSaaS.Application/App/Tenants/Handlers/ListTenantsQueryHandler.cs @@ -2,6 +2,7 @@ using MediatR; using TakeoutSaaS.Application.App.Tenants.Contracts; using TakeoutSaaS.Application.App.Tenants.Queries; using TakeoutSaaS.Domain.Tenants.Repositories; +using TakeoutSaaS.Shared.Abstractions.Results; namespace TakeoutSaaS.Application.App.Tenants.Handlers; @@ -9,16 +10,27 @@ namespace TakeoutSaaS.Application.App.Tenants.Handlers; /// 获取租户列表查询处理器。 /// public sealed class ListTenantsQueryHandler(ITenantRepository tenantRepository) - : IRequestHandler> + : IRequestHandler> { /// - public async Task> Handle(ListTenantsQuery request, CancellationToken cancellationToken) + public async Task> Handle(ListTenantsQuery request, CancellationToken cancellationToken) { // 1. 查询租户列表 var tenants = await tenantRepository.GetAllAsync(request.Keyword, cancellationToken); - // 2. 映射 DTO - return tenants.Select(t => new TenantListItemDto + // 2. 计算分页参数 + var totalCount = tenants.Count; + var page = Math.Max(1, request.Page); + var pageSize = Math.Clamp(request.PageSize, 1, 100); + + // 3. 应用分页 + var pagedTenants = tenants + .Skip((page - 1) * pageSize) + .Take(pageSize) + .ToArray(); + + // 4. 映射 DTO + var dtos = pagedTenants.Select(t => new TenantListItemDto { Id = t.Id, Code = t.Code, @@ -26,5 +38,8 @@ public sealed class ListTenantsQueryHandler(ITenantRepository tenantRepository) ShortName = t.ShortName, Status = t.Status }).ToArray(); + + // 5. 返回分页结果 + return new PagedResult(dtos, page, pageSize, totalCount); } } diff --git a/src/Application/TakeoutSaaS.Application/App/Tenants/Queries/ListTenantsQuery.cs b/src/Application/TakeoutSaaS.Application/App/Tenants/Queries/ListTenantsQuery.cs index 7ed6481..44a1920 100644 --- a/src/Application/TakeoutSaaS.Application/App/Tenants/Queries/ListTenantsQuery.cs +++ b/src/Application/TakeoutSaaS.Application/App/Tenants/Queries/ListTenantsQuery.cs @@ -1,15 +1,26 @@ using MediatR; using TakeoutSaaS.Application.App.Tenants.Contracts; +using TakeoutSaaS.Shared.Abstractions.Results; namespace TakeoutSaaS.Application.App.Tenants.Queries; /// /// 获取租户列表查询(用于下拉选择器)。 /// -public sealed record ListTenantsQuery : IRequest> +public sealed record ListTenantsQuery : IRequest> { /// /// 关键字(租户名称/编码)。 /// public string? Keyword { get; init; } + + /// + /// 页码(从 1 开始)。 + /// + public int Page { get; init; } = 1; + + /// + /// 每页条数。 + /// + public int PageSize { get; init; } = 20; }