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.

DeviceCacheManager.cs 9.9KB

6 ay önce
6 ay önce
6 ay önce
6 ay önce
6 ay önce
6 ay önce
6 ay önce
6 ay önce
6 ay önce
6 ay önce
6 ay önce
6 ay önce
6 ay önce
6 ay önce
6 ay önce
6 ay önce
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  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. return (JObject)JsonConvert.DeserializeObject(config)!;
  58. }
  59. catch (Exception ex)
  60. {
  61. _logger.LogWarning($"Redis DB7发生异常:{ex.Message}, {ex.StackTrace}");
  62. }
  63. return null;
  64. }
  65. #region 心率相关
  66. /// <summary>
  67. /// 读取高频状态
  68. /// </summary>
  69. /// <param name="sn"></param>
  70. /// <returns></returns>
  71. public async Task<PregnancyHeartRateModel?> GetPregnancyHeartRateFreqStatusAsync(string sn)
  72. {
  73. try
  74. {
  75. var key = $"PregnancyHeartRateFreqStatus_{sn}";
  76. var status = await RedisHelper.GetAsync(key).ConfigureAwait(false);
  77. if (string.IsNullOrEmpty(status)) return null;
  78. return JsonConvert.DeserializeObject<PregnancyHeartRateModel>(status);
  79. }
  80. catch (Exception ex)
  81. {
  82. _logger.LogWarning($"Redis 发生异常:{ex.Message}, {ex.StackTrace}");
  83. }
  84. return null;
  85. }
  86. public async Task SetPregnancyHeartRateFreqStatusAsync(string sn, PregnancyHeartRateModel status,int expire=-1)
  87. {
  88. try
  89. {
  90. var key = $"PregnancyHeartRateFreqStatus_{sn}";
  91. var data=JsonConvert.SerializeObject(status);
  92. await RedisHelper.SetAsync(key, data, expire).ConfigureAwait(false);
  93. }
  94. catch (Exception ex)
  95. {
  96. _logger.LogWarning($"Redis 发生异常:{ex.Message}, {ex.StackTrace}");
  97. }
  98. }
  99. public async Task DelPregnancyHeartRateFreqStatusAsync(string sn)
  100. {
  101. try
  102. {
  103. var key = $"PregnancyHeartRateFreqStatus_{sn}";
  104. await RedisHelper.DelAsync(key).ConfigureAwait(false);
  105. }
  106. catch (Exception ex)
  107. {
  108. _logger.LogWarning($"Redis 发生异常:{ex.Message}, {ex.StackTrace}");
  109. }
  110. }
  111. public async Task SetFetalHeartRateAsync(string serialNo, string sampleTime)
  112. {
  113. try
  114. {
  115. var key = $"{CACHE_KEY_FETALHEARTRATE}_{serialNo}_{sampleTime}";
  116. var time = long.Parse(sampleTime.Length < 13 ? sampleTime.PadRight(13, '0') : sampleTime);
  117. var value = DateTimeUtil.GetDateTimeFromUnixTimeMilliseconds(time).ToString("yyyy-MM-dd HH:mm:ss");
  118. await RedisHelper.SetAsync(key, value, 7200).ConfigureAwait(false);
  119. }
  120. catch (Exception ex)
  121. {
  122. _logger.LogWarning($"Redis 发生异常:{ex.Message}, {ex.StackTrace}");
  123. }
  124. }
  125. public async Task<bool> FetalHeartRateIsExistedAsync(string serialNo, string sampleTime)
  126. {
  127. try
  128. {
  129. var key = $"{CACHE_KEY_FETALHEARTRATE}_{serialNo}_{sampleTime}";
  130. var res = await RedisHelper.GetAsync(key).ConfigureAwait(false);
  131. if (string.IsNullOrEmpty(res))
  132. {
  133. GeneralParam param = new()
  134. {
  135. Filters = new List<QueryFilterCondition>
  136. {
  137. new ()
  138. {
  139. Key=nameof(HisGpsFetalHeartRate.Serialno),
  140. Value=serialNo,
  141. ValueType=QueryValueTypeEnum.String,
  142. Operator=QueryOperatorEnum.Equal
  143. },
  144. new ()
  145. {
  146. Key=nameof(HisGpsFetalHeartRate.SampleTime),
  147. Value=sampleTime,
  148. ValueType=QueryValueTypeEnum.String,
  149. Operator=QueryOperatorEnum.Equal
  150. },
  151. }
  152. };
  153. var isFetalMovementExist = await _hisFetalHeartRateApiClient.GetFirstAsync(param, serialNo[^2..], null, new RequestHeader { RequestId = Guid.NewGuid().ToString("D") });
  154. if (isFetalMovementExist != null)
  155. {
  156. await SetFetalHeartRateAsync(serialNo, sampleTime);
  157. return true;
  158. }
  159. }
  160. else
  161. {
  162. return true;
  163. }
  164. }
  165. catch (Exception ex)
  166. {
  167. _logger.LogWarning($"Redis 发生异常:{ex.Message}, {ex.StackTrace}");
  168. }
  169. return false;
  170. }
  171. #endregion
  172. #region 胎动相关
  173. public async Task SetFetalMovementAsync(string serialNo, string sampleTime, HisGpsFetalMovement fm)
  174. {
  175. try
  176. {
  177. var key = $"{CACHE_KEY_FETALMOVEMENT}_{serialNo}_{sampleTime}";
  178. var time = long.Parse(sampleTime.Length < 13 ? sampleTime.PadRight(13, '0') : sampleTime);
  179. var value = DateTimeUtil.GetDateTimeFromUnixTimeMilliseconds(time).ToString("yyyy-MM-dd HH:mm:ss");
  180. fm.SampleTime = value;
  181. await RedisHelper.SetAsync(key, JsonConvert.SerializeObject(fm), 7200).ConfigureAwait(false);
  182. }
  183. catch (Exception ex)
  184. {
  185. _logger.LogWarning($"Redis 发生异常:{ex.Message}, {ex.StackTrace}");
  186. }
  187. }
  188. public async Task<bool> FetalMovementIsExistedAsync(string serialNo, string sampleTime)
  189. {
  190. try
  191. {
  192. var key = $"{CACHE_KEY_FETALMOVEMENT}_{serialNo}_{sampleTime}";
  193. var res = await RedisHelper.GetAsync(key).ConfigureAwait(false);
  194. if (string.IsNullOrEmpty(res))
  195. {
  196. GeneralParam param = new()
  197. {
  198. Filters = new List<QueryFilterCondition>
  199. {
  200. new ()
  201. {
  202. Key=nameof(HisGpsFetalMovement.Serialno),
  203. Value=serialNo,
  204. ValueType=QueryValueTypeEnum.String,
  205. Operator=QueryOperatorEnum.Equal
  206. },
  207. new ()
  208. {
  209. Key=nameof(HisGpsFetalMovement.SampleTime),
  210. Value=sampleTime,
  211. ValueType=QueryValueTypeEnum.String,
  212. Operator=QueryOperatorEnum.Equal
  213. },
  214. }
  215. };
  216. var isFetalMovementExist = await _hisFetalMovementApiClient.GetFirstAsync(param, serialNo[^2..], null, new RequestHeader { RequestId = Guid.NewGuid().ToString("D") });
  217. if (isFetalMovementExist != null)
  218. {
  219. await SetFetalMovementAsync(serialNo, sampleTime, isFetalMovementExist);
  220. return true;
  221. }
  222. }
  223. else
  224. {
  225. return true;
  226. }
  227. }
  228. catch (Exception ex)
  229. {
  230. _logger.LogWarning($"Redis 发生异常:{ex.Message}, {ex.StackTrace}");
  231. }
  232. return false;
  233. }
  234. #endregion
  235. }
  236. }