diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetPageTrackOrderInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetPageTrackOrderInput.cs
index 61d9fb82..324e9c48 100644
--- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetPageTrackOrderInput.cs
+++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetPageTrackOrderInput.cs
@@ -152,4 +152,19 @@ public class TrackOrderDto
///// 问题描述名称
/////
//public string? ProblemDescriptionName { get; set; }
+
+ ///
+ /// 预计到达时间
+ ///
+ public DateTime? EstimatedDeliveryDate { get; set; }
+
+ ///
+ /// 目的地时区
+ ///
+ public float? DestinationTimeZone { get; set; }
+
+ ///
+ /// 第三方单号,服务商-轨迹0000000、轨迹服务商-0000000
+ ///
+ public string? ThirdPartyOrderNumber { get; set; }
}
diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpdateOrderInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpdateOrderInput.cs
index 02f025e8..b46ff5be 100644
--- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpdateOrderInput.cs
+++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpdateOrderInput.cs
@@ -57,6 +57,16 @@ public class UpdateOrderInput : OrderNoInfo
///
public string? ProductCode { get; set; }
+ ///
+ /// 预计到达时间
+ ///
+ public DateTime? EstimatedDeliveryDate { get; set; }
+
+ ///
+ /// 目的地时区
+ ///
+ public float? DestinationTimeZone { get; set; }
+
///
/// 拉取配置信息
///
@@ -76,6 +86,11 @@ public class PullConfigInfo
[Required]
public string ServiceCode { get; set; }
+ ///
+ /// api服务商订单号(第三方单号)
+ ///
+ public string? OrderNo { get; set; }
+
///
/// 开始轨迹code
///
diff --git a/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs b/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs
index fd7f723e..07859810 100644
--- a/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs
+++ b/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs
@@ -36,6 +36,13 @@ public partial class OrderService : ApplicationService, IOrderService
[HttpPost("Order/Upsert")]
public async Task> UpsertAsync(UpsertOrderInput input)
{
+ // 校验预计到达时间是否不是同时存在或同时不存在
+ if ((input.EstimatedDeliveryDate.HasValue && input.DestinationTimeZone.HasValue == false) ||
+ (input.EstimatedDeliveryDate.HasValue == false && input.DestinationTimeZone.HasValue))
+ {
+ throw new BusinessException(message: "【目的地时区】和【预计到达时间】必须同时输入");
+ }
+
// 校验订单是否已存在,存在则更新
var order = await _orderRepository.GetFirstAsync(x =>
x.SubSystemId == input.SubSystemId && x.OrderType == input.OrderType && x.OrderNo == input.OrderNo);
@@ -64,6 +71,7 @@ public partial class OrderService : ApplicationService, IOrderService
order.SubSystemId = input.SubSystemId;
order.OrderFlights = ObjectMapper.Map, List>(input.FlightInfos);
order.OrderPullStatus = BuiltOrderPullStatus(input.PullConfigInfos);
+ order.OrderPlatformNumbers = BuiltOrderPlatformNumbers(input.PullConfigInfos);
var orderId = await _orderRepository.CreateOrderAsync(order);
@@ -128,6 +136,7 @@ public partial class OrderService : ApplicationService, IOrderService
var status = new OrderPullStatusEntity
{
ServiceProviderCode = x.ServiceCode,
+ OrderNo = x.OrderNo,
PullStatus = TrackPullStatus.Init,
StartTrackCode = x.StartCode ?? GlobalConst.EmptyString,
EndTrackCode = x.EndCode ?? GlobalConst.EmptyString,
@@ -144,6 +153,23 @@ public partial class OrderService : ApplicationService, IOrderService
status.StartTime = DateTime.Now.AddHours(x.SilenceTime);
}
+ return status;
+ }).ToList();
+ }
+ private List BuiltOrderPlatformNumbers(List? pullConfigInfos)
+ {
+ if (pullConfigInfos == null) return new List();
+
+ return pullConfigInfos.Select(x =>
+ {
+ var status = new OrderPlatformNumberEntity
+ {
+ //三方单号
+ OrderNumber = x.OrderNo,
+ //三方平台名称,目前认为是服务商code
+ Platform = x.ServiceCode,
+ };
+
return status;
}).ToList();
}
diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs
index 45c49e45..b2e3a5ba 100644
--- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs
+++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs
@@ -168,22 +168,25 @@ public class OrderEntity : IFullAuditedBasicEntitys, IAggregateRoot
[SugarColumn(ColumnName = "ArrivalProvince")]
public string? ArrivalProvince { get; set; }
- [SugarColumn(IsIgnore = true)] public List OrderFlights { get; set; }
-
- [SugarColumn(IsIgnore = true)] public List OrderPullStatus { get; set; }
-
- ///
- /// 目的地时区
- ///
- [SugarColumn(ColumnName = "DestinationTimeZone")]
- public float DestinationTimeZone { get; set; }
-
///
/// 预计到达时间
///
[SugarColumn(ColumnName = "EstimatedDeliveryDate")]
public DateTime? EstimatedDeliveryDate { get; set; }
+ ///
+ /// 目的地时区
+ ///
+ [SugarColumn(ColumnName = "DestinationTimeZone")]
+ public float? DestinationTimeZone { get; set; }
+
+ [SugarColumn(IsIgnore = true)] public List OrderFlights { get; set; }
+
+ [SugarColumn(IsIgnore = true)] public List OrderPullStatus { get; set; }
+
+ [Navigate(NavigateType.OneToMany, nameof(OrderPlatformNumberEntity.OrderId))]
+ [SugarColumn(IsIgnore = true)] public List OrderPlatformNumbers { get; set; }
+
public void ResetTrackInfo()
{
IsCompleted = false;
diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderPlatformNumberEntity.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderPlatformNumberEntity.cs
new file mode 100644
index 00000000..07a331db
--- /dev/null
+++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderPlatformNumberEntity.cs
@@ -0,0 +1,32 @@
+namespace SJZY.Track.Domain.Aggregates.OrderAggregate;
+
+///
+/// 外部单号关联表
+///
+[SugarTable("t_order_platform_number")]
+public class OrderPlatformNumberEntity : IFullAuditedBasicEntitys, IEntity
+{
+ ///
+ /// 自增主键
+ ///
+ [SugarColumn(ColumnName = "Id", IsPrimaryKey = true, IsIdentity = true)]
+ public int Id { get; set; }
+
+ ///
+ /// 订单id
+ ///
+ [SugarColumn(ColumnName = "OrderId")]
+ public int OrderId { get; set; }
+
+ ///
+ /// 外部单号
+ ///
+ [SugarColumn(ColumnName = "OrderNumber")]
+ public string OrderNumber { get; set; }
+
+ ///
+ /// 平台名称
+ ///
+ [SugarColumn(ColumnName = "Platform")]
+ public string? Platform { get; set; }
+}
diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderTrackPullStatusEntity.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderTrackPullStatusEntity.cs
index 29215b28..b4db417c 100644
--- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderTrackPullStatusEntity.cs
+++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderTrackPullStatusEntity.cs
@@ -18,6 +18,12 @@ public class OrderPullStatusEntity : ICreateBaicEntity, IUpdateBasicEntity, IEnt
[SugarColumn(ColumnName = "OrderId")]
public int OrderId { get; set; }
+ ///
+ /// api服务商订单号(第三方单号)
+ ///
+ [SugarColumn(ColumnName = "OrderNo")]
+ public string? OrderNo { get; set; }
+
///
/// 服务商code
///
diff --git a/src/SJZY.Track.Domain/Dtos/Order/GetPageTrackOrderInputVO.cs b/src/SJZY.Track.Domain/Dtos/Order/GetPageTrackOrderInputVO.cs
index 7d473d1f..b57037a0 100644
--- a/src/SJZY.Track.Domain/Dtos/Order/GetPageTrackOrderInputVO.cs
+++ b/src/SJZY.Track.Domain/Dtos/Order/GetPageTrackOrderInputVO.cs
@@ -68,6 +68,7 @@ public class TrackOrderVO
///
public string? OrderNumber { get; set; }
+
///
/// 客户简称
///
@@ -137,4 +138,19 @@ public class TrackOrderVO
/// 问题类型名称
///
public string? QuestionTypeName { get; set; }
+
+ ///
+ /// 预计到达时间
+ ///
+ public DateTime? EstimatedDeliveryDate { get; set; }
+
+ ///
+ /// 目的地时区
+ ///
+ public float? DestinationTimeZone { get; set; }
+
+ ///
+ /// 第三方单号,服务商-轨迹0000000、轨迹服务商-0000000
+ ///
+ public string? ThirdPartyOrderNumber { get; set; }
}
diff --git a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs
index eb62e350..e3172b1f 100644
--- a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs
+++ b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs
@@ -12,11 +12,14 @@ public class OrderRepository : BasicRepository, IOrderRepository, I
{
public async Task> GetTrackOrderPagedList(GetPageTrackOrderInputVO input)
{
+ //查询完去重
var pageList = await Context.Queryable()
+ .Includes(a => a.OrderPlatformNumbers)
.LeftJoin((a, b) => a.CustomId == b.Id && b.IsDeleted == false)
.LeftJoin((a, b, c) => a.SubSystemId == c.Id && c.IsDeleted == false)
+ .LeftJoin((a, b, c, d) => a.Id == d.OrderId && d.IsDeleted == false)
.WhereIF(input.SubSystemId > 0, (a, b, c) => a.SubSystemId == input.SubSystemId)
- .WhereIF(!input.OrderNos.IsNullOrEmpty(), (a, b, c) => input.OrderNos!.Contains(a.OrderNo))
+ .WhereIF(!input.OrderNos.IsNullOrEmpty(), (a, b, c, d) => input.OrderNos!.Contains(a.OrderNo) || input.OrderNos!.Contains(d.OrderNumber))
.WhereIF(input.CreateTimeStart.HasValue && input.CreateTimeEnd.HasValue,
(a, b, c) => a.CreateTime >= input.CreateTimeStart && a.CreateTime <= input.CreateTimeEnd)
.WhereIF(input.CreateTimeStart.HasValue && (!input.CreateTimeEnd.HasValue),
@@ -28,6 +31,7 @@ public class OrderRepository : BasicRepository, IOrderRepository, I
.WhereIF(input.TabType > 0, (a, b, c) => a.QuestionType == input.TabType)
.WhereIF(input.TabType == (int) TrackProblemType.Warn, (a, b, c) => !a.IsCompleted)
.OrderByDescending((a, b, c) => a.CreateTime)
+ .Distinct()
.Select((a, b, c) => new TrackOrderVO
{
Id = a.Id,
@@ -44,7 +48,10 @@ public class OrderRepository : BasicRepository, IOrderRepository, I
IsFinish = a.IsCompleted,
CreateTime = a.CreateTime,
SubSystem = c.CnName,
- SubSystemId = c.Id
+ SubSystemId = c.Id,
+ DestinationTimeZone = a.DestinationTimeZone,
+ EstimatedDeliveryDate = a.EstimatedDeliveryDate,
+ ThirdPartyOrderNumber = BuildThirdPartyOrderNumber(a.OrderPlatformNumbers)
})
.ToPagedListAsync(input.PageIndex, input.PageSize);
@@ -60,6 +67,8 @@ public class OrderRepository : BasicRepository, IOrderRepository, I
await Context.Insertable(order.OrderFlights).ExecuteCommandAsync();
order.OrderPullStatus.ForEach(x => x.OrderId = orderId);
await Context.Insertable(order.OrderPullStatus).ExecuteCommandAsync();
+ order.OrderPlatformNumbers.ForEach(x => x.OrderId = orderId);
+ await Context.Insertable(order.OrderPlatformNumbers).ExecuteCommandAsync();
tran.Complete();
@@ -174,6 +183,20 @@ public class OrderRepository : BasicRepository, IOrderRepository, I
});
}
+ ///
+ /// 拼接多个三方单号,默认使用分隔符默认(、)
+ /// 第三方单号,服务商-轨迹0000000、轨迹服务商-0000000
+ ///
+ ///
+ ///
+ private static string BuildThirdPartyOrderNumber(List orderPlatformNumberEntities)
+ {
+ const string separator = "、";
+ var thirdPartyOrderNumbers = orderPlatformNumberEntities
+ .Select(x => $"{x.Platform}-{x.OrderNumber}").ToList();
+ return string.Join(separator, thirdPartyOrderNumbers);
+ }
+
#region 订单关联
public async Task> GetLinkedOrdersAsync(int[] orderIds)