diff --git a/HealthMonitor.WebApi/Worker.cs b/HealthMonitor.WebApi/Worker.cs index feb6066..e29f0f5 100644 --- a/HealthMonitor.WebApi/Worker.cs +++ b/HealthMonitor.WebApi/Worker.cs @@ -9,6 +9,7 @@ using HealthMonitor.Model.Service; using HealthMonitor.Model.Service.Mapper; using HealthMonitor.Service.Biz; using HealthMonitor.Service.Biz.db; +using HealthMonitor.Service.Cache; using HealthMonitor.Service.Etcd; using HealthMonitor.Service.Sub; using Microsoft.AspNetCore.Mvc.RazorPages; @@ -34,20 +35,24 @@ namespace HealthMonitor.WebApi private readonly HttpHelper _httpHelper = default!; private readonly IotWebApiService _serviceIotWebApi; private readonly BoodPressResolverConfig _configBoodPressResolver; + private readonly BloodPressReferenceValueCacheManager _bpRefValCacheManager; + private readonly PersonCacheManager _personCacheMgr; - private CancellationTokenSource _tokenSource=default!; + private CancellationTokenSource _tokenSource = default!; - public Worker(ILogger logger, IServiceProvider services, IotWebApiService iotWebApiService, IOptions optionBoodPressResolver, PackageProcess processor,TDengineDataSubcribe tdEngineDataSubcribe, TDengineService serviceDengine, HttpHelper httpHelper, EtcdService serviceEtcd) + public Worker(ILogger logger, IServiceProvider services, PersonCacheManager personCacheMgr, BloodPressReferenceValueCacheManager bpRefValCacheManager, IotWebApiService iotWebApiService, IOptions optionBoodPressResolver, PackageProcess processor, TDengineDataSubcribe tdEngineDataSubcribe, TDengineService serviceDengine, HttpHelper httpHelper, EtcdService serviceEtcd) { _logger = logger; _tdEngineDataSubcribe = tdEngineDataSubcribe; _services = services; _serviceIotWebApi = iotWebApiService; _processor = processor; - _serviceEtcd = serviceEtcd; + _serviceEtcd = serviceEtcd; _serviceTDengine = serviceDengine; _httpHelper = httpHelper; _configBoodPressResolver = optionBoodPressResolver.Value; + _bpRefValCacheManager = bpRefValCacheManager; + _personCacheMgr = personCacheMgr; } public override Task StartAsync(CancellationToken cancellationToken) @@ -55,7 +60,7 @@ namespace HealthMonitor.WebApi _logger.LogInformation("------StartAsync"); _tokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); // 创建消费者 - // _tdEngineDataSubcribe.CreateConsumer(); + // _tdEngineDataSubcribe.CreateConsumer(); return base.StartAsync(cancellationToken); } @@ -63,8 +68,8 @@ namespace HealthMonitor.WebApi { _logger.LogInformation("------StopAsync"); _tokenSource.Cancel(); //停止工作线程 - // 关闭消费者 - // _tdEngineDataSubcribe.CloseConsumer(); + // 关闭消费者 + // _tdEngineDataSubcribe.CloseConsumer(); return base.StopAsync(cancellationToken); } @@ -92,7 +97,7 @@ namespace HealthMonitor.WebApi _logger.LogInformation("------_tdEngineDataSubcribe"); while (!_tokenSource.IsCancellationRequested) { - + _tdEngineDataSubcribe.BeginListen(_tokenSource.Token); } }, TaskCreationOptions.LongRunning); @@ -219,15 +224,61 @@ namespace HealthMonitor.WebApi } var lastPushParser = JsonConvert.DeserializeObject>(lastPushResponse); var lastPush = lastPushParser!.Select().FirstOrDefault(); + // 有下推记录 + if (lastPush != null) + { + systolicRefValue = lastPush!.SystolicRefValue; + diastolicRefValue = lastPush!.DiastolicRefValue; + lastPushSystolicInc = lastPush!.SystolicIncValue; + lastPushDiastolicInc = lastPush!.DiastolicIncValue; + condition = $"ts between '{lastPush?.Timestamp:yyyy-MM-dd HH:mm:ss.fff}' and '{startTime:yyyy-MM-dd HH:mm:ss.fff}' " + + $"and serialno='{imeiDel}' " + + $"and is_display = true"; + } + // 没有下推记录(历史遗留数据),没有初始的测量值产生的平均值(测量值=平均值) + else + { + #region 获取个人信息 + + var person = await _personCacheMgr.GetDeviceGpsPersonCacheBySerialNoAsync(Guid.NewGuid().ToString(), imeiDel).ConfigureAwait(false); + //验证这个信息是否存在 + if (person == null || person?.Person.BornDate == null) + { + _logger.LogWarning($"{nameof(Worker)}--{imeiDel} 验证个人信息,找不到个人信息,跳过此消息"); + return; + } + // 验证年龄是否在范围 (2 - 120) + var age = SafeType.SafeInt(DateTime.Today.Year - person?.Person.BornDate!.Value.Year!); + if (age < 2 || age > 120) + { + _logger.LogWarning($"{nameof(Worker)}--{imeiDel} 验证年龄,不在范围 (2 - 120)岁,跳过此消息"); + return; + } + + var gender = person?.Person.Gender == true ? 1 : 2; + var isHypertension = SafeType.SafeBool(person?.Person.Ishypertension!); + var height = SafeType.SafeDouble(person?.Person.Height!); + var weight = SafeType.SafeDouble(person?.Person.Weight!); + + #endregion + + #region 初始化常规血压标定值标定值 + var bpRef = await _bpRefValCacheManager.GetBloodPressReferenceValueAsync(age, gender, isHypertension); + //systolicRefValue = bpRef!.Systolic;//? + //diastolicRefValue = bpRef!.Diastolic;//? + #endregion + + systolicRefValue = bpRef!.Systolic; + diastolicRefValue = bpRef!.Diastolic; + lastPushSystolicInc = 0; + lastPushDiastolicInc = 0; + condition = $"ts <= '{startTime:yyyy-MM-dd HH:mm:ss.fff}' " + + $"and serialno='{imeiDel}' " + + $"and is_display = true"; + } + - systolicRefValue = lastPush!.SystolicRefValue; - diastolicRefValue = lastPush!.DiastolicRefValue; - lastPushSystolicInc = lastPush!.SystolicIncValue; - lastPushDiastolicInc = lastPush!.DiastolicIncValue; - condition = $"ts between '{lastPush?.Timestamp:yyyy-MM-dd HH:mm:ss.fff}' and '{startTime:yyyy-MM-dd HH:mm:ss.fff}' " + - $"and serialno='{imeiDel}' " + - $"and is_display = true"; var hmBpResponse = await _serviceTDengine.ExecuteSelectRestResponseAsync("stb_hm_bloodpress", condition); var hmBpParser = JsonConvert.DeserializeObject>(hmBpResponse!); var hmBp = hmBpParser?.Select(); @@ -403,7 +454,7 @@ namespace HealthMonitor.WebApi _logger.LogInformation($"向{imeiDel}统计数据已经失效"); } #endregion - + }