From 2e86b7f7ba6aa1b2e227e4a6a9fce3d0921a7f4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=86=9B?= <2357729423@qq.com> Date: Tue, 12 Mar 2024 17:28:15 +0800 Subject: [PATCH] =?UTF-8?q?change=E3=80=90=E6=9B=B4=E6=96=B0=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E9=9C=80=E8=A6=81=E6=9B=B4=E6=96=B0=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E7=9A=84=E6=9C=80=E6=96=B0=E8=BD=A8=E8=BF=B9=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E3=80=91https://www.tapd.cn/60863849/prong/tasks/view/11608638?= =?UTF-8?q?49001016391?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Events/UpdateOrderTrackEvent.cs | 11 +++++--- .../EventHandlers/TrackDeleteEventHandler.cs | 25 ++++++++++++++++++- .../EventHandlers/TrackUpsertEventHandler.cs | 2 +- .../UpdateOrderTrackEventHandler.cs | 22 ++++++++++++---- .../Aggregates/OrderAggregate/OrderEntity.cs | 20 ++++++++++----- .../ITrackDetailsRepository.cs | 9 ++++++- .../TrackDetailsIndex.cs | 5 ++++ src/SJZY.Track.Domain/GlobalConst.cs | 5 ++++ .../Repositories/TrackDetailsRepository.cs | 25 ++++++++++++++++++- 9 files changed, 106 insertions(+), 18 deletions(-) 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)