Browse Source

高频心率不用于建模

datasub12_fetal_heart_rate_0
H Vs 7 months ago
parent
commit
53a428b433
3 changed files with 367 additions and 53 deletions
  1. +183
    -12
      HealthMonitor.Service/Biz/db/TDengineService.cs
  2. +156
    -23
      HealthMonitor.Service/Resolver/PregnancyHeartRateResolver.cs
  3. +28
    -18
      HealthMonitor.WebApi/Worker.cs

+ 183
- 12
HealthMonitor.Service/Biz/db/TDengineService.cs View File

@@ -824,14 +824,162 @@ namespace HealthMonitor.Service.Biz.db

#region 胎心算法

/// <summary>
/// 计算个人一般心率(最大值,最大值,最小值)
/// </summary>
/// <param name="serialNo"></param>
/// <param name="days"></param>
/// <param name="percentage"></param>
/// <returns></returns>
public async Task<PregnancyCommonHeartRateModel?> InitPregnancyCommonHeartRateModeAsync(string serialNo, int days = 7, int percentage = 90)
///// <summary>
///// 计算个人一般心率(最大值,最大值,最小值)
///// </summary>
///// <param name="serialNo"></param>
///// <param name="days"></param>
///// <param name="percentage"></param>
///// <returns></returns>
//public async Task<PregnancyCommonHeartRateModel?> InitPregnancyCommonHeartRateModeAsync(string serialNo, int days = 7, int percentage = 90)
//{
// var tableName = typeof(PregnancyHeartRateModel)
// .GetCustomAttribute<STableAttribute>()?
// .STableName;

// var daysAgo = DateTime.Now.AddDays(-days);
// var collection = await _clientSqlSugar
// .Queryable<PregnancyHeartRateModel>()
// .AS(tableName)
// .Where(i => i.SerialNumber.Equals(serialNo))
// .Where(i => i.Timestamp > daysAgo)
// .OrderByDescending(i => i.Timestamp)
// .ToArrayAsync();

// var res = collection
// .Select(i => i.PregnancyHeartRate).ToList();
// // 心率数据量必须30个以上才进行计算
// if (res.Count < 30)
// {
// _logger.LogInformation($"{serialNo} 心率数据不足,无法计算其众数");
// return null;
// }

// #region 计算众数
// var mode = res.GroupBy(n => n)
// .OrderByDescending(g => g.Count())
// .First()
// .Key;

// Console.WriteLine("众数是: " + mode);

// // 如果有多个众数的情况
// var maxCount = res.GroupBy(n => n)
// .Max(g => g.Count());

// var modes = res.GroupBy(n => n)
// .Where(g => g.Count() == maxCount)
// .Select(g => g.Key)
// .ToList();
// // 多个众数,选择最接近平均数或中位数的众数
// if (modes.Count > 1)
// {
// // 计算平均值
// double average = res.Average();
// Console.WriteLine("平均值是: " + average);

// // 计算中位数
// double median;
// int count = res.Count;
// var sortedRes = res.OrderBy(n => n).ToList();
// if (count % 2 == 0)
// {
// // 偶数个元素,取中间两个数的平均值
// median = (sortedRes[count / 2 - 1] + sortedRes[count / 2]) / 2.0;
// }
// else
// {
// // 奇数个元素,取中间的数
// median = sortedRes[count / 2];
// }
// //Console.WriteLine("中位数是: " + median);
// _logger.LogInformation($"{serialNo} 中位数是: " + median);
// // 找出最接近平均值的众数
// //var closestToAverage = modes.OrderBy(m => Math.Abs(m - average)).First();
// //Console.WriteLine("最接近平均值的众数是: " + closestToAverage);

// // 找出最接近中位数的众数
// var closestToMedian = modes.OrderBy(m => Math.Abs(m - median)).First();
// _logger.LogInformation($"{serialNo} 最接近中位数的众数是: " + closestToMedian);
// mode = closestToMedian;
// }
// #endregion

// // 计算需要的数量
// int requiredCount = (int)(res.Count * 0.9);

// // 从原始数据集中获取最接近众数的元素
// var closestToModeData = res.OrderBy(n => Math.Abs(n - mode))
// .Take(requiredCount)
// .ToList();

// // 输出新数据集
// _logger.LogInformation($"{serialNo} 新数据集: " + string.Join(", ", closestToModeData));
// _logger.LogInformation($"{serialNo} 新数据集的数量: " + closestToModeData.Count);

// var fhrMap = _mgrFhrPhrMapCache.GetHeartRatesMap();
// var watchConfig = await _deviceCacheMgr.GetGpsDeviceWatchConfigCacheObjectBySerialNoAsync(serialNo, "0067");
// if (watchConfig == null)
// {
// return null;
// }
// // long.TryParse(watchConfig["EDOC"]!.ToString(), out long edoc);
// // "EDOC": "1720860180652",当前时间 - (EDOC - 280) days =怀孕时间
// //edoc = edoc.ToString().Length == 10 ? edoc * 1000 : edoc;
// var edoc = DateTimeUtil.ToDateTime(watchConfig["EDOC"]!.ToString());
// int pregnancyWeek = (DateTime.Now - edoc.AddDays(-280)).Days / 7;

// _logger.LogInformation($"IMEI {serialNo},EDOC:{edoc},NOW:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")},SinceNOW:{edoc.AddDays(-280).ToString("yyyy-MM-dd HH:mm:ss")},怀孕周数 {pregnancyWeek}");

// float statMaxValueFprCoefficient = 0f;
// float statMinValueFprCoefficient = 0f;
// float StatModeAvgFprCoefficient = 0f;
// // 20-45周之间
// if (pregnancyWeek >= 12 && pregnancyWeek <= 45)
// {
// var map = fhrMap
// .Where(i =>
// i.PregnancyPeriod![0] <= pregnancyWeek &&
// i.PregnancyPeriod[1] >= pregnancyWeek &&
// i.PregnancyHeartRateRange![0] <= mode &&
// i.PregnancyHeartRateRange[1] >= mode)
// .FirstOrDefault();

// if (map != null)
// {
// statMaxValueFprCoefficient = (float)Math.Round((decimal)map.FetalHeartRateRange![1] / res.Max(), 3);
// statMinValueFprCoefficient = (float)Math.Round((decimal)map.FetalHeartRateRange[0] / res.Min(), 3);
// StatModeAvgFprCoefficient = (float)Math.Round((decimal)map.FetalHeartRateAverage / mode, 3);
// }
// }

// return new PregnancyCommonHeartRateModel()
// {
// Timestamp = DateTime.Now,
// PersonId = collection.First().DeviceKey,
// DeviceKey = collection.First().DeviceKey,
// SerialNumber = collection.First().SerialNumber,
// Mode = mode,
// Percentage = percentage,
// MaxValue = closestToModeData.Max(),
// MinValue = closestToModeData.Min(),
// OriginalMaxValue = res.Max(),
// OriginalMinValue = res.Min(),
// CreateTime = DateTime.Now,
// StatStartTime = collection.OrderBy(i => i.Timestamp).Select(i => i.Timestamp).First(),
// StatEndTime = collection.OrderBy(i => i.Timestamp).Select(i => i.Timestamp).Last(),
// StatMaxValueFprCoefficient = statMaxValueFprCoefficient,
// StatMinValueFprCoefficient = statMinValueFprCoefficient,
// StatModeAvgFprCoefficient = StatModeAvgFprCoefficient,
// Remark = string.Empty,
// SerialTailNumber = serialNo.Substring(serialNo.Length - 2)
// };

//}



public async Task<PregnancyCommonHeartRateModel?> InitPregnancyCommonHeartRateModeAsync(string serialNo, int days = 7, int percentage = 90, int highFreqSampleInterval=0)
{
var tableName = typeof(PregnancyHeartRateModel)
.GetCustomAttribute<STableAttribute>()?
@@ -846,15 +994,37 @@ namespace HealthMonitor.Service.Biz.db
.OrderByDescending(i => i.Timestamp)
.ToArrayAsync();

var res = collection
.Select(i => i.PregnancyHeartRate).ToList();
// 去除高频数据
var filteredCollection = new List<PregnancyHeartRateModel>();
PregnancyHeartRateModel? previousItem = null;

foreach (var item in collection)
{
if (previousItem == null || (previousItem.Timestamp - item.Timestamp).TotalSeconds >= highFreqSampleInterval)
{
filteredCollection.Add(item);
previousItem = item;
}
}

// 心率数据量必须30个以上才进行计算
if (res.Count < 30)
if (filteredCollection.Count < 30)
{
_logger.LogInformation($"{serialNo} 心率数据不足,无法计算其众数");
return null;
}


var res = filteredCollection
.Select(i => i.PregnancyHeartRate).ToList();
//// 心率数据量必须30个以上才进行计算
//if (res.Count < 30)
//{
// _logger.LogInformation($"{serialNo} 心率数据不足,无法计算其众数");
// return null;
//}
_logger.LogInformation($"{serialNo} 去除高频数据后的数据集: " + string.Join(", ", filteredCollection));

#region 计算众数
var mode = res.GroupBy(n => n)
.OrderByDescending(g => g.Count())
@@ -893,7 +1063,7 @@ namespace HealthMonitor.Service.Biz.db
median = sortedRes[count / 2];
}
//Console.WriteLine("中位数是: " + median);
_logger.LogInformation($"{serialNo} 中位数是: " + median);
_logger.LogInformation($"{serialNo} 中位数是: " + median);
// 找出最接近平均值的众数
//var closestToAverage = modes.OrderBy(m => Math.Abs(m - average)).First();
//Console.WriteLine("最接近平均值的众数是: " + closestToAverage);
@@ -977,6 +1147,7 @@ namespace HealthMonitor.Service.Biz.db

}


/// <summary>
/// 获取孕妇心率众数
/// </summary>


+ 156
- 23
HealthMonitor.Service/Resolver/PregnancyHeartRateResolver.cs View File

@@ -106,8 +106,8 @@ namespace HealthMonitor.Service.Resolver

if (isFetalHeartEnable)
{
// 高频心率采样间隔
var highFreqSampleInterval = (int)watchConfig!["highFreqSampleInterval"]!;
// 高频心率采样间隔 highFreqSampleInterval = highFreqSampleInterval+5,增加5秒兼容
var highFreqSampleInterval = (int)watchConfig!["highFreqSampleInterval"]!+5;
// 触发高频监测的心率上限值
var triggerHighFreqHigh = (int)watchConfig["triggerHighFreqHigh"]!;
// 触发高频监测的心率下限值
@@ -135,7 +135,7 @@ namespace HealthMonitor.Service.Resolver
if (commonPHR == null)
{
// 处理孕妇业务,计算一般心率并下发
commonPHR = await _serviceTDengine.InitPregnancyCommonHeartRateModeAsync(heartRate.Serialno);
commonPHR = await _serviceTDengine.InitPregnancyCommonHeartRateModeAsync(heartRate.Serialno,highFreqSampleInterval: highFreqSampleInterval);
// 建模完成
var flag = await _serviceIotApi.SetFetalConfig(heartRate.Serialno, 1, commonPHR!.MaxValue, commonPHR!.MinValue);
_logger.LogInformation($"{heartRate.Serialno} 记录数量足够,建模完成");
@@ -152,8 +152,8 @@ namespace HealthMonitor.Service.Resolver
// 如果需要,将时间差转换为秒
var timeDiffInSeconds = timeDiff.TotalSeconds;

// 高频心率启动,highFreqSampleInterval = highFreqSampleInterval+5,增加5秒兼容
if (timeDiffInSeconds <= (highFreqSampleInterval+5))
// 高频心率启动
if (timeDiffInSeconds <= highFreqSampleInterval)
{

var phrFreqstatus = await _deviceCacheMgr.GetPregnancyHeartRateFreqStatusAsync(heartRate.Serialno);
@@ -177,7 +177,9 @@ namespace HealthMonitor.Service.Resolver
{
var avgPhr = lastPhr.Select(i => i.PregnancyHeartRate).Average();
// 计算一般心率得到胎心系数
await SaveAndPushFreqFetalHeartRateAsync(heartRate, upperAlarmThreshold, lowerAlarmThreshold, avgPhr, DateTimeUtil.ConvertToTimeStamp(DateTime.Now).ToString());
//await SaveAndPushFreqFetalHeartRateAsync(heartRate, upperAlarmThreshold, lowerAlarmThreshold, avgPhr, DateTimeUtil.ConvertToTimeStamp(DateTime.Now).ToString());
// 高频数据不建模
await SaveAndPushFreqFetalHeartRateAsync(heartRate, commonPHR, upperAlarmThreshold, lowerAlarmThreshold, avgPhr, DateTimeUtil.ConvertToTimeStamp(DateTime.Now).ToString());

}
#endregion
@@ -200,7 +202,9 @@ namespace HealthMonitor.Service.Resolver
// 推送胎心数据到 api/v1/open/OpenIot/SetFetalHeartRateConfig
// 计算一般心率得到胎心系数
//await SaveAndPushFetalHeartRateAsync(heartRate, upperAlarmThreshold, lowerAlarmThreshold, avgPhr);
await SaveAndPushFreqFetalHeartRateAsync(heartRate, upperAlarmThreshold, lowerAlarmThreshold, avgPhr, DateTimeUtil.ConvertToTimeStamp(DateTime.Now).ToString());
//await SaveAndPushFreqFetalHeartRateAsync(heartRate, upperAlarmThreshold, lowerAlarmThreshold, avgPhr, DateTimeUtil.ConvertToTimeStamp(DateTime.Now).ToString());
// 高频数据不建模
await SaveAndPushFreqFetalHeartRateAsync(heartRate, commonPHR, upperAlarmThreshold, lowerAlarmThreshold, avgPhr, DateTimeUtil.ConvertToTimeStamp(DateTime.Now).ToString());

}

@@ -217,7 +221,10 @@ namespace HealthMonitor.Service.Resolver
// 推送胎心数据到 api/v1/open/OpenIot/SetFetalHeartRateConfig
// 计算一般心率得到胎心系数
//await SaveAndPushFetalHeartRateAsync(heartRate, upperAlarmThreshold, lowerAlarmThreshold, avgPhr);
await SaveAndPushFreqFetalHeartRateAsync(heartRate, upperAlarmThreshold, lowerAlarmThreshold, avgPhr, DateTimeUtil.ConvertToTimeStamp(DateTime.Now).ToString());
//await SaveAndPushFreqFetalHeartRateAsync(heartRate, upperAlarmThreshold, lowerAlarmThreshold, avgPhr, DateTimeUtil.ConvertToTimeStamp(DateTime.Now).ToString());
//await SaveAndPushFreqFetalHeartRateAsync(heartRate, commonPHR, upperAlarmThreshold, lowerAlarmThreshold, avgPhr, DateTimeUtil.ConvertToTimeStamp(DateTime.Now).ToString());
// 高频数据不建模
await SaveAndPushFreqFetalHeartRateAsync(heartRate, commonPHR, upperAlarmThreshold, lowerAlarmThreshold, avgPhr, DateTimeUtil.ConvertToTimeStamp(DateTime.Now).ToString());

}

@@ -701,7 +708,107 @@ namespace HealthMonitor.Service.Resolver

}

private async Task SaveAndPushFetalHeartRateAsync(HisGpsHeartRate heartRate, int upperAlarmThreshold, int lowerAlarmThreshold, double avgPhr)
//private async Task SaveAndPushFetalHeartRateAsync(HisGpsHeartRate heartRate, int upperAlarmThreshold, int lowerAlarmThreshold, double avgPhr)
//{
// var commonPHR = await _serviceTDengine.InitPregnancyCommonHeartRateModeAsync(heartRate.Serialno);
// if (commonPHR != null)
// {
// // 保存到TDengine数据库
// await _serviceTDengine.InsertAsync<PregnancyCommonHeartRateModel>("hm_pchr", commonPHR);
// // 计算胎心=孕妇心率*系数
// var fetalHeartRate = SafeType.SafeInt(avgPhr * commonPHR?.StatModeAvgFprCoefficient!);
// var sampleTime = DateTimeUtil.ConvertToTimeStamp(DateTime.Now).ToString();
// var isAbnormal = fetalHeartRate > upperAlarmThreshold ? 1 : (fetalHeartRate < lowerAlarmThreshold ? 2 : 0);

// // 保存到 数据服务 MySQL 数据库
// HisGpsFetalHeartRate gpsFetalHeartRate = new ()
// {
// FetalHeartRateId = Guid.NewGuid().ToString("D"),
// PersonId = commonPHR!.PersonId,
// Serialno = heartRate.Serialno,
// HeartRate = fetalHeartRate,
// SampleTime = sampleTime.Length > 10 ? sampleTime.Substring(0, 10) : sampleTime,
// IsAbnormal = isAbnormal,
// StatStartTime = commonPHR.StatStartTime,
// StatEndTime = commonPHR.StatEndTime,
// CreateTime = DateTime.Now,
// Method = 1,
// IsDisplay = 1,
// DeviceKey = commonPHR!.DeviceKey
// };
// await _hisFetalHeartApiClient.AddAsync(gpsFetalHeartRate).ConfigureAwait(false);

// // 推送到api/v1/open/OpenIot/SetFetalHeartRateConfig
// await _serviceIotApi.SetFetalHeartRateConfig(heartRate.Serialno, fetalHeartRate, sampleTime, isAbnormal);

// // 推送到微信
// var device = await _deviceCacheMgr.GetDeviceBySerialNoAsync(heartRate.Serialno).ConfigureAwait(false);

// var deviceId = device?.DeviceId;
// var msg = new
// {
// messageId = "",
// topic = "topic.push.wx",
// time=""
// };
// }
//}

private async Task SaveAndPushFreqFetalHeartRateAsync(HisGpsHeartRate heartRate, PregnancyCommonHeartRateModel commonPHR, int upperAlarmThreshold, int lowerAlarmThreshold, double avgPhr,string sampleTime)
{
// 计算胎心=孕妇心率*系数
var fetalHeartRate = SafeType.SafeInt(avgPhr * commonPHR?.StatModeAvgFprCoefficient!);
var isAbnormal = fetalHeartRate > upperAlarmThreshold ? 1 : (fetalHeartRate < lowerAlarmThreshold ? 2 : 0);

// 保存到 数据服务 MySQL 数据库
HisGpsFetalHeartRate gpsFetalHeartRate = new()
{
FetalHeartRateId = Guid.NewGuid().ToString("D"),
PersonId = commonPHR!.PersonId,
Serialno = heartRate.Serialno,
HeartRate = fetalHeartRate,
SampleTime = sampleTime.Length > 10 ? sampleTime.Substring(0, 10) : sampleTime,
IsAbnormal = isAbnormal,
StatStartTime = commonPHR.StatStartTime,
StatEndTime = commonPHR.StatEndTime,
CreateTime = DateTime.Now,
Method = 1,
IsDisplay = 1,
DeviceKey = commonPHR!.DeviceKey
};
await _hisFetalHeartApiClient.AddAsync(gpsFetalHeartRate).ConfigureAwait(false);

// 推送到api/v1/open/OpenIot/SetFetalHeartRateConfig
await _serviceIotApi.SetFetalHeartRateConfig(heartRate.Serialno, fetalHeartRate, sampleTime, isAbnormal);

// 推送到微信
if (isAbnormal != 0)
{
var device = await _deviceCacheMgr.GetDeviceBySerialNoAsync(heartRate.Serialno).ConfigureAwait(false);
var fhrMsgId = $"{heartRate.Serialno}-{sampleTime}-{Guid.NewGuid().ToString("D")[^3..]}";
var topic = "topic.push.wx";
var fhrMsg = new
{
messageId = fhrMsgId,
topic = topic,
time = DateTimeUtil.GetDateTimeFromUnixTimeMilliseconds(long.Parse(sampleTime.Length < 13 ? sampleTime.PadRight(13, '0') : sampleTime)).ToString("yyyy-MM-dd HH:mm:ss"),
data = new
{
deviceId = device?.DeviceId,
imei = heartRate.Serialno,
alarmTypeId = 12,
alarmDeviceName = heartRate.Serialno,
alarmRemarks = JsonConvert.SerializeObject(new { fetalHeartValue = fetalHeartRate, isAbnormal = isAbnormal }),
address = string.Empty,
deviceKey = device?.DeviceId
}
};
await _serviceMqProcess.ProcessIMEIEventMessageAsync(fhrMsgId, topic, fhrMsg).ConfigureAwait(false);

}
}

private async Task SaveAndPushFreqFetalHeartRateAsync(HisGpsHeartRate heartRate, int upperAlarmThreshold, int lowerAlarmThreshold, double avgPhr, string sampleTime)
{
var commonPHR = await _serviceTDengine.InitPregnancyCommonHeartRateModeAsync(heartRate.Serialno);
if (commonPHR != null)
@@ -710,11 +817,10 @@ namespace HealthMonitor.Service.Resolver
await _serviceTDengine.InsertAsync<PregnancyCommonHeartRateModel>("hm_pchr", commonPHR);
// 计算胎心=孕妇心率*系数
var fetalHeartRate = SafeType.SafeInt(avgPhr * commonPHR?.StatModeAvgFprCoefficient!);
var sampleTime = DateTimeUtil.ConvertToTimeStamp(DateTime.Now).ToString();
var isAbnormal = fetalHeartRate > upperAlarmThreshold ? 1 : (fetalHeartRate < lowerAlarmThreshold ? 2 : 0);

// 保存到 数据服务 MySQL 数据库
HisGpsFetalHeartRate gpsFetalHeartRate = new ()
HisGpsFetalHeartRate gpsFetalHeartRate = new()
{
FetalHeartRateId = Guid.NewGuid().ToString("D"),
PersonId = commonPHR!.PersonId,
@@ -735,25 +841,51 @@ namespace HealthMonitor.Service.Resolver
await _serviceIotApi.SetFetalHeartRateConfig(heartRate.Serialno, fetalHeartRate, sampleTime, isAbnormal);

// 推送到微信
var device = await _deviceCacheMgr.GetDeviceBySerialNoAsync(heartRate.Serialno).ConfigureAwait(false);

var deviceId = device?.DeviceId;
var msg = new
if (isAbnormal != 0)
{
messageId = "",
topic = "topic.push.wx",
time=""
};
var device = await _deviceCacheMgr.GetDeviceBySerialNoAsync(heartRate.Serialno).ConfigureAwait(false);
var fhrMsgId = $"{heartRate.Serialno}-{sampleTime}-{Guid.NewGuid().ToString("D")[^3..]}";
var topic = "topic.push.wx";
var fhrMsg = new
{
messageId = fhrMsgId,
topic = topic,
time = DateTimeUtil.GetDateTimeFromUnixTimeMilliseconds(long.Parse(sampleTime.Length < 13 ? sampleTime.PadRight(13, '0') : sampleTime)).ToString("yyyy-MM-dd HH:mm:ss"),
data = new
{
deviceId = device?.DeviceId,
imei = heartRate.Serialno,
alarmTypeId = 12,
alarmDeviceName = heartRate.Serialno,
alarmRemarks = JsonConvert.SerializeObject(new { fetalHeartValue = fetalHeartRate, isAbnormal = isAbnormal }),
address = string.Empty,
deviceKey = device?.DeviceId
}
};
await _serviceMqProcess.ProcessIMEIEventMessageAsync(fhrMsgId, topic, fhrMsg).ConfigureAwait(false);

}


}
}

private async Task SaveAndPushFreqFetalHeartRateAsync(HisGpsHeartRate heartRate, int upperAlarmThreshold, int lowerAlarmThreshold, double avgPhr,string sampleTime)
/// <summary>
///
/// </summary>
/// <param name="heartRate"></param>
/// <param name="upperAlarmThreshold"></param>
/// <param name="lowerAlarmThreshold"></param>
/// <param name="avgPhr"></param>
/// <param name="sampleTime"></param>
/// <returns></returns>
private async Task SaveAndPushFreqFetalHeartRate2Async(HisGpsHeartRate heartRate, int upperAlarmThreshold, int lowerAlarmThreshold, double avgPhr, string sampleTime)
{
var commonPHR = await _serviceTDengine.InitPregnancyCommonHeartRateModeAsync(heartRate.Serialno);
var commonPHR = await _serviceTDengine.GetLastAsync<PregnancyCommonHeartRateModel>(heartRate.Serialno);
if (commonPHR != null)
{
// 保存到TDengine数据库
await _serviceTDengine.InsertAsync<PregnancyCommonHeartRateModel>("hm_pchr", commonPHR);
//await _serviceTDengine.InsertAsync<PregnancyCommonHeartRateModel>("hm_pchr", commonPHR);
// 计算胎心=孕妇心率*系数
var fetalHeartRate = SafeType.SafeInt(avgPhr * commonPHR?.StatModeAvgFprCoefficient!);
var isAbnormal = fetalHeartRate > upperAlarmThreshold ? 1 : (fetalHeartRate < lowerAlarmThreshold ? 2 : 0);
@@ -780,7 +912,7 @@ namespace HealthMonitor.Service.Resolver
await _serviceIotApi.SetFetalHeartRateConfig(heartRate.Serialno, fetalHeartRate, sampleTime, isAbnormal);

// 推送到微信
if (isAbnormal!=0)
if (isAbnormal != 0)
{
var device = await _deviceCacheMgr.GetDeviceBySerialNoAsync(heartRate.Serialno).ConfigureAwait(false);
var fhrMsgId = $"{heartRate.Serialno}-{sampleTime}-{Guid.NewGuid().ToString("D")[^3..]}";
@@ -808,6 +940,7 @@ namespace HealthMonitor.Service.Resolver

}
}

private async Task SetIntervalTriggerAsync(string key,string imei, long interval)
{
// var key = $"health_monitor/schedule_push/{type}/imei/{imei}";


+ 28
- 18
HealthMonitor.WebApi/Worker.cs View File

@@ -154,28 +154,38 @@ namespace HealthMonitor.WebApi
{
if (key.Contains("pregnancy_heart_rate"))
{
// 处理孕妇业务,计算一般心率并下发
var commonPHR= await _serviceTDengine.InitPregnancyCommonHeartRateModeAsync(imeiDel);
// 设置胎心监测参数
var watchConfig = await _deviceCacheMgr.GetGpsDeviceWatchConfigCacheObjectBySerialNoAsync(imeiDel, "0067");
var isFetalHeartEnable = watchConfig != null && (int)watchConfig["enabled"]! == 1;

if (commonPHR == null)
if (isFetalHeartEnable)
{
// 建模中
var flag= await _serviceIotApi.SetFetalConfig(imeiDel);
_logger.LogInformation($"{imeiDel} 建模建模中");
}
else
{
// 建模完成
var flag = await _serviceIotApi.SetFetalConfig(imeiDel,1,commonPHR.MaxValue,commonPHR.MinValue);
_logger.LogInformation($"{imeiDel} 建模完成");
// 保存到TDengine数据库
await _serviceTDengine.InsertAsync<PregnancyCommonHeartRateModel>("hm_pchr", commonPHR);
_logger.LogInformation($"保存TDengine完成");

//
// 高频心率采样间隔 highFreqSampleInterval = highFreqSampleInterval+5,增加5秒兼容
var highFreqSampleInterval = (int)watchConfig!["highFreqSampleInterval"]! + 5;

// 处理孕妇业务,计算一般心率并下发
var commonPHR = await _serviceTDengine.InitPregnancyCommonHeartRateModeAsync(imeiDel, highFreqSampleInterval: highFreqSampleInterval);
if (commonPHR == null)
{
// 建模中
var flag = await _serviceIotApi.SetFetalConfig(imeiDel);
_logger.LogInformation($"{imeiDel} 建模建模中");
}
else
{
// 建模完成
var flag = await _serviceIotApi.SetFetalConfig(imeiDel, 1, commonPHR.MaxValue, commonPHR.MinValue);
_logger.LogInformation($"{imeiDel} 建模完成");
// 保存到TDengine数据库
await _serviceTDengine.InsertAsync<PregnancyCommonHeartRateModel>("hm_pchr", commonPHR);
_logger.LogInformation($"保存TDengine完成");

//
}
}



#region 注册定时下发
var startTime = DateTime.Now;
// 注册下次下推


Loading…
Cancel
Save