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);