add-entity:
增加外部单号关联表实体OrderPlatformNumberEntity,一个主单关联对个外部单 update-entity: OrderEntity,增加OrderPlatformNumbers导航属性用于SqlSugar的Include关联加载 OrderPullStatusEntity,增加Order(第三方单号)字段,当作拉取轨迹的首选项 入参模型更新: UpdateOrderInput:轨迹订单创建/更新入参,增加【预计到达时间】【目的地时区】用于初始化 反参模型更新: TrackOrderDto:用于轨迹订单查询的反参,增加【预计到达时间】【目的地时区】【第三方单号(格式化拼接后的字符串)】 feat: - 实现轨迹订单查询支持三方单号查询,并将多个关联三方单号按(平台名称-三方单号)格式使用(、)拼接返回 - 创建/修改订单增加校验,规则为:【预计到达时间】【目的地时区】入参字段只允许全有值或全无值。
This commit is contained in:
parent
3d230a8b27
commit
695380e97d
@ -152,4 +152,19 @@ public class TrackOrderDto
|
||||
///// 问题描述名称
|
||||
///// </summary>
|
||||
//public string? ProblemDescriptionName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 预计到达时间
|
||||
/// </summary>
|
||||
public DateTime? EstimatedDeliveryDate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 目的地时区
|
||||
/// </summary>
|
||||
public float? DestinationTimeZone { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 第三方单号,服务商-轨迹0000000、轨迹服务商-0000000
|
||||
/// </summary>
|
||||
public string? ThirdPartyOrderNumber { get; set; }
|
||||
}
|
||||
|
||||
@ -57,6 +57,16 @@ public class UpdateOrderInput : OrderNoInfo
|
||||
/// </summary>
|
||||
public string? ProductCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 预计到达时间
|
||||
/// </summary>
|
||||
public DateTime? EstimatedDeliveryDate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 目的地时区
|
||||
/// </summary>
|
||||
public float? DestinationTimeZone { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 拉取配置信息
|
||||
/// </summary>
|
||||
@ -76,6 +86,11 @@ public class PullConfigInfo
|
||||
[Required]
|
||||
public string ServiceCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// api服务商订单号(第三方单号)
|
||||
/// </summary>
|
||||
public string? OrderNo { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 开始轨迹code
|
||||
/// </summary>
|
||||
|
||||
@ -36,6 +36,13 @@ public partial class OrderService : ApplicationService, IOrderService
|
||||
[HttpPost("Order/Upsert")]
|
||||
public async Task<UnifyResultDto<IdBaseDto>> 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<OrderFlightInfo>, List<OrderFlightEntity>>(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<OrderPlatformNumberEntity> BuiltOrderPlatformNumbers(List<PullConfigInfo>? pullConfigInfos)
|
||||
{
|
||||
if (pullConfigInfos == null) return new List<OrderPlatformNumberEntity>();
|
||||
|
||||
return pullConfigInfos.Select(x =>
|
||||
{
|
||||
var status = new OrderPlatformNumberEntity
|
||||
{
|
||||
//三方单号
|
||||
OrderNumber = x.OrderNo,
|
||||
//三方平台名称,目前认为是服务商code
|
||||
Platform = x.ServiceCode,
|
||||
};
|
||||
|
||||
return status;
|
||||
}).ToList();
|
||||
}
|
||||
|
||||
@ -168,22 +168,25 @@ public class OrderEntity : IFullAuditedBasicEntitys, IAggregateRoot
|
||||
[SugarColumn(ColumnName = "ArrivalProvince")]
|
||||
public string? ArrivalProvince { get; set; }
|
||||
|
||||
[SugarColumn(IsIgnore = true)] public List<OrderFlightEntity> OrderFlights { get; set; }
|
||||
|
||||
[SugarColumn(IsIgnore = true)] public List<OrderPullStatusEntity> OrderPullStatus { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 目的地时区
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "DestinationTimeZone")]
|
||||
public float DestinationTimeZone { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 预计到达时间
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "EstimatedDeliveryDate")]
|
||||
public DateTime? EstimatedDeliveryDate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 目的地时区
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "DestinationTimeZone")]
|
||||
public float? DestinationTimeZone { get; set; }
|
||||
|
||||
[SugarColumn(IsIgnore = true)] public List<OrderFlightEntity> OrderFlights { get; set; }
|
||||
|
||||
[SugarColumn(IsIgnore = true)] public List<OrderPullStatusEntity> OrderPullStatus { get; set; }
|
||||
|
||||
[Navigate(NavigateType.OneToMany, nameof(OrderPlatformNumberEntity.OrderId))]
|
||||
[SugarColumn(IsIgnore = true)] public List<OrderPlatformNumberEntity> OrderPlatformNumbers { get; set; }
|
||||
|
||||
public void ResetTrackInfo()
|
||||
{
|
||||
IsCompleted = false;
|
||||
|
||||
@ -0,0 +1,32 @@
|
||||
namespace SJZY.Track.Domain.Aggregates.OrderAggregate;
|
||||
|
||||
/// <summary>
|
||||
/// 外部单号关联表
|
||||
/// </summary>
|
||||
[SugarTable("t_order_platform_number")]
|
||||
public class OrderPlatformNumberEntity : IFullAuditedBasicEntitys, IEntity
|
||||
{
|
||||
/// <summary>
|
||||
/// 自增主键
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "Id", IsPrimaryKey = true, IsIdentity = true)]
|
||||
public int Id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 订单id
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "OrderId")]
|
||||
public int OrderId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 外部单号
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "OrderNumber")]
|
||||
public string OrderNumber { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 平台名称
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "Platform")]
|
||||
public string? Platform { get; set; }
|
||||
}
|
||||
@ -18,6 +18,12 @@ public class OrderPullStatusEntity : ICreateBaicEntity, IUpdateBasicEntity, IEnt
|
||||
[SugarColumn(ColumnName = "OrderId")]
|
||||
public int OrderId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// api服务商订单号(第三方单号)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "OrderNo")]
|
||||
public string? OrderNo { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 服务商code
|
||||
/// </summary>
|
||||
|
||||
@ -68,6 +68,7 @@ public class TrackOrderVO
|
||||
/// </summary>
|
||||
public string? OrderNumber { get; set; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 客户简称
|
||||
/// </summary>
|
||||
@ -137,4 +138,19 @@ public class TrackOrderVO
|
||||
/// 问题类型名称
|
||||
/// </summary>
|
||||
public string? QuestionTypeName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 预计到达时间
|
||||
/// </summary>
|
||||
public DateTime? EstimatedDeliveryDate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 目的地时区
|
||||
/// </summary>
|
||||
public float? DestinationTimeZone { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 第三方单号,服务商-轨迹0000000、轨迹服务商-0000000
|
||||
/// </summary>
|
||||
public string? ThirdPartyOrderNumber { get; set; }
|
||||
}
|
||||
|
||||
@ -12,11 +12,14 @@ public class OrderRepository : BasicRepository<OrderEntity>, IOrderRepository, I
|
||||
{
|
||||
public async Task<UnifyPageResultDto<TrackOrderVO>> GetTrackOrderPagedList(GetPageTrackOrderInputVO input)
|
||||
{
|
||||
//查询完去重
|
||||
var pageList = await Context.Queryable<OrderEntity>()
|
||||
.Includes(a => a.OrderPlatformNumbers)
|
||||
.LeftJoin<VExternalSubjectEntity>((a, b) => a.CustomId == b.Id && b.IsDeleted == false)
|
||||
.LeftJoin<VSystemEntity>((a, b, c) => a.SubSystemId == c.Id && c.IsDeleted == false)
|
||||
.LeftJoin<OrderPlatformNumberEntity>((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<OrderEntity>, 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<OrderEntity>, 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<OrderEntity>, 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<OrderEntity>, IOrderRepository, I
|
||||
});
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 拼接多个三方单号,默认使用分隔符默认(、)
|
||||
/// 第三方单号,服务商-轨迹0000000、轨迹服务商-0000000
|
||||
/// </summary>
|
||||
/// <param name="orderPlatformNumberEntities"></param>
|
||||
/// <returns></returns>
|
||||
private static string BuildThirdPartyOrderNumber(List<OrderPlatformNumberEntity> orderPlatformNumberEntities)
|
||||
{
|
||||
const string separator = "、";
|
||||
var thirdPartyOrderNumbers = orderPlatformNumberEntities
|
||||
.Select(x => $"{x.Platform}-{x.OrderNumber}").ToList();
|
||||
return string.Join(separator, thirdPartyOrderNumbers);
|
||||
}
|
||||
|
||||
#region 订单关联
|
||||
|
||||
public async Task<List<LinkedOrderVO>> GetLinkedOrdersAsync(int[] orderIds)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user