add-entity:

增加外部单号关联表实体OrderPlatformNumberEntity,一个主单关联对个外部单

update-entity:
OrderEntity,增加OrderPlatformNumbers导航属性用于SqlSugar的Include关联加载
OrderPullStatusEntity,增加Order(第三方单号)字段,当作拉取轨迹的首选项

入参模型更新:
UpdateOrderInput:轨迹订单创建/更新入参,增加【预计到达时间】【目的地时区】用于初始化

反参模型更新:
TrackOrderDto:用于轨迹订单查询的反参,增加【预计到达时间】【目的地时区】【第三方单号(格式化拼接后的字符串)】

feat:
- 实现轨迹订单查询支持三方单号查询,并将多个关联三方单号按(平台名称-三方单号)格式使用(、)拼接返回
- 创建/修改订单增加校验,规则为:【预计到达时间】【目的地时区】入参字段只允许全有值或全无值。
This commit is contained in:
云龙 王 2024-11-13 16:26:49 +08:00
parent 3d230a8b27
commit 695380e97d
8 changed files with 148 additions and 12 deletions

View File

@ -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; }
}

View File

@ -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>

View File

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

View File

@ -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;

View File

@ -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; }
}

View File

@ -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>

View File

@ -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; }
}

View File

@ -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)