diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/DeleteOrderInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/DeleteOrderInput.cs index de305c57..662e50e5 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/DeleteOrderInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/DeleteOrderInput.cs @@ -9,8 +9,12 @@ public class DeleteOrderInput : OrderNoInfo public class DeleteTrackInput : OrderNoInfo { /// - /// 轨迹标识符集合,必填 + /// 轨迹标识符集合,为支持esid删除,所以非必填 /// - [Required] - public List TrackIdentifiers { get; set; } = new(); + public List? TrackIdentifiers { get; set; } = new(); + + /// + /// 轨迹ESId集合,非必填,如果有优先级最高 + /// + public List? EsIds { get; set; } } diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs index fca510a7..f5313b3b 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs @@ -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; } diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs index 8f743c7f..2b15e904 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs @@ -9,6 +9,11 @@ public class UpsertTrackInput : OrderNoInfo /// public bool IsAdd { get; set; } + /// + /// 轨迹唯一标识(可选) + /// + public string? EsId { get; set; } + /// /// 轨迹内容代码 /// diff --git a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs index 877fa365..dbf754d7 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs @@ -19,6 +19,11 @@ public class TrackUpsertEvent /// public OrderIdentifier[] OrderIdentifiers { get; set; } = null!; + /// + /// 轨迹唯一标识(用于单个订单更新单条轨迹,如果有的话优先级最高) + /// + public string? EsId { get; set; } + /// /// 操作人(null则默认系统) /// diff --git a/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj b/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj index e9cb325e..48722a57 100644 --- a/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj +++ b/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj @@ -5,7 +5,7 @@ net7.0 True - 7.0.11 + 7.0.12 True diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index 87dbc962..8ba97084 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -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 diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs index 7e377a94..f6768eee 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs @@ -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, diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index 45656799..9625a5f9 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -27,12 +27,16 @@ public partial class TrackService : ApplicationService, ITrackService private readonly IHttpClientProxy _requestCurrentUserService; private readonly ITrackContentRepository _trackContentRepository; - public TrackService(IOrderRepository orderRepository, ICapPublisher capPublisher, - ITrackDetailsEsRepository trackDetailsEsRepository, ITrackContentRepository trackContentRepository, - IHttpClientProxy requestCurrentUserService, ITrackTemplateRepository trackTemplateRepository, IHttpContextAccessor contextAccessor, IVSystemQueries vSystemQueries) + public TrackService(IOrderRepository orderRepository, + ICapPublisher capPublisher, + ITrackDetailsEsRepository trackDetailsEsRepository, + ITrackContentRepository trackContentRepository, + IHttpClientProxy 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 = await _trackDetailsEsRepository - .GetListAsync(new[] { orderId }, - input.TrackIdentifiers.Select(x => x.TrackCode).ToList(), - TrackSourceEnum.ExternalServiceProvide); + var tracks = new List(); + 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; + //删除轨迹约束,只要其中有一条来源是外部的就立即返回错误 + 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, diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs index d7e28fbe..6d03a1b1 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs @@ -419,7 +419,7 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract> GetListAsync(int orderId)