Files
TakeoutSaaS.AdminApi/src/Application/TakeoutSaaS.Application/App/Deliveries/Handlers/CreateDeliveryOrderCommandHandler.cs

71 lines
2.9 KiB
C#

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;
/// <summary>
/// 创建配送单命令处理器。
/// </summary>
public sealed class CreateDeliveryOrderCommandHandler(IDeliveryRepository deliveryRepository, ILogger<CreateDeliveryOrderCommandHandler> logger)
: IRequestHandler<CreateDeliveryOrderCommand, DeliveryOrderDto>
{
private readonly IDeliveryRepository _deliveryRepository = deliveryRepository;
private readonly ILogger<CreateDeliveryOrderCommandHandler> _logger = logger;
/// <inheritdoc />
public async Task<DeliveryOrderDto> 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<DeliveryEvent> 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()
};
}