diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetPageTrackTemplateListInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetPageTrackTemplateListInput.cs index d193eb8e..a591adf7 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetPageTrackTemplateListInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetPageTrackTemplateListInput.cs @@ -21,4 +21,9 @@ public class GetPageTrackTemplateListInput : PageInfoInput /// 模板code /// public string? TemplateCode { get; set; } + + /// + /// 关键字 + /// + public string? KeyWord { get; set; } } diff --git a/src/SJZY.Track.Application/CAP/CAPFilter.cs b/src/SJZY.Track.Application/CAP/CAPFilter.cs index 35fa9f23..0decb640 100644 --- a/src/SJZY.Track.Application/CAP/CAPFilter.cs +++ b/src/SJZY.Track.Application/CAP/CAPFilter.cs @@ -29,7 +29,7 @@ public class CapFilter : SubscribeFilter context.DeliverMessage.Headers["sjzy-arguments-hash"] = hash; } - if (await RedisHelper.Client.ExistsAsync($"CapExecuteFilter:{hash}")) + if (await RedisHelper.Client.ExistsAsync($"CapExecuteFilter:{hash}{DateTime.Now:G}")) { throw new BusinessException(GlobalConst.CapNoRetryErrorCode, $"检测到重复消费,消费参数:{argumentJsonStr}"); } @@ -41,7 +41,7 @@ public class CapFilter : SubscribeFilter context.DeliverMessage.Headers.TryGetValue("sjzy-arguments-hash", out var hash); if (!hash.IsNullOrEmpty()) { - await RedisHelper.Client.SetAsync($"CapExecuteFilter:{hash}", 1, TimeSpan.FromMinutes(3)); + await RedisHelper.Client.SetAsync($"CapExecuteFilter:{hash}{DateTime.Now:G}", 1, TimeSpan.FromMinutes(3)); } } diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index 4e90f379..ce81abd6 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -104,6 +104,35 @@ public partial class TrackService : ApplicationService, ITrackService .Where(x => x.TrackTime == input.TrackTime) .ToList(); + //当为更新操作时发现更新的数目为0进行重试操作 + if (!input.IsAdd && tracks.Count == 0) + { + var curRetryCount = 0; + var success = false; + while (!success && curRetryCount < GlobalConst.MaxUpdateTrackRetryCount) + { + try + { + tracks = (await _trackDetailsEsRepository.GetListAsync(new[] { order.Id }, input.TrackCode, true)) + .Where(x => x.TrackTime == input.TrackTime) + .ToList(); + if (tracks.Count > 0) + success = true; + await Task.Delay(300); + } + finally + { + curRetryCount++; + } + } + + if (tracks.Count == 0) + { + throw new BusinessException(message: $"订单:{input.OrderNo},轨迹代码:{input.TrackCode}没有要更新的记录"); + } + } + + //更新轨迹,同一时间存在多条轨迹记录,理由:不清晰到底要修改哪一条或是全部修改 if (!input.IsAdd && tracks.Count > 1) { @@ -366,6 +395,34 @@ public partial class TrackService : ApplicationService, ITrackService .Where(x => x.TrackTime == input.TrackTime) .ToList(); + //当为更新操作时发现更新的数目为0进行重试操作 + if (!input.IsAdd && tracks.Count == 0) + { + var curRetryCount = 0; + var success = false; + while (!success && curRetryCount < GlobalConst.MaxUpdateTrackRetryCount) + { + try + { + tracks = (await _trackDetailsEsRepository.GetListAsync(new[] { order.Id }, input.TrackCode, true)) + .Where(x => x.TrackTime == input.TrackTime) + .ToList(); + if (tracks.Count > 0) + success = true; + await Task.Delay(300); + } + finally + { + curRetryCount++; + } + } + + if (tracks.Count == 0) + { + throw new BusinessException(message: $"订单:[{string.Join(",", input.OrderNos)}],轨迹代码:{input.TrackCode}没有要更新的记录"); + } + } + //更新轨迹,同一时间存在多条轨迹记录,理由:不清晰到底要修改哪一条或是全部修改 if (!input.IsAdd && tracks.Count > 1) { diff --git a/src/SJZY.Track.Domain/Consts/GlobalConst.Track.cs b/src/SJZY.Track.Domain/Consts/GlobalConst.Track.cs index eed1301d..3ffed645 100644 --- a/src/SJZY.Track.Domain/Consts/GlobalConst.Track.cs +++ b/src/SJZY.Track.Domain/Consts/GlobalConst.Track.cs @@ -8,4 +8,9 @@ public partial class GlobalConst /// 轨迹数据来源:1外部服务商创建,2内部系统创建,3人工创建 /// public static readonly ImmutableHashSet SupportTrackSources = ImmutableHashSet.Create(1, 2, 3); + + /// + /// 最大更新轨迹重试次数 + /// + public const int MaxUpdateTrackRetryCount = 3; } diff --git a/src/SJZY.Track.Domain/Dtos/TrackTemplate/GetPageTrackTemplateListInputVo.cs b/src/SJZY.Track.Domain/Dtos/TrackTemplate/GetPageTrackTemplateListInputVo.cs index b6e253a0..f801ffdc 100644 --- a/src/SJZY.Track.Domain/Dtos/TrackTemplate/GetPageTrackTemplateListInputVo.cs +++ b/src/SJZY.Track.Domain/Dtos/TrackTemplate/GetPageTrackTemplateListInputVo.cs @@ -1,8 +1,8 @@ namespace SJZY.Track.Domain.Dtos.TrackTemplate; -public class GetPageTrackTemplateListInputVo :PageInfoInput +public class GetPageTrackTemplateListInputVo : PageInfoInput { - /// + /// /// 子系统id /// public int SubSystemId { get; set; } @@ -21,4 +21,9 @@ public class GetPageTrackTemplateListInputVo :PageInfoInput /// 模板code /// public string? TemplateCode { get; set; } + + /// + /// 关键字 + /// + public string? KeyWord { get; set; } } diff --git a/src/SJZY.Track.Repository/Repositories/TrackTemplateRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackTemplateRepository.cs index c7f7c2c4..d399bcd1 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackTemplateRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackTemplateRepository.cs @@ -250,6 +250,11 @@ public class TrackTemplateRepository : BasicRepository, ITr .LeftJoin((a, b, c) => b.TrackStatusId == c.Id) .LeftJoin((a, b, c, d) => c.Node == d.Id) .Where(a => templateIds.Contains(a.TrackTemplateId)) + .WhereIF(!input.KeyWord.IsNullOrWhiteSpace(), (a, b, c, d) => + b.Code.Contains(input.KeyWord!) + || b.EnContent.Contains(input.KeyWord!) + || b.Content.Contains(input.KeyWord!) + ) .Select((a, b, c, d) => new TemplateContentDtoVo { TemplateId = a.TrackTemplateId,