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();