【10.批量更新轨迹和删除轨迹优化判断:如果根据code,命中多条,直接跳过,不做任何操作】

https://www.tapd.cn/60863849/prong/tasks/view/1160863849001028879
This commit is contained in:
xiaolipro 2024-09-14 16:57:19 +08:00
parent 9d2c10c4db
commit 02533696ec
2 changed files with 57 additions and 30 deletions

View File

@ -144,11 +144,27 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
foreach (var order in @event.OrderIdentifiers)
{
var track = tracks.FirstOrDefault(x =>
x.OrderId == order.OrderId && x.TrackTime == @event.TrackTime && x.TrackPlace == @event.TrackPlace);
TrackDetailsIndex? track;
if (!@event.IsAdd)
{
var existTracks = tracks.Where(x => x.OrderId == order.OrderId).ToArray();
if (existTracks.Length > 1)
{
// 修改轨迹时,订单存在多条轨迹不允许修改
continue;
}
if (track == null && !@event.IsAdd) continue; // 不存在不让改
if (track != null && @event.IsAdd) continue; // 存在不让创建
track = existTracks.FirstOrDefault();
if (track == null) continue; // 不存在不让改
}
else
{
track = tracks.FirstOrDefault(x =>
x.OrderId == order.OrderId && x.TrackTime == @event.TrackTime && x.TrackPlace == @event.TrackPlace);
if (track != null) continue; // 存在不让创建
}
if (track == default)
{

View File

@ -247,41 +247,52 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract<TrackDetail
public async Task DeleteTrackAsync(int[] orderIds, List<string> trackCodes)
{
var deleteResponse = await Context.DeleteByQueryAsync<TrackDetailsIndex>(d => d
.Index($"{GlobalConst.TrackDetailsIndex}-*") // 使用通配符匹配所有相关索引
.Query(q =>
q.Terms(t => t.Field(f => f.OrderId).Terms(orderIds))
&& q.Terms(t => t.Field(f => f.TrackCode.Suffix("keyword")).Terms(trackCodes))
)
);
if (!deleteResponse.IsValid)
{
throw new InvalidOperationException(
$"删除轨迹失败,orderIds:[{string.Join(", ", orderIds)}],trackCodes:[{string.Join(", ", trackCodes)}],原因:{deleteResponse.DebugInformation}。");
}
// var search = await Context.SearchAsync<TrackDetailsIndex>(x => x
// .Source(s => s.Includes(fd => fd.Field(f => f.IndexName)))
// .Size(SafelyLimit)
// var deleteResponse = await Context.DeleteByQueryAsync<TrackDetailsIndex>(d => d
// .Index($"{GlobalConst.TrackDetailsIndex}-*") // 使用通配符匹配所有相关索引
// .Query(q =>
// q.Terms(t => t.Field(f => f.OrderId).Terms(orderIds))
// && q.Terms(t => t.Field(f => f.TrackCode.Suffix("keyword")).Terms(trackCodes))
// )
// );
//
// if (!search.IsValid)
// if (!deleteResponse.IsValid)
// {
// throw new InvalidOperationException(
// $"轨迹查询失败,orderIds:[{orderIds.JoinAsString(", ")}],trackCodes:[{trackCodes.JoinAsString(", ")}],原因:{search.DebugInformation}。");
// }
//
// var tracks = search.ToIdList();
//
// foreach (var track in tracks)
// {
// await DeleteTrackByIdAsync(track.Id, track.IndexName);
// $"删除轨迹失败,orderIds:[{string.Join(", ", orderIds)}],trackCodes:[{string.Join(", ", trackCodes)}],原因:{deleteResponse.DebugInformation}。");
// }
var search = await Context.SearchAsync<TrackDetailsIndex>(x => x
.Source(s => s.Includes(fd => fd
.Field(f => f.IndexName)
.Field(f => f.OrderId)
.Field(f => f.TrackCode)
))
.Size(SafelyLimit)
.Query(q =>
q.Terms(t => t.Field(f => f.OrderId).Terms(orderIds))
&& q.Terms(t => t.Field(f => f.TrackCode.Suffix("keyword")).Terms(trackCodes))
)
);
if (!search.IsValid)
{
throw new InvalidOperationException(
$"轨迹查询失败,orderIds:[{orderIds.JoinAsString(", ")}],trackCodes:[{trackCodes.JoinAsString(", ")}],原因:{search.DebugInformation}。");
}
var tracks = search.ToIdList().GroupBy(doc => new
{
doc.OrderId,
doc.TrackCode
})
.Where(g => g.Count() == 1)
.Select(g => g.First()) // 只保留每组的第一个元素
.ToList();
foreach (var track in tracks)
{
await DeleteTrackByIdAsync(track.Id, track.IndexName);
}
}
public async Task DeleteTrackByIdAsync(string id, string indexName)