|
- using HealthMonitor.Common;
- using HealthMonitor.Core.Dal;
- using HealthMonitor.Model.Cache;
- using HealthMonitor.Service.Biz.db;
- using HealthMonitor.Service.Cache;
- using HealthMonitor.Util.Entities.HealthMonitor;
- using HealthMonitor.WebApi.Configs;
- using Microsoft.AspNetCore.Mvc;
- using Newtonsoft.Json;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Security.Cryptography;
- using System.Text;
- using System.Text.RegularExpressions;
- using System.Threading.Tasks;
- using TelpoDataService.Util.Entities.GpsLocationHistory;
-
- namespace HealthMonitor.WebApi.Controllers.HealthMonitor
- {
- [ApiExplorerSettings(GroupName = AppConsts.SWAGGER_DOC_HealthMonitor)]
- [Produces("application/json")]
- [Route("api/HealthMonitor/[controller]/[action]")]
- [ApiController]
- public class HmBloodPressController:ControllerBase
- {
-
-
- protected readonly ILogger _logger;
- private readonly TDengineService _serviceTDengine;
- private readonly PersonCacheManager _personCacheMgr;
- private readonly BloodPressReferenceValueCacheManager _bpRefValCacheManager;
- protected readonly IHealthMonitorDataAccessor _dataAccessor;
-
-
-
- public HmBloodPressController
- (
- ILogger<HmBloodPressController> logger,
- TDengineService serviceDengine,
- PersonCacheManager personCacheMgr,
- BloodPressReferenceValueCacheManager bpRefValCacheManager,
- IHealthMonitorDataAccessor dataAccessor
- )
- {
- _logger = logger;
- _serviceTDengine = serviceDengine;
- _personCacheMgr = personCacheMgr;
- _dataAccessor = dataAccessor;
- _bpRefValCacheManager = bpRefValCacheManager;
-
- }
-
- [HttpPost]
- public async Task<IActionResult> AddAsync([FromHeader] string requestId,[FromBody] HisGpsBloodPress bp)
- {
- //
- //HisGpsBloodPress bp = new()
- //{
- // BloodPressId = "261850cb-ce91-4003-8c63-a1f8f50d6495",
- // MessageId = "1670682284342246914",
- // Serialno = "861281060083627",
- // SystolicValue = 114,
- // DiastolicValue = 79,
- // CreateTime = DateTime.Parse("2023-06-19 14:37:53"),
- // LastUpdate = DateTime.Parse("2023-06-19 14:26:52"),
- // Method = 1,
- // IsDisplay = 1
- //};
-
- //
- //861281060081969
- //HisGpsBloodPress bp = new()
- //{
- // BloodPressId = "7df62202-8d49-4f91-90da-25a4036c26fb",
- // MessageId = "1670992704491900929",
- // Serialno = "861281060081969",
- // SystolicValue = 110,
- // DiastolicValue = 72,
- // CreateTime = DateTime.Parse("2023-06-20 11:11:31"),
- // LastUpdate = DateTime.Parse("2023-06-20 10:20:40"),
- // Method = 1,
- // IsDisplay = 1
- //};
-
- // 861281060086380
-
-
- //var aggregate = await _serviceTDengine.GetAvgExceptMaxMinValue("diastolic_value", "hm_bloodpress", $"ts>='{DateTime.Now.AddDays(-7):yyyy-MM-ddTHH:mm:ss.fffZ}' and ts <='{DateTime.Now:yyyy-MM-ddTHH:mm:ss.fffZ}' and serialno='861281060083627' and systolic_value < {120} and diastolic_value >{80}");
-
- //+++++++++++++++++++++++++++++++
-
-
-
- #region 获取个人信息
-
- var person = await _personCacheMgr.GetDeviceGpsPersonCacheBySerialNoAsync(bp.MessageId, bp.Serialno).ConfigureAwait(false);
- // 验证这个信息是否存在
- if (person == null || person?.Person.BornDate == null) return Ok(false);
- // 验证年龄是否在范围 (2 - 120)
- var age = SafeType.SafeInt(DateTime.Today.Year - person?.Person.BornDate!.Value.Year!);
- if (age < 1 || age > 120) return Ok(false);
-
- var gender = person?.Person.Gender == true ? 1 : 2;
- var isHypertension = SafeType.SafeBool(person?.Person.Ishypertension!);
- var height = SafeType.SafeDouble(person?.Person.Height!);
- var weight = SafeType.SafeDouble(person?.Person.Weight!);
- #endregion
-
- #region 插入当次BP数据
- // 保存到TDengine
-
- var bpSql = $"INSERT INTO health_monitor.hm_bloodpress VALUES(" +
- $"'{bp.LastUpdate:yyyy-MM-ddTHH:mm:ss.fffZ}'," +
- $"'{bp.BloodPressId}'," +
- $"'{bp.MessageId}'," +
- $"'{bp.Serialno}'," +
- $"{bp.SystolicValue}," +
- $"{bp.DiastolicValue}," +
- $"'{bp.CreateTime:yyyy-MM-ddTHH:mm:ss.fffZ}'," +
- $"'{bp.LastUpdate:yyyy-MM-ddTHH:mm:ss.fffZ}'," +
- $"{bp.Method}," +
- $"{bp.IsDisplay == 1})";
-
- await _serviceTDengine.GernalRestSql(bpSql);
-
- #endregion
-
- #region 计算增量值
- var bpRef = await _bpRefValCacheManager.GetBloodPressReferenceValueAsync(age, gender, isHypertension);
-
- var systolicRefValue = bpRef?.Systolic;//?
- var diastolicRefValue = bpRef?.Diastolic;//?
-
- // 获取历史数据
- DateTime now = DateTime.Now;
- DateTime startTime = now.AddDays(-30);
- DateTime endTime = now;
-
- // 计算去除最大值和最小值和异常值的平均值
- var systolicAvg = await _serviceTDengine.GetAvgExceptMaxMinValue("systolic_value", "hm_bloodpress", $"ts>='{startTime:yyyy-MM-ddTHH:mm:ss.fffZ}' and ts <='{endTime:yyyy-MM-ddTHH:mm:ss.fffZ}' and serialno='{bp.Serialno}' and systolic_value < {systolicRefValue} and diastolic_value >{diastolicRefValue}");
- var diastolicAvg = await _serviceTDengine.GetAvgExceptMaxMinValue("diastolic_value", "hm_bloodpress", $"ts>='{startTime:yyyy-MM-ddTHH:mm:ss.fffZ}' and ts <='{endTime:yyyy-MM-ddTHH:mm:ss.fffZ}' and serialno='{bp.Serialno}' and systolic_value < {systolicRefValue} and diastolic_value >{diastolicRefValue}");
-
- // 偏移参数
- var avgOffset = 0.25M;
-
- // 增量值=(标定值-平均值)* 0.25
- var systolicInc = systolicAvg.Equals(0M) ? 0: (int)((systolicRefValue - systolicAvg)* avgOffset)!;
- var diastolicInc = diastolicAvg.Equals(0M) ? 0 : (int)((diastolicRefValue - diastolicAvg) * avgOffset)!;
-
- #endregion
-
- #region 插入BP增量值
- var sql = $"INSERT INTO health_monitor.hm_bloodpress_stats_inc VALUES(" +
- $"'{bp.LastUpdate:yyyy-MM-ddTHH:mm:ss.fffZ}'," +
- $"'{bp.BloodPressId}'," +
- $"'{bp.MessageId}'," +
- $"'{bp.Serialno}'," +
- $"{bp.SystolicValue}," +
- $"{bp.DiastolicValue}," +
- $"'{bp.LastUpdate:yyyy-MM-ddTHH:mm:ss.fffZ}'," +
- $"{systolicInc}," +
- $"{diastolicInc}," +
- $"{avgOffset}," +
- $"{gender}," +
- $"{age}," +
- $"{height}," +
- $"{weight}," +
- $"'{startTime:yyyy-MM-ddTHH:mm:ss.fffZ}'," +
- $"'{endTime:yyyy-MM-ddTHH:mm:ss.fffZ}')";
- var res = await _serviceTDengine.GernalRestSql(sql);
- #endregion
-
- return Ok(res);
- }
- }
- }
|