diff --git a/HealthMonitor.Service/Biz/IotWebApiService.cs b/HealthMonitor.Service/Biz/IotWebApiService.cs index 3dabfd3..fc835f2 100644 --- a/HealthMonitor.Service/Biz/IotWebApiService.cs +++ b/HealthMonitor.Service/Biz/IotWebApiService.cs @@ -264,7 +264,7 @@ namespace HealthMonitor.Service.Biz // } // return flag; //} - + /** /// /// 更新 gps_person remark缓存和数据库 /// @@ -342,6 +342,86 @@ namespace HealthMonitor.Service.Biz } return flag; } + */ + /// + /// 更新 gps_person remark缓存和数据库 + /// + /// + /// + /// + /// + /// + /// + /// + public async Task UpdatePersonRemarksAsync(string imei, int systolicRefValue, int diastolicRefValue, int systolicIncValue, int diastolicIncValue, string remarks= "is_blood_press") + { + var flag = false; + try + { + + // 保证实时性,先更新缓存,再更新数据库 + var personCache = await _personCacheMgr.GetDeviceGpsPersonCacheObjectBySerialNoAsync(new Guid().ToString(), imei).ConfigureAwait(false); + + if (personCache == null) + { + _logger.LogInformation($"{imei} -- Person remarks数据异常,检查缓存和数据库"); + } + else if (string.IsNullOrWhiteSpace(personCache["person"]!["remarks"]!.ToString())) + { + var newRemarkData = new + { + imei, + time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + commandValue = new + { + systolicCalibrationValue = systolicRefValue, //收缩压标定值,值为0 表示不生效 + diastolicCalibrationValue = diastolicRefValue, //舒张压标定值,值为0表示不生效 + systolicIncValue, //收缩压显示增量,值为0 表示不生效 + diastolicIncValue //舒张压显示增量,值为0 表示不生效 + } + }; + var newRemarkStr = $"{remarks}:{JsonConvert.SerializeObject(newRemarkData)}|"; + + personCache["person"]!["remarks"] = newRemarkStr; + bool cacheFlag = await _personCacheMgr.UpdateDeviceGpsPersonCacheObjectBySerialNoAsync(personCache, imei); + if (cacheFlag) + { + GeneralParam condition = new() + { + Filters = new List { + new QueryFilterCondition { + Key=nameof(GpsDevice.Serialno), + Value=imei, + Operator= QueryOperatorEnum.Equal, + ValueType=QueryValueTypeEnum.String + } + }, + OrderBys = new List { new OrderByCondition { Key = "serialno", IsDesc = true } } + + }; + _logger.LogInformation($"{imei} 更新缓存{nameof(UpdatePersonRemarksAsync)}成功,{JsonConvert.SerializeObject(personCache)}"); + // 读取数据库 + var person = await _gpsPersonApiClient.GetFirstAsync(condition, new RequestHeader() { RequestId = $"{imei}" }).ConfigureAwait(false); + // 更新字段 + person!.Remarks = newRemarkStr; + await _gpsPersonApiClient.UpdateAsync(person, new RequestHeader() { RequestId = $"{imei}" }).ConfigureAwait(false); + _logger.LogInformation($"{imei} 更新Person remarks字段|{person.Remarks}"); + + } + else + { + _logger.LogInformation($"{imei} 更新缓存和数据库{nameof(UpdatePersonRemarksAsync)}失败,{JsonConvert.SerializeObject(personCache)}"); + } + flag = cacheFlag; + } + } + catch (Exception ex) + { + _logger.LogError($"{nameof(UpdatePersonRemarksAsync)} {imei}--更新个人信息异常:{ex.Message}, {ex.StackTrace}"); + } + return flag; + } + /** 取消 public async Task UpdatePersonInfoCacheAsync(string imei) { diff --git a/HealthMonitor.Service/Resolver/BloodpressResolver.cs b/HealthMonitor.Service/Resolver/BloodpressResolver.cs index 086da2e..fd70290 100644 --- a/HealthMonitor.Service/Resolver/BloodpressResolver.cs +++ b/HealthMonitor.Service/Resolver/BloodpressResolver.cs @@ -105,8 +105,8 @@ namespace HealthMonitor.Service.Resolver int diastolicRefValue; int systolicInc; int diastolicInc; - int systolicAvg; - int diastolicAvg; + decimal systolicAvg; + decimal diastolicAvg; int systolicMax = 0; int diastolicMax = 0; @@ -225,6 +225,73 @@ namespace HealthMonitor.Service.Resolver #endregion } + else if (person.Person.Remarks.Contains("lastPushRefValue")) + { + _logger.LogInformation($"{bp.Serialno},有新标定值(lastPushRefValue),使用最近一次下推的标定值和增量值(测量值=平均值计算得出的)"); + var lastPushResponse = await _serviceTDengine.ExecuteSelectRestResponseAsync("stb_hm_bp_push_ref_inc_value", $"serialno='{bp.Serialno}' order by ts desc", "last_row(*)"); + var lastPushParser = JsonConvert.DeserializeObject>(lastPushResponse!); + var lastPush = lastPushParser!.Select().FirstOrDefault(); + + var lastPushSystolicRefValue = lastPush!.SystolicRefValue; + var lastPushDiastolicRefValue = lastPush!.SystolicRefValue; + // 测量值当作平均值 + systolicAvg = bp.SystolicValue; + diastolicAvg = bp.DiastolicValue; + systolicInc = (int)((systolicRefValue - systolicAvg) * systolicAvgOffset)!; + diastolicInc = (int)((diastolicRefValue - diastolicAvg) * diastolicAvgOffset)!; + #region 更新 gps_persoon remarks 下发增量值到iot + // 更新 + remarkFlag = await _serviceIotWebApi.UpdatePersonRemarksAsync(bp.Serialno, (int)systolicRefValue!, (int)diastolicRefValue!, systolicInc, diastolicInc).ConfigureAwait(false); + if (remarkFlag) + { + _logger.LogInformation($"{nameof(BloodpressResolver)} 开启血压标定值下发: {_configBoodPressResolver.EnableBPRefPush}"); + // 启血压标定值下发开关 + if (_configBoodPressResolver.EnableBPRefPush) + { + // 下推 + BloodPressCalibrationConfigModel bpIncData = new() + { + Imei = bp.Serialno, + SystolicRefValue = (int)systolicRefValue!, //收缩压标定值,值为0 表示不生效 + DiastolicRefValue = (int)diastolicRefValue!, //舒张压标定值,值为0表示不生效 + SystolicIncValue = systolicInc, //收缩压显示增量,值为0 表示不生效 + DiastolicIncValue = diastolicInc //舒张压显示增量,值为0 表示不生效 + }; + // 下发 IOT 增量值 + var flagIot = await _serviceIotWebApi.SetBloodPressCalibrationConfigAsync(bpIncData).ConfigureAwait(false); + if (flagIot) + { + startTime = (DateTime)bp.LastUpdate!; + endTime = DateTime.Now; + #region 保存下推记录 stb_hm_bp_push_ref_inc_value + sql = $"INSERT INTO health_monitor.hm_bp_push_ref_inc_value_{bp.Serialno.Substring(bp.Serialno.Length - 2)} " + + $"USING health_monitor.stb_hm_bp_push_ref_inc_value " + + $"TAGS ('{bp.Serialno.Substring(bp.Serialno.Length - 2)}') " + + $"VALUES(" + + $"'{endTime:yyyy-MM-dd HH:mm:ss.fff}'," + + $"'{bp.Serialno}'," + + $"{systolicRefValue}," + + $"{diastolicRefValue}," + + $"{systolicInc}," + + $"{diastolicInc}," + + $"{true}," + + $"{systolicAvg}," + + $"{diastolicAvg}," + + $"{systolicAvgOffset}," + + $"{diastolicAvgOffset}," + + $"'{startTime:yyyy-MM-dd HH:mm:ss.fff}'," + + $"'{endTime:yyyy-MM-dd HH:mm:ss.fff}'" + + $")"; + + _serviceTDengine.ExecuteInsertSQL(sql); + #endregion + } + } + + } + + #endregion + } else { #region (暂时取消)正常计算增量值 diff --git a/HealthMonitor.WebApi/Controllers/HealthMonitor/HmBloodPressConfigManualCalibrationController.cs b/HealthMonitor.WebApi/Controllers/HealthMonitor/HmBloodPressConfigManualCalibrationController.cs index f9139e3..fcf8c51 100644 --- a/HealthMonitor.WebApi/Controllers/HealthMonitor/HmBloodPressConfigManualCalibrationController.cs +++ b/HealthMonitor.WebApi/Controllers/HealthMonitor/HmBloodPressConfigManualCalibrationController.cs @@ -190,8 +190,6 @@ namespace HealthMonitor.WebApi.Controllers.HealthMonitor var hmBpParser = JsonConvert.DeserializeObject>(hmBpResponse!); if (hmBpParser!.Rows >= 5) { - - //systolicAvg = (int)(hmBpParser?.AverageAfterRemovingOneMinMaxRef(i => i.SystolicValue, SafeType.SafeInt(systolicRefValue!)))!; //diastolicAvg = (int)(hmBpParser?.AverageAfterRemovingOneMinMaxRef(i => i.DiastolicValue, SafeType.SafeInt(diastolicRefValue!)))!; var avgs = _serviceTDengine.AverageAfterRemovingOneMinMaxRef(SafeType.SafeInt(systolicRefValue!), hmBpParser!); @@ -201,23 +199,24 @@ namespace HealthMonitor.WebApi.Controllers.HealthMonitor // 数据不足等同进行初始化,只下发标定值,增量值为0;remarks恢复到未校准状态,需要基于第一个测量值生成增量值。 if (systolicAvg.Equals(0)) { - _logger.LogInformation($"测量数据样本不足,将进行标定值初始,只下发标定值,增量值为0,不更新remark"); + _logger.LogInformation($"测量数据样本不足,将进行标定值初始,只下发标定值,增量值为0,更新remark (lastPushRefValue)"); // 重置设备 - var statNow = DateTime.Now; - await IotSetBloodPressCalibrationConfigResponseAsync(imei, 0, 0, 0, 0, 0, 0, 0, 0, statNow, statNow).ConfigureAwait(false); - _logger.LogInformation($"1.测量数据样本不足,向IOT重置设备发送0,不更新remark"); - - //var initRemarksFlag = await _serviceIotWebApi.UpdatePersonRemarksAsync(imei, 0, 0, 0, 0, true).ConfigureAwait(false); - //if (initRemarksFlag) - //{ - // _logger.LogInformation($"2.测量数据样本不足,remarks恢复到未校准状态(remarks设置为空),成功"); - //} - //else - //{ - // _logger.LogInformation($"2.测量数据样本不足,remarks恢复到未校准状态(remarks设置为空),失败"); - //} + // var statNow = DateTime.Now; + //await IotSetBloodPressCalibrationConfigResponseAsync(imei, 0, 0, 0, 0, 0, 0, 0, 0, statNow, statNow).ConfigureAwait(false); + _logger.LogInformation($"1.测量数据样本不足,更新remark (lastPushRefValue)"); + + var initRemarksFlag = await _serviceIotWebApi.UpdatePersonRemarksAsync(imei, 0, 0, 0, 0, "lastPushRefValue").ConfigureAwait(false); + if (initRemarksFlag) + { + _logger.LogInformation($"2.测量数据样本不足,remarks恢复到未校准状态(remarks设置为空),成功"); + } + else + { + _logger.LogInformation($"2.测量数据样本不足,remarks恢复到未校准状态(remarks设置为空),失败"); + } _logger.LogInformation($"2.测量数据样本不足,只下发手动标定值systolicRefValue:{systolicRefValue} -- diastolicRefValue:{diastolicRefValue},增量值为0"); - statNow = statNow.AddSeconds(3); + //statNow = statNow.AddSeconds(3); + var statNow = DateTime.Now; return await IotSetBloodPressCalibrationConfigResponseAsync(imei, systolicRefValue, diastolicRefValue, 0, 0, 0, 0, 0, 0, statNow, statNow).ConfigureAwait(false); } @@ -236,21 +235,21 @@ namespace HealthMonitor.WebApi.Controllers.HealthMonitor } else { - _logger.LogInformation($"没有符合条件的测试量数据,将进行标定值初始,只下发标定值,增量值为0;不更新remark"); + _logger.LogInformation($"没有符合条件的测试量数据(少于5条),将进行标定值初始,只下发标定值,增量值为0;更新remark (lastPushRefValue)"); var statNow = DateTime.Now; - await IotSetBloodPressCalibrationConfigResponseAsync(imei, 0, 0, 0, 0, 0, 0, 0, 0, statNow, statNow).ConfigureAwait(false); - _logger.LogInformation($"1.没有符合条件的测试量数据,向IOT重置设备发送0,不更新remark"); + // await IotSetBloodPressCalibrationConfigResponseAsync(imei, 0, 0, 0, 0, 0, 0, 0, 0, statNow, statNow).ConfigureAwait(false); + _logger.LogInformation($"1.没有符合条件的测试量数据(少于5条),更新remark (lastPushRefValue)"); - //var initRemarksFlag = await _serviceIotWebApi.UpdatePersonRemarksAsync(imei, 0, 0, 0, 0, true).ConfigureAwait(false); - //if (initRemarksFlag) - //{ - // _logger.LogInformation($"2.没有符合条件的测试量数据,remarks恢复到未校准状态(remarks设置为空),成功"); - //} - //else - //{ - // _logger.LogInformation($"2.没有符合条件的测试量数据,remarks恢复到未校准状态(remarks设置为空),失败"); - //} - _logger.LogInformation($"2.没有符合条件的测试量数据,只下发手动标定值systolicRefValue:{systolicRefValue} -- diastolicRefValue:{diastolicRefValue},增量值为0"); + var initRemarksFlag = await _serviceIotWebApi.UpdatePersonRemarksAsync(imei, 0, 0, 0, 0, "lastPushRefValue").ConfigureAwait(false); + if (initRemarksFlag) + { + _logger.LogInformation($"2.没有符合条件的测试量数据(少于5条),remarks恢复到未校准状态(remarks设置为空),成功"); + } + else + { + _logger.LogInformation($"2.没有符合条件的测试量数据(少于5条),remarks恢复到未校准状态(remarks设置为空),失败"); + } + _logger.LogInformation($"2.没有符合条件的测试量数据(少于5条),只下发手动标定值systolicRefValue:{systolicRefValue} -- diastolicRefValue:{diastolicRefValue},增量值为0"); statNow = statNow.AddSeconds(3); return await IotSetBloodPressCalibrationConfigResponseAsync(imei, systolicRefValue, diastolicRefValue, 0, 0, 0, 0, 0, 0, statNow, statNow).ConfigureAwait(false);