diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index 9e8a148b..2259c18d 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -194,6 +194,14 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe return default; } + //虽然在引发事件之前做了判断,引发之后并不一定立即处理,在此过程中轨迹内容仍然可能被修改,所以要二次进行判断。 + //通过来源指示是否为手动操作 + var manualOperation = @event.Source == (int) TrackSourceEnum.Artificial; + //轨迹内容标识不允许手动创建的 + if (manualOperation && @event.IsAdd && trackContent.IsAllowManuallyCreate == false) return; + //轨迹内容标识不允许手动更新的 + if (manualOperation && !@event.IsAdd && trackContent.IsAllowManuallyUpdate == false) return; + var insertTracks = await UpsertTrackAsync(@event, canNextOrderIds, trackContent); if (canNextOrderIds.Count == 0) return trackContent; @@ -262,15 +270,11 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe var orderIds = @event.OrderIdentifiers.Select(x => x.OrderId).ToArray(); // important:轨迹code相同,时间、发生地不同的,可能存在多条!! - //todo:查出多条轨迹,同订单同code也可能出现多条, - //按同code找轨迹如果有多条则不允许修改,如果没有则进行新增 var tracks = await _trackDetailsEsRepository.GetListAsync(orderIds, @event.TrackCode, true); var insertTracks = new List(); var updateTracks = new List(); - //todo:标识轨迹内容是否是重复的,将来需要替换会从轨迹内容中获取 - var isRepeatable = true; foreach (var order in @event.OrderIdentifiers) { TrackDetailsIndex? track; @@ -299,12 +303,13 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe // 场景B:允许重复,一条 => 新增(约束受限新增,否则跳过新增) // 场景C:允许重复,多条 => 新增(约束受限新增,否则跳过新增) // 场景D:不允许重复,零条 => 新增 - // 场景E:不允许重复,一条 => 更新 + // 场景E:不允许重复,一条 => 跳过 // 场景F:不允许重复,(理想不会出现多条) => 跳过 var existTracks = tracks.Where(x => x.OrderId == order.OrderId).ToArray(); track = existTracks.FirstOrDefault(); - if (isRepeatable && existTracks.Length >= 1) + //覆盖场景:B,C + if (trackContent.IsRepeatable && existTracks.Length >= 1) { if (existTracks.Any(x => x.TrackPlace == @event.TrackPlace && x.TrackTime == @event.TrackTime)) { @@ -316,10 +321,14 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe track = null; } - if (!isRepeatable && existTracks.Length > 1) + //不允许重复,并且记录大于等于一条,跳过 + //覆盖场景:E,F + if (!trackContent.IsRepeatable && existTracks.Length >= 1) { continue; } + + //其余情况:A,D都为新增操作,无需检查数量,track为null执行新增操作 } if (track == default) @@ -344,7 +353,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe TrackStatusCode = trackContent.TrackStatusCode, TrackContent = trackContent.TrackContent, TrackEnContent = trackContent.TrackEnContent, - //新增轨迹明细字段 + //S06新增轨迹明细字段 IsVisibility = @event.IsVisibility, Source = @event.Source, Remarks = @event.Remarks ?? GlobalConst.EmptyString, @@ -377,14 +386,11 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe track.UpdateUser = @event.OperationMan ?? GlobalConst.SystemUser; track.UpdateTime = DateTime.Now; - //允许二次修改,在修改了轨迹内容后进行修改轨迹操作,如果输入的轨迹内容和英文则进行更改 - track.TrackStatus = trackContent.TrackStatus; //todo?允许修改状么? + //允许二次修改,在修改了轨迹内容后进行修改轨迹操作,如果输入的轨迹内容则以输入为准 track.TrackContent = @event.Content ?? trackContent.TrackContent; track.TrackEnContent = @event.EnStatus ?? trackContent.TrackEnContent; - - //todo:修改轨迹增加字段(其中某些字段不允许更改) + //S06新增 track.IsVisibility = @event.IsVisibility; - //track.Source = @event.Source; //来源不允许更改 track.Remarks = @event.Remarks ?? GlobalConst.EmptyString; track.Files = @event.Files?.Select(x => new FileItem { diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index 48967bfb..37a6e394 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -82,7 +82,7 @@ public partial class TrackService : ApplicationService, ITrackService } //不允许手动更新 - if (manualOperation && !input.IsAdd && trackContent.IsAllowManuallyUpdate) + if (manualOperation && !input.IsAdd && !trackContent.IsAllowManuallyUpdate) { throw new BusinessException(message: $"轨迹代码:{input.TrackCode}不允许手动更新"); } @@ -90,7 +90,7 @@ public partial class TrackService : ApplicationService, ITrackService var tracks = await _trackDetailsEsRepository.GetListAsync(new[] { order.Id }, input.TrackCode, true); //轨迹内容不允许重复,并且已经存在了轨迹记录 - if (!trackContent.IsRepeatable && tracks.Count >= 1) + if (input.IsAdd && !trackContent.IsRepeatable && tracks.Count >= 1) { throw new BusinessException(message: $"轨迹代码:{input.TrackCode}不允许重复添加"); } @@ -281,7 +281,7 @@ public partial class TrackService : ApplicationService, ITrackService } //不允许手动更新 - if (manualOperation && !input.IsAdd && trackContent.IsAllowManuallyUpdate) + if (manualOperation && !input.IsAdd && !trackContent.IsAllowManuallyUpdate) { throw new BusinessException(message: $"轨迹代码:{input.TrackCode}不允许手动更新"); } @@ -289,7 +289,7 @@ public partial class TrackService : ApplicationService, ITrackService var tracks = await _trackDetailsEsRepository.GetListAsync(new[] { order.Id }, input.TrackCode, true); //轨迹内容不允许重复,并且已经存在了轨迹记录 - if (!trackContent.IsRepeatable && tracks.Count >= 1) + if (input.IsAdd && !trackContent.IsRepeatable && tracks.Count >= 1) { throw new BusinessException(message: $"轨迹代码:{input.TrackCode}不允许重复添加"); }