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.

135 lines
5.5KB

  1. using HealthMonitor.Common;
  2. using HealthMonitor.Common.helper;
  3. using HealthMonitor.Service.Etcd;
  4. using HealthMonitor.Service.Resolver.Interface;
  5. using HealthMonitor.Service.Sub;
  6. using HealthMonitor.Service.Sub.Topic.Model;
  7. using Microsoft.Extensions.Logging;
  8. using Newtonsoft.Json;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Linq;
  12. using System.Text;
  13. using System.Threading.Tasks;
  14. using TelpoDataService.Util.Entities.GpsLocationHistory;
  15. namespace HealthMonitor.Service.Resolver
  16. {
  17. public class PregnancyHeartRateResolver : IResolver
  18. {
  19. private readonly ILogger<PregnancyHeartRateResolver> _logger;
  20. private readonly AsyncLocal<string> _messageId = new();
  21. private readonly AsyncLocal<HisGpsHeartRate> _msgData = new();
  22. private readonly HttpHelper _httpHelper = default!;
  23. private readonly EtcdService _serviceEtcd;
  24. public PregnancyHeartRateResolver(ILogger<PregnancyHeartRateResolver> logger, HttpHelper httpHelper, EtcdService serviceEtcd)
  25. {
  26. _logger = logger;
  27. _httpHelper = httpHelper;
  28. _serviceEtcd = serviceEtcd;
  29. }
  30. public void SetResolveInfo(PackageMsgModel msg)
  31. {
  32. var topicHmPregnancyHeartRate = JsonConvert.DeserializeObject<TopicHmPregnancyHeartRate>(msg.DetailData.ToString()!);
  33. _messageId.Value = msg.MessageId;
  34. _msgData.Value = new HisGpsHeartRate()
  35. {
  36. HeartRateId = topicHmPregnancyHeartRate!.PregnancyHeartRateId,
  37. MessageId = topicHmPregnancyHeartRate!.MessageId,
  38. Serialno = topicHmPregnancyHeartRate!.Serialno,
  39. HeartRate= topicHmPregnancyHeartRate.PregnancyHeartRate,
  40. LastUpdate = DateTimeUtil.GetDateTimeFromUnixTimeMilliseconds(SafeType.SafeInt64(topicHmPregnancyHeartRate.LastUpdate) / 1000000),
  41. CreateTime = DateTimeUtil.GetDateTimeFromUnixTimeMilliseconds(SafeType.SafeInt64(topicHmPregnancyHeartRate.CreateTime) / 1000000),
  42. Method = topicHmPregnancyHeartRate!.Method,
  43. IsDisplay = topicHmPregnancyHeartRate!.IsDisplay ? 1 : 0
  44. };
  45. }
  46. public override string ToString()
  47. {
  48. return $"{nameof(PregnancyHeartRateResolver)}[{_messageId.Value}]";
  49. }
  50. public async Task ExecuteMessageAsync()
  51. {
  52. //throw new NotImplementedException();
  53. var messageId = _messageId.Value;
  54. var phr = _msgData.Value!;
  55. #region 定时下发触发器
  56. var key = $"health_moniter/schedule_push/pregnancy_heart_rate/imei/{phr.Serialno}";
  57. var schedule_push = await _serviceEtcd.GetValAsync(key).ConfigureAwait(false);
  58. if (string.IsNullOrWhiteSpace(schedule_push))
  59. {
  60. // 注册首次下推
  61. #if DEBUG
  62. // await _serviceEtcd.PutValAsync(key, result, 60*1, false).ConfigureAwait(false);
  63. var interval = 0;
  64. // 获取当前时间
  65. DateTime now = DateTime.Now;
  66. // 计算距离下一个$interval天后的8点的时间间隔
  67. DateTime nextRunTime = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute + 1, 58).AddDays(interval);
  68. TimeSpan timeUntilNextRun = nextRunTime - now;
  69. // 如果当前时间已经超过了8点,将等待到明天后的8点
  70. if (timeUntilNextRun < TimeSpan.Zero)
  71. {
  72. timeUntilNextRun = timeUntilNextRun.Add(TimeSpan.FromMinutes(1));
  73. nextRunTime += timeUntilNextRun;
  74. }
  75. var ttl = (long)timeUntilNextRun.TotalSeconds;
  76. var data = new
  77. {
  78. imei = phr.Serialno,
  79. create_time = now.ToString("yyyy-MM-dd HH:mm:ss"),
  80. ttl,
  81. next_run_time = nextRunTime.ToString("yyyy-MM-dd HH:mm:ss")
  82. };
  83. var result = JsonConvert.SerializeObject(data);
  84. await _serviceEtcd.PutValAsync(key, result, ttl, false).ConfigureAwait(false);
  85. #else
  86. var interval = 0;
  87. // 获取当前时间
  88. DateTime now = DateTime.Now;
  89. var rand=new Random();
  90. var pushSec = rand.Next(59);
  91. int pushMin= int.TryParse(phr.Serialno.AsSpan(phr.Serialno.Length - 1), out pushMin) ? pushMin : 10;
  92. // 计算距离下一个$interval天后的8点的时间间隔
  93. DateTime nextRunTime = new DateTime(now.Year, now.Month, now.Day, 18, pushMin, pushSec).AddDays(interval);
  94. TimeSpan timeUntilNextRun = nextRunTime - now;
  95. if (timeUntilNextRun < TimeSpan.Zero)
  96. {
  97. timeUntilNextRun = timeUntilNextRun.Add(TimeSpan.FromDays(1));
  98. nextRunTime += TimeSpan.FromDays(1);
  99. }
  100. var ttl =(long)timeUntilNextRun.TotalSeconds;
  101. var data = new
  102. {
  103. imei = phr.Serialno,
  104. create_time = now.ToString("yyyy-MM-dd HH:mm:ss"),
  105. ttl,
  106. next_run_time = nextRunTime.ToString("yyyy-MM-dd HH:mm:ss")
  107. };
  108. var result = JsonConvert.SerializeObject(data);
  109. await _serviceEtcd.PutValAsync(key, result,ttl, false).ConfigureAwait(false);
  110. #endif
  111. }
  112. #endregion
  113. }
  114. }
  115. }