diff --git a/src/SJZY.Track.Application/Services/Warning/Handlers/TransportWarningHandler.cs b/src/SJZY.Track.Application/Services/Warning/Handlers/TransportWarningHandler.cs index fb98e26c..924164ae 100644 --- a/src/SJZY.Track.Application/Services/Warning/Handlers/TransportWarningHandler.cs +++ b/src/SJZY.Track.Application/Services/Warning/Handlers/TransportWarningHandler.cs @@ -10,6 +10,7 @@ using SJZY.Track.Domain.Dtos.Forewarning; using SJZY.Track.Domain.Dtos.TrackDetails; using SJZY.Track.Domain.Dtos.Warning; using SJZY.Track.Domain.Enums; +using SJZY.Track.Domain.Extensions; using Volo.Abp.DependencyInjection; namespace SJZY.Track.Application.Services.Warning.Handlers; @@ -56,12 +57,8 @@ public class TransportWarningHandler : ITransportWarningHandler, ITransientDepen .ToDictionary(x => x.Key, y => y.Select(z => z.DeletedTrack.TrackStatusId).ToHashSet()); if (orderIdTrackStatusIdsDict.Count == 0) return; - // 2.查询订单包含的轨迹,并筛选和删除的轨迹状态一致(tips:由于已经是删除,查询出的轨迹不会包含当前已经删除的轨迹) - var orderTracksDict = await _trackDetailsEsRepository.GetOrderTracksDictAsync(new GetOrderTracksDictVO - { - // tips:要求订单id+轨迹状态id同时满足的轨迹 - OrderIdTracksStatusIdsDict = orderIdTrackStatusIdsDict - }); + // 2.查询订单每个状态最早轨迹的字点(tips:由于已经是删除,查询出的轨迹不会包含当前已经删除的轨迹) + var trackStatusEarliestDict = await _trackDetailsEsRepository.GetTrackStatusEarliestDictAsync(orderIds); // 3.查订单的运输时效预警明细,命中起始轨迹状态的(即将超时/已超时) var warningDetails = await _warningDetailsEsRepository.GetTransportWarningDetailsAsync(new GetTransportWarningDetailsVO @@ -98,16 +95,16 @@ public class TransportWarningHandler : ITransportWarningHandler, ITransientDepen // 以订单的维度处理预警明细 foreach (var orderId in orderIds) { - var orderDetails = orderDetailsDict.GetValueOrDefault(orderId, new List(0)); - var orderTracks = orderTracksDict.GetValueOrDefault(orderId, new List(0)); - var orderTasks = oderGenerateTaskDict.GetValueOrDefault(orderId, new List(0)); + var orderDetails = orderDetailsDict.GetValueOrDefault(orderId, Empty.List); + var orderTrackStatusEarliestDict = trackStatusEarliestDict.GetValueOrDefault(orderId, new Dictionary(0)); + var orderTasks = oderGenerateTaskDict.GetValueOrDefault(orderId, Empty.List); // 明细和生成任务都不存在跳过 if (orderDetails.Count == 0 && orderTasks.Count == 0) continue; - // 起始轨迹状态全部被删除 - if (orderTracks.Count == 0) + // 轨迹全部被删除直接关闭即可 + if (orderTrackStatusEarliestDict.Count == 0) { orderDetails.ForEach(x => { @@ -120,18 +117,13 @@ public class TransportWarningHandler : ITransportWarningHandler, ITransientDepen continue; } - // 构建轨迹状态id+最早轨迹字典 - var earliestTrackStatusTrackDict = orderTracks - .GroupBy(x => x.TrackStatusId) - .ToDictionary(x => x.Key, y => y.OrderBy(x => x.TrackTime).First()); - // 以起始轨迹状态id分组处理预警生成任务 foreach (var group in orderTasks.GroupBy(x => x.StartTrackStatusId)) { var tasks = group.ToList(); // 尝试寻找该轨迹状态的最早轨迹 - var earliestTrack = earliestTrackStatusTrackDict.GetValueOrDefault(group.Key); + var earliestTrack = orderTrackStatusEarliestDict.GetValueOrDefault(group.Key); // 不存在起始轨迹状态轨迹? // 关闭预警生成任务 @@ -160,7 +152,7 @@ public class TransportWarningHandler : ITransportWarningHandler, ITransientDepen var details = group.ToList(); // 尝试寻找该轨迹状态的最早轨迹 - var earliestTrack = earliestTrackStatusTrackDict.GetValueOrDefault(group.Key); + var earliestTrack = orderTrackStatusEarliestDict.GetValueOrDefault(group.Key); // 不存在起始轨迹状态轨迹? // 1.关闭预警通知任务 diff --git a/src/SJZY.Track.Domain/Aggregates/WarningAggregate/Transport/TransportWarningDetailsIndex.cs b/src/SJZY.Track.Domain/Aggregates/WarningAggregate/Transport/TransportWarningDetailsIndex.cs index bfbd525d..4b240349 100644 --- a/src/SJZY.Track.Domain/Aggregates/WarningAggregate/Transport/TransportWarningDetailsIndex.cs +++ b/src/SJZY.Track.Domain/Aggregates/WarningAggregate/Transport/TransportWarningDetailsIndex.cs @@ -98,7 +98,10 @@ public sealed class TransportWarningDetailsIndex : IdBaseIndex public int CalcStatus(TrackDetailsIndex? startStatusTrack, TrackDetailsIndex? endStatusTrack) { - if (Status == (int) TransportWarningStatus.已关闭) return Status; + // 已关闭/起始轨迹为空,直接返回已关闭 + if (Status == (int) TransportWarningStatus.已关闭 || startStatusTrack == null) + return Status = (int) TransportWarningStatus.已关闭; + var isEnd = endStatusTrack != null; //时效 var transportTimeSpan = TimeSpan.FromHours(TransportTimeSpan); //小时