perf: 删除轨迹提供接口(单个订单),支持使用EsId来删除轨迹(当和标识符都不为空则优先以esId优先),并解除标识符号的必填限制
perf: 轨迹查询提供接口,增加es反参 perf: 支持轨迹更新的esId更新(要求确保是单个订单的单个轨迹)
This commit is contained in:
parent
47ebc8b09b
commit
84792dc502
@ -9,8 +9,12 @@ public class DeleteOrderInput : OrderNoInfo
|
||||
public class DeleteTrackInput : OrderNoInfo
|
||||
{
|
||||
/// <summary>
|
||||
/// 轨迹标识符集合,必填
|
||||
/// 轨迹标识符集合,为支持esid删除,所以非必填
|
||||
/// </summary>
|
||||
[Required]
|
||||
public List<TrackIdentifierDto> TrackIdentifiers { get; set; } = new();
|
||||
public List<TrackIdentifierDto>? TrackIdentifiers { get; set; } = new();
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹ESId集合,非必填,如果有优先级最高
|
||||
/// </summary>
|
||||
public List<string>? EsIds { get; set; }
|
||||
}
|
||||
|
||||
@ -15,6 +15,7 @@ public class GetTrackOutput
|
||||
|
||||
public class TrackDetail
|
||||
{
|
||||
public string EsId { get; set; } = null!;
|
||||
public string Code { get; set; } = null!;
|
||||
public string Status { get; set; } = null!;
|
||||
public string? Content { get; set; }
|
||||
|
||||
@ -9,6 +9,11 @@ public class UpsertTrackInput : OrderNoInfo
|
||||
/// </summary>
|
||||
public bool IsAdd { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹唯一标识(可选)
|
||||
/// </summary>
|
||||
public string? EsId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹内容代码
|
||||
/// </summary>
|
||||
|
||||
@ -19,6 +19,11 @@ public class TrackUpsertEvent
|
||||
/// </summary>
|
||||
public OrderIdentifier[] OrderIdentifiers { get; set; } = null!;
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹唯一标识(用于单个订单更新单条轨迹,如果有的话优先级最高)
|
||||
/// </summary>
|
||||
public string? EsId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 操作人(null则默认系统)
|
||||
/// </summary>
|
||||
|
||||
@ -242,6 +242,12 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
|
||||
TrackDetailsIndex? track;
|
||||
if (!@event.IsAdd)
|
||||
{
|
||||
//如果命中了esId
|
||||
track = string.IsNullOrWhiteSpace(@event.EsId)
|
||||
? null
|
||||
: tracks.FirstOrDefault(x => x.Id == @event.EsId);
|
||||
if (track != null) goto TipEsIdTrack;
|
||||
|
||||
//同一订单同轨迹code同一轨迹时间如果有多条轨迹明细则不允许修改
|
||||
var existTracks = tracks.Where(x => x.OrderId == order.OrderId
|
||||
&& x.TrackTime == @event.TrackTime).ToArray();
|
||||
@ -291,6 +297,8 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
|
||||
//其余情况:A,D都为新增操作,无需检查数量,track为null执行新增操作
|
||||
}
|
||||
|
||||
//通过esId命中了轨迹
|
||||
TipEsIdTrack:
|
||||
if (track == default)
|
||||
{
|
||||
track = new TrackDetailsIndex
|
||||
|
||||
@ -61,6 +61,7 @@ public partial class TrackService
|
||||
|
||||
item.TrackDetails = trackDetails.Select(x => new TrackDetail
|
||||
{
|
||||
EsId = x.Id,
|
||||
Code = x.TrackCode,
|
||||
Status = x.TrackStatus,
|
||||
Content = x.TrackContent,
|
||||
@ -146,6 +147,7 @@ public partial class TrackService
|
||||
|
||||
item.TrackDetails = trackDetails.Select(x => new TrackDetail
|
||||
{
|
||||
EsId = x.Id,
|
||||
Code = x.TrackCode,
|
||||
Status = x.TrackStatus,
|
||||
Content = x.TrackContent,
|
||||
|
||||
@ -27,12 +27,16 @@ public partial class TrackService : ApplicationService, ITrackService
|
||||
private readonly IHttpClientProxy<IUserBaseInfoService> _requestCurrentUserService;
|
||||
private readonly ITrackContentRepository _trackContentRepository;
|
||||
|
||||
public TrackService(IOrderRepository orderRepository, ICapPublisher capPublisher,
|
||||
ITrackDetailsEsRepository trackDetailsEsRepository, ITrackContentRepository trackContentRepository,
|
||||
IHttpClientProxy<IUserBaseInfoService> requestCurrentUserService, ITrackTemplateRepository trackTemplateRepository, IHttpContextAccessor contextAccessor, IVSystemQueries vSystemQueries)
|
||||
public TrackService(IOrderRepository orderRepository,
|
||||
ICapPublisher capPublisher,
|
||||
ITrackDetailsEsRepository trackDetailsEsRepository,
|
||||
ITrackContentRepository trackContentRepository,
|
||||
IHttpClientProxy<IUserBaseInfoService> requestCurrentUserService,
|
||||
ITrackTemplateRepository trackTemplateRepository,
|
||||
IHttpContextAccessor contextAccessor,
|
||||
IVSystemQueries vSystemQueries)
|
||||
{
|
||||
_orderRepository = orderRepository;
|
||||
this._orderRepository = orderRepository;
|
||||
_capPublisher = capPublisher;
|
||||
_trackContentRepository = trackContentRepository;
|
||||
_requestCurrentUserService = requestCurrentUserService;
|
||||
@ -108,7 +112,10 @@ public partial class TrackService : ApplicationService, ITrackService
|
||||
throw new BusinessException(message: $"轨迹代码:{input.TrackCode}不允许手动更新");
|
||||
}
|
||||
|
||||
var tracks = (await _trackDetailsEsRepository.GetListAsync(new[] { order.Id }, input.TrackCode, true))
|
||||
//如果传递了esId并且是修改操作则使用esid
|
||||
var tracks = (!string.IsNullOrWhiteSpace(input.EsId) && !input.IsAdd)
|
||||
? await _trackDetailsEsRepository.GetDataByIds(new[] { input.EsId })
|
||||
: (await _trackDetailsEsRepository.GetListAsync(new[] { order.Id }, input.TrackCode, true))
|
||||
.Where(x => x.TrackTime == input.TrackTime)
|
||||
.ToList();
|
||||
|
||||
@ -204,23 +211,45 @@ public partial class TrackService : ApplicationService, ITrackService
|
||||
|
||||
var name = userInfo.Data.UserName;
|
||||
|
||||
var tracks = new List<TrackDetailsIndex>();
|
||||
var existsExternal = false;
|
||||
var esIds = input.EsIds?.Distinct().ToArray();
|
||||
//优先使用esId
|
||||
if (esIds != null && esIds.Length > 0)
|
||||
{
|
||||
tracks = await _trackDetailsEsRepository.GetDataByIds(esIds);
|
||||
existsExternal = tracks.Any(x => x.Source == (int) TrackSourceEnum.ExternalServiceProvide);
|
||||
}
|
||||
else
|
||||
{
|
||||
var trackCodes = input.TrackIdentifiers?.Select(x => x.TrackCode).ToList();
|
||||
var trackIds = input.TrackIdentifiers?.Select(y => $"{y.TrackCode}{y.TrackTime}").ToHashSet();
|
||||
//没有任何需要操作的轨迹
|
||||
if (trackIds == null || trackIds.Count == 0) goto NO_DELETE_TRACK;
|
||||
//删除轨迹约束,只要其中有一条来源是外部的就立即返回错误
|
||||
var tracks = await _trackDetailsEsRepository
|
||||
.GetListAsync(new[] { orderId },
|
||||
input.TrackIdentifiers.Select(x => x.TrackCode).ToList(),
|
||||
TrackSourceEnum.ExternalServiceProvide);
|
||||
tracks = await _trackDetailsEsRepository.GetListAsync(new[] { orderId }, trackCodes);
|
||||
//检查删除的轨迹中是否包含外部轨迹
|
||||
existsExternal = tracks
|
||||
.Where(x => x.Source == (int) TrackSourceEnum.ExternalServiceProvide)
|
||||
.Select(x => $"{x.TrackCode}{x.TrackTime}")
|
||||
.Any(x => trackIds.Contains(x));
|
||||
}
|
||||
|
||||
//当要删除的轨迹标识出现交叉则不允许删除
|
||||
var intersect = tracks.Select(x => $"{x.TrackCode}{x.TrackTime}")
|
||||
.Intersect(input.TrackIdentifiers.Select(y => $"{y.TrackCode}{y.TrackTime}")).ToList();
|
||||
if (intersect.Count > 0)
|
||||
if (existsExternal)
|
||||
{
|
||||
throw new BusinessException(message: "存在来源于外部服务商的轨迹,不允许删除");
|
||||
}
|
||||
|
||||
NO_DELETE_TRACK:
|
||||
if (tracks.Count == 0)
|
||||
{
|
||||
throw new BusinessException(message: "没有任何轨迹要删除,请检查输入参数");
|
||||
}
|
||||
|
||||
// 删除轨迹
|
||||
var @event = new TrackDeleteEvent
|
||||
{
|
||||
EsIds = input.EsIds?.ToArray(),
|
||||
OrderIds = new[] { orderId },
|
||||
TrackIdentifiers = input.TrackIdentifiers,
|
||||
SubSystemId = input.SubSystemId,
|
||||
|
||||
@ -419,7 +419,7 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract<TrackDetail
|
||||
$"轨迹查询失败,orderType:{orderType},orderNos:{orderNos},原因:{r.DebugInformation}。");
|
||||
}
|
||||
|
||||
return r.Documents.ToList();
|
||||
return r.ToIdList();
|
||||
}
|
||||
|
||||
public async Task<List<TrackDetailsIndex>> GetListAsync(int orderId)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user