轨迹刷新初步完成

This commit is contained in:
李鹏军 2024-03-09 18:08:42 +08:00
parent 3baf9aea8b
commit 9ae2a8335a
9 changed files with 145 additions and 26 deletions

View File

@ -38,7 +38,7 @@ public class TrackPullContentConfigDto
public int? TrackPlaceValue { get; set; }
/// <summary>
/// 轨迹时区GMT
/// 轨迹时区GMT值
/// </summary>
public float? TrackTimeZone { get; set; }
public float? TrackTimeZoneValue { get; set; }
}

View File

@ -37,6 +37,11 @@ public class TrackPullParamConfigDto
/// </summary>
public string TrackTimeName { get; set; } = null!;
/// <summary>
/// 轨迹发生时间参数名
/// </summary>
public string TrackTimeZoneName { get; set; } = null!;
/// <summary>
/// 订单数组路径
/// </summary>

View File

@ -0,0 +1,32 @@
namespace SJZY.Track.Application.Contract.Dtos.TrackPull;
public class TrackRefreshAttach
{
public TrackRefreshAttach(int serviceProviderId, string serviceProviderCode, int subSystemId, int orderType)
{
ServiceProviderId = serviceProviderId;
ServiceProviderCode = serviceProviderCode;
SubSystemId = subSystemId;
OrderType = orderType;
}
/// <summary>
/// 服务商id
/// </summary>
public int ServiceProviderId { get; set; }
/// <summary>
/// 服务商code
/// </summary>
public string ServiceProviderCode { get; set; }
/// <summary>
/// 订单类型(主数据枚举TrackOrderType)
/// </summary>
public int OrderType { get; set; }
/// <summary>
/// 子系统id
/// </summary>
public int SubSystemId { get; set; }
}

View File

@ -1,10 +1,14 @@
using DotNetCore.CAP;
using System.Linq.Expressions;
using DotNetCore.CAP;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using SJZY.Expand.ABP.Core.PublicMethords;
using SJZY.InterfaceRelay.Application.Contracts;
using SJZY.Track.Application.Contract.Dtos.TrackPull;
using SJZY.Track.Application.Contract.Events;
using SJZY.Track.Application.Contract.Services;
using SJZY.Track.Domain.Aggregates.OrderAggregate;
using SJZY.Track.Domain.Enums;
using Volo.Abp.DependencyInjection;
namespace SJZY.Track.Application.EventHandlers;
@ -27,30 +31,29 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe
public async Task ConsumerAsync(InterfaceRelayTrackRefreshEvent @event)
{
// tips:attach返回的是服务商id,必有
var attach = JObject.Parse(@event.Attach);
var serviceProviderId = attach["ServiceProviderId"]!.Value<int>();
var orderType = attach["OrderType"]!.Value<int>();
var config = await _trackPullCacheService.GetPullConfigAsync(serviceProviderId);
var attach = JsonConvert.DeserializeObject<TrackRefreshAttach>(@event.Attach);
if (attach is null) return;
var config = await _trackPullCacheService.GetPullConfigAsync(attach.ServiceProviderId, attach.SubSystemId);
var data = JObject.FromObject(@event.Data)["Data"]!;
var data = JObject.FromObject(@event.Data);
var orderToken = data[config.ParamConfig.OrderPath];
if (orderToken is JArray orderTokens)
{
foreach (var token in orderTokens)
{
await HandleOrderAsync(token, config, orderType);
await HandleOrderAsync(token, config, attach.OrderType);
}
}
else if (orderToken is JObject)
{
await HandleOrderAsync(orderToken, config, orderType);
await HandleOrderAsync(orderToken, config, attach.OrderType);
}
}
private async Task HandleOrderAsync(JToken token, TrackPullConfigDto config, int orderType)
private async Task HandleOrderAsync(JToken orderToken, TrackPullConfigDto config, int orderType)
{
var paramConfig = config.ParamConfig;
var orderNo = token[paramConfig.OrderNoName]?.Value<string>();
var orderNo = orderToken[paramConfig.OrderNoName]?.Value<string>();
if (orderNo.IsNullOrWhiteSpace()) return;
var order = await _orderRepository.GetFirstAsync(x =>
@ -60,7 +63,7 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe
});
if (order == default) return;
var trackToken = token[paramConfig.TrackDetailsPath];
var trackToken = orderToken[paramConfig.TrackDetailsPath];
if (trackToken is null) return;
var trackUpsertEvent = new TrackUpsertEvent
{
@ -79,17 +82,78 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe
await HandleTrackAsync(item, config, trackUpsertEvent);
}
}
else if (orderToken is JObject)
{
await HandleTrackAsync(orderToken, config, trackUpsertEvent);
}
}
private async Task HandleTrackAsync(JToken token, TrackPullConfigDto config,
TrackUpsertEvent trackUpsertEvent)
private async Task HandleTrackAsync(JToken trackToken, TrackPullConfigDto config,
TrackUpsertEvent @event)
{
var trackUpsertEvent = @event.DeepCopy();
var paramConfig = config.ParamConfig;
var contentConfigs = config.ContentConfigs;
TrackPullContentConfigDto? trackContent = null;
// 1、匹配轨迹代码
var serviceProviderTrackCode = trackToken[paramConfig.TrackContentCodeName]?.Value<string>();
if (!serviceProviderTrackCode.IsNullOrWhiteSpace())
{
trackContent = contentConfigs.FirstOrDefault(x => x.TrackContentCodeValue == serviceProviderTrackCode);
}
// 2、匹配轨迹状态
if (trackContent is null)
{
var serviceProviderTrackStatus = trackToken[paramConfig.TrackStatusName]?.Value<string>();
if (!serviceProviderTrackStatus.IsNullOrWhiteSpace())
{
trackContent = contentConfigs.FirstOrDefault(x => x.TrackStatusValue == serviceProviderTrackCode);
}
}
// 3、匹配轨迹内容
if (trackContent is null)
{
var serviceProviderTrackContent = trackToken[paramConfig.TrackContentName]?.Value<string>();
if (!serviceProviderTrackContent.IsNullOrWhiteSpace())
{
trackContent = contentConfigs.FirstOrDefault(x => x.TrackContentValue == serviceProviderTrackCode);
// 3.1、按关键字匹配
if (trackContent is null)
{
}
}
}
if (trackContent is null) return;
var trackPlace = trackToken[paramConfig.TrackPlaceName]?.Value<string>();
if (trackPlace.IsNullOrWhiteSpace())
{
Expression<Func<OrderEntity, string?>> resultExpression =
(TrackLocationValue?)trackContent.TrackPlaceValue 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
};
trackPlace = await _orderRepository.GetFirstAsync(x =>
x.Id == trackUpsertEvent.OrderId, resultExpression);
}
// 新增/更新轨迹
trackUpsertEvent.TrackCode = null;
trackUpsertEvent.TrackPlace = null;
trackUpsertEvent.TrackTime = null;
trackUpsertEvent.TrackTimeZone = null;
trackUpsertEvent.UpSubSystemId = 0;
trackUpsertEvent.TrackCode = trackContent.TrackContentCode;
trackUpsertEvent.TrackPlace = trackPlace ?? "CN";
trackUpsertEvent.TrackTime = trackToken[paramConfig.TrackTimeName]?.Value<DateTime>() ?? DateTime.Now;
trackUpsertEvent.TrackTimeZone = trackToken[paramConfig.TrackTimeZoneName]?.Value<float>() ??
trackContent.TrackTimeZoneValue ?? 8;
await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, trackUpsertEvent);
}
}

View File

@ -1,6 +1,7 @@
using Newtonsoft.Json;
using SJZY.InterfaceRelay.Application.Contracts;
using SJZY.Track.Application.Contract.Dtos.ProvideServices;
using SJZY.Track.Application.Contract.Dtos.TrackPull;
using SJZY.Track.Domain.Aggregates.OrderAggregate;
using Volo.Abp.Http.Client.DynamicProxying;
@ -40,10 +41,8 @@ public class TrackPullService : ApplicationService
var orderTemplates = await _orderRepository.GetOrderTemplatesAsync(input.OrderNos);
foreach (var group in orderTemplates.GroupBy(x => new
{
x.ServiceProviderId, x.OrderType, x.ServiceProviderCode
}))
foreach (var group in orderTemplates.GroupBy(x =>
new TrackRefreshAttach(x.ServiceProviderId, x.ServiceProviderCode, x.SubSystemId, x.OrderType)))
{
var data = group.Select(x => new
{

View File

@ -17,4 +17,9 @@ public class OrderTemplateVO
/// 服务商code
/// </summary>
public string ServiceProviderCode { get; set; } = null!;
/// <summary>
/// 子系统id
/// </summary>
public int SubSystemId { get; set; }
}

View File

@ -0,0 +1,11 @@
namespace SJZY.Track.Domain.Enums;
public enum TrackLocationValue
{
ArrivalPort = 2,
LeavePort = 3,
ArrivalCountry = 4,
LeaveCountry = 5,
ArriveCity = 6,
LeaveCity = 7
}

View File

@ -252,7 +252,8 @@ public class OrderRepository : BasicRepository<OrderEntity>, IOrderRepository, I
OrderType = a.OrderType,
TemplateId = b.TrackTemplateId,
ServiceProviderId = b.ServiceProviderId,
ServiceProviderCode = c.Code
ServiceProviderCode = c.Code,
SubSystemId = a.SubSystemId
})
.ToListAsync();
}

View File

@ -1,3 +1,4 @@
using Elasticsearch.Net;
using Nest;
using SJZY.Expand.ABP.Core.Logger;
using SJZY.Expand.ElasticSearch.Services;
@ -38,7 +39,8 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract<TrackDetail
{
// 按天写入es
var r = await Context.IndexAsync(index, request => request
.Index(index.IndexName)
.Index(index.IndexName)
.Refresh(Refresh.True) // 可选:立即刷新索引使更改立即可见
);
if (!r.IsValid)