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 c5488f36..bb7d8dd3 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(); @@ -179,6 +188,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)