@@ -371,7 +371,13 @@ namespace HealthMonitor.Service.Biz.db | |||
var result = await _httpHelper.HttpToPostAsync(url, sql, headers).ConfigureAwait(false); | |||
return result; | |||
} | |||
/// <summary> | |||
/// 最大值,最小值聚合 | |||
/// </summary> | |||
/// <param name="field"></param> | |||
/// <param name="tbName"></param> | |||
/// <param name="condition"></param> | |||
/// <returns></returns> | |||
public async Task<Aggregate> GetAggregateValueAsync(string field,string tbName,string? condition) | |||
{ | |||
var sql = $"SELECT MAX({field}), MIN({field}) FROM {_configTDengineService.DB}.{tbName} WHERE {condition}"; | |||
@@ -387,7 +393,13 @@ namespace HealthMonitor.Service.Biz.db | |||
Min = data.Count.Equals(0) ? 0 : data[0][1], | |||
}; | |||
} | |||
/// <summary> | |||
/// 去除最大值和最小值后的平均值 | |||
/// </summary> | |||
/// <param name="field"></param> | |||
/// <param name="tbName"></param> | |||
/// <param name="condition"></param> | |||
/// <returns></returns> | |||
public async Task<int> GetAvgExceptMaxMinValueAsync(string field, string tbName, string? condition) | |||
{ | |||
@@ -405,6 +417,12 @@ namespace HealthMonitor.Service.Biz.db | |||
return data.Count.Equals(0)?0:(int)data[0][0]; | |||
} | |||
/// <summary> | |||
/// 获取最后的记录 | |||
/// </summary> | |||
/// <param name="tbName"></param> | |||
/// <param name="condition"></param> | |||
/// <returns></returns> | |||
public async Task<JArray?> GetLastAsync(string tbName, string? condition) | |||
{ | |||
var sql = $"SELECT last_row(*) FROM {_configTDengineService.DB}.{tbName} WHERE {condition}"; | |||
@@ -7,6 +7,7 @@ using HealthMonitor.Service.Etcd; | |||
using HealthMonitor.Service.Resolver.Interface; | |||
using HealthMonitor.Service.Sub; | |||
using HealthMonitor.Service.Sub.Topic.Model; | |||
using Microsoft.EntityFrameworkCore.Metadata; | |||
using Microsoft.Extensions.Logging; | |||
using Newtonsoft.Json; | |||
using System; | |||
@@ -103,11 +104,29 @@ namespace HealthMonitor.Service.Resolver | |||
var weight = SafeType.SafeDouble(person?.Person.Weight!); | |||
#region 计算增量值 | |||
var bpRef = await _bpRefValCacheManager.GetBloodPressReferenceValueAsync(age, gender, isHypertension); | |||
var last = await _serviceTDengine.GetLastAsync("stb_hm_bp_push_ref_inc_value", $"serialno='{bp.Serialno}' order by ts desc"); | |||
//var ts = last?[0]; | |||
var systolicRefValue = bpRef?.Systolic;//? | |||
var diastolicRefValue = bpRef?.Diastolic;//? | |||
int duration = 7; | |||
long duration = 7 * 24 * 3600 * 1000; | |||
// 曾经有下发记录 | |||
if (last?.Count!=0) | |||
{ | |||
if (DateTime.TryParse(last?[0]!.ToString(), out DateTime newTs)) | |||
{ | |||
systolicRefValue = (int)last?[2]!; | |||
diastolicRefValue = (int)last?[3]!; | |||
duration = SafeType.SafeInt64(((DateTime)bp.LastUpdate! - newTs).TotalMilliseconds); | |||
} | |||
} | |||
TimeSpan ts= TimeSpan.FromMilliseconds(duration); | |||
// 获取历史数据 | |||
////DateTime now = DateTime.Now; | |||
//DateTime now = (DateTime)bp.LastUpdate!; //测试 | |||
@@ -115,8 +134,10 @@ namespace HealthMonitor.Service.Resolver | |||
//DateTime endTime = now; | |||
DateTime endTime = (DateTime)bp.LastUpdate!; //测试 | |||
DateTime startTime = endTime.AddDays(-duration); | |||
DateTime startTime = endTime-ts; | |||
// 如果hm_bp_config_manual_calibration存在数据,使用最新数据 | |||
// | |||
var systolicAggregate = await _serviceTDengine.GetAggregateValueAsync("systolic_value", "stb_hm_bloodpress", $"ts>='{startTime:yyyy-MM-ddTHH:mm:ss.fffZ}' and ts <='{endTime:yyyy-MM-ddTHH:mm:ss.fffZ}' and serialno='{bp.Serialno}'"); | |||
@@ -1,5 +1,6 @@ | |||
using Google.Protobuf.WellKnownTypes; | |||
using Grpc.Core; | |||
using HealthMonitor.Common; | |||
using HealthMonitor.Common.helper; | |||
using HealthMonitor.Core.Dal; | |||
using HealthMonitor.Service.Biz.db; | |||
@@ -45,19 +46,36 @@ namespace HealthMonitor.WebApi.Controllers.HealthMonitor | |||
[HttpPost] | |||
public async Task<IActionResult> Put([FromBody] BloodPressManualCalibration model, [FromHeader] string requestId) | |||
{ | |||
// 保存新的标定值 | |||
// 使用新的标定值计算新的增量值 | |||
var imei = model.Imei; | |||
// 计算增量值 | |||
var systolicRefValue = model.ManualSystolicRefValue;//? | |||
var diastolicRefValue = model.ManualDiastolicRefValue;//? | |||
int duration = 7; | |||
//int duration = 7; | |||
long duration = 7 * 24 * 3600 * 1000; | |||
TimeSpan ts = TimeSpan.FromMilliseconds(duration); | |||
DateTime endTime = DateTime.Now; //测试 | |||
DateTime startTime = endTime.AddDays(-duration); | |||
DateTime startTime = endTime - ts; | |||
var last = await _serviceTDengine.GetLastAsync("stb_hm_bp_push_ref_inc_value", $"serialno='{imei}' order by ts desc"); | |||
if (last?.Count != 0) | |||
{ | |||
if (DateTime.TryParse(last?[0]!.ToString(), out DateTime newTs)) | |||
{ | |||
startTime = newTs; | |||
} | |||
} | |||
// | |||
var systolicAggregate = await _serviceTDengine.GetAggregateValueAsync("systolic_value", "stb_hm_bloodpress", $"ts>='{startTime:yyyy-MM-ddTHH:mm:ss.fffZ}' and ts <='{endTime:yyyy-MM-ddTHH:mm:ss.fffZ}' and serialno='{imei}'"); | |||
var diastolicAggregate = await _serviceTDengine.GetAggregateValueAsync("diastolic_value", "stb_hm_bloodpress", $"ts>='{startTime:yyyy-MM-ddTHH:mm:ss.fffZ}' and ts <='{endTime:yyyy-MM-ddTHH:mm:ss.fffZ}' and serialno='{imei}'"); | |||
//var systolicAggregate = await _serviceTDengine.GetAggregateValueAsync("systolic_value", "stb_hm_bloodpress", $"ts>='{startTime:yyyy-MM-ddTHH:mm:ss.fffZ}' and ts <='{endTime:yyyy-MM-ddTHH:mm:ss.fffZ}' and serialno='{imei}'"); | |||
//var diastolicAggregate = await _serviceTDengine.GetAggregateValueAsync("diastolic_value", "stb_hm_bloodpress", $"ts>='{startTime:yyyy-MM-ddTHH:mm:ss.fffZ}' and ts <='{endTime:yyyy-MM-ddTHH:mm:ss.fffZ}' and serialno='{imei}'"); | |||
//var systolicAggregate = _serviceTDengine.GetAggregateValue("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}'"); | |||
//var diastolicAggregate = _serviceTDengine.GetAggregateValue("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}'"); | |||
@@ -88,6 +106,21 @@ namespace HealthMonitor.WebApi.Controllers.HealthMonitor | |||
var systolicInc = systolicAvg.Equals(0M) ? 0 : (int)((systolicRefValue - systolicAvg) * systolicAvgOffset)!; | |||
var diastolicInc = diastolicAvg.Equals(0M) ? 0 : (int)((diastolicRefValue - diastolicAvg) * diastolicAvgOffset)!; | |||
#region 保存下推记录 stb_hm_bp_push_ref_inc_value | |||
var sql = $"INSERT INTO health_monitor.hm_bp_push_ref_inc_value_{imei.Substring(imei.Length - 2)} " + | |||
$"USING health_monitor.stb_hm_bp_push_ref_inc_value " + | |||
$"TAGS ('{imei.Substring(imei.Length - 2)}') " + | |||
$"VALUES(" + | |||
$"'{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}'," + | |||
$"'{imei}'," + | |||
$"{systolicRefValue}," + | |||
$"{diastolicRefValue}," + | |||
$"{systolicInc}," + | |||
$"{diastolicInc}," + | |||
$"{true})"; | |||
_serviceTDengine.ExecuteInsertSQL(sql); | |||
#endregion | |||
// 返回结果 | |||
var res = new | |||
@@ -1,14 +1,17 @@ | |||
using dotnet_etcd; | |||
using Etcdserverpb; | |||
using Google.Protobuf.WellKnownTypes; | |||
using HealthMonitor.Common; | |||
using HealthMonitor.Common.helper; | |||
using HealthMonitor.Core.Common.Extensions; | |||
using HealthMonitor.Service.Biz.db; | |||
using HealthMonitor.Service.Etcd; | |||
using HealthMonitor.Service.Sub; | |||
using Microsoft.AspNetCore.Mvc.RazorPages; | |||
using Microsoft.EntityFrameworkCore.Metadata.Internal; | |||
using Newtonsoft.Json; | |||
using Newtonsoft.Json.Linq; | |||
using System.Reflection; | |||
using System.Threading.Channels; | |||
using TDengineDriver; | |||
using TDengineTMQ; | |||
@@ -162,13 +165,23 @@ namespace HealthMonitor.WebApi | |||
if (newTs.AddDays(7) > DateTime.Now) | |||
{ | |||
Console.WriteLine(ts); | |||
var systolic_ref_value = last?[5]; | |||
var diastolic_ref_value = last?[12]; | |||
var systolic_inc_value = last?[10]; | |||
var diastolic_inc_value = last?[17]; | |||
var bpData = new | |||
{ | |||
imei = imeiDel, | |||
systolicCalibrationValue = last?[5], //收缩压标定值,值为0 表示不生效 | |||
diastolicCalibrationValue = last?[12], //舒张压标定值,值为0表示不生效 | |||
systolicIncValue = last?[10], //收缩压显示增量,值为0 表示不生效 | |||
diastolicIncValue = last?[17] //舒张压显示增量,值为0 表示不生效 | |||
//systolicCalibrationValue = last?[5], //收缩压标定值,值为0 表示不生效 | |||
//diastolicCalibrationValue = last?[12], //舒张压标定值,值为0表示不生效 | |||
//systolicIncValue = last?[10], //收缩压显示增量,值为0 表示不生效 | |||
//diastolicIncValue = last?[17] //舒张压显示增量,值为0 表示不生效 | |||
systolicCalibrationValue = systolic_ref_value, //收缩压标定值,值为0 表示不生效 | |||
diastolicCalibrationValue = diastolic_ref_value, //舒张压标定值,值为0表示不生效 | |||
systolicIncValue = systolic_inc_value, //收缩压显示增量,值为0 表示不生效 | |||
diastolicIncValue = diastolic_inc_value //舒张压显示增量,值为0 表示不生效 | |||
}; | |||
var str = JsonConvert.SerializeObject(bpData); | |||
var url = $"http://id.ssjlai.com/webapi/api/Command/SetBloodPressCalibrationConfig"; | |||
@@ -181,6 +194,23 @@ namespace HealthMonitor.WebApi | |||
var resJToken = JsonConvert.DeserializeObject(res!) as JToken; | |||
if (resJToken!["message"]!.ToString().Equals("ok")) | |||
{ | |||
#region 保存下推记录 stb_hm_bp_push_ref_inc_value | |||
var sql = $"INSERT INTO health_monitor.hm_bp_push_ref_inc_value_{imeiDel.Substring(imeiDel.Length - 2)} " + | |||
$"USING health_monitor.stb_hm_bp_push_ref_inc_value " + | |||
$"TAGS ('{imeiDel.Substring(imeiDel.Length - 2)}') " + | |||
$"VALUES(" + | |||
$"'{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}'," + | |||
$"'{imeiDel}'," + | |||
$"{systolic_ref_value}," + | |||
$"{diastolic_ref_value}," + | |||
$"{systolic_inc_value}," + | |||
$"{diastolic_inc_value}," + | |||
$"{false})"; | |||
_serviceTDengine.ExecuteInsertSQL(sql); | |||
#endregion | |||
// 注册下次下推 | |||
var endTime = DateTime.Now; | |||
#if DEBUG | |||