Merge remote-tracking branch 'origin/S04轨迹预警' into S04轨迹预警

# Conflicts:
#	src/SJZY.Track.Application/CAP/EventHandlers/TrackRefreshEventHandler.cs
This commit is contained in:
xiaolipro 2024-08-06 16:56:22 +08:00
commit 8bcef37b74
2 changed files with 85 additions and 43 deletions

View File

@ -12,13 +12,14 @@ namespace SJZY.Track.Application.CAP.EventHandlers;
public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICapSubscribe public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICapSubscribe
{ {
private readonly IOrderRepository _orderRepository;
private readonly IForewarningNotifyService _forewarningNotifyService; private readonly IForewarningNotifyService _forewarningNotifyService;
private readonly ITrackPullCacheService _trackPullCacheService; private readonly IOrderRepository _orderRepository;
private readonly IProvideQueries _provideQueries; private readonly IProvideQueries _provideQueries;
private readonly ITrackPullCacheService _trackPullCacheService;
public TrackChangeAfterUpdateOrderEventHandler(IOrderRepository orderRepository, public TrackChangeAfterUpdateOrderEventHandler(IOrderRepository orderRepository,
IForewarningNotifyService forewarningNotifyService, ITrackPullCacheService trackPullCacheService, IProvideQueries provideQueries) IForewarningNotifyService forewarningNotifyService, ITrackPullCacheService trackPullCacheService,
IProvideQueries provideQueries)
{ {
_orderRepository = orderRepository; _orderRepository = orderRepository;
_forewarningNotifyService = forewarningNotifyService; _forewarningNotifyService = forewarningNotifyService;
@ -34,7 +35,7 @@ public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICa
if (orders.Count == 0) return; if (orders.Count == 0) return;
var updateOrders = new List<OrderEntity>(); var updateOrders = new List<OrderEntity>();
var providerDic= await GetProviderDic(@event.OrderIds); var providerDic = await GetProviderDic(@event.OrderIds);
foreach (var order in orders) foreach (var order in orders)
{ {
if (order.LatestTrackContent != @event.TrackContent) if (order.LatestTrackContent != @event.TrackContent)
@ -48,11 +49,11 @@ public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICa
} }
// 执行轨迹兜底时 时区缺失和发生地缺失标记,1表示时区,2表示发生地,3表示两种 // 执行轨迹兜底时 时区缺失和发生地缺失标记,1表示时区,2表示发生地,3表示两种
if (@event.DeficiencyTagValue > 0 && @event.DeficiencyTagValue<=3) if (@event.DeficiencyTagValue > 0 && @event.DeficiencyTagValue <= 3)
{ {
order.DeficiencyTag = @event.DeficiencyTagValue; order.DeficiencyTag = @event.DeficiencyTagValue;
} }
if (!order.IsCompleted) if (!order.IsCompleted)
{ {
order.IsCompleted = @event.IsCompleted; order.IsCompleted = @event.IsCompleted;
@ -60,15 +61,18 @@ public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICa
if (!string.IsNullOrEmpty(@event.TrackCode) && providerDic.TryGetValue(order.Id, out var provider)) if (!string.IsNullOrEmpty(@event.TrackCode) && providerDic.TryGetValue(order.Id, out var provider))
{ {
var config = await _trackPullCacheService.GetPullParamWithContentConfigAsync(provider.SubSystemId, provider.ServiceProviderId); var config =
await _trackPullCacheService.GetPullParamWithContentConfigAsync(provider.SubSystemId,
if (!string.IsNullOrEmpty(config?.ParamConfig.TrackContentCode) && config.ParamConfig.TrackContentCode!.ToLower() == @event.TrackCode.ToLower()) provider.ServiceProviderId);
if (!string.IsNullOrEmpty(config?.ParamConfig.TrackContentCode) &&
config.ParamConfig.TrackContentCode!.ToLower() == @event.TrackCode.ToLower())
{ {
// 触发拉取节点 // 触发拉取节点
order.IsTriggerPull = 1; order.IsTriggerPull = 1;
} }
} }
order.LatestTrackContent = @event.TrackContent; order.LatestTrackContent = @event.TrackContent;
order.LatestTrackEnContent = @event.TrackEnContent; order.LatestTrackEnContent = @event.TrackEnContent;
order.LatestTrackPlace = @event.TrackPlace; order.LatestTrackPlace = @event.TrackPlace;
@ -80,7 +84,7 @@ public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICa
await _orderRepository.UpdateRangeAsync(updateOrders, x => new await _orderRepository.UpdateRangeAsync(updateOrders, x => new
{ {
x.IsCompleted, x.LatestTrackContent, x.LatestTrackEnContent, x.LatestTrackPlace, x.LatestTrackTime, x.IsCompleted, x.LatestTrackContent, x.LatestTrackEnContent, x.LatestTrackPlace, x.LatestTrackTime,
x.LatestTrackTimeZone,x.IsTriggerPull,x.DeficiencyTag x.LatestTrackTimeZone, x.IsTriggerPull, x.DeficiencyTag
}); });
// 预警计算 // 预警计算
@ -110,7 +114,8 @@ public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICa
ArrivalPostCode = order.ArrivalPostCode, ArrivalPostCode = order.ArrivalPostCode,
IsTransit = order.IsTransit, IsTransit = order.IsTransit,
LeavePort = order.LeavePort, LeavePort = order.LeavePort,
ProductCode = order.ProductCode ProductCode = order.ProductCode,
IsTriggerPull = order.IsTriggerPull
}); });
} }
@ -139,7 +144,7 @@ public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICa
}).ToList() }).ToList()
}; };
} }
/// <summary> /// <summary>
/// 获取服务商字典 /// 获取服务商字典
/// </summary> /// </summary>

View File

@ -19,11 +19,11 @@ namespace SJZY.Track.Application.CAP.EventHandlers;
public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe
{ {
private readonly IOrderRepository _orderRepository;
private readonly ICapPublisher _capPublisher; private readonly ICapPublisher _capPublisher;
private readonly ITrackPullCacheService _trackPullCacheService; private readonly IOrderRepository _orderRepository;
private readonly ITrackDetailsRepository _trackDetailsRepository;
private readonly ITimezoneQueries _timezoneQueries; private readonly ITimezoneQueries _timezoneQueries;
private readonly ITrackDetailsRepository _trackDetailsRepository;
private readonly ITrackPullCacheService _trackPullCacheService;
public TrackRefreshEventHandler(IOrderRepository orderRepository, public TrackRefreshEventHandler(IOrderRepository orderRepository,
ICapPublisher capPublisher, ITrackPullCacheService trackPullCacheService, ICapPublisher capPublisher, ITrackPullCacheService trackPullCacheService,
@ -176,39 +176,19 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe
} }
} }
// 轨迹发生地
var trackPlace = paramConfig.TrackPlaceName == null
? null
: trackToken[paramConfig.TrackPlaceName]?.Value<string>();
var hasPlaceBottomLine = false; //执行了兜底但是没有兜底住,需要记录
if (trackPlace.IsNullOrWhiteSpace() && matchedContentConfig?.TrackPlaceValue is not null)
{
//兜底没配置的就不需要兜底,拉取的发生地没就没
trackPlace = await GetPlaceByOrder(matchedContentConfig.TrackPlaceValue.Value, context.OrderId);
hasPlaceBottomLine = string.IsNullOrWhiteSpace(trackPlace);
}
// 轨迹发生时间 // 轨迹发生时间
var trackTime = paramConfig.TrackTimeName == null var trackTime = paramConfig.TrackTimeName == null
? null ? null
: trackToken[paramConfig.TrackTimeName]?.Value<DateTime>(); : trackToken[paramConfig.TrackTimeName]?.Value<DateTime>();
// 轨迹发生时区
var trackTimeZone = paramConfig.TrackTimeZoneName == null
? null
: trackToken[paramConfig.TrackTimeZoneName]?.Value<float>();
// todo:兜底时区是slow path // 轨迹时区
var hasTimezoneBottomLine = false; //执行了兜底但是没有兜底住,需要记录 var (trackTimeZone, hasTimezoneBottomLine) =
if (!trackTimeZone.HasValue && matchedContentConfig?.TrackZonePlaceValue is not null) await GetTimezone(paramConfig, matchedContentConfig, context.OrderId, trackToken);
{
//兜底没配置的就不需要兜底,拉取的发生地没就没
var timezone = await GetTimezone(matchedContentConfig, context.OrderId);
trackTimeZone = timezone; // 轨迹发生地
hasTimezoneBottomLine = !timezone.HasValue; var (trackPlace, hasPlaceBottomLine) =
} await GetTrackPlace(paramConfig, matchedContentConfig, context.OrderId, trackToken);
// 没匹配上,新增服务商轨迹
if (matchedContentConfig is null) if (matchedContentConfig is null)
{ {
await InsertNotMappedTrackAsync(trackToken, context, trackPlace, trackTime, trackTimeZone, paramConfig); await InsertNotMappedTrackAsync(trackToken, context, trackPlace, trackTime, trackTimeZone, paramConfig);
@ -288,6 +268,63 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe
await _trackDetailsRepository.AddAsync(track); await _trackDetailsRepository.AddAsync(track);
} }
/// <summary>
/// 获取轨迹时区
/// </summary>
/// <param name="paramConfig">配置信息</param>
/// <param name="matchedContentConfig">配置信息</param>
/// <param name="orderId">订单id</param>
/// <param name="trackToken"></param>
/// <returns>时区,是否执行了兜底轨迹时区</returns>
private async Task<(float? trackTimeZone, bool hasTimezoneBottomLine)> GetTimezone(
TrackPullParamConfigDto paramConfig, TrackPullContentConfigDto? matchedContentConfig, int orderId,
JToken trackToken)
{
// 轨迹发生时区
var trackTimeZone = paramConfig.TrackTimeZoneName == null
? null
: trackToken[paramConfig.TrackTimeZoneName]?.Value<float>();
bool hasTimezoneBottomLine = false; //执行了兜底但是没有兜底住,需要记录
if (!trackTimeZone.HasValue && matchedContentConfig?.TrackZonePlaceValue is not null)
{
//兜底没配置的就不需要兜底,拉取的发生地没就没
var timezone = await GetTimezone(matchedContentConfig, orderId);
trackTimeZone = timezone;
hasTimezoneBottomLine = !timezone.HasValue;
}
return (trackTimeZone, hasTimezoneBottomLine);
}
/// <summary>
/// 获得轨迹地址
/// </summary>
/// <param name="paramConfig">配置信息</param>
/// <param name="matchedContentConfig">配置信息</param>
/// <param name="orderId">订单id</param>
/// <param name="trackToken"></param>
/// <returns>时区,是否执行了兜底轨迹时区</returns>
private async Task<(string? trackPlace, bool hasPlaceBottomLine)> GetTrackPlace(TrackPullParamConfigDto paramConfig,
TrackPullContentConfigDto? matchedContentConfig, int orderId, JToken trackToken)
{
// 轨迹发生地
var trackPlace = paramConfig.TrackPlaceName == null
? null
: trackToken[paramConfig.TrackPlaceName]?.Value<string>();
var hasPlaceBottomLine = false; //执行了兜底但是没有兜底住,需要记录
if (trackPlace.IsNullOrWhiteSpace() && matchedContentConfig?.TrackPlaceValue != null &&
matchedContentConfig.TrackPlaceValue.HasValue)
{
//兜底没配置的就不需要兜底,拉取的发生地没就没
trackPlace = await GetPlaceByOrder(matchedContentConfig!.TrackPlaceValue.Value, orderId);
hasPlaceBottomLine = string.IsNullOrWhiteSpace(trackPlace);
}
return (trackPlace, hasPlaceBottomLine);
}
/// <summary> /// <summary>
/// 根据订单id获取兜底位置 /// 根据订单id获取兜底位置
/// </summary> /// </summary>