diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs index fa5d3880..1c90e3a9 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs @@ -4,6 +4,11 @@ namespace SJZY.Track.Application.Contract.Dtos.ProvideServices; public class BatchUpsertTrackInput : OrderNosInfo { + /// + /// true新增,false更新 + /// + public bool IsAdd { get; set; } + /// /// 轨迹内容代码 /// diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs index 8248c8e0..ce97f715 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs @@ -4,6 +4,11 @@ namespace SJZY.Track.Application.Contract.Dtos.ProvideServices; public class UpsertTrackInput : OrderNoInfo { + /// + /// true新增,false更新 + /// + public bool IsAdd { get; set; } + /// /// 轨迹内容代码 /// diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/TrackPushContentConfigDto.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushConfigDto.cs similarity index 96% rename from src/SJZY.Track.Application.Contract/Dtos/ProvideServices/TrackPushContentConfigDto.cs rename to src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushConfigDto.cs index a019087f..1f129458 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/TrackPushContentConfigDto.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushConfigDto.cs @@ -1,4 +1,4 @@ -namespace SJZY.Track.Application.Contract.Dtos.ProvideServices; +namespace SJZY.Track.Application.Contract.Dtos.TrackPush; public class TrackPushConfigDto { diff --git a/src/SJZY.Track.Application.Contract/Events/TrackUpsertAfterUpdateOrderEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackChangeAfterUpdateOrderEvent.cs similarity index 91% rename from src/SJZY.Track.Application.Contract/Events/TrackUpsertAfterUpdateOrderEvent.cs rename to src/SJZY.Track.Application.Contract/Events/TrackChangeAfterUpdateOrderEvent.cs index bf3907b4..448b5bf2 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackUpsertAfterUpdateOrderEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackChangeAfterUpdateOrderEvent.cs @@ -1,6 +1,6 @@ namespace SJZY.Track.Application.Contract.Events; -public class TrackUpsertAfterUpdateOrderEvent +public class TrackChangeAfterUpdateOrderEvent { /// /// 订单Id @@ -13,10 +13,15 @@ public class TrackUpsertAfterUpdateOrderEvent public bool IsDelete { get; set; } /// - /// 此次发生的轨迹是否意味完成 + /// 这条轨迹是否意味着完成 /// public bool IsCompleted { get; set; } + /// + /// 轨迹代码 + /// + public string TrackCode { get; set; } = null!; + /// /// 轨迹内容 /// @@ -41,9 +46,4 @@ public class TrackUpsertAfterUpdateOrderEvent /// 轨迹时区 /// public float TrackTimeZone { get; set; } - - /// - /// 轨迹代码 - /// - public string TrackCode { get; set; } = null!; } \ No newline at end of file diff --git a/src/SJZY.Track.Application.Contract/Events/TrackDeleteEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackDeleteEvent.cs index eccbe955..d5286726 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackDeleteEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackDeleteEvent.cs @@ -22,6 +22,11 @@ public class TrackDeleteEvent /// public int UpSubSystemId { get; set; } + /// + /// 操作人 + /// + public string? OperationMan { get; set; } + /// /// 已经处理过的订单 /// diff --git a/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs index 8434072e..92ce75e1 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs @@ -22,6 +22,11 @@ public class TrackPushEvent /// public string OrderNo { get; set; } = null!; + /// + /// 订单类型 + /// + public int OrderType { get; set; } + /// /// 轨迹内容id /// diff --git a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs index eb836245..1215e1e8 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs @@ -1,14 +1,22 @@ -using SJZY.Track.Application.Contract.Dtos.ProvideServices; +namespace SJZY.Track.Application.Contract.Events; -namespace SJZY.Track.Application.Contract.Events; - -public class TrackUpsertEvent : UpsertTrackInput +public class TrackUpsertEvent { /// /// 订单id /// public int OrderId { get; set; } + /// + /// 订单类型 + /// + public int OrderType { get; set; } + + /// + /// 订单号 + /// + public string OrderNo { get; set; } = null!; + /// /// 订单是否完成 /// @@ -34,6 +42,46 @@ public class TrackUpsertEvent : UpsertTrackInput /// public int UpSubSystemId { get; set; } + /// + /// 原轨迹内容 + /// + public string? OriginTrackContent { get; set; } + + /// + /// 原轨迹报文 + /// + public string? OriginTrackData { get; set; } + + /// + /// 操作人 + /// + public string? OperationMan { get; set; } + + /// + /// true新增,false更新,null表示刷新引发的新增/更新 + /// + public bool? IsAdd { get; set; } + + /// + /// 轨迹内容代码 + /// + public string TrackCode { get; set; } = null!; + + /// + /// 轨迹发生地 + /// + public string TrackPlace { get; set; } = null!; + + /// + /// 轨迹发生时间 + /// + public DateTime TrackTime { get; set; } + + /// + /// 轨迹发生时区 + /// + public float TrackTimeZone { get; set; } + /// /// 已经处理过的订单 /// diff --git a/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj b/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj index f13ee0b2..13bcd7dd 100644 --- a/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj +++ b/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj @@ -5,7 +5,7 @@ net7.0 True - 1.0.0 + 1.0.1 True diff --git a/src/SJZY.Track.Application.Contract/Services/ITrackPushCacheService.cs b/src/SJZY.Track.Application.Contract/Services/ITrackPushCacheService.cs index a4a57bc0..91b80c3e 100644 --- a/src/SJZY.Track.Application.Contract/Services/ITrackPushCacheService.cs +++ b/src/SJZY.Track.Application.Contract/Services/ITrackPushCacheService.cs @@ -1,4 +1,4 @@ -using SJZY.Track.Application.Contract.Dtos.ProvideServices; +using SJZY.Track.Application.Contract.Dtos.TrackPush; namespace SJZY.Track.Application.Contract.Services; @@ -19,7 +19,7 @@ public interface ITrackPushCacheService /// 服务商id /// /// - Task GetPushContentConfigAsync(int subSystemId, int customId, int trackContentId); + Task GetPushContentConfigAsync(int subSystemId, int customId, int trackContentId); /// /// 根据轨迹代码推断下一个(升序)要推送的内容,如果找不到或者已经是最后一个了,返回null diff --git a/src/SJZY.Track.Application/AutoMapper/TrackPushAutoMapperProfile.cs b/src/SJZY.Track.Application/AutoMapper/TrackPushAutoMapperProfile.cs index 6be69d46..213d7872 100644 --- a/src/SJZY.Track.Application/AutoMapper/TrackPushAutoMapperProfile.cs +++ b/src/SJZY.Track.Application/AutoMapper/TrackPushAutoMapperProfile.cs @@ -1,8 +1,8 @@ using AutoMapper; -using SJZY.Track.Application.Contract.Dtos.ProvideServices; using SJZY.Track.Application.Contract.Dtos.TrackPush; using SJZY.Track.Domain.Aggregates.TrackPullAggregate; using SJZY.Track.Domain.Aggregates.TrackPushAggregate; +using SJZY.Track.Domain.Dtos.TrackPush; using Volo.Abp.AutoMapper; namespace SJZY.Track.Application.AutoMapper; @@ -15,7 +15,6 @@ public class TrackPushAutoMapperProfile : Profile CreateMap(MemberList.None).Ignore(dest => dest.Id) .ForMember(dest => dest.IsPush, opt => opt.MapFrom(source => true)); CreateMap(MemberList.None); - CreateMap(MemberList.None) - .ForMember(dest => dest.OrderType, opt => opt.MapFrom(source => source.OrderNoType)); + CreateMap(MemberList.None); } } \ No newline at end of file diff --git a/src/SJZY.Track.Application/EventHandlers/CAPFilter.cs b/src/SJZY.Track.Application/EventHandlers/CAPFilter.cs new file mode 100644 index 00000000..feaf198f --- /dev/null +++ b/src/SJZY.Track.Application/EventHandlers/CAPFilter.cs @@ -0,0 +1,108 @@ +using System.Globalization; +using DotNetCore.CAP.Filter; +using SJZY.Expand.ABP.Core; +using SJZY.Expand.ABP.Core.Logger; +using SJZY.Expand.ABP.Core.PublicMethords; + +namespace SJZY.Track.Application.EventHandlers; + +public class CAPFilter : SubscribeFilter +{ + const string _ERROR_CODE = "Error599"; + + /// + /// 执行前 + /// + /// + /// + public override Task OnSubscribeExecutingAsync(ExecutingContext context) + { + var argumentJsonStr = context.Arguments.ToJson(); + + context.DeliverMessage.Headers["sjzy-receive-time"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff"); + context.DeliverMessage.Headers["sjzy-arguments"] = argumentJsonStr; + + if (!string.IsNullOrEmpty(argumentJsonStr)) + { + var hash = argumentJsonStr.GetHash(); + using (RedisHelper.Client.Lock("Filter:" + hash, 10)) + { + var isSkip = !string.IsNullOrEmpty(RedisHelper.Client.Get($"CapExcuteFilter:{hash}")); + if (isSkip) + throw new BusinessException(_ERROR_CODE, $"检测到重复消费,消费参数:{argumentJsonStr}"); + + RedisHelper.Client.Set($"CapExcuteFilter:{hash}", 60 * 10, + TimeSpan.FromHours(1).Seconds); // 1h内不允许一模一样的参数重复消费 + } + } + + return Task.CompletedTask; + } + + /// + /// 执行后 + /// + /// + /// + public override Task OnSubscribeExecutedAsync(ExecutedContext context) + { + context.DeliverMessage.Headers.TryGetValue("sjzy-receive-time", out var receiveTime); + context.DeliverMessage.Headers.TryGetValue("cap-msg-name", out var receiveName); + context.DeliverMessage.Headers.TryGetValue("sjzy-arguments", out var arguments); + context.DeliverMessage.Headers.TryGetValue("cap-msg-id", out var messageId); + + BuildLog(receiveTime, receiveName, arguments, false, messageId); + + return Task.CompletedTask; + } + + + /// + /// 消费异常事件 + /// + /// + /// + public override Task OnSubscribeExceptionAsync(ExceptionContext context) + { + context.ExceptionHandled = true; + context.DeliverMessage.Headers.TryGetValue("cap-msg-id", out var messageId); + + if (context.Exception is BusinessException ex && ex.Code == _ERROR_CODE) + LogHelper.Warn(ex.ToString()); + else + LogHelper.Error($"cap-msg-id:{messageId}\n{context.Exception}"); + + + context.DeliverMessage.Headers.TryGetValue("sjzy-receive-time", out var receiveTime); + context.DeliverMessage.Headers.TryGetValue("cap-msg-name", out var receiveName); + context.DeliverMessage.Headers.TryGetValue("sjzy-arguments", out var arguments); + + BuildLog(receiveTime, receiveName, arguments, true, messageId); + + return Task.CompletedTask; + } + + + private void BuildLog(string receiveTime, string receiveName, string arguments, bool isFromExecptionFliter, + string messageId) + { + var parsedDate = DateTime.ParseExact(receiveTime, "yyyy-MM-dd HH:mm:ss fff", CultureInfo.InvariantCulture); + var useTime = DateTime.Now - parsedDate; + + if (useTime.Minutes > 20) + { + var log = $@" +|-消息编号:{messageId} +|-消费者名:{receiveName} +|-跳过执行:{(isFromExecptionFliter ? "是" : "否")} +|-执行时间:{receiveTime} +|-消费耗时:{useTime.Milliseconds}毫秒 +|-请求参数:{arguments}"; + LogHelper.Error(log); + } + else + { + //LogHelper.Info(log); + } + } +} \ No newline at end of file diff --git a/src/SJZY.Track.Application/EventHandlers/TrackUpsertAfterUpdateOrderEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs similarity index 50% rename from src/SJZY.Track.Application/EventHandlers/TrackUpsertAfterUpdateOrderEventHandler.cs rename to src/SJZY.Track.Application/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs index 1ce9ae93..82dae4c9 100644 --- a/src/SJZY.Track.Application/EventHandlers/TrackUpsertAfterUpdateOrderEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs @@ -1,33 +1,39 @@ using DotNetCore.CAP; using SJZY.Track.Application.Contract.Events; using SJZY.Track.Domain.Aggregates.OrderAggregate; +using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Consts; using Volo.Abp.DependencyInjection; namespace SJZY.Track.Application.EventHandlers; -public class TrackUpsertAfterUpdateOrderEventHandler : ITransientDependency, ICapSubscribe +public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICapSubscribe { private readonly IOrderRepository _orderRepository; + private readonly ITrackDetailsRepository _trackDetailsRepository; - public TrackUpsertAfterUpdateOrderEventHandler(IOrderRepository orderRepository) + public TrackChangeAfterUpdateOrderEventHandler(IOrderRepository orderRepository, + ITrackDetailsRepository trackDetailsRepository) { _orderRepository = orderRepository; + _trackDetailsRepository = trackDetailsRepository; } - [CapSubscribe(GlobalConst.TrackUpsertAfterUpdateOrderSubscribe)] - public async Task ConsumerAsync(TrackUpsertAfterUpdateOrderEvent @event) + [CapSubscribe(GlobalConst.TrackChangeAfterUpdateOrderSubscribe)] + public async Task ConsumerAsync(TrackChangeAfterUpdateOrderEvent @event) { var order = await _orderRepository.GetFirstAsync(x => x.Id == @event.OrderId); if (order == default) return; if (@event.IsDelete) { - if (@event.TrackTime == default) + var track = await _trackDetailsRepository.GetLatestAsync(@event.OrderId); + + // 删除全部轨迹导致的重置行为 + if (track == default) { if (order.LatestTrackTime == null) return; - // 删除全部轨迹导致的重置行为 // tips:订单是支持从已完成态到未完成态的 order.ResetTrackInfo(); @@ -37,14 +43,14 @@ public class TrackUpsertAfterUpdateOrderEventHandler : ITransientDependency, ICa } // 删除引发的回退更新 - if (order.LatestTrackTime != null && - @event.TrackTime.Subtract(TimeSpan.FromHours(@event.TrackTimeZone)) == - order.LatestTrackTime.Value.Subtract(TimeSpan.FromHours(order.LatestTrackTimeZone ?? 0))) - { - return; - } + order.IsCompleted = track.IsCompleted; + order.LatestTrackContent = track.TrackContent; + order.LatestTrackEnContent = track.TrackEnContent; + order.LatestTrackPlace = track.TrackPlace; + order.LatestTrackTime = track.TrackTime; + order.LatestTrackTimeZone = track.TrackTimeZone; } - else // upsert引发的更新 + else { if (order.LatestTrackTime != null && @event.TrackTime.Subtract(TimeSpan.FromHours(@event.TrackTimeZone)) < @@ -52,14 +58,15 @@ public class TrackUpsertAfterUpdateOrderEventHandler : ITransientDependency, ICa { return; } - } - order.IsCompleted = @event.IsCompleted; - order.LatestTrackContent = @event.TrackContent; - order.LatestTrackEnContent = @event.TrackEnContent; - order.LatestTrackPlace = @event.TrackPlace; - order.LatestTrackTime = @event.TrackTime; - order.LatestTrackTimeZone = @event.TrackTimeZone; + // upsert引发的更新 + order.IsCompleted = @event.IsCompleted; + order.LatestTrackContent = @event.TrackContent; + order.LatestTrackEnContent = @event.TrackEnContent; + order.LatestTrackPlace = @event.TrackPlace; + order.LatestTrackTime = @event.TrackTime; + order.LatestTrackTimeZone = @event.TrackTimeZone; + } await _orderRepository.UpdateColumnAsync(order, x => new { diff --git a/src/SJZY.Track.Application/EventHandlers/TrackDeleteEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackDeleteEventHandler.cs index 1a1f0df0..28b38520 100644 --- a/src/SJZY.Track.Application/EventHandlers/TrackDeleteEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/TrackDeleteEventHandler.cs @@ -1,5 +1,6 @@ using DotNetCore.CAP; using SJZY.Expand.ABP.Core.Logger; +using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.Track.Application.Contract.Events; using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; @@ -13,19 +14,19 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe { private readonly IOrderRepository _orderRepository; private readonly IProvideQueries _provideQueries; - private readonly ITrackDetailsRepository _trackDetailsRepository; private readonly ICapPublisher _capPublisher; + private readonly ITrackDetailsRepository _trackDetailsRepository; - public TrackDeleteEventHandler(IProvideQueries provideQueries, ITrackDetailsRepository trackDetailsRepository, - IOrderRepository orderRepository, ICapPublisher capPublisher) + public TrackDeleteEventHandler(IProvideQueries provideQueries, + IOrderRepository orderRepository, ICapPublisher capPublisher, ITrackDetailsRepository trackDetailsRepository) { _provideQueries = provideQueries; - _trackDetailsRepository = trackDetailsRepository; _orderRepository = orderRepository; _capPublisher = capPublisher; + _trackDetailsRepository = trackDetailsRepository; } - [CapSubscribe(GlobalConst.TrackDeleteSubscribe)] + [CapSubscribe(GlobalConst.TrackDeleteSubscribe, Group = GlobalConst.TrackDeleteSubscribe)] public async Task ConsumerAsync(TrackDeleteEvent @event) { if (@event.Visited.Contains(@event.OrderId)) @@ -34,8 +35,6 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe return; } - @event.Visited.Add(@event.OrderId); - // 不同子系统需要做内容映射 if (@event.UpSubSystemId != 0 && @event.UpSubSystemId != @event.SubSystemId) { @@ -59,41 +58,27 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe // 删除轨迹 var isOk = await _trackDetailsRepository.DeleteTrackAsync(@event.OrderId, @event.TrackCodes); - // 触发订单主表更新事件 if (isOk) { - var track = await _trackDetailsRepository.GetLatestAsync(@event.OrderId); - var updateOrderEvent = track == default - ? new TrackUpsertAfterUpdateOrderEvent + // 触发订单主表更新事件 + await _capPublisher.PublishDelayAsync(TimeSpan.FromSeconds(3), + GlobalConst.TrackChangeAfterUpdateOrderSubscribe, + new TrackChangeAfterUpdateOrderEvent { OrderId = @event.OrderId, IsDelete = true - } - : new TrackUpsertAfterUpdateOrderEvent - { - OrderId = @event.OrderId, - IsCompleted = track.IsCompleted, - TrackContent = track.TrackContent, - TrackEnContent = track.TrackEnContent, - TrackPlace = track.TrackPlace, - TrackTime = track.TrackTime, - TrackTimeZone = track.TrackTimeZone, - IsDelete = true - }; - await _capPublisher.PublishAsync(GlobalConst.TrackUpsertAfterUpdateOrderSubscribe, updateOrderEvent); + }); } // 根据订单关联关系异步向下刷 var linkedOrders = await _orderRepository.GetLinkedOrdersAsync(@event.OrderId); foreach (var linkedOrder in linkedOrders) { - var nextEvent = new TrackDeleteEvent - { - OrderId = linkedOrder.OrderId, - TrackCodes = @event.TrackCodes, - SubSystemId = linkedOrder.SubSystemId, - UpSubSystemId = @event.SubSystemId - }; + var nextEvent = @event.DeepCopy(); + nextEvent.Visited.Add(@event.OrderId); + nextEvent.TrackCodes = @event.TrackCodes; + nextEvent.SubSystemId = linkedOrder.SubSystemId; + nextEvent.UpSubSystemId = @event.SubSystemId; await _capPublisher.PublishAsync(GlobalConst.TrackDeleteSubscribe, nextEvent); } diff --git a/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs index c1ca1b19..a1f9aba4 100644 --- a/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs @@ -22,7 +22,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe _capPublisher = capPublisher; } - [CapSubscribe(GlobalConst.TrackPushSubscribe)] + [CapSubscribe(GlobalConst.TrackPushSubscribe, Group = GlobalConst.TrackPushSubscribe)] public async Task ConsumerAsync(TrackPushEvent @event) { InterfaceRelayUnifyResultDto res = null!; @@ -44,13 +44,16 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe var isSuccess = res.Code == InterfaceRelayConst.SuccessCode; - // 写推送日志 + // 往es 写推送日志 await _trackPushRecordsRepository.AddAsync(new TrackPushRecordIndex { IndexName = $"{GlobalConst.TrackPushRecordsIndex}-{DateTime.Now:yyyy.MM.dd}", RequestId = res.RequestId, Message = res.Msg, OptionType = @event.OptionType.ToString(), + OrderId = @event.OrderId, + OrderType = @event.OrderType, + OrderNo = @event.OrderNo, TrackStatus = @event.TrackStatus, TrackCode = @event.TrackCode, TrackContent = @event.TrackContent, diff --git a/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs index 9d0e410d..75a991a2 100644 --- a/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs @@ -95,6 +95,7 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe TrackUpsertEvent @event) { var trackUpsertEvent = @event.DeepCopy(); + trackUpsertEvent.OriginTrackData = JsonConvert.SerializeObject(trackToken); var paramConfig = paramWithContentConfig.ParamConfig; var contentConfigs = paramWithContentConfig.ContentConfigs; TrackPullContentConfigDto? matchedContentConfig = null; @@ -123,6 +124,7 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe var trackContent = trackToken[paramConfig.TrackContentName]?.Value(); if (!trackContent.IsNullOrWhiteSpace()) { + trackUpsertEvent.OriginTrackContent = trackContent; Debug.Assert(trackContent != null, nameof(trackContent) + " != null"); matchedContentConfig = contentConfigs.FirstOrDefault(x => x.TrackContentValue == trackContent); @@ -165,7 +167,7 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe if (trackPlace.IsNullOrWhiteSpace()) { Expression> resultExpression = - (TrackLocationValue?)matchedContentConfig.TrackPlaceValue switch + (TrackLocationValue?)matchedContentConfig?.TrackPlaceValue switch { TrackLocationValue.ArrivalPort => x => x.ArrivalPort, TrackLocationValue.ArriveCity => x => x.ArrivalCity, @@ -189,10 +191,10 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe : trackToken[paramConfig.TrackTimeZoneName]?.Value(); // 新增/更新轨迹 - trackUpsertEvent.TrackCode = matchedContentConfig.TrackContentCode; - trackUpsertEvent.TrackPlace = trackPlace ?? "CN"; + trackUpsertEvent.TrackCode = matchedContentConfig?.TrackContentCode ?? GlobalConst.EmptyString; + trackUpsertEvent.TrackPlace = trackPlace ?? GlobalConst.EmptyString; trackUpsertEvent.TrackTime = trackTime ?? DateTime.Now; - trackUpsertEvent.TrackTimeZone = trackTimeZone ?? matchedContentConfig.TrackTimeZoneValue ?? 8; + trackUpsertEvent.TrackTimeZone = trackTimeZone ?? matchedContentConfig?.TrackTimeZoneValue ?? 8; await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, trackUpsertEvent); } } \ No newline at end of file diff --git a/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs index 9d375716..eab6361e 100644 --- a/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs @@ -1,15 +1,13 @@ -using System.Diagnostics; -using DotNetCore.CAP; +using DotNetCore.CAP; using SJZY.Expand.ABP.Core.Logger; using SJZY.Expand.ABP.Core.PublicMethords; -using SJZY.Track.Application.Contract.Dtos.ProvideServices; +using SJZY.Track.Application.Contract.Dtos.TrackPush; 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.Queries; -using SJZY.UserCenter.HttpApi.Services; using Volo.Abp.DependencyInjection; namespace SJZY.Track.Application.EventHandlers; @@ -33,7 +31,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe _trackPushCacheService = trackPushCacheService; } - [CapSubscribe(GlobalConst.TrackUpsertSubscribe)] + [CapSubscribe(GlobalConst.TrackUpsertSubscribe, Group = GlobalConst.TrackUpsertSubscribe)] public async Task ConsumerAsync(TrackUpsertEvent @event) { if (@event.Visited.Contains(@event.OrderId)) @@ -42,8 +40,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe return; } - @event.Visited.Add(@event.OrderId); - + var isUnProcessed = false; // 不同子系统需要做内容映射 if (@event.UpSubSystemId != 0 && @event.UpSubSystemId != @event.SubSystemId) { @@ -60,18 +57,29 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe @event.TrackCode = mapCode; } - var track = await _trackDetailsRepository.GetFirstOrDefaultAsync(@event.OrderId, @event.TrackCode); + var track = @event.TrackCode == GlobalConst.EmptyString + ? await _trackDetailsRepository.GetFirstOrDefaultAsync(@event.OrderId, @event.TrackTime) + : await _trackDetailsRepository.GetFirstOrDefaultAsync(@event.OrderId, @event.TrackCode); + + if (@event.TrackCode == GlobalConst.EmptyString && track != null) return; // 无法映射的轨迹只做新增 + + if (@event.IsAdd != null) // 手动操作需要做区分 + { + if (track == null && !@event.IsAdd!.Value) return; // 不存在不让改 + if (track != null && @event.IsAdd!.Value) return; // 存在不让创建 + } // step1、upsert es轨迹 - await UpsertTrackAsync(track, @event); - Debug.Assert(track != null, nameof(track) + " != null"); + track = await UpsertTrackAsync(track, @event); + + if (track == null || @event.TrackCode == GlobalConst.EmptyString) return; // 模板没配该轨迹代码,不再继续 // step2、触发轨迹推送事件(异步) await HandleTrackPushAsync(@event, track); // step3、触发订单主表更新事件(异步) - await _capPublisher.PublishAsync(GlobalConst.TrackUpsertAfterUpdateOrderSubscribe, - new TrackUpsertAfterUpdateOrderEvent + await _capPublisher.PublishAsync(GlobalConst.TrackChangeAfterUpdateOrderSubscribe, + new TrackChangeAfterUpdateOrderEvent { OrderId = track.OrderId, IsCompleted = track.IsCompleted, @@ -88,6 +96,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe foreach (var linkedOrder in linkedOrders) { var nextEvent = @event.DeepCopy(); + nextEvent.Visited.Add(@event.OrderId); nextEvent.OrderId = linkedOrder.OrderId; nextEvent.OrderType = linkedOrder.OrderType; nextEvent.OrderNo = linkedOrder.OrderNo; @@ -104,49 +113,75 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe /// /// /// - private async Task UpsertTrackAsync(TrackDetailsIndex? track, TrackUpsertEvent @event) + private async Task UpsertTrackAsync(TrackDetailsIndex? track, TrackUpsertEvent @event) { if (track == default) { - //todo:可以优化 - // 根据轨迹code在订单模板内容中寻找匹配的 - var trackContent = await _provideQueries.MatchTrackContentAsync(@event.OrderId, @event.TrackCode); - if (trackContent == default) - { - // 订单所绑定的模板,没有一条内容可以匹配发生的轨迹 - return; - } - track = new TrackDetailsIndex { IndexName = $"{GlobalConst.TrackIndex}-{DateTime.Now:yyyy.MM.dd}", OrderId = @event.OrderId, OrderNo = @event.OrderNo, OrderType = @event.OrderType, - TrackStatus = trackContent.Status, TrackCode = @event.TrackCode, - TrackContent = trackContent.Content, - TrackContentId = trackContent.Id, - IsCompleted = trackContent.IsCompleted, - TrackEnContent = trackContent.EnContent, TrackPlace = @event.TrackPlace, - TrackTime = @event.TrackTime!.Value, - TrackTimeZone = @event.TrackTimeZone!.Value, - IsCanDelete = trackContent.IsCanDelete, - CreateUser = CurrentUserRequest.CurrentUser.Name, + TrackTime = @event.TrackTime, + TrackTimeZone = @event.TrackTimeZone, + IsCanDelete = false, + OriginTrackContent = @event.OriginTrackContent, + OriginTrackData = @event.OriginTrackData, + CreateUser = @event.OperationMan, CreateTime = DateTime.Now }; + + // tips:刷新到无法匹配内容的轨迹引起的插入 + if (@event.TrackCode == GlobalConst.EmptyString) + { + track.TrackStatus = GlobalConst.EmptyString; + track.TrackContent = GlobalConst.EmptyString; + track.TrackContentId = 0; + track.IsCompleted = false; + track.TrackEnContent = GlobalConst.EmptyString; + } + else + { + //todo:可以优化 + // 根据轨迹code在订单模板内容中寻找匹配的 + var trackContent = await _provideQueries.MatchTrackContentAsync(@event.OrderId, @event.TrackCode); + if (trackContent == default) + { + // 订单所绑定的模板,没有一条内容可以匹配发生的轨迹 + return null; + } + + track = new TrackDetailsIndex + { + TrackStatus = trackContent.Status, + TrackContent = trackContent.Content, + TrackContentId = trackContent.Id, + IsCompleted = trackContent.IsCompleted, + TrackEnContent = trackContent.EnContent, + IsCanDelete = trackContent.IsCanDelete + }; + + track.ZeroTrackTime = track.TrackTime.Subtract(TimeSpan.FromHours(track.TrackTimeZone)); + } } else { + // tips:刷新到无法匹配内容的轨迹 相同的发生时间不做更新处理 + if (@event.TrackCode == GlobalConst.EmptyString) return track; + track.TrackPlace = @event.TrackPlace; - track.TrackTime = @event.TrackTime!.Value; - track.TrackTimeZone = @event.TrackTimeZone!.Value; - track.UpdateUser = CurrentUserRequest.CurrentUser.Name; + track.TrackTime = @event.TrackTime; + track.TrackTimeZone = @event.TrackTimeZone; + track.UpdateUser = @event.OperationMan ?? "系统"; track.UpdateTime = DateTime.Now; } await _trackDetailsRepository.UpsertAsync(track); + + return track; } /// @@ -163,7 +198,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe { config = await _trackPushCacheService.GetPushContentConfigAsync( @event.SubSystemId, @event.CustomId, track.TrackContentId); - if (!config.IsCanUpdate) return; + if (config == null || !config.IsCanUpdate) return; } else { @@ -186,6 +221,8 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe OptionType = optionType, ServiceProviderCode = config.ServiceProviderCode, OrderNo = track.OrderNo, + OrderType = track.OrderType, + OrderId = track.OrderId, TrackContentId = config.TrackContentId, TrackStatus = track.TrackStatus, TrackCode = track.TrackCode, diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackPullService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackPullService.cs index de894ef4..f5856f91 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackPullService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackPullService.cs @@ -86,10 +86,10 @@ public class TrackPullService : ApplicationService } var orders = await _provideQueries.FindOrderWithServiceProviderAsync(config.ServiceProviderId); + var serviceProviderCode = orders.FirstOrDefault()?.ServiceProviderCode; foreach (var group in orders.GroupBy(x => - new TrackRefreshAttach(x.ServiceProviderId, x.ServiceProviderCode, x.SubSystemId, - x.OrderType))) + new { x.SubSystemId, x.OrderType })) { var data = group.Select(x => new { @@ -98,11 +98,14 @@ public class TrackPullService : ApplicationService // 批量获取轨迹 await _httpClientProxy.Service.BatchForwardThenPushToQueueAsync( - InterfaceRelayConst.GetTrackInterfaceCode, group.Key.ServiceProviderCode, data, - GlobalConst.TrackRefreshSubscribe, JsonConvert.SerializeObject(group.Key)); + InterfaceRelayConst.GetTrackInterfaceCode, serviceProviderCode, data, + GlobalConst.TrackRefreshSubscribe, + JsonConvert.SerializeObject(new TrackRefreshAttach(config.ServiceProviderId, serviceProviderCode!, + group.Key.SubSystemId, group.Key.OrderType))); } - await RedisHelper.Client.SetExAsync(redisKey, config.PullInterval * 60, 1); + if (config.PullInterval < 60) config.PullInterval = 60; + await RedisHelper.Client.SetExAsync(redisKey, config.PullInterval * 60, orders.Count); } diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs index 2fee5408..78611294 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs @@ -1,9 +1,11 @@ using DotNetCore.CAP; +using Microsoft.AspNetCore.Authorization; using SJZY.Track.Application.Contract.Dtos.ProvideServices; 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.Aggregates.TrackPushAggregate; using SJZY.Track.Domain.Consts; using SJZY.Track.Domain.Enums; using SJZY.UserCenter.HttpApi.Services; @@ -21,16 +23,19 @@ public class TrackPushService : ApplicationService private readonly IOrderRepository _orderRepository; private readonly ITrackPushCacheService _pushCacheService; private readonly ICapPublisher _capPublisher; + private readonly ITrackPushRecordsRepository _trackPushRecordsRepository; public TrackPushService(ITrackPushCacheService pushCacheService, ITrackDetailsRepository trackDetailsRepository , IOrderRepository orderRepository - , ICapPublisher capPublisher) + , ICapPublisher capPublisher + , ITrackPushRecordsRepository trackPushRecordsRepository) { _pushCacheService = pushCacheService; _trackDetailsRepository = trackDetailsRepository; _orderRepository = orderRepository; _capPublisher = capPublisher; + _trackPushRecordsRepository = trackPushRecordsRepository; } /// @@ -46,7 +51,7 @@ public class TrackPushService : ApplicationService var orders = await _orderRepository.GetListAsync(x => x.OrderType == input.OrderType && input.OrderNos.Contains(x.OrderNo), x => new { - x.Id, x.OrderNo, x.SubSystemId, x.CustomId + x.Id, x.OrderNo, x.OrderType, x.SubSystemId, x.CustomId }); if (orders.Count == 0) @@ -74,10 +79,14 @@ public class TrackPushService : ApplicationService await _pushCacheService.GetPushContentConfigAsync(order.SubSystemId, order.CustomId, track.TrackContentId); + if (config == null) continue; + var trackPushEvent = new TrackPushEvent { ServiceProviderCode = config.ServiceProviderCode, OrderNo = order.OrderNo, + OrderType = order.OrderType, + OrderId = order.Id, TrackContentId = config.TrackContentId, TrackStatus = track.TrackStatus, TrackCode = track.TrackCode, @@ -107,17 +116,34 @@ public class TrackPushService : ApplicationService /// 定时任务推送预警(》12小时没有推送的) /// /// + [AllowAnonymous] [HttpPost("Track/PushWarnForTask")] public async Task PushWarnForTaskAsync() { - var time = DateTime.Now.Subtract(TimeSpan.FromHours(12)); - var orders = await _orderRepository.GetListAsync(x => - !x.IsCompleted && x.QuestionType == 0 && x.LatestPushTime < time); + var orders = await _orderRepository.GetPushWarnOrdersAsync(); - orders.ForEach(x => { x.QuestionType = (int)TrackProblemType.Warn; }); + var time = DateTime.Now.Subtract(TimeSpan.FromHours(12)); + + orders.ForEach(x => + { + x.QuestionType = x.LatestPushTime == null || x.LatestPushTime < time + ? (int)TrackProblemType.Warn + : (int)TrackProblemType.None; + }); await _orderRepository.UpdateRangeAsync(orders, x => new { x.QuestionType }); - return $"成功将{orders.Select(x => x.OrderNo).JoinAsString(",")}置为预警单"; + return $"成功将:{orders.Count(x => x.QuestionType == (int)TrackProblemType.Warn)}个订单置为预警"; + } + + /// + /// 获取轨迹推送记录 + /// + /// + /// + [HttpGet("Track/GetTrackPushRecords")] + public async Task> GetTrackPushRecordsAsync(OrderNoInfo input) + { + return await _trackPushRecordsRepository.GetTrackPushRecordsAsync(input.OrderNo, input.OrderType); } } \ No newline at end of file diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index b45d9313..72fe2f20 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -6,6 +6,7 @@ using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Consts; using SJZY.Track.Domain.Queries; +using SJZY.UserCenter.HttpApi.Services; namespace SJZY.Track.Application.Services.ProvideServices; @@ -56,6 +57,7 @@ public partial class TrackService : ApplicationService, ITrackService @event.LatestPushTrackContentId = order.LatestPushTrackContentId; @event.CustomId = order.CustomId; @event.IsCompleted = order.IsCompleted; + @event.OperationMan = CurrentUserRequest.CurrentUser.Name; await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, @event); return true; } @@ -78,7 +80,7 @@ public partial class TrackService : ApplicationService, ITrackService var orders = await _orderRepository.GetListAsync(x => x.OrderType == input.OrderType && input.OrderNos.Contains(x.OrderNo), x => new { - x.Id, x.OrderNo, x.SubSystemId, x.LatestPushTrackContentId, x.CustomId + x.Id, x.OrderNo, x.SubSystemId, x.LatestPushTrackContentId, x.CustomId, x.IsCompleted }); foreach (var order in orders) @@ -86,16 +88,19 @@ public partial class TrackService : ApplicationService, ITrackService // 新增/更新轨迹 var @event = new TrackUpsertEvent { + IsAdd = input.IsAdd, TrackCode = input.TrackCode, TrackPlace = input.TrackPlace, - TrackTime = input.TrackTime, - TrackTimeZone = input.TrackTimeZone, + TrackTime = input.TrackTime!.Value, + TrackTimeZone = input.TrackTimeZone!.Value, OrderType = input.OrderType, OrderNo = order.OrderNo, OrderId = order.Id, SubSystemId = order.SubSystemId, LatestPushTrackContentId = order.LatestPushTrackContentId, - CustomId = order.CustomId + CustomId = order.CustomId, + IsCompleted = order.IsCompleted, + OperationMan = CurrentUserRequest.CurrentUser.Name }; await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, @event); } @@ -135,6 +140,7 @@ public partial class TrackService : ApplicationService, ITrackService OrderId = order.Id, TrackCodes = codes.Select(x => x.TrackCode).ToList(), SubSystemId = order.SubSystemId, + OperationMan = CurrentUserRequest.CurrentUser.Name }; await _capPublisher.PublishAsync(GlobalConst.TrackDeleteSubscribe, @event); @@ -174,6 +180,7 @@ public partial class TrackService : ApplicationService, ITrackService OrderId = group.Key, TrackCodes = codes.Select(x => x.TrackCode).ToList(), SubSystemId = orders.First(x => x.Id == group.Key).SubSystemId, + OperationMan = CurrentUserRequest.CurrentUser.Name }; await _capPublisher.PublishAsync(GlobalConst.TrackDeleteSubscribe, @event); } diff --git a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs index f4946435..90795551 100644 --- a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs +++ b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs @@ -64,7 +64,7 @@ namespace SJZY.Track.Application.Services.TrackContents var detailInfo = await _trackContentRepository.GetDetailAsync(id); if (detailInfo == null) { - return new UnifyResultDto(false, null, "未查询到轨迹状态"); + return new UnifyResultDto(false, null!, "未查询到轨迹状态"); } var dto = ObjectMapper.Map(detailInfo); @@ -101,18 +101,18 @@ namespace SJZY.Track.Application.Services.TrackContents if (trackContentEntitys.Any()) { //throw new BusinessException(message: _stringLocalizer["TrackContentExist"]); - var codes = trackContentEntitys.FirstOrDefault(a => a.Code==input.Code); - if (codes!=null) + var codes = trackContentEntitys.FirstOrDefault(a => a.Code == input.Code); + if (codes != null) { throw new BusinessException(message: "该子系统下轨迹代码已存在"); } - var contents = trackContentEntitys.FirstOrDefault(a => a.Content==input.Content); - if (contents!=null) + var contents = trackContentEntitys.FirstOrDefault(a => a.Content == input.Content); + if (contents != null) { throw new BusinessException(message: "该子系统下轨迹内容已存在"); } - var contentEns = trackContentEntitys.FirstOrDefault(a => a.EnContent==input.EnContent); - if (contentEns!=null) + var contentEns = trackContentEntitys.FirstOrDefault(a => a.EnContent == input.EnContent); + if (contentEns != null) { throw new BusinessException(message: "该子系统下轨迹内容英文已存在"); } @@ -138,18 +138,18 @@ namespace SJZY.Track.Application.Services.TrackContents { //throw new BusinessException(message: _stringLocalizer["TrackContentExist"]); //throw new BusinessException(message: "当前子系统下,轨迹代码或轨迹内容或轨迹内容英文存在"); - var codes = trackContentEntitys.FirstOrDefault(a => a.Code==input.Code); - if (codes!=null) + var codes = trackContentEntitys.FirstOrDefault(a => a.Code == input.Code); + if (codes != null) { throw new BusinessException(message: "该子系统下轨迹代码已存在"); } - var contents = trackContentEntitys.FirstOrDefault(a => a.Content==input.Content); - if (contents!=null) + var contents = trackContentEntitys.FirstOrDefault(a => a.Content == input.Content); + if (contents != null) { throw new BusinessException(message: "该子系统下轨迹内容已存在"); } - var contentEns = trackContentEntitys.FirstOrDefault(a => a.EnContent==input.EnContent); - if (contentEns!=null) + var contentEns = trackContentEntitys.FirstOrDefault(a => a.EnContent == input.EnContent); + if (contentEns != null) { throw new BusinessException(message: "该子系统下轨迹内容英文已存在"); } diff --git a/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs b/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs index 46155e2e..fe72985a 100644 --- a/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs +++ b/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs @@ -1,9 +1,10 @@ using System.Linq.Expressions; using SJZY.Expand.ABP.Core; -using SJZY.Track.Application.Contract.Dtos.ProvideServices; +using SJZY.Track.Application.Contract.Dtos.TrackPush; using SJZY.Track.Application.Contract.Services; using SJZY.Track.Domain.Aggregates.TrackPushAggregate; using SJZY.Track.Domain.Consts; +using SJZY.Track.Domain.Dtos.TrackPush; namespace SJZY.Track.Application.Services.TrackPush; @@ -28,12 +29,12 @@ public class TrackPushCacheService : ApplicationService, ITrackPushCacheService } [NonAction] - public async Task GetPushContentConfigAsync(int subSystemId, int customId, + public async Task GetPushContentConfigAsync(int subSystemId, int customId, int trackContentId) { var data = await GetPushContentConfigsAsync(subSystemId, customId); - return data.Single(x => x.TrackContentId == trackContentId); + return data?.FirstOrDefault(x => x.TrackContentId == trackContentId); } [NonAction] @@ -74,16 +75,13 @@ public class TrackPushCacheService : ApplicationService, ITrackPushCacheService var trackPushConfigEntity = await _trackPushConfigRepository.GetFirstAsync(exp); if (trackPushConfigEntity == null) return data; - var trackPushContentList = - await _trackPushConfigRepository.GetContentListAsync(x => x.TrackPushConfigId == trackPushConfigEntity.Id); + var trackPushContentList = await _trackPushConfigRepository.GetContentListAsync(trackPushConfigEntity.Id); if (trackPushContentList.Count == 0) return data; - trackPushContentList = trackPushContentList.OrderBy(x => x.Sort).ToList(); - data.IsAutoPush = trackPushConfigEntity.IsAutoPush; data.ContentConfigs = - ObjectMapper.Map, List>(trackPushContentList); - + ObjectMapper.Map, List>(trackPushContentList); + ; await RedisHelper.Client.SetAsync( TrackPushContentKey(trackPushConfigEntity.SubSystemId, trackPushConfigEntity.CustomId), data); diff --git a/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs b/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs index b2b2cd06..88062bb8 100644 --- a/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs +++ b/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs @@ -6,6 +6,7 @@ using SJZY.Expand.ABP.Core.Logger; using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.InterfaceRelay.Application.Contracts; using SJZY.Track.Application.Contract; +using SJZY.Track.Application.EventHandlers; using SJZY.Track.Application.Localization; using SJZY.UserCenter.Contracts; using SJZY.UserCenter.SharedModel; @@ -90,7 +91,7 @@ namespace SJZY.Track.Application { dashboardOptions.PathBase = System.Diagnostics.Debugger.IsAttached ? "" - : configuration["Swagger:JsonUrlPrefix"]; + : configuration["Swagger:JsonUrlPrefix"]!; }); options.FailedThresholdCallback = faileCalback => { @@ -99,15 +100,15 @@ namespace SJZY.Track.Application LogHelper.Error($@" |-CAP失败回调事件: |-处理类型:{(faileCalback.MessageType == DotNetCore.CAP.Messages.MessageType.Subscribe ? "消费消息达到最大重试次数,需要开发人员介入" : "生产消息推送失败")} - |-头部信息:{faileCalback?.Message?.Headers?.ToJson()} - |-消息内容:{((JsonElement)faileCalback?.Message?.Value).GetRawText()}"); + |-头部信息:{faileCalback.Message.Headers.ToJson()} + |-消息内容:{((JsonElement?)faileCalback.Message.Value)?.GetRawText()}"); } catch (Exception ex) { LogHelper.Error("【严重】CAP失败回调事件发生未处理异常" + ex); } }; - }); + }).AddSubscribeFilter(); } public override void PreConfigureServices(ServiceConfigurationContext context) diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs index acc0d4de..10832b40 100644 --- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs @@ -25,6 +25,11 @@ public interface IOrderRepository : IBasicRepository /// Task DeleteOrderAsync(int orderId); + /// + /// 获取推送预警单 + /// + /// + Task> GetPushWarnOrdersAsync(); #region 订单关联 diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs index acd0ed4e..c78d9b2f 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs @@ -6,6 +6,8 @@ public interface ITrackDetailsRepository { Task GetFirstOrDefaultAsync(int orderId, string trackCode); + Task GetFirstOrDefaultAsync(int orderId, DateTime trackTime); + Task UpsertAsync(TrackDetailsIndex index); Task> GetListAsync(int orderType, List orderNos); diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs index 43721588..b3319d35 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs @@ -48,15 +48,10 @@ public class TrackDetailsIndex : IdBaseIndex public int TrackContentId { get; set; } /// - /// 这条轨迹是否意味着完成(删除回退需要用到) + /// 这条轨迹是否意味着完成 /// public bool IsCompleted { get; set; } - /// - /// 原轨迹状态 - /// - public string? OriginTrackStatus { get; set; } - /// /// 原轨迹内容 /// @@ -87,6 +82,11 @@ public class TrackDetailsIndex : IdBaseIndex /// public float TrackTimeZone { get; set; } + /// + /// 转化后的轨迹发生时间 + /// + public DateTime ZeroTrackTime { get; set; } + /// 是否可删 public bool IsCanDelete { get; set; } diff --git a/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/ITrackPushConfigRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/ITrackPushConfigRepository.cs index 80013967..641fb386 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/ITrackPushConfigRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/ITrackPushConfigRepository.cs @@ -23,11 +23,16 @@ public interface ITrackPushConfigRepository : IBasicRepository UpdateContentAsync(TrackPushContentConfigEntity updateObj); - Task> GetContentListAsync(Expression> whereExpression); + Task> GetContentListAsync( + Expression> whereExpression); + + Task> GetContentListAsync(int configId); Task UpdateContentRangeAsync(List updateObjs); - Task ContentMaxAsync(Expression> columns, Expression> whereExpression); + Task ContentMaxAsync(Expression> columns, + Expression> whereExpression); - Task UpdateContentAsync(Expression> columns, Expression> whereExpression); + Task UpdateContentAsync(Expression> columns, + Expression> whereExpression); } \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/ITrackPushRecordsRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/ITrackPushRecordsRepository.cs index e8115b13..e776b1f4 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/ITrackPushRecordsRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/ITrackPushRecordsRepository.cs @@ -15,4 +15,6 @@ public interface ITrackPushRecordsRepository /// /// Task> GetTrackPushRecordsAsync(int orderId); + + Task> GetTrackPushRecordsAsync(string inputOrderNo, int inputOrderType); } \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/TrackPushRecordIndex.cs b/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/TrackPushRecordIndex.cs index 0d178b45..6efa70b5 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/TrackPushRecordIndex.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/TrackPushRecordIndex.cs @@ -17,6 +17,16 @@ public class TrackPushRecordIndex : IdBaseIndex /// public int OrderId { get; set; } + /// + /// 订单号 + /// + public string OrderNo { get; set; } = null!; + + /// + /// 订单类型(主数据枚举TrackOrderType) + /// + public int OrderType { get; set; } + /// /// 接口通请求Id /// diff --git a/src/SJZY.Track.Domain/Consts/GlobalConst.MQ.cs b/src/SJZY.Track.Domain/Consts/GlobalConst.MQ.cs index d9dfd74b..b6d27ceb 100644 --- a/src/SJZY.Track.Domain/Consts/GlobalConst.MQ.cs +++ b/src/SJZY.Track.Domain/Consts/GlobalConst.MQ.cs @@ -23,9 +23,9 @@ public partial class GlobalConst public const string TrackPushSubscribe = "SJZY.Track.TrackPush"; /// - /// 轨迹新增/更新后触发更新订单主表 + /// 轨迹新增/更新/删除后触发更新订单主表 /// - public const string TrackUpsertAfterUpdateOrderSubscribe = "SJZY.Track.TrackUpsertAfterUpdateOrder"; + public const string TrackChangeAfterUpdateOrderSubscribe = "SJZY.Track.TrackChangeAfterUpdateOrder"; /// /// 轨迹推送后触发更新订单主表 diff --git a/src/SJZY.Track.Domain/Consts/GlobalConst.cs b/src/SJZY.Track.Domain/Consts/GlobalConst.cs new file mode 100644 index 00000000..a7167357 --- /dev/null +++ b/src/SJZY.Track.Domain/Consts/GlobalConst.cs @@ -0,0 +1,6 @@ +namespace SJZY.Track.Domain.Consts; + +public partial class GlobalConst +{ + public const string EmptyString = "--"; +} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Dtos/TrackPush/TrackPushContentConfigVO.cs b/src/SJZY.Track.Domain/Dtos/TrackPush/TrackPushContentConfigVO.cs new file mode 100644 index 00000000..1f67fb8d --- /dev/null +++ b/src/SJZY.Track.Domain/Dtos/TrackPush/TrackPushContentConfigVO.cs @@ -0,0 +1,59 @@ +namespace SJZY.Track.Domain.Dtos.TrackPush; + +public class TrackPushContentConfigVO +{ + /// + /// 是否自动推送 + /// + public bool IsAutoPush { get; set; } + + /// + /// 是否支持更新 + /// + public bool IsCanUpdate { get; set; } + + /// + /// 服务商code + /// + public string ServiceProviderCode { get; set; } = null!; + + /// + /// 扩展字段参数值 + /// + public string? ExpandFieldsValue { get; set; } + + /// + /// 推送单号类型(主数据枚举TrackOrderType) + /// + public int OrderType { get; set; } + + /// + /// 轨迹代码参数值 + /// + public string? TrackContentCodeValue { get; set; } + + /// + /// 轨迹内容id + /// + public int TrackContentId { get; set; } + + /// + /// 轨迹内容参数值 + /// + public string? TrackContentValue { get; set; } + + /// + /// 轨迹内容英文参数值 + /// + public string? TrackEnContentValue { get; set; } + + /// + /// 轨迹状态参数值 + /// + public string? TrackStatusValue { get; set; } + + /// + /// 轨迹时区GMT + /// + public double? TrackTimeZone { get; set; } +} \ No newline at end of file diff --git a/src/SJZY.Track.Repository/Queries/TrackOrderQueries.cs b/src/SJZY.Track.Repository/Queries/TrackOrderQueries.cs index 8d9d2504..841a3555 100644 --- a/src/SJZY.Track.Repository/Queries/TrackOrderQueries.cs +++ b/src/SJZY.Track.Repository/Queries/TrackOrderQueries.cs @@ -1,6 +1,7 @@ using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate; using SJZY.Track.Domain.Dtos.Order; +using SJZY.Track.Domain.Enums; using SJZY.Track.Domain.Queries; using SJZY.Track.Domain.VEntities; using SJZY.Track.Repository.VData.Entitys; @@ -38,6 +39,7 @@ public class TrackOrderQueries : ISugarRepository, ITrackOrderQueries, .WhereIF(input.CustomerId > 0, (a, b, c) => a.CustomId == input.CustomerId) .WhereIF(input.TrackOrderType > 0, (a, b, c) => a.OrderType == input.TrackOrderType) .WhereIF(input.TabType > 0, (a, b, c) => a.QuestionType == input.TabType) + .WhereIF(input.TabType == (int)TrackProblemType.Warn, (a, b, c) => !a.IsCompleted) .OrderByDescending((a, b, c) => a.CreateTime) .Select((a, b, c) => new TrackOrderVO { diff --git a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs index 26a8ed2b..bbbdca05 100644 --- a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs @@ -1,6 +1,8 @@ using SJZY.Track.Domain; using SJZY.Track.Domain.Aggregates.OrderAggregate; +using SJZY.Track.Domain.Aggregates.TrackPushAggregate; using SJZY.Track.Domain.Dtos.Order; +using SJZY.Track.Domain.Enums; namespace SJZY.Track.Repository.Repositories; @@ -53,6 +55,23 @@ public class OrderRepository : BasicRepository, IOrderRepository, I tran.Complete(); } + public async Task> GetPushWarnOrdersAsync() + { + var errorType = (int)TrackProblemType.Error; + + return await Context.Queryable() + .LeftJoin((a, b) => a.SubSystemId == b.SubSystemId && a.CustomId == b.CustomId) + .Where((a, b) => !b.IsCompleted && b.QuestionType != errorType) + .Where("a.CreateTime < DATE_SUB(now(),INTERVAL 12 hour)") // 过滤掉创建时间不足12小时的 + .Select((a, b) => new OrderEntity + { + Id = b.Id, + QuestionType = b.QuestionType, + LatestPushTime = b.LatestPushTime + }) + .ToListAsync(); + } + #region 订单关联 public async Task> GetLinkedOrdersAsync(int orderId) diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs index f50d7ebb..b39652de 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs @@ -32,6 +32,25 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract GetFirstOrDefaultAsync(int orderId, DateTime trackTime) + { + var r = await Context.SearchAsync(s => s + .Source() + .Query(q => + q.Term(f => f.OrderId, orderId) + && q.Term(f => f.TrackTime, trackTime) + ) + ); + + var res = r.Documents.FirstOrDefault(); + if (res != default && r.Hits.FirstOrDefault() != default) + { + res.Id = r.Hits.FirstOrDefault()!.Id; + } + + return res; + } + public async Task UpsertAsync(TrackDetailsIndex index) { if (index.Id.IsNullOrWhiteSpace()) @@ -93,10 +112,12 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract(x => x .Source(s => s.Includes(fd => fd + .Field(f => f.OrderId) .Field(f => f.OrderNo) .Field(f => f.TrackStatus) .Field(f => f.TrackCode) .Field(f => f.TrackContent) + .Field(f => f.TrackContentId) .Field(f => f.TrackPlace) .Field(f => f.TrackTime) .Field(f => f.TrackTimeZone) @@ -165,7 +186,7 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract t.OrderId, orderId) && q.Term(t => t.IsCanDelete, true) && q.Terms(t => t.Field(f => f.TrackCode.Suffix("keyword")).Terms(trackCodes))) - .Refresh() // 可选:立即刷新索引使更改立即可见 + //.Refresh(Refresh.True) // 可选:立即刷新索引使更改立即可见 ); if (!r.IsValid) diff --git a/src/SJZY.Track.Repository/Repositories/TrackPushConfigRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackPushConfigRepository.cs index e58b1020..74bfc0d3 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackPushConfigRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackPushConfigRepository.cs @@ -1,14 +1,13 @@ -using SJZY.Expand.ABP.Core.PublicMethords; +using System.Linq.Expressions; +using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.Track.Domain.Aggregates.TrackContentAggregate; using SJZY.Track.Domain.Aggregates.TrackPullAggregate; using SJZY.Track.Domain.Aggregates.TrackPushAggregate; -using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate; using SJZY.Track.Domain.Dtos.Common; using SJZY.Track.Domain.Dtos.TrackPush; using SJZY.Track.Domain.Enums; using SJZY.Track.Domain.VEntities; using SJZY.Track.Repository.VData.Entitys; -using System.Linq.Expressions; namespace SJZY.Track.Repository.Repositories; @@ -19,11 +18,14 @@ public class TrackPushConfigRepository : BasicRepository, { return await AsQueryable() .LeftJoin((trackPush, system) => trackPush.SubSystemId == system.Id && !system.IsDeleted) - .LeftJoin((trackPush, system, externalSubject) => trackPush.CustomId == externalSubject.Id && !externalSubject.IsDeleted) + .LeftJoin((trackPush, system, externalSubject) => + trackPush.CustomId == externalSubject.Id && !externalSubject.IsDeleted) .Filter(null, true) .Where(trackPush => !trackPush.IsDeleted) .WhereIF(input.SubSystemId.HasValue, trackPush => trackPush.SubSystemId == input.SubSystemId) - .WhereIF(!input.Keywords.IsNullOrWhiteSpace(), (trackPush, system, externalSubject) => externalSubject.Abbreviation.Contains(input.Keywords!) || externalSubject.Name.Contains(input.Keywords!)) + .WhereIF(!input.Keywords.IsNullOrWhiteSpace(), + (trackPush, system, externalSubject) => externalSubject.Abbreviation.Contains(input.Keywords!) || + externalSubject.Name.Contains(input.Keywords!)) .OrderByDescending(trackPush => trackPush.CreateTime) .Select((trackPush, system, externalSubject) => new GetTrackPushConfigPageOutputVO { @@ -36,11 +38,14 @@ public class TrackPushConfigRepository : BasicRepository, .ToPagedListAsync(input.PageIndex, input.PageSize); } - public async Task> GetContentPageAsync(GetTrackPushContentPageInputVO input) + public async Task> GetContentPageAsync( + GetTrackPushContentPageInputVO input) { return await Context.Queryable() .InnerJoin((pushContent, trackContent) => pushContent.TrackContentId == trackContent.Id) - .LeftJoin((pushContent, trackContent, enumValue) => enumValue.Property == EnumPropertyEnums.单号类型.GetDescription() && pushContent.OrderNoType == enumValue.Enumkey && !enumValue.IsDeleted) + .LeftJoin((pushContent, trackContent, enumValue) => + enumValue.Property == EnumPropertyEnums.单号类型.GetDescription() && + pushContent.OrderNoType == enumValue.Enumkey && !enumValue.IsDeleted) .Where(pushContent => pushContent.TrackPushConfigId == input.TrackPushConfigId) .OrderBy(pushContent => pushContent.Sort) .Select((pushContent, trackContent, enumValue) => new GetTrackPushContentPageOutputVO @@ -56,9 +61,12 @@ public class TrackPushConfigRepository : BasicRepository, { return await AsQueryable() .LeftJoin((trackPush, system) => trackPush.SubSystemId == system.Id && !system.IsDeleted) - .LeftJoin((trackPush, system, externalSubject) => trackPush.CustomId == externalSubject.Id && !externalSubject.IsDeleted) - .LeftJoin((trackPush, system, externalSubject, service) => trackPush.ServiceProviderId == service.Id && !service.IsDeleted) - .InnerJoin((trackPush, system, externalSubject, service, paramsConfig) => trackPush.Id == paramsConfig.PullOrPushConfigId && paramsConfig.IsPush && !paramsConfig.IsDeleted) + .LeftJoin((trackPush, system, externalSubject) => + trackPush.CustomId == externalSubject.Id && !externalSubject.IsDeleted) + .LeftJoin((trackPush, system, externalSubject, service) => + trackPush.ServiceProviderId == service.Id && !service.IsDeleted) + .InnerJoin((trackPush, system, externalSubject, service, paramsConfig) => + trackPush.Id == paramsConfig.PullOrPushConfigId && paramsConfig.IsPush && !paramsConfig.IsDeleted) .Filter(null, true) .Where(trackPush => trackPush.Id == id && !trackPush.IsDeleted) .Select((trackPush, system, externalSubject, service, paramsConfig) => new GetTrackPushConfigDetailOutputVO @@ -112,7 +120,32 @@ public class TrackPushConfigRepository : BasicRepository, return await Context.Updateable(updateObj).ExecuteCommandHasChangeAsync(); } - public async Task> GetContentListAsync(Expression> whereExpression) + public async Task> GetContentListAsync(int configId) + { + return await Context.Queryable() + .LeftJoin((a, b) => a.Id == b.TrackPushConfigId) + .LeftJoin((a, b, c) => a.ServiceProviderId == c.Id) + .Where(a => a.Id == configId) + .OrderBy((a, b) => b.Sort) + .Select((a, b, c) => new TrackPushContentConfigVO + { + IsAutoPush = a.IsAutoPush, + IsCanUpdate = a.IsCanUpdate, + ServiceProviderCode = c.Code, + ExpandFieldsValue = b.ExpandFieldsValue, + OrderType = b.OrderNoType, + TrackContentCodeValue = b.TrackContentCodeValue, + TrackContentId = b.TrackContentId, + TrackContentValue = b.TrackContentValue, + TrackEnContentValue = b.TrackEnContentValue, + TrackStatusValue = b.TrackStatusValue, + TrackTimeZone = b.TrackTimeZone + }) + .ToListAsync(); + } + + public async Task> GetContentListAsync( + Expression> whereExpression) { return await Context.Queryable().Where(whereExpression).ToListAsync(); } @@ -122,13 +155,16 @@ public class TrackPushConfigRepository : BasicRepository, return await Context.Updateable(updateObjs).ExecuteCommandHasChangeAsync(); } - public async Task ContentMaxAsync(Expression> columns, Expression> whereExpression) + public async Task ContentMaxAsync(Expression> columns, + Expression> whereExpression) { return await Context.Queryable().Where(whereExpression).MaxAsync(columns); } - public async Task UpdateContentAsync(Expression> columns, Expression> whereExpression) + public async Task UpdateContentAsync(Expression> columns, + Expression> whereExpression) { - return await Context.Updateable().SetColumns(columns).Where(whereExpression).ExecuteCommandHasChangeAsync(); + return await Context.Updateable().SetColumns(columns).Where(whereExpression) + .ExecuteCommandHasChangeAsync(); } } \ No newline at end of file diff --git a/src/SJZY.Track.Repository/Repositories/TrackPushRecordsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackPushRecordsRepository.cs index c1bb968f..3847d786 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackPushRecordsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackPushRecordsRepository.cs @@ -3,6 +3,7 @@ using SJZY.Expand.ABP.Core.Logger; using SJZY.Expand.ElasticSearch.Services; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Aggregates.TrackPushAggregate; +using SJZY.Track.Domain.Consts; namespace SJZY.Track.Repository.Repositories; @@ -30,6 +31,7 @@ public class TrackPushRecordsRepository : ElasticSearchContextAbstract> GetTrackPushRecordsAsync(int orderId) { var data = await Context.SearchAsync(x => x + .Index(GlobalConst.TrackPushRecordsIndex) .Query(q => q.Term(t => t.OrderId, orderId) ) @@ -38,4 +40,18 @@ public class TrackPushRecordsRepository : ElasticSearchContextAbstract> GetTrackPushRecordsAsync(string orderNo, int orderType) + { + var data = await Context.SearchAsync(x => x + .Index(GlobalConst.TrackPushRecordsIndex) + .Query(q => + q.Term(t => t.OrderNo.Suffix("keyword"), orderNo) + && q.Term(f => f.OrderType, orderType) + ) + .Size(1000) + .Sort(s => s.Field(f => f.CreateTime, SortOrder.Descending))); + + return data.Documents.ToList(); + } } \ No newline at end of file