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);
}