fix:修复预警明细最新轨迹应查创建时间最新/最晚的轨迹,而不是轨迹发生时间最新/最晚
fix:修复运输时效预警明细起始轨迹和截止轨迹应取实际的状态中的最早轨迹,累计运输时间和状态都要动态参与计算
This commit is contained in:
parent
9d0b61ffe8
commit
8bd0108c10
@ -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<int>();
|
||||
var count = 0;
|
||||
|
||||
@ -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}分钟";
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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的使用
|
||||
|
||||
@ -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()
|
||||
)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user