From 4a759333ca265cd9e0dacdfce2d00f64d0bff5d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=86=9B?= <2357729423@qq.com> Date: Wed, 3 Apr 2024 09:13:47 +0800 Subject: [PATCH 01/22] =?UTF-8?q?change=EF=BC=9A=E6=8E=A8=E9=80=81?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EventHandlers/TrackPushEventHandler.cs | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs index e95906da..68ad47d4 100644 --- a/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs @@ -39,9 +39,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe { x.SubSystemId, x.LatestPushTrackCode, x.QuestionType, x.CustomId }); - if (order == null || order.QuestionType == (int)TrackProblemType.Error) return; // 是否通知? - - TrackPushContentConfigDto? config; + if (order == null) return; var log = new TrackPushRecordIndex { @@ -58,6 +56,8 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe CreateTime = DateTime.Now }; + TrackPushContentConfigDto? config = null; + switch (@event.OptionType) { case OptionType.无: @@ -65,9 +65,12 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe case OptionType.新增: if (@event.OperationMan == null) { - // 推送新增,需要根据上一次的推送 推断 本次推送 是否可行 - config = await _trackPushCacheService.IsValidPushAsync(order.SubSystemId, order.CustomId, - order.LatestPushTrackCode, @event.TrackCode); + if (order.QuestionType != (int)TrackProblemType.Error) + { + // 推送新增,需要根据上一次的推送 推断 本次推送 是否可行 + config = await _trackPushCacheService.IsValidPushAsync(order.SubSystemId, order.CustomId, + order.LatestPushTrackCode, @event.TrackCode); + } } else { @@ -132,12 +135,17 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe // tips:只有新增会影响推送进度? order.LatestPushTrackCode = dto.TrackCode; order.LatestPushTime = DateTime.Now; + await _orderRepository.UpdateColumnAsync(order, x => new + { + x.LatestPushTrackCode, x.LatestPushTime, x.QuestionType, x.LatestPushError + }); + return; } } await _orderRepository.UpdateColumnAsync(order, x => new { - x.LatestPushTrackCode, x.QuestionType, x.LatestPushError, x.LatestPushTime + x.QuestionType, x.LatestPushError }); } From 63e4c8b999ee5cbe2a497d14a11f5b78347134cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=86=9B?= <2357729423@qq.com> Date: Wed, 3 Apr 2024 17:00:30 +0800 Subject: [PATCH 02/22] =?UTF-8?q?fix=EF=BC=9A=E3=80=90=E3=80=90=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E8=BD=A8=E8=BF=B9=E5=86=85=E5=AE=B9=E3=80=91=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E6=A0=87=E8=AE=B0=E6=B2=A1=E6=9C=89=E5=80=BC=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E6=98=BE=E7=A4=BA=E4=BA=86id=E3=80=91https://www.tapd?= =?UTF-8?q?.cn/60863849/bugtrace/bugs/view=3Fbug=5Fid=3D116086384900103258?= =?UTF-8?q?5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/TrackContents/EditTrackContentInput.cs | 2 +- .../Services/TrackContents/TrackContentService.cs | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/EditTrackContentInput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/EditTrackContentInput.cs index d2a829ca..8a99f816 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/EditTrackContentInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/EditTrackContentInput.cs @@ -88,7 +88,7 @@ /// /// 轨迹标记id /// - public int TrackFlagId { get; set; } + public int? TrackFlagId { get; set; } /// /// 轨迹标记 diff --git a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs index 657cc671..9ed8374e 100644 --- a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs +++ b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs @@ -59,6 +59,8 @@ public class TrackContentService : ApplicationService } var dto = ObjectMapper.Map(detailInfo); + + if (dto.TrackFlagId == 0) dto.TrackFlagId = null; return new UnifyResultDto("200", "", dto); } From 0b8e9da9180dd26848d0375580ca47d054f238ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=86=9B?= <2357729423@qq.com> Date: Wed, 3 Apr 2024 17:51:00 +0800 Subject: [PATCH 03/22] =?UTF-8?q?change=EF=BC=9A=E8=BD=A8=E8=BF=B9?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E5=AF=B9=E5=A4=96=E9=80=BB=E8=BE=91=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/ProvideServices/GetTrackOutput.cs | 13 +++-- .../ProvideServices/TrackService.Query.cs | 57 ++++++++++++------- .../TrackTemplates/ITrackTemplateService.cs | 7 --- .../Dtos/TrackTemplate/OrderedTrackCodeDto.cs | 5 ++ .../Queries/ProvideQueries.cs | 32 ++++------- .../Repositories/TrackDetailsRepository.cs | 1 + 6 files changed, 59 insertions(+), 56 deletions(-) delete mode 100644 src/SJZY.Track.Application/Services/TrackTemplates/ITrackTemplateService.cs diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs index eda7ecbc..dcafe452 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs @@ -5,17 +5,18 @@ public class GetTrackOutput /// /// 订单号 /// - public string OrderNo { get; set; } + public string OrderNo { get; set; } = null!; - public List TrackDetails { get; set; } + public List TrackDetails { get; set; } = new(); } public class TrackDetail { - public string Code { get; set; } - public string Status { get; set; } - public string Content { get; set; } - public string Location { get; set; } + public string Code { get; set; } = null!; + public string Status { get; set; } = null!; + public string? Content { get; set; } + public string? OriginContent { get; set; } + public string Location { get; set; } = null!; public DateTime Time { get; set; } public float TimeZone { get; set; } } \ No newline at end of file diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs index 35237196..3864b604 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs @@ -39,6 +39,7 @@ public partial class TrackService Code = x.TrackCode, Status = x.TrackStatus, Content = x.TrackContent, + OriginContent = x.OriginTrackContent, Location = x.TrackPlace, Time = x.TrackTime.AddHours(input.TimeZone ?? 8 - x.TrackTimeZone), TimeZone = input.TimeZone ?? 8 @@ -54,6 +55,29 @@ public partial class TrackService private async Task TrackDetailSort(List list, GetTrackInput input) { + var orderTemplates = await _provideQueries + .GetOrderTemplateLinksAsync(input.OrderType, input.OrderNos); + var distinctTemplateIds = orderTemplates.Select(x => x.TemplateId).Distinct().ToList(); + var templateContent = await _provideQueries.GetOrderedTrackCodesAsync(distinctTemplateIds); + + list.ForEach(item => + { + var codes = new List(); + // 多模板拼接显示 + foreach (var orderTemplate in orderTemplates.Where(x => x.OrderNo == item.OrderNo)) + { + codes.AddRange(templateContent + .Where(t => t.TemplateId == orderTemplate.TemplateId) // 按模板 + .Where(t => t.IsExternal) // 过滤不对外的 + .Select(t => t.Code)); + } + + item.TrackDetails = item.TrackDetails + .Where(x => codes.Contains(x.Code)) // 剔除不在模板内容中的元素 + .OrderBy(x => codes.IndexOf(x.Code)) // 按照在模板内容的位置排序 + .ToList(); + }); + switch (input.SortMethod) { case SortMethod.ByTrackTime: @@ -64,30 +88,21 @@ public partial class TrackService list.ForEach(item => item.TrackDetails.Sort((a, b) => b.Time.CompareTo(a.Time))); break; case SortMethod.ByTemplate: - var orderTemplates = await _provideQueries - .GetOrderTemplateLinksAsync(input.OrderType, input.OrderNos); - var distinctTemplateIds = orderTemplates.Select(x => x.TemplateId).Distinct().ToList(); - var templateContent = await _provideQueries.GetOrderedTrackCodesAsync(distinctTemplateIds); - list.ForEach(item => - { - var codes = new List(); - // 多模板拼接显示 - foreach (var orderTemplate in orderTemplates.Where(x => x.OrderNo == item.OrderNo)) - { - codes.AddRange(templateContent - .Where(t => t.TemplateId == orderTemplate.TemplateId) // 按模板 - .Where(t => t.IsExternal) // 过滤不对外的 - .Select(t => t.Code)); - } - - item.TrackDetails = item.TrackDetails - .Where(x => codes.Contains(x.Code)) // 剔除不在模板内容中的元素 - .OrderBy(x => codes.IndexOf(x.Code)) // 按照在模板内容的位置排序 - .ToList(); - }); break; default: throw new ArgumentOutOfRangeException(nameof(input.SortMethod), input.SortMethod, "不支持的排序方式"); } + + // 显示原轨迹 + list.ForEach(item => + { + item.TrackDetails.ForEach(track => + { + if (templateContent.First(x => x.Code == track.Code).ShowOrigin) + { + track.Content = track.OriginContent; + } + }); + }); } } \ No newline at end of file diff --git a/src/SJZY.Track.Application/Services/TrackTemplates/ITrackTemplateService.cs b/src/SJZY.Track.Application/Services/TrackTemplates/ITrackTemplateService.cs deleted file mode 100644 index f6e29107..00000000 --- a/src/SJZY.Track.Application/Services/TrackTemplates/ITrackTemplateService.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace SJZY.Track.Application.Services.TrackTemplates -{ - public interface ITrackTemplateService - { - - } -} diff --git a/src/SJZY.Track.Domain/Dtos/TrackTemplate/OrderedTrackCodeDto.cs b/src/SJZY.Track.Domain/Dtos/TrackTemplate/OrderedTrackCodeDto.cs index cb31744d..43805324 100644 --- a/src/SJZY.Track.Domain/Dtos/TrackTemplate/OrderedTrackCodeDto.cs +++ b/src/SJZY.Track.Domain/Dtos/TrackTemplate/OrderedTrackCodeDto.cs @@ -16,4 +16,9 @@ public class OrderedTrackCodeDto /// 是否对外 /// public bool IsExternal { get; set; } + + /// + /// 显示原轨迹 + /// + public bool ShowOrigin { get; set; } } \ No newline at end of file diff --git a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs index cce3c885..7f144688 100644 --- a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs +++ b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs @@ -20,20 +20,6 @@ public class ProvideQueries : ISugarRepository, IProvideQueries, Context = SqlsugarScopeBasic.GetContextSafely("default"); } - public async Task> GetOrderTemplateLinksAsync(int orderType, - params string[] orderNumbers) - { - return await Context.Queryable() - .LeftJoin((a, b) => a.Id == b.OrderId) - .Where(a => a.OrderType == orderType && orderNumbers.Contains(a.OrderNo)) - .Select((a, b) => new OrderTemplateLinkDto - { - OrderNo = a.OrderNo, - TemplateId = b.TrackTemplateId - }) - .ToListAsync(); - } - public async Task> GetOrderTemplateLinksAsync(int orderType, List orderNumbers) { return await Context.Queryable() @@ -49,15 +35,17 @@ public class ProvideQueries : ISugarRepository, IProvideQueries, public async Task> GetOrderedTrackCodesAsync(List templateIds) { - return await Context.Queryable() - .LeftJoin((a, b) => a.TrackContentId == b.Id) - .Where(a => templateIds.Contains(a.TrackTemplateId)) - .OrderBy(a => a.Sort) - .Select((a, b) => new OrderedTrackCodeDto + return await Context.Queryable() + .LeftJoin((a, b) => a.Id == b.TrackTemplateId) + .LeftJoin((a, b, c) => b.TrackContentId == c.Id) + .Where(a => templateIds.Contains(a.Id)) + .OrderBy((a, b) => b.Sort) + .Select((a, b, c) => new OrderedTrackCodeDto { - TemplateId = a.TrackTemplateId, - Code = b.Code, - IsExternal = a.IsExternal + TemplateId = a.Id, + ShowOrigin = a.ShowOrigin, + Code = c.Code, + IsExternal = b.IsExternal }) .ToListAsync(); } diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs index 1229eec7..03b3c7c9 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs @@ -85,6 +85,7 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract f.TrackStatus) .Field(f => f.TrackCode) .Field(f => f.TrackContent) + .Field(f => f.OriginTrackContent) .Field(f => f.TrackPlace) .Field(f => f.TrackTime) .Field(f => f.TrackTimeZone) From d2de95a8039155fe1b9eff4d59a8cf95e27bac5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=86=9B?= <2357729423@qq.com> Date: Sun, 7 Apr 2024 20:07:38 +0800 Subject: [PATCH 04/22] =?UTF-8?q?fix=EF=BC=9A=E3=80=90=E3=80=90=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E8=AE=A2=E5=8D=95=E3=80=91=E8=BD=A8=E8=BF=B9=E6=98=8E?= =?UTF-8?q?=E7=BB=86=EF=BC=88"=E6=9C=8D=E5=8A=A1=E5=95=86=E6=BA=90?= =?UTF-8?q?=E8=BD=A8=E8=BF=B9=E5=86=85=E5=AE=B9"=E4=B8=8E"=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E5=86=85=E5=AE=B9"=E4=B8=8D=E5=8C=B9=E9=85=8D?= =?UTF-8?q?=EF=BC=89=E5=B7=B2=E9=85=8D=E7=BD=AE=E6=98=A0=E5=B0=84=E3=80=91?= =?UTF-8?q?https://www.tapd.cn/60863849/bugtrace/bugs/view=3Fbug=5Fid=3D11?= =?UTF-8?q?60863849001032624?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Events/TrackUpsertEvent.cs | 10 ++++++++++ .../EventHandlers/TrackRefreshEventHandler.cs | 6 ++++++ .../EventHandlers/TrackUpsertEventHandler.cs | 2 ++ 3 files changed, 18 insertions(+) diff --git a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs index 3533f2e6..53e0d856 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs @@ -22,6 +22,16 @@ public class TrackUpsertEvent /// public string? ServiceProviderName { get; set; } + /// + /// 原轨迹内容 + /// + public string? OriginTrackContent { get; set; } + + /// + /// 原轨迹报文 + /// + public string? OriginTrackData { get; set; } + /// /// 表示订单是否完成(只由轨迹刷新配置决定) /// tips:能够使得IsCompleted为true的点,全局只有一个:轨迹刷新 diff --git a/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs index b4bfe207..61431b30 100644 --- a/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs @@ -218,6 +218,7 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe OrderType = context.OrderType, OrderNo = context.OrderNo, ServiceProviderName = context.ServiceProviderName, + OriginTrackData = JsonConvert.SerializeObject(trackToken), IsCompleted = matchedContentConfig.IsCompleted, SubSystemId = context.SubSystemId, TrackCode = matchedContentConfig.TrackContentCode, @@ -225,6 +226,11 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe TrackTime = trackTime ?? DateTime.Now, TrackTimeZone = trackTimeZone ?? matchedContentConfig.TrackTimeZoneValue ?? 8 }; + if (paramConfig.TrackContentName != null) + { + trackUpsertEvent.OriginTrackContent = trackToken[paramConfig.TrackContentName]?.Value(); + } + 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 41ce263b..105ef588 100644 --- a/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs @@ -131,6 +131,8 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe TrackTime = @event.TrackTime, TrackTimeZone = @event.TrackTimeZone, ServiceProviderName = @event.ServiceProviderName, + OriginTrackContent = @event.OriginTrackContent, + OriginTrackData = @event.OriginTrackData, IsCanDelete = false, CreateUser = @event.OperationMan ?? GlobalConst.SystemUser, CreateTime = DateTime.Now From 66d5a5c4d59dee0eaf4175e32eb109f864841226 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=86=9B?= <2357729423@qq.com> Date: Sun, 7 Apr 2024 21:21:21 +0800 Subject: [PATCH 05/22] =?UTF-8?q?fix=EF=BC=9A=E3=80=90=E3=80=90=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E8=AE=A2=E5=8D=95=E3=80=91"=E6=98=AF=E5=90=A6?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=8E=A8=E9=80=81"=E4=B8=BA=E5=90=A6?= =?UTF-8?q?=EF=BC=8C=E6=96=B0=E5=A2=9E=E8=BD=A8=E8=BF=B9=E6=98=8E=E7=BB=86?= =?UTF-8?q?=E5=90=8E=EF=BC=8C=E5=BC=82=E5=B8=B8=E8=87=AA=E5=8A=A8=E6=8E=A8?= =?UTF-8?q?=E9=80=81=E8=BD=A8=E8=BF=B9=E6=98=8E=E7=BB=86=E3=80=91https://w?= =?UTF-8?q?ww.tapd.cn/60863849/bugtrace/bugs/view=3Fbug=5Fid=3D11608638490?= =?UTF-8?q?01032644?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/ITrackPushCacheService.cs | 18 +++-- .../TrackPush/TrackPushCacheService.cs | 50 ++++++++------ .../Services/TrackPush/TrackPushService.cs | 65 +++++++++++-------- 3 files changed, 76 insertions(+), 57 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Services/ITrackPushCacheService.cs b/src/SJZY.Track.Application.Contract/Services/ITrackPushCacheService.cs index d04c0fa2..8928ae11 100644 --- a/src/SJZY.Track.Application.Contract/Services/ITrackPushCacheService.cs +++ b/src/SJZY.Track.Application.Contract/Services/ITrackPushCacheService.cs @@ -12,6 +12,14 @@ public interface ITrackPushCacheService /// Task?> GetPushContentConfigsAsync(int subSystemId, int customId); + /// + /// 设置服务商拉取配置缓存 + /// + /// + /// + /// + Task?> SetPushContentConfigsAsync(int subSystemId, int customId); + /// /// 获取服务商拉取配置 /// @@ -33,14 +41,4 @@ public interface ITrackPushCacheService Task IsValidPushAsync(int subSystemId, int customId, string? latestPushTrackCode, string? trackCode); - - /// - /// 设置推送配置缓存 - /// - /// - /// 子系统id - /// 客户id - /// - Task?> SetPushContentConfigsAsync(int? id = null, int? subSystemId = null, - int? customId = null); } \ No newline at end of file diff --git a/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs b/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs index 88d6b079..bf365f28 100644 --- a/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs +++ b/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs @@ -1,5 +1,4 @@ -using System.Linq.Expressions; -using SJZY.Expand.ABP.Core; +using SJZY.Expand.ABP.Core; using SJZY.Track.Application.Contract.Dtos.TrackPush; using SJZY.Track.Application.Contract.Services; using SJZY.Track.Domain.Aggregates.TrackPushAggregate; @@ -22,11 +21,23 @@ public class TrackPushCacheService : ITrackPushCacheService, ITransientDependenc public async Task?> GetPushContentConfigsAsync(int subSystemId, int customId) { - var data = await RedisHelper.Client.GetAsync>( - TrackPushContentKey(subSystemId, customId)); + var exists = await RedisHelper.Client.ExistsAsync(TrackPushContentKey(subSystemId, customId)); + if (exists) + { + return await RedisHelper.Client.GetAsync>( + TrackPushContentKey(subSystemId, customId)); + } - data ??= await SetPushContentConfigsAsync(subSystemId: subSystemId, customId: customId); + return await SetPushContentConfigsAsync(subSystemId, customId); + } + public async Task?> SetPushContentConfigsAsync(int subSystemId, int customId) + { + // maybe is null + var data = await DoGetPushContentConfigsAsync(subSystemId, customId); + // ttl 3days + await RedisHelper.Client.SetAsync(TrackPushContentKey(subSystemId, customId), + data, 3 * 24 * 60 * 60); return data; } @@ -58,23 +69,23 @@ public class TrackPushCacheService : ITrackPushCacheService, ITransientDependenc return matched != null && matched.TrackCode == trackCode && matched.IsAutoPush ? matched : default; } - public async Task?> SetPushContentConfigsAsync(int? id = null, - int? subSystemId = null, - int? customId = null) + private async Task?> DoGetPushContentConfigsAsync(int subSystemId, int customId) { - Expression> exp = x => true; - if (id.HasValue) exp = x => x.Id == id; - else if (subSystemId.HasValue && customId.HasValue) - exp = x => x.SubSystemId == subSystemId && x.CustomId == customId; - - var trackPushConfig = await _trackPushConfigRepository.GetFirstAsync(exp, x => new + var trackPushConfig = await _trackPushConfigRepository.GetFirstAsync( + x => x.SubSystemId == subSystemId && x.CustomId == customId, x => new + { + x.Id, x.IsAutoPush, x.IsAllPush, x.IsCanDelete, x.IsCanUpdate, x.SubSystemId, x.CustomId + }); + if (trackPushConfig == null) { - x.Id, x.IsAutoPush, x.IsAllPush, x.IsCanDelete, x.IsCanUpdate, x.SubSystemId, x.CustomId - }); - if (trackPushConfig == null) return null; + return null; + } var trackPushContentList = await _trackPushConfigRepository.GetContentListAsync(trackPushConfig.Id); - if (trackPushContentList.Count == 0) return null; + if (trackPushContentList.Count == 0) + { + return null; + } // tips:hot path,auto mapper性能不如原生 var res = trackPushContentList.Select(item => new TrackPushContentConfigDto @@ -95,9 +106,6 @@ public class TrackPushCacheService : ITrackPushCacheService, ITransientDependenc ExpandFieldsValue = item.ExpandFieldsValue, }).ToList(); - await RedisHelper.Client.SetAsync(TrackPushContentKey(trackPushConfig.SubSystemId, trackPushConfig.CustomId), - res); - return res; } } \ No newline at end of file diff --git a/src/SJZY.Track.Application/Services/TrackPush/TrackPushService.cs b/src/SJZY.Track.Application/Services/TrackPush/TrackPushService.cs index 5225e8db..f7d69e1d 100644 --- a/src/SJZY.Track.Application/Services/TrackPush/TrackPushService.cs +++ b/src/SJZY.Track.Application/Services/TrackPush/TrackPushService.cs @@ -95,12 +95,17 @@ public class TrackPushService : ApplicationService throw new BusinessException(message: _stringLocalizer["IsTrackPushConfigAny"]); } + using var ts = TransactionScopeHelper.Create(); + switch (input.Options) { case OptionTypeNoNull.新增: { var trackPushEntity = ObjectMapper.Map(input); + await _trackPushConfigRepository.InsertReturnIdentityAsync(trackPushEntity); + await _trackPushCacheService.SetPushContentConfigsAsync(trackPushEntity.SubSystemId, + trackPushEntity.CustomId); } break; @@ -111,21 +116,19 @@ public class TrackPushService : ApplicationService ObjectMapper.Map(input, oldTrackPushEntity); await _trackPushConfigRepository.UpdateAsync(oldTrackPushEntity); - - if (input.IsAutoPush!.Value) await _trackPushCacheService.SetPushContentConfigsAsync(input.Id); + await _trackPushCacheService.SetPushContentConfigsAsync(oldTrackPushEntity.SubSystemId, + oldTrackPushEntity.CustomId); } break; case OptionTypeNoNull.删除: { - _ = await _trackPushConfigRepository.GetFirstAsync(x => x.Id == input.Id) ?? - throw new BusinessException(message: _stringLocalizer["NotFindData"]); + var entity = await _trackPushConfigRepository.GetFirstAsync(x => x.Id == input.Id) ?? + throw new BusinessException(message: _stringLocalizer["NotFindData"]); - using var ts = TransactionScopeHelper.Create(); await _trackPushConfigRepository.SoftDeleteAsync(x => x.Id == input.Id); await _trackPushConfigRepository.SoftDeleteContentAsync(x => x.TrackPushConfigId == input.Id); - - ts.Complete(); + await _trackPushCacheService.SetPushContentConfigsAsync(entity.SubSystemId, entity.CustomId); } break; @@ -134,6 +137,7 @@ public class TrackPushService : ApplicationService nameof(EditTrackPushConfigInput.Options)]); } + ts.Complete(); return true; } @@ -172,6 +176,10 @@ public class TrackPushService : ApplicationService throw new BusinessException(message: _stringLocalizer["IsTrackPushEnContentValueAny"]); } + var trackPushConfigId = input.TrackPushConfigId; + + using var ts = TransactionScopeHelper.Create(); + switch (input.Options) { case OptionTypeNoNull.新增: @@ -181,10 +189,7 @@ public class TrackPushService : ApplicationService var entity = ObjectMapper.Map(input); entity.Sort = maxSort + 1; - await _trackPushConfigRepository.InsertContentAsync(entity); - await _trackPushCacheService.SetPushContentConfigsAsync(input.TrackPushConfigId); - break; } @@ -194,10 +199,7 @@ public class TrackPushService : ApplicationService throw new BusinessException(message: _stringLocalizer["NotFindData"]); ObjectMapper.Map(input, entity); - await _trackPushConfigRepository.UpdateContentAsync(entity); - await _trackPushCacheService.SetPushContentConfigsAsync(entity.TrackPushConfigId); - break; } @@ -205,18 +207,10 @@ public class TrackPushService : ApplicationService { var entity = await _trackPushConfigRepository.GetContentByIdAsync(input.Id!.Value) ?? throw new BusinessException(message: _stringLocalizer["NotFindData"]); - - using (var ts = TransactionScopeHelper.Create()) - { - await _trackPushConfigRepository.SoftDeleteContentAsync(x => x.Id == input.Id); - await _trackPushConfigRepository.UpdateContentAsync(x => x.Sort == x.Sort - 1, - x => x.TrackPushConfigId == entity.TrackPushConfigId && x.Sort > entity.Sort); - - ts.Complete(); - } - - await _trackPushCacheService.SetPushContentConfigsAsync(entity.TrackPushConfigId); - + trackPushConfigId = entity.TrackPushConfigId; + await _trackPushConfigRepository.SoftDeleteContentAsync(x => x.Id == input.Id); + await _trackPushConfigRepository.UpdateContentAsync(x => x.Sort == x.Sort - 1, + x => x.TrackPushConfigId == entity.TrackPushConfigId && x.Sort > entity.Sort); break; } @@ -225,6 +219,14 @@ public class TrackPushService : ApplicationService nameof(EditTrackPushContentInput.Options)]); } + var pushConfig = await _trackPushConfigRepository.GetFirstAsync(x => x.Id == trackPushConfigId); + if (pushConfig != null) + { + await _trackPushCacheService.SetPushContentConfigsAsync(pushConfig.SubSystemId, pushConfig.CustomId); + } + + ts.Complete(); + return true; } @@ -247,8 +249,19 @@ public class TrackPushService : ApplicationService if (trackPushContentEntities.Count > 0) { + using var ts = TransactionScopeHelper.Create(); + await _trackPushConfigRepository.UpdateContentRangeAsync(trackPushContentEntities); - await _trackPushCacheService.SetPushContentConfigsAsync(trackPushContentEntities[0].TrackPushConfigId); + + var pushConfig = + await _trackPushConfigRepository.GetFirstAsync(x => + x.Id == trackPushContentEntities[0].TrackPushConfigId); + if (pushConfig != null) + { + await _trackPushCacheService.SetPushContentConfigsAsync(pushConfig.SubSystemId, pushConfig.CustomId); + } + + ts.Complete(); } return true; From f229371520ae8a90312974dd79bef48d07128387 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=86=9B?= <2357729423@qq.com> Date: Mon, 8 Apr 2024 14:20:37 +0800 Subject: [PATCH 06/22] =?UTF-8?q?fix=EF=BC=9A=E8=BD=A8=E8=BF=B9=E6=8E=A8?= =?UTF-8?q?=E9=80=81=E5=85=B7=E8=B1=A1=E5=AE=9E=E4=BD=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/TrackPush/TrackPushInput.cs | 20 +++++++++++ .../EventHandlers/TrackPushEventHandler.cs | 33 ++++++++++--------- 2 files changed, 37 insertions(+), 16 deletions(-) create mode 100644 src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushInput.cs diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushInput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushInput.cs new file mode 100644 index 00000000..7875d4da --- /dev/null +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushInput.cs @@ -0,0 +1,20 @@ +namespace SJZY.Track.Application.Contract.Dtos.TrackPush; + +public class TrackPushInput +{ + public string OrderNo { get; set; } = null!; + + public List Data { get; set; } = new(); +} + +public class TrackItem +{ + public string Location { get; set; } = null!; + public DateTime Date { get; set; } + public double TimeZone { get; set; } + public string? Description { get; set; } + public string? DescriptionCn { get; set; } + public string? Code { get; set; } + public string? Status { get; set; } + public string? Extra { get; set; } +} \ No newline at end of file diff --git a/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs index 68ad47d4..9ebea1f6 100644 --- a/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs @@ -1,5 +1,5 @@ using DotNetCore.CAP; -using Newtonsoft.Json.Linq; +using Newtonsoft.Json; using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.InterfaceRelay.Application.Contracts; using SJZY.Track.Application.Contract.Dtos.TrackPush; @@ -152,33 +152,33 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe private async Task DoAddAsync(TrackPushEvent @event, TrackPushContentConfigDto config, TrackPushRecordIndex log) { - var track = new + var track = new TrackItem { // 推真实的发生地和发生时间(时间是计算后的) - location = @event.TrackPlace, - date = @event.TrackTime.AddHours( + Location = @event.TrackPlace, + Date = @event.TrackTime.AddHours( config.TrackTimeZone ?? @event.TrackTimeZone - @event.TrackTimeZone), - timeZone = config.TrackTimeZone ?? @event.TrackTimeZone, - description = config.TrackEnContentValue, - description_cn = config.TrackContentValue, - code = config.TrackContentCodeValue, - status = config.TrackStatusValue, - extra = config.ExpandFieldsValue + TimeZone = config.TrackTimeZone ?? @event.TrackTimeZone, + Description = config.TrackEnContentValue, + DescriptionCn = config.TrackContentValue, + Code = config.TrackContentCodeValue, + Status = config.TrackStatusValue, + Extra = config.ExpandFieldsValue }; - JObject body = JObject.FromObject(new + var body = new TrackPushInput() { - orderNo = @event.OrderNo, - data = new[] { track } - }); + OrderNo = @event.OrderNo, + }; + body.Data.Add(track); if (config.IsAllPush) { var history = await _trackPushRecordsRepository.GetLatestTrackPushRecordAsync(@event.OrderId); if (history != default) { - body = JObject.Parse(history.PushContent); - ((JArray)body["data"]!).Add(JObject.FromObject(track)); + body = JsonConvert.DeserializeObject(history.PushContent); + body!.Data.Add(track); } } @@ -186,6 +186,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe config.ServiceProviderCode, body); log.PushContent = body.ToJson(); + log.IsSuccess = res.Code == InterfaceRelayConst.SuccessCode; log.RequestId = res.RequestId; log.Message = res.Msg; From 5a6b2a0f5d9535500a42466de2cab91b27efc435 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=86=9B?= <2357729423@qq.com> Date: Mon, 8 Apr 2024 18:42:51 +0800 Subject: [PATCH 07/22] =?UTF-8?q?change=EF=BC=9A=E5=8F=AA=E6=9C=89?= =?UTF-8?q?=E8=BD=A8=E8=BF=B9=E5=A2=9E=E5=88=A0=E6=94=B9=E5=81=9A=E5=B9=82?= =?UTF-8?q?=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/SJZY.Track.Application/EventHandlers/CAPFilter.cs | 5 +++-- .../EventHandlers/OrderLinkAfterFillTrackHandler.cs | 6 +----- .../Services/ProvideServices/TrackPullService.cs | 2 +- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/SJZY.Track.Application/EventHandlers/CAPFilter.cs b/src/SJZY.Track.Application/EventHandlers/CAPFilter.cs index d6186324..06bdeca3 100644 --- a/src/SJZY.Track.Application/EventHandlers/CAPFilter.cs +++ b/src/SJZY.Track.Application/EventHandlers/CAPFilter.cs @@ -20,8 +20,9 @@ public class CapFilter : SubscribeFilter { context.DeliverMessage.Headers["sjzy-receive-time"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff"); - // 轨迹刷新不做幂等 - if (context.DeliverMessage.Headers["cap-msg-name"]!.EndsWith(GlobalConst.TrackRefreshSubscribe)) + // 轨迹增删改要做幂等 + if (!context.DeliverMessage.Headers["cap-msg-name"] + .IsIn(GlobalConst.TrackUpsertSubscribe, GlobalConst.TrackDeleteSubscribe)) return Task.CompletedTask; // 本地调试不做幂等 diff --git a/src/SJZY.Track.Application/EventHandlers/OrderLinkAfterFillTrackHandler.cs b/src/SJZY.Track.Application/EventHandlers/OrderLinkAfterFillTrackHandler.cs index 2d8a0ef5..37daa472 100644 --- a/src/SJZY.Track.Application/EventHandlers/OrderLinkAfterFillTrackHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/OrderLinkAfterFillTrackHandler.cs @@ -1,6 +1,5 @@ using DotNetCore.CAP; using SJZY.Track.Application.Contract.Events; -using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Consts; using Volo.Abp.DependencyInjection; @@ -11,14 +10,11 @@ public class OrderLinkAfterFillTrackHandler : ITransientDependency, ICapSubscrib { private readonly ITrackDetailsRepository _trackDetailsRepository; private readonly ICapPublisher _capPublisher; - private readonly IOrderRepository _orderRepository; - public OrderLinkAfterFillTrackHandler(ITrackDetailsRepository trackDetailsRepository, ICapPublisher capPublisher, - IOrderRepository orderRepository) + public OrderLinkAfterFillTrackHandler(ITrackDetailsRepository trackDetailsRepository, ICapPublisher capPublisher) { _trackDetailsRepository = trackDetailsRepository; _capPublisher = capPublisher; - _orderRepository = orderRepository; } [CapSubscribe(GlobalConst.OrderLinkAfterFillTrack)] diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackPullService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackPullService.cs index d7b0bc94..7cf315b2 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackPullService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackPullService.cs @@ -64,7 +64,7 @@ public class TrackPullService : ApplicationService var attach = Base64Helper.SerializeObject(group.Key); // 批量获取轨迹 - await _httpClientProxy.Service.BatchForwardThenPushToQueueAsync( + var _ = await _httpClientProxy.Service.BatchForwardThenPushToQueueAsync( "A012", serviceProviderCode, data, GlobalConst.TrackRefreshSubscribe, attach); } From c5212f53f0f7d9bc65f5a9c92ab3426a29a13816 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=86=9B?= <2357729423@qq.com> Date: Mon, 8 Apr 2024 19:11:24 +0800 Subject: [PATCH 08/22] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E9=80=9Av7.1.9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/SJZY.Track.Application/SJZY.Track.Application.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SJZY.Track.Application/SJZY.Track.Application.csproj b/src/SJZY.Track.Application/SJZY.Track.Application.csproj index 172e83f5..99912fb3 100644 --- a/src/SJZY.Track.Application/SJZY.Track.Application.csproj +++ b/src/SJZY.Track.Application/SJZY.Track.Application.csproj @@ -12,7 +12,7 @@ - + From 4fbbbd0566546255d0fc1a831aef63afe5194531 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=86=9B?= <2357729423@qq.com> Date: Mon, 8 Apr 2024 19:37:35 +0800 Subject: [PATCH 09/22] =?UTF-8?q?fix=EF=BC=9A=E3=80=90=E3=80=90=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E8=AE=A2=E5=8D=95-=E6=8E=A8=E9=80=81=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E3=80=91=E8=BD=A8=E8=BF=B9=E5=8F=91=E7=94=9F=E6=97=B6?= =?UTF-8?q?=E5=8C=BA=E9=9C=80=E8=B0=83=E6=95=B4=E4=B8=BA=E6=A0=BC=E6=9E=97?= =?UTF-8?q?=E5=B0=BC=E6=B2=BB=E6=A0=87=E5=87=86=E6=97=B6=E9=97=B4=EF=BC=88?= =?UTF-8?q?GTM=EF=BC=89=E3=80=91https://www.tapd.cn/60863849/bugtrace/bugs?= =?UTF-8?q?/view=3Fbug=5Fid=3D1160863849001032649?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/TrackOrder/TrackPushRecordOutput.cs | 75 +++++++++++++++++++ .../AutoMapper/OrderAutoMapperProfile.cs | 4 + .../Services/TrackOrders/TrackOrderService.cs | 16 +++- 3 files changed, 93 insertions(+), 2 deletions(-) create mode 100644 src/SJZY.Track.Application.Contract/Dtos/TrackOrder/TrackPushRecordOutput.cs diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackOrder/TrackPushRecordOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackOrder/TrackPushRecordOutput.cs new file mode 100644 index 00000000..bc136ca0 --- /dev/null +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackOrder/TrackPushRecordOutput.cs @@ -0,0 +1,75 @@ +namespace SJZY.Track.Application.Contract.Dtos.TrackOrder; + +public class TrackPushRecordOutput +{ + /// + /// 订单Id + /// + public int OrderId { get; set; } + + /// + /// 接口通请求Id + /// + public Guid RequestId { get; set; } + + /// + /// 信息 + /// + public string Message { get; set; } = null!; + + /// + /// 操作类型 + /// + public string OptionType { get; set; } = null!; + + /// + /// 轨迹状态 + /// + public string TrackStatus { get; set; } = null!; + + /// + /// 轨迹内容代码 + /// + public string TrackCode { get; set; } = null!; + + /// + /// 轨迹内容 + /// + public string TrackContent { get; set; } = null!; + + /// + /// 轨迹发生地 + /// + public string TrackPlace { get; set; } = null!; + + /// + /// 轨迹发生时间 + /// + public DateTime TrackTime { get; set; } + + /// + /// 轨迹发生时区 + /// + public float TrackTimeZone { get; set; } + + /// + /// 轨迹发生时区 + /// + public string TrackGTMTimeZone { get; set; } = null!; + + /// + /// 是否成功 + /// + public bool IsSuccess { get; set; } + + /// + /// 推送内容(json) + /// + public string PushContent { get; set; } = null!; + + /// 创建人 + public string? CreateUser { get; set; } + + /// 创建时间 + public DateTime CreateTime { get; set; } +} \ No newline at end of file diff --git a/src/SJZY.Track.Application/AutoMapper/OrderAutoMapperProfile.cs b/src/SJZY.Track.Application/AutoMapper/OrderAutoMapperProfile.cs index 8befae94..dbe6b8f6 100644 --- a/src/SJZY.Track.Application/AutoMapper/OrderAutoMapperProfile.cs +++ b/src/SJZY.Track.Application/AutoMapper/OrderAutoMapperProfile.cs @@ -1,8 +1,10 @@ using AutoMapper; using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.Track.Application.Contract.Dtos.ProvideServices; +using SJZY.Track.Application.Contract.Dtos.TrackOrder; using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; +using SJZY.Track.Domain.Aggregates.TrackPushAggregate; using SJZY.Track.Domain.Dtos.Order; using SJZY.Track.Domain.Enums; using Volo.Abp.AutoMapper; @@ -34,6 +36,8 @@ public class OrderAutoMapperProfile : Profile .ForMember(dest => dest.Content, opt => opt.MapFrom(m => m.TrackContent)) .ForMember(dest => dest.EnContent, opt => opt.MapFrom(m => m.TrackEnContent)) .ForMember(dest => dest.TrackTimeZoneValue, opt => opt.MapFrom(m => m.TrackTimeZone)); + + CreateMap(MemberList.None); } /// diff --git a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs index 5f3c1179..477456cb 100644 --- a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs +++ b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs @@ -160,8 +160,20 @@ public class TrackOrderService : ApplicationService /// /// 订单id [HttpGet("GetTrackPushRecords")] - public async Task> GetTrackPushRecordsAsync(int orderId) + public async Task> GetTrackPushRecordsAsync(int orderId) { - return await _trackPushRecordsRepository.GetTrackPushRecordsAsync(orderId); + var records = await _trackPushRecordsRepository.GetTrackPushRecordsAsync(orderId); + + var res = ObjectMapper.Map, List>(records); + + res.ForEach(x => + { + int hours = (int)x.TrackTimeZone; // 提取整数部分作为小时 + int minutes = (int)((x.TrackTimeZone - hours) * 60); // 将小数部分乘以 60 转换为分钟 + x.TrackGTMTimeZone = + $"GTM {(x.TrackTimeZone >= 0 ? "+" : "-")}{new TimeSpan(hours, minutes, 0).ToString().RemovePostFix(":00")}"; + }); + + return res; } } \ No newline at end of file From d7cfd153b259b2cc07dac80a2d93a592125a0676 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, 9 Apr 2024 14:33:40 +0800 Subject: [PATCH 10/22] =?UTF-8?q?opt=EF=BC=9A=E4=BC=98=E5=8C=96null=20?= =?UTF-8?q?=E7=BC=93=E5=AD=985s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/TrackPush/TrackPushCacheService.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs b/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs index bf365f28..eb4c2504 100644 --- a/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs +++ b/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs @@ -35,9 +35,11 @@ public class TrackPushCacheService : ITrackPushCacheService, ITransientDependenc { // maybe is null var data = await DoGetPushContentConfigsAsync(subSystemId, customId); + var ttl = 3 * 24 * 60 * 60; + if (data == null) ttl = 5; // ttl 3days await RedisHelper.Client.SetAsync(TrackPushContentKey(subSystemId, customId), - data, 3 * 24 * 60 * 60); + data, ttl); return data; } From 9ddba4f5619c4ca2ac3b7647e99713a6ddeecfc4 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, 9 Apr 2024 14:38:26 +0800 Subject: [PATCH 11/22] =?UTF-8?q?fix=EF=BC=9A=E6=89=8B=E5=8A=A8=20?= =?UTF-8?q?=E5=85=A8=E9=87=8F=20=E6=8E=A8=E9=80=81=20=E6=A0=A1=E9=AA=8Cbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EventHandlers/TrackPushEventHandler.cs | 4 ++++ .../Services/TrackPush/TrackPushCacheService.cs | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs index 9ebea1f6..a9a207e9 100644 --- a/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs @@ -70,6 +70,10 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe // 推送新增,需要根据上一次的推送 推断 本次推送 是否可行 config = await _trackPushCacheService.IsValidPushAsync(order.SubSystemId, order.CustomId, order.LatestPushTrackCode, @event.TrackCode); + if (config is not { IsAutoPush: true }) + { + config = null; + } } } else diff --git a/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs b/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs index eb4c2504..e5d413f4 100644 --- a/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs +++ b/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs @@ -68,7 +68,7 @@ public class TrackPushCacheService : ITrackPushCacheService, ITransientDependenc // find swap cache.FirstOrDefault(x => x.TrackCode == cache[idx + 1].SwapTrackCode); - return matched != null && matched.TrackCode == trackCode && matched.IsAutoPush ? matched : default; + return matched != null && matched.TrackCode == trackCode ? matched : default; } private async Task?> DoGetPushContentConfigsAsync(int subSystemId, int customId) From f1a48cc9a60c269add9c2f459c5988559fc4d12f Mon Sep 17 00:00:00 2001 From: moyongzhen <2534173414@qq.com> Date: Wed, 10 Apr 2024 15:04:30 +0800 Subject: [PATCH 12/22] =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E8=BD=A8=E8=BF=B9=20?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E5=8F=82=E6=95=B0=E8=B0=83=E6=95=B4=E6=88=90?= =?UTF-8?q?UnifyResultDto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/SJZY.Track.Application.Contract/Services/ITrackService.cs | 2 +- .../Services/ProvideServices/TrackService.Query.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Services/ITrackService.cs b/src/SJZY.Track.Application.Contract/Services/ITrackService.cs index 31dae617..904f834d 100644 --- a/src/SJZY.Track.Application.Contract/Services/ITrackService.cs +++ b/src/SJZY.Track.Application.Contract/Services/ITrackService.cs @@ -31,5 +31,5 @@ public interface ITrackService : IRemoteService /// /// /// - Task> QueryAsync(GetTrackInput input); + Task QueryAsync(GetTrackInput input); } \ No newline at end of file diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs index 3864b604..74f4e52f 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs @@ -17,7 +17,7 @@ public partial class TrackService /// /// [HttpPost("Track/Query")] - public async Task> QueryAsync(GetTrackInput input) + public async Task QueryAsync(GetTrackInput input) { if (input.OrderNos.Count > 500) { @@ -50,7 +50,7 @@ public partial class TrackService await TrackDetailSort(res, input); - return res; + return new UnifyResultDto(true, res, "操作成功"); } private async Task TrackDetailSort(List list, GetTrackInput input) From 636f189e50de0c4207efc88309c473182dda1598 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=86=9B?= <2357729423@qq.com> Date: Wed, 10 Apr 2024 15:22:17 +0800 Subject: [PATCH 13/22] =?UTF-8?q?version=EF=BC=9A7.0.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SJZY.Track.Application.Contract.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 1b129506..7f1f52a3 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 - 7.0.0 + 7.0.1 True From 8e9f5931e4916d3751a8ed0703090a6b362deabc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=86=9B?= <2357729423@qq.com> Date: Wed, 10 Apr 2024 15:27:52 +0800 Subject: [PATCH 14/22] =?UTF-8?q?opt=EF=BC=9A=E8=BD=A8=E8=BF=B9=E6=8E=A8?= =?UTF-8?q?=E9=80=81=E5=90=8E=E6=9B=B4=E6=96=B0=E8=AE=A2=E5=8D=95=E5=90=88?= =?UTF-8?q?=E5=B9=B6=E5=88=B0=E6=8E=A8=E9=80=81=E5=A4=84=E7=90=86=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TrackPushAfterUpdateOrderEventHandler.cs | 50 ------------------- 1 file changed, 50 deletions(-) delete mode 100644 src/SJZY.Track.Application/EventHandlers/TrackPushAfterUpdateOrderEventHandler.cs diff --git a/src/SJZY.Track.Application/EventHandlers/TrackPushAfterUpdateOrderEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackPushAfterUpdateOrderEventHandler.cs deleted file mode 100644 index a6c65fdd..00000000 --- a/src/SJZY.Track.Application/EventHandlers/TrackPushAfterUpdateOrderEventHandler.cs +++ /dev/null @@ -1,50 +0,0 @@ -using DotNetCore.CAP; -using SJZY.Track.Application.Contract.Dtos.TrackPush; -using SJZY.Track.Domain.Aggregates.OrderAggregate; -using SJZY.Track.Domain.Consts; -using SJZY.Track.Domain.Enums; -using Volo.Abp.DependencyInjection; - -namespace SJZY.Track.Application.EventHandlers; - -public class TrackPushAfterUpdateOrderEventHandler : ITransientDependency, ICapSubscribe -{ - private readonly IOrderRepository _orderRepository; - - public TrackPushAfterUpdateOrderEventHandler(IOrderRepository orderRepository) - { - _orderRepository = orderRepository; - } - - [CapSubscribe(GlobalConst.TrackPushAfterUpdateOrderSubscribe)] - public async Task ConsumerAsync(TrackPushAfterUpdateOrderDto dto) - { - var order = await _orderRepository.GetFirstAsync(x => x.Id == dto.OrderId); - if (order == default) return; - - /* - * 异常:最近一条推送是失败 - */ - if (!dto.IsSuccess) - { - order.QuestionType = (int)TrackProblemType.Error; - order.LatestPushError = dto.Message; - } - else - { - order.QuestionType = (int)TrackProblemType.None; - order.LatestPushError = null; - if (dto.OptionType == OptionType.新增) - { - // tips:只有新增会影响推送进度 - order.LatestPushTrackCode = dto.TrackCode; - order.LatestPushTime = DateTime.Now; - } - } - - await _orderRepository.UpdateColumnAsync(order, x => new - { - x.LatestPushTrackCode, x.QuestionType, x.LatestPushError, x.LatestPushTime - }); - } -} \ No newline at end of file From 6ef5ba86cf9f0e6cdc34807bb1910d8dd9a679b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=86=9B?= <2357729423@qq.com> Date: Wed, 10 Apr 2024 19:18:18 +0800 Subject: [PATCH 15/22] =?UTF-8?q?opt=EF=BC=9A=E5=BC=80=E5=90=AFcap?= =?UTF-8?q?=E5=A4=9A=E7=BA=BF=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/SJZY.Track.Application/SjzyTrackApplicationModule.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs b/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs index f9f5633a..26725fbd 100644 --- a/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs +++ b/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs @@ -84,7 +84,13 @@ namespace SJZY.Track.Application configure.UserName = configuration["RabbitMQ:UserName"]!; configure.Password = configuration["RabbitMQ:Password"]!; configure.Port = configuration.GetValue("RabbitMQ:Port"); + configure.BasicQosOptions = + new RabbitMQOptions.BasicQos(configuration.GetValue("CAP:PrefetchCount")); }); + options.FailedRetryInterval = configuration.GetValue("CAP:FailedRetryInterval"); + options.FailedRetryCount = configuration.GetValue("CAP:FailedRetryCount"); + options.UseDispatchingPerGroup = configuration.GetValue("CAP:UseDispatchingPerGroup"); + options.ConsumerThreadCount = configuration.GetValue("CAP:ConsumerThreadCount"); // options.TopicNamePrefix = "v1"; options.SucceedMessageExpiredAfter = 6 * 60 * 60; From 80e1db40b2a0a1d17c027bed214eb0c50577d383 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=86=9B?= <2357729423@qq.com> Date: Wed, 10 Apr 2024 19:21:37 +0800 Subject: [PATCH 16/22] attach --- src/SJZY.Track.Application/SjzyTrackApplicationModule.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs b/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs index 26725fbd..c7be9ea2 100644 --- a/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs +++ b/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs @@ -87,15 +87,13 @@ namespace SJZY.Track.Application configure.BasicQosOptions = new RabbitMQOptions.BasicQos(configuration.GetValue("CAP:PrefetchCount")); }); + // options.TopicNamePrefix = "v1"; options.FailedRetryInterval = configuration.GetValue("CAP:FailedRetryInterval"); options.FailedRetryCount = configuration.GetValue("CAP:FailedRetryCount"); options.UseDispatchingPerGroup = configuration.GetValue("CAP:UseDispatchingPerGroup"); options.ConsumerThreadCount = configuration.GetValue("CAP:ConsumerThreadCount"); + options.SucceedMessageExpiredAfter = configuration.GetValue("CAP:SucceedMessageExpiredAfter"); - // options.TopicNamePrefix = "v1"; - options.SucceedMessageExpiredAfter = 6 * 60 * 60; - options.FailedRetryInterval = 60; - options.FailedRetryCount = 3; options.UseDashboard(dashboardOptions => { dashboardOptions.PathBase = System.Diagnostics.Debugger.IsAttached From 8c81406e6e2a669156b8170f10f44c3007d74884 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=86=9B?= <2357729423@qq.com> Date: Wed, 10 Apr 2024 19:51:07 +0800 Subject: [PATCH 17/22] =?UTF-8?q?=E6=B5=8B=E8=AF=95cap=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/SJZY.Track.Application/SjzyTrackApplicationModule.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs b/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs index c7be9ea2..d479f7f8 100644 --- a/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs +++ b/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs @@ -93,6 +93,8 @@ namespace SJZY.Track.Application options.UseDispatchingPerGroup = configuration.GetValue("CAP:UseDispatchingPerGroup"); options.ConsumerThreadCount = configuration.GetValue("CAP:ConsumerThreadCount"); options.SucceedMessageExpiredAfter = configuration.GetValue("CAP:SucceedMessageExpiredAfter"); + options.UseDispatchingPerGroup = true; + options.EnableConsumerPrefetch = true; options.UseDashboard(dashboardOptions => { From 93417db5229975eb5c84a1e6b3978be884dc83ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=86=9B?= <2357729423@qq.com> Date: Wed, 10 Apr 2024 19:51:46 +0800 Subject: [PATCH 18/22] 1 --- src/SJZY.Track.Application/SjzyTrackApplicationModule.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs b/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs index d479f7f8..4e8f5fff 100644 --- a/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs +++ b/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs @@ -90,7 +90,6 @@ namespace SJZY.Track.Application // options.TopicNamePrefix = "v1"; options.FailedRetryInterval = configuration.GetValue("CAP:FailedRetryInterval"); options.FailedRetryCount = configuration.GetValue("CAP:FailedRetryCount"); - options.UseDispatchingPerGroup = configuration.GetValue("CAP:UseDispatchingPerGroup"); options.ConsumerThreadCount = configuration.GetValue("CAP:ConsumerThreadCount"); options.SucceedMessageExpiredAfter = configuration.GetValue("CAP:SucceedMessageExpiredAfter"); options.UseDispatchingPerGroup = true; From 3aecf92eb7ddf56b1684fedfa271933dbbd8ef15 Mon Sep 17 00:00:00 2001 From: moyongzhen <2534173414@qq.com> Date: Thu, 11 Apr 2024 15:14:01 +0800 Subject: [PATCH 19/22] =?UTF-8?q?=E8=BD=A8=E8=BF=B9=E6=8E=A8=E9=80=81?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E5=85=B3=E7=B3=BB=E5=AF=B9=E5=A4=96=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../QueryTrackPullMappingsInput.cs | 60 +++++++++++++++++++ .../TrackPushConfigAutoMapperProfile.cs | 22 +++++++ .../ProvideServices/TrackPushConfigService.cs | 44 ++++++++++++++ .../ITrackPushConfigRepository.cs | 1 + .../TrackPush/QueryTrackPullMappingsInfoVO.cs | 60 +++++++++++++++++++ .../Repositories/TrackPushConfigRepository.cs | 25 ++++++++ 6 files changed, 212 insertions(+) create mode 100644 src/SJZY.Track.Application.Contract/Dtos/ProvideServices/QueryTrackPullMappingsInput.cs create mode 100644 src/SJZY.Track.Application/AutoMapper/TrackPushConfigAutoMapperProfile.cs create mode 100644 src/SJZY.Track.Application/Services/ProvideServices/TrackPushConfigService.cs create mode 100644 src/SJZY.Track.Domain/Dtos/TrackPush/QueryTrackPullMappingsInfoVO.cs diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/QueryTrackPullMappingsInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/QueryTrackPullMappingsInput.cs new file mode 100644 index 00000000..ed0e9da4 --- /dev/null +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/QueryTrackPullMappingsInput.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SJZY.Track.Application.Contract.Dtos.ProvideServices +{ + /// + /// 查询轨迹推送映射关系入参 + /// + public class QueryTrackPullMappingsInput + { + /// + /// 子系统id + /// + public int SubsystemsId { get; set; } + + /// + /// 客户id + /// + public int CustomerId { get; set; } + } + + /// + /// 查询轨迹推送映射关系返参项 + /// + public class QueryTrackPullMappingsInfo + { + /// + /// 轨迹代码 + /// + public string? Code { get; set; } + + /// + /// 订单类型 + /// + public int OrderType { get; set; } + + /// + /// 服务商轨迹代码 + /// + public string? ServiceCode { get; set; } + + /// + /// 服务商轨迹状态 + /// + public string? Status { get; set; } + + /// + /// 服务商轨迹内容 + /// + public string? Content { get; set; } + + /// + /// 服务商轨迹内容英文 + /// + public string? ContentEn { get; set; } + } +} diff --git a/src/SJZY.Track.Application/AutoMapper/TrackPushConfigAutoMapperProfile.cs b/src/SJZY.Track.Application/AutoMapper/TrackPushConfigAutoMapperProfile.cs new file mode 100644 index 00000000..7cb8ccd2 --- /dev/null +++ b/src/SJZY.Track.Application/AutoMapper/TrackPushConfigAutoMapperProfile.cs @@ -0,0 +1,22 @@ +using AutoMapper; +using SJZY.Track.Application.Contract.Dtos.ProvideServices; +using SJZY.Track.Application.Contract.Dtos.TrackPush; +using SJZY.Track.Domain.Aggregates.TrackPushAggregate; +using SJZY.Track.Domain.Dtos.TrackPush; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SJZY.Track.Application.AutoMapper +{ + public class TrackPushConfigAutoMapperProfile : Profile + { + public TrackPushConfigAutoMapperProfile() + { + CreateMap(MemberList.None); + CreateMap(MemberList.None); + } + } +} diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackPushConfigService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackPushConfigService.cs new file mode 100644 index 00000000..4a575526 --- /dev/null +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackPushConfigService.cs @@ -0,0 +1,44 @@ +using SJZY.Track.Application.Contract.Dtos.ProvideServices; +using SJZY.Track.Domain.Aggregates.TrackPushAggregate; +using SJZY.Track.Domain.Dtos.TrackPush; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp.ObjectMapping; + +namespace SJZY.Track.Application.Services.ProvideServices +{ + /// + /// 轨迹推送配置服务 + /// + [ApiExplorerSettings(GroupName = "提供接口")] + [Route("/ProviderService")] + public class TrackPushConfigService : ApplicationService + { + private readonly ITrackPushConfigRepository _trackPushConfigRepository; + + public TrackPushConfigService( + ITrackPushConfigRepository trackPushConfigRepository + ) + { + _trackPushConfigRepository = trackPushConfigRepository; + } + + /// + /// 查询轨迹推送配置关系 + /// + /// + /// + [HttpPost("Track/QueryTrackPullMappings")] + public async Task QueryTrackPullMappingsAsync(QueryTrackPullMappingsInput input) + { + var vo = ObjectMapper.Map(input); + var result = await _trackPushConfigRepository.QueryTrackPullMappingsAsync(vo); + var output = ObjectMapper.Map, List>(result); + + return new UnifyResultDto(true, output, "操作成功"); + } + } +} diff --git a/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/ITrackPushConfigRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/ITrackPushConfigRepository.cs index 641fb386..3983cd7c 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/ITrackPushConfigRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/ITrackPushConfigRepository.cs @@ -35,4 +35,5 @@ public interface ITrackPushConfigRepository : IBasicRepository UpdateContentAsync(Expression> columns, Expression> whereExpression); + Task> QueryTrackPullMappingsAsync(QueryTrackPullMappingsInputVO input); } \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Dtos/TrackPush/QueryTrackPullMappingsInfoVO.cs b/src/SJZY.Track.Domain/Dtos/TrackPush/QueryTrackPullMappingsInfoVO.cs new file mode 100644 index 00000000..26f7b4a8 --- /dev/null +++ b/src/SJZY.Track.Domain/Dtos/TrackPush/QueryTrackPullMappingsInfoVO.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SJZY.Track.Domain.Dtos.TrackPush +{ + /// + /// 查询轨迹推送关系入参 + /// + public class QueryTrackPullMappingsInfoVO + { + /// + /// 轨迹代码 + /// + public string? Code { get; set; } + + /// + /// 订单类型 + /// + public int OrderType { get; set; } + + /// + /// 服务商轨迹代码 + /// + public string? ServiceCode { get; set; } + + /// + /// 服务商轨迹状态 + /// + public string? Status { get; set; } + + /// + /// 服务商轨迹内容 + /// + public string? Content { get; set; } + + /// + /// 服务商轨迹内容英文 + /// + public string? ContentEn { get; set; } + } + + /// + /// 查询轨迹推送关系返参项 + /// + public class QueryTrackPullMappingsInputVO + { + /// + /// 子系统id + /// + public int SubsystemsId { get; set; } + + /// + /// 客户id + /// + public int CustomerId { get; set; } + } +} diff --git a/src/SJZY.Track.Repository/Repositories/TrackPushConfigRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackPushConfigRepository.cs index 43bbae70..c7e21820 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackPushConfigRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackPushConfigRepository.cs @@ -166,4 +166,29 @@ public class TrackPushConfigRepository : BasicRepository, return await Context.Updateable().SetColumns(columns).Where(whereExpression) .ExecuteCommandHasChangeAsync(); } + + /// + /// 查询轨迹推送关系 + /// + /// + /// + public async Task> QueryTrackPullMappingsAsync(QueryTrackPullMappingsInputVO input) + { + var result = await Context.Queryable().LeftJoin((a, b) => a.Id == b.TrackPushConfigId && !b.IsDeleted) + .LeftJoin((a, b, c) => b.TrackContentId == c.Id && !c.IsDeleted) + .Where((a, b, c) => !a.IsDeleted) + .Where((a, b, c) => a.SubSystemId == input.SubsystemsId && a.CustomId == input.CustomerId) + .Select((a, b, c) => new QueryTrackPullMappingsInfoVO + { + Code = c.Code, + OrderType = b.OrderNoType, + ServiceCode = b.TrackContentCodeValue, + Status = b.TrackStatusValue, + Content = b.TrackContentValue, + ContentEn = b.TrackEnContentValue + }) + .ToListAsync(); + + return result; + } } \ No newline at end of file From c2c1e24dcf5089fbeb0a6829efc5efbe540f8997 Mon Sep 17 00:00:00 2001 From: moyongzhen <2534173414@qq.com> Date: Thu, 11 Apr 2024 15:21:38 +0800 Subject: [PATCH 20/22] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=AF=B9=E5=A4=96?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/ITrackPushConfigService.cs | 20 +++++++++++++++++++ .../ProvideServices/TrackPushConfigService.cs | 3 ++- 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 src/SJZY.Track.Application.Contract/Services/ITrackPushConfigService.cs diff --git a/src/SJZY.Track.Application.Contract/Services/ITrackPushConfigService.cs b/src/SJZY.Track.Application.Contract/Services/ITrackPushConfigService.cs new file mode 100644 index 00000000..e191f6bb --- /dev/null +++ b/src/SJZY.Track.Application.Contract/Services/ITrackPushConfigService.cs @@ -0,0 +1,20 @@ +using SJZY.Track.Application.Contract.Dtos.ProvideServices; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp; + +namespace SJZY.Track.Application.Contract.Services +{ + public interface ITrackPushConfigService : IRemoteService + { + /// + /// 查询轨迹推送配置关系 + /// + /// + /// + Task QueryTrackPullMappingsAsync(QueryTrackPullMappingsInput input); + } +} diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackPushConfigService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackPushConfigService.cs index 4a575526..04a8ea53 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackPushConfigService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackPushConfigService.cs @@ -1,4 +1,5 @@ using SJZY.Track.Application.Contract.Dtos.ProvideServices; +using SJZY.Track.Application.Contract.Services; using SJZY.Track.Domain.Aggregates.TrackPushAggregate; using SJZY.Track.Domain.Dtos.TrackPush; using System; @@ -15,7 +16,7 @@ namespace SJZY.Track.Application.Services.ProvideServices /// [ApiExplorerSettings(GroupName = "提供接口")] [Route("/ProviderService")] - public class TrackPushConfigService : ApplicationService + public class TrackPushConfigService : ApplicationService, ITrackPushConfigService { private readonly ITrackPushConfigRepository _trackPushConfigRepository; From 0408ab8e136d65b1715767e7b8ee144ba3d5bf08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=86=9B?= <2357729423@qq.com> Date: Thu, 11 Apr 2024 15:31:35 +0800 Subject: [PATCH 21/22] =?UTF-8?q?version=EF=BC=9A7.0.2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SJZY.Track.Application.Contract.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 7f1f52a3..7a7f7902 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 - 7.0.1 + 7.0.2 True From 2bedb127b6087b8e0077a608c34916a180e8a613 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=86=9B?= <2357729423@qq.com> Date: Fri, 12 Apr 2024 21:34:15 +0800 Subject: [PATCH 22/22] =?UTF-8?q?opt=EF=BC=9A=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Events/OrderIdentifier.cs | 8 + .../Events/OrderLinkAfterFillTrackEvent.cs | 28 -- .../TrackChangeAfterUpdateOrderEvent.cs | 2 +- .../Events/TrackDeleteEvent.cs | 19 +- .../Events/TrackRefreshStruct.cs | 25 ++ .../Events/TrackUpsertEvent.cs | 46 +--- .../Events/TrackUpsertForRefreshEvent.cs | 94 +++++++ .../OrderLinkAfterFillTrackHandler.cs | 48 ---- ...TrackChangeAfterUpdateOrderEventHandler.cs | 85 +++--- .../EventHandlers/TrackDeleteEventHandler.cs | 71 ++--- .../TrackInsertForNotMappedEventHandler.cs | 2 +- .../EventHandlers/TrackPushEventHandler.cs | 9 +- .../EventHandlers/TrackRefreshEventHandler.cs | 44 ++- .../EventHandlers/TrackUpsertEventHandler.cs | 257 ++++++++++-------- .../ProvideServices/OrderService.Link.cs | 52 ++-- .../Services/ProvideServices/OrderService.cs | 4 +- .../Services/ProvideServices/TrackService.cs | 30 +- .../OrderAggregate/IOrderRepository.cs | 2 +- .../ITrackDetailsRepository.cs | 22 +- .../Consts/GlobalConst.MQ.cs | 5 + src/SJZY.Track.Repository/EsExtensions.cs | 22 ++ .../Repositories/OrderRepository.cs | 6 +- .../Repositories/TrackDetailsRepository.cs | 121 +++++---- 23 files changed, 568 insertions(+), 434 deletions(-) create mode 100644 src/SJZY.Track.Application.Contract/Events/OrderIdentifier.cs delete mode 100644 src/SJZY.Track.Application.Contract/Events/OrderLinkAfterFillTrackEvent.cs create mode 100644 src/SJZY.Track.Application.Contract/Events/TrackRefreshStruct.cs create mode 100644 src/SJZY.Track.Application.Contract/Events/TrackUpsertForRefreshEvent.cs delete mode 100644 src/SJZY.Track.Application/EventHandlers/OrderLinkAfterFillTrackHandler.cs create mode 100644 src/SJZY.Track.Repository/EsExtensions.cs diff --git a/src/SJZY.Track.Application.Contract/Events/OrderIdentifier.cs b/src/SJZY.Track.Application.Contract/Events/OrderIdentifier.cs new file mode 100644 index 00000000..49e79b04 --- /dev/null +++ b/src/SJZY.Track.Application.Contract/Events/OrderIdentifier.cs @@ -0,0 +1,8 @@ +namespace SJZY.Track.Application.Contract.Events; + +public struct OrderIdentifier +{ + public int OrderId { get; set; } + public string OrderNo { get; set; } + public int OrderType { get; set; } +} \ No newline at end of file diff --git a/src/SJZY.Track.Application.Contract/Events/OrderLinkAfterFillTrackEvent.cs b/src/SJZY.Track.Application.Contract/Events/OrderLinkAfterFillTrackEvent.cs deleted file mode 100644 index f4caa481..00000000 --- a/src/SJZY.Track.Application.Contract/Events/OrderLinkAfterFillTrackEvent.cs +++ /dev/null @@ -1,28 +0,0 @@ -namespace SJZY.Track.Application.Contract.Events; - -public class OrderLinkAfterFillTrackEvent -{ - /// - /// 关联订单id - /// - public int OrderId { get; set; } - - /// - /// 子系统id - /// - public int SubSystemId { get; set; } - - /// - /// 关联订单 - /// - public List LinkedOrders { get; set; } = null!; -} - -public struct LinkedOrder -{ - public int SubSystemId { get; set; } - - public int OrderId { get; set; } - public string OrderNo { get; set; } - public int OrderType { get; set; } -} \ No newline at end of file diff --git a/src/SJZY.Track.Application.Contract/Events/TrackChangeAfterUpdateOrderEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackChangeAfterUpdateOrderEvent.cs index c779a647..544c98b1 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackChangeAfterUpdateOrderEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackChangeAfterUpdateOrderEvent.cs @@ -5,7 +5,7 @@ public class TrackChangeAfterUpdateOrderEvent /// /// 订单Id /// - public int OrderId { get; set; } + public int[] OrderIds { get; set; } /// /// 是否删除引起的更新 diff --git a/src/SJZY.Track.Application.Contract/Events/TrackDeleteEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackDeleteEvent.cs index d5286726..73b4d0ac 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackDeleteEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackDeleteEvent.cs @@ -2,25 +2,20 @@ public class TrackDeleteEvent { - /// - /// 订单id - /// - public int OrderId { get; set; } - - /// - /// 轨迹代码 - /// - public List TrackCodes { get; set; } = null!; - /// /// 子系统id /// public int SubSystemId { get; set; } /// - /// 上游子系统id + /// 订单ids /// - public int UpSubSystemId { get; set; } + public int[] OrderIds { get; set; } = null!; + + /// + /// 轨迹代码 + /// + public List TrackCodes { get; set; } = null!; /// /// 操作人 diff --git a/src/SJZY.Track.Application.Contract/Events/TrackRefreshStruct.cs b/src/SJZY.Track.Application.Contract/Events/TrackRefreshStruct.cs new file mode 100644 index 00000000..62bcf4a2 --- /dev/null +++ b/src/SJZY.Track.Application.Contract/Events/TrackRefreshStruct.cs @@ -0,0 +1,25 @@ +namespace SJZY.Track.Application.Contract.Events; + +public struct TrackRefreshStruct +{ + /// + /// 服务商 + /// + public string? ServiceProviderName { get; set; } + + /// + /// 原轨迹内容 + /// + public string? OriginTrackContent { get; set; } + + /// + /// 原轨迹报文 + /// + public string? OriginTrackData { get; set; } + + /// + /// 表示订单是否完成(只由轨迹刷新配置决定) + /// tips:能够使得IsCompleted为true的点,全局只有一个:轨迹刷新 + /// + public bool IsCompleted { get; set; } +} \ No newline at end of file diff --git a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs index 53e0d856..3b449bbf 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs @@ -3,50 +3,14 @@ public class TrackUpsertEvent { /// - /// 订单id - /// - public int OrderId { get; set; } - - /// - /// 订单类型 - /// - public int OrderType { get; set; } - - /// - /// 订单号 - /// - public string OrderNo { get; set; } = null!; - - /// - /// 服务商 - /// - public string? ServiceProviderName { get; set; } - - /// - /// 原轨迹内容 - /// - public string? OriginTrackContent { get; set; } - - /// - /// 原轨迹报文 - /// - public string? OriginTrackData { get; set; } - - /// - /// 表示订单是否完成(只由轨迹刷新配置决定) - /// tips:能够使得IsCompleted为true的点,全局只有一个:轨迹刷新 - /// - public bool IsCompleted { get; set; } - - /// - /// 子系统id + /// 子系统id(操作的订单都是相同子系统下的) /// public int SubSystemId { get; set; } /// - /// 上游子系统id(0表示事件起点) + /// 订单id /// - public int UpSubSystemId { get; set; } + public OrderIdentifier[] OrderIdentifiers { get; set; } = null!; /// /// 操作人(null则默认系统) @@ -54,7 +18,7 @@ public class TrackUpsertEvent public string? OperationMan { get; set; } /// - /// true新增,false更新,null表示新增/更新 + /// true新增,false更新,null表示刷新 /// public bool? IsAdd { get; set; } @@ -82,4 +46,6 @@ public class TrackUpsertEvent /// 已经处理过的订单 /// public List Visited { get; set; } = new(); + + public TrackRefreshStruct TrackRefreshData { get; set; } } \ No newline at end of file diff --git a/src/SJZY.Track.Application.Contract/Events/TrackUpsertForRefreshEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackUpsertForRefreshEvent.cs new file mode 100644 index 00000000..7069903a --- /dev/null +++ b/src/SJZY.Track.Application.Contract/Events/TrackUpsertForRefreshEvent.cs @@ -0,0 +1,94 @@ +namespace SJZY.Track.Application.Contract.Events; + +public class TrackUpsertForRefreshEvent +{ + /// + /// 子系统id(操作的订单都是相同子系统下的) + /// + public int SubSystemId { get; set; } + + /// + /// 订单 + /// + public OrderIdentifier OrderIdentifiers { get; set; } + + /// + /// 服务商 + /// + public string? ServiceProviderName { get; set; } + + /// + /// 原轨迹内容 + /// + public string? OriginTrackContent { get; set; } + + /// + /// 原轨迹报文 + /// + public string? OriginTrackData { get; set; } + + /// + /// 表示订单是否完成(只由轨迹刷新配置决定) + /// tips:能够使得IsCompleted为true的点,全局只有一个:轨迹刷新 + /// + public bool IsCompleted { 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 class TrackHandledDto +{ + /// + /// 原轨迹内容 + /// + public string? OriginTrackContent { get; set; } + + /// + /// 原轨迹报文 + /// + public string? OriginTrackData { get; set; } + + /// + /// 表示订单是否完成(只由轨迹刷新配置决定) + /// tips:能够使得IsCompleted为true的点,全局只有一个:轨迹刷新 + /// + public bool? IsCompleted { get; set; } + + /// + /// 轨迹内容代码 + /// + public string? TrackCode { get; set; } + + /// + /// 轨迹发生地 + /// + public string? TrackPlace { get; set; } + + /// + /// 轨迹发生时间 + /// + public DateTime? TrackTime { get; set; } + + /// + /// 轨迹发生时区 + /// + public float? TrackTimeZone { get; set; } +} \ No newline at end of file diff --git a/src/SJZY.Track.Application/EventHandlers/OrderLinkAfterFillTrackHandler.cs b/src/SJZY.Track.Application/EventHandlers/OrderLinkAfterFillTrackHandler.cs deleted file mode 100644 index 37daa472..00000000 --- a/src/SJZY.Track.Application/EventHandlers/OrderLinkAfterFillTrackHandler.cs +++ /dev/null @@ -1,48 +0,0 @@ -using DotNetCore.CAP; -using SJZY.Track.Application.Contract.Events; -using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; -using SJZY.Track.Domain.Consts; -using Volo.Abp.DependencyInjection; - -namespace SJZY.Track.Application.EventHandlers; - -public class OrderLinkAfterFillTrackHandler : ITransientDependency, ICapSubscribe -{ - private readonly ITrackDetailsRepository _trackDetailsRepository; - private readonly ICapPublisher _capPublisher; - - public OrderLinkAfterFillTrackHandler(ITrackDetailsRepository trackDetailsRepository, ICapPublisher capPublisher) - { - _trackDetailsRepository = trackDetailsRepository; - _capPublisher = capPublisher; - } - - [CapSubscribe(GlobalConst.OrderLinkAfterFillTrack)] - public async Task ConsumerAsync(OrderLinkAfterFillTrackEvent @event) - { - var tracks = await _trackDetailsRepository.GetListAsync(@event.OrderId); - - - foreach (var order in @event.LinkedOrders) - { - // 补轨迹 - foreach (var track in tracks) - { - var fillTrackEvent = new TrackUpsertEvent - { - OrderId = order.OrderId, - OrderType = order.OrderType, - OrderNo = order.OrderNo, - TrackCode = track.TrackCode, - TrackPlace = track.TrackPlace, - TrackTime = track.TrackTime, - TrackTimeZone = track.TrackTimeZone, - SubSystemId = order.SubSystemId, - UpSubSystemId = @event.SubSystemId, - }; - - await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, fillTrackEvent); - } - } - } -} \ No newline at end of file diff --git a/src/SJZY.Track.Application/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs index a738576e..25e74d44 100644 --- a/src/SJZY.Track.Application/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs @@ -22,53 +22,70 @@ public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICa [CapSubscribe(GlobalConst.TrackChangeAfterUpdateOrderSubscribe)] public async Task ConsumerAsync(TrackChangeAfterUpdateOrderEvent @event) { - var order = await _orderRepository.GetFirstAsync(x => x.Id == @event.OrderId); - if (order == default) return; + var orders = await _orderRepository.GetListAsync(x => @event.OrderIds.Contains(x.Id), + x => new OrderEntity + { + Id = x.Id, + IsCompleted = x.IsCompleted, + LatestTrackContent = x.LatestTrackContent, + LatestTrackEnContent = x.LatestTrackEnContent, + LatestTrackPlace = x.LatestTrackPlace, + LatestTrackTime = x.LatestTrackTime, + LatestTrackTimeZone = x.LatestTrackTimeZone, + }); + if (orders.Count == 0) return; + + // todo:delete可能发生回退,直接去es查最新轨迹,但是可能es还没有刷盘,导致回退失效,可以考虑加个定时任务弥补 if (@event.IsDelete) { - var track = await _trackDetailsRepository.GetLatestAsync(@event.OrderId); - - // 删除全部轨迹导致的重置行为 - if (track == default) + foreach (var order in orders) { - if (order.LatestTrackTime == null) return; + var tracks = await _trackDetailsRepository.GetListAsync(@event.OrderIds); - // tips:订单是支持从已完成态到未完成态的 - order.ResetTrackInfo(); + var track = tracks.Where(x => x.OrderId == order.Id).MaxBy(x => x.TrackTime); + // 删除全部轨迹导致的重置行为 + if (track == default) + { + if (order.LatestTrackTime == null) return; - await _orderRepository.UpdateAsync(order); - - return; + // tips:订单是支持从已完成态到未完成态的 + order.ResetTrackInfo(); + } + else + { + // 删除引发的回退更新 + order.IsCompleted = @event.IsCompleted; + order.LatestTrackContent = track.TrackContent; + order.LatestTrackEnContent = track.TrackEnContent; + order.LatestTrackPlace = track.TrackPlace; + order.LatestTrackTime = track.TrackTime; + order.LatestTrackTimeZone = track.TrackTimeZone; + } } - - // 删除引发的回退更新 - order.IsCompleted = @event.IsCompleted; - order.LatestTrackContent = track.TrackContent; - order.LatestTrackEnContent = track.TrackEnContent; - order.LatestTrackPlace = track.TrackPlace; - order.LatestTrackTime = track.TrackTime; - order.LatestTrackTimeZone = track.TrackTimeZone; } - else + else // upsert可以直接计算 { - if (order.LatestTrackTime != null && - @event.TrackTime.Subtract(TimeSpan.FromHours(@event.TrackTimeZone)) < - order.LatestTrackTime.Value.Subtract(TimeSpan.FromHours(order.LatestTrackTimeZone ?? 0))) + foreach (var order in orders) { - return; - } + if (order.LatestTrackTime != null && + @event.TrackTime.Subtract(TimeSpan.FromHours(@event.TrackTimeZone)) < + order.LatestTrackTime.Value.Subtract(TimeSpan.FromHours(order.LatestTrackTimeZone ?? 0))) + { + continue; + } - // upsert引发的更新 - order.IsCompleted = @event.IsCompleted; - order.LatestTrackContent = @event.TrackContent; - order.LatestTrackEnContent = @event.TrackEnContent; - order.LatestTrackPlace = @event.TrackPlace; - order.LatestTrackTime = @event.TrackTime; - order.LatestTrackTimeZone = @event.TrackTimeZone; + // upsert引发的更新 + order.IsCompleted = @event.IsCompleted; + order.LatestTrackContent = @event.TrackContent; + order.LatestTrackEnContent = @event.TrackEnContent; + order.LatestTrackPlace = @event.TrackPlace; + order.LatestTrackTime = @event.TrackTime; + order.LatestTrackTimeZone = @event.TrackTimeZone; + } } - await _orderRepository.UpdateColumnAsync(order, x => new + await _orderRepository.UpdateRangeAsync(orders, x => new { x.IsCompleted, x.LatestTrackContent, x.LatestTrackEnContent, x.LatestTrackPlace, x.LatestTrackTime, x.LatestTrackTimeZone diff --git a/src/SJZY.Track.Application/EventHandlers/TrackDeleteEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackDeleteEventHandler.cs index 28b38520..ea6698fb 100644 --- a/src/SJZY.Track.Application/EventHandlers/TrackDeleteEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/TrackDeleteEventHandler.cs @@ -29,34 +29,52 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe [CapSubscribe(GlobalConst.TrackDeleteSubscribe, Group = GlobalConst.TrackDeleteSubscribe)] public async Task ConsumerAsync(TrackDeleteEvent @event) { - if (@event.Visited.Contains(@event.OrderId)) + var dup = @event.Visited.Intersect(@event.OrderIds).ToArray(); + if (dup.Any()) { - LogHelper.Error($"删除轨迹订单时,发现循环依赖:{@event.Visited.JoinAsString(",")}"); + LogHelper.Error($"删除轨迹订单时,发现循环依赖:{dup.JoinAsString(",")}"); return; } - // 不同子系统需要做内容映射 - if (@event.UpSubSystemId != 0 && @event.UpSubSystemId != @event.SubSystemId) - { - var mapCodes = await _provideQueries - .MapTrackCodesAsync(@event.UpSubSystemId, @event.SubSystemId, @event.TrackCodes.ToArray()); - - if (mapCodes.Count == 0) - { - //throw new BusinessException(message: "订单跨子系统,未配置内容映射,请联系管理员"); - return; - } - - @event.TrackCodes = mapCodes; - } - await DeleteTrackAsync(@event); + + // 根据订单关联关系异步向下刷(异步) + var linkedOrders = await _orderRepository.GetLinkedOrdersAsync(@event.OrderIds); + foreach (var orderId in @event.OrderIds) + { + foreach (var group in linkedOrders.Where(x => x.OrderId == orderId) + .GroupBy(x => x.SubSystemId)) + { + var nextEvent = @event.DeepCopy(); + nextEvent.Visited.AddRange(@event.OrderIds); + nextEvent.TrackCodes = @event.TrackCodes; + nextEvent.SubSystemId = group.Key; + + + // 不同子系统需要做内容映射 + if (@event.SubSystemId != nextEvent.SubSystemId) + { + var mapCodes = await _provideQueries + .MapTrackCodesAsync(@event.SubSystemId, nextEvent.SubSystemId, @event.TrackCodes.ToArray()); + + if (mapCodes.Count == 0) + { + //throw new BusinessException(message: "订单跨子系统,未配置内容映射,请联系管理员"); + return; + } + + nextEvent.TrackCodes = mapCodes; + } + + await _capPublisher.PublishAsync(GlobalConst.TrackDeleteSubscribe, nextEvent); + } + } } private async Task DeleteTrackAsync(TrackDeleteEvent @event) { - // 删除轨迹 - var isOk = await _trackDetailsRepository.DeleteTrackAsync(@event.OrderId, @event.TrackCodes); + // 删除轨迹(删的是同子系统下的单,所以code是统一的) + var isOk = await _trackDetailsRepository.DeleteTrackAsync(@event.OrderIds, @event.TrackCodes); if (isOk) { @@ -65,22 +83,9 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe GlobalConst.TrackChangeAfterUpdateOrderSubscribe, new TrackChangeAfterUpdateOrderEvent { - OrderId = @event.OrderId, + OrderIds = @event.OrderIds, IsDelete = true }); } - - // 根据订单关联关系异步向下刷 - var linkedOrders = await _orderRepository.GetLinkedOrdersAsync(@event.OrderId); - foreach (var linkedOrder in linkedOrders) - { - var nextEvent = @event.DeepCopy(); - nextEvent.Visited.Add(@event.OrderId); - nextEvent.TrackCodes = @event.TrackCodes; - nextEvent.SubSystemId = linkedOrder.SubSystemId; - nextEvent.UpSubSystemId = @event.SubSystemId; - - await _capPublisher.PublishAsync(GlobalConst.TrackDeleteSubscribe, nextEvent); - } } } \ No newline at end of file diff --git a/src/SJZY.Track.Application/EventHandlers/TrackInsertForNotMappedEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackInsertForNotMappedEventHandler.cs index f135b558..a0df5114 100644 --- a/src/SJZY.Track.Application/EventHandlers/TrackInsertForNotMappedEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/TrackInsertForNotMappedEventHandler.cs @@ -45,6 +45,6 @@ public class TrackInsertForNotMappedEventHandler : ITransientDependency, ICapSub track.TrackEnContent = GlobalConst.EmptyString; track.ZeroTrackTime = track.TrackTime.Subtract(TimeSpan.FromHours(track.TrackTimeZone)); - await _trackDetailsRepository.UpsertAsync(track); + await _trackDetailsRepository.UpdateAsync(track); } } \ No newline at end of file diff --git a/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs index a9a207e9..65e60991 100644 --- a/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs @@ -37,7 +37,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe var order = await _orderRepository.GetFirstAsync(x => x.Id == @event.OrderId, x => new { - x.SubSystemId, x.LatestPushTrackCode, x.QuestionType, x.CustomId + x.SubSystemId, x.LatestPushTrackCode, x.QuestionType, x.CustomId, x.OrderType }); if (order == null) return; @@ -70,10 +70,9 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe // 推送新增,需要根据上一次的推送 推断 本次推送 是否可行 config = await _trackPushCacheService.IsValidPushAsync(order.SubSystemId, order.CustomId, order.LatestPushTrackCode, @event.TrackCode); - if (config is not { IsAutoPush: true }) - { - config = null; - } + if (config == null) return; + if (!config.IsAutoPush) return; + if (config.OrderType != order.OrderType) return; } } else diff --git a/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs index 61431b30..4c132e26 100644 --- a/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs @@ -9,6 +9,7 @@ using SJZY.Track.Application.Contract.Events; using SJZY.Track.Application.Contract.Services; using SJZY.Track.Application.Helpers; using SJZY.Track.Domain.Aggregates.OrderAggregate; +using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Consts; using SJZY.Track.Domain.Enums; using Volo.Abp.DependencyInjection; @@ -20,13 +21,16 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe private readonly IOrderRepository _orderRepository; private readonly ICapPublisher _capPublisher; private readonly ITrackPullCacheService _trackPullCacheService; + private readonly ITrackDetailsRepository _trackDetailsRepository; public TrackRefreshEventHandler(IOrderRepository orderRepository, - ICapPublisher capPublisher, ITrackPullCacheService trackPullCacheService) + ICapPublisher capPublisher, ITrackPullCacheService trackPullCacheService, + ITrackDetailsRepository trackDetailsRepository) { _orderRepository = orderRepository; _capPublisher = capPublisher; _trackPullCacheService = trackPullCacheService; + _trackDetailsRepository = trackDetailsRepository; } [CapSubscribe(GlobalConst.TrackRefreshSubscribe, Group = GlobalConst.TrackRefreshSubscribe)] @@ -89,15 +93,19 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe await HandleTrackAsync(item, paramWithContentConfig, context); } } - else if (orderToken is JObject) + else if (trackToken is JObject) { - await HandleTrackAsync(orderToken, paramWithContentConfig, context); + await HandleTrackAsync(trackToken, paramWithContentConfig, context); } } private async Task HandleTrackAsync(JToken trackToken, TrackPullParamWithContentConfigDto paramWithContentConfig, TrackRefreshContext context) { + var originTrackData = JsonConvert.SerializeObject(trackToken); + // 如果已经存在一模一样的报文了说明处理过了,直接return + if (await _trackDetailsRepository.AnyAsync(context.OrderId, originTrackData)) return; + var paramConfig = paramWithContentConfig.ParamConfig; var contentConfigs = paramWithContentConfig.ContentConfigs; TrackPullContentConfigDto? matchedContentConfig = null; @@ -214,23 +222,31 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe // 新增/更新轨迹 var trackUpsertEvent = new TrackUpsertEvent { - OrderId = context.OrderId, - OrderType = context.OrderType, - OrderNo = context.OrderNo, - ServiceProviderName = context.ServiceProviderName, - OriginTrackData = JsonConvert.SerializeObject(trackToken), - IsCompleted = matchedContentConfig.IsCompleted, + OrderIdentifiers = new[] + { + new OrderIdentifier + { + OrderId = context.OrderId, + OrderNo = context.OrderNo, + OrderType = context.OrderType + } + }, + TrackRefreshData = new TrackRefreshStruct + { + ServiceProviderName = context.ServiceProviderName, + OriginTrackData = originTrackData, + IsCompleted = matchedContentConfig.IsCompleted, + OriginTrackContent = paramConfig.TrackContentName != null + ? trackToken[paramConfig.TrackContentName]?.Value() + : GlobalConst.EmptyString + }, SubSystemId = context.SubSystemId, TrackCode = matchedContentConfig.TrackContentCode, TrackPlace = trackPlace ?? GlobalConst.EmptyString, TrackTime = trackTime ?? DateTime.Now, TrackTimeZone = trackTimeZone ?? matchedContentConfig.TrackTimeZoneValue ?? 8 }; - if (paramConfig.TrackContentName != null) - { - trackUpsertEvent.OriginTrackContent = trackToken[paramConfig.TrackContentName]?.Value(); - } - await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, trackUpsertEvent); + await _capPublisher.PublishAsync(GlobalConst.TrackUpsertForRefreshSubscribe, 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 105ef588..81e954fe 100644 --- a/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs @@ -26,145 +26,166 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe _trackDetailsRepository = trackDetailsRepository; } + [CapSubscribe(GlobalConst.TrackUpsertSubscribe, Group = GlobalConst.TrackUpsertSubscribe)] [CapSubscribe(GlobalConst.TrackUpsertSubscribe, Group = GlobalConst.TrackUpsertSubscribe)] public async Task ConsumerAsync(TrackUpsertEvent @event) { - if (@event.Visited.Contains(@event.OrderId)) + var orderIds = @event.OrderIdentifiers.Select(x => x.OrderId).ToArray(); + + var dup = @event.Visited.Intersect(orderIds).ToArray(); + if (dup.Any()) { - LogHelper.Error($"轨迹订单循环依赖预警:{@event.Visited.JoinAsString(",")}"); + LogHelper.Error($"删除轨迹订单时,发现循环依赖:{dup.JoinAsString(",")}"); return; } - // 不同子系统需要做内容映射 - if (@event.UpSubSystemId != 0 && @event.UpSubSystemId != @event.SubSystemId) - { - var mapCode = (await _provideQueries - .MapTrackCodesAsync(@event.UpSubSystemId, @event.SubSystemId, @event.TrackCode)) - .FirstOrDefault(); + await HandleTrackAsync(@event); - if (mapCode == default) + // 根据订单关联关系异步向下刷(异步) + var linkedOrders = await _orderRepository.GetLinkedOrdersAsync(orderIds); + foreach (var order in @event.OrderIdentifiers) + { + // 理论上小包在这不会分组 + foreach (var group in linkedOrders.Where(x => x.OrderId == order.OrderId) + .GroupBy(x => x.SubSystemId)) { - // 跨子系统没做映射的轨迹不处理 - return; + var nextEvent = @event.DeepCopy(); + nextEvent.Visited.AddRange(orderIds); + nextEvent.SubSystemId = group.Key; + nextEvent.OrderIdentifiers = group.Select(x => new OrderIdentifier + { + OrderId = x.OrderId, + OrderNo = x.OrderNo, + OrderType = x.OrderType + }).ToArray(); + nextEvent.TrackRefreshData = new TrackRefreshStruct + { + ServiceProviderName = @event.TrackRefreshData.ServiceProviderName, + OriginTrackContent = @event.TrackRefreshData.OriginTrackContent, + OriginTrackData = @event.TrackRefreshData.OriginTrackData, + // tips:一定要重置为false,父级订单的完成不会使得关联订单完成,关联单也必须由刷新来完成或手动设置完成!! + IsCompleted = false + }; + + // 不同子系统需要做内容映射 + if (@event.SubSystemId != nextEvent.SubSystemId) + { + var mapCode = (await _provideQueries + .MapTrackCodesAsync(@event.SubSystemId, nextEvent.SubSystemId, @event.TrackCode)) + .FirstOrDefault(); + + if (mapCode == default) + { + // 跨子系统没做映射的轨迹不处理 + return; + } + + @event.TrackCode = mapCode; + } + + await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, nextEvent); + } + } + } + + private async Task HandleTrackAsync(TrackUpsertEvent @event) + { + var orderIds = @event.OrderIdentifiers.Select(x => x.OrderId).ToArray(); + var tracks = await _trackDetailsRepository.GetListAsync(orderIds, @event.TrackCode); + + var insertTracks = new List(); + + foreach (var order in @event.OrderIdentifiers) + { + var track = tracks.FirstOrDefault(x => x.OrderId == order.OrderId); + + if (@event.IsAdd != null) + { + if (track == null && !@event.IsAdd!.Value) return; // 不存在不让改 + if (track != null && @event.IsAdd!.Value) return; // 存在不让创建 } - @event.TrackCode = mapCode; - } - - var track = await _trackDetailsRepository.GetFirstOrDefaultAsync(@event.OrderId, @event.TrackCode); - - 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; // 模板没配该轨迹代码,不再继续 - - // step2、触发轨迹推送事件(异步) - var trackPushEvent = new TrackPushEvent - { - OptionType = track.Id.IsNullOrWhiteSpace() ? OptionType.新增 : OptionType.修改, - OrderId = track.OrderId, - OrderNo = track.OrderNo, - TrackStatus = track.TrackStatus, - TrackCode = track.TrackCode, - TrackContent = track.TrackContent, - TrackPlace = track.TrackPlace, - TrackTime = track.TrackTime, - TrackTimeZone = track.TrackTimeZone, - }; - - await _capPublisher.PublishAsync(GlobalConst.TrackPushSubscribe, trackPushEvent); - - // step3、触发订单主表更新事件(异步) - await _capPublisher.PublishAsync(GlobalConst.TrackChangeAfterUpdateOrderSubscribe, - new TrackChangeAfterUpdateOrderEvent + // step1、upsert es轨迹 + if (track == default) { + track = new TrackDetailsIndex + { + IndexName = $"{GlobalConst.TrackIndex}-{DateTime.Now:yyyy.MM.dd}", + OrderId = order.OrderId, + OrderNo = order.OrderNo, + OrderType = order.OrderType, + TrackCode = @event.TrackCode, + TrackPlace = @event.TrackPlace, + TrackTime = @event.TrackTime, + TrackTimeZone = @event.TrackTimeZone, + ServiceProviderName = @event.TrackRefreshData.ServiceProviderName, + OriginTrackContent = @event.TrackRefreshData.OriginTrackContent, + OriginTrackData = @event.TrackRefreshData.OriginTrackData, + IsCanDelete = false, + CreateUser = @event.OperationMan ?? GlobalConst.SystemUser, + CreateTime = DateTime.Now + }; + + //todo:可以优化? + // 根据轨迹code在订单模板内容中寻找匹配的 + var trackContent = await _provideQueries.MatchTrackContentAsync(order.OrderId, @event.TrackCode); + if (trackContent == default) + { + // 订单所绑定的模板,没有一条内容可以匹配发生的轨迹 + continue; + } + + track.TrackStatus = trackContent.Status; + track.TrackCode = trackContent.TrackCode; + track.TrackContent = trackContent.Content; + track.TrackEnContent = trackContent.EnContent; + track.IsCanDelete = trackContent.IsCanDelete; + track.ZeroTrackTime = track.TrackTime.Subtract(TimeSpan.FromHours(track.TrackTimeZone)); + + insertTracks.Add(track); + } + else + { + track.TrackPlace = @event.TrackPlace; + track.TrackTime = @event.TrackTime; + track.TrackTimeZone = @event.TrackTimeZone; + track.UpdateUser = @event.OperationMan ?? GlobalConst.SystemUser; + track.UpdateTime = DateTime.Now; + + await _trackDetailsRepository.UpdateAsync(track); + } + + // step2、触发轨迹推送事件(异步) + var trackPushEvent = new TrackPushEvent + { + OptionType = track.Id.IsNullOrWhiteSpace() ? OptionType.新增 : OptionType.修改, OrderId = track.OrderId, - IsCompleted = @event.IsCompleted, + OrderNo = track.OrderNo, + TrackStatus = track.TrackStatus, TrackCode = track.TrackCode, TrackContent = track.TrackContent, - TrackEnContent = track.TrackEnContent, TrackPlace = track.TrackPlace, TrackTime = track.TrackTime, - TrackTimeZone = track.TrackTimeZone - }); - - // step4、根据订单关联关系异步向下刷(异步) - var linkedOrders = await _orderRepository.GetLinkedOrdersAsync(@event.OrderId); - foreach (var linkedOrder in linkedOrders) - { - var nextEvent = @event.DeepCopy(); - nextEvent.Visited.Add(@event.OrderId); - // tips:一定要重置为false,父级订单的完成不会使得关联订单完成,关联单也必须由刷新来完成或手动设置完成!! - nextEvent.IsCompleted = false; // 能够使得轨迹IsCompleted为true的点,全局只有一个:轨迹刷新 - nextEvent.OrderId = linkedOrder.OrderId; - nextEvent.OrderType = linkedOrder.OrderType; - nextEvent.OrderNo = linkedOrder.OrderNo; - nextEvent.SubSystemId = linkedOrder.SubSystemId; - nextEvent.UpSubSystemId = @event.SubSystemId; - await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, nextEvent); - } - } - - /// - /// 不存在则新增轨迹,存在则更新 - /// - /// - /// - private async Task UpsertTrackAsync(TrackDetailsIndex? track, TrackUpsertEvent @event) - { - if (track == default) - { - track = new TrackDetailsIndex - { - IndexName = $"{GlobalConst.TrackIndex}-{DateTime.Now:yyyy.MM.dd}", - OrderId = @event.OrderId, - OrderNo = @event.OrderNo, - OrderType = @event.OrderType, - TrackCode = @event.TrackCode, - TrackPlace = @event.TrackPlace, - TrackTime = @event.TrackTime, - TrackTimeZone = @event.TrackTimeZone, - ServiceProviderName = @event.ServiceProviderName, - OriginTrackContent = @event.OriginTrackContent, - OriginTrackData = @event.OriginTrackData, - IsCanDelete = false, - CreateUser = @event.OperationMan ?? GlobalConst.SystemUser, - CreateTime = DateTime.Now + TrackTimeZone = track.TrackTimeZone, }; - //todo:可以优化 - // 根据轨迹code在订单模板内容中寻找匹配的 - var trackContent = await _provideQueries.MatchTrackContentAsync(@event.OrderId, @event.TrackCode); - if (trackContent == default) - { - // 订单所绑定的模板,没有一条内容可以匹配发生的轨迹 - return null; - } + await _capPublisher.PublishAsync(GlobalConst.TrackPushSubscribe, trackPushEvent); - track.TrackStatus = trackContent.Status; - track.TrackCode = trackContent.TrackCode; - track.TrackContent = trackContent.Content; - track.TrackEnContent = trackContent.EnContent; - track.IsCanDelete = trackContent.IsCanDelete; - track.ZeroTrackTime = track.TrackTime.Subtract(TimeSpan.FromHours(track.TrackTimeZone)); - } - else - { - track.TrackPlace = @event.TrackPlace; - track.TrackTime = @event.TrackTime; - track.TrackTimeZone = @event.TrackTimeZone; - track.UpdateUser = @event.OperationMan ?? GlobalConst.SystemUser; - track.UpdateTime = DateTime.Now; + // step3、触发订单主表更新事件(异步) + await _capPublisher.PublishAsync(GlobalConst.TrackChangeAfterUpdateOrderSubscribe, + new TrackChangeAfterUpdateOrderEvent + { + OrderIds = new[] { track.OrderId }, + IsCompleted = @event.TrackRefreshData.IsCompleted, + TrackCode = track.TrackCode, + TrackContent = track.TrackContent, + TrackEnContent = track.TrackEnContent, + TrackPlace = track.TrackPlace, + TrackTime = track.TrackTime, + TrackTimeZone = track.TrackTimeZone + }); } - await _trackDetailsRepository.UpsertAsync(track); - - return track; + await _trackDetailsRepository.AddManyAsync(insertTracks); } } \ No newline at end of file diff --git a/src/SJZY.Track.Application/Services/ProvideServices/OrderService.Link.cs b/src/SJZY.Track.Application/Services/ProvideServices/OrderService.Link.cs index 5eca209c..f37ff3b5 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/OrderService.Link.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/OrderService.Link.cs @@ -2,6 +2,7 @@ using SJZY.Track.Application.Contract.Dtos.ProvideServices; using SJZY.Track.Application.Contract.Events; using SJZY.Track.Domain.Aggregates.OrderAggregate; +using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Consts; using SJZY.Track.Domain.Queries; @@ -14,6 +15,7 @@ public partial class OrderService { private readonly IBasicQuery _orderLinkQuery; private readonly ICapPublisher _capPublisher; + private readonly ITrackDetailsRepository _trackDetailsRepository; /// /// 关联、解除关联订单 @@ -52,23 +54,12 @@ public partial class OrderService if (!input.IsLink) return await UnLinkOrderAsync(input); // 关联订单 - var linkedOrders = await DoLinkOrderAsync(input, order.Id); - - // 补轨迹 - if (linkedOrders.Count > 0) - { - await _capPublisher.PublishAsync(GlobalConst.OrderLinkAfterFillTrack, new OrderLinkAfterFillTrackEvent - { - OrderId = order.Id, - SubSystemId = order.SubSystemId, - LinkedOrders = linkedOrders, - }); - } + await DoLinkOrderAsync(input, order.Id); return new UnifyResultDto(true, true); } - private async Task> DoLinkOrderAsync(LinkOrderInput input, int orderId) + private async Task DoLinkOrderAsync(LinkOrderInput input, int orderId) { // 获取已关联的订单 var linkOrderNos = await _orderLinkQuery.GetListAsync(x => @@ -81,9 +72,9 @@ public partial class OrderService // 过滤掉不存在的订单 var canLinkOrders = await _orderRepository.GetListAsync(x => x.OrderType == input.LinkOrderType && noLinkOrderNos.Contains(x.OrderNo), - x => new { x.Id, x.OrderNo, x.SubSystemId }); + x => new { x.Id, x.OrderNo, x.OrderType, x.SubSystemId }); - if (canLinkOrders.Count == 0) return new List(); + if (canLinkOrders.Count == 0) return; await _orderRepository.LinkOrderAsync(canLinkOrders.Select(x => new OrderLinkEntity { @@ -95,13 +86,32 @@ public partial class OrderService LinkOrderType = input.LinkOrderType }).ToList()); - return canLinkOrders.Select(x => new LinkedOrder + var tracks = await _trackDetailsRepository.GetListAsync(orderId); + + // 补轨迹 + foreach (var group in canLinkOrders.GroupBy(x => x.SubSystemId)) { - SubSystemId = x.SubSystemId, - OrderId = x.Id, - OrderNo = x.OrderNo, - OrderType = input.LinkOrderType - }).ToList(); + foreach (var track in tracks) + { + var fillTrackEvent = new TrackUpsertEvent + { + SubSystemId = group.Key, + OrderIdentifiers = group.Select(x => new OrderIdentifier + { + OrderId = x.Id, + OrderNo = x.OrderNo, + OrderType = x.OrderType + }).ToArray(), + TrackCode = track.TrackCode, + TrackPlace = track.TrackPlace, + TrackTime = track.TrackTime, + TrackTimeZone = track.TrackTimeZone, + IsAdd = true + }; + + await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, fillTrackEvent); + } + } } private async Task UnLinkOrderAsync(LinkOrderInput input) diff --git a/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs b/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs index d1086bf7..4a72f258 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs @@ -2,6 +2,7 @@ using SJZY.Track.Application.Contract.Dtos.ProvideServices; using SJZY.Track.Application.Contract.Services; using SJZY.Track.Domain.Aggregates.OrderAggregate; +using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Queries; using SJZY.UserCenter.HttpApi.Services; @@ -17,9 +18,10 @@ public partial class OrderService : ApplicationService, IOrderService private readonly IOrderRepository _orderRepository; public OrderService(IOrderRepository orderRepository, IBasicQuery orderLinkQuery, - ICapPublisher capPublisher) + ICapPublisher capPublisher, ITrackDetailsRepository trackDetailsRepository) { _orderRepository = orderRepository; + _trackDetailsRepository = trackDetailsRepository; _capPublisher = capPublisher; _orderLinkQuery = orderLinkQuery; } diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index 1d081ead..1d20b169 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -43,7 +43,7 @@ public partial class TrackService : ApplicationService, ITrackService var order = await _orderRepository.GetFirstAsync(x => x.OrderType == input.OrderType && x.OrderNo == input.OrderNo, x => new { - x.Id, x.SubSystemId + x.Id, x.SubSystemId, x.OrderNo, x.OrderType }); if (order == default) { @@ -52,8 +52,16 @@ public partial class TrackService : ApplicationService, ITrackService // 新增/更新轨迹 var @event = ObjectMapper.Map(input); - @event.OrderId = order.Id; @event.SubSystemId = order.SubSystemId; + @event.OrderIdentifiers = new[] + { + new OrderIdentifier + { + OrderId = order.Id, + OrderNo = order.OrderNo, + OrderType = order.OrderType + } + }; @event.OperationMan = CurrentUserRequest.CurrentUser.Name; await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, @event); return new UnifyResultDto(true, true); @@ -80,25 +88,29 @@ public partial class TrackService : ApplicationService, ITrackService x.Id, x.OrderNo, x.SubSystemId }); - foreach (var order in orders) + foreach (var group in orders.GroupBy(x => x.SubSystemId)) { // 新增/更新轨迹 var @event = new TrackUpsertEvent { + SubSystemId = group.Key, + OrderIdentifiers = group.Select(order => new OrderIdentifier + { + OrderId = order.Id, + OrderNo = order.OrderNo, + OrderType = input.OrderType + }).ToArray(), IsAdd = input.IsAdd, TrackCode = input.TrackCode, TrackPlace = input.TrackPlace, TrackTime = input.TrackTime!.Value, TrackTimeZone = input.TrackTimeZone!.Value, - OrderType = input.OrderType, - OrderNo = order.OrderNo, - OrderId = order.Id, - SubSystemId = order.SubSystemId, OperationMan = CurrentUserRequest.CurrentUser.Name }; await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, @event); } + return new UnifyResultDto(true, true); } @@ -132,7 +144,7 @@ public partial class TrackService : ApplicationService, ITrackService // 删除轨迹 var @event = new TrackDeleteEvent { - OrderId = order.Id, + OrderIds = new[] { order.Id }, TrackCodes = codes.Select(x => x.TrackCode).ToList(), SubSystemId = order.SubSystemId, OperationMan = CurrentUserRequest.CurrentUser.Name @@ -173,7 +185,7 @@ public partial class TrackService : ApplicationService, ITrackService { var @event = new TrackDeleteEvent { - OrderId = group.Key, + OrderIds = group.Select(x => x.OrderId).ToArray(), TrackCodes = codes.Select(x => x.TrackCode).ToList(), SubSystemId = orders.First(x => x.Id == group.Key).SubSystemId, OperationMan = CurrentUserRequest.CurrentUser.Name diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs index 7eaf030f..78cdd5df 100644 --- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs @@ -38,7 +38,7 @@ public interface IOrderRepository : IBasicRepository /// /// /// - Task> GetLinkedOrdersAsync(int orderId); + Task> GetLinkedOrdersAsync(int[] orderId); /// /// 关联订单 diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs index 628acc1f..d32ed593 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs @@ -4,11 +4,18 @@ namespace SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; public interface ITrackDetailsRepository { - Task GetFirstOrDefaultAsync(int orderId, string trackCode); + Task> GetListAsync(int[] orderIds, string trackCode); + + Task> GetListAsync(int[] orderIds); Task AnyAsync(int orderId, DateTime trackTime); - Task UpsertAsync(TrackDetailsIndex index); + Task AnyAsync(int orderId, string originTrackData); + + Task UpdateAsync(TrackDetailsIndex index); + + Task AddManyAsync(List index); + Task> GetListAsync(int orderType, List orderNos); @@ -20,15 +27,8 @@ public interface ITrackDetailsRepository /// /// 删除轨迹 /// - /// + /// /// /// - Task DeleteTrackAsync(int orderId, List trackCodes); - - /// - /// 获取最近一条发生的轨迹 - /// - /// - /// - Task GetLatestAsync(int orderId); + Task DeleteTrackAsync(int[] orderIds, List trackCodes); } \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Consts/GlobalConst.MQ.cs b/src/SJZY.Track.Domain/Consts/GlobalConst.MQ.cs index 35179262..b855eb70 100644 --- a/src/SJZY.Track.Domain/Consts/GlobalConst.MQ.cs +++ b/src/SJZY.Track.Domain/Consts/GlobalConst.MQ.cs @@ -7,6 +7,11 @@ public partial class GlobalConst /// public const string TrackUpsertSubscribe = "SJZY.Track.TrackUpsert"; + /// + /// 轨迹刷新引发的新增/更新 专用 + /// + public const string TrackUpsertForRefreshSubscribe = "SJZY.Track.TrackUpsertForRefresh"; + /// /// 无法映射的轨迹新增 /// diff --git a/src/SJZY.Track.Repository/EsExtensions.cs b/src/SJZY.Track.Repository/EsExtensions.cs new file mode 100644 index 00000000..b926f93b --- /dev/null +++ b/src/SJZY.Track.Repository/EsExtensions.cs @@ -0,0 +1,22 @@ +using Nest; +using SJZY.Expand.ElasticSearch; + +namespace SJZY.Track.Repository; + +public static class EsExtensions +{ + public static List ToIdList(this ISearchResponse response) where T : IdBaseIndex + { + var dtos = new List(); + + foreach (var hit in response.Hits) + { + var dto = hit.Source; + dto.Id = hit.Id; + + dtos.Add(dto); + } + + return dtos; + } +} \ No newline at end of file diff --git a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs index b2f48a68..5e78fc5f 100644 --- a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs @@ -67,16 +67,16 @@ AND `a`.`IsDeleted` = 0 AND `b`.`IsDeleted` = 0;"); #region 订单关联 - public async Task> GetLinkedOrdersAsync(int orderId) + public async Task> GetLinkedOrdersAsync(int[] orderIds) { return await Context.Queryable() .LeftJoin((a, b) => a.LinkOrderId == b.Id) - .Where(a => a.OrderId == orderId) + .Where(a => orderIds.Contains(a.OrderId)) .Select((a, b) => new LinkedOrderVO { OrderId = b.Id, - OrderType = b.OrderType, OrderNo = b.OrderNo, + OrderType = b.OrderType, SubSystemId = b.SubSystemId }) .ToListAsync(); diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs index 03b3c7c9..b692a3f2 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs @@ -2,6 +2,7 @@ using Nest; using SJZY.Expand.ABP.Core.Logger; using SJZY.Expand.ElasticSearch.Services; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; +using SJZY.Track.Domain.Consts; using SJZY.Track.Domain.Dtos.TrackDetails; namespace SJZY.Track.Repository.Repositories; @@ -13,29 +14,50 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract GetFirstOrDefaultAsync(int orderId, string trackCode) + public async Task> GetListAsync(int[] orderIds, string trackCode) { var r = await Context.SearchAsync(s => s .Source() .Query(q => - q.Term(f => f.OrderId, orderId) + q.Terms(t => t + .Field(f => f.OrderId) + .Terms(orderIds)) && q.Term(f => f.TrackCode.Suffix("keyword"), trackCode) + && q.Term(f => f.ServiceProviderName.Suffix("keyword"), GlobalConst.EmptyString) ) ); - var res = r.Documents.FirstOrDefault(); - if (res != default && r.Hits.FirstOrDefault() != default) - { - res.Id = r.Hits.FirstOrDefault()!.Id; - } + return r.ToIdList(); + } - return res; + public async Task> GetListAsync(int[] orderIds) + { + var data = await Context.SearchAsync(x => x + .Source(s => s.Includes(fd => fd + .Field(f => f.TrackEnContent) + .Field(f => f.TrackContent) + .Field(f => f.TrackPlace) + .Field(f => f.TrackTime) + .Field(f => f.TrackTimeZone) + .Field(f => f.OrderId) + )) + .Query(q => + q.Terms(t => t + .Field(f => f.OrderId) + .Terms(orderIds)) + && q.Term(f => f.ServiceProviderName.Suffix("keyword"), GlobalConst.EmptyString) + ) + .Sort(s => s.Field(f => f.TrackTime, SortOrder.Descending)) + .Size(1) + ); + + return data.Documents.ToList(); } public async Task AnyAsync(int orderId, DateTime trackTime) { var r = await Context.SearchAsync(x => x - .Source(s => s.Includes(fd => fd.Field(f => f.Id))) + .Source(s => s.Includes(fd => fd.Field(f => f.TrackCode))) .Query(q => q.Term(f => f.OrderId, orderId) && q.Term(f => f.TrackTime, trackTime) @@ -45,33 +67,44 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract 0; } - public async Task UpsertAsync(TrackDetailsIndex index) + public async Task AnyAsync(int orderId, string originTrackData) { - if (index.Id.IsNullOrWhiteSpace()) - { - // 按天写入es - var r = await Context.IndexAsync(index, request => request - .Index(index.IndexName) - //.Refresh(Refresh.True) // 可选:立即刷新索引使更改立即可见 - ); + var r = await Context.SearchAsync(x => x + .Source(s => s.Includes(fd => fd.Field(f => f.TrackCode))) + .Query(q => + q.Term(f => f.OrderId, orderId) + && q.Term(f => f.OriginTrackData.Suffix("keyword"), originTrackData) + ) + ); - if (!r.IsValid) - { - LogHelper.Error($"轨迹新增失败,原因:{r.DebugInformation}。"); - } + return r.Hits.Count > 0; + } + + + public async Task UpdateAsync(TrackDetailsIndex track) + { + var r = await Context.UpdateAsync(track.Id, u => u + .Index(track.IndexName) + .Doc(track) + //.Refresh(Refresh.True) // 可选:立即刷新索引使更改立即可见 + ); + + if (!r.IsValid) + { + LogHelper.Error($"轨迹更新失败,原因:{r.DebugInformation}。"); } - else - { - var r = await Context.UpdateAsync(index.Id, u => u - .Index(index.IndexName) - .Doc(index) - //.Refresh(Refresh.True) // 可选:立即刷新索引使更改立即可见 - ); + } - if (!r.IsValid) - { - LogHelper.Error($"轨迹更新失败,原因:{r.DebugInformation}。"); - } + public async Task AddManyAsync(List tracks) + { + if (!tracks.Any()) return; + + // 按天写入es + var r = await Context.IndexManyAsync(tracks, tracks.First().IndexName); + + if (!r.IsValid) + { + LogHelper.Error($"{tracks.Count}条轨迹新增失败,原因:{r.DebugInformation}。"); } } @@ -140,32 +173,12 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract GetLatestAsync(int orderId) - { - var data = await Context.SearchAsync(x => x - .Source(s => s.Includes(fd => fd - .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) + public async Task DeleteTrackAsync(int[] orderIds, List trackCodes) { var r = await Context.DeleteByQueryAsync(x => x .Query( q => - q.Term(t => t.OrderId, orderId) + q.Terms(t => t.Field(f => f.OrderId).Terms(orderIds)) && q.Term(t => t.IsCanDelete, true) && q.Terms(t => t.Field(f => f.TrackCode.Suffix("keyword")).Terms(trackCodes))) //.Refresh(Refresh.True) // 可选:立即刷新索引使更改立即可见