fix:修复运输时效预警状态逻辑

This commit is contained in:
hardstylewyl 2025-04-01 11:04:43 +08:00
parent b5ee6396fd
commit 1771fe399a
2 changed files with 14 additions and 19 deletions

View File

@ -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<TransportWarningDetailsIndex>(0));
var orderTracks = orderTracksDict.GetValueOrDefault(orderId, new List<TrackDetailsIndex>(0));
var orderTasks = oderGenerateTaskDict.GetValueOrDefault(orderId, new List<TransportWarningDetailsGenerateTaskEntity>(0));
var orderDetails = orderDetailsDict.GetValueOrDefault(orderId, Empty<TransportWarningDetailsIndex>.List);
var orderTrackStatusEarliestDict = trackStatusEarliestDict.GetValueOrDefault(orderId, new Dictionary<int, TrackDetailsIndex>(0));
var orderTasks = oderGenerateTaskDict.GetValueOrDefault(orderId, Empty<TransportWarningDetailsGenerateTaskEntity>.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.关闭预警通知任务

View File

@ -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); //小时