From df3fed3fbb5625c8b1b981638c58068c91cb72d7 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Fri, 21 Feb 2025 10:53:46 +0800 Subject: [PATCH 1/2] =?UTF-8?q?clean:=E6=B8=85=E7=90=86=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProvideServices/TrackPushService.cs | 27 ++----------------- 1 file changed, 2 insertions(+), 25 deletions(-) diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs index ec3289a3..ca74ebe4 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs @@ -104,7 +104,7 @@ public class TrackPushService : ApplicationService, ITrackPushService throw new BusinessException(message: $"当前轨迹不存在扩展信息,无法利用扩展字段:{input.CompareFields}"); } - var extraDict = GetExtraDictForTextJson(x.Extra); + var extraDict = TextJsonHelper.DeserializeToDictionary(x.Extra); if (extraDict == null || !extraDict.TryGetValue(input.CompareFields, out var compareValue)) { throw new BusinessException(message: $"请检查拓展字段,为什么找不到比较字段:{input.CompareFields}"); @@ -148,24 +148,6 @@ public class TrackPushService : ApplicationService, ITrackPushService await _capPublisher.PublishAsync(GlobalConst.TrackManualPushSubscribe, trackPushEvent); } - - // foreach (var group in orders.GroupBy(x => x.CustomId)) - // { - // var trackPushEvent = new TrackPushEvent - // { - // OptionType = OptionType.新增, - // SubSystemId = input.SubSystemId, - // SubSystemCode = subSystemCode, - // CustomId = group.Key, - // OrderIds = group.Select(x => x.Id).ToArray(), - // TrackCode = input.TrackCode, - // OperationMan = name, - // SystemPushInfo = new SystemPushStruct() - // }; - // - // await _capPublisher.PublishAsync(GlobalConst.TrackManualPushSubscribe, trackPushEvent); - // } - return new UnifyResultDto(true, $"即将推送轨迹代码{input.TrackCode}给{orders.Length}个订单"); } @@ -210,10 +192,5 @@ public class TrackPushService : ApplicationService, ITrackPushService return new UnifyResultDto>(true, res, "操作成功"); } - private Dictionary? GetExtraDictForTextJson(string? extraStr) - { - return string.IsNullOrWhiteSpace(extraStr) - ? null - : System.Text.Json.JsonSerializer.Deserialize>(extraStr); - } + } From 3fe2b64a764cfc2cf8d3028bdf572b8f455674a7 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Fri, 21 Feb 2025 11:31:15 +0800 Subject: [PATCH 2/2] =?UTF-8?q?perf:=E4=BC=98=E5=8C=96=E8=BD=A8=E8=BF=B9?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E5=86=97=E4=BD=99=E7=AC=AC=E4=B8=89=E6=96=B9?= =?UTF-8?q?=E5=8D=95=E5=8F=B7=E4=BB=A5=E6=8F=90=E9=AB=98=E6=80=A7=E8=83=BD?= =?UTF-8?q?=EF=BC=88=E5=8E=9F=EF=BC=9A=E4=BD=BF=E7=94=A8=E6=9C=AC=E5=9C=B0?= =?UTF-8?q?=E7=BC=93=E5=AD=98=EF=BC=89=20pref:=E6=8E=A5=E5=8F=A3=E5=8F=8D?= =?UTF-8?q?=E5=8F=82=E5=A2=9E=E5=8A=A0=EF=BC=8C=E6=9F=A5=E8=AF=A2=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E8=AE=A2=E5=8D=95=E5=A2=9E=E5=8A=A0=E8=BD=A8=E8=BF=B9?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E6=9C=80=E6=96=B0=E8=BD=A8=E8=BF=B9=E6=97=B6?= =?UTF-8?q?=E5=8C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProvideServices/GetPageTrackOrderInput.cs | 10 ++++ .../TrackChangeAfterUpdateOrderEvent.cs | 5 ++ ...TrackChangeAfterUpdateOrderEventHandler.cs | 1 + .../EventHandlers/TrackUpsertEventHandler.cs | 1 + .../Services/ProvideServices/OrderService.cs | 2 + .../Aggregates/OrderAggregate/OrderEntity.cs | 37 ++++++++++++ .../Dtos/Order/GetPageTrackOrderInputVO.cs | 10 ++++ .../Repositories/OrderRepository.cs | 58 ++++--------------- 8 files changed, 76 insertions(+), 48 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetPageTrackOrderInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetPageTrackOrderInput.cs index 324e9c48..2af82f3e 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetPageTrackOrderInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetPageTrackOrderInput.cs @@ -93,6 +93,11 @@ public class TrackOrderDto /// public string? OrderDetails { get; set; } + /// + /// 最新轨迹状态 + /// + public string? NewestTrackStatus { get; set; } + /// /// 最新轨迹内容 /// @@ -113,6 +118,11 @@ public class TrackOrderDto /// public DateTime? NewestTrackTime { get; set; } + /// + /// 最新轨迹时区 + /// + public float? NewestTrackTimeZone { get; set; } + /// /// 是否完结 /// diff --git a/src/SJZY.Track.Application.Contract/Events/TrackChangeAfterUpdateOrderEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackChangeAfterUpdateOrderEvent.cs index 90c807d0..07242767 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackChangeAfterUpdateOrderEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackChangeAfterUpdateOrderEvent.cs @@ -12,6 +12,11 @@ public class TrackChangeAfterUpdateOrderEvent /// public bool IsCompleted { get; set; } + /// + /// 轨迹状态 + /// + public string TrackStatus { get; set; } = null!; + /// /// 轨迹内容 /// diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs index e3a98037..5a0986d4 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs @@ -50,6 +50,7 @@ public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICa order.IsCompleted = @event.IsCompleted; } + order.LatestTrackStatus = @event.TrackStatus; order.LatestTrackContent = @event.TrackContent; order.LatestTrackEnContent = @event.TrackEnContent; order.LatestTrackPlace = @event.TrackPlace; diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index 8a657ad2..9bc5140a 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -205,6 +205,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe { OrderIds = canNextOrderIds.ToArray(), IsCompleted = trackContent.IsCompleted, + TrackStatus = trackContent.TrackStatus, TrackContent = trackContent.TrackContent, TrackEnContent = trackContent.TrackEnContent, TrackPlace = @event.TrackPlace, diff --git a/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs b/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs index ed613ffb..eae2c9b3 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs @@ -77,6 +77,7 @@ public partial class OrderService : ApplicationService, IOrderService order.OrderPullStatus = BuiltOrderPullStatus(input.PullConfigInfos); order.OrderPlatformNumbers = BuiltOrderPlatformNumbers(input.PullConfigInfos); order.TemplateCodes = input.TemplateCodes == null ? null : string.Join(',', input.TemplateCodes); + order.SetThirdPartyOrderNumber(order.OrderPlatformNumbers); var orderId = await _orderRepository.CreateOrderAsync(order); @@ -132,6 +133,7 @@ public partial class OrderService : ApplicationService, IOrderService order.OrderPullStatus = BuiltOrderPullStatus(input.PullConfigInfos); order.OrderPlatformNumbers = BuiltOrderPlatformNumbers(input.PullConfigInfos); order.TemplateCodes = input.TemplateCodes == null ? null : string.Join(',', input.TemplateCodes); + order.SetThirdPartyOrderNumber(order.OrderPlatformNumbers); await _orderRepository.UpdateOrderAsync(order); } diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs index d6248fbe..ce05158f 100644 --- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs +++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs @@ -1,3 +1,5 @@ +using SJZY.Track.Domain.Consts; + namespace SJZY.Track.Domain.Aggregates.OrderAggregate; /// @@ -60,6 +62,12 @@ public class OrderEntity : IFullAuditedBasicEntitys, IAggregateRoot [SugarColumn(ColumnName = "LatestPushError")] public string? LatestPushError { get; set; } + /// + /// 最新轨迹状态(异步维护) + /// + [SugarColumn(ColumnName = "LatestTrackStatus")] + public string? LatestTrackStatus { get; set; } + /// /// 最新轨迹内容(异步维护) /// @@ -186,6 +194,12 @@ public class OrderEntity : IFullAuditedBasicEntitys, IAggregateRoot [SugarColumn(ColumnName = "TemplateCodes")] public string? TemplateCodes { get; set; } + /// + /// 冗余订单第三方订单号(创建订单,更新订单时维护) + /// + [SugarColumn(ColumnName = "ThirdPartyOrderNumber")] + public string? ThirdPartyOrderNumber { get; set; } // + [SugarColumn(IsIgnore = true)] public List OrderFlights { get; set; } @@ -207,4 +221,27 @@ public class OrderEntity : IFullAuditedBasicEntitys, IAggregateRoot EstimatedDeliveryDate = null; DestinationTimeZone = null; } + + // 设置三方单号字段 + public void SetThirdPartyOrderNumber(List orderPlatformNumberEntities) + { + if (orderPlatformNumberEntities.Count == 0) + { + ThirdPartyOrderNumber = GlobalConst.EmptyString; + return; + } + + const string separator = "、"; + var thirdPartyOrderNumbers = orderPlatformNumberEntities + .Where(x => !string.IsNullOrWhiteSpace(x.OrderNumber)) + .Select(x => $"{x.OrderNumber}({x.Platform})") + .ToList(); + if (thirdPartyOrderNumbers.Count == 0) + { + ThirdPartyOrderNumber = GlobalConst.EmptyString; + return; + } + + ThirdPartyOrderNumber = string.Join(separator, thirdPartyOrderNumbers); + } } diff --git a/src/SJZY.Track.Domain/Dtos/Order/GetPageTrackOrderInputVO.cs b/src/SJZY.Track.Domain/Dtos/Order/GetPageTrackOrderInputVO.cs index b57037a0..79241239 100644 --- a/src/SJZY.Track.Domain/Dtos/Order/GetPageTrackOrderInputVO.cs +++ b/src/SJZY.Track.Domain/Dtos/Order/GetPageTrackOrderInputVO.cs @@ -89,6 +89,11 @@ public class TrackOrderVO ///// //public string? OrderDetails { get; set; } + /// + /// 最新轨迹状态 + /// + public string? NewestTrackStatus { get; set; } + /// /// 最新轨迹内容 /// @@ -109,6 +114,11 @@ public class TrackOrderVO /// public DateTime? NewestTrackTime { get; set; } + /// + /// 最新轨迹时区 + /// + public float? NewestTrackTimeZone { get; set; } + /// /// 是否完结 /// diff --git a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs index 946ebde2..9ee2a1cb 100644 --- a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs @@ -14,52 +14,14 @@ public class OrderRepository : BasicRepository, IOrderRepository, I //tips:后期提供缓存清理接口 //MemoryCache本身线程安全简单使用,短暂数据不一致可以容忍,每过固定时间强制清除缓存 private static readonly MemoryCache _memoryCache = new(new MemoryCacheOptions()); - private static readonly Dictionary _empty = new(); - private static readonly Dictionary> _empty2 = new(); - private static readonly TimeSpan _thirdPartyOrderNumberCacheTimeSpan = TimeSpan.FromMinutes(3); + private static readonly Dictionary> _empty = new(); private static readonly TimeSpan _mainDataEnumCacheTimeSpan = TimeSpan.FromMinutes(5); private static readonly TimeSpan _orderTypeCacheTimeSpan = TimeSpan.FromMinutes(1); - private async Task> GetThirdPartyOrderNumberForCacheAsync(int[] orderIds) - { - const string key = "ThirdPartyOrderNumber"; - if (orderIds.Length == 0) return _empty; - - var dict = _memoryCache.Get>(key); - - orderIds = orderIds.Distinct().ToArray(); - if (dict != null && dict.Count != 0 && !orderIds.Except(dict.Keys).Any()) return dict; - - var orders = await Context.Queryable() - .Includes(a => a.OrderPlatformNumbers) - .LeftJoin((a, b) => a.Id == b.OrderId && b.IsDeleted == false) - .Where((a, b) => orderIds.Contains(a.Id)) - .Select(a => new OrderEntity() - { - Id = a.Id, - OrderPlatformNumbers = a.OrderPlatformNumbers - }) - .ToListAsync(); - - if (orders.Count == 0) - return _empty; - - orders = orders.DistinctBy(x => x.Id).ToList(); - - dict = orders.ToDictionary(x => x.Id, x => BuildThirdPartyOrderNumber(x.OrderPlatformNumbers)); - - _memoryCache.Set(key, dict, new MemoryCacheEntryOptions - { - AbsoluteExpirationRelativeToNow = _thirdPartyOrderNumberCacheTimeSpan, - Size = dict.Count - }); - return dict; - } - private async Task>> GetMainDataEnumForCacheAsync(List orderTypes, List questTypes) { const string key = "EnumForMainData"; - if (orderTypes.Count == 0 && questTypes.Count == 0) return _empty2; + if (orderTypes.Count == 0 && questTypes.Count == 0) return _empty; var dict = _memoryCache.Get>>(key); if (dict != null && dict.Count != 0 @@ -90,7 +52,7 @@ public class OrderRepository : BasicRepository, IOrderRepository, I ); if (dict.Count == 0) - return _empty2; + return _empty; _memoryCache.Set(key, dict, new MemoryCacheEntryOptions { @@ -153,16 +115,19 @@ public class OrderRepository : BasicRepository, IOrderRepository, I CustomerShortName = b.Abbreviation, CustomerCode = b.Code, CustomerId = a.CustomId, + NewestTrackStatus = a.LatestTrackStatus, NewestTrackContent = a.LatestTrackContent, NewestTrackEnContent = a.LatestTrackEnContent, NewestTrackPlace = a.LatestTrackPlace, NewestTrackTime = a.LatestTrackTime, + NewestTrackTimeZone = a.LatestTrackTimeZone, IsFinish = a.IsCompleted, CreateTime = a.CreateTime, SubSystem = c.CnName, SubSystemId = c.Id, DestinationTimeZone = a.DestinationTimeZone, - EstimatedDeliveryDate = a.EstimatedDeliveryDate + EstimatedDeliveryDate = a.EstimatedDeliveryDate, + ThirdPartyOrderNumber = a.ThirdPartyOrderNumber }) .ToPagedListAsync(input.PageIndex, input.PageSize); } @@ -227,26 +192,23 @@ public class OrderRepository : BasicRepository, IOrderRepository, I CustomerShortName = b.Abbreviation, CustomerCode = b.Code, CustomerId = a.CustomId, + NewestTrackStatus = a.LatestTrackStatus, NewestTrackContent = a.LatestTrackContent, NewestTrackEnContent = a.LatestTrackEnContent, NewestTrackPlace = a.LatestTrackPlace, NewestTrackTime = a.LatestTrackTime, + NewestTrackTimeZone = a.LatestTrackTimeZone, IsFinish = a.IsCompleted, CreateTime = a.CreateTime, SubSystem = c.CnName, SubSystemId = c.Id, DestinationTimeZone = a.DestinationTimeZone, EstimatedDeliveryDate = a.EstimatedDeliveryDate, + ThirdPartyOrderNumber = a.ThirdPartyOrderNumber }) .ToPagedListAsync(input.PageIndex, input.PageSize); } - - //补三方单号,从缓存中加速查 - var orderIdArr = pageList.List.Select(x => x.Id).ToArray(); - var thirdPartyOrderNumbers = await GetThirdPartyOrderNumberForCacheAsync(orderIdArr); - pageList.List.ForEach(x => x.ThirdPartyOrderNumber = thirdPartyOrderNumbers[x.Id]); - //查询订单类型描述,从缓存中加速查 var orderTypes = pageList.List.Select(x => x.OrderType).Distinct().ToList(); var questTypes = pageList.List.Select(x => x.QuestionType).Distinct().ToList();