From b232d96634d65b060dc98b55e9b96086d5466cc5 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, 26 Mar 2024 17:31:50 +0800 Subject: [PATCH 1/2] =?UTF-8?q?opt=EF=BC=9A=E4=BC=98=E5=8C=96=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9upsert=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Events/TrackUpsertEvent.cs | 51 +++++++++--- .../SJZY.Track.Application.Contract.csproj | 2 +- .../EventHandlers/CAPFilter.cs | 11 ++- .../EventHandlers/TrackRefreshEventHandler.cs | 10 +-- .../EventHandlers/TrackUpsertEventHandler.cs | 78 +++++++++++++------ .../Services/ProvideServices/TrackService.cs | 4 +- .../ITrackDetailsRepository.cs | 2 + src/SJZY.Track.Domain/Consts/GlobalConst.cs | 6 ++ .../Repositories/TrackDetailsRepository.cs | 19 +++++ 9 files changed, 136 insertions(+), 47 deletions(-) create mode 100644 src/SJZY.Track.Domain/Consts/GlobalConst.cs diff --git a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs index c2c2072d..1215e1e8 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs @@ -1,14 +1,22 @@ -using SJZY.Track.Application.Contract.Dtos.ProvideServices; +namespace SJZY.Track.Application.Contract.Events; -namespace SJZY.Track.Application.Contract.Events; - -public class TrackUpsertEvent : UpsertTrackInput +public class TrackUpsertEvent { /// /// 订单id /// public int OrderId { get; set; } + /// + /// 订单类型 + /// + public int OrderType { get; set; } + + /// + /// 订单号 + /// + public string OrderNo { get; set; } = null!; + /// /// 订单是否完成 /// @@ -34,11 +42,6 @@ public class TrackUpsertEvent : UpsertTrackInput /// public int UpSubSystemId { get; set; } - /// - /// 已经处理过的订单 - /// - public List Visited { get; set; } = new(); - /// /// 原轨迹内容 /// @@ -53,4 +56,34 @@ public class TrackUpsertEvent : UpsertTrackInput /// 操作人 /// public string? OperationMan { get; set; } + + /// + /// true新增,false更新,null表示刷新引发的新增/更新 + /// + public bool? IsAdd { get; set; } + + /// + /// 轨迹内容代码 + /// + public string TrackCode { get; set; } = null!; + + /// + /// 轨迹发生地 + /// + public string TrackPlace { get; set; } = null!; + + /// + /// 轨迹发生时间 + /// + public DateTime TrackTime { get; set; } + + /// + /// 轨迹发生时区 + /// + public float TrackTimeZone { get; set; } + + /// + /// 已经处理过的订单 + /// + public List Visited { get; set; } = new(); } \ No newline at end of file diff --git a/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj b/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj index f13ee0b2..13bcd7dd 100644 --- a/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj +++ b/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj @@ -5,7 +5,7 @@ net7.0 True - 1.0.0 + 1.0.1 True diff --git a/src/SJZY.Track.Application/EventHandlers/CAPFilter.cs b/src/SJZY.Track.Application/EventHandlers/CAPFilter.cs index 8bea9494..feaf198f 100644 --- a/src/SJZY.Track.Application/EventHandlers/CAPFilter.cs +++ b/src/SJZY.Track.Application/EventHandlers/CAPFilter.cs @@ -65,15 +65,15 @@ public class CAPFilter : SubscribeFilter public override Task OnSubscribeExceptionAsync(ExceptionContext context) { context.ExceptionHandled = true; + context.DeliverMessage.Headers.TryGetValue("cap-msg-id", out var messageId); if (context.Exception is BusinessException ex && ex.Code == _ERROR_CODE) LogHelper.Warn(ex.ToString()); else - LogHelper.Error(context.Exception.ToString()); + LogHelper.Error($"cap-msg-id:{messageId}\n{context.Exception}"); context.DeliverMessage.Headers.TryGetValue("sjzy-receive-time", out var receiveTime); - context.DeliverMessage.Headers.TryGetValue("cap-msg-id", out var messageId); context.DeliverMessage.Headers.TryGetValue("cap-msg-name", out var receiveName); context.DeliverMessage.Headers.TryGetValue("sjzy-arguments", out var arguments); @@ -89,16 +89,15 @@ public class CAPFilter : SubscribeFilter var parsedDate = DateTime.ParseExact(receiveTime, "yyyy-MM-dd HH:mm:ss fff", CultureInfo.InvariantCulture); var useTime = DateTime.Now - parsedDate; - var log = $@" + if (useTime.Minutes > 20) + { + var log = $@" |-消息编号:{messageId} |-消费者名:{receiveName} |-跳过执行:{(isFromExecptionFliter ? "是" : "否")} |-执行时间:{receiveTime} |-消费耗时:{useTime.Milliseconds}毫秒 |-请求参数:{arguments}"; - - if (useTime.Minutes > 20) - { LogHelper.Error(log); } else diff --git a/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs index be24fbf0..153786a9 100644 --- a/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs @@ -158,7 +158,7 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe } } - if (matchedContentConfig is null) return; + // if (matchedContentConfig is null) return; // 轨迹发生地 var trackPlace = paramConfig.TrackPlaceName == null @@ -167,7 +167,7 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe if (trackPlace.IsNullOrWhiteSpace()) { Expression> resultExpression = - (TrackLocationValue?)matchedContentConfig.TrackPlaceValue switch + (TrackLocationValue?)matchedContentConfig?.TrackPlaceValue switch { TrackLocationValue.ArrivalPort => x => x.ArrivalPort, TrackLocationValue.ArriveCity => x => x.ArrivalCity, @@ -191,10 +191,10 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe : trackToken[paramConfig.TrackTimeZoneName]?.Value(); // 新增/更新轨迹 - trackUpsertEvent.TrackCode = matchedContentConfig.TrackContentCode; - trackUpsertEvent.TrackPlace = trackPlace ?? "CN"; + trackUpsertEvent.TrackCode = matchedContentConfig?.TrackContentCode ?? GlobalConst.EmptyString; + trackUpsertEvent.TrackPlace = trackPlace ?? GlobalConst.EmptyString; trackUpsertEvent.TrackTime = trackTime ?? DateTime.Now; - trackUpsertEvent.TrackTimeZone = trackTimeZone ?? matchedContentConfig.TrackTimeZoneValue ?? 8; + trackUpsertEvent.TrackTimeZone = trackTimeZone ?? matchedContentConfig?.TrackTimeZoneValue ?? 8; await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, trackUpsertEvent); } } \ No newline at end of file diff --git a/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs index e3276d02..eab6361e 100644 --- a/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs @@ -40,6 +40,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe return; } + var isUnProcessed = false; // 不同子系统需要做内容映射 if (@event.UpSubSystemId != 0 && @event.UpSubSystemId != @event.SubSystemId) { @@ -56,13 +57,22 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe @event.TrackCode = mapCode; } - var track = await _trackDetailsRepository.GetFirstOrDefaultAsync(@event.OrderId, @event.TrackCode); - if (track == null && !@event.IsAdd) return; - if (track != null && @event.IsAdd) return; + var track = @event.TrackCode == GlobalConst.EmptyString + ? await _trackDetailsRepository.GetFirstOrDefaultAsync(@event.OrderId, @event.TrackTime) + : await _trackDetailsRepository.GetFirstOrDefaultAsync(@event.OrderId, @event.TrackCode); + + if (@event.TrackCode == GlobalConst.EmptyString && track != null) return; // 无法映射的轨迹只做新增 + + if (@event.IsAdd != null) // 手动操作需要做区分 + { + if (track == null && !@event.IsAdd!.Value) return; // 不存在不让改 + if (track != null && @event.IsAdd!.Value) return; // 存在不让创建 + } // step1、upsert es轨迹 track = await UpsertTrackAsync(track, @event); - if (track == null) return; // 模板没配该轨迹代码,无法入库 + + if (track == null || @event.TrackCode == GlobalConst.EmptyString) return; // 模板没配该轨迹代码,不再继续 // step2、触发轨迹推送事件(异步) await HandleTrackPushAsync(@event, track); @@ -107,44 +117,64 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe { if (track == default) { - //todo:可以优化 - // 根据轨迹code在订单模板内容中寻找匹配的 - var trackContent = await _provideQueries.MatchTrackContentAsync(@event.OrderId, @event.TrackCode); - if (trackContent == default) - { - // 订单所绑定的模板,没有一条内容可以匹配发生的轨迹 - return null; - } - track = new TrackDetailsIndex { IndexName = $"{GlobalConst.TrackIndex}-{DateTime.Now:yyyy.MM.dd}", OrderId = @event.OrderId, OrderNo = @event.OrderNo, OrderType = @event.OrderType, - TrackStatus = trackContent.Status, TrackCode = @event.TrackCode, - TrackContent = trackContent.Content, - TrackContentId = trackContent.Id, - IsCompleted = trackContent.IsCompleted, - TrackEnContent = trackContent.EnContent, TrackPlace = @event.TrackPlace, - TrackTime = @event.TrackTime!.Value, - TrackTimeZone = @event.TrackTimeZone!.Value, - IsCanDelete = trackContent.IsCanDelete, + TrackTime = @event.TrackTime, + TrackTimeZone = @event.TrackTimeZone, + IsCanDelete = false, OriginTrackContent = @event.OriginTrackContent, OriginTrackData = @event.OriginTrackData, CreateUser = @event.OperationMan, CreateTime = DateTime.Now }; - track.ZeroTrackTime = track.TrackTime.Subtract(TimeSpan.FromHours(track.TrackTimeZone)); + // tips:刷新到无法匹配内容的轨迹引起的插入 + if (@event.TrackCode == GlobalConst.EmptyString) + { + track.TrackStatus = GlobalConst.EmptyString; + track.TrackContent = GlobalConst.EmptyString; + track.TrackContentId = 0; + track.IsCompleted = false; + track.TrackEnContent = GlobalConst.EmptyString; + } + else + { + //todo:可以优化 + // 根据轨迹code在订单模板内容中寻找匹配的 + var trackContent = await _provideQueries.MatchTrackContentAsync(@event.OrderId, @event.TrackCode); + if (trackContent == default) + { + // 订单所绑定的模板,没有一条内容可以匹配发生的轨迹 + return null; + } + + track = new TrackDetailsIndex + { + TrackStatus = trackContent.Status, + TrackContent = trackContent.Content, + TrackContentId = trackContent.Id, + IsCompleted = trackContent.IsCompleted, + TrackEnContent = trackContent.EnContent, + IsCanDelete = trackContent.IsCanDelete + }; + + track.ZeroTrackTime = track.TrackTime.Subtract(TimeSpan.FromHours(track.TrackTimeZone)); + } } else { + // tips:刷新到无法匹配内容的轨迹 相同的发生时间不做更新处理 + if (@event.TrackCode == GlobalConst.EmptyString) return track; + track.TrackPlace = @event.TrackPlace; - track.TrackTime = @event.TrackTime!.Value; - track.TrackTimeZone = @event.TrackTimeZone!.Value; + track.TrackTime = @event.TrackTime; + track.TrackTimeZone = @event.TrackTimeZone; track.UpdateUser = @event.OperationMan ?? "系统"; track.UpdateTime = DateTime.Now; } diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index c21e2a34..77199263 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -91,8 +91,8 @@ public partial class TrackService : ApplicationService, ITrackService IsAdd = input.IsAdd, TrackCode = input.TrackCode, TrackPlace = input.TrackPlace, - TrackTime = input.TrackTime, - TrackTimeZone = input.TrackTimeZone, + TrackTime = input.TrackTime!.Value, + TrackTimeZone = input.TrackTimeZone!.Value, OrderType = input.OrderType, OrderNo = order.OrderNo, OrderId = order.Id, diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs index acd0ed4e..c78d9b2f 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs @@ -6,6 +6,8 @@ public interface ITrackDetailsRepository { Task GetFirstOrDefaultAsync(int orderId, string trackCode); + Task GetFirstOrDefaultAsync(int orderId, DateTime trackTime); + Task UpsertAsync(TrackDetailsIndex index); Task> GetListAsync(int orderType, List orderNos); diff --git a/src/SJZY.Track.Domain/Consts/GlobalConst.cs b/src/SJZY.Track.Domain/Consts/GlobalConst.cs new file mode 100644 index 00000000..a7167357 --- /dev/null +++ b/src/SJZY.Track.Domain/Consts/GlobalConst.cs @@ -0,0 +1,6 @@ +namespace SJZY.Track.Domain.Consts; + +public partial class GlobalConst +{ + public const string EmptyString = "--"; +} \ No newline at end of file diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs index 598ab7ba..b39652de 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs @@ -32,6 +32,25 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract GetFirstOrDefaultAsync(int orderId, DateTime trackTime) + { + var r = await Context.SearchAsync(s => s + .Source() + .Query(q => + q.Term(f => f.OrderId, orderId) + && q.Term(f => f.TrackTime, trackTime) + ) + ); + + var res = r.Documents.FirstOrDefault(); + if (res != default && r.Hits.FirstOrDefault() != default) + { + res.Id = r.Hits.FirstOrDefault()!.Id; + } + + return res; + } + public async Task UpsertAsync(TrackDetailsIndex index) { if (index.Id.IsNullOrWhiteSpace()) From 7b20e7a9394bd226b08a9f17e6da4ccb9879fc55 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, 26 Mar 2024 17:49:41 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=9B=9E=E9=80=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EventHandlers/TrackRefreshEventHandler.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs index 153786a9..75a991a2 100644 --- a/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs @@ -158,7 +158,7 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe } } - // if (matchedContentConfig is null) return; + if (matchedContentConfig is null) return; // 轨迹发生地 var trackPlace = paramConfig.TrackPlaceName == null