using MediatR;
using Microsoft.Extensions.Logging;
using TakeoutSaaS.Application.App.Deliveries.Commands;
using TakeoutSaaS.Application.App.Deliveries.Dto;
using TakeoutSaaS.Domain.Deliveries.Entities;
using TakeoutSaaS.Domain.Deliveries.Repositories;
namespace TakeoutSaaS.Application.App.Deliveries.Handlers;
///
/// 创建配送单命令处理器。
///
public sealed class CreateDeliveryOrderCommandHandler(IDeliveryRepository deliveryRepository, ILogger logger)
: IRequestHandler
{
private readonly IDeliveryRepository _deliveryRepository = deliveryRepository;
private readonly ILogger _logger = logger;
///
public async Task Handle(CreateDeliveryOrderCommand request, CancellationToken cancellationToken)
{
var deliveryOrder = new DeliveryOrder
{
OrderId = request.OrderId,
Provider = request.Provider,
ProviderOrderId = request.ProviderOrderId?.Trim(),
Status = request.Status,
DeliveryFee = request.DeliveryFee,
CourierName = request.CourierName?.Trim(),
CourierPhone = request.CourierPhone?.Trim(),
DispatchedAt = request.DispatchedAt,
PickedUpAt = request.PickedUpAt,
DeliveredAt = request.DeliveredAt,
FailureReason = request.FailureReason?.Trim()
};
await _deliveryRepository.AddDeliveryOrderAsync(deliveryOrder, cancellationToken);
await _deliveryRepository.SaveChangesAsync(cancellationToken);
_logger.LogInformation("创建配送单 {DeliveryOrderId} 对应订单 {OrderId}", deliveryOrder.Id, deliveryOrder.OrderId);
return MapToDto(deliveryOrder, []);
}
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()
};
}