You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

267 lines
9.9KB

  1. using HealthMonitor.Model.Service.Mapper;
  2. using Microsoft.Extensions.Logging;
  3. using Newtonsoft.Json;
  4. using Newtonsoft.Json.Linq;
  5. using TelpoDataService.Util.Clients;
  6. using TelpoDataService.Util.Entities.GpsCard;
  7. using TelpoDataService.Util.Entities.GpsLocationHistory;
  8. using TelpoDataService.Util.Models;
  9. using TelpoDataService.Util.QueryObjects;
  10. using HealthMonitor.Common;
  11. namespace HealthMonitor.Service.Cache
  12. {
  13. public class DeviceCacheManager
  14. {
  15. private readonly ILogger<DeviceCacheManager> _logger;
  16. private const string CACHE_KEY_DEVICE = "Device_";
  17. private const string CACHE_KEY_GPSDEVICE_WATCH_CONFIG = "#GPSDEVICE_WATCH_CONFIG_HASH";
  18. private const string CACHE_KEY_FETALMOVEMENT = "FM_";
  19. private const string CACHE_KEY_FETALHEARTRATE = "FHR_";
  20. private readonly GpsLocationHistoryAccessorClient<HisGpsFetalMovement> _hisFetalMovementApiClient;
  21. private readonly GpsLocationHistoryAccessorClient<HisGpsFetalHeartRate> _hisFetalHeartRateApiClient;
  22. public DeviceCacheManager(ILogger<DeviceCacheManager> logger
  23. , GpsLocationHistoryAccessorClient<HisGpsFetalMovement> hisFetalMovementApiClient
  24. , GpsLocationHistoryAccessorClient<HisGpsFetalHeartRate> hisFetalHeartRateApiClient)
  25. {
  26. _logger = logger;
  27. _hisFetalMovementApiClient = hisFetalMovementApiClient;
  28. _hisFetalHeartRateApiClient = hisFetalHeartRateApiClient;
  29. }
  30. /// <summary>
  31. /// 获取device_id
  32. /// </summary>
  33. /// <param name="sn"></param>
  34. /// <returns></returns>
  35. public async Task<GpsDevice?> GetDeviceBySerialNoAsync(string sn)
  36. {
  37. string key = CACHE_KEY_DEVICE + sn;
  38. var device = await RedisHelperDb10.GetAsync<GpsDevice>(key).ConfigureAwait(false);
  39. return device;
  40. }
  41. /// <summary>
  42. ///
  43. /// </summary>
  44. /// <param name="sn"></param>
  45. /// <param name="bizCode">
  46. /// 业务码
  47. /// 0067 胎心启动配置
  48. /// </param>
  49. /// <returns></returns>
  50. public async Task<JObject?> GetGpsDeviceWatchConfigCacheObjectBySerialNoAsync(string sn, string bizCode)
  51. {
  52. if (string.IsNullOrWhiteSpace(sn)) return null;
  53. try
  54. {
  55. var config = await RedisHelperDb7.HGetAsync(CACHE_KEY_GPSDEVICE_WATCH_CONFIG, $"{sn}_{bizCode}").ConfigureAwait(false);
  56. if (config == null) return null;
  57. _logger.LogInformation($"{sn} 配置信息 {config}");
  58. return (JObject)JsonConvert.DeserializeObject(config)!;
  59. }
  60. catch (Exception ex)
  61. {
  62. _logger.LogWarning($"Redis DB7发生异常:{ex.Message}, {ex.StackTrace}");
  63. }
  64. return null;
  65. }
  66. #region 心率相关
  67. /// <summary>
  68. /// 读取高频状态
  69. /// </summary>
  70. /// <param name="sn"></param>
  71. /// <returns></returns>
  72. public async Task<PregnancyHeartRateModel?> GetPregnancyHeartRateFreqStatusAsync(string sn)
  73. {
  74. try
  75. {
  76. var key = $"PhrFreqStatus_{sn}";
  77. var status = await RedisHelper.GetAsync(key).ConfigureAwait(false);
  78. if (string.IsNullOrEmpty(status)) return null;
  79. return JsonConvert.DeserializeObject<PregnancyHeartRateModel>(status);
  80. }
  81. catch (Exception ex)
  82. {
  83. _logger.LogWarning($"Redis 发生异常:{ex.Message}, {ex.StackTrace}");
  84. }
  85. return null;
  86. }
  87. public async Task SetPregnancyHeartRateFreqStatusAsync(string sn, PregnancyHeartRateModel status,int expire=-1)
  88. {
  89. try
  90. {
  91. var key = $"PhrFreqStatus_{sn}";
  92. var data=JsonConvert.SerializeObject(status);
  93. await RedisHelper.SetAsync(key, data, expire).ConfigureAwait(false);
  94. }
  95. catch (Exception ex)
  96. {
  97. _logger.LogWarning($"Redis 发生异常:{ex.Message}, {ex.StackTrace}");
  98. }
  99. }
  100. public async Task DelPregnancyHeartRateFreqStatusAsync(string sn)
  101. {
  102. try
  103. {
  104. var key = $"PregnancyHeartRateFreqStatus_{sn}";
  105. await RedisHelper.DelAsync(key).ConfigureAwait(false);
  106. }
  107. catch (Exception ex)
  108. {
  109. _logger.LogWarning($"Redis 发生异常:{ex.Message}, {ex.StackTrace}");
  110. }
  111. }
  112. public async Task SetFetalHeartRateAsync(string serialNo, string sampleTime)
  113. {
  114. try
  115. {
  116. var key = $"{CACHE_KEY_FETALHEARTRATE}_{serialNo}_{sampleTime}";
  117. var time = long.Parse(sampleTime.Length < 13 ? sampleTime.PadRight(13, '0') : sampleTime);
  118. var value = DateTimeUtil.GetDateTimeFromUnixTimeMilliseconds(time).ToString("yyyy-MM-dd HH:mm:ss");
  119. await RedisHelper.SetAsync(key, value, 7200).ConfigureAwait(false);
  120. }
  121. catch (Exception ex)
  122. {
  123. _logger.LogWarning($"Redis 发生异常:{ex.Message}, {ex.StackTrace}");
  124. }
  125. }
  126. public async Task<bool> FetalHeartRateIsExistedAsync(string serialNo, string sampleTime)
  127. {
  128. try
  129. {
  130. var key = $"{CACHE_KEY_FETALHEARTRATE}_{serialNo}_{sampleTime}";
  131. var res = await RedisHelper.GetAsync(key).ConfigureAwait(false);
  132. if (string.IsNullOrEmpty(res))
  133. {
  134. GeneralParam param = new()
  135. {
  136. Filters = new List<QueryFilterCondition>
  137. {
  138. new ()
  139. {
  140. Key=nameof(HisGpsFetalHeartRate.Serialno),
  141. Value=serialNo,
  142. ValueType=QueryValueTypeEnum.String,
  143. Operator=QueryOperatorEnum.Equal
  144. },
  145. new ()
  146. {
  147. Key=nameof(HisGpsFetalHeartRate.SampleTime),
  148. Value=sampleTime,
  149. ValueType=QueryValueTypeEnum.String,
  150. Operator=QueryOperatorEnum.Equal
  151. },
  152. }
  153. };
  154. var isFetalMovementExist = await _hisFetalHeartRateApiClient.GetFirstAsync(param, serialNo[^2..], null, new RequestHeader { RequestId = Guid.NewGuid().ToString("D") });
  155. if (isFetalMovementExist != null)
  156. {
  157. await SetFetalHeartRateAsync(serialNo, sampleTime);
  158. return true;
  159. }
  160. }
  161. else
  162. {
  163. return true;
  164. }
  165. }
  166. catch (Exception ex)
  167. {
  168. _logger.LogWarning($"Redis 发生异常:{ex.Message}, {ex.StackTrace}");
  169. }
  170. return false;
  171. }
  172. #endregion
  173. #region 胎动相关
  174. public async Task SetFetalMovementAsync(string serialNo, string sampleTime, HisGpsFetalMovement fm)
  175. {
  176. try
  177. {
  178. var key = $"{CACHE_KEY_FETALMOVEMENT}_{serialNo}_{sampleTime}";
  179. var time = long.Parse(sampleTime.Length < 13 ? sampleTime.PadRight(13, '0') : sampleTime);
  180. var value = DateTimeUtil.GetDateTimeFromUnixTimeMilliseconds(time).ToString("yyyy-MM-dd HH:mm:ss");
  181. fm.SampleTime = value;
  182. await RedisHelper.SetAsync(key, JsonConvert.SerializeObject(fm), 7200).ConfigureAwait(false);
  183. }
  184. catch (Exception ex)
  185. {
  186. _logger.LogWarning($"Redis 发生异常:{ex.Message}, {ex.StackTrace}");
  187. }
  188. }
  189. public async Task<bool> FetalMovementIsExistedAsync(string serialNo, string sampleTime)
  190. {
  191. try
  192. {
  193. var key = $"{CACHE_KEY_FETALMOVEMENT}_{serialNo}_{sampleTime}";
  194. var res = await RedisHelper.GetAsync(key).ConfigureAwait(false);
  195. if (string.IsNullOrEmpty(res))
  196. {
  197. GeneralParam param = new()
  198. {
  199. Filters = new List<QueryFilterCondition>
  200. {
  201. new ()
  202. {
  203. Key=nameof(HisGpsFetalMovement.Serialno),
  204. Value=serialNo,
  205. ValueType=QueryValueTypeEnum.String,
  206. Operator=QueryOperatorEnum.Equal
  207. },
  208. new ()
  209. {
  210. Key=nameof(HisGpsFetalMovement.SampleTime),
  211. Value=sampleTime,
  212. ValueType=QueryValueTypeEnum.String,
  213. Operator=QueryOperatorEnum.Equal
  214. },
  215. }
  216. };
  217. var isFetalMovementExist = await _hisFetalMovementApiClient.GetFirstAsync(param, serialNo[^2..], null, new RequestHeader { RequestId = Guid.NewGuid().ToString("D") });
  218. if (isFetalMovementExist != null)
  219. {
  220. await SetFetalMovementAsync(serialNo, sampleTime, isFetalMovementExist);
  221. return true;
  222. }
  223. }
  224. else
  225. {
  226. return true;
  227. }
  228. }
  229. catch (Exception ex)
  230. {
  231. _logger.LogWarning($"Redis 发生异常:{ex.Message}, {ex.StackTrace}");
  232. }
  233. return false;
  234. }
  235. #endregion
  236. }
  237. }