From 932ca3d1c553647c6cdc530872bc86ab25f1f2e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=86=9B?= <2357729423@qq.com> Date: Mon, 15 Apr 2024 19:02:01 +0800 Subject: [PATCH] opt --- .../TrackChangeAfterUpdateOrderEvent.cs | 2 +- .../Events/TrackPushEvent.cs | 5 ++++ .../EventHandlers/TrackPushEventHandler.cs | 19 ++++++++++-- .../EventHandlers/TrackUpsertEventHandler.cs | 10 +++---- .../ProvideServices/TrackPushService.cs | 14 ++++----- .../ITrackDetailsRepository.cs | 2 -- src/SJZY.Track.Domain/Queries/IBasicQuery.cs | 3 ++ .../Queries/BasicQuery.cs | 6 ++++ .../Repositories/TrackDetailsRepository.cs | 29 ------------------- 9 files changed, 43 insertions(+), 47 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Events/TrackChangeAfterUpdateOrderEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackChangeAfterUpdateOrderEvent.cs index 544c98b1..47a507d2 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackChangeAfterUpdateOrderEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackChangeAfterUpdateOrderEvent.cs @@ -5,7 +5,7 @@ public class TrackChangeAfterUpdateOrderEvent /// /// 订单Id /// - public int[] OrderIds { get; set; } + public int[] OrderIds { get; set; } = null!; /// /// 是否删除引起的更新 diff --git a/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs index 9d98dcf1..43156556 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs @@ -2,6 +2,11 @@ public class TrackPushEvent { + /// + /// 重试次数 + /// + public int RetryNum { get; set; } + /// /// 操作类型 /// diff --git a/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs index 65e60991..1334e3ce 100644 --- a/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs @@ -20,15 +20,17 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe private readonly ITrackPushRecordsRepository _trackPushRecordsRepository; private readonly IOrderRepository _orderRepository; private readonly ITrackPushCacheService _trackPushCacheService; + private readonly ICapPublisher _capPublisher; public TrackPushEventHandler(IHttpClientProxy httpClientProxy, ITrackPushRecordsRepository trackPushRecordsRepository, - IOrderRepository orderRepository, ITrackPushCacheService trackPushCacheService) + IOrderRepository orderRepository, ITrackPushCacheService trackPushCacheService, ICapPublisher capPublisher) { _httpClientProxy = httpClientProxy; _trackPushRecordsRepository = trackPushRecordsRepository; _orderRepository = orderRepository; _trackPushCacheService = trackPushCacheService; + _capPublisher = capPublisher; } [CapSubscribe(GlobalConst.TrackPushSubscribe, Group = GlobalConst.TrackPushSubscribe)] @@ -103,6 +105,19 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe throw new ArgumentOutOfRangeException(); } + if (!log.IsSuccess) + { + if (@event.RetryNum < 3) + { + // 1, 2, 4min + await _capPublisher.PublishDelayAsync( + TimeSpan.FromSeconds((1 << @event.RetryNum) * 60), + GlobalConst.TrackPushSubscribe, @event); + @event.RetryNum++; + return; + } + } + // 往es 写推送日志 await _trackPushRecordsRepository.AddAsync(log); @@ -169,7 +184,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe Extra = config.ExpandFieldsValue }; - var body = new TrackPushInput() + var body = new TrackPushInput { OrderNo = @event.OrderNo, }; diff --git a/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs index 661848b9..8059fcf6 100644 --- a/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs @@ -105,7 +105,6 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe if (track != null && @event.IsAdd!.Value) return; // 存在不让创建 } - // step1、upsert es轨迹 if (track == default) { track = new TrackDetailsIndex @@ -159,8 +158,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe var trackPushEvent = new TrackPushEvent { OptionType = track.Id.IsNullOrWhiteSpace() ? OptionType.新增 : OptionType.修改, - OrderId = track.OrderId, - OrderNo = track.OrderNo, + OrderId = order.OrderId, TrackStatus = track.TrackStatus, TrackCode = track.TrackCode, TrackContent = track.TrackContent, @@ -174,6 +172,10 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe var firstTrack = insertTracks.FirstOrDefault(); if (firstTrack == null) return; + + // step1、upsert es轨迹 + await _trackDetailsRepository.AddManyAsync(insertTracks); + // step3、触发订单主表更新事件(异步) await _capPublisher.PublishAsync(GlobalConst.TrackChangeAfterUpdateOrderSubscribe, new TrackChangeAfterUpdateOrderEvent @@ -187,7 +189,5 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe TrackTime = firstTrack.TrackTime, TrackTimeZone = firstTrack.TrackTimeZone }); - - await _trackDetailsRepository.AddManyAsync(insertTracks); } } \ No newline at end of file diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs index ac2d5277..4a0ef260 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs @@ -43,18 +43,16 @@ public class TrackPushService : ApplicationService { input.OrderNos = input.OrderNos.Where(x => !x.IsNullOrWhiteSpace()).Distinct().ToList(); // 单号去重、去空 - var orders = await _orderRepository.GetListAsync(x => - x.OrderType == input.OrderType && input.OrderNos.Contains(x.OrderNo), x => new - { - x.Id, x.OrderNo, x.OrderType, x.SubSystemId, x.CustomId - }); + var orderIds = await _orderRepository.GetArrayAsync(x => + x.OrderType == input.OrderType && input.OrderNos.Contains(x.OrderNo), x => x.Id); - if (orders.Count == 0) + if (!orderIds.Any()) { - throw new BusinessException(message: "一个推送配置都不存在"); + throw new BusinessException(message: "一个订单都不存在"); } - var tracks = await _trackDetailsRepository.GetListAsync(input.OrderType, input.OrderNos, input.TrackCode); + var tracks = await _trackDetailsRepository.GetListAsync(orderIds, input.TrackCode); + tracks = tracks.DistinctBy(x => x.OrderId).ToList(); if (tracks.Count == 0) { diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs index d32ed593..b35145a4 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs @@ -19,8 +19,6 @@ public interface ITrackDetailsRepository Task> GetListAsync(int orderType, List orderNos); - Task> GetListAsync(int orderType, List orderNos, string trackCode); - Task<(List list, long total)> GetListAsync(TrackDetailsQueryInput input); Task> GetListAsync(int orderId); diff --git a/src/SJZY.Track.Domain/Queries/IBasicQuery.cs b/src/SJZY.Track.Domain/Queries/IBasicQuery.cs index 460e58be..d2bddef3 100644 --- a/src/SJZY.Track.Domain/Queries/IBasicQuery.cs +++ b/src/SJZY.Track.Domain/Queries/IBasicQuery.cs @@ -22,6 +22,9 @@ public interface IBasicQuery where T : IEntity Task> GetListAsync(Expression> whereExpression, Expression> resultExpression); + Task GetArrayAsync(Expression> whereExpression, + Expression> resultExpression); + /// /// count /// diff --git a/src/SJZY.Track.Repository/Queries/BasicQuery.cs b/src/SJZY.Track.Repository/Queries/BasicQuery.cs index d8003be8..23a3abf1 100644 --- a/src/SJZY.Track.Repository/Queries/BasicQuery.cs +++ b/src/SJZY.Track.Repository/Queries/BasicQuery.cs @@ -24,4 +24,10 @@ public class BasicQuery : SimpleClient, IBasicQuery where T : class, IE { return await Context.Queryable().Where(whereExpression).Select(resultExpression).ToListAsync(); } + + public async Task GetArrayAsync(Expression> whereExpression, + Expression> resultExpression) + { + return await Context.Queryable().Where(whereExpression).Select(resultExpression).ToArrayAsync(); + } } \ No newline at end of file diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs index d1345e90..61950329 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs @@ -104,8 +104,6 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract tracks) { - if (!tracks.Any()) return; - // 按天写入es var r = await Context.IndexManyAsync(tracks, tracks.First().IndexName); @@ -141,33 +139,6 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract> GetListAsync(int orderType, List orderNos, string trackCode) - { - if (orderNos.Count < 1) return new List(); - - var data = await Context.SearchAsync(x => x - .Source(s => s.Includes(fd => fd - .Field(f => f.OrderId) - .Field(f => f.OrderNo) - .Field(f => f.TrackStatus) - .Field(f => f.TrackCode) - .Field(f => f.TrackContent) - .Field(f => f.TrackPlace) - .Field(f => f.TrackTime) - .Field(f => f.TrackTimeZone) - )) - .Query(q => - q.Terms(t => t - .Field(f => f.OrderNo.Suffix("keyword")) - .Terms(orderNos)) - && q.Term(f => f.OrderType, orderType) - && q.Term(f => f.TrackCode.Suffix("keyword"), trackCode) - ) - ); - - return data.Documents.ToList(); - } - public async Task> GetListAsync(int orderId) { var data = await Context.SearchAsync(x => x