diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index 28c82e85..0dcaf748 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -74,27 +74,25 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe case OptionType.无: return; case OptionType.新增: - //获取接口参数名称,稍后将用于轨迹扩展字段提取填充请求 - var paramsNames1 = await GetExtraParamNamesAsync(@event.SubSystemCode); - await DoPushAsync(@event, paramsNames1); + await DoPushAsync(@event); break; case OptionType.删除: break; case OptionType.修改: - //获取接口参数名称,稍后将用于轨迹扩展字段提取填充请求 - var paramsNames2 = await GetExtraParamNamesAsync(@event.SubSystemCode); - await DoUpdateAsync(@event, paramsNames2); + await DoUpdateAsync(@event); break; default: throw new ArgumentOutOfRangeException(); } } - private async Task DoPushAsync(TrackPushEvent @event, List paramNames) + private async Task DoPushAsync(TrackPushEvent @event) { - var items = new List(); + var items = new List(); TrackPushContentConfigDto? config; - if (@event.OperationMan == null) + var isSystemPush = @event.OperationMan == null; + var trackPushInputDict = new Dictionary(); + if (isSystemPush) { foreach (var order in _orders) { @@ -120,8 +118,6 @@ 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); } } @@ -130,10 +126,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode); if (config == null) return; - var tracks = await _trackDetailsEsRepository.GetListAsync(@event.OrderIds, new List() - { - @event.TrackCode - }); + var tracks = await _trackDetailsEsRepository.GetListAsync(@event.OrderIds, @event.TrackCode); tracks = tracks.DistinctBy(x => x.OrderId).ToList(); // 防止重复推送 if (tracks.Count == 0) return; // 一个能推的轨迹都不存在 @@ -164,21 +157,34 @@ 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)); + trackPushInputDict.Add(item, track); items.Add(item); } } if (items.Count == 0) return; + //获取参数结构名称 + var paramNames = await GetExtraParamNamesAsync(@event.SubSystemCode); + + //如果为系统推送,则从事件中取出轨迹扩展内容填充 + foreach (var item in items) + { + //根据事件中轨迹扩展内容填充 + if (isSystemPush) + item.Data.ForEach(dict => FillExtraParam(@event.SystemPushInfo.Extra, dict, paramNames)); + //根据查出的轨迹中扩展内容填充 + else + item.Data.ForEach(dict => FillExtraParam(trackPushInputDict[item].Extra, dict, paramNames)); + } + using (Track2InterfaceRelaySubSystemContext.Use( new Track2InterfaceRelaySubSystemContext(@event.SubSystemCode))) { var asciiString = Base64Helper.SerializeObject(OptionType.新增.ToString()); var r = await _httpClientProxy.Service.BatchForwardThenPushToQueueAsync( _options.CurrentValue.PushTrackInterfaceCode, - _pushConfigs.First().ServiceProviderCode, items, GlobalConst.TrackPushCompletedSubscribe, + _pushConfigs.First().ServiceProviderCode, items.Cast().ToList(), GlobalConst.TrackPushCompletedSubscribe, attach: asciiString); if (r.Code != GlobalConst.SuccessCode) @@ -188,12 +194,12 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe } } - private async Task DoUpdateAsync(TrackPushEvent @event, List paramNames) + private async Task DoUpdateAsync(TrackPushEvent @event) { var config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode); if (config == null || !config.IsCanUpdate) return; - var items = new List(); + var items = new List(); foreach (var order in _orders) { var log = new TrackPushRecordIndex @@ -211,20 +217,25 @@ 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); } if (items.Count == 0) return; + //获取参数结构名称 + var paramNames = await GetExtraParamNamesAsync(@event.SubSystemCode); + + //根据事件中轨迹扩展内容填充请求 + foreach (var item in items) + item.Data.ForEach(dict => FillExtraParam(@event.SystemPushInfo.Extra, dict, paramNames)); + using (Track2InterfaceRelaySubSystemContext.Use( new Track2InterfaceRelaySubSystemContext(@event.SubSystemCode))) { var asciiString = Base64Helper.SerializeObject(OptionType.修改.ToString()); var r = await _httpClientProxy.Service.BatchForwardThenPushToQueueAsync( _options.CurrentValue.TrackUpdateInterfaceCode, - _pushConfigs.First().ServiceProviderCode, items, GlobalConst.TrackPushCompletedSubscribe, + _pushConfigs.First().ServiceProviderCode, items.Cast().ToList(), GlobalConst.TrackPushCompletedSubscribe, attach: asciiString); if (r.Code != GlobalConst.SuccessCode) @@ -239,19 +250,6 @@ 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 body = new TrackUpdateInput { OrderNo = log.OrderNo, @@ -279,19 +277,6 @@ 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 body = new TrackPushInput { OrderNo = log.OrderNo, @@ -402,18 +387,18 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe /// /// 填充来源于轨迹扩展字段的参数 /// - /// 轨迹明细扩展字段 + /// 轨迹明细扩展字段Json /// 要扩展的参数字典 /// 来源扩展字段的参数名 /// - private void FillExtraParam(string? trackExtraStr, Dictionary? dict, List? paramNames) + private void FillExtraParam(string? trackExtraJson, Dictionary? dict, List? paramNames) { if (paramNames == null || paramNames.Count == 0) return; if (dict == null) return; - if (string.IsNullOrWhiteSpace(trackExtraStr)) return; + if (string.IsNullOrWhiteSpace(trackExtraJson)) return; - var trackExtra = ExtractTrackExtraDict(trackExtraStr); + var trackExtra = ExtractTrackExtraDict(trackExtraJson); if (trackExtra.Count == 0) return; foreach (var item in