From 5f85e502b490094c0ac5950b332e775ebcd30d8b Mon Sep 17 00:00:00 2001 From: H Vs Date: Sat, 10 Aug 2024 16:10:21 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=BE=E5=A4=87=E8=BF=9E=E7=BB=AD12=E4=B8=AA?= =?UTF-8?q?=E5=BF=83=E7=8E=87=E5=80=BC=E6=AD=A3=E5=B8=B8=EF=BC=8C=E4=B8=8D?= =?UTF-8?q?=E5=81=9C=E6=AD=A2=E9=AB=98=E9=A2=91=E7=9A=84=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Cache/DeviceCacheManager.cs | 37 +++++++++++++++++++ .../Resolver/PregnancyHeartRateResolver.cs | 27 +++++++++----- 2 files changed, 55 insertions(+), 9 deletions(-) diff --git a/HealthMonitor.Service/Cache/DeviceCacheManager.cs b/HealthMonitor.Service/Cache/DeviceCacheManager.cs index f9c7b2e..9939e64 100644 --- a/HealthMonitor.Service/Cache/DeviceCacheManager.cs +++ b/HealthMonitor.Service/Cache/DeviceCacheManager.cs @@ -263,5 +263,42 @@ namespace HealthMonitor.Service.Cache return false; } #endregion + + #region 业务间隔 + public async Task GetBizIntervalAsync(string sn, string biz) + { + try + { + var key = biz + "-"+sn; + var status = await RedisHelper.GetAsync(key).ConfigureAwait(false); + return status; + } + catch (Exception ex) + { + _logger.LogWarning($"Redis 发生异常:{ex.Message}, {ex.StackTrace}"); + } + return null; + } + /// + /// 业务间隔(默认15分钟) + /// + /// + /// + /// + /// + public async Task SetBizIntervalAsync(string sn, string biz, int ttl=60*15) + { + try + { + var key = biz + "-" + sn; + await RedisHelper.SetAsync(key, biz, ttl).ConfigureAwait(false); + } + catch (Exception ex) + { + _logger.LogWarning($"Redis 发生异常:{ex.Message}, {ex.StackTrace}"); + } + } + + #endregion } } diff --git a/HealthMonitor.Service/Resolver/PregnancyHeartRateResolver.cs b/HealthMonitor.Service/Resolver/PregnancyHeartRateResolver.cs index dec8dce..59f2b29 100644 --- a/HealthMonitor.Service/Resolver/PregnancyHeartRateResolver.cs +++ b/HealthMonitor.Service/Resolver/PregnancyHeartRateResolver.cs @@ -163,8 +163,8 @@ namespace HealthMonitor.Service.Resolver var lowerAlarmThreshold = (int)watchConfig["lowerAlarmThreshold"]!; // EDOC var edoc = DateTimeUtil.ToDateTime(watchConfig!["EDOC"]!.ToString()); - // interval (分钟) - var intervalFHR = (int)watchConfig["interval"]!; + // interval (分钟) 固定15分钟 + var intervalFHR = 15;//int)watchConfig["interval"]!; @@ -240,7 +240,7 @@ namespace HealthMonitor.Service.Resolver } /// phr PregnancyHeartRate 连续连续正常次数个值都是正常(大于等于triggerHighFreqLow,少于等于triggerHighFreqHig), /// 取连续正常次数正常值的平均值,推送到api/v1/open/OpenIot/SetFetalHeartRateConfig - #region 检查是否连续12个值都是正常的 + #region 检查是否连续12个心率值都是正常的 // 获取最近连续正常次数个心率记录 var lastPhr = phr.OrderByDescending(i => i.LastUpdate).Take(stopHighFreqSampleCount).ToList(); @@ -253,13 +253,22 @@ namespace HealthMonitor.Service.Resolver // 高频数据不建模 FreqStatsEnd = (DateTime)heartRate.LastUpdate!; _logger.LogInformation($"{heartRate.Serialno} 高频状态已经持续{(FreqStatsEnd - phrFreqstatus!.LastUpdate).TotalSeconds} 秒,连续 {stopHighFreqSampleCount} 次采样心率正常,将下发指令"); - //await SaveAndPushFreqFetalHeartRateAsync(heartRate, commonPHR, upperAlarmThreshold, lowerAlarmThreshold, avgPhr, DateTimeUtil.ConvertToTimeStamp(phrFreqstatus!.LastUpdate).ToString()); - await SaveAndPushFetalHeartRateAsync(heartRate, commonPHR, upperAlarmThreshold, lowerAlarmThreshold, avgPhr, DateTimeUtil.ConvertToTimeStamp(phrFreqstatus!.LastUpdate).ToString(), phrFreqstatus!.LastUpdate, FreqStatsEnd); - // 删除高频状态的首条记录 - await _deviceCacheMgr.DelPregnancyHeartRateFreqStatusAsync(heartRate.Serialno); - - _logger.LogInformation($"{heartRate.Serialno} 连续正常结束高频心率状态, timeDiffInSeconds {timeDiffInSeconds},highFreqSampleInterval:{highFreqSampleInterval},高频状态持续{((DateTime)heartRate.LastUpdate - phrFreqstatus!.LastUpdate).TotalSeconds} 秒"); + var freqSaveAndPushFetalHeartRate = await _deviceCacheMgr.GetBizIntervalAsync(heartRate.Serialno, "SaveAndPushFetalHeartRate"); + // 高频不停,15分钟内只下发一条 + if (string.IsNullOrEmpty(freqSaveAndPushFetalHeartRate)) + { + await SaveAndPushFetalHeartRateAsync(heartRate, commonPHR, upperAlarmThreshold, lowerAlarmThreshold, avgPhr, DateTimeUtil.ConvertToTimeStamp(phrFreqstatus!.LastUpdate).ToString(), phrFreqstatus!.LastUpdate, FreqStatsEnd); + // 删除高频状态的首条记录 + await _deviceCacheMgr.DelPregnancyHeartRateFreqStatusAsync(heartRate.Serialno); + // 设置15分的SaveAndPushFetalHeartRate业务间隔 + await _deviceCacheMgr.SetBizIntervalAsync(heartRate.Serialno, "SaveAndPushFetalHeartRate"); + _logger.LogInformation($"{heartRate.Serialno} 连续 {stopHighFreqSampleCount} 次采样心率正常,结束高频心率状态, timeDiffInSeconds {timeDiffInSeconds},highFreqSampleInterval:{highFreqSampleInterval},高频状态持续{((DateTime)heartRate.LastUpdate - phrFreqstatus!.LastUpdate).TotalSeconds} 秒"); + } + else + { + _logger.LogWarning($"{heartRate.Serialno} 连续 {stopHighFreqSampleCount} 次采样心率正常,设备端应该结束高频状态,但设备端没有结束高频,平台高频15分钟内已经下发过指令"); + } } else