update: 轨迹推送增加扩展参数
update: 轨迹推送接口通回调,增加推送回传轨迹广播
This commit is contained in:
parent
178dca47d0
commit
6ece015f0d
@ -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<string> paramNames)
|
||||
{
|
||||
var items = new List<object>();
|
||||
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<string> 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<string, object>()
|
||||
{
|
||||
// 推真实的发生地和发生时间(时间是计算后的)
|
||||
{ "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<string, object>()
|
||||
{
|
||||
// 推真实的发生地和发生时间(时间是计算后的)
|
||||
{ "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<TrackPushInput>(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");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取来源系统接口的参数名
|
||||
/// </summary>
|
||||
/// <param name="subSystemCode"></param>
|
||||
/// <returns></returns>
|
||||
private async Task<List<string>> GetExtraParamNamesAsync(string subSystemCode)
|
||||
{
|
||||
using (Track2InterfaceRelaySubSystemContext.Use(
|
||||
new Track2InterfaceRelaySubSystemContext(subSystemCode)))
|
||||
{
|
||||
var res = await _httpClientProxy.Service.GetSystemInterfaceByIdAsync(_options.CurrentValue.PushTrackInterfaceId);
|
||||
if (res == null) return new List<string>();
|
||||
return res.InParameterList
|
||||
.Where(x => x.Alias.StartsWith(_options.CurrentValue.PushTrackItemParamAliasPrefix))
|
||||
.Select(x => x.Name)
|
||||
.ToList();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 填充来源于轨迹扩展字段的参数
|
||||
/// </summary>
|
||||
/// <param name="trackExtra">轨迹明细扩展字段</param>
|
||||
/// <param name="dict">要扩展的参数字典</param>
|
||||
/// <param name="paramNames">来源扩展字段的参数名</param>
|
||||
/// <returns></returns>
|
||||
private void FillExtraParam(Dictionary<string, object>? trackExtra, Dictionary<string, object>? dict, List<string>? 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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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<string>
|
||||
{
|
||||
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
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹推送广播
|
||||
/// </summary>
|
||||
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()));
|
||||
}
|
||||
}
|
||||
|
||||
@ -57,5 +57,8 @@ public partial class GlobalConst
|
||||
/// </summary>
|
||||
public const string TrackChangeExchange = "sjzy.track.on_track_change_ex";
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹推送通知交换机
|
||||
/// </summary>
|
||||
public const string TrackPushExchange = "sjzy.track.on_track_push_ex";
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user