|
- using Confluent.Kafka;
- using Microsoft.Extensions.Options;
- using Newtonsoft.Json;
- using TelpoPush.Position.Worker.Common;
- using TelpoPush.Position.Worker.Models.Config;
- using TelpoPush.Position.Worker.Models.Enum;
- using TelpoPush.Position.Worker.Models.MqTemplates;
- using TelpoPush.Position.Worker.Models.PushTemplates;
- using TelpoPush.Position.Worker.Service.Cache;
- using TelpoPush.Position.Worker.Service.Mq;
-
- namespace TelpoPush.Position.Worker.Handlers
- {
- public class PositionProcess
- {
- private readonly static object _syncLocker = new object();
- private readonly IHostEnvironment _env;
- private readonly ILogger<PositionProcess> _logger;
- private readonly HttpHelperAsync _httpHelper;
- private readonly RedisUtil _redis;
- private readonly MqProcessMessage _serviceMqProcess;
- private readonly PositionConfig _positionConfig;
-
- public PositionProcess(
- IHostEnvironment env,
- ILogger<PositionProcess> logger,
- HttpHelperAsync httpHelper,
- RedisUtil redis,
- MqProcessMessage serviceMqProcess,
- IOptions<PositionConfig> positionConfig
- )
- {
- _env = env;
- _logger = logger;
- _httpHelper = httpHelper;
- _redis = redis;
- _positionConfig = positionConfig.Value;
- _serviceMqProcess = serviceMqProcess;
-
- }
-
- public async Task SendPosition(string? message, string topic, Headers headers)
- {
- #region 数据初始验证
- bool isHandle = true;
- BaseModel model = null;
- string imei = "";
- if (!string.IsNullOrEmpty(message))
- {
- model = JsonConvert.DeserializeObject<BaseModel>(message);
- if (model != null)
- {
- var Jo = JsonConvert.DeserializeObject<Dictionary<string, object>>(model.data.ToString());
- if (Jo.ContainsKey("imei"))
- imei = Jo["imei"].ToString();
- if (Jo.ContainsKey("Imei"))
- imei = Jo["Imei"].ToString();
- else if (Jo.ContainsKey("nickname"))
- imei = Jo["nickname"].ToString();
- if (string.IsNullOrEmpty(imei))
- {
- _logger.LogInformation($"[数据信息不完整] imei信息不存在:{message}");
- isHandle = false;
- }
- else
- await _redis.GetGpsDevice(imei);
- }
- else
- {
- _logger.LogInformation($"[数据信息不完整] 数据解析异常:{message}");
- isHandle = false;
- }
- }
- else
- {
- _logger.LogInformation($"[数据信息不完整] message数据异常:{message}");
- isHandle = false;
- }
- #endregion
- if (isHandle)
- {
- lock (_syncLocker)
- {
- //Headers 解析
- HeadersDto headersDto = new HeadersDto();
- try
- {
- foreach (var item in headers)
- {
- if (item.Key == KafkaHeader.DataType)
- headersDto.DataType = BitConverter.ToInt32(item.GetValueBytes(), 0);
- else if (item.Key == KafkaHeader.AlarmType)
- headersDto.AlarmType = BitConverter.ToInt32(item.GetValueBytes(), 0);
- else if (item.Key == KafkaHeader.OperType)
- headersDto.OperType = BitConverter.ToInt32(item.GetValueBytes(), 0);
- }
- }
- catch (Exception ex)
- {
- _logger.LogError($"当前工作线程Headers异常,{ex.Message}|{ex.Source}|{ex.StackTrace}");
- }
- try
- {
- #region 注释
- //string dataType = headersDto.DataType != null ? "_" + headersDto.DataType : "";
- //string alarmType = headersDto.AlarmType != null ? "_" + headersDto.AlarmType : "";
- //string operType = headersDto.OperType != null ? "_" + headersDto.OperType : "";
- //string key = dataType + alarmType + operType;
- //var dataStatus = _redis.IsDateStatus(model, imei, key).Result;
- //过滤
- //if (headersDto.DataType == (int)MqDataType.TemperatureInfo
- // || headersDto.DataType == (int)MqDataType.Temperature1Info
- // || headersDto.DataType == (int)MqDataType.BindDevice
- // || headersDto.DataType == (int)MqDataType.PositionInfo
- // || headersDto.DataType == (int)MqDataType.HeartRateInfo
- // || headersDto.DataType == (int)MqDataType.HeartRate1Info
- // || headersDto.DataType == (int)MqDataType.Spo2Info
- // || headersDto.DataType == (int)MqDataType.Spo21Info
- // || headersDto.DataType == (int)MqDataType.BloodPressInfo
- // || headersDto.DataType == (int)MqDataType.BloodPress1Info
- // || headersDto.DataType == (int)MqDataType.SportResult
- // || headersDto.DataType == (int)MqDataType.BloodSugar
- // )
- // dataStatus.isPush = true;
- //dataStatus.isPush = true;
- //if (dataStatus.isPush)
- //{
- //switch (topic)
- //{
- // case "topic.push.third":
- // switch (headersDto.DataType)
- // {
- // case (int)MqDataType.AlarmInfo: //报警消息
- // break;
- // case (int)MqDataType.TemperatureInfo: //体温消息
- // break;
- // case (int)MqDataType.PositionInfo: //定位消息
- // // DataServicePusPosition(model, imei);
- // break;
- // case (int)MqDataType.StepInfo: //步数消息
-
- // break;
- // case (int)MqDataType.BatteryLevelInfo: //电量消息
- // break;
- // case (int)MqDataType.DeviceCallLog: //设备通话记录
-
- // break;
- // case (int)MqDataType.DeviceSmsLog: //设备短信记录
-
- // break;
- // case (int)MqDataType.DeviceConfigInfo: //设备配置信息
-
- // break;
- // case (int)MqDataType.Status: //设备状态(offline,online)
-
- // break;
- // case (int)MqDataType.Active: //设备激活状态
- // break;
- // case (int)MqDataType.reply: //指令回调
-
- // break;
- // case (int)MqDataType.Weather: //天气查询
-
- // break;
- // case (int)MqDataType.ReadMsg: //短消息阅读
-
- // break;
- // case (int)MqDataType.StudyAINotifyStatusUpload: //学习能力状态
-
- // break;
- // case (int)MqDataType.HeartRateInfo: //心率
-
- // break;
- // case (int)MqDataType.HeartRate1Info: //周期性心率
-
- // break;
- // case (int)MqDataType.Spo2Info: //血氧
-
- // break;
- // case (int)MqDataType.Spo21Info: //周期性血氧
-
- // break;
- // case (int)MqDataType.Temperature1Info: //周期性报体温数据
-
- // break;
- // case (int)MqDataType.DrownReportInfo: //防溺水告警
-
- // break;
- // case (int)MqDataType.WearStatusInfo: //手表未佩戴告警
-
- // break;
- // case (int)MqDataType.BloodPressInfo: //血压
-
- // break;
- // case (int)MqDataType.BloodPress1Info: //周期性血压
-
- // break;
- // case (int)MqDataType.PsychInfo: //心理监测
-
- // break;
- // case (int)MqDataType.AiCallResult: //AI呼叫结果回调
-
- // case (int)MqDataType.CrossBorder: //越界上报(围栏进出告警)
-
- // break;
- // case (int)MqDataType.SportResult: //运动数据上报
-
- // break;
- // case (int)MqDataType.BindDevice: //绑定业务
-
- // break;
- // case (int)MqDataType.BloodSugar: //血糖业务
-
- // break;
- // default:
- // break;
- // }
- // break;
- // default:
- // break;
- //}
- //}
- //else
- // _logger.LogInformation($"数据未处理(历史数据):{JsonConvert.SerializeObject(dataStatus)}");
-
- #endregion
-
- switch (topic)
- {
- case "topic.push.position":
- switch (headersDto.DataType)
- {
- case (int)MqDataType.PositionInfo: //定位消息
- DataServicePusPosition(model, imei);
- break;
- default:
- break;
- }
- break;
- default:
- break;
- }
-
- }
- catch (Exception ex)
- {
- _logger.LogError($"当前工作线程异常: {ex.Message}|{ex.Source}|{ex.StackTrace}");
- }
- }
- }
- }
-
- //位置
- public async Task DataServicePusPosition(BaseModel model, string imei)
- {
- var device = await _redis.GetGpsDevice(imei);
- if (device != null)
- {
- await _redis.SetPersonInfoHash(imei); //更行设备用户详情缓存
- var position = JsonConvert.DeserializeObject<MqPositionTemplate>(model.data.ToString());
- if ((int)position.locationType != 2) // 限制条件:locationType=2 LBS定位不推送
- {
- Dictionary<string, int> dicHeader = new Dictionary<string, int>();
- dicHeader.Add(MqHeader.DataType, (int)MqDataType.PositionInfo);
-
- #region 定位-围栏推送服务
- var fenceObj = new
- {
- messageId = model.messageId,
- topic = "topic.push.position",
- time = model.time,
- data = new
- {
- DeviceId = device.deviceId,
- imei = position.imei,
- wifiInfo = position.wifiMacs,
- address = position.address,
- baiduLatitude = position.baiduLatitude,
- baiduLongitude = position.baiduLongitude,
- gaodeLatitude = position.gaodeLatitude,
- gaodeLongitude = position.gaodeLongitude,
- originalLatitude = position.originalLatitude,
- originalLongitude = position.originalLongitude,
- locationType = position.locationType,
- LastUpdate = model.time,
- UtcDate = DateTime.Parse(model.time).AddHours(-8).ToString("yyyy-MM-dd HH:mm:ss"),
- Radius = position.radius,
- }
- };
- await _serviceMqProcess.ProcessFenceServer(imei, fenceObj, dicHeader, "定位-围栏");
- #endregion
-
- #region 定位-JAVA数据推送服务
- var settingInfos = await _redis.GetManufactorPushSettingHash(imei, _positionConfig.RzlManufactorId, (int)MqDataType.PositionInfo);
- settingInfos = null;
- if (settingInfos != null)
- {
- Dictionary<string, object> dic = new Dictionary<string, object>();
- dic.Add("imei", imei);
- dic.Add("locationType", (int)position.locationType);
- dic.Add("altitude", position.radius);
- dic.Add("gaodeLongitude", position.gaodeLongitude);
- dic.Add("gaodeLatitude", position.gaodeLatitude);
- dic.Add("originalLongitude", position.originalLongitude);
- dic.Add("originalLatitude", position.originalLatitude);
- dic.Add("baiduLongitude", position.baiduLongitude);
- dic.Add("baiduLatitude", position.baiduLatitude);
- dic.Add("address", position.address);
- if (!string.IsNullOrEmpty(position.wifiMacs))
- {
- position.wifiMacs = position.wifiMacs.Replace(",|", "|").Trim(',');
- dic.Add("wifiMacs", position.wifiMacs);
- }
- dic.Add("dataTime", model.time);
- MultipartFormDataContent mfdc = Utils.GetMultipartFormDataContent(dic, _positionConfig.RzlManufactorId, ref dic);
- var result = await _httpHelper.PostFormAsync(settingInfos.pushUrl, mfdc);
- _logger.LogInformation($"[定位-RZL数据-替换JAVA推送服务<{imei}>] url:{settingInfos.pushUrl},参数:{JsonConvert.SerializeObject(dic)},结果:{result}");
- }
- else
- {
- if (!string.IsNullOrEmpty(position.wifiMacs))
- position.wifiMacs = position.wifiMacs.Replace(",|", "|").Trim(',');
- PushPositionTemplate positionInfo = new PushPositionTemplate //上报存储位置信息
- {
- MessageId = model.messageId,
- Imei = imei,
- Altitude = position.radius,
- BaiduLatitude = position.baiduLatitude,
- BaiduLongitude = position.baiduLongitude,
- GaodeLatitude = position.gaodeLatitude,
- GaodeLongitude = position.gaodeLongitude,
- LocationType = (int)position.locationType,
- OriginalLatitude = position.originalLatitude,
- OriginalLongitude = position.originalLongitude,
- Address = position.address,
- wifiMacs = position.wifiMacs,
- Time = model.time
- };
- await _serviceMqProcess.ProcessDataPushServer(imei, positionInfo, dicHeader, "定位");
- }
- #endregion
- }
- }
- }
- }
- }
|