From 7f938c5a7d9ac7643502c593aa9a8bb558747563 Mon Sep 17 00:00:00 2001
From: hardstylewyl <827778732@qq.com>
Date: Thu, 20 Mar 2025 14:32:33 +0800
Subject: [PATCH] =?UTF-8?q?perf:=E5=AF=B9=E4=BA=8E=E7=A9=BA=E5=80=BC?=
=?UTF-8?q?=E4=BD=BF=E7=94=A8=20--=20=E5=A1=AB=E5=85=85=E5=A4=84=E7=90=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
fix:运输时效预警
- 修复累计运输时间计算错误
- 修复运输预警明细的已超时状态被忽略
---
.../Dtos/Warning/GetWarningRuleInput.cs | 2 +-
.../Warning/CompleteWarningService.cs | 13 ++++---
.../Handlers/TransportWarningHandler.cs | 35 +++++++++++++++----
.../Services/Warning/ReturnWarningService.cs | 8 ++---
.../Warning/TransportWarningService.cs | 23 +++++++-----
.../Services/Warning/WarningService.cs | 6 ++--
.../Transport/TransportWarningDetailsIndex.cs | 10 ++++--
.../Repositories/WarningRuleRepository.cs | 4 +--
8 files changed, 66 insertions(+), 35 deletions(-)
diff --git a/src/SJZY.Track.Application.Contract/Dtos/Warning/GetWarningRuleInput.cs b/src/SJZY.Track.Application.Contract/Dtos/Warning/GetWarningRuleInput.cs
index df031b41..8fe2a151 100644
--- a/src/SJZY.Track.Application.Contract/Dtos/Warning/GetWarningRuleInput.cs
+++ b/src/SJZY.Track.Application.Contract/Dtos/Warning/GetWarningRuleInput.cs
@@ -13,7 +13,7 @@ public class GetWarningRuleInput
///
/// 关键字(kpi/客户名称 模糊)
///
- public string? KeyWord { get; set; }
+ public string? Keywords { get; set; }
///
/// 是否启用(留null查全部)
diff --git a/src/SJZY.Track.Application/Services/Warning/CompleteWarningService.cs b/src/SJZY.Track.Application/Services/Warning/CompleteWarningService.cs
index 28a40f1e..6bdd0fad 100644
--- a/src/SJZY.Track.Application/Services/Warning/CompleteWarningService.cs
+++ b/src/SJZY.Track.Application/Services/Warning/CompleteWarningService.cs
@@ -33,7 +33,6 @@ public class CompleteWarningService : ApplicationService
private readonly ICompleteWarningHandler _completeWarningHandler;
private readonly ITrackStatusRepository _trackStatusRepository;
-
public CompleteWarningService(IWarningRuleRepository warningRuleRepository, IWarningDetailsEsRepository warningDetailsEsRepository, ITrackDetailsEsRepository trackDetailsEsRepository, ICompleteWarningHandler completeWarningHandler, ITrackStatusRepository trackStatusRepository, IOrderRepository orderRepository, IVSystemQueries vSystemQueries, IVExternalSubjectQueries vExternalSubjectQueries)
{
_warningRuleRepository = warningRuleRepository;
@@ -87,7 +86,7 @@ public class CompleteWarningService : ApplicationService
WarningId = x.WarningId,
OrderTypes = BuildOrderTypes(x),
CheckPointTrackStatusId = x.CheckPointTrackStatusId,
- CheckPointTrackStatus = trackStatusDict.GetValueOrDefault(x.CheckPointTrackStatusId),
+ CheckPointTrackStatus = trackStatusDict.GetValueOrDefault(x.CheckPointTrackStatusId, GlobalConst.EmptyString),
RequireTrackStatus = BuildRequireTrackStatus(x),
NotifyUsers = TextJsonHelper.Deserialize>(x.NotifyUsers)!
});
@@ -102,7 +101,7 @@ public class CompleteWarningService : ApplicationService
Statuses = g.Select(id => new TrackStatusDto
{
TrackStatusId = id,
- TrackStatus = trackStatusDict.GetValueOrDefault(id)
+ TrackStatus = trackStatusDict.GetValueOrDefault(id, GlobalConst.EmptyString)
}).ToList()
}).ToList();
}
@@ -113,7 +112,7 @@ public class CompleteWarningService : ApplicationService
.Select(x => new OrderTypeDto
{
OrderType = x,
- OrderTypeName = orderTypeDict.GetValueOrDefault(x.ToString())
+ OrderTypeName = orderTypeDict.GetValueOrDefault(x.ToString(), GlobalConst.EmptyString)
}).ToList();
}
}
@@ -173,14 +172,14 @@ public class CompleteWarningService : ApplicationService
{
EsId = x.Id,
SubSystemId = x.SubSystemId,
- SubSystemName = subSystemDict.GetValueOrDefault(x.SubSystemId),
+ SubSystemName = subSystemDict.GetValueOrDefault(x.SubSystemId, GlobalConst.EmptyString),
OrderType = x.OrderType,
- OrderTypeName = orderTypeDict.GetValueOrDefault(x.OrderType.ToString()),
+ OrderTypeName = orderTypeDict.GetValueOrDefault(x.OrderType.ToString(), GlobalConst.EmptyString),
OrderId = x.OrderId,
OrderNo = x.OrderNo,
Status = x.Status,
CustomId = x.CustomId,
- CustomName = customDict.GetValueOrDefault(x.CustomId),
+ CustomName = customDict.GetValueOrDefault(x.CustomId, GlobalConst.EmptyString),
MissingTrackStatus = BuildMissingTrackStatus(x.MissingTrackStatusIds),
LatestTrackStatus = orderIdTrack?.TrackStatus,
LatestTrackContent = orderIdTrack?.TrackContent,
diff --git a/src/SJZY.Track.Application/Services/Warning/Handlers/TransportWarningHandler.cs b/src/SJZY.Track.Application/Services/Warning/Handlers/TransportWarningHandler.cs
index 5daf8e35..fb12aea4 100644
--- a/src/SJZY.Track.Application/Services/Warning/Handlers/TransportWarningHandler.cs
+++ b/src/SJZY.Track.Application/Services/Warning/Handlers/TransportWarningHandler.cs
@@ -112,7 +112,7 @@ public class TransportWarningHandler : ITransportWarningHandler, ITransientDepen
orderDetails.ForEach(x =>
{
x.Status = TransportWarningStatus.已关闭.GetHashCode();
- x.CumulativeTimeSpan = DateTime.Now.Subtract(x.StartTrackTime).Milliseconds; //tips:完成态缓存累计运输时间
+ x.CumulativeTimeSpan = (long)DateTime.Now.Subtract(x.StartTrackTime).TotalMilliseconds; //tips:完成态缓存累计运输时间
});
orderTasks.ForEach(x => x.IsClosed = true);
needUpdateDetails.AddRange(orderDetails);
@@ -174,7 +174,7 @@ public class TransportWarningHandler : ITransportWarningHandler, ITransientDepen
details.ForEach(x =>
{
x.Status = TransportWarningStatus.已关闭.GetHashCode();
- x.CumulativeTimeSpan = DateTime.Now.Subtract(x.StartTrackTime).Milliseconds; //tips:完成态缓存累计运输时间
+ x.CumulativeTimeSpan = (long)DateTime.Now.Subtract(x.StartTrackTime).TotalMilliseconds; //tips:完成态缓存累计运输时间
});
needUpdateDetails.AddRange(details);
continue;
@@ -378,11 +378,11 @@ public class TransportWarningHandler : ITransportWarningHandler, ITransientDepen
// 修改为完成态
if (detail.Status == TransportWarningStatus.即将超时.GetHashCode())
detail.Status = TransportWarningStatus.已完成.GetHashCode();
- if (detail.Status == TransportWarningStatus.已超时.GetHashCode())
+ if (detail.CalcStatus() == TransportWarningStatus.已超时.GetHashCode())
detail.Status = TransportWarningStatus.超时完成.GetHashCode();
// 维护累计运输时间(由于变更为终止态,此时为最后一次变更)
- detail.CumulativeTimeSpan = DateTime.Now.Subtract(detail.StartTrackTime).Milliseconds;
+ detail.CumulativeTimeSpan = (long)DateTime.Now.Subtract(detail.StartTrackTime).TotalMilliseconds;
// 填充终止状态轨迹信息
detail.EndTrackContentId = earliestTrack.TrackContentId;
@@ -1070,11 +1070,11 @@ public class TransportWarningHandler : ITransportWarningHandler, ITransientDepen
if (waningRules.Count == 0) return; //不存在启用的规则主体,直接全部关闭
// 构建规则主体id和版本号字典,稍后用于填充明细的版本号
- var ruleVersionDict = waningRules.ToDictionary(x => x.Id, x => x.Version);
+ var ruleDict = waningRules.ToDictionary(x => x.Id);
// 选出任务中规则条目id,要求订单存在,主体存在并启用
var ruleItemIds = tasks
- .Where(x => orderDict.ContainsKey(x.OrderId) && ruleVersionDict.ContainsKey(x.WarningId))
+ .Where(x => orderDict.ContainsKey(x.OrderId) && ruleDict.ContainsKey(x.WarningId))
.Select(x => x.WarningSceneRuleItemId)
.ToHashSet();
if (ruleItemIds.Count == 0) return;
@@ -1145,13 +1145,34 @@ public class TransportWarningHandler : ITransportWarningHandler, ITransientDepen
var endTrackStatusIds = addDetails.Select(x => x.EndTrackStatusId).ToHashSet();
var trackStatusIdNameDict = await _trackStatusRepository.GetTrackStatusIdNameDictAsync(endTrackStatusIds);
+ // 获取场景字典
+ var sceneIds = addDetails.Select(x => x.WarningSceneId).ToHashSet();
+ var scenes = await _warningRuleRepository.GetTransportSceneAsync(x =>
+ sceneIds.Contains(x.Id)
+ );
+ var sceneDict = scenes.ToDictionary(x => x.Id);
+
+ // 获取区域字典
+ Dictionary areaDict = null;
+ var areaIds = scenes.Where(x => x.AreaId.HasValue).Select(x => x.AreaId.Value!).ToHashSet();
+ if (areaIds.Count > 0)
+ {
+ var areas = await _kpiAreaRepository.GetListAsync(x => areaIds.Contains(x.Id));
+ areaDict = areas.ToDictionary(x => x.Id);
+ }
+
// 6.生成预警明细,手动赋予EsId,规则版本号,截止轨迹状态名称
addDetails.ForEach(x =>
{
x.Id = Guid.NewGuid().ToString("N");
- x.Version = ruleVersionDict[x.WarningId]; //一定存在
x.EndTrackStatus = trackStatusIdNameDict.GetValueOrDefault(x.EndTrackStatusId)
?? $"不存在id:[{x.EndTrackStatusId}]轨迹状态";
+
+ var rule = ruleDict[x.WarningId]; //一定存在
+ var scene = sceneDict[x.WarningSceneId]; //一定存在
+ x.Version = rule.Version;
+ x.WarningName = rule.Name;
+ x.WarningRuleDescription = x.GetWarningRuleDescription(scene, ruleItemDict[x.WarningSceneRuleItemId], areaDict?.GetValueOrDefault(scene.AreaId ?? 0));
});
await _warningDetailsEsRepository.BulkInsertTransportWarningDetailsAsync(addDetails);
diff --git a/src/SJZY.Track.Application/Services/Warning/ReturnWarningService.cs b/src/SJZY.Track.Application/Services/Warning/ReturnWarningService.cs
index af94e11f..484a8bb3 100644
--- a/src/SJZY.Track.Application/Services/Warning/ReturnWarningService.cs
+++ b/src/SJZY.Track.Application/Services/Warning/ReturnWarningService.cs
@@ -82,7 +82,7 @@ public class ReturnWarningService : ApplicationService
var id = int.Parse(x);
return new TrackStatusDto
{
- TrackStatus = trackStatusDict.GetValueOrDefault(id),
+ TrackStatus = trackStatusDict.GetValueOrDefault(id, GlobalConst.EmptyString),
TrackStatusId = id
};
}).ToList();
@@ -124,14 +124,14 @@ public class ReturnWarningService : ApplicationService
{
EsId = x.Id,
SubSystemId = x.SubSystemId,
- SubSystemName = subSystemDict.GetValueOrDefault(x.SubSystemId),
+ SubSystemName = subSystemDict.GetValueOrDefault(x.SubSystemId, GlobalConst.EmptyString),
OrderType = x.OrderType,
- OrderTypeName = orderTypeDict.GetValueOrDefault(x.OrderType.ToString()),
+ OrderTypeName = orderTypeDict.GetValueOrDefault(x.OrderType.ToString(), GlobalConst.EmptyString),
OrderId = x.OrderId,
OrderNo = x.OrderNo,
Status = x.Status,
CustomId = x.CustomId,
- CustomName = customDict.GetValueOrDefault(x.CustomId),
+ CustomName = customDict.GetValueOrDefault(x.CustomId, GlobalConst.EmptyString),
// 轨迹信息
TrackStatus = x.TrackStatus,
TrackCode = x.TrackCode,
diff --git a/src/SJZY.Track.Application/Services/Warning/TransportWarningService.cs b/src/SJZY.Track.Application/Services/Warning/TransportWarningService.cs
index ccb06380..cd0bbc28 100644
--- a/src/SJZY.Track.Application/Services/Warning/TransportWarningService.cs
+++ b/src/SJZY.Track.Application/Services/Warning/TransportWarningService.cs
@@ -151,9 +151,9 @@ public class TransportWarningService : ApplicationService
{
Id = x.Id,
StartTrackStatusId = x.StartTrackStatusId,
- StartTrackStatus = trackStatusDict.GetValueOrDefault(x.StartTrackStatusId),
+ StartTrackStatus = trackStatusDict.GetValueOrDefault(x.StartTrackStatusId, GlobalConst.EmptyString),
EndTrackStatusId = x.EndTrackStatusId,
- EndTrackStatus = trackStatusDict.GetValueOrDefault(x.EndTrackStatusId),
+ EndTrackStatus = trackStatusDict.GetValueOrDefault(x.EndTrackStatusId, GlobalConst.EmptyString),
TransportTimeSpan = x.TransportTimeSpan,
StartTrackWarningTimeSpan = x.StartTrackWarningTimeSpan,
NotifyUsers = x.NotifyUsers.ToObject>()
@@ -208,13 +208,13 @@ public class TransportWarningService : ApplicationService
{
EsId = x.Id,
SubSystemId = x.SubSystemId,
- SubSystemName = subSystemDict.GetValueOrDefault(x.SubSystemId),
+ SubSystemName = subSystemDict.GetValueOrDefault(x.SubSystemId, GlobalConst.EmptyString),
CustomId = x.CustomId,
- CustomName = customDict.GetValueOrDefault(x.CustomId),
+ CustomName = customDict.GetValueOrDefault(x.CustomId, GlobalConst.EmptyString),
OrderId = x.OrderId,
OrderNo = x.OrderNo,
OrderType = x.OrderType,
- OrderTypeName = orderTypeDict.GetValueOrDefault(x.OrderType.ToString()),
+ OrderTypeName = orderTypeDict.GetValueOrDefault(x.OrderType.ToString(), GlobalConst.EmptyString),
NotifyUserNames = ToUserNames(x.NotifyUsers),
// 最新轨迹 (不冗余)
@@ -239,9 +239,10 @@ public class TransportWarningService : ApplicationService
WarningRuleDescription = x.WarningRuleDescription,
// 累计运输时间
- CumulativeTimeSpan = FormatCumulativeTimeSpan(x.CumulativeTimeSpan),
+ CumulativeTimeSpan = FormatCumulativeTimeSpan(x),
- Status = x.Status,
+ // 状态动态计算
+ Status = x.CalcStatus(),
CreateTime = x.CreateTime
};
});
@@ -269,9 +270,12 @@ public class TransportWarningService : ApplicationService
}
// 格式化累计运输时间为文本形式
- string FormatCumulativeTimeSpan(long cumulativeTimeSpan)
+ string FormatCumulativeTimeSpan(TransportWarningDetailsIndex detail)
{
- var timeSpan = TimeSpan.FromMilliseconds(cumulativeTimeSpan);
+ // 如果是完成态则直接取缓存的累计运输时间
+ var timeSpan = detail.CanCompleted()
+ ? TimeSpan.FromMilliseconds(detail.CumulativeTimeSpan)
+ : DateTime.Now.Subtract(detail.StartTrackTime);
return $"{timeSpan.Days:00}天{timeSpan.Hours:00}小时{timeSpan.Minutes:00}分钟";
}
@@ -302,6 +306,7 @@ public class TransportWarningService : ApplicationService
var sorted = postBo.Months.Split('/').Select(int.Parse).OrderBy(x => x).ToList();
postBo.Months = string.Join('/', sorted);
}
+
// 更新或者新增
var id = await _warningRuleRepository.UpsertTransportSceneReturnIdAsync(postBo.ToEntity());
diff --git a/src/SJZY.Track.Application/Services/Warning/WarningService.cs b/src/SJZY.Track.Application/Services/Warning/WarningService.cs
index 93155891..f0cd9803 100644
--- a/src/SJZY.Track.Application/Services/Warning/WarningService.cs
+++ b/src/SJZY.Track.Application/Services/Warning/WarningService.cs
@@ -38,7 +38,7 @@ public class WarningService : ApplicationService
[HttpPost("GetWarningRule")]
public async Task>> GetWarningRule(GetWarningRuleInput input)
{
- var result = await _warningRuleRepository.GetWarningRuleListAsync(input.SubSystemId, input.KeyWord, input.IsEnabled, input.WarningType);
+ var result = await _warningRuleRepository.GetWarningRuleListAsync(input.SubSystemId, input.Keywords, input.IsEnabled, input.WarningType);
if (result.Count == 0)
return new UnifyResultDto>(true, new List());
@@ -63,9 +63,9 @@ public class WarningService : ApplicationService
{
Id = x.Id,
SubSystemId = x.SubSystemId,
- SubSystemName = subSystemDict.GetValueOrDefault(x.SubSystemId),
+ SubSystemName = subSystemDict.GetValueOrDefault(x.SubSystemId, GlobalConst.EmptyString),
CustomId = x.CustomId,
- CustomName = customDict.GetValueOrDefault(x.CustomId),
+ CustomName = customDict.GetValueOrDefault(x.CustomId, GlobalConst.EmptyString),
Name = x.Name,
IsEnabled = x.IsEnabled,
WarningType = x.WarningType,
diff --git a/src/SJZY.Track.Domain/Aggregates/WarningAggregate/Transport/TransportWarningDetailsIndex.cs b/src/SJZY.Track.Domain/Aggregates/WarningAggregate/Transport/TransportWarningDetailsIndex.cs
index a16ca74e..e4e16481 100644
--- a/src/SJZY.Track.Domain/Aggregates/WarningAggregate/Transport/TransportWarningDetailsIndex.cs
+++ b/src/SJZY.Track.Domain/Aggregates/WarningAggregate/Transport/TransportWarningDetailsIndex.cs
@@ -21,14 +21,18 @@ public sealed class TransportWarningDetailsIndex : IdBaseIndex
public string WarningRuleDescription { get; set; } // 预警规则描述 (场景+场景规则项目构建)
public float TransportTimeSpan { get; set; } //时效 (单位小时),用于计算状态
+
public float StartTrackWarningTimeSpan { get; set; } //起始轨迹生成预警时间 (单位小时),用于计算状态
+
//public string NotifyModes { get; set; } //通知方式,多个方式(,)分割 eg: 1,2
public string NotifyUsers { get; set; } //通知人Json eg: [{"UserId":1,"UserName":"张三"},{"UserId":2,"UserName":"李四"}]
//订单信息
public int SubSystemId { get; set; } //(冗余)子系统Id
+
// public string SubSystemName { get; set; } //(冗余)子系统名称
public int CustomId { get; set; } //(冗余)客户Id
+
// public string CustomName { get; set; } //冗余 客户简称(用于查询条件)
public int OrderId { get; set; }
public string OrderNo { get; set; } //订单号
@@ -68,7 +72,9 @@ public sealed class TransportWarningDetailsIndex : IdBaseIndex
private static readonly ImmutableHashSet CompletedStatus = ImmutableHashSet.Create(3, 4, 5);
- // todo:计算并设置状态,后续维护到vo当中
+ public bool CanCompleted() => CompletedStatus.Contains(Status);
+
+ // tips:计算并设置状态,后续维护到vo当中
public int CalcStatus()
{
// 结束态无需计算,直接返回
@@ -106,7 +112,7 @@ public sealed class TransportWarningDetailsIndex : IdBaseIndex
res.Append($",{scene.CargoType}");
// 月份 (1/3/5/...)
if (!string.IsNullOrWhiteSpace(scene.Months))
- res.Append($",{scene.Months}");
+ res.Append($",{scene.Months}月份");
// 区域名称 (美国xxx区域)
if (ruleArea != null)
res.Append($",{ruleArea.Name}");
diff --git a/src/SJZY.Track.Repository/Repositories/WarningRuleRepository.cs b/src/SJZY.Track.Repository/Repositories/WarningRuleRepository.cs
index 4b2f5e9d..bf4120ba 100644
--- a/src/SJZY.Track.Repository/Repositories/WarningRuleRepository.cs
+++ b/src/SJZY.Track.Repository/Repositories/WarningRuleRepository.cs
@@ -75,12 +75,12 @@ public class WarningRuleRepository : BasicRepository, IWarnin
return version;
}
- public Task> GetWarningRuleListAsync(int? subsystemId, string? keyword, bool? isEnabled, int? warningType)
+ public Task> GetWarningRuleListAsync(int? subsystemId, string? keywords, bool? isEnabled, int? warningType)
{
return Context.Queryable()
.WhereIF(subsystemId.HasValue, x => x.SubSystemId == subsystemId!.Value)
// todo: 客户/kpi名称 改成客户下拉
- .WhereIF(!string.IsNullOrWhiteSpace(keyword), x => x.Name.Contains(keyword!))
+ .WhereIF(!string.IsNullOrWhiteSpace(keywords), x => x.Name.Contains(keywords!))
.WhereIF(isEnabled.HasValue, x => x.IsEnabled == isEnabled!.Value)
.WhereIF(warningType.HasValue, x => x.WarningType == warningType!.Value)
.ToListAsync();