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

288 行
13KB

  1. using Confluent.Kafka;
  2. using Microsoft.Extensions.Options;
  3. using Newtonsoft.Json;
  4. using TelpoPush.WanJiaAn.Worker.Common;
  5. using TelpoPush.WanJiaAn.Worker.Models.Config;
  6. using TelpoPush.WanJiaAn.Worker.Models.Enum;
  7. using TelpoPush.WanJiaAn.Worker.Models.MqTemplates;
  8. using TelpoPush.WanJiaAn.Worker.Models.PushTemplates;
  9. using TelpoPush.WanJiaAn.Worker.Service.Cache;
  10. using TelpoPush.WanJiaAn.Worker.Service.Mq;
  11. namespace TelpoPush.WanJiaAn.Worker.Handlers
  12. {
  13. public class WanJiaAnProcess
  14. {
  15. private readonly static object _syncLocker = new object();
  16. private readonly IHostEnvironment _env;
  17. private readonly ILogger<WanJiaAnProcess> _logger;
  18. private readonly HttpHelperAsync _httpHelper;
  19. private readonly RedisUtil _redis;
  20. private readonly MqProcessMessage _serviceMqProcess;
  21. private readonly WanJiaAnConfig _WanJiaAnConfig;
  22. public WanJiaAnProcess(
  23. IHostEnvironment env,
  24. ILogger<WanJiaAnProcess> logger,
  25. HttpHelperAsync httpHelper,
  26. RedisUtil redis,
  27. MqProcessMessage serviceMqProcess,
  28. IOptions<WanJiaAnConfig> WanJiaAnConfig
  29. )
  30. {
  31. _env = env;
  32. _logger = logger;
  33. _httpHelper = httpHelper;
  34. _redis = redis;
  35. _WanJiaAnConfig = WanJiaAnConfig.Value;
  36. _serviceMqProcess = serviceMqProcess;
  37. }
  38. public async Task SendWanJiaAn(string? message, string topic, Headers headers)
  39. {
  40. #region 数据初始验证
  41. bool isHandle = true;
  42. BaseModel model = null;
  43. string imei = "";
  44. if (!string.IsNullOrEmpty(message))
  45. {
  46. model = JsonConvert.DeserializeObject<BaseModel>(message);
  47. if (model != null)
  48. {
  49. var Jo = JsonConvert.DeserializeObject<Dictionary<string, object>>(message);
  50. if (Jo.ContainsKey("device_id"))
  51. imei = Jo["device_id"].ToString();
  52. if (string.IsNullOrEmpty(imei))
  53. {
  54. _logger.LogInformation($"[数据信息不完整] device_id信息不存在:{message}");
  55. isHandle = false;
  56. }
  57. //else
  58. // await _redis.GetGpsDevice(imei);
  59. }
  60. else
  61. {
  62. _logger.LogInformation($"[数据信息不完整] 数据解析异常:{message}");
  63. isHandle = false;
  64. }
  65. }
  66. else
  67. {
  68. _logger.LogInformation($"[数据信息不完整] message数据异常:{message}");
  69. isHandle = false;
  70. }
  71. #endregion
  72. if (isHandle)
  73. {
  74. lock (_syncLocker)
  75. {
  76. #region 注释 Headers 解析
  77. //Headers 解析
  78. //HeadersDto headersDto = new HeadersDto();
  79. //try
  80. //{
  81. // foreach (var item in headers)
  82. // {
  83. // if (item.Key == KafkaHeader.DataType)
  84. // headersDto.DataType = BitConverter.ToInt32(item.GetValueBytes(), 0);
  85. // else if (item.Key == KafkaHeader.AlarmType)
  86. // headersDto.AlarmType = BitConverter.ToInt32(item.GetValueBytes(), 0);
  87. // else if (item.Key == KafkaHeader.OperType)
  88. // headersDto.OperType = BitConverter.ToInt32(item.GetValueBytes(), 0);
  89. // }
  90. //}
  91. //catch (Exception ex)
  92. //{
  93. // _logger.LogError($"当前工作线程Headers异常,{ex.Message}|{ex.Source}|{ex.StackTrace}");
  94. //}
  95. #endregion
  96. try
  97. {
  98. #region 注释
  99. //string dataType = headersDto.DataType != null ? "_" + headersDto.DataType : "";
  100. //string alarmType = headersDto.AlarmType != null ? "_" + headersDto.AlarmType : "";
  101. //string operType = headersDto.OperType != null ? "_" + headersDto.OperType : "";
  102. //string key = dataType + alarmType + operType;
  103. //var dataStatus = _redis.IsDateStatus(model, imei, key).Result;
  104. //过滤
  105. //if (headersDto.DataType == (int)MqDataType.TemperatureInfo
  106. // || headersDto.DataType == (int)MqDataType.Temperature1Info
  107. // || headersDto.DataType == (int)MqDataType.BindDevice
  108. // || headersDto.DataType == (int)MqDataType.WanJiaAnInfo
  109. // || headersDto.DataType == (int)MqDataType.HeartRateInfo
  110. // || headersDto.DataType == (int)MqDataType.HeartRate1Info
  111. // || headersDto.DataType == (int)MqDataType.Spo2Info
  112. // || headersDto.DataType == (int)MqDataType.Spo21Info
  113. // || headersDto.DataType == (int)MqDataType.BloodPressInfo
  114. // || headersDto.DataType == (int)MqDataType.BloodPress1Info
  115. // || headersDto.DataType == (int)MqDataType.SportResult
  116. // || headersDto.DataType == (int)MqDataType.BloodSugar
  117. // )
  118. // dataStatus.isPush = true;
  119. //dataStatus.isPush = true;
  120. //if (dataStatus.isPush)
  121. //{
  122. //switch (topic)
  123. //{
  124. // case "topic.push.third":
  125. // switch (headersDto.DataType)
  126. // {
  127. // case (int)MqDataType.AlarmInfo: //报警消息
  128. // break;
  129. // case (int)MqDataType.TemperatureInfo: //体温消息
  130. // break;
  131. // case (int)MqDataType.WanJiaAnInfo: //定位消息
  132. // // DataServicePusWanJiaAn(model, imei);
  133. // break;
  134. // case (int)MqDataType.StepInfo: //步数消息
  135. // break;
  136. // case (int)MqDataType.BatteryLevelInfo: //电量消息
  137. // break;
  138. // case (int)MqDataType.DeviceCallLog: //设备通话记录
  139. // break;
  140. // case (int)MqDataType.DeviceSmsLog: //设备短信记录
  141. // break;
  142. // case (int)MqDataType.DeviceConfigInfo: //设备配置信息
  143. // break;
  144. // case (int)MqDataType.Status: //设备状态(offline,online)
  145. // break;
  146. // case (int)MqDataType.Active: //设备激活状态
  147. // break;
  148. // case (int)MqDataType.reply: //指令回调
  149. // break;
  150. // case (int)MqDataType.Weather: //天气查询
  151. // break;
  152. // case (int)MqDataType.ReadMsg: //短消息阅读
  153. // break;
  154. // case (int)MqDataType.StudyAINotifyStatusUpload: //学习能力状态
  155. // break;
  156. // case (int)MqDataType.HeartRateInfo: //心率
  157. // break;
  158. // case (int)MqDataType.HeartRate1Info: //周期性心率
  159. // break;
  160. // case (int)MqDataType.Spo2Info: //血氧
  161. // break;
  162. // case (int)MqDataType.Spo21Info: //周期性血氧
  163. // break;
  164. // case (int)MqDataType.Temperature1Info: //周期性报体温数据
  165. // break;
  166. // case (int)MqDataType.DrownReportInfo: //防溺水告警
  167. // break;
  168. // case (int)MqDataType.WearStatusInfo: //手表未佩戴告警
  169. // break;
  170. // case (int)MqDataType.BloodPressInfo: //血压
  171. // break;
  172. // case (int)MqDataType.BloodPress1Info: //周期性血压
  173. // break;
  174. // case (int)MqDataType.PsychInfo: //心理监测
  175. // break;
  176. // case (int)MqDataType.AiCallResult: //AI呼叫结果回调
  177. // case (int)MqDataType.CrossBorder: //越界上报(围栏进出告警)
  178. // break;
  179. // case (int)MqDataType.SportResult: //运动数据上报
  180. // break;
  181. // case (int)MqDataType.BindDevice: //绑定业务
  182. // break;
  183. // case (int)MqDataType.BloodSugar: //血糖业务
  184. // break;
  185. // default:
  186. // break;
  187. // }
  188. // break;
  189. // default:
  190. // break;
  191. //}
  192. //}
  193. //else
  194. // _logger.LogInformation($"数据未处理(历史数据):{JsonConvert.SerializeObject(dataStatus)}");
  195. #endregion
  196. switch (topic)
  197. {
  198. case "topic.wanjiaan.push.telpo":
  199. DataServicePusWanJiaAn(model);
  200. break;
  201. default:
  202. break;
  203. }
  204. }
  205. catch (Exception ex)
  206. {
  207. _logger.LogError($"当前工作线程异常: {ex.Message}|{ex.Source}|{ex.StackTrace}");
  208. }
  209. }
  210. }
  211. }
  212. //位置
  213. public async Task DataServicePusWanJiaAn(BaseModel model)
  214. {
  215. if (model.data != null)
  216. {
  217. var alarmEvent = JsonConvert.DeserializeObject<MqAlarmEventTemplate>(model.data.ToString());
  218. if (alarmEvent?.alarm_event != null)
  219. {
  220. var data = alarmEvent?.alarm_event;
  221. if (data?.event_type == 2 || data?.event_type == 52)//2:哭声检测;52:遮脸提醒
  222. {
  223. string event_id = data.event_id;
  224. string device_id = model.device_id;
  225. string user_id = model.user_id;
  226. int event_type = data.event_type;
  227. int report_type = data.report_type;
  228. DateTime event_time = TimeHelper.ConvertToLocalDateTime(model.event_time);
  229. DateTime event_start = TimeHelper.ConvertToLocalDateTime(data.event_start);
  230. if (!string.IsNullOrEmpty(data.event_end))
  231. {
  232. DateTime event_end = TimeHelper.ConvertToLocalDateTime(data.event_end);
  233. }
  234. if (!string.IsNullOrEmpty(data.video_start))
  235. {
  236. DateTime video_start = TimeHelper.ConvertToLocalDateTime(data.video_start);
  237. }
  238. if (!string.IsNullOrEmpty(data.video_end))
  239. {
  240. DateTime video_end = TimeHelper.ConvertToLocalDateTime(data.video_end);
  241. }
  242. string image_url = data.image;
  243. string video_url = data.url;
  244. string remark = JsonConvert.SerializeObject(model);
  245. DateTime create_time = DateTime.Now;
  246. var obj = new { };
  247. }
  248. }
  249. }
  250. }
  251. }
  252. }