diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index 8b067c6e..c26118a3 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -298,7 +298,6 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe track = existTracks.FirstOrDefault(); if (track == null) continue; // 不存在不让改 - } else { @@ -454,12 +453,8 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe if (updateTracks.Any()) { - //逐条更新 - foreach (var track in updateTracks) - { - await _trackDetailsEsRepository.UpdateAsync(track); - } - await _trackDetailsEsRepository.UpdateManyAsync(updateTracks); + //批量差异化更新轨迹 + await _trackDetailsEsRepository.BulkUpdateAsync(updateTracks); } return insertTracks; diff --git a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs index 18df3b65..2d856921 100644 --- a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs +++ b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs @@ -195,6 +195,8 @@ public class TrackOrderService : ApplicationService return new UnifyResultDto>(false, "未找到指定id的子系统"); var trackDetails = await _trackDetailsEsRepository.GetListAsync(order.Id); + //时间轴不显示轨迹内容为空的轨迹,进行过滤 + trackDetails = trackDetails.Where(x => !x.TrackContent.IsNullOrWhiteSpace() && x.TrackContent != GlobalConst.EmptyString).ToList(); res.Data = new List(); foreach (var item in trackDetails) diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs index bf5e3af3..6f182653 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs @@ -18,6 +18,8 @@ public interface ITrackDetailsEsRepository : IElasticsearchClientService indexes, int maxRetries = 3); + Task BulkUpdateAsync(List indexes, int maxRetries = 3); + Task AddManyAsync(List index); Task AddAsync(TrackDetailsIndex track); diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs index 8cbd290f..69ec223a 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs @@ -265,6 +265,86 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract indexes, int maxRetries = 3) + { + if (indexes.Count == 0) return; + + //构建批量更新操作描述符 + var desc = new BulkDescriptor(GlobalConst.TrackDetailsIndex); + foreach (var track in indexes) + { + desc = desc.AddOperation(new BulkUpdateDescriptor() + .Id(track.Id) + .Index(track.IndexName) + .Script(s => s.Source(@" + ctx._source.trackPlace = params.trackPlace; + ctx._source.trackTime = params.trackTime; + ctx._source.trackTimeZone = params.trackTimeZone; + ctx._source.updateUser = params.updateUser; + ctx._source.updateTime = params.updateTime; + ctx._source.trackContent = params.trackContent; + ctx._source.trackEnContent = params.trackEnContent; + ctx._source.isVisibility = params.isVisibility; + ctx._source.remarks = params.remarks; + ctx._source.files = params.files; + ctx._source.trackPlaceCity = params.trackPlaceCity; + ctx._source.trackPlaceCityId = params.trackPlaceCityId; + ctx._source.trackPlaceProvince = params.trackPlaceProvince; + ctx._source.trackPlaceProvinceId = params.trackPlaceProvinceId; + ctx._source.trackPlaceNation = params.trackPlaceNation; + ctx._source.trackPlaceNationId = params.trackPlaceNationId; + ctx._source.trackPlacePostcode = params.trackPlacePostcode; + ctx._source.destinationTimeZone = params.destinationTimeZone; + ctx._source.estimatedDeliveryDate = params.estimatedDeliveryDate; + ").Params(p => p + .Add("trackPlace", track.TrackPlace) + .Add("trackTime", track.TrackTime) + .Add("trackTimeZone", track.TrackTimeZone) + .Add("updateUser", track.UpdateUser) + .Add("updateTime", DateTime.Now) + //S06新增字段更新 + .Add("trackContent", track.TrackContent) + .Add("trackEnContent", track.TrackEnContent) + .Add("isVisibility", track.IsVisibility) + .Add("remarks", track.Remarks) + .Add("files", track.Files) + .Add("trackPlaceCity", track.TrackPlaceCity) + .Add("trackPlaceCityId", track.TrackPlaceCityId) + .Add("trackPlaceProvince", track.TrackPlaceProvince) + .Add("trackPlaceProvinceId", track.TrackPlaceProvinceId) + .Add("trackPlaceNation", track.TrackPlaceNation) + .Add("trackPlaceNationId", track.TrackPlaceNationId) + .Add("trackPlacePostcode", track.TrackPlacePostcode) + .Add("destinationTimeZone", track.DestinationTimeZone) + .Add("estimatedDeliveryDate", track.EstimatedDeliveryDate)) + )); + } + + var retryCount = 0; + var updateSuccessful = false; + while (retryCount < maxRetries && !updateSuccessful) + { + var response = await Context.BulkAsync(desc); + if (response.IsValid) + { + updateSuccessful = true; + } + else if (response.ServerError?.Status == 409) // 409 表示版本冲突 + { + retryCount++; + if (retryCount >= maxRetries) + { + throw new InvalidOperationException( + $"轨迹更新冲突达到最大次数,track:{indexes.Count}条,原因:{response.DebugInformation}。"); + } + } + else + { + throw new InvalidOperationException($"轨迹更新失败,track:{indexes.Count}条,原因:{response.DebugInformation}。"); + } + } + } + public async Task AddManyAsync(List tracks) { // 按天写入es