feat: tenants 列表支持名称/联系人/电话/认证状态过滤
This commit is contained in:
@@ -15,26 +15,47 @@ public sealed class SearchTenantsQueryHandler(ITenantRepository tenantRepository
|
||||
/// <inheritdoc />
|
||||
public async Task<PagedResult<TenantDto>> Handle(SearchTenantsQuery request, CancellationToken cancellationToken)
|
||||
{
|
||||
// 1. 查询租户列表
|
||||
var tenants = await tenantRepository.SearchAsync(request.Status, request.Keyword, cancellationToken);
|
||||
var total = tenants.Count;
|
||||
// 1. 按条件分页查询租户
|
||||
var (tenants, total) = await tenantRepository.SearchPagedAsync(
|
||||
request.Status,
|
||||
request.VerificationStatus,
|
||||
request.Name,
|
||||
request.ContactName,
|
||||
request.ContactPhone,
|
||||
request.Keyword,
|
||||
request.Page,
|
||||
request.PageSize,
|
||||
cancellationToken);
|
||||
|
||||
// 2. 分页
|
||||
var paged = tenants
|
||||
.Skip((request.Page - 1) * request.PageSize)
|
||||
.Take(request.PageSize)
|
||||
.ToList();
|
||||
|
||||
// 3. 映射 DTO(带订阅与认证)
|
||||
var result = new List<TenantDto>(paged.Count);
|
||||
foreach (var tenant in paged)
|
||||
// 2. (空行后) 无数据直接返回
|
||||
if (tenants.Count == 0)
|
||||
{
|
||||
var subscription = await tenantRepository.GetActiveSubscriptionAsync(tenant.Id, cancellationToken);
|
||||
var verification = await tenantRepository.GetVerificationProfileAsync(tenant.Id, cancellationToken);
|
||||
return new PagedResult<TenantDto>([], request.Page, request.PageSize, total);
|
||||
}
|
||||
|
||||
// 3. (空行后) 批量查询订阅与实名资料(避免 N+1)
|
||||
var tenantIds = tenants.Select(x => x.Id).ToArray();
|
||||
var subscriptionsTask = tenantRepository.GetSubscriptionsAsync(tenantIds, cancellationToken);
|
||||
var verificationsTask = tenantRepository.GetVerificationProfilesAsync(tenantIds, cancellationToken);
|
||||
await Task.WhenAll(subscriptionsTask, verificationsTask);
|
||||
|
||||
// 4. (空行后) 构建订阅与实名资料映射
|
||||
var subscriptionByTenantId = (await subscriptionsTask)
|
||||
.GroupBy(x => x.TenantId)
|
||||
.ToDictionary(x => x.Key, x => x.FirstOrDefault());
|
||||
var verificationByTenantId = (await verificationsTask)
|
||||
.ToDictionary(x => x.TenantId);
|
||||
|
||||
// 5. (空行后) 映射 DTO(带订阅与认证)
|
||||
var result = new List<TenantDto>(tenants.Count);
|
||||
foreach (var tenant in tenants)
|
||||
{
|
||||
subscriptionByTenantId.TryGetValue(tenant.Id, out var subscription);
|
||||
verificationByTenantId.TryGetValue(tenant.Id, out var verification);
|
||||
result.Add(TenantMapping.ToDto(tenant, subscription, verification));
|
||||
}
|
||||
|
||||
// 4. 返回分页结果
|
||||
// 6. (空行后) 返回分页结果
|
||||
return new PagedResult<TenantDto>(result, request.Page, request.PageSize, total);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user