diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index 27c92b41..b8e6225a 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -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) { diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs index 63d0818e..6cf163ff 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs @@ -247,41 +247,52 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract trackCodes) { - var deleteResponse = await Context.DeleteByQueryAsync(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(x => x - // .Source(s => s.Includes(fd => fd.Field(f => f.IndexName))) - // .Size(SafelyLimit) + // var deleteResponse = await Context.DeleteByQueryAsync(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(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)