diff --git a/src/SJZY.Track.Application/Services/Warning/CompleteWarningService.cs b/src/SJZY.Track.Application/Services/Warning/CompleteWarningService.cs index 52f4fc46..2f535795 100644 --- a/src/SJZY.Track.Application/Services/Warning/CompleteWarningService.cs +++ b/src/SJZY.Track.Application/Services/Warning/CompleteWarningService.cs @@ -142,7 +142,7 @@ public class CompleteWarningService : ApplicationService x.Status })).ToDictionary(x => x.Id, y => y.Status); - // 查最新轨迹 + // 查最新轨迹(创建时间) var orderIds = result.List.Select(x => x.OrderId).ToHashSet(); var orderIdTrackDict = await _trackDetailsEsRepository.GetLatestDictAsync(orderIds); @@ -244,7 +244,7 @@ public class CompleteWarningService : ApplicationService var bos = CompleteWarningRuleItemBO.From(input); // 同一个主体下同一个检查点,订单类型不允许出现交集 - foreach (var group in bos.GroupBy(x=>x.CheckPointTrackStatusId)) + foreach (var group in bos.GroupBy(x => x.CheckPointTrackStatusId)) { var allOrderTypes = new HashSet(); var count = 0; diff --git a/src/SJZY.Track.Application/Services/Warning/TransportWarningService.cs b/src/SJZY.Track.Application/Services/Warning/TransportWarningService.cs index bec84344..2787d3c4 100644 --- a/src/SJZY.Track.Application/Services/Warning/TransportWarningService.cs +++ b/src/SJZY.Track.Application/Services/Warning/TransportWarningService.cs @@ -181,9 +181,11 @@ public class TransportWarningService : ApplicationService return new UnifyPageResultDto(new List(), input.PageIndex, input.PageSize, 0); } - // 查最新轨迹 + // 查最新轨迹(创建时间) var orderIds = result.List.Select(x => x.OrderId).ToHashSet(); var orderIdTrackDict = await _trackDetailsEsRepository.GetLatestDictAsync(orderIds); + // 查轨迹状态最早轨迹 + var orderIdTrackStatusEarliestTrackDict = await _trackDetailsEsRepository.GetTrackStatusEarliestDictAsync(orderIds); // todo:缓存优化 // 订单类型 @@ -208,6 +210,9 @@ public class TransportWarningService : ApplicationService var map = result.List.Select(x => { var orderIdTrack = orderIdTrackDict.GetValueOrDefault(x.OrderId); + var orderIdTrackStatusEarliestTracks = orderIdTrackStatusEarliestTrackDict.GetValueOrDefault(x.OrderId); + var startStatusTrack = orderIdTrackStatusEarliestTracks?.GetValueOrDefault(x.StartTrackStatusId); + var endStatusTrack = orderIdTrackStatusEarliestTracks?.GetValueOrDefault(x.EndTrackStatusId); return new TransportWarningDetailsDto { EsId = x.Id, @@ -221,32 +226,32 @@ public class TransportWarningService : ApplicationService OrderTypeName = orderTypeDict.GetValueOrDefault(x.OrderType.ToString(), GlobalConst.EmptyString), NotifyUserNames = ToUserNames(x.NotifyUsers), - // 最新轨迹 (不冗余) + // 最新轨迹 (不冗余)创建时间最新 LatestTrackContent = orderIdTrack?.TrackContent, LatestTrackTime = orderIdTrack?.TrackTime, LatestTrackTimeZone = DateTimeHelper.ConvertFloatToTimeZone(orderIdTrack?.TrackTimeZone), LatestTrackPlace = orderIdTrack?.TrackPlace, - // 起始轨迹 + // 起始轨迹(最早发生的起始状态轨迹) StartTrackStatus = x.StartTrackStatus, - StartTrackContent = x.StartTrackContent, - StartTrackTime = x.StartTrackTime, - StartTrackTimeZone = DateTimeHelper.ConvertFloatToTimeZone(x.StartTrackTimeZone), + StartTrackContent = startStatusTrack?.TrackContent ?? x.StartTrackContent, + StartTrackTime = startStatusTrack?.TrackTime ?? x.StartTrackTime, + StartTrackTimeZone = DateTimeHelper.ConvertFloatToTimeZone(startStatusTrack?.TrackTimeZone ?? x.StartTrackTimeZone), - // 截止轨迹 + // 截止轨迹(最早发生的截止轨迹状态轨迹) EndTrackStatus = x.EndTrackStatus, - EndTrackContent = x.EndTrackContent, - EndTrackTime = x.EndTrackTime, - EndTrackTimeZone = DateTimeHelper.ConvertFloatToTimeZone(x.EndTrackTimeZone), + EndTrackContent = endStatusTrack?.TrackContent ?? x.EndTrackContent, + EndTrackTime = endStatusTrack?.TrackTime ?? x.EndTrackTime, + EndTrackTimeZone = DateTimeHelper.ConvertFloatToTimeZone(endStatusTrack?.TrackTimeZone ?? x.EndTrackTimeZone), WarningName = x.WarningName, WarningRuleDescription = x.WarningRuleDescription, // 累计运输时间 - CumulativeTimeSpan = FormatCumulativeTimeSpan(x), + CumulativeTimeSpan = FormatCumulativeTimeSpan(x, startStatusTrack, endStatusTrack), // 状态动态计算 - Status = x.CalcStatus(), + Status = x.CalcStatus(startStatusTrack, endStatusTrack), CreateTime = x.CreateTime }; }); @@ -275,13 +280,10 @@ public class TransportWarningService : ApplicationService } // 格式化累计运输时间为文本形式 - string FormatCumulativeTimeSpan(TransportWarningDetailsIndex detail) + string FormatCumulativeTimeSpan(TransportWarningDetailsIndex detail, TrackDetailsIndex? startStatusTrack, TrackDetailsIndex? endStatusTrack) { - // 如果是完成态则直接取缓存的累计运输时间 - var timeSpan = detail.CanCompleted() - ? TimeSpan.FromMilliseconds(detail.CumulativeTimeSpan) - : DateTime.Now.Subtract(detail.StartTrackTime); - + // 计算累计运输时间 + var timeSpan = detail.CalcCumulativeTimeSpan(startStatusTrack, endStatusTrack); return $"{timeSpan.Days:00}天{timeSpan.Hours:00}小时{timeSpan.Minutes:00}分钟"; } } diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs index 4155137f..72f49807 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs @@ -14,7 +14,7 @@ public interface ITrackDetailsEsRepository : IElasticsearchClientService>> GetTrackStatusEarliestDictAsync(HashSet orderIds); - // 查询订单的最新/晚轨迹,返回 k:订单id v:最早轨迹 + // 查询订单的最新/晚轨迹,返回 k:订单id v:最早轨迹,按创建时间 Task> GetLatestDictAsync(HashSet orderIds); Task> GetLatestListAsync(int[] eventOrderIds, List trackCodes); diff --git a/src/SJZY.Track.Domain/Aggregates/WarningAggregate/Transport/TransportWarningDetailsIndex.cs b/src/SJZY.Track.Domain/Aggregates/WarningAggregate/Transport/TransportWarningDetailsIndex.cs index 97e513ae..f58eb1b1 100644 --- a/src/SJZY.Track.Domain/Aggregates/WarningAggregate/Transport/TransportWarningDetailsIndex.cs +++ b/src/SJZY.Track.Domain/Aggregates/WarningAggregate/Transport/TransportWarningDetailsIndex.cs @@ -3,6 +3,7 @@ using System.Text; using Nest; using SJZY.Expand.ElasticSearch; using SJZY.Track.Domain.Aggregates.KPIAreaAggregate; +using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Consts; using SJZY.Track.Domain.Enums; @@ -79,10 +80,30 @@ public sealed class TransportWarningDetailsIndex : IdBaseIndex { // 已完成/超时完成,截止轨迹时间 - 起始轨迹时间 if (Status is (int) TransportWarningStatus.已完成 or (int) TransportWarningStatus.超时完成) - return (long)GetUtc0EndTrackTime()!.Value.Subtract(GetUtc0StartTrackTime()).TotalMilliseconds; + return (long) GetUtc0EndTrackTime()!.Value.Subtract(GetUtc0StartTrackTime()).TotalMilliseconds; // 其他状态,当前时间 - 起始轨迹时间 - return (long)DateTime.UtcNow.Subtract(GetUtc0StartTrackTime()).TotalMilliseconds; + return (long) DateTime.UtcNow.Subtract(GetUtc0StartTrackTime()).TotalMilliseconds; + } + + public TimeSpan CalcCumulativeTimeSpan(TrackDetailsIndex? startStatusTrack, TrackDetailsIndex? endStatusTrack) + { + TimeSpan timeSpan; + if (Status == (int) TransportWarningStatus.已关闭) + { + timeSpan = TimeSpan.FromMilliseconds(CumulativeTimeSpan); + } + else if (endStatusTrack != null) + { + timeSpan = endStatusTrack.GetUtc0TrackTime() + .Subtract(startStatusTrack!.GetUtc0TrackTime()); + } + else + { + timeSpan = DateTime.UtcNow.Subtract(startStatusTrack!.GetUtc0TrackTime()); + } + + return timeSpan; } // tips:计算并设置状态,后续维护到vo当中 @@ -109,6 +130,28 @@ public sealed class TransportWarningDetailsIndex : IdBaseIndex return Status; } + public int CalcStatus(TrackDetailsIndex? startStatusTrack, TrackDetailsIndex? endStatusTrack) + { + if (Status == (int) TransportWarningStatus.已关闭) return Status; + //时效 + var transportTimeSpan = TimeSpan.FromHours(TransportTimeSpan); //小时 + //预警时效(预警发出的时间对比于最早轨迹状态时间的跨度) + var startTrackWarningTimeSpan = TimeSpan.FromHours(StartTrackWarningTimeSpan); //小时 + + //累计运输时间 + var cumulativeTimeSpan = CalcCumulativeTimeSpan(startStatusTrack, endStatusTrack); + + //时效>累计运输时间>=预警时效 状态调整为【即将超时】 + if (transportTimeSpan > cumulativeTimeSpan && cumulativeTimeSpan >= startTrackWarningTimeSpan) + return Status = (int) TransportWarningStatus.即将超时; + + //时效<累计运输时间 状态调整为【已超时】 + if (transportTimeSpan < cumulativeTimeSpan) + return Status = (int) TransportWarningStatus.已超时; + + return Status; + } + // 预警规则描述,创建预警明细,更新场景(需要重新匹配),更新规则项目(需要重新匹配),更新规则区域名称 // todo:缺失更新规则区域名称目前不被感知,出现预警明细和对于的规则区域名称不一致 // todo:转化为bo的使用 diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs index 22998be5..2acf972c 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs @@ -240,7 +240,7 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract th .Size(1) .Sort(srt => srt - .Field(f => f.ZeroTrackTime, SortOrder.Descending) + .Field(f => f.CreateTime, SortOrder.Descending) ) .Source() )