@@ -1,6 +1,8 @@ | |||||
using HealthMonitor.Common.helper; | |||||
using HealthMonitor.Common; | |||||
using HealthMonitor.Common.helper; | |||||
using HealthMonitor.Model.Config; | using HealthMonitor.Model.Config; | ||||
using HealthMonitor.Service.Biz.db.Dto; | using HealthMonitor.Service.Biz.db.Dto; | ||||
using Microsoft.EntityFrameworkCore.Metadata.Internal; | |||||
using Microsoft.Extensions.Logging; | using Microsoft.Extensions.Logging; | ||||
using Microsoft.Extensions.Options; | using Microsoft.Extensions.Options; | ||||
using Newtonsoft.Json; | using Newtonsoft.Json; | ||||
@@ -129,8 +131,29 @@ namespace HealthMonitor.Service.Biz.db | |||||
} | } | ||||
} | } | ||||
public void ExecuteInsertSQL(IntPtr conn, string sql) | |||||
//public void ExecuteInsertSQL(IntPtr conn, string sql) | |||||
//{ | |||||
// try | |||||
// { | |||||
// //sql = "INSERT INTO d1001 USING meters TAGS('California.SanFrancisco', 2) VALUES ('2018-10-03 14:38:05.000', 10.30000, 219, 0.31000) ('2018-10-03 14:38:15.000', 12.60000, 218, 0.33000) ('2018-10-03 14:38:16.800', 12.30000, 221, 0.31000) " + | |||||
// // "d1002 USING power.meters TAGS('California.SanFrancisco', 3) VALUES('2018-10-03 14:38:16.650', 10.30000, 218, 0.25000) " + | |||||
// // "d1003 USING power.meters TAGS('California.LosAngeles', 2) VALUES('2018-10-03 14:38:05.500', 11.80000, 221, 0.28000)('2018-10-03 14:38:16.600', 13.40000, 223, 0.29000) " + | |||||
// // "d1004 USING power.meters TAGS('California.LosAngeles', 3) VALUES('2018-10-03 14:38:05.000', 10.80000, 223, 0.29000)('2018-10-03 14:38:06.500', 11.50000, 221, 0.35000)"; | |||||
// IntPtr res = TDengine.Query(conn, sql); | |||||
// CheckRes(conn, res, "failed to insert data"); | |||||
// int affectedRows = TDengine.AffectRows(res); | |||||
// Console.WriteLine("affectedRows " + affectedRows); | |||||
// TDengine.FreeResult(res); | |||||
// } | |||||
// finally | |||||
// { | |||||
// TDengine.Close(conn); | |||||
// } | |||||
//} | |||||
public void ExecuteInsertSQL(string sql) | |||||
{ | { | ||||
var conn = Connection(); | |||||
try | try | ||||
{ | { | ||||
//sql = "INSERT INTO d1001 USING meters TAGS('California.SanFrancisco', 2) VALUES ('2018-10-03 14:38:05.000', 10.30000, 219, 0.31000) ('2018-10-03 14:38:15.000', 12.60000, 218, 0.33000) ('2018-10-03 14:38:16.800', 12.30000, 221, 0.31000) " + | //sql = "INSERT INTO d1001 USING meters TAGS('California.SanFrancisco', 2) VALUES ('2018-10-03 14:38:05.000', 10.30000, 219, 0.31000) ('2018-10-03 14:38:15.000', 12.60000, 218, 0.33000) ('2018-10-03 14:38:16.800', 12.30000, 221, 0.31000) " + | ||||
@@ -149,6 +172,179 @@ namespace HealthMonitor.Service.Biz.db | |||||
} | } | ||||
} | } | ||||
#region TDengine.Connector async query | |||||
public void QueryCallback(IntPtr param, IntPtr taosRes, int code) | |||||
{ | |||||
if (code == 0 && taosRes != IntPtr.Zero) | |||||
{ | |||||
FetchRawBlockAsyncCallback fetchRowAsyncCallback = new FetchRawBlockAsyncCallback(FetchRawBlockCallback); | |||||
TDengine.FetchRawBlockAsync(taosRes, fetchRowAsyncCallback, param); | |||||
} | |||||
else | |||||
{ | |||||
Console.WriteLine($"async query data failed, failed code {code}"); | |||||
} | |||||
} | |||||
// Iteratively call this interface until "numOfRows" is no greater than 0. | |||||
public void FetchRawBlockCallback(IntPtr param, IntPtr taosRes, int numOfRows) | |||||
{ | |||||
if (numOfRows > 0) | |||||
{ | |||||
Console.WriteLine($"{numOfRows} rows async retrieved"); | |||||
IntPtr pdata = TDengine.GetRawBlock(taosRes); | |||||
List<TDengineMeta> metaList = TDengine.FetchFields(taosRes); | |||||
List<object> dataList = LibTaos.ReadRawBlock(pdata, metaList, numOfRows); | |||||
for (int i = 0; i < metaList.Count; i++) | |||||
{ | |||||
Console.Write("{0} {1}({2}) \t|", metaList[i].name, metaList[i].type, metaList[i].size); | |||||
} | |||||
Console.WriteLine(); | |||||
for (int i = 0; i < dataList.Count; i++) | |||||
{ | |||||
if (i != 0 && i % metaList.Count == 0) | |||||
{ | |||||
Console.WriteLine("{0}\t|", dataList[i]); | |||||
} | |||||
Console.Write("{0}\t|", dataList[i]); | |||||
} | |||||
TDengine.FetchRawBlockAsync(taosRes, FetchRawBlockCallback, param); | |||||
} | |||||
else | |||||
{ | |||||
if (numOfRows == 0) | |||||
{ | |||||
Console.WriteLine("async retrieve complete."); | |||||
} | |||||
else | |||||
{ | |||||
Console.WriteLine($"FetchRawBlockCallback callback error, error code {numOfRows}"); | |||||
} | |||||
TDengine.FreeResult(taosRes); | |||||
} | |||||
} | |||||
public void ExecuteQueryAsync(string sql) | |||||
{ | |||||
var conn = Connection(); | |||||
QueryAsyncCallback queryAsyncCallback = new QueryAsyncCallback(QueryCallback); | |||||
TDengine.QueryAsync(conn, sql, queryAsyncCallback, IntPtr.Zero); | |||||
} | |||||
//public void ExecuteQuery(string sql) | |||||
//{ | |||||
// var conn = Connection(); | |||||
// QueryAsyncCallback queryAsyncCallback = new QueryAsyncCallback(QueryCallback); | |||||
// TDengine.QueryAsync(conn, sql, queryAsyncCallback, IntPtr.Zero); | |||||
//} | |||||
public Aggregate GetAggregateValue(string field, string tbName, string? condition) | |||||
{ | |||||
List<int> data = new(); | |||||
var sql = $"SELECT MAX({field}), MIN({field}) FROM {_configTDengineService.DB}.{tbName} WHERE {condition}"; | |||||
var conn = Connection(); | |||||
try | |||||
{ | |||||
IntPtr res = TDengine.Query(conn, sql); | |||||
// Check if query success | |||||
if ((res == IntPtr.Zero) || (TDengine.ErrorNo(res) != 0)) | |||||
{ | |||||
Console.Write(sql + " failure, "); | |||||
// Get error message while Res is a not null pointer. | |||||
if (res != IntPtr.Zero) | |||||
{ | |||||
Console.Write("reason:" + TDengine.Error(res)); | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
Console.Write(sql + " success, {0} rows affected", TDengine.AffectRows(res)); | |||||
//... do something with res ... | |||||
List<TDengineMeta> resMeta = LibTaos.GetMeta(res); | |||||
List<object> resData = LibTaos.GetData(res); | |||||
foreach (var meta in resMeta) | |||||
{ | |||||
Console.Write($"\t|{meta.name} {meta.TypeName()} ({meta.size})\t|"); | |||||
} | |||||
resData.ForEach(x => data.Add(SafeType.SafeInt(x))); | |||||
// Important: need to free result to avoid memory leak. | |||||
TDengine.FreeResult(res); | |||||
} | |||||
} | |||||
finally | |||||
{ | |||||
TDengine.Close(conn); | |||||
} | |||||
return new Aggregate | |||||
{ | |||||
Max = data.Count.Equals(0) ? 0 : data[0], | |||||
Min = data.Count.Equals(0) ? 0 : data[1], | |||||
}; | |||||
} | |||||
public int GetAvgExceptMaxMinValue(string field, string tbName, string? condition) | |||||
{ | |||||
List<int> data = new(); | |||||
var sql = $"SELECT MAX({field}), MIN({field}) FROM {_configTDengineService.DB}.{tbName} WHERE {condition}"; | |||||
var aggregate= GetAggregateValue(field, tbName, condition); | |||||
var sqlAvg = $"SELECT AVG({field}) FROM {_configTDengineService.DB}.{tbName} WHERE {condition} AND {field} < {aggregate.Max} and {field} > {aggregate.Min}"; | |||||
var conn = Connection(); | |||||
try | |||||
{ | |||||
IntPtr res = TDengine.Query(conn, sqlAvg); | |||||
// Check if query success | |||||
if ((res == IntPtr.Zero) || (TDengine.ErrorNo(res) != 0)) | |||||
{ | |||||
Console.Write(sqlAvg + " failure, "); | |||||
// Get error message while Res is a not null pointer. | |||||
if (res != IntPtr.Zero) | |||||
{ | |||||
Console.Write("reason:" + TDengine.Error(res)); | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
Console.Write(sqlAvg + " success, {0} rows affected", TDengine.AffectRows(res)); | |||||
//... do something with res ... | |||||
List<TDengineMeta> resMeta = LibTaos.GetMeta(res); | |||||
List<object> resData = LibTaos.GetData(res); | |||||
foreach (var meta in resMeta) | |||||
{ | |||||
Console.Write($"\t|{meta.name} {meta.TypeName()} ({meta.size})\t|"); | |||||
} | |||||
resData.ForEach(x => data.Add(SafeType.SafeInt(x))); | |||||
// Important: need to free result to avoid memory leak. | |||||
TDengine.FreeResult(res); | |||||
} | |||||
} | |||||
finally | |||||
{ | |||||
TDengine.Close(conn); | |||||
} | |||||
return data.Count.Equals(0) ? 0 : data[0]; | |||||
} | |||||
#endregion | |||||
#region RestAPI | |||||
public async Task<bool> GernalRestSql(string sql) | public async Task<bool> GernalRestSql(string sql) | ||||
{ | { | ||||
@@ -181,7 +377,7 @@ namespace HealthMonitor.Service.Biz.db | |||||
//return res.Code==0; | //return res.Code==0; | ||||
} | } | ||||
public async Task<string?> GernalRestSqlResText(string sql) | |||||
public async Task<string?> GernalRestSqlResTextAsync(string sql) | |||||
{ | { | ||||
var url = $"http://{_configTDengineService.Host}:{_configTDengineService.RestPort}/rest/sql/{_configTDengineService.DB}"; | var url = $"http://{_configTDengineService.Host}:{_configTDengineService.RestPort}/rest/sql/{_configTDengineService.DB}"; | ||||
List<KeyValuePair<string, string>> headers = new() | List<KeyValuePair<string, string>> headers = new() | ||||
@@ -192,12 +388,12 @@ namespace HealthMonitor.Service.Biz.db | |||||
return result; | return result; | ||||
} | } | ||||
public async Task<Aggregate> GetAggregateValue(string field,string tbName,string? condition) | |||||
public async Task<Aggregate> GetAggregateValueAsync(string field,string tbName,string? condition) | |||||
{ | { | ||||
var sql = $"SELECT MAX({field}), MIN({field}) FROM {_configTDengineService.DB}.{tbName} WHERE {condition}"; | var sql = $"SELECT MAX({field}), MIN({field}) FROM {_configTDengineService.DB}.{tbName} WHERE {condition}"; | ||||
var result = await GernalRestSqlResText(sql); | |||||
var result = await GernalRestSqlResTextAsync(sql); | |||||
var res = JsonConvert.DeserializeObject<Aggregate>(result!); | var res = JsonConvert.DeserializeObject<Aggregate>(result!); | ||||
List<dynamic> data = res?.Data!; | List<dynamic> data = res?.Data!; | ||||
@@ -208,24 +404,24 @@ namespace HealthMonitor.Service.Biz.db | |||||
}; | }; | ||||
} | } | ||||
public async Task<int> GetAvgExceptMaxMinValue(string field, string tbName, string? condition) | |||||
public async Task<int> GetAvgExceptMaxMinValueAsync(string field, string tbName, string? condition) | |||||
{ | { | ||||
var sql = $"SELECT MAX({field}), MIN({field}) FROM {_configTDengineService.DB}.{tbName} WHERE {condition}"; | var sql = $"SELECT MAX({field}), MIN({field}) FROM {_configTDengineService.DB}.{tbName} WHERE {condition}"; | ||||
var result = await GernalRestSqlResText(sql); | |||||
var result = await GernalRestSqlResTextAsync(sql); | |||||
var res = JsonConvert.DeserializeObject<TDengineRestResBase>(result!); | var res = JsonConvert.DeserializeObject<TDengineRestResBase>(result!); | ||||
List<dynamic> data = res?.Data!; | List<dynamic> data = res?.Data!; | ||||
var sqlAvg = $"SELECT AVG({field}) FROM {_configTDengineService.DB}.{tbName} WHERE {condition} AND {field} < { (data.Count.Equals(0)? 0: data[0][0]) } and {field} > {(data.Count.Equals(0) ? 0 : data[0][1])}"; | var sqlAvg = $"SELECT AVG({field}) FROM {_configTDengineService.DB}.{tbName} WHERE {condition} AND {field} < { (data.Count.Equals(0)? 0: data[0][0]) } and {field} > {(data.Count.Equals(0) ? 0 : data[0][1])}"; | ||||
result = await GernalRestSqlResText(sqlAvg); | |||||
result = await GernalRestSqlResTextAsync(sqlAvg); | |||||
res = JsonConvert.DeserializeObject<TDengineRestResBase>(result!); | res = JsonConvert.DeserializeObject<TDengineRestResBase>(result!); | ||||
data = res?.Data!; | data = res?.Data!; | ||||
return data.Count.Equals(0)?0:(int)data[0][0]; | return data.Count.Equals(0)?0:(int)data[0][0]; | ||||
} | } | ||||
#endregion | |||||
} | } | ||||
} | } |
@@ -108,9 +108,11 @@ namespace HealthMonitor.Service.Resolver | |||||
DateTime endTime = now; | DateTime endTime = now; | ||||
// | // | ||||
var systolicAggregate = await _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 = await _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}'"); | |||||
var systolicAggregate = await _serviceTDengine.GetAggregateValueAsync("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 = await _serviceTDengine.GetAggregateValueAsync("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}'"); | |||||
//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}'"); | |||||
// 最大值 | // 最大值 | ||||
var systolicMax = systolicAggregate.Max; | var systolicMax = systolicAggregate.Max; | ||||
var diastolicMax = diastolicAggregate.Max; | var diastolicMax = diastolicAggregate.Max; | ||||
@@ -120,8 +122,13 @@ namespace HealthMonitor.Service.Resolver | |||||
// 计算去除最大值和最小值和异常值的平均值 | // 计算去除最大值和最小值和异常值的平均值 | ||||
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} "); | |||||
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 diastolic_value < {diastolicRefValue}"); | |||||
var systolicAvg = await _serviceTDengine.GetAvgExceptMaxMinValueAsync("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} "); | |||||
var diastolicAvg = await _serviceTDengine.GetAvgExceptMaxMinValueAsync("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 diastolic_value < {diastolicRefValue}"); | |||||
//var systolicAvg = _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} "); | |||||
//var diastolicAvg = _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 diastolic_value < {diastolicRefValue}"); | |||||
// 偏移参数 | // 偏移参数 | ||||
var avgOffset = 0.25M; | var avgOffset = 0.25M; | ||||
@@ -165,7 +172,8 @@ namespace HealthMonitor.Service.Resolver | |||||
$"'{startTime:yyyy-MM-ddTHH:mm:ss.fffZ}'," + | $"'{startTime:yyyy-MM-ddTHH:mm:ss.fffZ}'," + | ||||
$"'{endTime:yyyy-MM-ddTHH:mm:ss.fffZ}'," + | $"'{endTime:yyyy-MM-ddTHH:mm:ss.fffZ}'," + | ||||
$"'{string.Empty}')"; | $"'{string.Empty}')"; | ||||
var res = await _serviceTDengine.GernalRestSql(sql); | |||||
//var res = await _serviceTDengine.GernalRestSql(sql); | |||||
_serviceTDengine.ExecuteInsertSQL(sql); | |||||
#endregion | #endregion | ||||
} | } | ||||
@@ -1,11 +1,13 @@ | |||||
using HealthMonitor.Common; | using HealthMonitor.Common; | ||||
using HealthMonitor.Core.Dal; | using HealthMonitor.Core.Dal; | ||||
using HealthMonitor.Model.Config; | |||||
using HealthMonitor.Service.Biz.db; | using HealthMonitor.Service.Biz.db; | ||||
using HealthMonitor.Service.Cache; | using HealthMonitor.Service.Cache; | ||||
using HealthMonitor.Service.Resolver.Factory; | using HealthMonitor.Service.Resolver.Factory; | ||||
using HealthMonitor.Service.Resolver.Interface; | using HealthMonitor.Service.Resolver.Interface; | ||||
using HealthMonitor.Service.Sub.Topic.Model; | using HealthMonitor.Service.Sub.Topic.Model; | ||||
using Microsoft.Extensions.Logging; | using Microsoft.Extensions.Logging; | ||||
using Microsoft.Extensions.Options; | |||||
using Newtonsoft.Json; | using Newtonsoft.Json; | ||||
using System; | using System; | ||||
using System.Collections.Concurrent; | using System.Collections.Concurrent; | ||||
@@ -26,6 +28,7 @@ namespace HealthMonitor.Service.Sub | |||||
private readonly MsgQueueManager _msgQueueManager; | private readonly MsgQueueManager _msgQueueManager; | ||||
private readonly TDengineService _serviceTDengine; | private readonly TDengineService _serviceTDengine; | ||||
private readonly PersonCacheManager _personCacheMgr; | private readonly PersonCacheManager _personCacheMgr; | ||||
private readonly TDengineServiceConfig _configTDengineService; | |||||
private readonly BloodPressReferenceValueCacheManager _bpRefValCacheManager; | private readonly BloodPressReferenceValueCacheManager _bpRefValCacheManager; | ||||
private readonly IResolverFactory _resolverFactory; | private readonly IResolverFactory _resolverFactory; | ||||
private CancellationTokenSource? _tokenSource = null; | private CancellationTokenSource? _tokenSource = null; | ||||
@@ -38,7 +41,7 @@ namespace HealthMonitor.Service.Sub | |||||
PersonCacheManager personCacheMgr, | PersonCacheManager personCacheMgr, | ||||
BloodPressReferenceValueCacheManager bpRefValCacheManager, | BloodPressReferenceValueCacheManager bpRefValCacheManager, | ||||
IResolverFactory resolverFactory, | IResolverFactory resolverFactory, | ||||
IOptions<TDengineServiceConfig> configTDengineService, | |||||
MsgQueueManager msgQueueManager, | MsgQueueManager msgQueueManager, | ||||
ILogger<TDengineDataSubcribe> logger | ILogger<TDengineDataSubcribe> logger | ||||
) | ) | ||||
@@ -49,7 +52,8 @@ namespace HealthMonitor.Service.Sub | |||||
_logger = logger; | _logger = logger; | ||||
_resolverFactory = resolverFactory; | _resolverFactory = resolverFactory; | ||||
_msgQueueManager = msgQueueManager; | _msgQueueManager = msgQueueManager; | ||||
_configTDengineService = configTDengineService.Value; | |||||
} | } | ||||
public void BeginListen(CancellationToken stoppingToken) | public void BeginListen(CancellationToken stoppingToken) | ||||
{ | { | ||||
@@ -75,11 +79,11 @@ namespace HealthMonitor.Service.Sub | |||||
public void DoTDengineConnect() | public void DoTDengineConnect() | ||||
{ | { | ||||
string host = "47.116.142.20"; | |||||
string host = _configTDengineService.Host; | |||||
short port = 6030; | short port = 6030; | ||||
string username = "root"; | |||||
string password = "taosdata"; | |||||
string dbname = "health_monitor"; | |||||
string username = _configTDengineService.UserName; | |||||
string password = _configTDengineService.Password; | |||||
string dbname = _configTDengineService.DB; | |||||
var conn = TDengine.Connect(host, username, password, dbname, port); | var conn = TDengine.Connect(host, username, password, dbname, port); | ||||
if (conn == IntPtr.Zero) | if (conn == IntPtr.Zero) | ||||
{ | { | ||||
@@ -97,10 +101,10 @@ namespace HealthMonitor.Service.Sub | |||||
var cfg = new ConsumerConfig | var cfg = new ConsumerConfig | ||||
{ | { | ||||
GourpId = "group_1", | GourpId = "group_1", | ||||
TDConnectUser = "root", | |||||
TDConnectPasswd = "taosdata", | |||||
TDConnectUser = _configTDengineService.UserName, | |||||
TDConnectPasswd = _configTDengineService.Password, | |||||
MsgWithTableName = "true", | MsgWithTableName = "true", | ||||
TDConnectIp = "47.116.142.20", | |||||
TDConnectIp = _configTDengineService.Host, | |||||
}; | }; | ||||
// string topic = "topic_hm_bp_stats"; | // string topic = "topic_hm_bp_stats"; | ||||
string topic = nameof(TopicHmBloodPress).ToLower(); | string topic = nameof(TopicHmBloodPress).ToLower(); | ||||
@@ -86,7 +86,7 @@ namespace HealthMonitor.WebApi.Controllers.HealthMonitor | |||||
// 861281060086380 | // 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}"); | |||||
//var aggregate = await _serviceTDengine.GetAvgExceptMaxMinValueAsync("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}"); | |||||
//+++++++++++++++++++++++++++++++ | //+++++++++++++++++++++++++++++++ | ||||
@@ -138,8 +138,8 @@ namespace HealthMonitor.WebApi.Controllers.HealthMonitor | |||||
DateTime endTime = now; | DateTime endTime = now; | ||||
// | // | ||||
var systolicAggregate = await _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 = await _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}'"); | |||||
var systolicAggregate = await _serviceTDengine.GetAggregateValueAsync("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 = await _serviceTDengine.GetAggregateValueAsync("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}'"); | |||||
// 最大值 | // 最大值 | ||||
var systolicMax = systolicAggregate.Max; | var systolicMax = systolicAggregate.Max; | ||||
@@ -150,8 +150,8 @@ namespace HealthMonitor.WebApi.Controllers.HealthMonitor | |||||
// 计算去除最大值和最小值和异常值的平均值 | // 计算去除最大值和最小值和异常值的平均值 | ||||
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 systolicAvg = await _serviceTDengine.GetAvgExceptMaxMinValueAsync("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.GetAvgExceptMaxMinValueAsync("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; | var avgOffset = 0.25M; | ||||
@@ -0,0 +1,46 @@ | |||||
# final stage/image | |||||
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base | |||||
WORKDIR /app | |||||
EXPOSE 6899 | |||||
RUN sed -i s@/deb.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list | |||||
RUN sed -i s@/security.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list | |||||
RUN apt-get update --fix-missing\ | |||||
&& DEBIAN_FRONTEND=noninteractive apt-get install -y net-tools vim \ | |||||
&& apt-get clean \ | |||||
&& rm -rf /var/lib/apt/lists/* | |||||
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build | |||||
WORKDIR /src | |||||
COPY ["nuget.config","."] | |||||
COPY ["HealthMonitor.Common/HealthMonitor.Common.csproj", "HealthMonitor.Common/"] | |||||
COPY ["HealthMonitor.Core/HealthMonitor.Core.csproj", "HealthMonitor.Core/"] | |||||
COPY ["HealthMonitor.Model/HealthMonitor.Model.csproj", "HealthMonitor.Model/"] | |||||
COPY ["HealthMonitor.Service/HealthMonitor.Service.csproj", "HealthMonitor.Service/"] | |||||
COPY ["HealthMonitor.Util/HealthMonitor.Util.csproj", "HealthMonitor.Util/"] | |||||
COPY ["HealthMonitor.WebApi/HealthMonitor.WebApi.csproj", "HealthMonitor.WebApi/"] | |||||
RUN dotnet nuget remove source nuget.org | |||||
#RUN dotnet nuget add source https://mirrors.cloud.tencent.com/nuget/ -n tencent_nuget | |||||
RUN dotnet nuget add source https://repo.huaweicloud.com/repository/nuget/v3/index.json -n huaweicloud_nuget | |||||
RUN dotnet restore "HealthMonitor.WebApi/HealthMonitor.WebApi.csproj" | |||||
COPY . . | |||||
WORKDIR "/src/HealthMonitor.WebApi" | |||||
RUN dotnet build "HealthMonitor.WebApi.csproj" -c Release -o /app/build | |||||
FROM build AS publish | |||||
RUN dotnet publish "HealthMonitor.WebApi.csproj" -c Release -o /app/publish | |||||
FROM base AS final | |||||
WORKDIR /app | |||||
COPY --from=publish /app/publish . | |||||
#ENV environment=Development | |||||
ENV urls=http://*:6899 | |||||
ENV TimeZone=Asia/Shanghai | |||||
ENV LANG C.UTF-8 | |||||
RUN ln -snf /usr/share/zoneinfo/$TimeZone /etc/localtime && echo $TimeZone > /etc/timezone | |||||
#ENTRYPOINT dotnet HealthMonitor.WebApi.dll --environment=$environment | |||||
ENTRYPOINT ["dotnet", "HealthMonitor.WebAapi.dll"] | |||||
CMD ["--environment=Development"] |
@@ -0,0 +1,43 @@ | |||||
{ | |||||
"Logging": { | |||||
"LogLevel": { | |||||
"Default": "Information", | |||||
"Microsoft.AspNetCore": "Warning" | |||||
} | |||||
}, | |||||
"TDengineServiceConfig": { | |||||
"Host": "172.19.42.44", // 测试环境内网 | |||||
//"Host": "47.116.142.20", // 测试环境公网 | |||||
"UserName": "root", | |||||
"Password": "taosdata", | |||||
"Token": "cm9vdDp0YW9zZGF0YQ==", | |||||
"Port": 6030, | |||||
"RestPort": 6041, | |||||
"DB": "health_monitor" | |||||
}, | |||||
"Redis": { | |||||
"Server": "172.19.42.44:8090", // 测试环境内网 | |||||
//"Server": "47.116.142.20:8090", // 测试环境公网 | |||||
"Password": "telpo#1234", | |||||
//"Server": "127.0.0.1:6379", | |||||
"DefaultDatabase": 2, | |||||
"Prefix": "_HM_", | |||||
//"DefaultDatabase": 7, | |||||
// "Prefix": "TELPO", | |||||
"Poolsize": 50, | |||||
"ConnectTimeout": 5000, | |||||
"IdleTimeout": 20000 | |||||
}, | |||||
"ServiceConfig": { | |||||
"TelpoDataUrl": "https://id.ssjlai.com/data/" | |||||
}, | |||||
"ConnectionStrings": { | |||||
// 测试环境内网 | |||||
"GpsCard_Connection_String": "server=172.19.42.40;port=3305;database=gps_card;uid=root;pwd=telpo#1234;CharSet=utf8;MinimumPoolSize=10;MaximumPoolSize=1000;SslMode=none", | |||||
"HealthMonitor_Connection_String": "server=172.19.42.40;port=3305;database=health_monitor;uid=root;pwd=telpo#1234;CharSet=utf8;MinimumPoolSize=10;MaximumPoolSize=1000;SslMode=none", | |||||
// 测试环境公网 | |||||
//"GpsCard_Connection_String": "server=139.224.254.18;port=3305;database=gps_card;uid=root;pwd=telpo#1234;CharSet=utf8;MinimumPoolSize=10;MaximumPoolSize=1000;SslMode=none", | |||||
// "HealthMonitor_Connection_String": "server=139.224.254.18;port=3305;database=health_monitor;uid=root;pwd=telpo#1234;CharSet=utf8;MinimumPoolSize=10;MaximumPoolSize=1000;SslMode=none" | |||||
} | |||||
} |
@@ -0,0 +1,7 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<configuration> | |||||
<packageSources> | |||||
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" /> | |||||
<add key="company" value="http://139.224.254.18:3344" /> | |||||
</packageSources> | |||||
</configuration> |