update: 轨迹推送增加扩展参数
update: 轨迹推送接口通回调,增加推送回传轨迹广播
This commit is contained in:
parent
178dca47d0
commit
6ece015f0d
@ -72,23 +72,26 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
case OptionType.无:
|
case OptionType.无:
|
||||||
return;
|
return;
|
||||||
case OptionType.新增:
|
case OptionType.新增:
|
||||||
await DoPushAsync(@event);
|
//获取接口参数名称,稍后将用于轨迹扩展字段提取填充请求
|
||||||
|
var paramsNames1 = await GetExtraParamNamesAsync(@event.SubSystemCode);
|
||||||
|
await DoPushAsync(@event, paramsNames1);
|
||||||
break;
|
break;
|
||||||
case OptionType.删除:
|
case OptionType.删除:
|
||||||
break;
|
break;
|
||||||
case OptionType.修改:
|
case OptionType.修改:
|
||||||
await DoUpdateAsync(@event);
|
//获取接口参数名称,稍后将用于轨迹扩展字段提取填充请求
|
||||||
|
var paramsNames2 = await GetExtraParamNamesAsync(@event.SubSystemCode);
|
||||||
|
await DoUpdateAsync(@event, paramsNames2);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw new ArgumentOutOfRangeException();
|
throw new ArgumentOutOfRangeException();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task DoPushAsync(TrackPushEvent @event)
|
private async Task DoPushAsync(TrackPushEvent @event, List<string> paramNames)
|
||||||
{
|
{
|
||||||
var items = new List<object>();
|
var items = new List<object>();
|
||||||
TrackPushContentConfigDto? config;
|
TrackPushContentConfigDto? config;
|
||||||
|
|
||||||
if (@event.OperationMan == null)
|
if (@event.OperationMan == null)
|
||||||
{
|
{
|
||||||
foreach (var order in _orders)
|
foreach (var order in _orders)
|
||||||
@ -115,6 +118,8 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
};
|
};
|
||||||
var item = await BuiltPushItem(config, log);
|
var item = await BuiltPushItem(config, log);
|
||||||
item.Log = JsonConvert.SerializeObject(log);
|
item.Log = JsonConvert.SerializeObject(log);
|
||||||
|
//根据轨迹扩展内容填充
|
||||||
|
item.Data.ForEach(dict => FillExtraParam(@event.SystemPushInfo.Extra, dict, paramNames));
|
||||||
items.Add(item);
|
items.Add(item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -154,6 +159,8 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
};
|
};
|
||||||
var item = await BuiltPushItem(config, log);
|
var item = await BuiltPushItem(config, log);
|
||||||
item.Log = JsonConvert.SerializeObject(log);
|
item.Log = JsonConvert.SerializeObject(log);
|
||||||
|
//根据轨迹扩展内容填充
|
||||||
|
item.Data.ForEach(dict => FillExtraParam(track.Extra, dict, paramNames));
|
||||||
items.Add(item);
|
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);
|
var config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode);
|
||||||
if (config == null || !config.IsCanUpdate) return;
|
if (config == null || !config.IsCanUpdate) return;
|
||||||
@ -199,6 +206,8 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
};
|
};
|
||||||
var item = BuiltUpdateItem(config, log);
|
var item = BuiltUpdateItem(config, log);
|
||||||
item.Log = JsonConvert.SerializeObject(log);
|
item.Log = JsonConvert.SerializeObject(log);
|
||||||
|
//根据轨迹扩展内容填充
|
||||||
|
item.Data.ForEach(dict => FillExtraParam(@event.SystemPushInfo.Extra, dict, paramNames));
|
||||||
items.Add(item);
|
items.Add(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -225,24 +234,36 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
var trackDatetime = log.TrackTime.AddHours(config.TrackTimeZone ?? log.TrackTimeZone - log.TrackTimeZone);
|
var trackDatetime = log.TrackTime.AddHours(config.TrackTimeZone ?? log.TrackTimeZone - log.TrackTimeZone);
|
||||||
var trackDateStr = DateTimeFormat(trackDatetime, config.TrackTimeZone ?? log.TrackTimeZone, config);
|
var trackDateStr = DateTimeFormat(trackDatetime, config.TrackTimeZone ?? log.TrackTimeZone, config);
|
||||||
|
|
||||||
var track = new TrackItem
|
// var track = new TrackItem
|
||||||
{
|
// {
|
||||||
// 推真实的发生地和发生时间(时间是计算后的)
|
// // 推真实的发生地和发生时间(时间是计算后的)
|
||||||
Location = log.TrackPlace,
|
// Location = log.TrackPlace,
|
||||||
Date = trackDateStr,
|
// Date = trackDateStr,
|
||||||
TimeZone = config.TrackTimeZone ?? log.TrackTimeZone,
|
// TimeZone = config.TrackTimeZone ?? log.TrackTimeZone,
|
||||||
Description = config.TrackEnContentValue,
|
// Description = config.TrackEnContentValue,
|
||||||
DescriptionCn = config.TrackContentValue,
|
// DescriptionCn = config.TrackContentValue,
|
||||||
Code = config.TrackContentCodeValue,
|
// Code = config.TrackContentCodeValue,
|
||||||
Status = config.TrackStatusValue,
|
// Status = config.TrackStatusValue,
|
||||||
Extra = config.ExpandFieldsValue
|
// Extra = config.ExpandFieldsValue
|
||||||
};
|
// };
|
||||||
|
|
||||||
var body = new TrackUpdateInput
|
var body = new TrackUpdateInput
|
||||||
{
|
{
|
||||||
OrderNo = log.OrderNo,
|
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();
|
log.PushContent = body.ToJson();
|
||||||
|
|
||||||
return body;
|
return body;
|
||||||
@ -253,24 +274,36 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
var trackDatetime = log.TrackTime.AddHours(config.TrackTimeZone ?? log.TrackTimeZone - log.TrackTimeZone);
|
var trackDatetime = log.TrackTime.AddHours(config.TrackTimeZone ?? log.TrackTimeZone - log.TrackTimeZone);
|
||||||
var trackDateStr = DateTimeFormat(trackDatetime, config.TrackTimeZone ?? log.TrackTimeZone, config);
|
var trackDateStr = DateTimeFormat(trackDatetime, config.TrackTimeZone ?? log.TrackTimeZone, config);
|
||||||
|
|
||||||
var track = new TrackItem
|
// var track = new TrackItem
|
||||||
{
|
// {
|
||||||
// 推真实的发生地和发生时间(时间是计算后的)
|
// // 推真实的发生地和发生时间(时间是计算后的)
|
||||||
Location = log.TrackPlace,
|
// Location = log.TrackPlace,
|
||||||
Date = trackDateStr,
|
// Date = trackDateStr,
|
||||||
TimeZone = config.TrackTimeZone ?? log.TrackTimeZone,
|
// TimeZone = config.TrackTimeZone ?? log.TrackTimeZone,
|
||||||
Description = config.TrackEnContentValue,
|
// Description = config.TrackEnContentValue,
|
||||||
DescriptionCn = config.TrackContentValue,
|
// DescriptionCn = config.TrackContentValue,
|
||||||
Code = config.TrackContentCodeValue,
|
// Code = config.TrackContentCodeValue,
|
||||||
Status = config.TrackStatusValue,
|
// Status = config.TrackStatusValue,
|
||||||
Extra = config.ExpandFieldsValue
|
// Extra = config.ExpandFieldsValue
|
||||||
};
|
// };
|
||||||
|
|
||||||
var body = new TrackPushInput
|
var body = new TrackPushInput
|
||||||
{
|
{
|
||||||
OrderNo = log.OrderNo,
|
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)
|
if (config.IsAllPush)
|
||||||
{
|
{
|
||||||
@ -278,7 +311,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
if (history != default)
|
if (history != default)
|
||||||
{
|
{
|
||||||
body = JsonConvert.DeserializeObject<TrackPushInput>(history.PushContent);
|
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");
|
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 Newtonsoft.Json;
|
||||||
using RabbitMQ.Client.Events;
|
using RabbitMQ.Client.Events;
|
||||||
using SJZY.Expand.ABP.Core.Logger;
|
using SJZY.Expand.ABP.Core.Logger;
|
||||||
|
using SJZY.Expand.ABP.Core.PublicMethords;
|
||||||
using SJZY.InterfaceRelay.Application.Contracts;
|
using SJZY.InterfaceRelay.Application.Contracts;
|
||||||
|
using SJZY.Track.Application.Contract.Dtos.ProvideServices;
|
||||||
using SJZY.Track.Application.Contract.Dtos.TrackPush;
|
using SJZY.Track.Application.Contract.Dtos.TrackPush;
|
||||||
|
using SJZY.Track.Application.Contract.Events;
|
||||||
using SJZY.Track.Application.Helpers;
|
using SJZY.Track.Application.Helpers;
|
||||||
using SJZY.Track.Domain.Aggregates.OrderAggregate;
|
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.TrackPushAggregate;
|
||||||
|
using SJZY.Track.Domain.Aggregates.TrackStatusAggregate;
|
||||||
using SJZY.Track.Domain.Enums;
|
using SJZY.Track.Domain.Enums;
|
||||||
using Volo.Abp.DependencyInjection;
|
using Volo.Abp.DependencyInjection;
|
||||||
|
|
||||||
@ -18,12 +24,24 @@ public class TrackPushCompletedEventHandler : ITransientDependency, IRabbitHandl
|
|||||||
{
|
{
|
||||||
private readonly IOrderRepository _orderRepository;
|
private readonly IOrderRepository _orderRepository;
|
||||||
private readonly ITrackPushRecordEsRepository _trackPushRecordEsRepository;
|
private readonly ITrackPushRecordEsRepository _trackPushRecordEsRepository;
|
||||||
|
private readonly ITrackDetailsEsRepository _trackDetailsEsRepository;
|
||||||
|
private readonly ITrackStatusRepository _trackStatusRepository;
|
||||||
|
private readonly ITrackContentRepository _trackContentRepository;
|
||||||
|
private readonly RabbitClientBus _rabbitClientBus;
|
||||||
|
|
||||||
public TrackPushCompletedEventHandler(IOrderRepository orderRepository,
|
public TrackPushCompletedEventHandler(IOrderRepository orderRepository,
|
||||||
ITrackPushRecordEsRepository trackPushRecordEsRepository)
|
ITrackPushRecordEsRepository trackPushRecordEsRepository,
|
||||||
|
ITrackDetailsEsRepository trackDetailsEsRepository,
|
||||||
|
ITrackStatusRepository trackStatusRepository,
|
||||||
|
ITrackContentRepository trackContentRepository,
|
||||||
|
RabbitClientBus rabbitClientBus)
|
||||||
{
|
{
|
||||||
_orderRepository = orderRepository;
|
_orderRepository = orderRepository;
|
||||||
_trackPushRecordEsRepository = trackPushRecordEsRepository;
|
_trackPushRecordEsRepository = trackPushRecordEsRepository;
|
||||||
|
_trackDetailsEsRepository = trackDetailsEsRepository;
|
||||||
|
_trackStatusRepository = trackStatusRepository;
|
||||||
|
_trackContentRepository = trackContentRepository;
|
||||||
|
_rabbitClientBus = rabbitClientBus;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ConsumeOptions Options()
|
public ConsumeOptions Options()
|
||||||
@ -64,6 +82,16 @@ public class TrackPushCompletedEventHandler : ITransientDependency, IRabbitHandl
|
|||||||
log.Message = @event.Message;
|
log.Message = @event.Message;
|
||||||
log.RequestId = @event.RequestId;
|
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 写推送日志
|
// 往es 写推送日志
|
||||||
await _trackPushRecordEsRepository.AddAsync(log);
|
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>
|
/// </summary>
|
||||||
public const string TrackChangeExchange = "sjzy.track.on_track_change_ex";
|
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