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.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);
- }
+
}
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();