diff --git a/src/SJZY.Track.Application.Contract/Dtos/Warning/Return/EditReturnWarningRuleItemInput.cs b/src/SJZY.Track.Application.Contract/Dtos/Warning/Return/EditReturnWarningRuleItemInput.cs
index e8ee6562..589e0d1b 100644
--- a/src/SJZY.Track.Application.Contract/Dtos/Warning/Return/EditReturnWarningRuleItemInput.cs
+++ b/src/SJZY.Track.Application.Contract/Dtos/Warning/Return/EditReturnWarningRuleItemInput.cs
@@ -39,7 +39,7 @@ public class EditReturnWarningRuleItemDto
///
/// 时效(单位h)
///
- [Range(0.1, 99, ErrorMessage = "回传时效范围0.1-99")]
+ [Range(0.1f, 99.9f, ErrorMessage = "回传时效范围0.1-99.9")]
public float ReturnTimeSpan { get; set; }
///
diff --git a/src/SJZY.Track.Application.Contract/Dtos/Warning/Return/ReturnWarningDetailsDto.cs b/src/SJZY.Track.Application.Contract/Dtos/Warning/Return/ReturnWarningDetailsDto.cs
index efd2b9be..b3030197 100644
--- a/src/SJZY.Track.Application.Contract/Dtos/Warning/Return/ReturnWarningDetailsDto.cs
+++ b/src/SJZY.Track.Application.Contract/Dtos/Warning/Return/ReturnWarningDetailsDto.cs
@@ -133,6 +133,12 @@ public sealed class ReturnWarningDetailsDto
///
public string TrackCreateTimeSpan { get; set; }
+ ///
+ /// 是否超时,只有命中了kpi考核的才有可能超时
+ /// 如果为超时则标红【实际回传】字段
+ ///
+ public bool IsTimeout { get; set; }
+
///
/// 是否有KPI考核
///
diff --git a/src/SJZY.Track.Application.Contract/Dtos/Warning/Transport/EditTransportWarningSceneRuleItemInput.cs b/src/SJZY.Track.Application.Contract/Dtos/Warning/Transport/EditTransportWarningSceneRuleItemInput.cs
index fedef9e6..443c5054 100644
--- a/src/SJZY.Track.Application.Contract/Dtos/Warning/Transport/EditTransportWarningSceneRuleItemInput.cs
+++ b/src/SJZY.Track.Application.Contract/Dtos/Warning/Transport/EditTransportWarningSceneRuleItemInput.cs
@@ -5,22 +5,22 @@ namespace SJZY.Track.Application.Contract.Dtos.Warning.Transport;
public class EditTransportWarningSceneRuleItemInput
{
- ///
- /// 预警规主体id
- ///
- [IdRequired]
- public int WarningId { get; set; }
+ ///
+ /// 预警规主体id
+ ///
+ [IdRequired]
+ public int WarningId { get; set; }
- ///
- /// 运输预警场景id
- ///
- [IdRequired]
- public int SceneId { get; set; }
+ ///
+ /// 运输预警场景id
+ ///
+ [IdRequired]
+ public int SceneId { get; set; }
- ///
- /// 预警规则配置项目(列表内容传递)
- ///
- public List Items { get; set; } = new();
+ ///
+ /// 预警规则配置项目(列表内容传递)
+ ///
+ public List Items { get; set; } = new();
}
///
@@ -28,38 +28,39 @@ public class EditTransportWarningSceneRuleItemInput
///
public class EditTransportWarningSceneRuleItemDto
{
- ///
- /// 规则项目id(传0视为新增)
- ///
- public int Id { get; set; }
+ ///
+ /// 规则项目id(传0视为新增)
+ ///
+ public int Id { get; set; }
- ///
- /// 起始轨迹状态Id
- ///
- [IdRequired]
- public int StartTrackStatusId { get; set; }
+ ///
+ /// 起始轨迹状态Id
+ ///
+ [IdRequired]
+ public int StartTrackStatusId { get; set; }
- ///
- /// 截止轨迹状态Id
- ///
- [IdRequired]
- public int EndTrackStatusId { get; set; }
+ ///
+ /// 截止轨迹状态Id
+ ///
+ [IdRequired]
+ public int EndTrackStatusId { get; set; }
- ///
- /// 时效 (单位h)
- ///
- [Range(0.1, float.MaxValue, ErrorMessage = "时效必须大于0.1")]
- public float TransportTimeSpan { get; set; }
+ ///
+ /// 时效 (单位h)
+ /// 注意:需要大于起始轨迹生成预警时间
+ ///
+ [Range(0.1f, 9999.9f, ErrorMessage = "时效必须范围0.1-9999.9")]
+ public float TransportTimeSpan { get; set; }
- ///
- /// 起始轨迹生成预警时间 (单位h)
- ///
- [Range(0.1, float.MaxValue, ErrorMessage = "起始轨迹生成预警时间必须大于0.1")]
- public float StartTrackWarningTimeSpan { get; set; }
+ ///
+ /// 起始轨迹生成预警时间 (单位h)
+ ///
+ [Range(0.1f, 9999.9f, ErrorMessage = "起始轨迹生成预警时间范围0.1-9999.9")]
+ public float StartTrackWarningTimeSpan { get; set; }
- ///
- /// 通知对象用户集合
- ///
- [MinLength(1, ErrorMessage = "通知对象用户集合不能为空")]
- public List NotifyUsers { get; set; } = new();
+ ///
+ /// 通知对象用户集合
+ ///
+ [MinLength(1, ErrorMessage = "通知对象用户集合不能为空")]
+ public List NotifyUsers { get; set; } = new();
}
diff --git a/src/SJZY.Track.Application/Services/Warning/ReturnWarningService.cs b/src/SJZY.Track.Application/Services/Warning/ReturnWarningService.cs
index 2154092c..00be37c8 100644
--- a/src/SJZY.Track.Application/Services/Warning/ReturnWarningService.cs
+++ b/src/SJZY.Track.Application/Services/Warning/ReturnWarningService.cs
@@ -156,6 +156,7 @@ public class ReturnWarningService : ApplicationService
ActualReturnTimeSpan = FormatTimeSpan(x.ActualReturnTimeSpan),
SystemReturnTimeSpan = FormatTimeSpan(x.SystemReturnTimeSpan),
TrackCreateTimeSpan = FormatTimeSpan(x.TrackCreateTimeSpan),
+ IsTimeout = x.HasTimeout(),
// 具体描述
TrackReturnTime = x.TrackReturnTime,
diff --git a/src/SJZY.Track.Application/Services/Warning/TransportWarningService.cs b/src/SJZY.Track.Application/Services/Warning/TransportWarningService.cs
index fc7293a4..baa69df7 100644
--- a/src/SJZY.Track.Application/Services/Warning/TransportWarningService.cs
+++ b/src/SJZY.Track.Application/Services/Warning/TransportWarningService.cs
@@ -378,6 +378,12 @@ public class TransportWarningService : ApplicationService
[HttpPost("EditTransportWarningSceneRuleItem")]
public async Task EditTransportWarningSceneRuleItem(EditTransportWarningSceneRuleItemInput input)
{
+ // 起始轨迹生成预警时间不能大于时效
+ if (input.Items.Count > 0 && input.Items.Any(x => x.StartTrackWarningTimeSpan >= x.TransportTimeSpan))
+ {
+ throw new BusinessException(message: "起始轨迹生成预警时间不能大于等于时效,请检查");
+ }
+
var rule = await _warningRuleRepository.GetWarningRuleByIdAsync(input.WarningId, WarningRuleType.运输时效预警);
if (rule == null)
{
diff --git a/src/SJZY.Track.Domain/Aggregates/WarningAggregate/Return/ReturnWarningDetailsIndex.cs b/src/SJZY.Track.Domain/Aggregates/WarningAggregate/Return/ReturnWarningDetailsIndex.cs
index 5acf8617..5b23f892 100644
--- a/src/SJZY.Track.Domain/Aggregates/WarningAggregate/Return/ReturnWarningDetailsIndex.cs
+++ b/src/SJZY.Track.Domain/Aggregates/WarningAggregate/Return/ReturnWarningDetailsIndex.cs
@@ -62,7 +62,6 @@ public class ReturnWarningDetailsIndex : IdBaseIndex
//计算属性
public long? ActualReturnTimeSpan { get; set; } //实际回传用时(单位毫秒)
-
public long? SystemReturnTimeSpan { get; set; } //系统回传用时 (单位毫秒)
public long TrackCreateTimeSpan { get; set; } //轨迹创建用时(单位毫秒)
@@ -81,6 +80,13 @@ public class ReturnWarningDetailsIndex : IdBaseIndex
SystemReturnTimeSpan = (long?) (TrackReturnTime.Value - TrackCreateTime).TotalMilliseconds;
}
+ public bool HasTimeout()
+ {
+ if (ActualReturnTimeSpan.HasValue && ReturnTimeSpan.HasValue)
+ return TimeSpan.FromMilliseconds(ActualReturnTimeSpan.Value) > TimeSpan.FromHours(ReturnTimeSpan.Value);
+ return false;
+ }
+
// 匹配硅胶字段
public bool MatchExtra(string? compareFields, string? extra)
{