You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

178 lines
7.3KB

  1. using HealthMonitor.Common;
  2. using HealthMonitor.Core.Dal;
  3. using HealthMonitor.Model.Cache;
  4. using HealthMonitor.Service.Biz.db;
  5. using HealthMonitor.Service.Cache;
  6. using HealthMonitor.Util.Entities.HealthMonitor;
  7. using HealthMonitor.WebApi.Configs;
  8. using Microsoft.AspNetCore.Mvc;
  9. using Newtonsoft.Json;
  10. using System;
  11. using System.Collections.Generic;
  12. using System.Linq;
  13. using System.Security.Cryptography;
  14. using System.Text;
  15. using System.Text.RegularExpressions;
  16. using System.Threading.Tasks;
  17. using TelpoDataService.Util.Entities.GpsLocationHistory;
  18. namespace HealthMonitor.WebApi.Controllers.HealthMonitor
  19. {
  20. [ApiExplorerSettings(GroupName = AppConsts.SWAGGER_DOC_HealthMonitor)]
  21. [Produces("application/json")]
  22. [Route("api/HealthMonitor/[controller]/[action]")]
  23. [ApiController]
  24. public class HmBloodPressController:ControllerBase
  25. {
  26. protected readonly ILogger _logger;
  27. private readonly TDengineService _serviceTDengine;
  28. private readonly PersonCacheManager _personCacheMgr;
  29. private readonly BloodPressReferenceValueCacheManager _bpRefValCacheManager;
  30. protected readonly IHealthMonitorDataAccessor _dataAccessor;
  31. public HmBloodPressController
  32. (
  33. ILogger<HmBloodPressController> logger,
  34. TDengineService serviceDengine,
  35. PersonCacheManager personCacheMgr,
  36. BloodPressReferenceValueCacheManager bpRefValCacheManager,
  37. IHealthMonitorDataAccessor dataAccessor
  38. )
  39. {
  40. _logger = logger;
  41. _serviceTDengine = serviceDengine;
  42. _personCacheMgr = personCacheMgr;
  43. _dataAccessor = dataAccessor;
  44. _bpRefValCacheManager = bpRefValCacheManager;
  45. }
  46. [HttpPost]
  47. public async Task<IActionResult> AddAsync([FromHeader] string requestId,[FromBody] HisGpsBloodPress bp)
  48. {
  49. //
  50. //HisGpsBloodPress bp = new()
  51. //{
  52. // BloodPressId = "261850cb-ce91-4003-8c63-a1f8f50d6495",
  53. // MessageId = "1670682284342246914",
  54. // Serialno = "861281060083627",
  55. // SystolicValue = 114,
  56. // DiastolicValue = 79,
  57. // CreateTime = DateTime.Parse("2023-06-19 14:37:53"),
  58. // LastUpdate = DateTime.Parse("2023-06-19 14:26:52"),
  59. // Method = 1,
  60. // IsDisplay = 1
  61. //};
  62. //
  63. //861281060081969
  64. //HisGpsBloodPress bp = new()
  65. //{
  66. // BloodPressId = "7df62202-8d49-4f91-90da-25a4036c26fb",
  67. // MessageId = "1670992704491900929",
  68. // Serialno = "861281060081969",
  69. // SystolicValue = 110,
  70. // DiastolicValue = 72,
  71. // CreateTime = DateTime.Parse("2023-06-20 11:11:31"),
  72. // LastUpdate = DateTime.Parse("2023-06-20 10:20:40"),
  73. // Method = 1,
  74. // IsDisplay = 1
  75. //};
  76. // 861281060086380
  77. //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}");
  78. //+++++++++++++++++++++++++++++++
  79. #region 获取个人信息
  80. var person = await _personCacheMgr.GetDeviceGpsPersonCacheBySerialNoAsync(bp.MessageId, bp.Serialno).ConfigureAwait(false);
  81. // 验证这个信息是否存在
  82. if (person == null || person?.Person.BornDate == null) return Ok(false);
  83. // 验证年龄是否在范围 (2 - 120)
  84. var age = SafeType.SafeInt(DateTime.Today.Year - person?.Person.BornDate!.Value.Year!);
  85. if (age < 1 || age > 120) return Ok(false);
  86. var gender = person?.Person.Gender == true ? 1 : 2;
  87. var isHypertension = SafeType.SafeBool(person?.Person.Ishypertension!);
  88. var height = SafeType.SafeDouble(person?.Person.Height!);
  89. var weight = SafeType.SafeDouble(person?.Person.Weight!);
  90. #endregion
  91. #region 插入当次BP数据
  92. // 保存到TDengine
  93. var bpSql = $"INSERT INTO health_monitor.hm_bloodpress VALUES(" +
  94. $"'{bp.LastUpdate:yyyy-MM-ddTHH:mm:ss.fffZ}'," +
  95. $"'{bp.BloodPressId}'," +
  96. $"'{bp.MessageId}'," +
  97. $"'{bp.Serialno}'," +
  98. $"{bp.SystolicValue}," +
  99. $"{bp.DiastolicValue}," +
  100. $"'{bp.CreateTime:yyyy-MM-ddTHH:mm:ss.fffZ}'," +
  101. $"'{bp.LastUpdate:yyyy-MM-ddTHH:mm:ss.fffZ}'," +
  102. $"{bp.Method}," +
  103. $"{bp.IsDisplay == 1})";
  104. await _serviceTDengine.GernalRestSql(bpSql);
  105. #endregion
  106. #region 计算增量值
  107. var bpRef = await _bpRefValCacheManager.GetBloodPressReferenceValueAsync(age, gender, isHypertension);
  108. var systolicRefValue = bpRef?.Systolic;//?
  109. var diastolicRefValue = bpRef?.Diastolic;//?
  110. // 获取历史数据
  111. DateTime now = DateTime.Now;
  112. DateTime startTime = now.AddDays(-30);
  113. DateTime endTime = now;
  114. // 计算去除最大值和最小值和异常值的平均值
  115. 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}");
  116. 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}");
  117. // 偏移参数
  118. var avgOffset = 0.25M;
  119. // 增量值=(标定值-平均值)* 0.25
  120. var systolicInc = systolicAvg.Equals(0M) ? 0: (int)((systolicRefValue - systolicAvg)* avgOffset)!;
  121. var diastolicInc = diastolicAvg.Equals(0M) ? 0 : (int)((diastolicRefValue - diastolicAvg) * avgOffset)!;
  122. #endregion
  123. #region 插入BP增量值
  124. var sql = $"INSERT INTO health_monitor.hm_bloodpress_stats_inc VALUES(" +
  125. $"'{bp.LastUpdate:yyyy-MM-ddTHH:mm:ss.fffZ}'," +
  126. $"'{bp.BloodPressId}'," +
  127. $"'{bp.MessageId}'," +
  128. $"'{bp.Serialno}'," +
  129. $"{bp.SystolicValue}," +
  130. $"{bp.DiastolicValue}," +
  131. $"'{bp.LastUpdate:yyyy-MM-ddTHH:mm:ss.fffZ}'," +
  132. $"{systolicInc}," +
  133. $"{diastolicInc}," +
  134. $"{avgOffset}," +
  135. $"{gender}," +
  136. $"{age}," +
  137. $"{height}," +
  138. $"{weight}," +
  139. $"'{startTime:yyyy-MM-ddTHH:mm:ss.fffZ}'," +
  140. $"'{endTime:yyyy-MM-ddTHH:mm:ss.fffZ}')";
  141. var res = await _serviceTDengine.GernalRestSql(sql);
  142. #endregion
  143. return Ok(res);
  144. }
  145. }
  146. }