From 8f1cd741631e79a09c8935f797fb2093a9409a0c Mon Sep 17 00:00:00 2001 From: xiaolipro <2357729423@qq.com> Date: Sat, 12 Oct 2024 10:56:03 +0800 Subject: [PATCH] =?UTF-8?q?fix=E3=80=90=E3=80=90test=E3=80=91=E9=A2=84?= =?UTF-8?q?=E8=AD=A6=E8=BD=A8=E8=BF=B9=E6=9B=B4=E6=96=B0=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?=E3=80=91=20=20=20=20https://www.tapd.cn/60863849/bugtrace/bugs?= =?UTF-8?q?/view/1160863849001051295?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ForewarningServices/ForewarningNotifyService.cs | 2 ++ .../Repositories/WarningRecordEsRepository.cs | 11 +++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningNotifyService.cs b/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningNotifyService.cs index cf9eb750..692a5646 100644 --- a/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningNotifyService.cs +++ b/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningNotifyService.cs @@ -104,6 +104,8 @@ public class ForewarningNotifyService : IForewarningNotifyService, ITransientDep addCounter = await RedisHelper.Client.ZAddNxAsync(redisKey, left); } + // tips:由于预警队列的设计 是悲观的认为所有预警都会在未来发生,实际上预警占真实业务的发生总比应该在少数,所以这里是有优化空间的 + // 右区间移出预警队列,【只要发生了就移除】 var right = dels.Select(x => new WarningNotifyCacheEntry(x.ruleId, x.orderId, x.counter)).ToList(); if (!right.IsNullOrEmpty()) diff --git a/src/SJZY.Track.Repository/Repositories/WarningRecordEsRepository.cs b/src/SJZY.Track.Repository/Repositories/WarningRecordEsRepository.cs index 5911da19..eccbec0c 100644 --- a/src/SJZY.Track.Repository/Repositories/WarningRecordEsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/WarningRecordEsRepository.cs @@ -46,8 +46,15 @@ public class WarningRecordEsRepository : ElasticSearchContextAbstract rules) { - foreach (var rule in rules) + foreach (var group in rules.GroupBy(x => new { + x.ruleId, + x.orderId + })) + { + var rule = group.First(); + + // 这里需要使用_update_by_query API,因为可能已经发生了多条预警记录,需要一次性更新 var r = await Context.UpdateByQueryAsync(u => u .Index(GlobalConst.TrackWarningRecordIndex) .Query(q => @@ -55,7 +62,7 @@ public class WarningRecordEsRepository : ElasticSearchContextAbstract f.OrderId, rule.orderId) ) .Script(s => s.Source("ctx._source.warningStatus = params.warningStatus") - .Params(p => p.Add("warningStatus", WarningStatus.Processed)) + .Params(p => p.Add("warningStatus", (int) WarningStatus.Processed)) ) );