diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs index 399f9be0..90e159cc 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs @@ -129,4 +129,9 @@ public class BatchUpsertTrackInput : OrderNosInfo /// 是否强制推送 /// public bool ForcedPush { get; set; } + + /// + /// 指定是否推送 + /// + public bool IsToMq { get; set; } } diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs index b436b9ef..8f743c7f 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs @@ -133,4 +133,9 @@ public class UpsertTrackInput : OrderNoInfo /// 是否强制推送 /// public bool ForcedPush { get; set; } + + /// + /// 指定是否推送 + /// + public bool IsToMq { get; set; } } diff --git a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs index 9b707cdb..877fa365 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs @@ -151,6 +151,10 @@ public class TrackUpsertEvent /// public bool ForcedPush { get; set; } + /// + /// 指定是否推送 + /// + public bool IsToMq { get; set; } public override string ToString() { diff --git a/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj b/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj index 1912b1d1..a1a6ebf2 100644 --- a/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj +++ b/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj @@ -5,7 +5,7 @@ net7.0 True - 7.0.9 + 7.0.10 True diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index e98c7cde..f6a60425 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -69,6 +69,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe if (@event.ForcedPush) { + //当为强制推送,会走手动推送逻辑 await DoPushAsync(@event); return; } @@ -95,7 +96,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe var items = new List(); TrackPushContentConfigDto? config; var isSystemPush = @event.OperationMan == null; - if (isSystemPush) + if (isSystemPush && !@event.ForcedPush) { foreach (var order in _orders) { @@ -139,13 +140,18 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe if (config == null) return; var tracks = await _trackDetailsEsRepository.GetListAsync(@event.OrderIds, @event.TrackCode); - tracks = tracks.DistinctBy(x => x.OrderId).ToList(); // 防止重复推送 - if (tracks.Count == 0) return; // 一个能推的轨迹都不存在 // tips:人工推送只要能推就推了,不会校验已推和顺序问题,因为可能是更新 - foreach (var track in tracks) + foreach (var order in _orders) { - var order = _orders.First(x => x.Id == track.OrderId); + //取订单的下某个code的最新创建时间的轨迹 防止重复推送 + var track = tracks + .Where(x => x.OrderId == order.Id && x.TrackCode == @event.TrackCode) + .OrderByDescending(x => x.CreateTime) + .FirstOrDefault(); + + if (track == null) return; // 一个能推的轨迹都不存在 + if (config is { IsAllPush: true }) { // 强制推送只需直接查出配置 diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index a20ec106..f521f11a 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -49,8 +49,8 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe var content = await HandleTrackAsync(@event, canNextOrderIds); // 处理广播事件 - if (content is { IsToMq: true }) - await _broadcastingService.TrackChangePublicTopicAsync(@event, content); + if (content != null && (content.IsToMq || @event.IsToMq)) + _broadcastingService.TrackChangePublicTopicAsync(@event, content); if (canNextOrderIds.Count == 0) return; // 根据订单关联关系异步向下刷(异步) @@ -199,7 +199,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe DestinationTimeZone = @event.DestinationTimeZone, EstimatedDeliveryDate = @event.EstimatedDeliveryDate }); - + // 触发轨迹推送事件(异步) var trackPushEvent = new TrackPushEvent { @@ -219,7 +219,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe Extra = @event.Extra }, ForcedPush = @event.ForcedPush, - IsToMq = trackContent.IsToMq + IsToMq = (trackContent.IsToMq || @event.IsToMq) }; await _capPublisher.PublishAsync(GlobalConst.TrackPushSubscribe, trackPushEvent); diff --git a/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs b/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs index 3a5fed9f..471ea081 100644 --- a/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs +++ b/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs @@ -70,7 +70,7 @@ public class TrackPushCompletedEventHandler : ITransientDependency, IRabbitHandl // 推送广播 if (log.IsToMq) - await _broadcastingService.TrackPushCompletedPublicTopicAsync(log); + _broadcastingService.TrackPushCompletedPublicTopicAsync(log); // 往es 写推送日志 await _trackPushRecordEsRepository.AddAsync(log); diff --git a/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs b/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs index de070657..7e02475e 100644 --- a/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs +++ b/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs @@ -26,47 +26,43 @@ public class BroadcastingService : ITransientDependency /// /// /// - public Task TrackChangePublicTopicAsync(TrackUpsertEvent eto, TrackContentVO content) + public void TrackChangePublicTopicAsync(TrackUpsertEvent eto, TrackContentVO content) { - return Task.Run(() => + var data = new TrackChangeEto { - var data = new TrackChangeEto - { - EstimatedDeliveryDate = eto.EstimatedDeliveryDate, - TrackPlacePostcode = eto.TrackPlacePostcode, - TrackPlaceNation = eto.TrackPlaceNation, - TrackPlaceNationId = eto.TrackPlaceNationId, - TrackPlaceProvince = eto.TrackPlaceProvince, - TrackPlaceProvinceId = eto.TrackPlaceProvinceId, - TrackPlaceCity = eto.TrackPlaceCity, - TrackPlaceCityId = eto.TrackPlaceCityId, - Files = eto.Files, - Remarks = eto.Remarks, - Source = eto.Source, - IsVisibility = eto.IsVisibility, - TrackTimeZone = eto.TrackTimeZone, - TrackTime = eto.TrackTime, - TrackPlace = eto.TrackPlace, - TrackStatusCode = content.TrackStatusCode, - EnStatus = eto.EnStatus, - Content = eto.Content, - TrackCode = eto.TrackCode, - OperationMan = eto.OperationMan, - OrderIdentifiers = eto.OrderIdentifiers, - CustomId = eto.CustomId, - SubSystemId = eto.SubSystemId, - Extra = eto.Extra - }; + EstimatedDeliveryDate = eto.EstimatedDeliveryDate, + TrackPlacePostcode = eto.TrackPlacePostcode, + TrackPlaceNation = eto.TrackPlaceNation, + TrackPlaceNationId = eto.TrackPlaceNationId, + TrackPlaceProvince = eto.TrackPlaceProvince, + TrackPlaceProvinceId = eto.TrackPlaceProvinceId, + TrackPlaceCity = eto.TrackPlaceCity, + TrackPlaceCityId = eto.TrackPlaceCityId, + Files = eto.Files, + Remarks = eto.Remarks, + Source = eto.Source, + IsVisibility = eto.IsVisibility, + TrackTimeZone = eto.TrackTimeZone, + TrackTime = eto.TrackTime, + TrackPlace = eto.TrackPlace, + TrackStatusCode = content.TrackStatusCode, + EnStatus = eto.EnStatus, + Content = eto.Content, + TrackCode = eto.TrackCode, + OperationMan = eto.OperationMan, + OrderIdentifiers = eto.OrderIdentifiers, + CustomId = eto.CustomId, + SubSystemId = eto.SubSystemId, + Extra = eto.Extra + }; - if (eto.IsAdd) - data.Option = 1; - else - data.Option = 3; + if (eto.IsAdd) + data.Option = 1; + else + data.Option = 3; - _rabbitClientBus.Publish(GlobalConst.TrackChangeExchange, $"TrackChange.{content.SubSystemCode}", - Encoding.UTF8.GetBytes(data.ToJson())); - return Task.CompletedTask; - }); + _rabbitClientBus.Publish(GlobalConst.TrackChangeExchange, $"TrackChange.{content.SubSystemCode}", + Encoding.UTF8.GetBytes(data.ToJson())); } /// @@ -74,34 +70,29 @@ public class BroadcastingService : ITransientDependency /// /// /// - public Task TrackPushCompletedPublicTopicAsync(TrackPushRecordIndex log) + public void TrackPushCompletedPublicTopicAsync(TrackPushRecordIndex log) { - // todo: 不需要异步 - return Task.Run(() => + var data = new TrackPushCompletedEvent { - var data = new TrackPushCompletedEvent - { - RequestId = log.RequestId, - IsSuccess = log.IsSuccess, - Message = log.Message, - OperationMan = log.CreateUser, - PushTime = DateTime.Now, - OptionType = log.OptionType, - IsManualPush = !string.Equals(log.CreateUser, GlobalConst.SystemUser), //操作人不为系统用户,则认为是仍推送 - PushContent = log.PushContent, - OrderNo = log.OrderNo, - TrackStatus = log.TrackStatus, - TrackContent = log.TrackContent, - TrackTimeZone = log.TrackTimeZone, - TrackTime = log.TrackTime, - TrackPlace = log.TrackPlace, - TrackCode = log.TrackCode, - Extra = log.Extra - }; + RequestId = log.RequestId, + IsSuccess = log.IsSuccess, + Message = log.Message, + OperationMan = log.CreateUser, + PushTime = DateTime.Now, + OptionType = log.OptionType, + IsManualPush = !string.Equals(log.CreateUser, GlobalConst.SystemUser), //操作人不为系统用户,则认为是仍推送 + PushContent = log.PushContent, + OrderNo = log.OrderNo, + TrackStatus = log.TrackStatus, + TrackContent = log.TrackContent, + TrackTimeZone = log.TrackTimeZone, + TrackTime = log.TrackTime, + TrackPlace = log.TrackPlace, + TrackCode = log.TrackCode, + Extra = log.Extra + }; - _rabbitClientBus.Publish(GlobalConst.TrackPushExchange, $"TrackPush.{log.SubSystemCode}", - Encoding.UTF8.GetBytes(data.ToJson())); - return Task.CompletedTask; - }); + _rabbitClientBus.Publish(GlobalConst.TrackPushExchange, $"TrackPush.{log.SubSystemCode}", + Encoding.UTF8.GetBytes(data.ToJson())); } } diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index 5e4b7865..83b36226 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -145,6 +145,7 @@ public partial class TrackService : ApplicationService, ITrackService { //todo:保留之前的方式 后续可去除 userInfo = await _requestCurrentUserService.Service.GetCurrentUserBasicInfoAsync(input.OptionUserId); + if (userInfo.Code != GlobalConst.SuccessCode || userInfo.Data is null) //TODO: log || ex throw new BusinessException(message: $"调用用户中心,获取用户信息失败:{userInfo.Msg}"); @@ -477,7 +478,8 @@ public partial class TrackService : ApplicationService, ITrackService EstimatedDeliveryDate = input.EstimatedDeliveryDate, DestinationTimeZone = input.DestinationTimeZone, Extra = input.Extra, - ForcedPush = input.ForcedPush + ForcedPush = input.ForcedPush, + IsToMq = input.IsToMq, }; await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, @event); }