diff --git a/HealthMonitor.Service/Resolver/PregnancyHeartRateResolver.cs b/HealthMonitor.Service/Resolver/PregnancyHeartRateResolver.cs index c1b2ac8..add3a5c 100644 --- a/HealthMonitor.Service/Resolver/PregnancyHeartRateResolver.cs +++ b/HealthMonitor.Service/Resolver/PregnancyHeartRateResolver.cs @@ -199,30 +199,33 @@ namespace HealthMonitor.Service.Resolver #endregion #region 定时计算胎心数据触发器 {interval} 秒后 - var fetalKey = $"health_monitor/schedule_push/cal_fetal_heart_rate/imei/{heartRate.Serialno}"; - await SetIntervalTriggerAsync(fetalKey, heartRate.Serialno, 60 * 15); + //var fetalKey = $"health_monitor/schedule_push/cal_fetal_heart_rate/imei/{heartRate.Serialno}"; + //await SetIntervalTriggerAsync(fetalKey, heartRate.Serialno, 60 * 15); + #endregion - //var scheduleFetalPush = await _serviceEtcd.GetValAsync(fetalKey).ConfigureAwait(false); - //if (string.IsNullOrWhiteSpace(scheduleFetalPush)) - //{ - // //var fetalInterval = (int)watchConfig["interval"]!; - // var fetalInterval = 60 * 15; - // var fetalNow= DateTime.Now; - // var fetalTimeNextRun = fetalNow.Add(TimeSpan.FromSeconds(fetalInterval)); - // var fetalTTL = fetalInterval; - // var data = new - // { - // imei = heartRate.Serialno, - // create_time = fetalNow.ToString("yyyy-MM-dd HH:mm:ss"), - // fetalTTL, - // next_run_time = fetalTimeNextRun.ToString("yyyy-MM-dd HH:mm:ss") - // }; - // var result = JsonConvert.SerializeObject(data); - // await _serviceEtcd.PutValAsync(fetalKey, result, fetalTTL, false).ConfigureAwait(false); - //} + #region 定时计算胎心数据触发器下一刻钟后 + // 获取当前时间 + DateTime nowQuarter = DateTime.Now; + + // 计算下一个15分钟的刻钟 + int minutesToAdd = 15 - (nowQuarter.Minute % 15); + if (minutesToAdd == 15) + { + minutesToAdd = 0; // 如果已经是刻钟,则不需要增加分钟 + } + // 计算下一刻钟的时间 + DateTime nextQuarter = nowQuarter.AddMinutes(minutesToAdd) + .AddSeconds(-nowQuarter.Second) + .AddMilliseconds(-nowQuarter.Millisecond); + + // 计算时间差 + TimeSpan timeDifference = nextQuarter - nowQuarter; + var fetalKey = $"health_monitor/schedule_push/cal_fetal_heart_rate/imei/{heartRate.Serialno}"; + await SetIntervalTriggerAsync(fetalKey, heartRate.Serialno, (long)timeDifference.TotalSeconds); #endregion + #region 定时计算胎动数据触发器 0 点开始 var fetalMovementKey = $"health_monitor/schedule_push/cal_fetal_movement/imei/{heartRate.Serialno}"; /// 计算 0 点秒数 diff --git a/HealthMonitor.WebApi/Worker.cs b/HealthMonitor.WebApi/Worker.cs index 4317b10..630023e 100644 --- a/HealthMonitor.WebApi/Worker.cs +++ b/HealthMonitor.WebApi/Worker.cs @@ -256,16 +256,37 @@ namespace HealthMonitor.WebApi var commonPHR = await _serviceTDengine.InitPregnancyCommonHeartRateModeAsync(imeiDel); if (commonPHR != null) { - # region 计算胎心数据 + # region 计算上刻钟的胎心数据 // 告警上限阀值 var upperAlarmThreshold = (int)watchConfig!["upperAlarmThreshold"]!; // 告警下限阀值 var lowerAlarmThreshold = (int)watchConfig["lowerAlarmThreshold"]!; - var lastPhr = await _serviceTDengine.GetLastAsync(); + //var lastPhr = await _serviceTDengine.GetLastAsync(); // 计算胎心=孕妇心率*系数 - var fetalHeartRate = SafeType.SafeInt(lastPhr.PregnancyHeartRate * commonPHR?.StatModeAvgFprCoefficient!); - + //var fetalHeartRate = SafeType.SafeInt(lastPhr.PregnancyHeartRate * commonPHR?.StatModeAvgFprCoefficient!); + + // 上15分钟的数据 + // 获取当前时间 + DateTime now = DateTime.Now; + + // 计算当前时间到上一刻钟的分钟数 + int minutesToSubtract = now.Minute % 15; + + // 计算上一刻钟的时间 + DateTime previousQuarter = now.AddMinutes(-minutesToSubtract).AddSeconds(-now.Second).AddMilliseconds(-now.Millisecond); + + var lastQuarterPhr = await _serviceTDengine.GetBySerialNoAsync(imeiDel, 1); + + var filteredPhr = lastQuarterPhr + .Where(i => i.LastUpdate <= previousQuarter && i.LastUpdate >= previousQuarter.AddMinutes(-15)) + .ToList(); + + var lastQuarterPhrValue = filteredPhr.Count == 1 + ? filteredPhr.First().PregnancyHeartRate + : filteredPhr.Average(i => i.PregnancyHeartRate); + + var fetalHeartRate = SafeType.SafeInt(lastQuarterPhrValue * commonPHR?.StatModeAvgFprCoefficient!); var sampleTime = DateTimeUtil.ConvertToTimeStamp(DateTime.Now).ToString(); var isAbnormal = fetalHeartRate > upperAlarmThreshold ? 1 : (fetalHeartRate < lowerAlarmThreshold ? 2 : 0); @@ -278,8 +299,8 @@ namespace HealthMonitor.WebApi HeartRate = fetalHeartRate, SampleTime = sampleTime, IsAbnormal = isAbnormal, - StatStartTime = commonPHR.StatStartTime, - StatEndTime = commonPHR.StatEndTime, + StatStartTime = filteredPhr.OrderByDescending(i=>i.LastUpdate).First().LastUpdate, + StatEndTime = filteredPhr.OrderByDescending(i => i.LastUpdate).Last().LastUpdate, CreateTime = DateTime.Now, Method = 1, IsDisplay = 1, @@ -293,30 +314,7 @@ namespace HealthMonitor.WebApi #endregion #region 注册定时计算胎心数据触发器 {interval} 秒后 - //var fetalKey = $"health_monitor/schedule_push/cal_fetal_heart_rate/imei/{imeiDel}"; - //var fetalKey = key; - //var scheduleFetalPush = await _serviceEtcd.GetValAsync(fetalKey).ConfigureAwait(false); - //if (string.IsNullOrWhiteSpace(scheduleFetalPush)) - //{ - // // var fetalInterval = (int)watchConfig!["interval"]!; - // var fetalInterval = 60 * 15; - - // var fetalNow = DateTime.Now; - // var fetalTimeNextRun = fetalNow.Add(TimeSpan.FromSeconds(fetalInterval)); - // var fetalTTL = fetalInterval; - // var data = new - // { - // imei = imeiDel, - // create_time = fetalNow.ToString("yyyy-MM-dd HH:mm:ss"), - // fetalTTL, - // next_run_time = fetalTimeNextRun.ToString("yyyy-MM-dd HH:mm:ss") - // }; - // var result = JsonConvert.SerializeObject(data); - // await _serviceEtcd.PutValAsync(fetalKey, result, fetalTTL, false).ConfigureAwait(false); - //} - - await SetIntervalTriggerAsync(key, imeiDel, 60 * 15); - + //await SetIntervalTriggerAsync(key, imeiDel, 60 * 15); #endregion } }