fix:修复预警明细最新轨迹应查创建时间最新/最晚的轨迹,而不是轨迹发生时间最新/最晚

fix:修复运输时效预警明细起始轨迹和截止轨迹应取实际的状态中的最早轨迹,累计运输时间和状态都要动态参与计算
This commit is contained in:
hardstylewyl 2025-03-31 10:01:58 +08:00
parent 9d0b61ffe8
commit 8bd0108c10
5 changed files with 69 additions and 24 deletions

View File

@ -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);

View File

@ -181,9 +181,11 @@ public class TransportWarningService : ApplicationService
return new UnifyPageResultDto<TransportWarningDetailsDto>(new List<TransportWarningDetailsDto>(), 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}分钟";
}
}

View File

@ -14,7 +14,7 @@ public interface ITrackDetailsEsRepository : IElasticsearchClientService<TrackDe
// 查询订单的每个轨迹状态的最旧/早轨迹,返回 k:订单id v:[k:轨迹状态id,v:最早轨迹]
Task<Dictionary<int, Dictionary<int, TrackDetailsIndex>>> GetTrackStatusEarliestDictAsync(HashSet<int> orderIds);
// 查询订单的最新/晚轨迹,返回 k:订单id v:最早轨迹
// 查询订单的最新/晚轨迹,返回 k:订单id v:最早轨迹,按创建时间
Task<Dictionary<int, TrackDetailsIndex>> GetLatestDictAsync(HashSet<int> orderIds);
Task<List<TrackDetailsIndex>> GetLatestListAsync(int[] eventOrderIds, List<string> trackCodes);

View File

@ -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;
@ -85,6 +86,26 @@ public sealed class TransportWarningDetailsIndex : IdBaseIndex
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当中
public int CalcStatus()
{
@ -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的使用

View File

@ -240,7 +240,7 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract<TrackDetail
.TopHits("latest_track", th => th
.Size(1)
.Sort(srt => srt
.Field(f => f.ZeroTrackTime, SortOrder.Descending)
.Field(f => f.CreateTime, SortOrder.Descending)
)
.Source()
)