万佳安设备数据
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

354 行
17KB

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