From 84792dc50285630f033a49b0b3a897edbfc9f667 Mon Sep 17 00:00:00 2001
From: hardstylewyl <827778732@qq.com>
Date: Thu, 9 Jan 2025 10:25:19 +0800
Subject: [PATCH] =?UTF-8?q?perf:=20=E5=88=A0=E9=99=A4=E8=BD=A8=E8=BF=B9?=
=?UTF-8?q?=E6=8F=90=E4=BE=9B=E6=8E=A5=E5=8F=A3=EF=BC=88=E5=8D=95=E4=B8=AA?=
=?UTF-8?q?=E8=AE=A2=E5=8D=95=EF=BC=89=EF=BC=8C=E6=94=AF=E6=8C=81=E4=BD=BF?=
=?UTF-8?q?=E7=94=A8EsId=E6=9D=A5=E5=88=A0=E9=99=A4=E8=BD=A8=E8=BF=B9?=
=?UTF-8?q?=EF=BC=88=E5=BD=93=E5=92=8C=E6=A0=87=E8=AF=86=E7=AC=A6=E9=83=BD?=
=?UTF-8?q?=E4=B8=8D=E4=B8=BA=E7=A9=BA=E5=88=99=E4=BC=98=E5=85=88=E4=BB=A5?=
=?UTF-8?q?esId=E4=BC=98=E5=85=88=EF=BC=89=EF=BC=8C=E5=B9=B6=E8=A7=A3?=
=?UTF-8?q?=E9=99=A4=E6=A0=87=E8=AF=86=E7=AC=A6=E5=8F=B7=E7=9A=84=E5=BF=85?=
=?UTF-8?q?=E5=A1=AB=E9=99=90=E5=88=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
perf: 轨迹查询提供接口,增加es反参
perf: 支持轨迹更新的esId更新(要求确保是单个订单的单个轨迹)
---
.../Dtos/ProvideServices/DeleteOrderInput.cs | 10 +++-
.../Dtos/ProvideServices/GetTrackOutput.cs | 1 +
.../Dtos/ProvideServices/UpsertTrackInput.cs | 5 ++
.../Events/TrackUpsertEvent.cs | 5 ++
.../EventHandlers/TrackUpsertEventHandler.cs | 8 +++
.../ProvideServices/TrackService.Query.cs | 2 +
.../Services/ProvideServices/TrackService.cs | 57 ++++++++++++++-----
.../Repositories/TrackDetailsEsRepository.cs | 2 +-
8 files changed, 72 insertions(+), 18 deletions(-)
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/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)