diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index 0ef48ef3..0bb18a1e 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -72,23 +72,26 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe case OptionType.无: return; case OptionType.新增: - await DoPushAsync(@event); + //获取接口参数名称,稍后将用于轨迹扩展字段提取填充请求 + var paramsNames1 = await GetExtraParamNamesAsync(@event.SubSystemCode); + await DoPushAsync(@event, paramsNames1); break; case OptionType.删除: break; case OptionType.修改: - await DoUpdateAsync(@event); + //获取接口参数名称,稍后将用于轨迹扩展字段提取填充请求 + var paramsNames2 = await GetExtraParamNamesAsync(@event.SubSystemCode); + await DoUpdateAsync(@event, paramsNames2); break; default: throw new ArgumentOutOfRangeException(); } } - private async Task DoPushAsync(TrackPushEvent @event) + private async Task DoPushAsync(TrackPushEvent @event, List paramNames) { var items = new List(); TrackPushContentConfigDto? config; - if (@event.OperationMan == null) { foreach (var order in _orders) @@ -115,6 +118,8 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe }; var item = await BuiltPushItem(config, log); item.Log = JsonConvert.SerializeObject(log); + //根据轨迹扩展内容填充 + item.Data.ForEach(dict => FillExtraParam(@event.SystemPushInfo.Extra, dict, paramNames)); items.Add(item); } } @@ -154,6 +159,8 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe }; var item = await BuiltPushItem(config, log); item.Log = JsonConvert.SerializeObject(log); + //根据轨迹扩展内容填充 + item.Data.ForEach(dict => FillExtraParam(track.Extra, dict, paramNames)); items.Add(item); } } @@ -176,7 +183,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe } } - private async Task DoUpdateAsync(TrackPushEvent @event) + private async Task DoUpdateAsync(TrackPushEvent @event, List paramNames) { var config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode); if (config == null || !config.IsCanUpdate) return; @@ -199,6 +206,8 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe }; var item = BuiltUpdateItem(config, log); item.Log = JsonConvert.SerializeObject(log); + //根据轨迹扩展内容填充 + item.Data.ForEach(dict => FillExtraParam(@event.SystemPushInfo.Extra, dict, paramNames)); items.Add(item); } @@ -225,24 +234,36 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe var trackDatetime = log.TrackTime.AddHours(config.TrackTimeZone ?? log.TrackTimeZone - log.TrackTimeZone); var trackDateStr = DateTimeFormat(trackDatetime, config.TrackTimeZone ?? log.TrackTimeZone, config); - var track = new TrackItem - { - // 推真实的发生地和发生时间(时间是计算后的) - Location = log.TrackPlace, - Date = trackDateStr, - TimeZone = config.TrackTimeZone ?? log.TrackTimeZone, - Description = config.TrackEnContentValue, - DescriptionCn = config.TrackContentValue, - Code = config.TrackContentCodeValue, - Status = config.TrackStatusValue, - Extra = config.ExpandFieldsValue - }; + // var track = new TrackItem + // { + // // 推真实的发生地和发生时间(时间是计算后的) + // Location = log.TrackPlace, + // Date = trackDateStr, + // TimeZone = config.TrackTimeZone ?? log.TrackTimeZone, + // Description = config.TrackEnContentValue, + // DescriptionCn = config.TrackContentValue, + // Code = config.TrackContentCodeValue, + // Status = config.TrackStatusValue, + // Extra = config.ExpandFieldsValue + // }; var body = new TrackUpdateInput { OrderNo = log.OrderNo, }; - body.Data.Add(track); + var dict = new Dictionary() + { + // 推真实的发生地和发生时间(时间是计算后的) + { "Location", log.TrackPlace }, + { "Date", trackDateStr }, + { "TimeZone", config.TrackTimeZone ?? log.TrackTimeZone }, + { "Description", config.TrackEnContentValue }, + { "DescriptionCn", config.TrackContentValue }, + { "Code", config.TrackContentCodeValue }, + { "Status", config.TrackStatusValue }, + { "Extra", config.ExpandFieldsValue } + }; + body.Data.Add(dict); log.PushContent = body.ToJson(); return body; @@ -253,24 +274,36 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe var trackDatetime = log.TrackTime.AddHours(config.TrackTimeZone ?? log.TrackTimeZone - log.TrackTimeZone); var trackDateStr = DateTimeFormat(trackDatetime, config.TrackTimeZone ?? log.TrackTimeZone, config); - var track = new TrackItem - { - // 推真实的发生地和发生时间(时间是计算后的) - Location = log.TrackPlace, - Date = trackDateStr, - TimeZone = config.TrackTimeZone ?? log.TrackTimeZone, - Description = config.TrackEnContentValue, - DescriptionCn = config.TrackContentValue, - Code = config.TrackContentCodeValue, - Status = config.TrackStatusValue, - Extra = config.ExpandFieldsValue - }; + // var track = new TrackItem + // { + // // 推真实的发生地和发生时间(时间是计算后的) + // Location = log.TrackPlace, + // Date = trackDateStr, + // TimeZone = config.TrackTimeZone ?? log.TrackTimeZone, + // Description = config.TrackEnContentValue, + // DescriptionCn = config.TrackContentValue, + // Code = config.TrackContentCodeValue, + // Status = config.TrackStatusValue, + // Extra = config.ExpandFieldsValue + // }; var body = new TrackPushInput { OrderNo = log.OrderNo, }; - body.Data.Add(track); + var dict = new Dictionary() + { + // 推真实的发生地和发生时间(时间是计算后的) + { "Location", log.TrackPlace }, + { "Date", trackDateStr }, + { "TimeZone", config.TrackTimeZone ?? log.TrackTimeZone }, + { "Description", config.TrackEnContentValue }, + { "DescriptionCn", config.TrackContentValue }, + { "Code", config.TrackContentCodeValue }, + { "Status", config.TrackStatusValue }, + { "Extra", config.ExpandFieldsValue } + }; + body.Data.Add(dict); if (config.IsAllPush) { @@ -278,7 +311,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe if (history != default) { body = JsonConvert.DeserializeObject(history.PushContent); - body!.Data.Add(track); + body!.Data.Add(dict); } } @@ -335,4 +368,44 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe return dateTime.ToString("yyyy-MM-ddTHH:mm:ss.fffK"); } + + /// + /// 获取来源系统接口的参数名 + /// + /// + /// + private async Task> GetExtraParamNamesAsync(string subSystemCode) + { + using (Track2InterfaceRelaySubSystemContext.Use( + new Track2InterfaceRelaySubSystemContext(subSystemCode))) + { + var res = await _httpClientProxy.Service.GetSystemInterfaceByIdAsync(_options.CurrentValue.PushTrackInterfaceId); + if (res == null) return new List(); + return res.InParameterList + .Where(x => x.Alias.StartsWith(_options.CurrentValue.PushTrackItemParamAliasPrefix)) + .Select(x => x.Name) + .ToList(); + } + } + + /// + /// 填充来源于轨迹扩展字段的参数 + /// + /// 轨迹明细扩展字段 + /// 要扩展的参数字典 + /// 来源扩展字段的参数名 + /// + private void FillExtraParam(Dictionary? trackExtra, Dictionary? dict, List? paramNames) + { + if (paramNames == null || paramNames.Count == 0) return; + if (dict == null) return; + + if (trackExtra == null || trackExtra.Count == 0) return; + foreach (var item in + trackExtra.Where(x => x.Value != null && paramNames.Contains(x.Key))) + { + dict.TryAdd(item.Key, item.Value); + } + } + } diff --git a/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs b/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs index e55485a9..e467213d 100644 --- a/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs +++ b/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs @@ -4,11 +4,17 @@ using BSI.Stack.Rabbit.Handler; using Newtonsoft.Json; using RabbitMQ.Client.Events; using SJZY.Expand.ABP.Core.Logger; +using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.InterfaceRelay.Application.Contracts; +using SJZY.Track.Application.Contract.Dtos.ProvideServices; using SJZY.Track.Application.Contract.Dtos.TrackPush; +using SJZY.Track.Application.Contract.Events; using SJZY.Track.Application.Helpers; using SJZY.Track.Domain.Aggregates.OrderAggregate; +using SJZY.Track.Domain.Aggregates.TrackContentAggregate; +using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Aggregates.TrackPushAggregate; +using SJZY.Track.Domain.Aggregates.TrackStatusAggregate; using SJZY.Track.Domain.Enums; using Volo.Abp.DependencyInjection; @@ -18,12 +24,24 @@ public class TrackPushCompletedEventHandler : ITransientDependency, IRabbitHandl { private readonly IOrderRepository _orderRepository; private readonly ITrackPushRecordEsRepository _trackPushRecordEsRepository; + private readonly ITrackDetailsEsRepository _trackDetailsEsRepository; + private readonly ITrackStatusRepository _trackStatusRepository; + private readonly ITrackContentRepository _trackContentRepository; + private readonly RabbitClientBus _rabbitClientBus; public TrackPushCompletedEventHandler(IOrderRepository orderRepository, - ITrackPushRecordEsRepository trackPushRecordEsRepository) + ITrackPushRecordEsRepository trackPushRecordEsRepository, + ITrackDetailsEsRepository trackDetailsEsRepository, + ITrackStatusRepository trackStatusRepository, + ITrackContentRepository trackContentRepository, + RabbitClientBus rabbitClientBus) { _orderRepository = orderRepository; _trackPushRecordEsRepository = trackPushRecordEsRepository; + _trackDetailsEsRepository = trackDetailsEsRepository; + _trackStatusRepository = trackStatusRepository; + _trackContentRepository = trackContentRepository; + _rabbitClientBus = rabbitClientBus; } public ConsumeOptions Options() @@ -64,6 +82,16 @@ public class TrackPushCompletedEventHandler : ITransientDependency, IRabbitHandl log.Message = @event.Message; log.RequestId = @event.RequestId; + //查出推送轨迹,写入推送广播 + var tracks = await _trackDetailsEsRepository + .GetListAsync(new[] { log.OrderId }, new List + { + log.TrackCode + }); + + // 推送广播 + await PublicTrackPushTopicAsync(tracks.First(), log, !log.IsSuccess, log.Message); + // 往es 写推送日志 await _trackPushRecordEsRepository.AddAsync(log); @@ -111,4 +139,70 @@ public class TrackPushCompletedEventHandler : ITransientDependency, IRabbitHandl }); } } + + /// + /// 轨迹推送广播 + /// + private async Task PublicTrackPushTopicAsync(TrackDetailsIndex track, TrackPushRecordIndex pushRecord, bool isFailure = false, string? errorMsg = null) + { + var statusList = await _trackStatusRepository.GetListAsync(m => m.SubSystemId == track.SubSystemId); + if (statusList == null) + return; + + var contentList = await _trackContentRepository.GetTrackContentBySyetemIdAsync(track.SubSystemId); + if (contentList == null) + return; + + var status = statusList.FirstOrDefault(m => m.Code == track.TrackStatusCode); + if (status == null || !status.IsToMq) + return; + + var content = contentList.FirstOrDefault(m => m.TrackContentCode == track.TrackCode); + + var data = new TrackPushEto + { + Option = pushRecord.OptionType == OptionType.新增.ToString() ? OptionType.新增 : OptionType.修改, + IsManualPush = !string.Equals(pushRecord.CreateUser, GlobalConst.SystemUser), //操作人不为系统用户,则认为是仍推送 + IsFailure = isFailure, + FailureReason = errorMsg, + PushTime = DateTime.Now, + OperationMan = pushRecord.CreateUser, + EstimatedDeliveryDate = track.EstimatedDeliveryDate, + TrackPlacePostcode = track.TrackPlacePostcode, + TrackPlaceNation = track.TrackPlaceNation, + TrackPlaceNationId = track.TrackPlaceNationId, + TrackPlaceProvince = track.TrackPlaceProvince, + TrackPlaceProvinceId = track.TrackPlaceProvinceId, + TrackPlaceCity = track.TrackPlaceCity, + TrackPlaceCityId = track.TrackPlaceCityId, + Files = track.Files?.Select(x => new FileItemDto + { + OssKey = x.OssKey, + FileName = x.FileName + }).ToList(), + Remarks = track.Remarks, + Source = track.Source, + IsVisibility = track.IsVisibility, + TrackTimeZone = track.TrackTimeZone, + TrackTime = track.TrackTime, + TrackPlace = track.TrackPlace, + TrackStatusCode = track.TrackStatusCode, + EnStatus = track.TrackEnContent, + Content = track.TrackContent, + TrackCode = track.TrackCode, + SubSystemId = track.SubSystemId, + OrderNo = track.OrderNo, + OrderIdentifiers = new OrderIdentifier[] + { + new OrderIdentifier + { + OrderId = track.OrderId, + OrderNo = track.OrderNo, + OrderType = track.OrderType + } + }, + Extra = track.Extra + }; + _rabbitClientBus.Publish(GlobalConst.TrackPushExchange, $"TrackPush.{content.SubSystemCode}", Encoding.UTF8.GetBytes(data.ToJson())); + } } diff --git a/src/SJZY.Track.Domain/Consts/GlobalConst.MQ.cs b/src/SJZY.Track.Domain/Consts/GlobalConst.MQ.cs index e7901efa..93b5b277 100644 --- a/src/SJZY.Track.Domain/Consts/GlobalConst.MQ.cs +++ b/src/SJZY.Track.Domain/Consts/GlobalConst.MQ.cs @@ -57,5 +57,8 @@ public partial class GlobalConst /// public const string TrackChangeExchange = "sjzy.track.on_track_change_ex"; - + /// + /// 轨迹推送通知交换机 + /// + public const string TrackPushExchange = "sjzy.track.on_track_push_ex"; }