parent
a02e4ca8b2
commit
f24168b62d
@ -0,0 +1,112 @@
|
|||||||
|
using DotNetCore.CAP;
|
||||||
|
using SJZY.Track.Application.Contract.Dtos.ProvideServices;
|
||||||
|
using SJZY.Track.Application.Contract.Events;
|
||||||
|
using SJZY.Track.Domain.Aggregates.OrderAggregate;
|
||||||
|
using SJZY.Track.Domain.Consts;
|
||||||
|
using SJZY.Track.Domain.Queries;
|
||||||
|
|
||||||
|
namespace SJZY.Track.Application.Services.ProvideServices;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 订单关联服务
|
||||||
|
/// </summary>
|
||||||
|
public partial class OrderService
|
||||||
|
{
|
||||||
|
private readonly IBasicQuery<OrderLinkEntity> _orderLinkQuery;
|
||||||
|
private readonly ICapPublisher _capPublisher;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 关联、解除关联订单
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="input"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
/// <exception cref="BusinessException"></exception>
|
||||||
|
[HttpPost("Order/Link")]
|
||||||
|
public async Task<bool> LinkOrderAsync(LinkOrderInput input)
|
||||||
|
{
|
||||||
|
var order = await _orderRepository.GetFirstAsync(x =>
|
||||||
|
x.OrderType == input.OrderType && x.OrderNo == input.OrderNo, x => new
|
||||||
|
{
|
||||||
|
x.Id, x.SubSystemId
|
||||||
|
});
|
||||||
|
if (order == default)
|
||||||
|
{
|
||||||
|
throw new BusinessException(message: $"订单:{input.OrderNo}不存在");
|
||||||
|
}
|
||||||
|
|
||||||
|
//tips:循环关联问题再消费时解决
|
||||||
|
if (input.OrderType == input.LinkOrderType)
|
||||||
|
{
|
||||||
|
throw new BusinessException(message: "不能同级关联");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (input.LinkOrderNos.Count < 1 || input.LinkOrderType == 0) return true;
|
||||||
|
|
||||||
|
// 单号去重,去空,去自己
|
||||||
|
input.LinkOrderNos = input.LinkOrderNos
|
||||||
|
.Where(x => !x.IsNullOrWhiteSpace() && x != input.OrderNo)
|
||||||
|
.Distinct().ToList();
|
||||||
|
|
||||||
|
// 解绑
|
||||||
|
if (!input.IsLink) return await UnLinkOrderAsync(input);
|
||||||
|
|
||||||
|
// 关联订单
|
||||||
|
var linkedOrderIds = await DoLinkOrderAsync(input, order.Id);
|
||||||
|
|
||||||
|
// 补轨迹
|
||||||
|
if (linkedOrderIds.Count > 0)
|
||||||
|
{
|
||||||
|
await _capPublisher.PublishAsync(GlobalConst.OrderLinkAfterFillTrack, new OrderLinkAfterFillTrackEvent
|
||||||
|
{
|
||||||
|
OrderId = order.Id,
|
||||||
|
SubSystemId = order.SubSystemId,
|
||||||
|
LinkedOrderIds = linkedOrderIds,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task<List<int>> DoLinkOrderAsync(LinkOrderInput input, int orderId)
|
||||||
|
{
|
||||||
|
// 获取已关联的订单
|
||||||
|
var linkOrderNos = await _orderLinkQuery.GetListAsync(x =>
|
||||||
|
x.OrderType == input.OrderType && x.OrderNo == input.OrderNo && x.LinkOrderType == input.LinkOrderType,
|
||||||
|
x => x.LinkOrderNo);
|
||||||
|
|
||||||
|
// 计算出未关联的订单
|
||||||
|
var noLinkOrderNos = input.LinkOrderNos.Except(linkOrderNos);
|
||||||
|
|
||||||
|
// 过滤掉不存在的订单
|
||||||
|
var canLinkOrders = await _orderRepository.GetListAsync(x =>
|
||||||
|
x.OrderType == input.LinkOrderType && noLinkOrderNos.Contains(x.OrderNo),
|
||||||
|
x => new { x.Id, x.OrderNo });
|
||||||
|
|
||||||
|
if (canLinkOrders.Count == 0) return new List<int>();
|
||||||
|
|
||||||
|
await _orderRepository.LinkOrderAsync(canLinkOrders.Select(x => new OrderLinkEntity
|
||||||
|
{
|
||||||
|
OrderId = orderId,
|
||||||
|
OrderNo = input.OrderNo,
|
||||||
|
OrderType = input.OrderType,
|
||||||
|
LinkOrderId = x.Id,
|
||||||
|
LinkOrderNo = x.OrderNo,
|
||||||
|
LinkOrderType = input.LinkOrderType
|
||||||
|
}).ToList());
|
||||||
|
|
||||||
|
return canLinkOrders.Select(x => x.Id).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task<bool> UnLinkOrderAsync(LinkOrderInput input)
|
||||||
|
{
|
||||||
|
var unLinkIds = await _orderLinkQuery.GetListAsync(x =>
|
||||||
|
x.OrderType == input.OrderType && x.OrderNo == input.OrderNo &&
|
||||||
|
x.LinkOrderType == input.LinkOrderType && input.LinkOrderNos.Contains(x.LinkOrderNo),
|
||||||
|
x => x.Id);
|
||||||
|
|
||||||
|
// real del
|
||||||
|
await _orderRepository.UnLinkByIdsAsync(unLinkIds);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,9 +1,7 @@
|
|||||||
using DotNetCore.CAP;
|
using DotNetCore.CAP;
|
||||||
using SJZY.Track.Application.Contract.Dtos.ProvideServices;
|
using SJZY.Track.Application.Contract.Dtos.ProvideServices;
|
||||||
using SJZY.Track.Application.Contract.Events;
|
|
||||||
using SJZY.Track.Application.Contract.Services;
|
using SJZY.Track.Application.Contract.Services;
|
||||||
using SJZY.Track.Domain.Aggregates.OrderAggregate;
|
using SJZY.Track.Domain.Aggregates.OrderAggregate;
|
||||||
using SJZY.Track.Domain.Consts;
|
|
||||||
using SJZY.Track.Domain.Queries;
|
using SJZY.Track.Domain.Queries;
|
||||||
using SJZY.UserCenter.HttpApi.Services;
|
using SJZY.UserCenter.HttpApi.Services;
|
||||||
|
|
||||||
@ -17,9 +15,6 @@ namespace SJZY.Track.Application.Services.ProvideServices;
|
|||||||
public partial class OrderService : ApplicationService, IOrderService
|
public partial class OrderService : ApplicationService, IOrderService
|
||||||
{
|
{
|
||||||
private readonly IOrderRepository _orderRepository;
|
private readonly IOrderRepository _orderRepository;
|
||||||
private readonly IBasicQuery<OrderLinkEntity> _orderLinkQuery;
|
|
||||||
private readonly ICapPublisher _capPublisher;
|
|
||||||
|
|
||||||
|
|
||||||
public OrderService(IOrderRepository orderRepository, IBasicQuery<OrderLinkEntity> orderLinkQuery,
|
public OrderService(IOrderRepository orderRepository, IBasicQuery<OrderLinkEntity> orderLinkQuery,
|
||||||
ICapPublisher capPublisher)
|
ICapPublisher capPublisher)
|
||||||
@ -84,100 +79,4 @@ public partial class OrderService : ApplicationService, IOrderService
|
|||||||
order.OrderFlights = ObjectMapper.Map<List<OrderFlightInfo>, List<OrderFlightEntity>>(input.FlightInfos);
|
order.OrderFlights = ObjectMapper.Map<List<OrderFlightInfo>, List<OrderFlightEntity>>(input.FlightInfos);
|
||||||
await _orderRepository.UpdateOrderAsync(order);
|
await _orderRepository.UpdateOrderAsync(order);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 关联、解除关联订单
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="input"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
/// <exception cref="BusinessException"></exception>
|
|
||||||
[HttpPost("Order/Link")]
|
|
||||||
public async Task<bool> LinkOrderAsync(LinkOrderInput input)
|
|
||||||
{
|
|
||||||
var order = await _orderRepository.GetFirstAsync(x =>
|
|
||||||
x.OrderType == input.OrderType && x.OrderNo == input.OrderNo, x => new
|
|
||||||
{
|
|
||||||
x.Id,
|
|
||||||
x.SubSystemId
|
|
||||||
});
|
|
||||||
if (order == default)
|
|
||||||
{
|
|
||||||
throw new BusinessException(message: $"订单:{input.OrderNo}不存在");
|
|
||||||
}
|
|
||||||
|
|
||||||
//tips:循环关联问题再消费时解决
|
|
||||||
if (input.OrderType == input.LinkOrderType)
|
|
||||||
{
|
|
||||||
throw new BusinessException(message: "不能同级关联");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (input.LinkOrderNos.Count < 1 || input.LinkOrderType == 0) return true;
|
|
||||||
|
|
||||||
// 单号去重,去空,去自己
|
|
||||||
input.LinkOrderNos = input.LinkOrderNos
|
|
||||||
.Where(x => !x.IsNullOrWhiteSpace() && x != input.OrderNo)
|
|
||||||
.Distinct().ToList();
|
|
||||||
|
|
||||||
// 解绑
|
|
||||||
if (!input.IsLink) return await UnLinkOrderAsync(input);
|
|
||||||
|
|
||||||
// 关联订单
|
|
||||||
var linkedOrderIds = await DoLinkOrderAsync(input, order.Id);
|
|
||||||
|
|
||||||
// 补轨迹
|
|
||||||
if (linkedOrderIds.Count > 0)
|
|
||||||
{
|
|
||||||
await _capPublisher.PublishAsync(GlobalConst.OrderLinkAfterFillTrack, new OrderLinkAfterFillTrackEvent
|
|
||||||
{
|
|
||||||
OrderId = order.Id,
|
|
||||||
SubSystemId = order.SubSystemId,
|
|
||||||
LinkedOrderIds = linkedOrderIds,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task<List<int>> DoLinkOrderAsync(LinkOrderInput input, int orderId)
|
|
||||||
{
|
|
||||||
// 获取已关联的订单
|
|
||||||
var linkOrderNos = await _orderLinkQuery.GetListAsync(x =>
|
|
||||||
x.OrderType == input.OrderType && x.OrderNo == input.OrderNo && x.LinkOrderType == input.LinkOrderType,
|
|
||||||
x => x.LinkOrderNo);
|
|
||||||
|
|
||||||
// 计算出未关联的订单
|
|
||||||
var noLinkOrderNos = input.LinkOrderNos.Except(linkOrderNos);
|
|
||||||
|
|
||||||
// 过滤掉不存在的订单
|
|
||||||
var canLinkOrders = await _orderRepository.GetListAsync(x =>
|
|
||||||
x.OrderType == input.LinkOrderType && noLinkOrderNos.Contains(x.OrderNo),
|
|
||||||
x => new { x.Id, x.OrderNo });
|
|
||||||
|
|
||||||
if (canLinkOrders.Count == 0) return new List<int>();
|
|
||||||
|
|
||||||
await _orderRepository.LinkOrderAsync(canLinkOrders.Select(x => new OrderLinkEntity
|
|
||||||
{
|
|
||||||
OrderId = orderId,
|
|
||||||
OrderNo = input.OrderNo,
|
|
||||||
OrderType = input.OrderType,
|
|
||||||
LinkOrderId = x.Id,
|
|
||||||
LinkOrderNo = x.OrderNo,
|
|
||||||
LinkOrderType = input.LinkOrderType
|
|
||||||
}).ToList());
|
|
||||||
|
|
||||||
return canLinkOrders.Select(x => x.Id).ToList();
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task<bool> UnLinkOrderAsync(LinkOrderInput input)
|
|
||||||
{
|
|
||||||
var unLinkIds = await _orderLinkQuery.GetListAsync(x =>
|
|
||||||
x.OrderType == input.OrderType && x.OrderNo == input.OrderNo &&
|
|
||||||
x.LinkOrderType == input.LinkOrderType && input.LinkOrderNos.Contains(x.LinkOrderNo),
|
|
||||||
x => x.Id);
|
|
||||||
|
|
||||||
// real del
|
|
||||||
await _orderRepository.UnLinkByIdsAsync(unLinkIds);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue
Block a user