temp
This commit is contained in:
parent
e0e376404e
commit
6ed311bc1f
@ -2,12 +2,9 @@ namespace SJZY.Track.Application.Contract.Dtos.TrackPull;
|
||||
|
||||
public class TrackRefreshAttach
|
||||
{
|
||||
public TrackRefreshAttach(string serviceProviderCode, string serviceProviderName, string subSystemCode,
|
||||
int subSystemId, int orderType)
|
||||
public TrackRefreshAttach(string serviceProviderCode, int subSystemId, int orderType)
|
||||
{
|
||||
ServiceProviderCode = serviceProviderCode;
|
||||
ServiceProviderName = serviceProviderName;
|
||||
SubSystemCode = subSystemCode;
|
||||
SubSystemId = subSystemId;
|
||||
OrderType = orderType;
|
||||
}
|
||||
@ -17,21 +14,11 @@ public class TrackRefreshAttach
|
||||
/// </summary>
|
||||
public string ServiceProviderCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 服务商name
|
||||
/// </summary>
|
||||
public string ServiceProviderName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 订单类型(主数据枚举TrackOrderType)
|
||||
/// </summary>
|
||||
public int OrderType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 子系统code
|
||||
/// </summary>
|
||||
public string SubSystemCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 子系统id
|
||||
/// </summary>
|
||||
|
||||
@ -18,9 +18,9 @@ public class TrackRefreshContext
|
||||
public string OrderNo { get; set; } = null!;
|
||||
|
||||
/// <summary>
|
||||
/// 服务商
|
||||
/// 服务商代码
|
||||
/// </summary>
|
||||
public string ServiceProviderName { get; set; } = null!;
|
||||
public string ServiceProviderCode { get; set; } = null!;
|
||||
|
||||
/// <summary>
|
||||
/// 客户id
|
||||
|
||||
@ -3,9 +3,9 @@ namespace SJZY.Track.Application.Contract.Events;
|
||||
public struct TrackRefreshStruct
|
||||
{
|
||||
/// <summary>
|
||||
/// 服务商
|
||||
/// 服务商code
|
||||
/// </summary>
|
||||
public string? ServiceProviderName { get; set; }
|
||||
public string? ServiceProviderCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 原轨迹内容
|
||||
|
||||
@ -54,11 +54,6 @@ public class TrackUpsertEvent
|
||||
|
||||
public TrackRefreshStruct TrackRefreshData { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 时区缺失和发生地缺失标记,1表示时区,2表示发生地,3表示两种
|
||||
/// </summary>
|
||||
public int DeficiencyTagValue { get; set; }
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return
|
||||
|
||||
@ -4,17 +4,16 @@ namespace SJZY.Track.Application.Contract.Services;
|
||||
|
||||
public interface ITrackPullCacheService
|
||||
{
|
||||
string TrackPullKey(string subSystemCode, string serviceProviderCode);
|
||||
string TrackPullContentKey(string subSystemCode, string serviceProviderCode);
|
||||
string TrackPullKey(int subSystemId, string serviceProviderCode);
|
||||
|
||||
/// <summary>
|
||||
/// 获取服务商拉取配置
|
||||
/// </summary>
|
||||
/// <param name="subSystemCode">子系统code</param>
|
||||
/// <param name="subSystemId">子系统id</param>
|
||||
/// <param name="serviceProviderCode">服务商code</param>
|
||||
/// <returns></returns>
|
||||
Task<TrackPullParamsWithContentDto?>
|
||||
GetPullParamsWithContentAsync(string subSystemCode, string serviceProviderCode);
|
||||
GetPullParamsWithContentAsync(int subSystemId, string serviceProviderCode);
|
||||
|
||||
/// <summary>
|
||||
/// 设置拉取配置缓存
|
||||
|
||||
@ -4,6 +4,9 @@ using SJZY.Track.Domain.Aggregates.OrderAggregate;
|
||||
|
||||
namespace SJZY.Track.Application.BackgroundServices;
|
||||
|
||||
/// <summary>
|
||||
/// 订单拉取状态扫描
|
||||
/// </summary>
|
||||
public class OrderPullStatusScanner : BackgroundService
|
||||
{
|
||||
private readonly IOrderRepository _orderRepository;
|
||||
|
||||
@ -0,0 +1,156 @@
|
||||
using System.Linq.Expressions;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using SJZY.Track.Application.Contract.Dtos.TrackPull;
|
||||
using SJZY.Track.Application.Helpers;
|
||||
using SJZY.Track.Domain.Aggregates.OrderAggregate;
|
||||
using SJZY.Track.Domain.Enums;
|
||||
using SJZY.Track.Domain.Queries;
|
||||
|
||||
namespace SJZY.Track.Application.BackgroundServices;
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹兜底扫描
|
||||
/// </summary>
|
||||
public class TrackButtonUpScanner : BackgroundService
|
||||
{
|
||||
private readonly IOrderRepository _orderRepository;
|
||||
private readonly ITimezoneQueries _timezoneQueries;
|
||||
|
||||
public TrackButtonUpScanner(ITimezoneQueries timezoneQueries, IOrderRepository orderRepository)
|
||||
{
|
||||
_timezoneQueries = timezoneQueries;
|
||||
_orderRepository = orderRepository;
|
||||
}
|
||||
|
||||
|
||||
protected override Task ExecuteAsync(CancellationToken stoppingToken)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取轨迹时区
|
||||
/// </summary>
|
||||
/// <param name="matchedContentConfig">配置信息</param>
|
||||
/// <param name="context">订单id</param>
|
||||
/// <returns>时区,是否执行了兜底轨迹时区</returns>
|
||||
private async Task<(float? trackTimeZone, bool hasTimezoneBottomLine)> GetTimezone(
|
||||
TrackPullContentConfigDto? matchedContentConfig,
|
||||
TrackRefreshContext context)
|
||||
{
|
||||
float? trackTimeZone = null;
|
||||
var hasTimezoneBottomLine = false; // 执行了兜底但是没有兜底住,需要记录
|
||||
if (matchedContentConfig?.TrackZonePlaceValue is not null)
|
||||
{
|
||||
//兜底没配置的就不需要兜底,拉取的发生地没就没
|
||||
var timezone = await GetTimezone(matchedContentConfig, context.OrderId);
|
||||
|
||||
trackTimeZone = timezone;
|
||||
hasTimezoneBottomLine = !timezone.HasValue;
|
||||
}
|
||||
|
||||
return (trackTimeZone, hasTimezoneBottomLine);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获得轨迹地址
|
||||
/// </summary>
|
||||
/// <param name="matchedContentConfig">配置信息</param>
|
||||
/// <param name="context">订单id</param>
|
||||
/// <returns>时区,是否执行了兜底轨迹时区</returns>
|
||||
private async Task<(string? trackPlace, bool hasPlaceBottomLine)> GetTrackPlace(
|
||||
TrackPullContentConfigDto? matchedContentConfig, TrackRefreshContext context)
|
||||
{
|
||||
string? trackPlace = null;
|
||||
var hasPlaceBottomLine = false; //执行了兜底但是没有兜底住,需要记录
|
||||
if (matchedContentConfig?.TrackPlaceValue is not null)
|
||||
{
|
||||
//兜底没配置的就不需要兜底,拉取的发生地没就没
|
||||
trackPlace = await GetPlaceByOrder(matchedContentConfig!.TrackPlaceValue.Value, context.OrderId);
|
||||
hasPlaceBottomLine = string.IsNullOrWhiteSpace(trackPlace);
|
||||
}
|
||||
|
||||
return (trackPlace, hasPlaceBottomLine);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据订单id获取兜底位置
|
||||
/// </summary>
|
||||
/// <param name="trackValue"></param>
|
||||
/// <param name="orderId"></param>
|
||||
/// <returns></returns>
|
||||
private Task<string?> GetPlaceByOrder(int trackValue, int orderId)
|
||||
{
|
||||
Expression<Func<OrderEntity, string?>> resultExpression =
|
||||
(TrackLocationValue) trackValue switch
|
||||
{
|
||||
TrackLocationValue.ArrivalPort => x => x.ArrivalPort,
|
||||
TrackLocationValue.ArriveCity => x => x.ArrivalCity,
|
||||
TrackLocationValue.ArrivalCountry => x => x.ArrivalCountry,
|
||||
TrackLocationValue.LeavePort => x => x.LeavePort,
|
||||
TrackLocationValue.LeaveCity => x => x.LeaveCity,
|
||||
TrackLocationValue.LeaveCountry => x => x.LeaveCountry,
|
||||
_ => x => x.LeaveCountry
|
||||
};
|
||||
return _orderRepository.GetFirstAsync(x => x.Id == orderId, resultExpression);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取时区
|
||||
/// </summary>
|
||||
/// <param name="matchedContentConfig"></param>
|
||||
/// <param name="orderId"></param>
|
||||
/// <returns></returns>
|
||||
private async Task<float?> GetTimezone(TrackPullContentConfigDto matchedContentConfig, int orderId)
|
||||
{
|
||||
var placeOrCode = await GetPlaceByOrder(matchedContentConfig!.TrackZonePlaceValue.Value, orderId);
|
||||
string timezone = null;
|
||||
if (!string.IsNullOrEmpty(placeOrCode))
|
||||
{
|
||||
if (matchedContentConfig!.TrackZonePlaceValue.Value == (int) TrackLocationValue.ArrivalPort
|
||||
|| matchedContentConfig!.TrackZonePlaceValue.Value == (int) TrackLocationValue.LeavePort)
|
||||
{
|
||||
timezone = await _timezoneQueries.GetPortTimezone(placeOrCode);
|
||||
return DateTimeHelper.ConvertTimeZoneToFloat(timezone);
|
||||
}
|
||||
|
||||
timezone = await _timezoneQueries.GetCityTimezone(placeOrCode);
|
||||
return DateTimeHelper.ConvertTimeZoneToFloat(timezone);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 触发了兜底,但是没有兜底住,对订单进行标记
|
||||
/// 1表示时区,2表示发生地,3表示两种
|
||||
/// </summary>
|
||||
/// <param name="hasPlaceBottomLine"></param>
|
||||
/// <param name="hasTimezoneBottomLine"></param>
|
||||
/// <param name="trackToken"></param>
|
||||
/// <param name="context"></param>
|
||||
/// <returns></returns>
|
||||
private int CalcDeficiencyTagValue(bool hasPlaceBottomLine, bool hasTimezoneBottomLine, JToken trackToken,
|
||||
TrackRefreshContext context)
|
||||
{
|
||||
var deficiencyTagValue = 0;
|
||||
|
||||
if (hasTimezoneBottomLine)
|
||||
{
|
||||
// _logger.LogWarning("订单号:{@OrderNo}, 轨迹发生时区无法解析,触发了兜底,但是没有兜底住:{@Data}", context.OrderNo,
|
||||
// trackToken.ToString());
|
||||
deficiencyTagValue += 1;
|
||||
}
|
||||
|
||||
if (hasPlaceBottomLine)
|
||||
{
|
||||
// _logger.LogWarning("订单号:{@OrderNo}, 轨迹发生地无法解析,触发了兜底,但是没有兜底住:{@Data}", context.OrderNo,
|
||||
// trackToken.ToString());
|
||||
deficiencyTagValue += 2;
|
||||
}
|
||||
|
||||
return deficiencyTagValue;
|
||||
}
|
||||
}
|
||||
@ -61,7 +61,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
|
||||
nextEvent.CustomId = group.Key.CustomId;
|
||||
nextEvent.TrackRefreshData = new TrackRefreshStruct
|
||||
{
|
||||
ServiceProviderName = @event.TrackRefreshData.ServiceProviderName,
|
||||
ServiceProviderCode = @event.TrackRefreshData.ServiceProviderCode,
|
||||
OriginTrackContent = @event.TrackRefreshData.OriginTrackContent,
|
||||
OriginTrackDataHash = @event.TrackRefreshData.OriginTrackDataHash,
|
||||
};
|
||||
@ -171,7 +171,6 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
|
||||
TrackPlace = @event.TrackPlace,
|
||||
TrackTime = @event.TrackTime,
|
||||
TrackTimeZone = @event.TrackTimeZone,
|
||||
DeficiencyTagValue = @event.DeficiencyTagValue
|
||||
});
|
||||
|
||||
// 触发轨迹推送事件(异步)
|
||||
@ -241,7 +240,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
|
||||
TrackPlace = @event.TrackPlace,
|
||||
TrackTime = @event.TrackTime,
|
||||
TrackTimeZone = @event.TrackTimeZone,
|
||||
ServiceProviderName = @event.TrackRefreshData.ServiceProviderName ?? GlobalConst.EmptyString,
|
||||
ServiceProviderCode = @event.TrackRefreshData.ServiceProviderCode ?? GlobalConst.EmptyString,
|
||||
OriginTrackContent = @event.TrackRefreshData.OriginTrackContent ?? GlobalConst.EmptyString,
|
||||
OriginTrackDataHash = @event.TrackRefreshData.OriginTrackDataHash ?? GlobalConst.EmptyString,
|
||||
CreateUser = @event.OperationMan ?? GlobalConst.SystemUser,
|
||||
|
||||
@ -1,5 +1,4 @@
|
||||
using System.Diagnostics;
|
||||
using System.Linq.Expressions;
|
||||
using System.Text;
|
||||
using BSI.Stack.Rabbit;
|
||||
using BSI.Stack.Rabbit.Handler;
|
||||
@ -16,8 +15,6 @@ using SJZY.Track.Application.Contract.Services;
|
||||
using SJZY.Track.Application.Helpers;
|
||||
using SJZY.Track.Domain.Aggregates.OrderAggregate;
|
||||
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
|
||||
using SJZY.Track.Domain.Enums;
|
||||
using SJZY.Track.Domain.Queries;
|
||||
using Volo.Abp.DependencyInjection;
|
||||
|
||||
namespace SJZY.Track.Application.Rabbit;
|
||||
@ -27,20 +24,18 @@ public class TrackRefreshEventHandler : ITransientDependency, IRabbitHandler
|
||||
private readonly ICapPublisher _capPublisher;
|
||||
private readonly ILogger<TrackRefreshEventHandler> _logger;
|
||||
private readonly IOrderRepository _orderRepository;
|
||||
private readonly ITimezoneQueries _timezoneQueries;
|
||||
private readonly ITrackDetailsEsRepository _trackDetailsEsRepository;
|
||||
private readonly ITrackPullCacheService _trackPullCacheService;
|
||||
|
||||
public TrackRefreshEventHandler(IOrderRepository orderRepository,
|
||||
ICapPublisher capPublisher, ITrackPullCacheService trackPullCacheService,
|
||||
ITrackDetailsEsRepository trackDetailsEsRepository, ITimezoneQueries timezoneQueries,
|
||||
ITrackDetailsEsRepository trackDetailsEsRepository,
|
||||
ILogger<TrackRefreshEventHandler> logger)
|
||||
{
|
||||
_orderRepository = orderRepository;
|
||||
_capPublisher = capPublisher;
|
||||
_trackPullCacheService = trackPullCacheService;
|
||||
_trackDetailsEsRepository = trackDetailsEsRepository;
|
||||
_timezoneQueries = timezoneQueries;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
@ -79,7 +74,7 @@ public class TrackRefreshEventHandler : ITransientDependency, IRabbitHandler
|
||||
return;
|
||||
}
|
||||
|
||||
var config = await _trackPullCacheService.GetPullParamsWithContentAsync(attach.SubSystemCode,
|
||||
var config = await _trackPullCacheService.GetPullParamsWithContentAsync(attach.SubSystemId,
|
||||
attach.ServiceProviderCode);
|
||||
if (config == null)
|
||||
{
|
||||
@ -114,11 +109,10 @@ public class TrackRefreshEventHandler : ITransientDependency, IRabbitHandler
|
||||
if (trackToken is null) return;
|
||||
|
||||
var order = await _orderRepository.GetFirstAsync(x =>
|
||||
x.OrderType == attach.OrderType && x.OrderNo == orderNo,
|
||||
x.SubSystemId == attach.SubSystemId && x.OrderType == attach.OrderType && x.OrderNo == orderNo,
|
||||
x => new
|
||||
{
|
||||
x.Id,
|
||||
x.LatestPushTrackCode,
|
||||
x.CustomId
|
||||
});
|
||||
if (order == default) return;
|
||||
@ -128,7 +122,7 @@ public class TrackRefreshEventHandler : ITransientDependency, IRabbitHandler
|
||||
OrderId = order.Id,
|
||||
OrderType = attach.OrderType,
|
||||
OrderNo = orderNo!,
|
||||
ServiceProviderName = attach.ServiceProviderName,
|
||||
ServiceProviderCode = attach.ServiceProviderCode,
|
||||
CustomId = order.CustomId,
|
||||
SubSystemId = attach.SubSystemId
|
||||
};
|
||||
@ -161,6 +155,11 @@ public class TrackRefreshEventHandler : ITransientDependency, IRabbitHandler
|
||||
var contentConfigs = paramsWithContent.ContentConfigs;
|
||||
TrackPullContentConfigDto? matchedContentConfig = null;
|
||||
|
||||
// 轨迹内容
|
||||
var trackContent = paramConfig.TrackContentName == null
|
||||
? null
|
||||
: trackToken[paramConfig.TrackContentName]?.Value<string>();
|
||||
|
||||
// 1、匹配轨迹代码
|
||||
|
||||
// 2、匹配轨迹状态
|
||||
@ -175,7 +174,6 @@ public class TrackRefreshEventHandler : ITransientDependency, IRabbitHandler
|
||||
// 3、匹配轨迹内容
|
||||
else if (!paramConfig.TrackContentName.IsNullOrWhiteSpace())
|
||||
{
|
||||
var trackContent = trackToken[paramConfig.TrackContentName!]?.Value<string>();
|
||||
if (!trackContent.IsNullOrWhiteSpace())
|
||||
{
|
||||
Debug.Assert(trackContent != null, nameof(trackContent) + " != null");
|
||||
@ -215,25 +213,24 @@ public class TrackRefreshEventHandler : ITransientDependency, IRabbitHandler
|
||||
var trackTime = paramConfig.TrackTimeName == null
|
||||
? null
|
||||
: trackToken[paramConfig.TrackTimeName]?.Value<DateTime>();
|
||||
|
||||
// 轨迹时区
|
||||
var (trackTimeZone, hasTimezoneBottomLine) =
|
||||
await GetTimezone(paramConfig, matchedContentConfig, context, trackToken);
|
||||
|
||||
// 轨迹发生时区
|
||||
var trackTimeZone = paramConfig.TrackTimeZoneName == null
|
||||
? null
|
||||
: trackToken[paramConfig.TrackTimeZoneName]?.Value<float>();
|
||||
// 轨迹发生地
|
||||
var (trackPlace, hasPlaceBottomLine) =
|
||||
await GetTrackPlace(paramConfig, matchedContentConfig, context, trackToken);
|
||||
var trackPlace = paramConfig.TrackPlaceName == null
|
||||
? null
|
||||
: trackToken[paramConfig.TrackPlaceName]?.Value<string>();
|
||||
|
||||
|
||||
if (matchedContentConfig is null)
|
||||
{
|
||||
_logger.LogDebug("订单号:{OrderNo},未匹配到轨迹内容,轨迹报文:{TrackContent}",
|
||||
context.OrderNo, trackToken.ToString());
|
||||
await InsertNotMappedTrackAsync(trackToken, context, trackPlace, trackTime, trackTimeZone, paramConfig);
|
||||
await InsertNotMappedTrackAsync(trackToken, context, trackPlace, trackTime, trackTimeZone, trackContent);
|
||||
return;
|
||||
}
|
||||
|
||||
var deficiencyTagValue = CalcDeficiencyTagValue(hasPlaceBottomLine, hasTimezoneBottomLine, trackToken, context);
|
||||
|
||||
// 新增/更新轨迹
|
||||
var trackUpsertEvent = new TrackUpsertEvent
|
||||
{
|
||||
@ -249,57 +246,23 @@ public class TrackRefreshEventHandler : ITransientDependency, IRabbitHandler
|
||||
},
|
||||
TrackRefreshData = new TrackRefreshStruct
|
||||
{
|
||||
ServiceProviderName = context.ServiceProviderName,
|
||||
ServiceProviderCode = context.ServiceProviderCode,
|
||||
OriginTrackDataHash = originTrackDataHash,
|
||||
OriginTrackContent = paramConfig.TrackContentName != null
|
||||
? trackToken[paramConfig.TrackContentName]?.Value<string>()
|
||||
: GlobalConst.EmptyString
|
||||
OriginTrackContent = trackContent ?? GlobalConst.EmptyString,
|
||||
},
|
||||
SubSystemId = context.SubSystemId,
|
||||
TrackCode = matchedContentConfig.TrackContentCode,
|
||||
TrackPlace = trackPlace ?? GlobalConst.EmptyString,
|
||||
TrackTime = trackTime ?? DateTime.Now,
|
||||
TrackTimeZone = trackTimeZone ?? GlobalConst.NoneTrackTimeZone,
|
||||
DeficiencyTagValue = deficiencyTagValue,
|
||||
IsAdd = true,
|
||||
};
|
||||
|
||||
await _capPublisher.PublishAsync(GlobalConst.TrackUpsertForRefreshSubscribe, trackUpsertEvent);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 触发了兜底,但是没有兜底住,对订单进行标记
|
||||
/// 1表示时区,2表示发生地,3表示两种
|
||||
/// </summary>
|
||||
/// <param name="hasPlaceBottomLine"></param>
|
||||
/// <param name="hasTimezoneBottomLine"></param>
|
||||
/// <param name="trackToken"></param>
|
||||
/// <param name="context"></param>
|
||||
/// <returns></returns>
|
||||
private int CalcDeficiencyTagValue(bool hasPlaceBottomLine, bool hasTimezoneBottomLine, JToken trackToken,
|
||||
TrackRefreshContext context)
|
||||
{
|
||||
var deficiencyTagValue = 0;
|
||||
|
||||
if (hasTimezoneBottomLine)
|
||||
{
|
||||
_logger.LogWarning("订单号:{@OrderNo}, 轨迹发生时区无法解析,触发了兜底,但是没有兜底住:{@Data}", context.OrderNo,
|
||||
trackToken.ToString());
|
||||
deficiencyTagValue += 1;
|
||||
}
|
||||
|
||||
if (hasPlaceBottomLine)
|
||||
{
|
||||
_logger.LogWarning("订单号:{@OrderNo}, 轨迹发生地无法解析,触发了兜底,但是没有兜底住:{@Data}", context.OrderNo,
|
||||
trackToken.ToString());
|
||||
deficiencyTagValue += 2;
|
||||
}
|
||||
|
||||
return deficiencyTagValue;
|
||||
}
|
||||
|
||||
private async Task InsertNotMappedTrackAsync(JToken trackToken, TrackRefreshContext context, string? trackPlace,
|
||||
DateTime? trackTime, float? trackTimeZone, TrackPullParamConfigDto paramConfig)
|
||||
DateTime? trackTime, float? trackTimeZone, string? trackContent)
|
||||
{
|
||||
// 新增服务商轨迹到es
|
||||
var track = new TrackDetailsIndex
|
||||
@ -312,16 +275,12 @@ public class TrackRefreshEventHandler : ITransientDependency, IRabbitHandler
|
||||
TrackPlace = trackPlace ?? GlobalConst.EmptyString,
|
||||
TrackTime = trackTime ?? DateTime.Now,
|
||||
TrackTimeZone = trackTimeZone ?? GlobalConst.NoneTrackTimeZone,
|
||||
ServiceProviderName = context.ServiceProviderName,
|
||||
ServiceProviderCode = context.ServiceProviderCode,
|
||||
OriginTrackDataHash = StringHelper.GetHash(JsonConvert.SerializeObject(trackToken)),
|
||||
OriginTrackContent = trackContent ?? GlobalConst.EmptyString,
|
||||
CreateUser = GlobalConst.SystemUser,
|
||||
CreateTime = DateTime.Now
|
||||
};
|
||||
if (!paramConfig.TrackContentName.IsNullOrWhiteSpace())
|
||||
{
|
||||
track.OriginTrackContent =
|
||||
trackToken[paramConfig.TrackContentName!]?.Value<string>() ?? GlobalConst.EmptyString;
|
||||
}
|
||||
|
||||
track.ZeroTrackTime = Math.Abs(track.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1
|
||||
? track.TrackTime
|
||||
@ -329,109 +288,4 @@ public class TrackRefreshEventHandler : ITransientDependency, IRabbitHandler
|
||||
|
||||
await _trackDetailsEsRepository.AddAsync(track);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取轨迹时区
|
||||
/// </summary>
|
||||
/// <param name="paramConfig">配置信息</param>
|
||||
/// <param name="matchedContentConfig">配置信息</param>
|
||||
/// <param name="context">订单id</param>
|
||||
/// <param name="trackToken"></param>
|
||||
/// <returns>时区,是否执行了兜底轨迹时区</returns>
|
||||
private async Task<(float? trackTimeZone, bool hasTimezoneBottomLine)> GetTimezone(
|
||||
TrackPullParamConfigDto paramConfig, TrackPullContentConfigDto? matchedContentConfig,
|
||||
TrackRefreshContext context,
|
||||
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, context.OrderId);
|
||||
|
||||
trackTimeZone = timezone;
|
||||
hasTimezoneBottomLine = !timezone.HasValue;
|
||||
}
|
||||
|
||||
return (trackTimeZone, hasTimezoneBottomLine);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获得轨迹地址
|
||||
/// </summary>
|
||||
/// <param name="paramConfig">配置信息</param>
|
||||
/// <param name="matchedContentConfig">配置信息</param>
|
||||
/// <param name="context">订单id</param>
|
||||
/// <param name="trackToken"></param>
|
||||
/// <returns>时区,是否执行了兜底轨迹时区</returns>
|
||||
private async Task<(string? trackPlace, bool hasPlaceBottomLine)> GetTrackPlace(TrackPullParamConfigDto paramConfig,
|
||||
TrackPullContentConfigDto? matchedContentConfig, TrackRefreshContext context, JToken trackToken)
|
||||
{
|
||||
// 轨迹发生地
|
||||
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);
|
||||
}
|
||||
|
||||
return (trackPlace, hasPlaceBottomLine);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据订单id获取兜底位置
|
||||
/// </summary>
|
||||
/// <param name="trackValue"></param>
|
||||
/// <param name="orderId"></param>
|
||||
/// <returns></returns>
|
||||
private Task<string?> GetPlaceByOrder(int trackValue, int orderId)
|
||||
{
|
||||
Expression<Func<OrderEntity, string?>> resultExpression =
|
||||
(TrackLocationValue) trackValue switch
|
||||
{
|
||||
TrackLocationValue.ArrivalPort => x => x.ArrivalPort,
|
||||
TrackLocationValue.ArriveCity => x => x.ArrivalCity,
|
||||
TrackLocationValue.ArrivalCountry => x => x.ArrivalCountry,
|
||||
TrackLocationValue.LeavePort => x => x.LeavePort,
|
||||
TrackLocationValue.LeaveCity => x => x.LeaveCity,
|
||||
TrackLocationValue.LeaveCountry => x => x.LeaveCountry,
|
||||
_ => x => x.LeaveCountry
|
||||
};
|
||||
return _orderRepository.GetFirstAsync(x => x.Id == orderId, resultExpression);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取时区
|
||||
/// </summary>
|
||||
/// <param name="matchedContentConfig"></param>
|
||||
/// <param name="orderId"></param>
|
||||
/// <returns></returns>
|
||||
private async Task<float?> GetTimezone(TrackPullContentConfigDto matchedContentConfig, int orderId)
|
||||
{
|
||||
var placeOrCode = await GetPlaceByOrder(matchedContentConfig!.TrackZonePlaceValue.Value, orderId);
|
||||
string timezone = null;
|
||||
if (!string.IsNullOrEmpty(placeOrCode))
|
||||
{
|
||||
if (matchedContentConfig!.TrackZonePlaceValue.Value == (int) TrackLocationValue.ArrivalPort
|
||||
|| matchedContentConfig!.TrackZonePlaceValue.Value == (int) TrackLocationValue.LeavePort)
|
||||
{
|
||||
timezone = await _timezoneQueries.GetPortTimezone(placeOrCode);
|
||||
return DateTimeHelper.ConvertTimeZoneToFloat(timezone);
|
||||
}
|
||||
|
||||
timezone = await _timezoneQueries.GetCityTimezone(placeOrCode);
|
||||
return DateTimeHelper.ConvertTimeZoneToFloat(timezone);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@ -59,7 +59,7 @@ public class TrackPullService : ApplicationService, ITrackPullService
|
||||
foreach (var group in orders.GroupBy(x =>
|
||||
new
|
||||
{
|
||||
x.ServiceProviderName,
|
||||
x.ServiceProviderCode,
|
||||
x.SubSystemId,
|
||||
x.SubSystemCode,
|
||||
x.OrderType
|
||||
@ -71,7 +71,8 @@ public class TrackPullService : ApplicationService, ITrackPullService
|
||||
}));
|
||||
var serviceProviderCode = group.FirstOrDefault()!.ServiceProviderCode;
|
||||
|
||||
var attach = Base64Helper.SerializeObject(group.Key);
|
||||
var attach = Base64Helper.SerializeObject(new TrackRefreshAttach(group.Key.ServiceProviderCode,
|
||||
group.Key.SubSystemId, group.Key.OrderType));
|
||||
|
||||
using (Track2InterfaceRelaySubSystemContext.Use(
|
||||
new Track2InterfaceRelaySubSystemContext(group.Key.SubSystemCode)))
|
||||
@ -130,7 +131,7 @@ public class TrackPullService : ApplicationService, ITrackPullService
|
||||
|
||||
private async Task RefreshForConfigAsync(TrackPullConfigVo config)
|
||||
{
|
||||
var redisKey = _trackPullCacheService.TrackPullKey(config.SubSystemCode, config.ServiceProviderCode);
|
||||
var redisKey = _trackPullCacheService.TrackPullKey(config.SubSystemId, config.ServiceProviderCode);
|
||||
if (await RedisHelper.Client.ExistsAsync(redisKey))
|
||||
{
|
||||
return;
|
||||
@ -145,11 +146,10 @@ public class TrackPullService : ApplicationService, ITrackPullService
|
||||
{
|
||||
var page = 1;
|
||||
var orders =
|
||||
await _provideQueries.FindOrderWithServiceProviderAsync(config.ServiceProviderId, page);
|
||||
await _provideQueries.FindOrderWithServiceProviderAsync(config.ServiceProviderCode, page);
|
||||
while (orders.Any())
|
||||
{
|
||||
var serviceProviderCode = orders.FirstOrDefault()?.ServiceProviderCode;
|
||||
var serviceProviderName = orders.FirstOrDefault()?.ServiceProviderName;
|
||||
|
||||
foreach (var group in orders.GroupBy(x => x.OrderType))
|
||||
{
|
||||
@ -158,7 +158,7 @@ public class TrackPullService : ApplicationService, ITrackPullService
|
||||
OrderNo = x.OrderNo
|
||||
}));
|
||||
var attach = Base64Helper.SerializeObject(new TrackRefreshAttach(config.ServiceProviderCode,
|
||||
serviceProviderName!, config.SubSystemCode, config.SubSystemId, group.Key));
|
||||
config.SubSystemId, group.Key));
|
||||
var res = await _httpClientProxy.Service.BatchForwardThenPushToQueueAsync(
|
||||
InterfaceRelayConst.GetTrackInterfaceCode, serviceProviderCode, data,
|
||||
GlobalConst.TrackRefreshSubscribe, attach);
|
||||
@ -169,7 +169,7 @@ public class TrackPullService : ApplicationService, ITrackPullService
|
||||
}
|
||||
}
|
||||
|
||||
orders = await _provideQueries.FindOrderWithServiceProviderAsync(config.ServiceProviderId,
|
||||
orders = await _provideQueries.FindOrderWithServiceProviderAsync(config.ServiceProviderCode,
|
||||
++page);
|
||||
}
|
||||
}
|
||||
|
||||
@ -19,19 +19,16 @@ public class TrackPullCacheService : ITransientDependency, ITrackPullCacheServic
|
||||
_objectMapper = objectMapper;
|
||||
}
|
||||
|
||||
public string TrackPullKey(string subSystemCode, string serviceProviderCode) =>
|
||||
$"{GlobalConst.TrackPullKeyPrefix}:{subSystemCode}:{serviceProviderCode}";
|
||||
public string TrackPullKey(int subSystemId, string serviceProviderCode) =>
|
||||
$"{GlobalConst.TrackPullKeyPrefix}:{subSystemId}:{serviceProviderCode}";
|
||||
|
||||
public string TrackPullContentKey(string subSystemCode, string serviceProviderCode) =>
|
||||
$"{GlobalConst.TrackPullContentKeyPrefix}:{subSystemCode}:{serviceProviderCode}";
|
||||
|
||||
public async Task<TrackPullParamsWithContentDto?> GetPullParamsWithContentAsync(string subSystemCode,
|
||||
public async Task<TrackPullParamsWithContentDto?> GetPullParamsWithContentAsync(int subSystemId,
|
||||
string serviceProviderCode)
|
||||
{
|
||||
var data = await RedisHelper.Client.GetAsync<TrackPullParamsWithContentDto>(TrackPullContentKey(
|
||||
subSystemCode, serviceProviderCode));
|
||||
subSystemId, serviceProviderCode));
|
||||
|
||||
var pullId = await _trackPullConfigRepository.FindIdAsync(subSystemCode, serviceProviderCode);
|
||||
var pullId = await _trackPullConfigRepository.FindIdAsync(subSystemId, serviceProviderCode);
|
||||
data ??= await SetPullConfigAsync(pullId);
|
||||
|
||||
return data;
|
||||
@ -54,8 +51,11 @@ public class TrackPullCacheService : ITransientDependency, ITrackPullCacheServic
|
||||
};
|
||||
|
||||
await RedisHelper.Client.SetAsync(
|
||||
TrackPullContentKey(trackPullConfigDetail.SubSystemCode, trackPullConfigDetail.ServiceProviderCode), data);
|
||||
TrackPullContentKey(trackPullConfigDetail.SubSystemId, trackPullConfigDetail.ServiceProviderCode), data);
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
public string TrackPullContentKey(int subSystemId, string serviceProviderCode) =>
|
||||
$"{GlobalConst.TrackPullContentKeyPrefix}:{subSystemId}:{serviceProviderCode}";
|
||||
}
|
||||
|
||||
@ -53,14 +53,14 @@ public class TrackDetailsIndex : IdBaseIndex
|
||||
public string TrackEnContent { get; set; } = GlobalConst.EmptyString;
|
||||
|
||||
/// <summary>
|
||||
/// 服务商
|
||||
/// 服务商code
|
||||
/// </summary>
|
||||
public string ServiceProviderName { get; set; } = null!;
|
||||
public string ServiceProviderCode { get; set; } = GlobalConst.EmptyString;
|
||||
|
||||
/// <summary>
|
||||
/// 原轨迹内容
|
||||
/// </summary>
|
||||
public string OriginTrackContent { get; set; } = null!;
|
||||
public string? OriginTrackContent { get; set; } = GlobalConst.EmptyString;
|
||||
|
||||
/// <summary>
|
||||
/// 原轨迹报文hash(刷新轨迹重复性校验使用)
|
||||
@ -70,7 +70,7 @@ public class TrackDetailsIndex : IdBaseIndex
|
||||
/// <summary>
|
||||
/// 轨迹发生地
|
||||
/// </summary>
|
||||
public string TrackPlace { get; set; } = null!;
|
||||
public string TrackPlace { get; set; } = GlobalConst.EmptyString;
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹发生时间
|
||||
@ -90,7 +90,7 @@ public class TrackDetailsIndex : IdBaseIndex
|
||||
/// <summary>
|
||||
/// 创建人
|
||||
/// </summary>
|
||||
public string? CreateUser { get; set; }
|
||||
public string CreateUser { get; set; } = GlobalConst.EmptyString;
|
||||
|
||||
/// <summary>
|
||||
/// 创建时间
|
||||
@ -100,7 +100,7 @@ public class TrackDetailsIndex : IdBaseIndex
|
||||
/// <summary>
|
||||
/// 修改人
|
||||
/// </summary>
|
||||
public string? UpdateUser { get; set; }
|
||||
public string UpdateUser { get; set; } = GlobalConst.EmptyString;
|
||||
|
||||
/// <summary>
|
||||
/// 修改时间
|
||||
|
||||
@ -49,5 +49,5 @@ public interface ITrackPullConfigRepository : IBasicRepository<TrackPullConfigEn
|
||||
Task<bool> UpdateContentAsync(TrackPullContentConfigEntity updateObj);
|
||||
|
||||
Task<bool> IsContentAnyAsync(Expression<Func<TrackPullContentConfigEntity, bool>> whereExpression);
|
||||
Task<int> FindIdAsync(string subSystemCode, string serviceProviderCode);
|
||||
Task<int> FindIdAsync(int subSystemId, string serviceProviderCode);
|
||||
}
|
||||
|
||||
@ -1,5 +1,3 @@
|
||||
using SJZY.Track.Domain.Aggregates.OrderAggregate;
|
||||
|
||||
namespace SJZY.Track.Domain.Dtos.Order;
|
||||
|
||||
public class OrderWithServiceProviderVO
|
||||
@ -16,23 +14,13 @@ public class OrderWithServiceProviderVO
|
||||
/// </summary>
|
||||
public string ServiceProviderCode { get; set; } = null!;
|
||||
|
||||
/// <summary>
|
||||
/// 服务商name
|
||||
/// </summary>
|
||||
public string ServiceProviderName { get; set; } = null!;
|
||||
|
||||
/// <summary>
|
||||
/// 子系统code
|
||||
/// </summary>
|
||||
public string SubSystemCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 子系统id
|
||||
/// </summary>
|
||||
public int SubSystemId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹拉取状态
|
||||
/// 子系统code
|
||||
/// </summary>
|
||||
public TrackPullStatus TrackPullStatus { get; set; }
|
||||
public string SubSystemCode { get; set; }
|
||||
}
|
||||
|
||||
@ -37,7 +37,7 @@ public class GetTrackPullConfigDetailOutputVO
|
||||
/// <summary>
|
||||
/// 子系统code
|
||||
/// </summary>
|
||||
public string SubSystemCode { get; set; }
|
||||
public int SubSystemId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 拉取轨迹时区
|
||||
|
||||
@ -29,11 +29,11 @@ public interface IProvideQueries
|
||||
/// <summary>
|
||||
/// 获取服务商下所有单(未完成的)
|
||||
/// </summary>
|
||||
/// <param name="serviceProviderId"></param>
|
||||
/// <param name="serviceProviderCode">服务商代码</param>
|
||||
/// <param name="pageIndex"></param>
|
||||
/// <param name="pageSize"></param>
|
||||
/// <returns></returns>
|
||||
Task<List<OrderWithServiceProviderVO>> FindOrderWithServiceProviderAsync(int serviceProviderId, int pageIndex,
|
||||
Task<List<OrderWithServiceProviderVO>> FindOrderWithServiceProviderAsync(string serviceProviderCode, int pageIndex,
|
||||
int pageSize = 1000);
|
||||
|
||||
/// <summary>
|
||||
|
||||
@ -39,41 +39,36 @@ public class ProvideQueries : ISugarRepository, IProvideQueries, ITransientDepen
|
||||
{
|
||||
return await Context.Queryable<OrderEntity>()
|
||||
.InnerJoin<OrderPullStatusEntity>((a, b) => a.Id == b.OrderId)
|
||||
.LeftJoin<VServiceProviderEntity>((a, b, c) => b.ServiceProviderCode == c.Code)
|
||||
.LeftJoin<VSystemEntity>((a, b, c, d) => a.SubSystemId == d.Id)
|
||||
.LeftJoin<VSystemEntity>((a, b, c) => a.SubSystemId == c.Id)
|
||||
.WhereIF(subSystemId > 0, a => a.SubSystemId == subSystemId)
|
||||
.Where((a, b) => !a.IsCompleted && orderNos.Contains(a.OrderNo)
|
||||
&& b.StartTime <= DateTime.Now && b.EndTime >= DateTime.Now)
|
||||
.Select((a, b, c, d) => new OrderWithServiceProviderVO
|
||||
.Select((a, b, c) => new OrderWithServiceProviderVO
|
||||
{
|
||||
OrderNo = a.OrderNo,
|
||||
OrderType = a.OrderType,
|
||||
ServiceProviderCode = c.Code,
|
||||
ServiceProviderName = c.Name,
|
||||
SubSystemId = a.SubSystemId,
|
||||
SubSystemCode = d.Key
|
||||
ServiceProviderCode = b.ServiceProviderCode,
|
||||
SubSystemCode = c.Key
|
||||
})
|
||||
.ToListAsync();
|
||||
}
|
||||
|
||||
public async Task<List<OrderWithServiceProviderVO>> FindOrderWithServiceProviderAsync(
|
||||
int serviceProviderId,
|
||||
string serviceProviderCode,
|
||||
int pageIndex, int pageSize = 1000)
|
||||
{
|
||||
return await Context.Queryable<OrderEntity>()
|
||||
.RightJoin<OrderPullStatusEntity>((a, b) => a.Id == b.OrderId)
|
||||
.LeftJoin<VServiceProviderEntity>((a, b, c) => b.ServiceProviderCode == c.Code)
|
||||
.LeftJoin<VSystemEntity>((a, b, c, d) => a.SubSystemId == d.Id)
|
||||
.Where((a, b, c) => c.Id == serviceProviderId && !a.IsCompleted
|
||||
&& b.StartTime <= DateTime.Now && b.EndTime >= DateTime.Now)
|
||||
.Select((a, b, c, d) => new OrderWithServiceProviderVO
|
||||
.InnerJoin<OrderPullStatusEntity>((a, b) => a.Id == b.OrderId)
|
||||
.Where((a, b) => b.ServiceProviderCode == serviceProviderCode && !a.IsCompleted
|
||||
&& b.StartTime <= DateTime.Now &&
|
||||
b.EndTime >= DateTime.Now)
|
||||
.Select((a, b) => new OrderWithServiceProviderVO
|
||||
{
|
||||
OrderNo = a.OrderNo,
|
||||
OrderType = a.OrderType,
|
||||
ServiceProviderCode = c.Code,
|
||||
ServiceProviderName = c.Name,
|
||||
SubSystemId = a.SubSystemId,
|
||||
SubSystemCode = d.Key
|
||||
ServiceProviderCode = b.ServiceProviderCode
|
||||
})
|
||||
.Skip((pageIndex - 1) * pageSize)
|
||||
.Take(pageSize)
|
||||
|
||||
@ -84,7 +84,7 @@ public class TrackPullConfigRepository : BasicRepository<TrackPullConfigEntity>,
|
||||
{
|
||||
Id = trackPull.Id,
|
||||
SubSystem = system.CnName,
|
||||
SubSystemCode = system.Key,
|
||||
SubSystemId = system.Id,
|
||||
ServiceProvider = service.Name,
|
||||
ServiceProviderCode = service.Code,
|
||||
}, true)
|
||||
@ -141,12 +141,11 @@ public class TrackPullConfigRepository : BasicRepository<TrackPullConfigEntity>,
|
||||
return await Context.Queryable<TrackPullContentConfigEntity>().Where(whereExpression).AnyAsync();
|
||||
}
|
||||
|
||||
public async Task<int> FindIdAsync(string subSystemCode, string serviceProviderCode)
|
||||
public async Task<int> FindIdAsync(int subSystemId, string serviceProviderCode)
|
||||
{
|
||||
return await AsQueryable()
|
||||
.LeftJoin<VSystemEntity>((trackPull, system) => trackPull.SubSystemId == system.Id)
|
||||
.LeftJoin<VServiceProviderEntity>((trackPull, system, service) => trackPull.ServiceProviderId == service.Id)
|
||||
.Where((trackPull, system, service) => system.Key == subSystemCode && service.Code == serviceProviderCode)
|
||||
.LeftJoin<VServiceProviderEntity>((trackPull, service) => trackPull.ServiceProviderId == service.Id)
|
||||
.Where((trackPull, service) => trackPull.SubSystemId == subSystemId && service.Code == serviceProviderCode)
|
||||
.Select(trackPull => trackPull.Id)
|
||||
.FirstAsync();
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user