@@ -10,9 +10,9 @@ using System.Threading.Tasks; | |||||
namespace HealthMonitor.Core.Map.HealthMonitor | namespace HealthMonitor.Core.Map.HealthMonitor | ||||
{ | { | ||||
public partial class BloodPressReferenceValueMap : GenericEntityTypeConfiguration<BloodPressReferenceValue> | |||||
public partial class HmBloodPressReferenceValueMap : GenericEntityTypeConfiguration<HmBloodPressReferenceValue> | |||||
{ | { | ||||
public override void Configure(EntityTypeBuilder<BloodPressReferenceValue> entity) | |||||
public override void Configure(EntityTypeBuilder<HmBloodPressReferenceValue> entity) | |||||
{ | { | ||||
entity.HasKey(e => e.Id) | entity.HasKey(e => e.Id) | ||||
.HasName("PRIMARY"); | .HasName("PRIMARY"); |
@@ -0,0 +1,49 @@ | |||||
using Newtonsoft.Json; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace HealthMonitor.Model.Cache | |||||
{ | |||||
public class Person | |||||
{ | |||||
[JsonProperty("personId")] | |||||
public string PersonId { get; set; } = default!; | |||||
[JsonProperty("deviceId")] | |||||
public string DeviceId { get; set; } = default!; | |||||
[JsonProperty("serialno")] | |||||
public string SerialNo { get; set; } = default!; | |||||
[JsonProperty("remarks")] | |||||
public string Remarks { get; set; } = default!; | |||||
[JsonProperty("ishypertension")] | |||||
public bool Ishypertension { get; set; } = default!; | |||||
[JsonProperty("personName")] | |||||
public string PersonName { get; set; } = default!; | |||||
[JsonProperty("gender")] | |||||
public bool Gender { get; set; } = default!; | |||||
[JsonProperty("age")] | |||||
public int Age { get; set; } = default!; | |||||
[JsonProperty("bornDate")] | |||||
public string BornDate { get; set; } = default!; | |||||
} | |||||
public class GpsDevicePerson | |||||
{ | |||||
[JsonProperty("person")] | |||||
public Person Person { get; set; } = default!; | |||||
[JsonProperty("time")] | |||||
public DateTime Time { get; set; } = default!; | |||||
} | |||||
} |
@@ -1,7 +1,7 @@ | |||||
using System; | using System; | ||||
using System.Text; | using System.Text; | ||||
namespace HealthMonitor.WebApi.Configs | |||||
namespace HealthMonitor.Model.Config | |||||
{ | { | ||||
/// <summary> | /// <summary> | ||||
/// Redis配置模板类 | /// Redis配置模板类 |
@@ -0,0 +1,22 @@ | |||||
namespace HealthMonitor.Model.Config | |||||
{ | |||||
public class ServiceConfig | |||||
{ | |||||
/// <summary> | |||||
/// 数据服务Host Url | |||||
/// </summary> | |||||
public string TelpoDataUrl { get; set; } = default!; | |||||
///// <summary> | |||||
///// Kafka服务地址 | |||||
///// </summary> | |||||
//public string MqServerAddress { get; set; } | |||||
///// <summary> | |||||
///// 服务守护消息kafka服务地址 | |||||
///// </summary> | |||||
//public string ServiceGuardMqAddress { get; set; } | |||||
///// <summary> | |||||
///// 服务守护消息主题 | |||||
///// </summary> | |||||
//public string ServiceGuardMqTopic { get; set; } | |||||
} | |||||
} |
@@ -18,6 +18,10 @@ namespace HealthMonitor.Model.Config | |||||
public string DB { get; set; } = default!; | public string DB { get; set; } = default!; | ||||
public short RestPort { get; set; } = default!; | |||||
public string Token {get; set; } = default!; | |||||
} | } | ||||
} | } |
@@ -6,4 +6,8 @@ | |||||
<Nullable>enable</Nullable> | <Nullable>enable</Nullable> | ||||
</PropertyGroup> | </PropertyGroup> | ||||
<ItemGroup> | |||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> | |||||
</ItemGroup> | |||||
</Project> | </Project> |
@@ -0,0 +1,17 @@ | |||||
using Newtonsoft.Json; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace HealthMonitor.Service.Biz.db.Dto | |||||
{ | |||||
public class Aggregate: TDengineRestResBase | |||||
{ | |||||
public int Max { get; set; } | |||||
public int Min { get; set; } | |||||
} | |||||
} |
@@ -0,0 +1,26 @@ | |||||
using Newtonsoft.Json; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace HealthMonitor.Service.Biz.db.Dto | |||||
{ | |||||
public class TDengineRestResBase | |||||
{ | |||||
[JsonProperty("code")] | |||||
public int Code { get; set; } | |||||
[JsonProperty("desc")] | |||||
public string? Desc { get; set; } | |||||
[JsonProperty("column_meta")] | |||||
public List<object>? ColumnMeta { get; set; } | |||||
[JsonProperty("data")] | |||||
public List<object>? Data { get; set; } | |||||
} | |||||
} |
@@ -1,6 +1,9 @@ | |||||
using HealthMonitor.Model.Config; | |||||
using HealthMonitor.Common.helper; | |||||
using HealthMonitor.Model.Config; | |||||
using HealthMonitor.Service.Biz.db.Dto; | |||||
using Microsoft.Extensions.Logging; | using Microsoft.Extensions.Logging; | ||||
using Microsoft.Extensions.Options; | using Microsoft.Extensions.Options; | ||||
using Newtonsoft.Json; | |||||
using System; | using System; | ||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
using System.Linq; | using System.Linq; | ||||
@@ -15,11 +18,16 @@ namespace HealthMonitor.Service.Biz.db | |||||
{ | { | ||||
private readonly ILogger<TDengineService> _logger; | private readonly ILogger<TDengineService> _logger; | ||||
private readonly HttpHelper _httpHelper=default!; | |||||
private readonly TDengineServiceConfig _configTDengineService; | private readonly TDengineServiceConfig _configTDengineService; | ||||
public TDengineService(ILogger<TDengineService> logger, IOptions<TDengineServiceConfig> configTDengineService) | |||||
public TDengineService(ILogger<TDengineService> logger, | |||||
IOptions<TDengineServiceConfig> configTDengineService, | |||||
HttpHelper httpHelper | |||||
) | |||||
{ | { | ||||
_logger = logger; | _logger = logger; | ||||
_configTDengineService = configTDengineService.Value; | _configTDengineService = configTDengineService.Value; | ||||
_httpHelper = httpHelper; | |||||
} | } | ||||
public IntPtr Connection() | public IntPtr Connection() | ||||
{ | { | ||||
@@ -113,7 +121,6 @@ namespace HealthMonitor.Service.Biz.db | |||||
} | } | ||||
} | } | ||||
public void CheckRes(IntPtr conn, IntPtr res, String errorMsg) | public void CheckRes(IntPtr conn, IntPtr res, String errorMsg) | ||||
{ | { | ||||
if (TDengine.ErrorNo(res) != 0) | if (TDengine.ErrorNo(res) != 0) | ||||
@@ -122,7 +129,6 @@ namespace HealthMonitor.Service.Biz.db | |||||
} | } | ||||
} | } | ||||
public void ExecuteInsertSQL(IntPtr conn, string sql) | public void ExecuteInsertSQL(IntPtr conn, string sql) | ||||
{ | { | ||||
try | try | ||||
@@ -143,6 +149,82 @@ namespace HealthMonitor.Service.Biz.db | |||||
} | } | ||||
} | } | ||||
public async Task<bool> GernalRestSql(string sql) | |||||
{ | |||||
//"http://{server}:{port}/rest/sql/{db}" | |||||
var url = $"http://{_configTDengineService.Host}:{_configTDengineService.RestPort}/rest/sql/{_configTDengineService.DB}"; | |||||
List<KeyValuePair<string, string>> headers = new() | |||||
{ | |||||
new KeyValuePair<string, string>("Authorization", "Basic " + _configTDengineService.Token) | |||||
}; | |||||
var result = await _httpHelper.HttpToPostAsync(url, sql, headers).ConfigureAwait(false); | |||||
var res = JsonConvert.DeserializeObject<TDengineRestResBase>(result!); | |||||
if (result != null) | |||||
{ | |||||
if (res?.Code == 0) | |||||
{ | |||||
_logger.LogInformation($"{nameof(GernalRestSql)},SQL 语句执行成功|{sql}"); | |||||
return true; | |||||
} | |||||
else | |||||
{ | |||||
_logger.LogWarning($"{nameof(GernalRestSql)},SQL 语句执行失败||{sql}"); | |||||
return false; | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
_logger.LogError($"{nameof(GernalRestSql)},TDengine 服务器IP:{_configTDengineService.Host} 错误,请联系运维人员"); | |||||
return false; | |||||
} | |||||
//return res.Code==0; | |||||
} | |||||
public async Task<string?> GernalRestSqlResText(string sql) | |||||
{ | |||||
var url = $"http://{_configTDengineService.Host}:{_configTDengineService.RestPort}/rest/sql/{_configTDengineService.DB}"; | |||||
List<KeyValuePair<string, string>> headers = new() | |||||
{ | |||||
new KeyValuePair<string, string>("Authorization", "Basic " + _configTDengineService.Token) | |||||
}; | |||||
var result = await _httpHelper.HttpToPostAsync(url, sql, headers).ConfigureAwait(false); | |||||
return result; | |||||
} | |||||
public async Task<Aggregate> GetAggregateValue(string field,string tbName,string? condition) | |||||
{ | |||||
var sql = $"SELECT MAX({field}), MIN({field}) FROM {_configTDengineService.DB}.{tbName} WHERE {condition}"; | |||||
var result = await GernalRestSqlResText(sql); | |||||
var res = JsonConvert.DeserializeObject<Aggregate>(result!); | |||||
List<dynamic> data = res?.Data!; | |||||
return new Aggregate | |||||
{ | |||||
Max = data[0][0], | |||||
Min = data[0][1], | |||||
}; | |||||
} | |||||
public async Task<decimal> GetAvgExceptMaxMinValue(string field, string tbName, string? condition) | |||||
{ | |||||
var sql = $"SELECT MAX({field}), MIN({field}) FROM {_configTDengineService.DB}.{tbName} WHERE {condition}"; | |||||
var result = await GernalRestSqlResText(sql); | |||||
var res = JsonConvert.DeserializeObject<TDengineRestResBase>(result!); | |||||
List<dynamic> data = res?.Data!; | |||||
sql = $"SELECT AVG({field}) FROM {_configTDengineService.DB}.{tbName} WHERE {condition} AND {field} < {data[0][0]} and {field} > {data[0][1]}"; | |||||
result = await GernalRestSqlResText(sql); | |||||
res = JsonConvert.DeserializeObject<TDengineRestResBase>(result!); | |||||
data = res?.Data!; | |||||
return data.Count.Equals(0)?0:data[0][0]; | |||||
} | |||||
} | } | ||||
} | } |
@@ -0,0 +1,125 @@ | |||||
using CSRedis; | |||||
using HealthMonitor.Model.Cache; | |||||
using HealthMonitor.Model.Config; | |||||
using Microsoft.Extensions.Logging; | |||||
using Microsoft.Extensions.Options; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Net.NetworkInformation; | |||||
using System.Threading.Tasks; | |||||
using TelpoDataService.Util; | |||||
using TelpoDataService.Util.Clients; | |||||
using TelpoDataService.Util.Entities.GpsCard; | |||||
using TelpoDataService.Util.Models; | |||||
using TelpoDataService.Util.QueryObjects; | |||||
namespace HealthMonitor.Service.Cache | |||||
{ | |||||
public abstract class MyHelper2 : RedisHelper<MyHelper2> { } | |||||
public class PersonCacheManager | |||||
{ | |||||
private const int DEFAULT_DURATION_SECONDS = 1200; //20分钟 | |||||
private const string CACHE_KEY_PERSON = "Person_"; | |||||
//注意要改用 redis DB7 数据库 ,Prefix=TELPO | |||||
private const string CACHE_HASH_KEY_GPSDEVICEPERSON = "#GPSDEVICE_PERSON_HASH"; | |||||
//注意要改用 redis DB7 数据库 ,Prefix=TELPO | |||||
private readonly GpsCardAccessorClient<GpsPerson> _personApiClient; | |||||
private readonly ILogger<PersonCacheManager> _logger; | |||||
private readonly IOptions<RedisConfig> _optConfigRedis; | |||||
public PersonCacheManager(GpsCardAccessorClient<GpsPerson> personApiClient, | |||||
ILogger<PersonCacheManager> logger, IOptions<RedisConfig> optConfigRedis) | |||||
{ | |||||
_optConfigRedis = optConfigRedis; | |||||
_personApiClient = personApiClient; | |||||
_logger = logger; | |||||
} | |||||
public async Task<GpsPerson?> GetPersonBySerialNoAsync(string messageId, string sn) | |||||
{ | |||||
if (string.IsNullOrWhiteSpace(sn)) return null; | |||||
// 切换redis DB7 数据库和前缀 "TELPO" | |||||
_optConfigRedis.Value.DefaultDatabase = 7; | |||||
_optConfigRedis.Value.Prefix = "TELPO"; | |||||
// 增加容错,防止Redis宕机造成业务中断 | |||||
try | |||||
{ | |||||
using var csRedisDb7 = new CSRedisClient(_optConfigRedis.Value.ToString()); | |||||
return await csRedisDb7.HGetAsync<GpsPerson>(CACHE_HASH_KEY_GPSDEVICEPERSON, sn); | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
_logger.LogWarning($"Redis发生异常,将直接读取MySQL数据库,构造新实例:{ex.Message}, {ex.StackTrace}"); | |||||
var param = new GeneralParam | |||||
{ | |||||
Filters = new List<QueryFilterCondition> | |||||
{ | |||||
new QueryFilterCondition | |||||
{ | |||||
Key=nameof(GpsPerson.Serialno), | |||||
Value=sn, | |||||
ValueType=QueryValueTypeEnum.String, | |||||
Operator=QueryOperatorEnum.Equal | |||||
} | |||||
} | |||||
}!; | |||||
return await _personApiClient.GetFirstAsync(param, new RequestHeader { RequestId = messageId }).ConfigureAwait(false); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 读取个人信息(血压使用)注意要改用 redis DB7 | |||||
/// </summary> | |||||
/// <param name="messageId"></param> | |||||
/// <param name="sn"></param> | |||||
/// <returns></returns> | |||||
public async Task<GpsDevicePerson?> GetDeviceGpsPersonCacheBySerialNoAsync(string messageId, string sn) | |||||
{ | |||||
if (string.IsNullOrWhiteSpace(sn)) return null; | |||||
// 切换redis DB7 数据库和前缀 "TELPO" | |||||
_optConfigRedis.Value.DefaultDatabase = 7; | |||||
_optConfigRedis.Value.Prefix = "TELPO"; | |||||
// 增加容错,防止Redis宕机造成业务中断 | |||||
try | |||||
{ | |||||
var person = await RedisHelperDb7.HGetAsync<GpsDevicePerson>(CACHE_HASH_KEY_GPSDEVICEPERSON, sn).ConfigureAwait(false); | |||||
return person; | |||||
} | |||||
catch(Exception ex) | |||||
{ | |||||
_logger.LogWarning($"Redis发生异常,将直接读取MySQL数据库,构造新实例:{ex.Message}, {ex.StackTrace}"); | |||||
var param = new GeneralParam | |||||
{ | |||||
Filters = new List<QueryFilterCondition> | |||||
{ | |||||
new QueryFilterCondition | |||||
{ | |||||
Key=nameof(GpsPerson.Serialno), | |||||
Value=sn, | |||||
ValueType=QueryValueTypeEnum.String, | |||||
Operator=QueryOperatorEnum.Equal | |||||
} | |||||
} | |||||
}!; | |||||
var person = await _personApiClient.GetFirstAsync(param, new RequestHeader { RequestId = messageId }).ConfigureAwait(false); | |||||
// 读取数据库,构造新实例 | |||||
return new GpsDevicePerson { | |||||
Time = DateTime.Now, | |||||
Person=new Person { | |||||
DeviceId=person.DeviceId, | |||||
PersonId=person.PersonId, | |||||
Remarks=person.Remarks, | |||||
SerialNo=person.Serialno | |||||
} | |||||
}; | |||||
} | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,11 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace HealthMonitor.Service.Cache | |||||
{ | |||||
public abstract class RedisHelperDb7 : RedisHelper<RedisHelperDb7> { } | |||||
} |
@@ -7,13 +7,17 @@ | |||||
</PropertyGroup> | </PropertyGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
<PackageReference Include="CSRedisCore" Version="3.8.3" /> | |||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="7.0.0" /> | <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="7.0.0" /> | ||||
<PackageReference Include="Microsoft.Extensions.Options" Version="7.0.0" /> | <PackageReference Include="Microsoft.Extensions.Options" Version="7.0.0" /> | ||||
<PackageReference Include="TDengine.Connector" Version="3.0.2" /> | <PackageReference Include="TDengine.Connector" Version="3.0.2" /> | ||||
<PackageReference Include="TelpoDataService.Util" Version="1.6.9.16-beta1" /> | |||||
</ItemGroup> | </ItemGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
<ProjectReference Include="..\HealthMonitor.Common\HealthMonitor.Common.csproj" /> | |||||
<ProjectReference Include="..\HealthMonitor.Model\HealthMonitor.Model.csproj" /> | <ProjectReference Include="..\HealthMonitor.Model\HealthMonitor.Model.csproj" /> | ||||
<ProjectReference Include="..\HealthMonitor.Util\HealthMonitor.Util.csproj" /> | |||||
</ItemGroup> | </ItemGroup> | ||||
</Project> | </Project> |
@@ -10,7 +10,7 @@ using HealthMonitor.Util.Entities.Interfaces; | |||||
namespace HealthMonitor.Util.Entities.HealthMonitor | namespace HealthMonitor.Util.Entities.HealthMonitor | ||||
{ | { | ||||
public partial class BloodPressReferenceValue : HealthMonitorEntityBase, IKeyIntType | |||||
public partial class HmBloodPressReferenceValue : HealthMonitorEntityBase, IKeyIntType | |||||
{ | { | ||||
[Key] | [Key] | ||||
@@ -0,0 +1,167 @@ | |||||
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 System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
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; | |||||
protected readonly IHealthMonitorDataAccessor _dataAccessor; | |||||
public HmBloodPressController | |||||
( | |||||
ILogger<HmBloodPressController> logger, | |||||
TDengineService serviceDengine, | |||||
PersonCacheManager personCacheMgr, | |||||
IHealthMonitorDataAccessor dataAccessor | |||||
) | |||||
{ | |||||
_logger = logger; | |||||
_serviceTDengine = serviceDengine; | |||||
_personCacheMgr = personCacheMgr; | |||||
_dataAccessor = dataAccessor; | |||||
} | |||||
[HttpPost] | |||||
public async Task<IActionResult> AddAsync([FromHeader] string requestId, HisGpsBloodPress bp1) | |||||
{ | |||||
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 | |||||
}; | |||||
//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 插入当次BP数据 | |||||
// 保存到TDengine | |||||
/** | |||||
var sql = $"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})"; | |||||
// var sql = "select * from health_monitor.hm_bloodpress order by last_update desc"; | |||||
var res=await _serviceTDengine.GernalRestSql(sql); | |||||
*/ | |||||
#endregion | |||||
#region 获取个人信息 | |||||
var person = await _personCacheMgr.GetDeviceGpsPersonCacheBySerialNoAsync(bp.MessageId, bp.Serialno).ConfigureAwait(false); | |||||
//var person = new GpsDevicePerson() | |||||
//{ | |||||
// Time = DateTime.Now, | |||||
// Person = new Person() | |||||
// { | |||||
// Age = 43, | |||||
// DeviceId = "111111", | |||||
// Gender = true, | |||||
// Ishypertension = false, | |||||
// SerialNo = bp.Serialno | |||||
// } | |||||
//}; | |||||
#endregion | |||||
#region 计算增量值 | |||||
// 获取个人资料 redis | |||||
var age = person?.Person.Age; | |||||
var gender = person?.Person.Gender == true ? 1 : 2; | |||||
var isHypertension = person?.Person.Ishypertension; | |||||
var height = 0f; | |||||
var weight = 0f; | |||||
// 获取标定值 mysql | |||||
var bpRef = _dataAccessor | |||||
.GetFirstOrDefault<HmBloodPressReferenceValue>( | |||||
i => | |||||
i.Age.Equals(age) && | |||||
i.Gender.Equals(gender) && | |||||
i.Hypertension.Equals(isHypertension) | |||||
); | |||||
var systolicRefValue = bpRef.Systolic;//? | |||||
var diastolicRefValue = bpRef.Diastolic;//? | |||||
// 获取历史数据 | |||||
DateTime now = DateTime.Now; | |||||
DateTime startTime = now.AddDays(-2); | |||||
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; | |||||
// 增量值 | |||||
var systolicInc = (int)(systolicRefValue - systolicAvg * avgOffset); | |||||
var diastolicInc = (int)(diastolicRefValue - systolicAvg * 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(true); | |||||
} | |||||
} | |||||
} |
@@ -9,14 +9,14 @@ using Microsoft.AspNetCore.Mvc; | |||||
namespace HealthMonitor.WebApi.Controllers.HealthMonitor | namespace HealthMonitor.WebApi.Controllers.HealthMonitor | ||||
{ | { | ||||
[ApiExplorerSettings(GroupName = AppConsts.SWAGGER_DOC_HealthMonitor)] | [ApiExplorerSettings(GroupName = AppConsts.SWAGGER_DOC_HealthMonitor)] | ||||
public class BloodPressReferenceValueController : HealthMonitorControllerBase<BloodPressReferenceValue> | |||||
public class HmBloodPressReferenceValueController : HealthMonitorControllerBase<HmBloodPressReferenceValue> | |||||
{ | { | ||||
public BloodPressReferenceValueController( | |||||
public HmBloodPressReferenceValueController( | |||||
// IHealthMonitorDataAccessor dataAccessor, | // IHealthMonitorDataAccessor dataAccessor, | ||||
IHealthMonitorDataAccessor dataAccessor, | IHealthMonitorDataAccessor dataAccessor, | ||||
IHealthMonitorOperatorManager operatorManager, | IHealthMonitorOperatorManager operatorManager, | ||||
IDurableEntityManager durableManager, | IDurableEntityManager durableManager, | ||||
ILogger<BloodPressReferenceValueController> logger) | |||||
ILogger<HmBloodPressReferenceValueController> logger) | |||||
: base(dataAccessor, operatorManager, durableManager, logger) | : base(dataAccessor, operatorManager, durableManager, logger) | ||||
{ | { | ||||
@@ -9,6 +9,7 @@ | |||||
<ItemGroup> | <ItemGroup> | ||||
<PackageReference Include="Serilog.AspNetCore" Version="3.4.0" /> | <PackageReference Include="Serilog.AspNetCore" Version="3.4.0" /> | ||||
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" /> | <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" /> | ||||
<PackageReference Include="TelpoDataService.Util" Version="1.6.9.16-beta1" /> | |||||
</ItemGroup> | </ItemGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
@@ -20,6 +20,8 @@ using Microsoft.Extensions.DependencyInjection; | |||||
using Microsoft.Extensions.Options; | using Microsoft.Extensions.Options; | ||||
using Microsoft.OpenApi.Models; | using Microsoft.OpenApi.Models; | ||||
using HealthMonitor.WebApi.Swagger; | using HealthMonitor.WebApi.Swagger; | ||||
using HealthMonitor.Service.Cache; | |||||
using TelpoDataService.Util.Clients; | |||||
namespace HealthMonitor.WebApi | namespace HealthMonitor.WebApi | ||||
{ | { | ||||
@@ -44,13 +46,6 @@ namespace HealthMonitor.WebApi | |||||
builder.Services.AddSingleton<HttpHelper>(); | builder.Services.AddSingleton<HttpHelper>(); | ||||
builder.Services.AddSingleton<TDengineService>(); | builder.Services.AddSingleton<TDengineService>(); | ||||
builder.Services.AddControllers(); | builder.Services.AddControllers(); | ||||
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle | // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle | ||||
builder.Services.AddEndpointsApiExplorer(); | builder.Services.AddEndpointsApiExplorer(); | ||||
@@ -110,7 +105,8 @@ namespace HealthMonitor.WebApi | |||||
options.SuppressModelStateInvalidFilter = true; | options.SuppressModelStateInvalidFilter = true; | ||||
}) | }) | ||||
.Configure<RedisConfig>(builder.Configuration.GetSection("Redis")) | .Configure<RedisConfig>(builder.Configuration.GetSection("Redis")) | ||||
.Configure<TDengineServiceConfig>(builder.Configuration.GetSection("TDengineServiceConfig")); ; | |||||
.Configure<TDengineServiceConfig>(builder.Configuration.GetSection("TDengineServiceConfig")) | |||||
.Configure<ServiceConfig>(builder.Configuration.GetSection("ServiceConfig")); | |||||
builder.Services | builder.Services | ||||
@@ -144,6 +140,21 @@ namespace HealthMonitor.WebApi | |||||
builder.Host.UseServiceProviderFactory(new DynamicProxyServiceProviderFactory()); | builder.Host.UseServiceProviderFactory(new DynamicProxyServiceProviderFactory()); | ||||
#endregion | #endregion | ||||
#region Cache | |||||
builder.Services | |||||
.AddSingleton<PersonCacheManager>(); | |||||
#endregion | |||||
#region | |||||
builder.Services.AddTelpoDataServices(opt => | |||||
{ | |||||
opt.TelpoDataUrl = builder.Configuration.GetSection("ServiceConfig:TelpoDataUrl").Value; | |||||
}); | |||||
#endregion | |||||
// Register the Swagger generator, defining 1 or more Swagger documents | // Register the Swagger generator, defining 1 or more Swagger documents | ||||
builder.Services.AddSwaggerGen(c => | builder.Services.AddSwaggerGen(c => | ||||
{ | { | ||||
@@ -203,10 +214,17 @@ namespace HealthMonitor.WebApi | |||||
// redis | |||||
// redis default | |||||
var csredis = new CSRedis.CSRedisClient(app.Services.GetService<IOptions<RedisConfig>>()!.Value.ToString()); | var csredis = new CSRedis.CSRedisClient(app.Services.GetService<IOptions<RedisConfig>>()!.Value.ToString()); | ||||
RedisHelper.Initialization(csredis); | RedisHelper.Initialization(csredis); | ||||
// redis db7 | |||||
var csredisDb7Con = app.Services.GetService<IOptions<RedisConfig>>()!.Value; | |||||
csredisDb7Con.DefaultDatabase = 7; | |||||
csredisDb7Con.Prefix = "TELPO"; | |||||
var csredisDb7 = new CSRedis.CSRedisClient(csredisDb7Con.ToString()); | |||||
RedisHelperDb7.Initialization(csredisDb7); | |||||
app.UseHttpsRedirection(); | app.UseHttpsRedirection(); | ||||
app.UseAuthorization(); | app.UseAuthorization(); | ||||
@@ -9,20 +9,29 @@ | |||||
"Host": "47.116.142.20", | "Host": "47.116.142.20", | ||||
"UserName": "root", | "UserName": "root", | ||||
"Password": "taosdata", | "Password": "taosdata", | ||||
"Token": "cm9vdDp0YW9zZGF0YQ==", | |||||
"Port": 6030, | "Port": 6030, | ||||
"RestPort": 6041, | |||||
"DB": "health_monitor" | "DB": "health_monitor" | ||||
}, | }, | ||||
"Redis": { | "Redis": { | ||||
//"Server": "172.16.192.26:8090", | //"Server": "172.16.192.26:8090", | ||||
"Server": "47.116.142.20:8090", | |||||
//"Server": "47.116.142.20:8090", // 测试环境 | |||||
"Server": "139.224.254.18:8090", // 正式环境 | |||||
"Password": "telpo#1234", | "Password": "telpo#1234", | ||||
//"Server": "127.0.0.1:6379", | //"Server": "127.0.0.1:6379", | ||||
"DefaultDatabase": 2, | "DefaultDatabase": 2, | ||||
"Prefix": "_HM_", | |||||
//"DefaultDatabase": 7, | |||||
// "Prefix": "TELPO", | |||||
"Poolsize": 50, | "Poolsize": 50, | ||||
"Prefix": "_HW_", | |||||
"ConnectTimeout": 5000, | "ConnectTimeout": 5000, | ||||
"IdleTimeout": 20000 | "IdleTimeout": 20000 | ||||
}, | }, | ||||
"ServiceConfig": { | |||||
"TelpoDataUrl": "https://id.ssjlai.com/data/" | |||||
}, | |||||
"ConnectionStrings": { | "ConnectionStrings": { | ||||
//"GpsCard_Connection_String": "server=172.16.192.26;port=3304;database=user_operation_platform;uid=root;pwd=telpo#1234;CharSet=utf8;MinimumPoolSize=10;MaximumPoolSize=1000;SslMode=none", | //"GpsCard_Connection_String": "server=172.16.192.26;port=3304;database=user_operation_platform;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", | "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", | ||||