From 3127a3a38efe9df0a191e1327df7ed8cc5df4295 Mon Sep 17 00:00:00 2001 From: xiaolipro <2357729423@qq.com> Date: Tue, 6 Aug 2024 16:53:47 +0800 Subject: [PATCH] =?UTF-8?q?change=EF=BC=9A=E8=BD=A8=E8=BF=B9code=E7=9B=B8?= =?UTF-8?q?=E5=90=8C=EF=BC=8C=E6=97=B6=E9=97=B4=E3=80=81=E5=8F=91=E7=94=9F?= =?UTF-8?q?=E5=9C=B0=E4=B8=8D=E5=90=8C=E7=9A=84=EF=BC=8C=E5=85=81=E8=AE=B8?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=E5=A4=9A=E6=9D=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/ProvideServices/GetTrackOutput.cs | 2 +- .../Events/TrackRefreshStruct.cs | 6 +- src/SJZY.Track.Application/CAP/CAPFilter.cs | 25 +---- .../TrackInsertForNotMappedEventHandler.cs | 50 ---------- .../EventHandlers/TrackRefreshEventHandler.cs | 91 +++++++++++-------- .../EventHandlers/TrackUpsertEventHandler.cs | 31 ++++--- .../Helpers/StringHelper.cs | 60 ++++++++---- .../ProvideServices/TrackPullService.cs | 7 +- .../ProvideServices/TrackService.Query.cs | 4 +- .../Services/TrackOrders/TrackOrderService.cs | 5 + .../ITrackDetailsRepository.cs | 2 +- .../TrackDetailsIndex.cs | 38 ++++---- .../VEntities/VAirportEntity.cs | 2 +- .../VEntities/VCityEntity.cs | 2 +- .../Repositories/TrackDetailsRepository.cs | 6 +- 15 files changed, 160 insertions(+), 171 deletions(-) delete mode 100644 src/SJZY.Track.Application/CAP/EventHandlers/TrackInsertForNotMappedEventHandler.cs diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs index dcafe452..fadb5727 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs @@ -18,5 +18,5 @@ public class TrackDetail public string? OriginContent { get; set; } public string Location { get; set; } = null!; public DateTime Time { get; set; } - public float TimeZone { get; set; } + public float? TimeZone { get; set; } } \ No newline at end of file diff --git a/src/SJZY.Track.Application.Contract/Events/TrackRefreshStruct.cs b/src/SJZY.Track.Application.Contract/Events/TrackRefreshStruct.cs index 62bcf4a2..56d33357 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackRefreshStruct.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackRefreshStruct.cs @@ -13,13 +13,13 @@ public struct TrackRefreshStruct public string? OriginTrackContent { get; set; } /// - /// 原轨迹报文 + /// 原轨迹报文hash(刷新轨迹重复性校验使用) /// - public string? OriginTrackData { get; set; } + public string? OriginTrackDataHash { get; set; } /// /// 表示订单是否完成(只由轨迹刷新配置决定) - /// tips:能够使得IsCompleted为true的点,全局只有一个:轨迹刷新 + /// todo:能够使得IsCompleted为true的点,全局只有一个:轨迹刷新?? /// public bool IsCompleted { get; set; } } \ No newline at end of file diff --git a/src/SJZY.Track.Application/CAP/CAPFilter.cs b/src/SJZY.Track.Application/CAP/CAPFilter.cs index 036c1e34..4b36e128 100644 --- a/src/SJZY.Track.Application/CAP/CAPFilter.cs +++ b/src/SJZY.Track.Application/CAP/CAPFilter.cs @@ -1,9 +1,8 @@ -using System.Security.Cryptography; -using System.Text; -using DotNetCore.CAP.Filter; +using DotNetCore.CAP.Filter; using SJZY.Expand.ABP.Core; using SJZY.Expand.ABP.Core.Logger; using SJZY.Expand.ABP.Core.PublicMethords; +using SJZY.Track.Application.Helpers; using SJZY.Track.Domain.Consts; namespace SJZY.Track.Application.CAP; @@ -33,7 +32,7 @@ public class CapFilter : SubscribeFilter context.DeliverMessage.Headers.TryGetValue("sjzy-arguments-hash", out var hash); if (hash.IsNullOrEmpty()) // 计算参数hash { - hash = GetHash(argumentJsonStr); + hash = StringHelper.GetHash(argumentJsonStr); context.DeliverMessage.Headers["sjzy-arguments-hash"] = hash; } @@ -76,22 +75,4 @@ public class CapFilter : SubscribeFilter return Task.CompletedTask; } - - - /// 获取字符串的hash值 - /// - /// - public static string GetHash(string str) - { - // 将字符串转换为字节 - byte[] data = Encoding.UTF8.GetBytes(str); - - // 创建SHA256实例 - using SHA256 sha256 = SHA256.Create(); - // 计算哈希值 - byte[] hash = sha256.ComputeHash(data); - - // 将哈希值转换为16进制字符串 - return BitConverter.ToString(hash); - } } \ No newline at end of file diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackInsertForNotMappedEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackInsertForNotMappedEventHandler.cs deleted file mode 100644 index b2f59331..00000000 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackInsertForNotMappedEventHandler.cs +++ /dev/null @@ -1,50 +0,0 @@ -using DotNetCore.CAP; -using SJZY.Track.Application.Contract.Events; -using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; -using SJZY.Track.Domain.Consts; -using Volo.Abp.DependencyInjection; - -namespace SJZY.Track.Application.CAP.EventHandlers; - -public class TrackInsertForNotMappedEventHandler : ITransientDependency, ICapSubscribe -{ - private readonly ITrackDetailsRepository _trackDetailsRepository; - - public TrackInsertForNotMappedEventHandler(ITrackDetailsRepository trackDetailsRepository) - { - _trackDetailsRepository = trackDetailsRepository; - } - - [CapSubscribe(GlobalConst.TrackInsertForNotMappedEventSubscribe)] - public async Task ConsumerAsync(TrackInsertForNotMappedEvent @event) - { - if (await _trackDetailsRepository.AnyAsync(@event.OrderId, @event.TrackTime)) - { - return; - } - - // 新增服务商轨迹到es - var track = new TrackDetailsIndex - { - IndexName = $"{GlobalConst.TrackIndex}-{DateTime.Now:yyyy.MM.dd}", - OrderId = @event.OrderId, - OrderNo = @event.OrderNo, - OrderType = @event.OrderType, - TrackPlace = @event.TrackPlace, - TrackTime = @event.TrackTime, - TrackTimeZone = @event.TrackTimeZone, - ServiceProviderName = @event.ServiceProviderName, - OriginTrackContent = @event.OriginTrackContent, - OriginTrackData = @event.OriginTrackData, - CreateUser = GlobalConst.SystemUser, - CreateTime = DateTime.Now - }; - track.TrackCode = GlobalConst.EmptyString; - track.TrackStatus = GlobalConst.EmptyString; - track.TrackContent = GlobalConst.EmptyString; - track.TrackEnContent = GlobalConst.EmptyString; - track.ZeroTrackTime = track.TrackTime.Subtract(TimeSpan.FromHours(track.TrackTimeZone)); - - await _trackDetailsRepository.AddAsync(track); - } -} \ No newline at end of file diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackRefreshEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackRefreshEventHandler.cs index cbecb958..19dc5ac0 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackRefreshEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackRefreshEventHandler.cs @@ -48,7 +48,7 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe if (@event.Data == null || config == null) return; var data = JObject.Parse(@event.Data); - + var orderToken = data.SelectToken(config.ParamConfig.OrderPath); if (orderToken is JArray orderTokens) { @@ -107,9 +107,12 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe private async Task HandleTrackAsync(JToken trackToken, TrackPullParamWithContentConfigDto paramWithContentConfig, TrackRefreshContext context) { - var originTrackData = JsonConvert.SerializeObject(trackToken); + var originTrackDataHash = StringHelper.GetHash(JsonConvert.SerializeObject(trackToken)); // 如果已经存在一模一样的报文了说明处理过了,直接return - if (await _trackDetailsRepository.AnyAsync(context.OrderId, originTrackData)) return; + if (await _trackDetailsRepository.AnyAsync(context.OrderId, originTrackDataHash)) + { + return; + } var paramConfig = paramWithContentConfig.ParamConfig; var contentConfigs = paramWithContentConfig.ContentConfigs; @@ -178,10 +181,10 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe ? null : trackToken[paramConfig.TrackPlaceName]?.Value(); var hasPlaceBottomLine = false; //执行了兜底但是没有兜底住,需要记录 - if (trackPlace.IsNullOrWhiteSpace() && matchedContentConfig?.TrackPlaceValue != null && matchedContentConfig.TrackPlaceValue.HasValue) + if (trackPlace.IsNullOrWhiteSpace() && matchedContentConfig?.TrackPlaceValue is not null) { //兜底没配置的就不需要兜底,拉取的发生地没就没 - trackPlace = await GetPlaceByOrder(matchedContentConfig!.TrackPlaceValue.Value,context.OrderId); + trackPlace = await GetPlaceByOrder(matchedContentConfig.TrackPlaceValue.Value, context.OrderId); hasPlaceBottomLine = string.IsNullOrWhiteSpace(trackPlace); } @@ -193,37 +196,22 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe var trackTimeZone = paramConfig.TrackTimeZoneName == null ? null : trackToken[paramConfig.TrackTimeZoneName]?.Value(); - + // todo:兜底时区是slow path var hasTimezoneBottomLine = false; //执行了兜底但是没有兜底住,需要记录 if (!trackTimeZone.HasValue && matchedContentConfig?.TrackZonePlaceValue is not null) { //兜底没配置的就不需要兜底,拉取的发生地没就没 - var timezone= await GetTimezone(matchedContentConfig,context.OrderId); - + var timezone = await GetTimezone(matchedContentConfig, context.OrderId); + trackTimeZone = timezone; hasTimezoneBottomLine = !timezone.HasValue; } - + + // 没匹配上,新增服务商轨迹 if (matchedContentConfig is null) { - var notMappedEvent = new TrackInsertForNotMappedEvent - { - OrderId = context.OrderId, - OrderType = context.OrderType, - OrderNo = context.OrderNo, - ServiceProviderName = context.ServiceProviderName, - OriginTrackData = JsonConvert.SerializeObject(trackToken), - TrackPlace = trackPlace ?? GlobalConst.EmptyString, - TrackTime = trackTime ?? DateTime.Now, - TrackTimeZone = trackTimeZone ?? GlobalConst.NoneTrackTimeZone, - }; - if (paramConfig.TrackContentName != null) - { - notMappedEvent.OriginTrackContent = trackToken[paramConfig.TrackContentName]?.Value(); - } - - await _capPublisher.PublishAsync(GlobalConst.TrackInsertForNotMappedEventSubscribe, notMappedEvent); + await InsertNotMappedTrackAsync(trackToken, context, trackPlace, trackTime, trackTimeZone, paramConfig); return; } @@ -236,7 +224,7 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe var timezoneTagValue = hasTimezoneBottomLine ? 1 : 0; deficiencyTagValue = placeTagValue + timezoneTagValue; } - + // 新增/更新轨迹 var trackUpsertEvent = new TrackUpsertEvent { @@ -249,11 +237,11 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe OrderType = context.OrderType, } }, - + TrackRefreshData = new TrackRefreshStruct { ServiceProviderName = context.ServiceProviderName, - OriginTrackData = originTrackData, + OriginTrackDataHash = originTrackDataHash, IsCompleted = matchedContentConfig.IsCompleted, OriginTrackContent = paramConfig.TrackContentName != null ? trackToken[paramConfig.TrackContentName]?.Value() @@ -263,22 +251,50 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe TrackCode = matchedContentConfig.TrackContentCode, TrackPlace = trackPlace ?? GlobalConst.EmptyString, TrackTime = trackTime ?? DateTime.Now, - TrackTimeZone = trackTimeZone ?? 8, - DeficiencyTagValue = deficiencyTagValue + TrackTimeZone = trackTimeZone ?? GlobalConst.NoneTrackTimeZone, + DeficiencyTagValue = deficiencyTagValue, + IsAdd = true, }; - trackUpsertEvent.IsAdd = - !await _trackDetailsRepository.AnyByCodeAsync(context.OrderId, matchedContentConfig.TrackContentCode); await _capPublisher.PublishAsync(GlobalConst.TrackUpsertForRefreshSubscribe, trackUpsertEvent); } + private async Task InsertNotMappedTrackAsync(JToken trackToken, TrackRefreshContext context, string? trackPlace, + DateTime? trackTime, float? trackTimeZone, TrackPullParamConfigDto paramConfig) + { + // 新增服务商轨迹到es + var track = new TrackDetailsIndex + { + IndexName = $"{GlobalConst.TrackIndex}-{DateTime.Now:yyyy.MM.dd}", + OrderId = context.OrderId, + OrderType = context.OrderType, + OrderNo = context.OrderNo, + TrackPlace = trackPlace ?? GlobalConst.EmptyString, + TrackTime = trackTime ?? DateTime.Now, + TrackTimeZone = trackTimeZone ?? GlobalConst.NoneTrackTimeZone, + ServiceProviderName = context.ServiceProviderName, + OriginTrackDataHash = StringHelper.GetHash(JsonConvert.SerializeObject(trackToken)), + CreateUser = GlobalConst.SystemUser, + CreateTime = DateTime.Now + }; + if (!paramConfig.TrackContentName.IsNullOrWhiteSpace()) + { + track.OriginTrackContent = + trackToken[paramConfig.TrackContentName!]?.Value() ?? GlobalConst.EmptyString; + } + + track.ZeroTrackTime = track.TrackTime.Subtract(TimeSpan.FromHours(track.TrackTimeZone)); + + await _trackDetailsRepository.AddAsync(track); + } + /// /// 根据订单id获取兜底位置 /// /// /// /// - private Task GetPlaceByOrder(int trackValue,int orderId) + private Task GetPlaceByOrder(int trackValue, int orderId) { Expression> resultExpression = (TrackLocationValue)trackValue switch @@ -291,7 +307,7 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe TrackLocationValue.LeaveCountry => x => x.LeaveCountry, _ => x => x.LeaveCountry }; - return _orderRepository.GetFirstAsync(x => x.Id == orderId, resultExpression); + return _orderRepository.GetFirstAsync(x => x.Id == orderId, resultExpression); } /// @@ -300,13 +316,12 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe /// /// /// - private async Task GetTimezone(TrackPullContentConfigDto matchedContentConfig,int orderId ) + private async Task GetTimezone(TrackPullContentConfigDto matchedContentConfig, int orderId) { - var placeOrCode = await GetPlaceByOrder(matchedContentConfig!.TrackZonePlaceValue.Value,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) { diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index 703900c5..a3a791ff 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -2,11 +2,9 @@ using SJZY.Expand.ABP.Core.Logger; using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.Track.Application.Contract.Events; -using SJZY.Track.Application.Contract.Services; using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Consts; -using SJZY.Track.Domain.Dtos.Order; using SJZY.Track.Domain.Queries; using Volo.Abp.DependencyInjection; using OrderIdentifier = SJZY.Track.Application.Contract.Events.OrderIdentifier; @@ -61,7 +59,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe { ServiceProviderName = @event.TrackRefreshData.ServiceProviderName, OriginTrackContent = @event.TrackRefreshData.OriginTrackContent, - OriginTrackData = @event.TrackRefreshData.OriginTrackData, + OriginTrackDataHash = @event.TrackRefreshData.OriginTrackDataHash, // tips:一定要重置为false,父级订单的完成不会使得关联订单完成,关联单也必须由刷新来完成或手动设置完成!! IsCompleted = false }; @@ -103,7 +101,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe } } } - + private async Task HandleTrackAsync(TrackUpsertEvent @event, List canNextOrderIds) { var content = await _provideQueries.GetTrackContentAsync(@event.SubSystemId, @event.TrackCode); @@ -113,14 +111,20 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe var orderIds = @event.OrderIdentifiers.Select(x => x.OrderId).ToArray(); var tracks = await _trackDetailsRepository.GetListAsync(orderIds, @event.TrackCode, true); - var newOrderIds = orderIds.Except(tracks.Select(x => x.OrderId)).ToArray(); + // important:轨迹code相同,时间、发生地不同的,允许存在多条!! + var newOrderIds = orderIds + .Except(tracks + .Where(x => x.TrackTime == @event.TrackTime && x.TrackPlace == @event.TrackPlace) + .Select(x => x.OrderId) + ).ToArray(); var trackContents = await _provideQueries.MatchTrackContentAsync(newOrderIds, @event.TrackCode); var insertTracks = new List(); - + foreach (var order in @event.OrderIdentifiers) { - var track = tracks.FirstOrDefault(x => x.OrderId == order.OrderId); + var track = tracks.FirstOrDefault(x => + x.OrderId == order.OrderId && x.TrackTime == @event.TrackTime && x.TrackPlace == @event.TrackPlace); if (track == null && !@event.IsAdd) continue; // 不存在不让改 if (track != null && @event.IsAdd) continue; // 存在不让创建 @@ -138,8 +142,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe TrackTimeZone = @event.TrackTimeZone, ServiceProviderName = @event.TrackRefreshData.ServiceProviderName ?? GlobalConst.EmptyString, OriginTrackContent = @event.TrackRefreshData.OriginTrackContent ?? GlobalConst.EmptyString, - OriginTrackData = @event.TrackRefreshData.OriginTrackData ?? GlobalConst.EmptyString, - IsCanDelete = false, + OriginTrackDataHash = @event.TrackRefreshData.OriginTrackDataHash ?? GlobalConst.EmptyString, CreateUser = @event.OperationMan ?? GlobalConst.SystemUser, CreateTime = DateTime.Now }; @@ -157,8 +160,9 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe track.TrackContent = trackContent.Content; track.TrackEnContent = trackContent.EnContent; track.IsCanDelete = trackContent.IsCanDelete; - track.ZeroTrackTime = track.TrackTime.Subtract(TimeSpan.FromHours(track.TrackTimeZone)); - + track.ZeroTrackTime = Math.Abs(track.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1 + ? track.TrackTime + : track.TrackTime.Subtract(TimeSpan.FromHours(track.TrackTimeZone)); insertTracks.Add(track); } else @@ -166,6 +170,9 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe track.TrackPlace = @event.TrackPlace; track.TrackTime = @event.TrackTime; track.TrackTimeZone = @event.TrackTimeZone; + track.ZeroTrackTime = Math.Abs(track.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1 + ? track.TrackTime + : track.TrackTime.Subtract(TimeSpan.FromHours(track.TrackTimeZone)); track.UpdateUser = @event.OperationMan ?? GlobalConst.SystemUser; track.UpdateTime = DateTime.Now; @@ -179,7 +186,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe // 批量add to es await _trackDetailsRepository.AddManyAsync(insertTracks); - + // 触发订单主表更新事件(异步) await _capPublisher.PublishAsync(GlobalConst.TrackChangeAfterUpdateOrderSubscribe, new TrackChangeAfterUpdateOrderEvent diff --git a/src/SJZY.Track.Application/Helpers/StringHelper.cs b/src/SJZY.Track.Application/Helpers/StringHelper.cs index 682bb788..a0b3b8d4 100644 --- a/src/SJZY.Track.Application/Helpers/StringHelper.cs +++ b/src/SJZY.Track.Application/Helpers/StringHelper.cs @@ -1,24 +1,48 @@ +using System.Security.Cryptography; +using System.Text; using System.Text.RegularExpressions; -namespace SJZY.Track.Application.Helpers -{ - public class StringHelper - { - /// - /// 只能输入英文字符和键盘上常用的符号 - /// - /// - /// - public static bool IsValidEnglishString(string input) - { - if (string.IsNullOrEmpty(input)) - { - return false; - } +namespace SJZY.Track.Application.Helpers; - // Regular expression to match only English letters and specified symbols - var regex = new Regex(@"^[a-zA-Z\(\)@!#$%^&*_\-+=;:""'/><,.\s]+$"); - return regex.IsMatch(input); +public class StringHelper +{ + /// + /// 只能输入英文字符和键盘上常用的符号 + /// + /// + /// + public static bool IsValidEnglishString(string input) + { + if (string.IsNullOrEmpty(input)) + { + return false; } + + // Regular expression to match only English letters and specified symbols + var regex = new Regex(@"^[a-zA-Z\(\)@!#$%^&*_\-+=;:""'/><,.\s]+$"); + return regex.IsMatch(input); + } + + + /// 获取字符串的hash值 + /// + /// + public static string GetHash(string str) + { + // 将字符串转换为字节 + byte[] data = Encoding.UTF8.GetBytes(str); + + // 创建SHA256实例 + using SHA256 sha256 = SHA256.Create(); + // 计算哈希值 + byte[] hash = sha256.ComputeHash(data); + + // 将哈希值转换为16进制字符串 + StringBuilder sb = new StringBuilder(); + foreach (byte b in hash) + { + sb.Append(b.ToString("x2")); + } + return sb.ToString(); } } \ 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 393d31e5..b781d848 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackPullService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackPullService.cs @@ -68,9 +68,14 @@ public class TrackPullService : ApplicationService var attach = Base64Helper.SerializeObject(group.Key); // 批量获取轨迹 - var _ = await _httpClientProxy.Service.BatchForwardThenPushToQueueAsync( + var res = await _httpClientProxy.Service.BatchForwardThenPushToQueueAsync( InterfaceRelayConst.GetTrackInterfaceCode, serviceProviderCode, data, GlobalConst.TrackRefreshSubscribe, attach); + + if (res.Code != InterfaceRelayConst.SuccessCode) + { + LogHelper.Error($"刷新轨迹失败:{res.ToJson()}"); + } } return true; diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs index 259ee8d9..a055513f 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs @@ -42,8 +42,8 @@ public partial class TrackService Content = x.TrackContent, OriginContent = x.OriginTrackContent, Location = x.TrackPlace, - Time = Math.Abs(x.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1 ?x.TrackTime: x.ZeroTrackTime.AddHours(input.TimeZone ?? 8), - TimeZone = input.TimeZone ?? 8 + Time = Math.Abs(x.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1 ? x.TrackTime: x.ZeroTrackTime.AddHours(input.TimeZone ?? 8), + TimeZone = Math.Abs(x.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1? null: input.TimeZone ?? 8 }).ToList(); res.Add(item); diff --git a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs index 477456cb..fb0d998e 100644 --- a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs +++ b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs @@ -5,6 +5,7 @@ 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.Consts; using SJZY.Track.Domain.Dtos.Order; using SJZY.Track.Domain.Dtos.TrackTemplate; using SJZY.Track.Domain.Enums; @@ -87,6 +88,10 @@ public class TrackOrderService : ApplicationService { a.TrackTimeZone = "GTM +00:00"; } + else if (Math.Abs(a.TrackTimeZoneValue - GlobalConst.NoneTrackTimeZone) < 1) + { + a.TrackTimeZone = "--"; + } else { // 将小数形式的小时转换为时区偏移量 diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs index 4e4a0b9c..639f92ef 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs @@ -10,7 +10,7 @@ public interface ITrackDetailsRepository Task AnyAsync(int orderId, DateTime trackTime); - Task AnyAsync(int orderId, string originTrackData); + Task AnyAsync(int orderId, string originTrackDataHash); Task AnyByCodeAsync(int orderId, string trackCode); diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs index 7cb77e84..9af7f023 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs @@ -30,37 +30,37 @@ public class TrackDetailsIndex : IdBaseIndex /// /// 轨迹状态 /// - public string TrackStatus { get; set; } = null!; + public string TrackStatus { get; set; } = GlobalConst.EmptyString; /// /// 轨迹内容代码 /// - public string TrackCode { get; set; } = null!; + public string TrackCode { get; set; } = GlobalConst.EmptyString; /// /// 轨迹内容 /// - public string TrackContent { get; set; } = null!; - - /// - /// 服务商 - /// - public string? ServiceProviderName { get; set; } - - /// - /// 原轨迹内容 - /// - public string? OriginTrackContent { get; set; } - - /// - /// 原轨迹报文 - /// - public string? OriginTrackData { get; set; } + public string TrackContent { get; set; } = GlobalConst.EmptyString; /// /// 轨迹内容英文 /// - public string TrackEnContent { get; set; } = null!; + public string TrackEnContent { get; set; } = GlobalConst.EmptyString; + + /// + /// 服务商 + /// + public string ServiceProviderName { get; set; } = null!; + + /// + /// 原轨迹内容 + /// + public string OriginTrackContent { get; set; } = null!; + + /// + /// 原轨迹报文hash(刷新轨迹重复性校验使用) + /// + public string OriginTrackDataHash { get; set; } = null!; /// /// 轨迹发生地 diff --git a/src/SJZY.Track.Domain/VEntities/VAirportEntity.cs b/src/SJZY.Track.Domain/VEntities/VAirportEntity.cs index ba69e854..9ce810fd 100644 --- a/src/SJZY.Track.Domain/VEntities/VAirportEntity.cs +++ b/src/SJZY.Track.Domain/VEntities/VAirportEntity.cs @@ -5,7 +5,7 @@ namespace SJZY.Track.Domain.VEntities; /// /// 空港 /// -[SugarTable("t_airport", "空港")] +[SugarTable("v_airport", "空港")] public class VAirportEntity : IFullAuditedBasicEntitys { [SugarColumn(ColumnName = "Id", IsPrimaryKey = true, IsIdentity = true)] diff --git a/src/SJZY.Track.Domain/VEntities/VCityEntity.cs b/src/SJZY.Track.Domain/VEntities/VCityEntity.cs index ad914504..703b5539 100644 --- a/src/SJZY.Track.Domain/VEntities/VCityEntity.cs +++ b/src/SJZY.Track.Domain/VEntities/VCityEntity.cs @@ -3,7 +3,7 @@ using System; namespace SJZY.Track.Domain.VEntities; -[SugarTable("t_city")] +[SugarTable("v_city")] public class VCityEntity : IFullAuditedBasicEntitys { /// diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs index 33c278d9..cb82921e 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs @@ -34,6 +34,8 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract s2.Includes(fd => fd .Field(f => f.IndexName) .Field(f => f.OrderId) + .Field(f => f.TrackTime) + .Field(f => f.TrackPlace) )) .Size(1000) .Query(q => q @@ -123,13 +125,13 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract 0; } - public async Task AnyAsync(int orderId, string originTrackData) + public async Task AnyAsync(int orderId, string originTrackDataHash) { var r = await Context.SearchAsync(x => x .Source(s => s.Includes(fd => fd.Field(f => f.TrackCode))) .Query(q => q.Term(f => f.OrderId, orderId) - && q.Term(f => f.OriginTrackData.Suffix("keyword"), originTrackData) + && q.Term(f => f.OriginTrackDataHash.Suffix("keyword"), originTrackDataHash) ) );