From 2a32a5f1246f3c5a1757147af9e60da61683f2ae Mon Sep 17 00:00:00 2001 From: H Vs Date: Wed, 24 Jul 2024 16:44:10 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=BC=E5=AE=B9sampleTime=E9=95=BF=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HealthMonitor.Service/Biz/IotApiService.cs | 6 +- .../Biz/db/TDengineService.cs | 177 +++++++++--------- 2 files changed, 94 insertions(+), 89 deletions(-) diff --git a/HealthMonitor.Service/Biz/IotApiService.cs b/HealthMonitor.Service/Biz/IotApiService.cs index 2edd812..624e865 100644 --- a/HealthMonitor.Service/Biz/IotApiService.cs +++ b/HealthMonitor.Service/Biz/IotApiService.cs @@ -379,7 +379,7 @@ namespace HealthMonitor.Service.Biz { imei = serialno, heartValue = fhr, - sampleTime, + sampleTime = sampleTime.Length > 10 ? sampleTime.Substring(0, 10) : sampleTime, isAbnormal }; @@ -401,7 +401,7 @@ namespace HealthMonitor.Service.Biz } - public async Task SetFetalMovementConfig(string serialno,int fm, string sampeTime, int isAbnormal) + public async Task SetFetalMovementConfig(string serialno,int fm, string sampleTime, int isAbnormal) { try { @@ -433,7 +433,7 @@ namespace HealthMonitor.Service.Biz { imei = serialno, movementValue = fm, - sampeTime, + sampleTime = sampleTime.Length > 10 ? sampleTime.Substring(0, 10) : sampleTime, isAbnormal }; diff --git a/HealthMonitor.Service/Biz/db/TDengineService.cs b/HealthMonitor.Service/Biz/db/TDengineService.cs index 55672b0..6feb925 100644 --- a/HealthMonitor.Service/Biz/db/TDengineService.cs +++ b/HealthMonitor.Service/Biz/db/TDengineService.cs @@ -823,80 +823,7 @@ namespace HealthMonitor.Service.Biz.db #endregion #region 胎心算法 - /// - /// 获取孕妇心率众数 - /// - /// - /// - /// - public async Task GetPregnancyHeartRateModeAsync(string serialNo,int days=7) - { - var tableName = typeof(PregnancyHeartRateModel) - .GetCustomAttribute()? - .STableName; - var daysAgo = DateTime.Now.AddDays(-days); - var res = await _clientSqlSugar - .Queryable() - .AS(tableName) - .Where(i=>i.SerialNumber.Equals(serialNo)) - .Where(i => i.Timestamp > daysAgo) - //.OrderByDescending(i => i.PregnancyHeartRate) - .Select(i =>i.PregnancyHeartRate) - .ToListAsync(); - // 心率数据量必须30个以上才进行计算 - if (res.Count < 30) return 0; - - // 计算众数 - 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); - - // 找出最接近平均值的众数 - //var closestToAverage = modes.OrderBy(m => Math.Abs(m - average)).First(); - //Console.WriteLine("最接近平均值的众数是: " + closestToAverage); - // 找出最接近中位数的众数 - var closestToMedian = modes.OrderBy(m => Math.Abs(m - median)).First(); - Console.WriteLine("最接近中位数的众数是: " + closestToMedian); - mode = closestToMedian; - } - - return mode; - } /// /// 计算个人一般心率 /// @@ -904,7 +831,7 @@ namespace HealthMonitor.Service.Biz.db /// /// /// - public async Task InitPregnancyCommonHeartRateModeAsync(string serialNo, int days = 7,int percentage=90) + public async Task InitPregnancyCommonHeartRateModeAsync(string serialNo, int days = 7, int percentage = 90) { var tableName = typeof(PregnancyHeartRateModel) .GetCustomAttribute()? @@ -922,7 +849,7 @@ namespace HealthMonitor.Service.Biz.db var res = collection .Select(i => i.PregnancyHeartRate).ToList(); // 心率数据量必须30个以上才进行计算 - if (res.Count < 30) + if (res.Count < 30) { _logger.LogInformation($"{serialNo} 心率数据不足,无法计算其众数"); return null; @@ -992,7 +919,7 @@ namespace HealthMonitor.Service.Biz.db var fhrMap = _mgrFhrPhrMapCache.GetHeartRatesMap(); var watchConfig = await _deviceCacheMgr.GetGpsDeviceWatchConfigCacheObjectBySerialNoAsync(serialNo, "0067"); - if (watchConfig == null ) + if (watchConfig == null) { return null; } @@ -1000,7 +927,7 @@ namespace HealthMonitor.Service.Biz.db // "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; + 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}"); @@ -1010,19 +937,19 @@ namespace HealthMonitor.Service.Biz.db // 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(); + 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); + StatModeAvgFprCoefficient = (float)Math.Round((decimal)map.FetalHeartRateAverage / mode, 3); } } @@ -1042,13 +969,91 @@ namespace HealthMonitor.Service.Biz.db 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, + StatMinValueFprCoefficient = statMinValueFprCoefficient, StatModeAvgFprCoefficient = StatModeAvgFprCoefficient, Remark = string.Empty, SerialTailNumber = serialNo.Substring(serialNo.Length - 2) }; } + + /// + /// 获取孕妇心率众数 + /// + /// + /// + /// + //public async Task GetPregnancyHeartRateModeAsync(string serialNo,int days=7) + //{ + // var tableName = typeof(PregnancyHeartRateModel) + // .GetCustomAttribute()? + // .STableName; + // var daysAgo = DateTime.Now.AddDays(-days); + // var res = await _clientSqlSugar + // .Queryable() + // .AS(tableName) + // .Where(i=>i.SerialNumber.Equals(serialNo)) + // .Where(i => i.Timestamp > daysAgo) + // //.OrderByDescending(i => i.PregnancyHeartRate) + // .Select(i =>i.PregnancyHeartRate) + // .ToListAsync(); + // // 心率数据量必须30个以上才进行计算 + // if (res.Count < 30) return 0; + + // // 计算众数 + // 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); + + // // 找出最接近平均值的众数 + // //var closestToAverage = modes.OrderBy(m => Math.Abs(m - average)).First(); + // //Console.WriteLine("最接近平均值的众数是: " + closestToAverage); + + // // 找出最接近中位数的众数 + // var closestToMedian = modes.OrderBy(m => Math.Abs(m - median)).First(); + // Console.WriteLine("最接近中位数的众数是: " + closestToMedian); + // mode = closestToMedian; + // } + + // return mode; + //} + + + #endregion } }