Browse Source

调整增量值算法

datasub12_previous
H Vs 1 year ago
parent
commit
863d003927
4 changed files with 116 additions and 14 deletions
  1. +20
    -2
      HealthMonitor.Service/Biz/db/TDengineService.cs
  2. +24
    -3
      HealthMonitor.Service/Resolver/BloodpressResolver.cs
  3. +38
    -5
      HealthMonitor.WebApi/Controllers/HealthMonitor/HmBloodPressConfigManualCalibrationController.cs
  4. +34
    -4
      HealthMonitor.WebApi/Worker.cs

+ 20
- 2
HealthMonitor.Service/Biz/db/TDengineService.cs View File

@@ -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}";


+ 24
- 3
HealthMonitor.Service/Resolver/BloodpressResolver.cs View File

@@ -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}'");


+ 38
- 5
HealthMonitor.WebApi/Controllers/HealthMonitor/HmBloodPressConfigManualCalibrationController.cs View File

@@ -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


+ 34
- 4
HealthMonitor.WebApi/Worker.cs View File

@@ -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


Loading…
Cancel
Save