using MediatR; using TakeoutSaaS.Application.App.Billings.Dto; using TakeoutSaaS.Application.App.Billings.Queries; using TakeoutSaaS.Domain.Tenants.Repositories; using TakeoutSaaS.Shared.Abstractions.Results; namespace TakeoutSaaS.Application.App.Billings.Handlers; /// /// 获取账单列表查询处理器。 /// public sealed class GetBillListQueryHandler( ITenantBillingRepository billingRepository, ITenantRepository tenantRepository) : IRequestHandler> { /// /// 处理获取账单列表请求。 /// /// 查询请求。 /// 取消标记。 /// 分页账单列表。 public async Task> Handle(GetBillListQuery request, CancellationToken cancellationToken) { // 1. 分页查询账单 var (bills, total) = await billingRepository.SearchPagedAsync( request.TenantId, request.Status, request.StartDate, request.EndDate, null, null, request.Keyword, request.PageNumber, request.PageSize, cancellationToken); // 2. 无数据直接返回 if (bills.Count == 0) { return new PagedResult([], request.PageNumber, request.PageSize, total); } // 3. 批量查询租户信息 var tenantIds = bills.Select(b => b.TenantId).Distinct().ToArray(); var tenants = await tenantRepository.FindByIdsAsync(tenantIds, cancellationToken); var tenantDict = tenants.ToDictionary(t => t.Id, t => t.Name); // 4. 映射 DTO var result = bills.Select(b => b.ToDto(tenantDict.GetValueOrDefault(b.TenantId))).ToList(); // 5. 返回分页结果 return new PagedResult(result, request.PageNumber, request.PageSize, total); } }