diff --git a/src/SJZY.Track.Application.Contract/Events/UpdateOrderTrackEvent.cs b/src/SJZY.Track.Application.Contract/Events/UpdateOrderTrackEvent.cs
index f04cd86c..779415e2 100644
--- a/src/SJZY.Track.Application.Contract/Events/UpdateOrderTrackEvent.cs
+++ b/src/SJZY.Track.Application.Contract/Events/UpdateOrderTrackEvent.cs
@@ -7,11 +7,16 @@ public class UpdateOrderTrackEvent
///
public int OrderId { get; set; }
+ ///
+ /// 是否删除引起的更新
+ ///
+ public bool IsDelete { get; set; }
+
///
/// 此次发生的轨迹是否意味完成
///
public bool IsCompleted { get; set; }
-
+
///
/// 轨迹内容
///
@@ -21,7 +26,7 @@ public class UpdateOrderTrackEvent
/// 轨迹内容英文
///
public string TrackEnContent { get; set; } = null!;
-
+
///
/// 轨迹发生地
///
@@ -31,7 +36,7 @@ public class UpdateOrderTrackEvent
/// 轨迹发生时间
///
public DateTime TrackTime { get; set; }
-
+
///
/// 轨迹时区
///
diff --git a/src/SJZY.Track.Application/EventHandlers/TrackDeleteEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackDeleteEventHandler.cs
index 5fa44212..1994118d 100644
--- a/src/SJZY.Track.Application/EventHandlers/TrackDeleteEventHandler.cs
+++ b/src/SJZY.Track.Application/EventHandlers/TrackDeleteEventHandler.cs
@@ -56,7 +56,30 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe
private async Task DeleteTrackAsync(TrackDeleteEvent @event)
{
// 删除轨迹
- await _trackDetailsRepository.DeleteTrackAsync(@event.OrderId, @event.TrackCodes);
+ var isOk = await _trackDetailsRepository.DeleteTrackAsync(@event.OrderId, @event.TrackCodes);
+
+ // 触发订单主表更新事件
+ if (isOk)
+ {
+ var track = await _trackDetailsRepository.GetLatestAsync(@event.OrderId);
+ var updateOrderEvent = track == default
+ ? new UpdateOrderTrackEvent
+ {
+ OrderId = @event.OrderId,
+ IsDelete = true
+ }
+ : new UpdateOrderTrackEvent
+ {
+ OrderId = @event.OrderId,
+ IsCompleted = track.IsCompleted,
+ TrackContent = track.TrackContent,
+ TrackEnContent = track.TrackEnContent,
+ TrackPlace = track.TrackPlace,
+ TrackTime = track.TrackTime,
+ TrackTimeZone = track.TrackTimeZone
+ };
+ await _capPublisher.PublishAsync(GlobalConst.UpdateOrderTrackSubscribe, updateOrderEvent);
+ }
// 根据订单关联关系异步向下刷
var linkedOrders = await _orderRepository.GetLinkedOrdersAsync(@event.OrderId);
diff --git a/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs
index 5784d125..21ddffc0 100644
--- a/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs
+++ b/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs
@@ -88,7 +88,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
TrackStatus = trackContent.Status,
TrackCode = @event.TrackCode,
TrackContent = trackContent.Content,
-
+ IsCompleted = orderIsCompleted,
TrackEnContent = trackContent.EnContent,
TrackPlace = @event.TrackPlace,
TrackTime = @event.TrackTime!.Value,
diff --git a/src/SJZY.Track.Application/EventHandlers/UpdateOrderTrackEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/UpdateOrderTrackEventHandler.cs
index 0901b2a0..f2fca16a 100644
--- a/src/SJZY.Track.Application/EventHandlers/UpdateOrderTrackEventHandler.cs
+++ b/src/SJZY.Track.Application/EventHandlers/UpdateOrderTrackEventHandler.cs
@@ -20,16 +20,28 @@ public class UpdateOrderTrackEventHandler : ITransientDependency, ICapSubscribe
var order = await _orderRepository.GetFirstAsync(x => x.Id == @event.OrderId);
if (order == default) return;
- if (order.IsCompleted) return;
+ if (@event.IsDelete)
+ {
+ if (@event.TrackTime == default)
+ {
+ // 删除全部轨迹导致的重置行为
+ order.ResetTrackInfo();
+ }
+ else if (@event.TrackTime == order.LatestTrackTime) return;
+ }
+ else // upsert引发的更新,需要校验发生时间是否大于最新时间
+ {
+ if (order.LatestTrackTime != null &&
+ order.LatestTrackTime.Value.Subtract(TimeSpan.FromHours(order.LatestTrackTimeZone ?? 0)) >
+ @event.TrackTime.Subtract(TimeSpan.FromHours(@event.TrackTimeZone))) return;
+ }
+
+ order.IsCompleted = @event.IsCompleted;
order.LatestTrackContent = @event.TrackContent;
order.LatestTrackEnContent = @event.TrackEnContent;
order.LatestTrackPlace = @event.TrackPlace;
order.LatestTrackTime = @event.TrackTime;
order.LatestTrackTimeZone = @event.TrackTimeZone;
- if (@event.IsCompleted) order.IsCompleted = true;
- else if (order.LatestTrackTime != null &&
- order.LatestTrackTime.Value.Subtract(TimeSpan.FromHours(order.LatestTrackTimeZone ?? 0)) >
- @event.TrackTime.Subtract(TimeSpan.FromHours(@event.TrackTimeZone))) return;
await _orderRepository.UpdateColumnAsync(order, x => new
{
diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs
index 04432d30..69d5f706 100644
--- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs
+++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs
@@ -41,7 +41,7 @@ public class OrderEntity : IFullAuditedBasicEntitys, IAggregateRoot
///
[SugarColumn(ColumnName = "IsCompleted")]
public bool IsCompleted { get; set; }
-
+
///
/// 订单是否推送完成(异步维护)
///
@@ -65,7 +65,7 @@ public class OrderEntity : IFullAuditedBasicEntitys, IAggregateRoot
///
[SugarColumn(ColumnName = "LatestTrackTime")]
public DateTime? LatestTrackTime { get; set; }
-
+
///
/// 最新轨迹时区(异步维护)
///
@@ -114,8 +114,16 @@ public class OrderEntity : IFullAuditedBasicEntitys, IAggregateRoot
[SugarColumn(ColumnName = "LeavePort")]
public string? LeavePort { get; set; }
- [SugarColumn(IsIgnore = true)]
- public List OrderFlights { get; set; }
- [SugarColumn(IsIgnore = true)]
- public List OrderTemplates { get; set; }
+ [SugarColumn(IsIgnore = true)] public List OrderFlights { get; set; }
+ [SugarColumn(IsIgnore = true)] public List OrderTemplates { get; set; }
+
+ public void ResetTrackInfo()
+ {
+ IsCompleted = false;
+ LatestTrackContent = null;
+ LatestTrackEnContent = null;
+ LatestTrackTime = null;
+ LatestTrackPlace = null;
+ LatestTrackTimeZone = null;
+ }
}
\ No newline at end of file
diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs
index 4025579e..34cdac01 100644
--- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs
+++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs
@@ -19,7 +19,14 @@ public interface ITrackDetailsRepository
///
///
///
- Task DeleteTrackAsync(int orderId, List trackCodes);
+ Task DeleteTrackAsync(int orderId, List trackCodes);
Task?> GetListAsync(List orderIds);
+
+ ///
+ /// 获取最近一条发生的轨迹
+ ///
+ ///
+ ///
+ Task GetLatestAsync(int orderId);
}
\ No newline at end of file
diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs
index d4f5c9e1..d5909320 100644
--- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs
+++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs
@@ -46,6 +46,11 @@ public class TrackDetailsIndex : IdBaseIndex
///
public string TrackContent { get; set; } = null!;
+ ///
+ /// 是否意味着完成
+ ///
+ public bool IsCompleted { get; set; }
+
///
/// 原轨迹内容
///
diff --git a/src/SJZY.Track.Domain/GlobalConst.cs b/src/SJZY.Track.Domain/GlobalConst.cs
index 27a07bb1..629149a8 100644
--- a/src/SJZY.Track.Domain/GlobalConst.cs
+++ b/src/SJZY.Track.Domain/GlobalConst.cs
@@ -27,6 +27,11 @@ public class GlobalConst
///
public const string UpdateOrderTrackSubscribe = "SJZY.Track.UpdateOrderTrack";
+ ///
+ /// 轨迹删除后触发更新订单轨迹 mq订阅名称
+ ///
+ public const string DeleteTrackAfterUpdateOrderSubscribe = "SJZY.Track.DeleteTrackAfterUpdateOrder";
+
///
/// 关联订单后补轨迹 mq订阅名称
///
diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs
index 99290105..8bc2739d 100644
--- a/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs
+++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs
@@ -110,7 +110,28 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract trackCodes)
+ public async Task GetLatestAsync(int orderId)
+ {
+ var data = await Context.SearchAsync(x => x
+ .Source(s => s.Includes(fd => fd
+ .Field(f => f.IsCompleted)
+ .Field(f => f.TrackEnContent)
+ .Field(f => f.TrackContent)
+ .Field(f => f.TrackPlace)
+ .Field(f => f.TrackTime)
+ .Field(f => f.TrackTimeZone)
+ ))
+ .Query(q =>
+ q.Term(f => f.OrderId, orderId)
+ )
+ .Sort(s => s.Field(f => f.TrackTime, SortOrder.Descending))
+ .Size(1)
+ );
+
+ return data.Documents.FirstOrDefault();
+ }
+
+ public async Task DeleteTrackAsync(int orderId, List trackCodes)
{
var r = await Context.DeleteByQueryAsync(x => x
.Query(
@@ -122,6 +143,8 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract 0;
}
public async Task<(List list, long total)> GetListAsync(TrackDetailsQueryInput input)