diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackPull/TrackPullContentConfigDto.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackPull/TrackPullContentConfigDto.cs index fd0fae59..cab541f3 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/TrackPull/TrackPullContentConfigDto.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackPull/TrackPullContentConfigDto.cs @@ -38,7 +38,7 @@ public class TrackPullContentConfigDto public int? TrackPlaceValue { get; set; } /// - /// 轨迹时区GMT + /// 轨迹时区GMT值 /// - public float? TrackTimeZone { get; set; } + public float? TrackTimeZoneValue { get; set; } } \ No newline at end of file diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackPull/TrackPullParamConfigDto.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackPull/TrackPullParamConfigDto.cs index 37c18332..39de6d21 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/TrackPull/TrackPullParamConfigDto.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackPull/TrackPullParamConfigDto.cs @@ -37,6 +37,11 @@ public class TrackPullParamConfigDto /// public string TrackTimeName { get; set; } = null!; + /// + /// 轨迹发生时间参数名 + /// + public string TrackTimeZoneName { get; set; } = null!; + /// /// 订单数组路径 /// diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackPull/TrackRefreshAttach.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackPull/TrackRefreshAttach.cs new file mode 100644 index 00000000..ae47f35a --- /dev/null +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackPull/TrackRefreshAttach.cs @@ -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; + } + + /// + /// 服务商id + /// + public int ServiceProviderId { get; set; } + + /// + /// 服务商code + /// + public string ServiceProviderCode { get; set; } + + /// + /// 订单类型(主数据枚举TrackOrderType) + /// + public int OrderType { get; set; } + + /// + /// 子系统id + /// + public int SubSystemId { get; set; } +} \ No newline at end of file diff --git a/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs index 5d2187cb..50cabb23 100644 --- a/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs @@ -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(); - var orderType = attach["OrderType"]!.Value(); - var config = await _trackPullCacheService.GetPullConfigAsync(serviceProviderId); + var attach = JsonConvert.DeserializeObject(@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(); + var orderNo = orderToken[paramConfig.OrderNoName]?.Value(); 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(); + if (!serviceProviderTrackCode.IsNullOrWhiteSpace()) + { + trackContent = contentConfigs.FirstOrDefault(x => x.TrackContentCodeValue == serviceProviderTrackCode); + } + + // 2、匹配轨迹状态 + if (trackContent is null) + { + var serviceProviderTrackStatus = trackToken[paramConfig.TrackStatusName]?.Value(); + if (!serviceProviderTrackStatus.IsNullOrWhiteSpace()) + { + trackContent = contentConfigs.FirstOrDefault(x => x.TrackStatusValue == serviceProviderTrackCode); + } + } + + // 3、匹配轨迹内容 + if (trackContent is null) + { + var serviceProviderTrackContent = trackToken[paramConfig.TrackContentName]?.Value(); + 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(); + if (trackPlace.IsNullOrWhiteSpace()) + { + Expression> 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.Now; + trackUpsertEvent.TrackTimeZone = trackToken[paramConfig.TrackTimeZoneName]?.Value() ?? + trackContent.TrackTimeZoneValue ?? 8; await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, trackUpsertEvent); } } \ No newline at end of file diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackPullService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackPullService.cs index 840ccba7..95a2d573 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackPullService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackPullService.cs @@ -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 { diff --git a/src/SJZY.Track.Domain/Dtos/Order/OrderTemplateVO.cs b/src/SJZY.Track.Domain/Dtos/Order/OrderTemplateVO.cs index 723ed89e..6fe7d2b5 100644 --- a/src/SJZY.Track.Domain/Dtos/Order/OrderTemplateVO.cs +++ b/src/SJZY.Track.Domain/Dtos/Order/OrderTemplateVO.cs @@ -17,4 +17,9 @@ public class OrderTemplateVO /// 服务商code /// public string ServiceProviderCode { get; set; } = null!; + + /// + /// 子系统id + /// + public int SubSystemId { get; set; } } \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Enums/TrackLocationValue.cs b/src/SJZY.Track.Domain/Enums/TrackLocationValue.cs new file mode 100644 index 00000000..2aae150e --- /dev/null +++ b/src/SJZY.Track.Domain/Enums/TrackLocationValue.cs @@ -0,0 +1,11 @@ +namespace SJZY.Track.Domain.Enums; + +public enum TrackLocationValue +{ + ArrivalPort = 2, + LeavePort = 3, + ArrivalCountry = 4, + LeaveCountry = 5, + ArriveCity = 6, + LeaveCity = 7 +} \ No newline at end of file diff --git a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs index 1a7383f1..be9cc648 100644 --- a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs @@ -252,7 +252,8 @@ public class OrderRepository : BasicRepository, IOrderRepository, I OrderType = a.OrderType, TemplateId = b.TrackTemplateId, ServiceProviderId = b.ServiceProviderId, - ServiceProviderCode = c.Code + ServiceProviderCode = c.Code, + SubSystemId = a.SubSystemId }) .ToListAsync(); } diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs index da6f784a..e6aae4f0 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs @@ -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 request - .Index(index.IndexName) + .Index(index.IndexName) + .Refresh(Refresh.True) // 可选:立即刷新索引使更改立即可见 ); if (!r.IsValid)