diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs
index b441c371..9e403db8 100644
--- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs
+++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs
@@ -77,6 +77,7 @@ public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICa
await _orderRepository.UpdateRangeAsync(updateOrders, x => new
{
x.IsCompleted,
+ x.LatestTrackStatus,
x.LatestTrackContent,
x.LatestTrackEnContent,
x.LatestTrackPlace,
@@ -98,9 +99,9 @@ public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICa
return await _orderRepository.GetListAsync(order => orderIds.Contains(order.Id), order => new OrderEntity
{
Id = order.Id,
-
// 轨迹
IsCompleted = order.IsCompleted,
+ LatestTrackStatus = order.LatestTrackStatus,
LatestTrackContent = order.LatestTrackContent,
LatestTrackEnContent = order.LatestTrackEnContent,
LatestTrackPlace = order.LatestTrackPlace,
diff --git a/src/SJZY.Track.Application/Services/Warning/Model/TransportWarningSceneBO.cs b/src/SJZY.Track.Application/Services/Warning/Model/TransportWarningSceneBO.cs
index 1532b640..cf7f2263 100644
--- a/src/SJZY.Track.Application/Services/Warning/Model/TransportWarningSceneBO.cs
+++ b/src/SJZY.Track.Application/Services/Warning/Model/TransportWarningSceneBO.cs
@@ -10,42 +10,61 @@ public sealed class TransportWarningSceneBO
///
/// 场景唯一id (传0视为新增)
///
- public int Id { get; set; }
+ public int Id { get; }
///
/// 预警规则主体id
///
- public int WarningId { get; set; }
-
- ///
- /// 是否中转(单一)
- ///
- public bool? IsTransit { get; set; }
+ public int WarningId { get; }
///
/// 货物类型(多个,分割)
///
- public string? CargoType { get; set; }
-
- ///
- /// 起运港口(多个,分割)
- ///
- public string? LeavePort { get; set; }
-
- ///
- /// 产品编码(多个,分割)
- ///
- public string? ProductCode { get; set; }
+ public string? CargoType { get; }
///
/// 月份(多个/分割)
///
- public string? Months { get; set; }
+ public string? Months { get; }
///
/// 区域Id(单一)
///
- public int? AreaId { get; set; }
+ public int? AreaId { get; }
+
+ ///
+ /// 是否中转(单一)
+ ///
+ public bool? IsTransit { get; }
+
+ ///
+ /// 起运港口(多个,分割)
+ ///
+ public string? LeavePort { get; }
+
+ ///
+ /// 产品编码(多个,分割)
+ ///
+ public string? ProductCode { get; }
+
+ public TransportWarningSceneBO(int id, int warningId, string? cargoType, string? months, int? areaId, bool? isTransit, string? leavePort, string? productCode)
+ {
+ Id = id;
+ WarningId = warningId;
+ CargoType = cargoType;
+
+ // 如果有月份则排序之后在写入
+ if (!string.IsNullOrWhiteSpace(months))
+ {
+ var sorted = months.Split('/').Select(int.Parse).OrderBy(x => x).ToList();
+ Months = string.Join('/', sorted);
+ }
+
+ AreaId = areaId;
+ IsTransit = isTransit;
+ LeavePort = leavePort;
+ ProductCode = productCode;
+ }
public bool CanHitScene(OrderEntity order, List? ruleAreas)
{
@@ -136,17 +155,16 @@ public sealed class TransportWarningSceneBO
public static TransportWarningSceneBO From(TransportWarningSceneEntity entity)
{
- return new TransportWarningSceneBO
- {
- Id = entity.Id,
- WarningId = entity.WarningId,
- CargoType = entity.CargoType,
- Months = entity.Months,
- AreaId = entity.AreaId,
- IsTransit = entity.IsTransit,
- LeavePort = entity.LeavePort,
- ProductCode = entity.ProductCode
- };
+ return new TransportWarningSceneBO(
+ entity.Id,
+ entity.WarningId,
+ entity.CargoType,
+ entity.Months,
+ entity.AreaId,
+ entity.IsTransit,
+ entity.LeavePort,
+ entity.ProductCode
+ );
}
public static List From(List entities)
@@ -156,16 +174,36 @@ public sealed class TransportWarningSceneBO
public static TransportWarningSceneBO From(UpsertTransportWarningSceneInput input)
{
- return new TransportWarningSceneBO
- {
- Id = input.Id,
- WarningId = input.WarningId,
- CargoType = input.CargoType,
- Months = input.Months,
- AreaId = input.AreaId,
- IsTransit = input.IsTransit,
- LeavePort = input.LeavePort,
- ProductCode = input.ProductCode
- };
+ return new TransportWarningSceneBO(
+ input.Id,
+ input.WarningId,
+ input.CargoType,
+ input.Months,
+ input.AreaId,
+ input.IsTransit,
+ input.LeavePort,
+ input.ProductCode
+ );
+ }
+
+ private bool Equals(TransportWarningSceneBO other)
+ {
+ return WarningId == other.WarningId
+ && IsTransit == other.IsTransit
+ && CargoType == other.CargoType
+ && LeavePort == other.LeavePort
+ && ProductCode == other.ProductCode
+ && Months == other.Months
+ && AreaId == other.AreaId;
+ }
+
+ public override bool Equals(object? obj)
+ {
+ return ReferenceEquals(this, obj) || obj is TransportWarningSceneBO other && Equals(other);
+ }
+
+ public override int GetHashCode()
+ {
+ return HashCode.Combine(WarningId, IsTransit, CargoType, LeavePort, ProductCode, Months, AreaId);
}
}
diff --git a/src/SJZY.Track.Application/Services/Warning/TransportWarningService.cs b/src/SJZY.Track.Application/Services/Warning/TransportWarningService.cs
index 4040ea2f..bec84344 100644
--- a/src/SJZY.Track.Application/Services/Warning/TransportWarningService.cs
+++ b/src/SJZY.Track.Application/Services/Warning/TransportWarningService.cs
@@ -104,6 +104,14 @@ public class TransportWarningService : ApplicationService
// 月份
if (!string.IsNullOrWhiteSpace(entity.Months))
list.Add($"{entity.Months.Replace("/", ",")}月份");
+ // 区域名称
+ if (entity.AreaId != null && areaNameDict != null)
+ {
+ var areaName = areaNameDict.GetValueOrDefault(entity.AreaId.Value);
+ if (!string.IsNullOrWhiteSpace(areaName))
+ list.Add($"{areaName}");
+ }
+
// 中转
if (entity.IsTransit != null)
list.Add($"中转为{(entity.IsTransit.Value ? "是" : "否")}");
@@ -113,13 +121,6 @@ public class TransportWarningService : ApplicationService
// 产品编码
if (!string.IsNullOrWhiteSpace(entity.ProductCode))
list.Add($"{entity.ProductCode}");
- // 区域名称
- if (entity.AreaId != null && areaNameDict != null)
- {
- var areaName = areaNameDict.GetValueOrDefault(entity.AreaId.Value);
- if (!string.IsNullOrWhiteSpace(areaName))
- list.Add($"{areaName}");
- }
return string.Join(separator, list);
}
@@ -300,20 +301,21 @@ public class TransportWarningService : ApplicationService
}
var postBo = TransportWarningSceneBO.From(input);
- // 查出旧场景
- var oldScene = await _warningRuleRepository.GetTransportSceneAsync(input.WarningId, input.Id);
- var oldBo = oldScene != null ? TransportWarningSceneBO.From(oldScene) : null;
- // 如果有月份则排序之后在写入
- if (!string.IsNullOrWhiteSpace(postBo.Months))
+ // 查出这个规则主体下的所有场景
+ var oldScenes = await _warningRuleRepository.GetTransportSceneAsync(input.WarningId);
+ var oldBos = oldScenes.Count > 0 ? TransportWarningSceneBO.From(oldScenes) : Empty.List;
+
+ // 验证规则场景是否重复
+ if (oldBos.Any(old => old.Equals(postBo) && old.Id != postBo.Id))
{
- var sorted = postBo.Months.Split('/').Select(int.Parse).OrderBy(x => x).ToList();
- postBo.Months = string.Join('/', sorted);
+ throw new BusinessException(message: "同一规则主体下,不允许出现因素完全相同的场景!");
}
// 更新或者新增
var id = await _warningRuleRepository.UpsertTransportSceneReturnIdAsync(postBo.ToEntity());
+ var oldBo = oldBos.FirstOrDefault(x => x.Id == postBo.Id);
if (oldBo != null)
await _transportWarningHandler.HandleSceneChangedAsync(rule, oldBo, postBo);