您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

329 行
16KB

  1. using HealthMonitor.Common.helper;
  2. using HealthMonitor.Model.Config;
  3. using HealthMonitor.Service.Resolver;
  4. using Microsoft.Extensions.Logging;
  5. using Microsoft.Extensions.Options;
  6. using Newtonsoft.Json.Linq;
  7. using Newtonsoft.Json;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.Linq;
  11. using System.Text;
  12. using System.Threading.Tasks;
  13. using HealthMonitor.Model.Service;
  14. using TelpoDataService.Util.Entities.GpsCard;
  15. using TelpoDataService.Util;
  16. using TelpoDataService.Util.Clients;
  17. using TelpoDataService.Util.Models;
  18. using TelpoDataService.Util.QueryObjects;
  19. using HealthMonitor.Service.Cache;
  20. using HealthMonitor.Model.Cache;
  21. using Etcdserverpb;
  22. namespace HealthMonitor.Service.Biz
  23. {
  24. public class IotApiService
  25. {
  26. private readonly ServiceConfig _configService;
  27. private readonly ILogger<IotApiService> _logger;
  28. private readonly PersonCacheManager _personCacheMgr;
  29. private readonly DeviceCacheManager _deviceCacheMgr;
  30. private readonly HttpHelper _httpHelper = default!;
  31. private readonly GpsCardAccessorClient<GpsPerson> _gpsPersonApiClient;
  32. public IotApiService(ILogger<IotApiService> logger, HttpHelper httpHelper, DeviceCacheManager deviceCacheMgr, GpsCardAccessorClient<GpsPerson> gpsPersonApiClient, IOptions<ServiceConfig> optConfigService, PersonCacheManager personCacheMgr)
  33. {
  34. _configService = optConfigService.Value;
  35. _httpHelper=httpHelper;
  36. _logger = logger;
  37. _personCacheMgr = personCacheMgr;
  38. _gpsPersonApiClient = gpsPersonApiClient;
  39. _deviceCacheMgr = deviceCacheMgr;
  40. }
  41. #region 平台下发血压标定参数
  42. /// <summary>
  43. /// 平台下发血压标定参数
  44. /// </summary>
  45. /// <param name="bpsCalibrationConfig"></param>
  46. /// <returns></returns>
  47. public async Task<bool> SetBloodPressCalibrationConfigAsync(BloodPressCalibrationConfigModel bpsCalibrationConfig)
  48. {
  49. #if DEBUG
  50. var flag = true;
  51. #else
  52. //systolicCalibrationValue = 0, //收缩压标定值,值为0 表示不生效
  53. //diastolicCalibrationValue 0, //舒张压标定值,值为0表示不生效
  54. //systolicIncValue = 0, //收缩压显示增量,值为0 表示不生效
  55. //diastolicIncValue = 0 //舒张压显示增量,值为0 表示不生效
  56. var flag = false;
  57. try
  58. {
  59. var url = $"{_configService.IotWebApiUrl}Command/SetBloodPressCalibrationConfig";
  60. List<KeyValuePair<string, string>> headers = new()
  61. {
  62. new KeyValuePair<string, string>("AuthKey", "key1")
  63. };
  64. var res = await _httpHelper.HttpToPostAsync(url, bpsCalibrationConfig, headers).ConfigureAwait(false);
  65. _logger.LogInformation($"向{bpsCalibrationConfig.Imei}下发增量值数据:{JsonConvert.SerializeObject(bpsCalibrationConfig)},响应:{res}");
  66. var resJToken = JsonConvert.DeserializeObject(res ?? string.Empty) as JToken;
  67. flag= resJToken?["message"]?.ToString().Equals("ok") ?? false;
  68. }
  69. catch (Exception ex)
  70. {
  71. _logger.LogError($"{nameof(SetBloodPressCalibrationConfigAsync)} 下发血压增量值异常:{ex.Message}, {ex.StackTrace}");
  72. }
  73. #endif
  74. return flag;
  75. }
  76. public async Task<BloodPressCalibrationConfigModelReponse> SetBloodPressCalibrationConfig2Async(BloodPressCalibrationConfigModel bpsCalibrationConfig)
  77. {
  78. BloodPressCalibrationConfigModelReponse response = new BloodPressCalibrationConfigModelReponse();
  79. response.Flag = false;
  80. response.Message = string.Empty;
  81. #if DEBUG
  82. //var flag = true;
  83. response.Flag=true;
  84. #else
  85. //systolicCalibrationValue = 0, //收缩压标定值,值为0 表示不生效
  86. //diastolicCalibrationValue 0, //舒张压标定值,值为0表示不生效
  87. //systolicIncValue = 0, //收缩压显示增量,值为0 表示不生效
  88. //diastolicIncValue = 0 //舒张压显示增量,值为0 表示不生效
  89. // var flag = false;
  90. try
  91. {
  92. var url = $"{_configService.IotWebApiUrl}Command/SetBloodPressCalibrationConfig";
  93. List<KeyValuePair<string, string>> headers = new()
  94. {
  95. new KeyValuePair<string, string>("AuthKey", "key1")
  96. };
  97. var res = await _httpHelper.HttpToPostAsync(url, bpsCalibrationConfig, headers).ConfigureAwait(false);
  98. _logger.LogInformation($"向{bpsCalibrationConfig.Imei}下发增量值数据:{JsonConvert.SerializeObject(bpsCalibrationConfig)},响应:{res}");
  99. var resJToken = JsonConvert.DeserializeObject(res ?? string.Empty) as JToken;
  100. //response.Flag= resJToken?["message"]?.ToString().Equals("ok") ?? false;
  101. response.Flag = Convert.ToBoolean(resJToken?["succeed"]?.ToString());
  102. if (!response.Flag)
  103. {
  104. response.Message = resJToken?["message"]?.ToString()!;
  105. }
  106. }
  107. catch (Exception ex)
  108. {
  109. _logger.LogError($"{nameof(SetBloodPressCalibrationConfigAsync)} 下发血压增量值异常:{ex.Message}, {ex.StackTrace}");
  110. }
  111. #endif
  112. return response;
  113. }
  114. public async Task<bool> UpdatePersonRemarksAsync(string imei, int systolicRefValue, int diastolicRefValue, int systolicIncValue, int diastolicIncValue, string remarks = "is_blood_press")
  115. {
  116. var flag = false;
  117. try
  118. {
  119. // 保证实时性,先更新缓存,再更新数据库
  120. var personCache = await _personCacheMgr.GetDeviceGpsPersonCacheObjectBySerialNoAsync(new Guid().ToString(), imei).ConfigureAwait(false);
  121. if (personCache == null)
  122. {
  123. _logger.LogInformation($"{imei} -- Person remarks数据异常,检查缓存和数据库");
  124. }
  125. else
  126. {
  127. var newRemarkData = new
  128. {
  129. imei,
  130. time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
  131. commandValue = new
  132. {
  133. systolicCalibrationValue = systolicRefValue, //收缩压标定值,值为0 表示不生效
  134. diastolicCalibrationValue = diastolicRefValue, //舒张压标定值,值为0表示不生效
  135. systolicIncValue, //收缩压显示增量,值为0 表示不生效
  136. diastolicIncValue //舒张压显示增量,值为0 表示不生效
  137. }
  138. };
  139. var newRemarkStr = $"{remarks}:{JsonConvert.SerializeObject(newRemarkData)}|";
  140. personCache["person"]!["remarks"] = newRemarkStr;
  141. bool cacheFlag = await _personCacheMgr.UpdateDeviceGpsPersonCacheObjectBySerialNoAsync(personCache, imei);
  142. if (cacheFlag)
  143. {
  144. GeneralParam condition = new()
  145. {
  146. Filters = new List<QueryFilterCondition> {
  147. new QueryFilterCondition {
  148. Key=nameof(GpsDevice.Serialno),
  149. Value=imei,
  150. Operator= QueryOperatorEnum.Equal,
  151. ValueType=QueryValueTypeEnum.String
  152. }
  153. },
  154. OrderBys = new List<OrderByCondition> { new OrderByCondition { Key = "serialno", IsDesc = true } }
  155. };
  156. _logger.LogInformation($"{imei} 更新缓存{nameof(UpdatePersonRemarksAsync)}成功,{JsonConvert.SerializeObject(personCache)}");
  157. // 读取数据库
  158. var person = await _gpsPersonApiClient.GetFirstAsync(condition, new RequestHeader() { RequestId = $"{imei}" }).ConfigureAwait(false);
  159. // 更新字段
  160. person!.Remarks = newRemarkStr;
  161. await _gpsPersonApiClient.UpdateAsync(person, new RequestHeader() { RequestId = $"{imei}" }).ConfigureAwait(false);
  162. _logger.LogInformation($"{imei} 更新Person remarks字段|{person.Remarks}");
  163. }
  164. else
  165. {
  166. _logger.LogInformation($"{imei} 更新缓存和数据库{nameof(UpdatePersonRemarksAsync)}失败,{JsonConvert.SerializeObject(personCache)}");
  167. }
  168. flag = cacheFlag;
  169. }
  170. // else if (string.IsNullOrWhiteSpace(personCache["person"]!["remarks"]!.ToString()))
  171. //else if (personCache?["person"]!["remarks"]!.ToString()!=null)
  172. //{
  173. // var newRemarkData = new
  174. // {
  175. // imei,
  176. // time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
  177. // commandValue = new
  178. // {
  179. // systolicCalibrationValue = systolicRefValue, //收缩压标定值,值为0 表示不生效
  180. // diastolicCalibrationValue = diastolicRefValue, //舒张压标定值,值为0表示不生效
  181. // systolicIncValue, //收缩压显示增量,值为0 表示不生效
  182. // diastolicIncValue //舒张压显示增量,值为0 表示不生效
  183. // }
  184. // };
  185. // var newRemarkStr = $"{remarks}:{JsonConvert.SerializeObject(newRemarkData)}|";
  186. // personCache["person"]!["remarks"] = newRemarkStr;
  187. // bool cacheFlag = await _personCacheMgr.UpdateDeviceGpsPersonCacheObjectBySerialNoAsync(personCache, imei);
  188. // if (cacheFlag)
  189. // {
  190. // GeneralParam condition = new()
  191. // {
  192. // Filters = new List<QueryFilterCondition> {
  193. // new QueryFilterCondition {
  194. // Key=nameof(GpsDevice.Serialno),
  195. // Value=imei,
  196. // Operator= QueryOperatorEnum.Equal,
  197. // ValueType=QueryValueTypeEnum.String
  198. // }
  199. // },
  200. // OrderBys = new List<OrderByCondition> { new OrderByCondition { Key = "serialno", IsDesc = true } }
  201. // };
  202. // _logger.LogInformation($"{imei} 更新缓存{nameof(UpdatePersonRemarksAsync)}成功,{JsonConvert.SerializeObject(personCache)}");
  203. // // 读取数据库
  204. // var person = await _gpsPersonApiClient.GetFirstAsync(condition, new RequestHeader() { RequestId = $"{imei}" }).ConfigureAwait(false);
  205. // // 更新字段
  206. // person!.Remarks = newRemarkStr;
  207. // await _gpsPersonApiClient.UpdateAsync(person, new RequestHeader() { RequestId = $"{imei}" }).ConfigureAwait(false);
  208. // _logger.LogInformation($"{imei} 更新Person remarks字段|{person.Remarks}");
  209. // }
  210. // else
  211. // {
  212. // _logger.LogInformation($"{imei} 更新缓存和数据库{nameof(UpdatePersonRemarksAsync)}失败,{JsonConvert.SerializeObject(personCache)}");
  213. // }
  214. // flag = cacheFlag;
  215. //}
  216. }
  217. catch (Exception ex)
  218. {
  219. _logger.LogError($"{nameof(UpdatePersonRemarksAsync)} {imei}--更新个人信息异常:{ex.Message}, {ex.StackTrace}");
  220. }
  221. return flag;
  222. }
  223. #endregion
  224. #region 平台下发胎心监测参数
  225. public async Task<bool> SetFetalHeartRateConfig(string serialno, int modeStatus=0, int maxValue=0, int minValue = 0)
  226. {
  227. try
  228. {
  229. #region 读取缓存
  230. // db7.HashGet("TELPO#GPSDEVICE_WATCH_CONFIG_HASH","861281060086083_0067")
  231. var watchConfig = await _deviceCacheMgr.GetGpsDeviceWatchConfigCacheObjectBySerialNoAsync(serialno, "0067");
  232. if (watchConfig==null)
  233. {
  234. return false;
  235. }
  236. #endregion
  237. #region 获取B端 Token
  238. var getTokenUrl = $"{_configService.IotAuth}/getAccessToken2";
  239. var tokenReq = new
  240. {
  241. manufactorId= "7c7c38cb-d045-41d8-b3d0-fcaaa84a8f02",
  242. imei= serialno
  243. };
  244. var resToken = await _httpHelper.HttpToPostAsync(getTokenUrl, tokenReq).ConfigureAwait(false);
  245. var tokenAuth= JsonConvert.DeserializeObject(resToken ?? string.Empty) as JToken;
  246. var tokenAuthData = tokenAuth?["data"]?.ToString()??string.Empty;
  247. if (tokenAuthData == null)
  248. {
  249. return false;
  250. }
  251. #endregion
  252. #region 发送到B端
  253. List<KeyValuePair<string, string>> headers = new()
  254. {
  255. new KeyValuePair<string, string>("TelpoManufactorId", tokenAuthData)
  256. };
  257. var data = new
  258. {
  259. imeis = new string[] { serialno },
  260. enabled = (int)watchConfig["fetalParamters"]!["enabled"]!,
  261. triggerHighFreqHigh = maxValue == 0 ? (int)watchConfig["fetalParamters"]!["triggerHighFreqHigh"]!:maxValue,
  262. triggerLowFreqLow = minValue == 0 ? (int)watchConfig["fetalParamters"]!["triggerHighFreqLow"]! : minValue,
  263. highFreqSampleTimes = (int)watchConfig["fetalParamters"]!["highFreqSampleTimes"]!,
  264. highFreqSampleInterval = (int)watchConfig["fetalParamters"]!["highFreqSampleInterval"]!,
  265. stopHighFreqSampleCount = (int)watchConfig["fetalParamters"]!["stopHighFreqSampleCount"]!,
  266. mode = modeStatus,
  267. edoc = watchConfig["fetalParamters"]!["EDOC"]!,
  268. vibrateEnabled = (int)watchConfig["fetalParamters"]!["vibrateEnabled"]!,
  269. lcdEnabled= (int)watchConfig["fetalParamters"]!["lcdEnabled"]!
  270. };
  271. var setUrl = $"{_configService.IotCore}/api/v1/open/OpenIot/SetFetalConfig";
  272. var res = await _httpHelper.HttpToPostAsync(setUrl, data, headers).ConfigureAwait(false);
  273. var resJToken = JsonConvert.DeserializeObject(res ?? string.Empty) as JToken;
  274. return resJToken?["message"]?.ToString().Equals("ok") ?? false;
  275. //response.Flag = resJToken?["message"]?.ToString().Equals("ok") ?? false;
  276. //response.Flag = Convert.ToBoolean(resJToken?["succeed"]?.ToString());
  277. //if (!response.Flag)
  278. //{
  279. // response.Message = resJToken?["message"]?.ToString()!;
  280. //}
  281. #endregion
  282. }
  283. catch (Exception ex)
  284. {
  285. _logger.LogError($"{nameof(SetFetalHeartRateConfig)} 下发胎心检测参数异常:{ex.Message}, {ex.StackTrace}");
  286. return false;
  287. }
  288. }
  289. #endregion
  290. }
  291. }