From c4ceca39c4db58fd7596544ce673dbaefe28568a Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Fri, 27 Dec 2024 18:05:41 +0800 Subject: [PATCH] =?UTF-8?q?update:=20=E5=A4=96=E9=83=A8=E6=89=8B=E5=8A=A8?= =?UTF-8?q?=E6=8E=A8=E9=80=81=EF=BC=8C=E5=85=88=E6=9F=A5=E8=BD=A8=E8=BF=B9?= =?UTF-8?q?=E5=90=8E=E8=BF=9B=E8=A1=8C=E6=8E=A8=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EventHandlers/TrackPushEventHandler.cs | 46 ++++++++++++++ .../ProvideServices/TrackPushService.cs | 60 +++++++++++++++++-- .../ITrackDetailsEsRepository.cs | 2 +- .../Repositories/TrackDetailsEsRepository.cs | 35 +++++++---- 4 files changed, 126 insertions(+), 17 deletions(-) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index f6a60425..8ac75e98 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -139,6 +139,9 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode); if (config == null) return; + //使用事件参数传递要推送的轨迹 + await ManualPushV2Async(@event, items, config); + goto Push; var tracks = await _trackDetailsEsRepository.GetListAsync(@event.OrderIds, @event.TrackCode); // tips:人工推送只要能推就推了,不会校验已推和顺序问题,因为可能是更新 @@ -189,6 +192,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe } } + Push: if (items.Count == 0) return; using (Track2InterfaceRelaySubSystemContext.Use( @@ -207,6 +211,48 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe } } + private async Task ManualPushV2Async(TrackPushEvent @event, List items, TrackPushContentConfigDto? config) + { + // tips:人工推送只要能推就推了,不会校验已推和顺序问题,因为可能是更新 + foreach (var order in _orders) + { + if (config is { IsAllPush: true }) + { + // 强制推送只需直接查出配置 + if (@event.ForcedPush) + config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode); + // 推断 本次推送 是否可行 + else + config = GetValidPushConfigAsync(_pushConfigs, order.LatestPushTrackCode, @event.TrackCode); + } + + if (config == null) continue; + + //配置的类型如何和订单类型不一致则不允许推送 + if (config.OrderType != order.OrderType) continue; + + var log = new TrackPushRecordIndex + { + OptionType = @event.OptionType.ToString(), + OrderId = order.Id, + OrderNo = order.OrderNo, + TrackStatus = @event.SystemPushInfo.TrackStatus, + TrackCode = @event.TrackCode, + TrackContent = @event.SystemPushInfo.TrackContent, + TrackPlace = @event.SystemPushInfo.TrackPlace, + TrackTime = @event.SystemPushInfo.TrackTime, + TrackTimeZone = @event.SystemPushInfo.TrackTimeZone, + CreateUser = @event.OperationMan, + SubSystemCode = @event.SubSystemCode, + IsToMq = @event.IsToMq, + Extra = @event.SystemPushInfo.Extra + }; + var item = await BuiltPushItem(config, log, @event.SystemPushInfo.Extra); + item.Log = JsonConvert.SerializeObject(log); + items.Add(item); + } + } + private async Task DoUpdateAsync(TrackPushEvent @event) { var config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode); diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs index ce902649..a7efbb5e 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs @@ -6,6 +6,7 @@ using SJZY.Track.Application.Contract.Dtos.TrackPush; using SJZY.Track.Application.Contract.Events; using SJZY.Track.Application.Contract.Services.ProvideServices; using SJZY.Track.Domain.Aggregates.OrderAggregate; +using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Aggregates.TrackPushAggregate; using SJZY.Track.Domain.Dtos.TrackPush; using SJZY.Track.Domain.Queries; @@ -27,12 +28,14 @@ public class TrackPushService : ApplicationService, ITrackPushService private readonly IHttpClientProxy _requestCurrentUserService; private readonly ITrackPushConfigRepository _trackPushConfigRepository; private readonly ITrackPushRecordEsRepository _trackPushRecordEsRepository; + private readonly ITrackDetailsEsRepository _trackDetailsEsRepository; public TrackPushService(IOrderRepository orderRepository , ICapPublisher capPublisher , ITrackPushRecordEsRepository trackPushRecordEsRepository , IHttpClientProxy requestCurrentUserService - , ITrackPushConfigRepository trackPushConfigRepository, IProvideQueries provideQueries) + , ITrackPushConfigRepository trackPushConfigRepository, IProvideQueries provideQueries, + ITrackDetailsEsRepository trackDetailsEsRepository) { _orderRepository = orderRepository; _capPublisher = capPublisher; @@ -40,6 +43,7 @@ public class TrackPushService : ApplicationService, ITrackPushService _requestCurrentUserService = requestCurrentUserService; _trackPushConfigRepository = trackPushConfigRepository; _provideQueries = provideQueries; + _trackDetailsEsRepository = trackDetailsEsRepository; } /// @@ -76,23 +80,69 @@ public class TrackPushService : ApplicationService, ITrackPushService var name = userInfo.Data.UserName; - foreach (var group in orders.GroupBy(x => x.CustomId)) + //查出需要推送的轨迹 + var tracks = await _trackDetailsEsRepository + .GetListAsync(input.SubSystemId, input.OrderType, input.OrderNos, + new List + { + input.TrackCode + }); + if (tracks.Count == 0) { + throw new BusinessException(message: "没有需要推送的轨迹"); + } + + //不同单可能会有不同的轨迹内容,先推送只推送最新的一条 + foreach (var order in orders) + { + //找出每个单的某个code的最新轨迹内容 + var track = tracks.Where(x => x.OrderId == order.Id) + .OrderByDescending(x => x.CreateTime) + .FirstOrDefault(); + if (track == null) continue; + var trackPushEvent = new TrackPushEvent { OptionType = OptionType.新增, SubSystemId = input.SubSystemId, SubSystemCode = subSystemCode, - CustomId = group.Key, - OrderIds = group.Select(x => x.Id).ToArray(), + CustomId = order.CustomId, + OrderIds = new[] { order.Id }, TrackCode = input.TrackCode, OperationMan = name, + SystemPushInfo = new SystemPushStruct() + { + TrackStatus = track.TrackStatus, + TrackContent = track.TrackContent, + TrackPlace = track.TrackPlace, + TrackTime = track.TrackTime, + TrackTimeZone = track.TrackTimeZone, + Extra = track.Extra + } }; await _capPublisher.PublishAsync(GlobalConst.TrackManualPushSubscribe, trackPushEvent); } - return new UnifyResultDto(true,$"即将推送轨迹代码{input.TrackCode}给{orders.Length}个订单"); + + // foreach (var group in orders.GroupBy(x => x.CustomId)) + // { + // var trackPushEvent = new TrackPushEvent + // { + // OptionType = OptionType.新增, + // SubSystemId = input.SubSystemId, + // SubSystemCode = subSystemCode, + // CustomId = group.Key, + // OrderIds = group.Select(x => x.Id).ToArray(), + // TrackCode = input.TrackCode, + // OperationMan = name, + // SystemPushInfo = new SystemPushStruct() + // }; + // + // await _capPublisher.PublishAsync(GlobalConst.TrackManualPushSubscribe, trackPushEvent); + // } + + return new UnifyResultDto(true, $"即将推送轨迹代码{input.TrackCode}给{orders.Length}个订单"); } diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs index 6f182653..ebb18d38 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs @@ -10,7 +10,7 @@ public interface ITrackDetailsEsRepository : IElasticsearchClientService> GetLatestListAsync(int[] eventOrderIds, List trackCodes); - Task> GetListAsync(int subSystemId, int orderType, List orderNos); + Task> GetListAsync(int subSystemId, int orderType, List orderNos, List? trackCodes = null); Task AnyAsync(int orderId, string originTrackDataHash); diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs index c6247003..80398584 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs @@ -372,25 +372,38 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract> GetListAsync(int subSystemId, int orderType, List orderNos) + public async Task> GetListAsync(int subSystemId, int orderType, List orderNos, List? trackCodes = null) { if (orderNos.Count < 1) return new List(); + var musts = new List, QueryContainer>> + { + mu => mu.Term(f => f.SubSystemId, subSystemId), + mu => mu + .Terms(t => t + .Field(f => f.OrderNo.Suffix("keyword")) + .Terms(orderNos) + ), + mu => mu + .Term(f => f.OrderType, orderType) + }; + + if (trackCodes != null && trackCodes.Count > 0) + { + musts.Add(mu => mu + .Terms(t => t + .Field(f => f.TrackCode.Suffix("keyword")) + .Terms(trackCodes) + )); + } + + var r = await Context.SearchAsync(x => x .Index(GlobalConst.TrackDetailsIndex) .Source() .Query(q => q.Bool(b => b - .Must( - mu => mu.Term(f => f.SubSystemId, subSystemId), - mu => mu - .Terms(t => t - .Field(f => f.OrderNo.Suffix("keyword")) - .Terms(orderNos) - ), - mu => mu - .Term(f => f.OrderType, orderType) - ) + .Must(musts) // tips:对外不暴露服务商轨迹 .MustNot(mn => mn .Term(t => t.TrackCode.Suffix("keyword"), GlobalConst.EmptyString)