Merge pull request 'fix: 修复批量更新bug,修改为bulkApi的方式进行批量更新' (#71) from S06 into test

Reviewed-on: https://git.shijizhongyun.com/Dotnet/SJZY.Track.Api/pulls/71
This commit is contained in:
wangyunlong 2024-11-27 09:42:03 +08:00
commit ce145e7de6
4 changed files with 86 additions and 7 deletions

View File

@ -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;

View File

@ -195,6 +195,8 @@ public class TrackOrderService : ApplicationService
return new UnifyResultDto<List<GetDetailTimelineOutput>>(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<GetDetailTimelineOutput>();
foreach (var item in trackDetails)

View File

@ -18,6 +18,8 @@ public interface ITrackDetailsEsRepository : IElasticsearchClientService<TrackDe
Task UpdateManyAsync(List<TrackDetailsIndex> indexes, int maxRetries = 3);
Task BulkUpdateAsync(List<TrackDetailsIndex> indexes, int maxRetries = 3);
Task AddManyAsync(List<TrackDetailsIndex> index);
Task AddAsync(TrackDetailsIndex track);

View File

@ -265,6 +265,86 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract<TrackDetail
}
}
public async Task BulkUpdateAsync(List<TrackDetailsIndex> 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<TrackDetailsIndex, object>()
.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<TrackDetailsIndex> tracks)
{
// 按天写入es