Merge branch 'S07' into test

This commit is contained in:
hardstylewyl 2025-03-24 10:44:00 +08:00
commit 57c697596b
6 changed files with 173 additions and 140 deletions

View File

@ -3,147 +3,147 @@ namespace SJZY.Track.Application.Contract.Dtos.Warning.Transport;
/// <summary> /// <summary>
/// 运输时效预警明细 /// 运输时效预警明细
/// </summary> /// </summary>
public sealed class TransportWarningDetailsDto // todo:需要根据状态排序 public sealed class TransportWarningDetailsDto
{ {
/// <summary> /// <summary>
/// 预警明细唯一id /// 预警明细唯一id
/// </summary> /// </summary>
public string EsId { get; set; } public string EsId { get; set; }
/// <summary> /// <summary>
/// 子系统id /// 子系统id
/// </summary> /// </summary>
public int SubSystemId { get; set; } public int SubSystemId { get; set; }
/// <summary> /// <summary>
/// 子系统名称 /// 子系统名称
/// </summary> /// </summary>
public string SubSystemName { get; set; } // todo:id换名称 public string SubSystemName { get; set; }
/// <summary> /// <summary>
/// 客户id /// 客户id
/// </summary> /// </summary>
public int CustomId { get; set; } public int CustomId { get; set; }
/// <summary> /// <summary>
/// 客户简称 /// 客户简称
/// </summary> /// </summary>
public string CustomName { get; set; } // todo:id换名称 public string CustomName { get; set; }
/// <summary> /// <summary>
/// 订单id /// 订单id
/// </summary> /// </summary>
public int OrderId { get; set; } public int OrderId { get; set; }
/// <summary> /// <summary>
/// 订单号 /// 订单号
/// </summary> /// </summary>
public string OrderNo { get; set; } public string OrderNo { get; set; }
/// <summary> /// <summary>
/// 订单类型 /// 订单类型
/// </summary> /// </summary>
public int OrderType { get; set; } public int OrderType { get; set; }
/// <summary> /// <summary>
/// 订单类型名称 /// 订单类型名称
/// </summary> /// </summary>
public string OrderTypeName { get; set; } // todo:type换名称 public string OrderTypeName { get; set; }
// 实时属性 todo:从es查询 // 实时属性 tips:从es查询
/// <summary> /// <summary>
/// 最新轨迹内容 /// 最新轨迹内容
/// </summary> /// </summary>
public string? LatestTrackContent { get; set; } public string? LatestTrackContent { get; set; }
/// <summary> /// <summary>
/// 最新轨迹时间 /// 最新轨迹时间
/// </summary> /// </summary>
public DateTime? LatestTrackTime { get; set; } public DateTime? LatestTrackTime { get; set; }
/// <summary> /// <summary>
/// 最新轨迹发生时区 /// 最新轨迹发生时区
/// </summary> /// </summary>
public float? LatestTrackTimeZone { get; set; } public string LatestTrackTimeZone { get; set; }
/// <summary> /// <summary>
/// 最新轨迹发生地 /// 最新轨迹发生地
/// </summary> /// </summary>
public string? LatestTrackPlace { get; set; } public string? LatestTrackPlace { get; set; }
/// <summary> /// <summary>
/// 通知对象 /// 通知对象
/// </summary> /// </summary>
public string NotifyUserNames { get; set; } public string NotifyUserNames { get; set; }
/// <summary> /// <summary>
/// 起始轨迹状态 /// 起始轨迹状态
/// </summary> /// </summary>
public string StartTrackStatus { get; set; } public string StartTrackStatus { get; set; }
/// <summary> /// <summary>
/// 起始轨迹内容 /// 起始轨迹内容
/// </summary> /// </summary>
public string StartTrackContent { get; set; } public string StartTrackContent { get; set; }
/// <summary> /// <summary>
/// 起始轨迹发生时间 /// 起始轨迹发生时间
/// </summary> /// </summary>
public DateTime StartTrackTime { get; set; } public DateTime StartTrackTime { get; set; }
/// <summary> /// <summary>
/// 起始轨迹时区 /// 起始轨迹时区 e.g GMT +8:00 / --
/// </summary> /// </summary>
public float StartTrackTimeZone { get; set; } public string StartTrackTimeZone { get; set; }
/// <summary> /// <summary>
/// 截止轨迹状态 /// 截止轨迹状态
/// </summary> /// </summary>
public string EndTrackStatus { get; set; } public string EndTrackStatus { get; set; }
/// <summary> /// <summary>
/// 截止轨迹内容 /// 截止轨迹内容
/// </summary> /// </summary>
public string? EndTrackContent { get; set; } public string? EndTrackContent { get; set; }
/// <summary> /// <summary>
/// 截止轨迹发生时间 /// 截止轨迹发生时间
/// </summary> /// </summary>
public DateTime? EndTrackTime { get; set; } public DateTime? EndTrackTime { get; set; }
/// <summary> /// <summary>
/// 截止轨迹时区 /// 截止轨迹时区 e.g GMT +8:00 / --
/// </summary> /// </summary>
public float? EndTrackTimeZone { get; set; } public string EndTrackTimeZone { get; set; }
/// <summary> /// <summary>
/// 预警名称 (预警主体名称 如字节全程时效) /// 预警名称 (预警主体名称 如字节全程时效)
/// </summary> /// </summary>
public string WarningName { get; set; } public string WarningName { get; set; }
/// <summary> /// <summary>
/// 预警规则描述(用于tooltip展示) /// 预警规则描述(用于tooltip展示)
/// </summary> /// </summary>
public string WarningRuleDescription { get; set; } public string WarningRuleDescription { get; set; }
/// <summary> /// <summary>
/// 累计运输时间 /// 累计运输时间
/// </summary> /// </summary>
public string CumulativeTimeSpan { get; set; } // todo:需要转换为某个格式 public string CumulativeTimeSpan { get; set; }
/// <summary> /// <summary>
/// 预警状态 (根据key展示对应名称,即将超时需要标红) /// 预警状态 (根据key展示对应名称,即将超时需要标红)
/// 1:即将超时 2:已超时 3:已完成 4:超时完成 5:已关闭,初始为【即将超时】 /// 1:即将超时 2:已超时 3:已完成 4:超时完成 5:已关闭,初始为【即将超时】
/// </summary> /// </summary>
public int Status { get; set; } public int Status { get; set; }
/// <summary> /// <summary>
/// 预警创建时间 /// 预警创建时间
/// </summary> /// </summary>
public DateTime CreateTime { get; set; } public DateTime CreateTime { get; set; }
} }

View File

@ -393,8 +393,8 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe
var handler3 = scope.ServiceProvider.GetRequiredService<IReturnWarningHandler>(); var handler3 = scope.ServiceProvider.GetRequiredService<IReturnWarningHandler>();
await Task.Delay(1500); //确保落盘 await Task.Delay(1500); //确保落盘
await handler2.TrackDeletedHandleAsync(signals);
await handler.TrackDeletedHandleAsync(signals); await handler.TrackDeletedHandleAsync(signals);
await handler2.TrackDeletedHandleAsync(signals);
await handler3.TrackUpdatedOrDeletedHandleAsync(signals.Cast<IWarningSignal>().ToList()); await handler3.TrackUpdatedOrDeletedHandleAsync(signals.Cast<IWarningSignal>().ToList());
} }
finally finally

View File

@ -183,30 +183,30 @@ public class TransportWarningHandler : ITransportWarningHandler, ITransientDepen
// 存在起始状态最早轨迹? // 存在起始状态最早轨迹?
// 最早轨迹如果早于预警明细中的起始轨迹时间,则修改预警明细 // 最早轨迹如果早于预警明细中的起始轨迹时间,则修改预警明细
// todo:时区信息如果未提供则比较时间无意义!!,出现一个有时区一个无时区(后续可能强约束时区必填)? // todo:时区信息如果未提供则比较时间无意义!!,出现一个有时区一个无时区(后续可能强约束时区必填)?
var updateDetails = details foreach (var detail in details)
.Where(d => earliestTrack.GetUtc0TrackTime() < d.GetUtc0StartTrackTime())
.ToList();
foreach (var detail in updateDetails)
{ {
//剩余轨迹中的最早发生时间早于轨迹明细中,修改明细信息 //保持预警明细中始终为起始状态的最早轨迹
detail.StartTrackContentId = earliestTrack.TrackContentId; detail.StartTrackContentId = earliestTrack.TrackContentId;
detail.StartTrackContent = earliestTrack.TrackContent; detail.StartTrackContent = earliestTrack.TrackContent;
detail.StartTrackTime = earliestTrack.TrackTime; detail.StartTrackTime = earliestTrack.TrackTime;
detail.StartTrackTimeZone = earliestTrack.TrackTimeZone; detail.StartTrackTimeZone = earliestTrack.TrackTimeZone;
} }
needUpdateDetails.AddRange(updateDetails); needUpdateDetails.AddRange(details);
} }
} }
// 批量处理 // 批量处理
await _warningTaskRepository.BulkUpdateTransportWarningDetailsGenerateTaskAsync(needUpdateGenerateTask); if (needUpdateGenerateTask.Count > 0)
await _warningDetailsEsRepository.BulkUpdateTransportWarningDetailsAsync(needUpdateDetails); await _warningTaskRepository.BulkUpdateTransportWarningDetailsGenerateTaskAsync(needUpdateGenerateTask);
await _warningTaskRepository.CloseWarningNotifyTaskAsync(x => if (needUpdateDetails.Count > 0)
!x.IsClosed await _warningDetailsEsRepository.BulkUpdateTransportWarningDetailsAsync(needUpdateDetails);
&& x.WarningType == WarningRuleType.运输时效预警.GetHashCode() if (needCloseNotifyWarningDetailsIds.Count > 0)
&& needCloseNotifyWarningDetailsIds.Contains(x.WarningDetailsId) await _warningTaskRepository.CloseWarningNotifyTaskAsync(x =>
); !x.IsClosed
&& x.WarningType == WarningRuleType.运输时效预警.GetHashCode()
&& needCloseNotifyWarningDetailsIds.Contains(x.WarningDetailsId)
);
} }
#endregion #endregion
@ -579,6 +579,7 @@ public class TransportWarningHandler : ITransportWarningHandler, ITransientDepen
} }
// 4.仍然命中场景的订单需要修改明细中的内容(预警名称,预警规则描述) // 4.仍然命中场景的订单需要修改明细中的内容(预警名称,预警规则描述)
var needUpdateDetails = new List<TransportWarningDetailsIndex>();
if (reHitSceneOrderIds.Count != 0) if (reHitSceneOrderIds.Count != 0)
{ {
// 明细->规则 // 明细->规则
@ -598,9 +599,14 @@ public class TransportWarningHandler : ITransportWarningHandler, ITransientDepen
var ruleItem = ruleItemDict[detail.WarningSceneRuleItemId]; var ruleItem = ruleItemDict[detail.WarningSceneRuleItemId];
detail.WarningName = rule.Name; detail.WarningName = rule.Name;
detail.WarningRuleDescription = detail.GetWarningRuleDescription(postScene.ToEntity(), ruleItem, ruleArea); detail.WarningRuleDescription = detail.GetWarningRuleDescription(postScene.ToEntity(), ruleItem, ruleArea);
needUpdateDetails.Add(detail);
} }
} }
// 更新预警明细
if (needUpdateDetails.Count > 0)
await _warningDetailsEsRepository.BulkUpdateTransportWarningDetailsAsync(needUpdateDetails);
if (noHitSceneOrderIds.Count == 0) if (noHitSceneOrderIds.Count == 0)
return; return;
@ -1235,8 +1241,6 @@ public class TransportWarningHandler : ITransportWarningHandler, ITransientDepen
CreateTime = DateTime.Now, CreateTime = DateTime.Now,
}; };
// 一开始创建预警就可能为已超时的状态
detail.Status = detail.CalcStatus();
return detail; return detail;
} }

View File

@ -171,6 +171,9 @@ public class TransportWarningService : ApplicationService
public async Task<UnifyPageResultDto<TransportWarningDetailsDto>> GetPageTransportWarningDetails(GetPageTransportWarningDetailsInput input) public async Task<UnifyPageResultDto<TransportWarningDetailsDto>> GetPageTransportWarningDetails(GetPageTransportWarningDetailsInput input)
{ {
var vo = ObjectMapper.Map<GetPageTransportWarningDetailsInput, GetPageTransportWarningDetailsInputVO>(input); var vo = ObjectMapper.Map<GetPageTransportWarningDetailsInput, GetPageTransportWarningDetailsInputVO>(input);
// 存储只存即将超时,对于已超时的则是查出计算后过滤
if (input.Status == (int) TransportWarningStatus.已超时)
vo.Status = (int) TransportWarningStatus.即将超时;
var result = await _warningDetailsEsRepository.GetPageTransportWarningDetailsAsync(vo); var result = await _warningDetailsEsRepository.GetPageTransportWarningDetailsAsync(vo);
if (result.List.Count == 0) if (result.List.Count == 0)
{ {
@ -220,20 +223,20 @@ public class TransportWarningService : ApplicationService
// 最新轨迹 (不冗余) // 最新轨迹 (不冗余)
LatestTrackContent = orderIdTrack?.TrackContent, LatestTrackContent = orderIdTrack?.TrackContent,
LatestTrackTime = orderIdTrack?.TrackTime, LatestTrackTime = orderIdTrack?.TrackTime,
LatestTrackTimeZone = orderIdTrack?.TrackTimeZone, LatestTrackTimeZone = FormatTimeZone(orderIdTrack?.TrackTimeZone),
LatestTrackPlace = orderIdTrack?.TrackContent, LatestTrackPlace = orderIdTrack?.TrackContent,
// 起始轨迹 // 起始轨迹
StartTrackStatus = x.StartTrackStatus, StartTrackStatus = x.StartTrackStatus,
StartTrackContent = x.StartTrackContent, StartTrackContent = x.StartTrackContent,
StartTrackTime = x.StartTrackTime, StartTrackTime = x.StartTrackTime,
StartTrackTimeZone = x.StartTrackTimeZone, StartTrackTimeZone = FormatTimeZone(x.StartTrackTimeZone),
// 截止轨迹 // 截止轨迹
EndTrackStatus = x.EndTrackStatus, EndTrackStatus = x.EndTrackStatus,
EndTrackContent = x.EndTrackContent, EndTrackContent = x.EndTrackContent,
EndTrackTime = x.EndTrackTime, EndTrackTime = x.EndTrackTime,
EndTrackTimeZone = x.EndTrackTimeZone, EndTrackTimeZone = FormatTimeZone(x.EndTrackTimeZone),
WarningName = x.WarningName, WarningName = x.WarningName,
WarningRuleDescription = x.WarningRuleDescription, WarningRuleDescription = x.WarningRuleDescription,
@ -247,19 +250,26 @@ public class TransportWarningService : ApplicationService
}; };
}); });
var sorted = map.OrderBy(x => // 计算后的状态过滤
{ var filtered = map.WhereIf(input.Status > 0, x => x.Status == input.Status);
// 即将超时,已超时置顶
if (x.Status is 1 or 2) return x.Status; // 按状态+时间排序
// 其他按创建时间从早到晚 var sorted = filtered
return DateTimeHelper.ConvertToUnixTimestamp(x.CreateTime); .OrderBy(x =>
}); {
// 即将超时,已超时置顶
if (x.Status is 1 or 2) return x.Status;
// 其他按创建时间从早到晚
return DateTimeHelper.ConvertToUnixTimestamp(x.CreateTime);
})
.ThenByDescending(x => x.CreateTime) //同状态(即将超时/已超时)按创建时间从晚到早
.ToList();
return new UnifyPageResultDto<TransportWarningDetailsDto>( return new UnifyPageResultDto<TransportWarningDetailsDto>(
sorted.ToList(), sorted,
result.Pagination.PageIndex, result.Pagination.PageIndex,
result.Pagination.PageSize, result.Pagination.PageSize,
result.Pagination.Total); sorted.Count);
// 通知用户提取用户名称 // 通知用户提取用户名称
string ToUserNames(string notifyUsers) string ToUserNames(string notifyUsers)
@ -279,6 +289,22 @@ public class TransportWarningService : ApplicationService
return $"{timeSpan.Days:00}天{timeSpan.Hours:00}小时{timeSpan.Minutes:00}分钟"; return $"{timeSpan.Days:00}天{timeSpan.Hours:00}小时{timeSpan.Minutes:00}分钟";
} }
// 格式化时区
string FormatTimeZone(float? timezone)
{
if (timezone == null) return "--";
if (Math.Abs(timezone.Value - GlobalConst.NoneTrackTimeZone) < 1) return "--";
// 将小数形式的小时转换为时区偏移量
var hours = (int) timezone.Value; // 提取整数部分作为小时
var minutes = (int) ((timezone.Value - hours) * 60); // 将小数部分乘以 60 转换为分钟
var offset = new TimeSpan(hours, minutes, 0);
var timeZoneStr = offset.ToString();
var flag = timezone > 0f ? "+" : "";
return $"GMT {flag}{timeZoneStr.RemovePostFix(":00")}";
}
} }
/// <summary> /// <summary>

View File

@ -133,7 +133,7 @@ public sealed class TransportWarningDetailsIndex : IdBaseIndex
// 规则配置信息 // 规则配置信息
res.Append($",生成预警时间{ruleItem.StartTrackWarningTimeSpan}小时" + res.Append($",生成预警时间{ruleItem.StartTrackWarningTimeSpan}小时" +
$",提醒时效{ruleItem.TransportTimeSpan}}}"); $",时效{ruleItem.TransportTimeSpan}}}小时");
return res.ToString(); return res.ToString();
} }

View File

@ -144,6 +144,7 @@ public class WarningDetailsEsRepository : IWarningDetailsEsRepository, ITransien
detail.StartTrackTimeZone, detail.StartTrackTimeZone,
detail.EndTrackStatusId, detail.EndTrackStatusId,
detail.EndTrackContentId, detail.EndTrackContentId,
detail.EndTrackContent,
detail.EndTrackTime, detail.EndTrackTime,
detail.EndTrackTimeZone, detail.EndTrackTimeZone,
// detail.LatestTrackContentId, // detail.LatestTrackContentId,
@ -193,6 +194,7 @@ public class WarningDetailsEsRepository : IWarningDetailsEsRepository, ITransien
ctx._source.startTrackTimeZone = params.StartTrackTimeZone; ctx._source.startTrackTimeZone = params.StartTrackTimeZone;
ctx._source.endTrackStatusId = params.EndTrackStatusId; ctx._source.endTrackStatusId = params.EndTrackStatusId;
ctx._source.endTrackContentId = params.EndTrackContentId; ctx._source.endTrackContentId = params.EndTrackContentId;
ctx._source.endTrackContent = params.EndTrackContent;
ctx._source.endTrackTime = params.EndTrackTime; ctx._source.endTrackTime = params.EndTrackTime;
ctx._source.endTrackTimeZone = params.EndTrackTimeZone; ctx._source.endTrackTimeZone = params.EndTrackTimeZone;
//ctx._source.latestTrackContentId = params.LatestTrackContentId; //ctx._source.latestTrackContentId = params.LatestTrackContentId;
@ -225,6 +227,7 @@ public class WarningDetailsEsRepository : IWarningDetailsEsRepository, ITransien
.Add("StartTrackTimeZone", detail.StartTrackTimeZone) .Add("StartTrackTimeZone", detail.StartTrackTimeZone)
.Add("EndTrackStatusId", detail.EndTrackStatusId) .Add("EndTrackStatusId", detail.EndTrackStatusId)
.Add("EndTrackContentId", detail.EndTrackContentId) .Add("EndTrackContentId", detail.EndTrackContentId)
.Add("EndTrackContent", detail.EndTrackContent)
.Add("EndTrackTime", detail.EndTrackTime) .Add("EndTrackTime", detail.EndTrackTime)
.Add("EndTrackTimeZone", detail.EndTrackTimeZone) .Add("EndTrackTimeZone", detail.EndTrackTimeZone)
// .Add("LatestTrackContentId", detail.LatestTrackContentId) // .Add("LatestTrackContentId", detail.LatestTrackContentId)