using MediatR; using TakeoutSaaS.Application.App.Deliveries.Dto; using TakeoutSaaS.Application.App.Deliveries.Queries; using TakeoutSaaS.Domain.Deliveries.Entities; using TakeoutSaaS.Domain.Deliveries.Repositories; using TakeoutSaaS.Shared.Abstractions.Tenancy; namespace TakeoutSaaS.Application.App.Deliveries.Handlers; /// /// 配送单详情查询处理器。 /// public sealed class GetDeliveryOrderByIdQueryHandler( IDeliveryRepository deliveryRepository, ITenantProvider tenantProvider) : IRequestHandler { private readonly IDeliveryRepository _deliveryRepository = deliveryRepository; private readonly ITenantProvider _tenantProvider = tenantProvider; /// public async Task Handle(GetDeliveryOrderByIdQuery request, CancellationToken cancellationToken) { var tenantId = _tenantProvider.GetCurrentTenantId(); var order = await _deliveryRepository.FindByIdAsync(request.DeliveryOrderId, tenantId, cancellationToken); if (order == null) { return null; } var events = await _deliveryRepository.GetEventsAsync(order.Id, tenantId, cancellationToken); return MapToDto(order, events); } private static DeliveryOrderDto MapToDto(DeliveryOrder deliveryOrder, IReadOnlyList events) => new() { Id = deliveryOrder.Id, TenantId = deliveryOrder.TenantId, OrderId = deliveryOrder.OrderId, Provider = deliveryOrder.Provider, ProviderOrderId = deliveryOrder.ProviderOrderId, Status = deliveryOrder.Status, DeliveryFee = deliveryOrder.DeliveryFee, CourierName = deliveryOrder.CourierName, CourierPhone = deliveryOrder.CourierPhone, DispatchedAt = deliveryOrder.DispatchedAt, PickedUpAt = deliveryOrder.PickedUpAt, DeliveredAt = deliveryOrder.DeliveredAt, FailureReason = deliveryOrder.FailureReason, CreatedAt = deliveryOrder.CreatedAt, Events = events.Select(x => new DeliveryEventDto { Id = x.Id, DeliveryOrderId = x.DeliveryOrderId, EventType = x.EventType, Message = x.Message, OccurredAt = x.OccurredAt, Payload = x.Payload }).ToList() }; }