From 8bd0108c1087e6de5e0a4e4eea1163633f850837 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Mon, 31 Mar 2025 10:01:58 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=E9=A2=84=E8=AD=A6?= =?UTF-8?q?=E6=98=8E=E7=BB=86=E6=9C=80=E6=96=B0=E8=BD=A8=E8=BF=B9=E5=BA=94?= =?UTF-8?q?=E6=9F=A5=E5=88=9B=E5=BB=BA=E6=97=B6=E9=97=B4=E6=9C=80=E6=96=B0?= =?UTF-8?q?/=E6=9C=80=E6=99=9A=E7=9A=84=E8=BD=A8=E8=BF=B9=EF=BC=8C?= =?UTF-8?q?=E8=80=8C=E4=B8=8D=E6=98=AF=E8=BD=A8=E8=BF=B9=E5=8F=91=E7=94=9F?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E6=9C=80=E6=96=B0/=E6=9C=80=E6=99=9A=20fix:?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=BF=90=E8=BE=93=E6=97=B6=E6=95=88=E9=A2=84?= =?UTF-8?q?=E8=AD=A6=E6=98=8E=E7=BB=86=E8=B5=B7=E5=A7=8B=E8=BD=A8=E8=BF=B9?= =?UTF-8?q?=E5=92=8C=E6=88=AA=E6=AD=A2=E8=BD=A8=E8=BF=B9=E5=BA=94=E5=8F=96?= =?UTF-8?q?=E5=AE=9E=E9=99=85=E7=9A=84=E7=8A=B6=E6=80=81=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E6=9C=80=E6=97=A9=E8=BD=A8=E8=BF=B9=EF=BC=8C=E7=B4=AF=E8=AE=A1?= =?UTF-8?q?=E8=BF=90=E8=BE=93=E6=97=B6=E9=97=B4=E5=92=8C=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E9=83=BD=E8=A6=81=E5=8A=A8=E6=80=81=E5=8F=82=E4=B8=8E=E8=AE=A1?= =?UTF-8?q?=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Warning/CompleteWarningService.cs | 4 +- .../Warning/TransportWarningService.cs | 38 ++++++++------- .../ITrackDetailsEsRepository.cs | 2 +- .../Transport/TransportWarningDetailsIndex.cs | 47 ++++++++++++++++++- .../Repositories/TrackDetailsEsRepository.cs | 2 +- 5 files changed, 69 insertions(+), 24 deletions(-) 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() )