using Fake.DependencyInjection; using Fake.EventBus; using Fake.UnitOfWork; using Oms.Application.Messaging; using Microsoft.Extensions.Logging; using Oms.Application.Integrations.SmallBagTrack; namespace Oms.Application.Messaging.OrderSideEffects; public sealed class OrderLifecycleTrackAppendEventHandler( ISmallBagTrackOrderClient trackClient, IUnitOfWorkManager unitOfWorkManager, ILogger logger) : IEventHandler, ITransientDependency { public async Task HandleAsync( OrderLifecycleTrackAppendIntegrationEvent @event, CancellationToken cancellationToken) { if (string.IsNullOrWhiteSpace(@event.OrderNo) || string.IsNullOrWhiteSpace(@event.TrackCode)) { logger.LogWarning( "Lifecycle track append skipped empty OrderNo/TrackCode OrderId={OrderId}", @event.OrderId); return; } using var unitOfWork = unitOfWorkManager.Begin(OmsOutboxUnitOfWork.Transactional()); try { await trackClient.AppendLifecycleTrackAsync( @event.OrderNo, @event.TrackCode, @event.Authorization, cancellationToken); } catch (Exception ex) { // 轨迹失败不反复打满队列;与原 Task.Run 吞异常策略一致 logger.LogWarning( ex, "Lifecycle track append failed OrderId={OrderId} OrderNo={OrderNo} TrackCode={TrackCode}", @event.OrderId, @event.OrderNo, @event.TrackCode); } await unitOfWork.CompleteAsync(cancellationToken); } }