diff --git a/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs index 937c0a21..edeadec2 100644 --- a/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs @@ -104,7 +104,10 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe private async Task HandleTrackAsync(TrackUpsertEvent @event, List canNextOrderIds) { var orderIds = @event.OrderIdentifiers.Select(x => x.OrderId).ToArray(); - var tracks = await _trackDetailsRepository.GetListAsync(orderIds, @event.TrackCode); + var tracks = await _trackDetailsRepository.GetListAsync(orderIds, @event.TrackCode, true); + + var newOrderIds = orderIds.Except(tracks.Select(x => x.OrderId)).ToArray(); + var trackContents = await _provideQueries.MatchTrackContentAsync(newOrderIds, @event.TrackCode); TrackDetailsIndex? firstTrack = null; @@ -136,9 +139,8 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe CreateTime = DateTime.Now }; - //todo:可以优化? // 根据轨迹code在订单模板内容中寻找匹配的 - var trackContent = await _provideQueries.MatchTrackContentAsync(order.OrderId, @event.TrackCode); + var trackContent = trackContents.FirstOrDefault(x => x.OrderId == order.OrderId); if (trackContent == default) { // 订单所绑定的模板,没有一条内容可以匹配发生的轨迹 diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs index cc4c033a..4296713a 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs @@ -4,7 +4,7 @@ namespace SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; public interface ITrackDetailsRepository { - Task> GetListAsync(int[] orderIds, string trackCode); + Task> GetListAsync(int[] orderIds, string trackCode, bool onlyIndexName = false); Task> GetLatestListAsync(int[] eventOrderIds, List trackCodes); diff --git a/src/SJZY.Track.Domain/Dtos/TrackDetails/MatchTrackContentDto.cs b/src/SJZY.Track.Domain/Dtos/TrackDetails/MatchTrackContentDto.cs index 58429cdb..23c27bfe 100644 --- a/src/SJZY.Track.Domain/Dtos/TrackDetails/MatchTrackContentDto.cs +++ b/src/SJZY.Track.Domain/Dtos/TrackDetails/MatchTrackContentDto.cs @@ -3,9 +3,14 @@ public class MatchTrackContentDto { /// - /// 轨迹内容id + /// 订单Id /// - public string TrackCode { get; set; } + public int OrderId { get; set; } + + /// + /// 轨迹内容code + /// + public string TrackCode { get; set; } = null!; /// /// 轨迹内容 diff --git a/src/SJZY.Track.Domain/Queries/IProvideQueries.cs b/src/SJZY.Track.Domain/Queries/IProvideQueries.cs index 7d043a9f..ab50db31 100644 --- a/src/SJZY.Track.Domain/Queries/IProvideQueries.cs +++ b/src/SJZY.Track.Domain/Queries/IProvideQueries.cs @@ -27,10 +27,10 @@ public interface IProvideQueries /// /// 根据订单id找到订单模板,匹配模板命中的轨迹内容 /// - /// 订单id + /// 订单ids /// 轨迹代码 /// - Task MatchTrackContentAsync(int orderId, string code); + Task> MatchTrackContentAsync(int[] orderIds, string code); /// /// 获取可删除的订单轨迹代码 diff --git a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs index 82e4993f..c2013762 100644 --- a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs +++ b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs @@ -50,22 +50,23 @@ public class ProvideQueries : ISugarRepository, IProvideQueries, .ToListAsync(); } - public async Task MatchTrackContentAsync(int orderId, string code) + public async Task> MatchTrackContentAsync(int[] orderIds, string code) { return await Context.Queryable() .LeftJoin((x, a) => x.TrackTemplateId == a.TrackTemplateId) .LeftJoin((x, a, b) => a.TrackContentId == b.Id) .LeftJoin((x, a, b, c) => b.TrackStatusId == c.Id) - .Where((x, a, b) => x.OrderId == orderId && b.Code == code) + .Where((x, a, b) => orderIds.Contains(x.OrderId) && b.Code == code) .Select((x, a, b, c) => new MatchTrackContentDto { + OrderId = x.OrderId, TrackCode = b.Code, Content = b.Content, EnContent = b.EnContent, Status = c.Status, IsCanDelete = a.IsCanDelete }) - .FirstAsync(); + .ToListAsync(); } public async Task> GetCanDeleteTrackCodesAsync(List orderIds, diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs index e4c08278..ad8bba7d 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs @@ -13,20 +13,35 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract> GetListAsync(int[] orderIds, string trackCode) + public async Task> GetListAsync(int[] orderIds, string trackCode, + bool onlyIndexName = false) { - var r = await Context.SearchAsync(s => s - .Source() - .Size(1000) - .Query(q => q - .Bool(b => b - .Must( - mu => mu.Terms(t => t.Field(f => f.OrderId).Terms(orderIds)), - mu => mu.Term(t => t.Field(f => f.TrackCode.Suffix("keyword")).Value(trackCode)) + var r = !onlyIndexName + ? await Context.SearchAsync(s => s + .Source() + .Size(1000) + .Query(q => q + .Bool(b => b + .Must( + mu => mu.Terms(t => t.Field(f => f.OrderId).Terms(orderIds)), + mu => mu.Term(t => t.Field(f => f.TrackCode.Suffix("keyword")).Value(trackCode)) + ) ) ) ) - ); + : await Context.SearchAsync(s => s + .Source(s2 => s2.Includes(fd => fd + .Field(f => f.IndexName))) + .Size(1000) + .Query(q => q + .Bool(b => b + .Must( + mu => mu.Terms(t => t.Field(f => f.OrderId).Terms(orderIds)), + mu => mu.Term(t => t.Field(f => f.TrackCode.Suffix("keyword")).Value(trackCode)) + ) + ) + ) + ); if (!r.IsValid) { @@ -144,9 +159,16 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract(track.Id, u => u + var r = await Context.UpdateAsync(track.Id, u => u .Index(track.IndexName) - .Doc(track) + .Doc(new + { + track.TrackPlace, + track.TrackTime, + track.TrackTimeZone, + track.UpdateUser, + UpdateTime = DateTime.Now, + }) ); if (!r.IsValid)