|
- using GpsCardGatewayPosition.Common;
- using GpsCardGatewayPosition.Model.Cache;
- using GpsCardGatewayPosition.Model.Config;
- using GpsCardGatewayPosition.Model.Enum;
- using GpsCardGatewayPosition.Service.Biz.Location.Dto.Wayz;
- using GpsCardGatewayPosition.Service.Cache;
- using GpsCardGatewayPosition.Service.MqProducer;
- using Microsoft.Extensions.Logging;
- using Microsoft.Extensions.Options;
- using Newtonsoft.Json;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using TelpoDataService.Util.Clients;
- using TelpoDataService.Util.Entities.GpsCard;
- using TelpoDataService.Util.Entities.GpsLocationHistory;
- using TelpoDataService.Util;
- using GpsCardGatewayPosition.Service.Dto;
- using GpsCardGatewayPosition.Service.MqProducer.Model;
- using GpsCardGatewayPosition.Service.Biz.Location.Dto;
-
- namespace GpsCardGatewayPosition.Service.Biz.Location
- {
- public class LocationLogic
- {
- private readonly ServiceConfig _configService;
- private readonly MqProcessLogic _serviceMqProcess;
- private readonly DeviceCacheManager _deviceCacheMgr;
- private readonly GpsCardAccessorClient<GpsDeviceStatus> _deviceStatusApiClient;
- private readonly GpsLocationHistoryAccessorClient<HisGpsDeviceData> _hisDeviceDataApiClient;
- private readonly GpsLocationHistoryAccessorClient<History> _hisApiClient;
-
- private readonly ILogger<LocationLogic> _logger;
-
- private readonly int DEFAULT_LBS_ACCEPT_DISTANCE = 2000;
-
- public LocationLogic(IOptions<ServiceConfig> optConfigService, MqProcessLogic serviceMqProcess, DeviceCacheManager deviceCacheMgr,
- GpsCardAccessorClient<GpsDeviceStatus> deviceStatusApiClient, GpsLocationHistoryAccessorClient<HisGpsDeviceData> hisDeviceDataApiClient, GpsLocationHistoryAccessorClient<History> hisApiClient,
- ILogger<LocationLogic> logger)
- {
- _configService = optConfigService.Value;
- _serviceMqProcess = serviceMqProcess;
- _deviceCacheMgr = deviceCacheMgr;
-
- _deviceStatusApiClient = deviceStatusApiClient;
- _hisDeviceDataApiClient = hisDeviceDataApiClient;
- _hisApiClient = hisApiClient;
-
- _logger = logger;
- }
-
-
- #region 更新设备最后位置信息状态
- public async Task<GeneralResult> UpdateDeviceStatusAsync(string messageId, GpsDeviceStatus deviceStatus)
- {
- var result = new GeneralResult();
- try
- {
- var sn = deviceStatus.Serialno;
-
- var url = _configService.TelpoDataUrl;
- if (await _deviceCacheMgr.GetDeviceStatusBySerialNoAsync(messageId, sn) != null)
- {
- await _deviceStatusApiClient.UpdateAsync(deviceStatus, new RequestHeader { RequestId = messageId }).ConfigureAwait(false);
- }
- else
- {
- await _deviceStatusApiClient.AddAsync(deviceStatus, new RequestHeader { RequestId = messageId }).ConfigureAwait(false);
- }
-
-
- _deviceCacheMgr.SetDeviceStatus(deviceStatus);
- result.IsSuccess = true;
- }
- catch (Exception ex)
- {
- result.Message = $"更新设备最后位置信息状态发生异常:{ex.Message}, {ex.StackTrace}";
- }
-
- return result;
- }
- #endregion
-
- #region 电子围栏处理
- public async void ProcessGeofence(LocationInfo loc, string messageId)
- {
- var fence = new FenceLocationPlus()
- {
- DeviceId = loc.DeviceId,
- imei = loc.SerialNo,
- address = loc.Address,
- baiduLatitude = loc.BaiduLat,
- baiduLongitude = loc.BaiduLng,
- gaodeLatitude = loc.GLat,
- gaodeLongitude = loc.GLng,
- originalLatitude = loc.OLat,
- originalLongitude = loc.OLng,
- LastUpdate = loc.LastUpdate!.Value.ToString("yyyy-MM-dd HH:mm:ss"),
- UtcDate = loc.UtcDate!.Value.ToString("yyyy-MM-dd HH:mm:ss"),
- Radius = SafeType.SafeInt(loc.DeviceStatus),
- };
- await _serviceMqProcess.ProcessFencePlusAsync(fence, loc.LastUpdate.Value.ToString("yyyy-MM-dd HH:mm:ss"), messageId);
- }
- public async Task ProcessGeofenceAsync(LocationInfo loc, string messageId)
- {
- var fence = new FenceLocationPlus()
- {
- DeviceId = loc.DeviceId,
- imei = loc.SerialNo,
- address = loc.Address,
- baiduLatitude = loc.BaiduLat,
- baiduLongitude = loc.BaiduLng,
- gaodeLatitude = loc.GLat,
- gaodeLongitude = loc.GLng,
- originalLatitude = loc.OLat,
- originalLongitude = loc.OLng,
- LastUpdate = loc.LastUpdate!.Value.ToString("yyyy-MM-dd HH:mm:ss"),
- UtcDate = loc.UtcDate!.Value.ToString("yyyy-MM-dd HH:mm:ss"),
- Radius = SafeType.SafeInt(loc.DeviceStatus),
- };
- await _serviceMqProcess.ProcessFencePlusAsync(fence, loc.LastUpdate.Value.ToString("yyyy-MM-dd HH:mm:ss"), messageId);
- }
- #endregion
-
- #region 保存原始数据包
- public async Task<GeneralResult> SavePackageAsync(string messageId, HisGpsDeviceData data)
- {
- var result = new GeneralResult();
- try
- {
- await _hisDeviceDataApiClient.AddAsync(data, header: new RequestHeader { RequestId = messageId }).ConfigureAwait(false);
-
- result.Message = $"保存原始数据包成功!";
- result.IsSuccess = true;
- }
- catch (Exception ex)
- {
- result.Message = $"保存原始数据包发生异常:{ex.Message}, {ex.StackTrace}!";
- }
- return result;
- }
- #endregion
-
- #region 保存历史位置
-
-
-
-
-
-
-
-
-
- public async Task<LocationServiceResult> AddLocationAsync(string messageId, LocationInfo loc, DevicePositionStatus positionStatus, long sentTicks, string cityCode = "", int? steps = default, object requestPostionData = default)
- {
- var result = new LocationServiceResult();
-
- var requestPostionVar = string.Empty;
- var requestPostionVarObj = new object(); ;
- if (requestPostionData is RequestLocationInfo<WayzWifiRequest> requestPostion && loc.LocationType == 3)
- {
- requestPostionVarObj = new
- {
- Location = new
- {
- Wifis = requestPostion.RequestData.Location.Wifis.Select(i => new { i.MacAddress, i.SignalStrength }).ToList()
- }
- };
- requestPostionVar = JsonConvert.SerializeObject(requestPostionVarObj);
- }
- else
- {
- requestPostionVar = null;
- }
-
- try
- {
- var url = _configService.TelpoDataUrl;
- var model = new History
- {
- LocationId = Guid.NewGuid().ToString("D"),
- DeviceId = loc.DeviceId,
- Serialno = loc.SerialNo,
- Utctime = loc.UtcDate,
- LastUpdate = loc.LastUpdate,
- IsStop = loc.IsStop ?? false,
- IsRedressed = loc.IsRedressed,
- Speed = loc.Speed,
- Course = loc.Course,
- LocationType = loc.LocationType,
- Olat = loc.OLat,
- Olng = loc.OLng,
- BaiduLat = loc.BaiduLat,
- BaiduLng = loc.BaiduLng,
- Glat = loc.GLat,
- Glng = loc.GLng,
- DeviceStatus = loc.DeviceStatus,
- Address = loc.Address,
- Remarks = $"{loc.Remarks}#{messageId}#{DateTime.Now}",
- RequestPosition = requestPostionVar,
-
-
- };
- await _hisApiClient.AddAsync(model, model.Serialno, header: new RequestHeader { RequestId = messageId }).ConfigureAwait(false);
-
- result.Message = "保存历史位置成功!";
- result.IsSuccess = true;
- }
- catch (Exception ex)
- {
- result.Message = $"保存历史位置发生异常: message:{ex.Message}, {ex.StackTrace}";
- }
-
- if (positionStatus == null) positionStatus = new DevicePositionStatus();
-
- var cache = positionStatus.LastPosition;
- if (cache == null || cache.SentTicks < sentTicks)
- {
-
-
-
-
-
-
- var now = DateTime.Now;
- var positionCache = new DevicePositionStatus.PositionCache
- {
- Address = loc.Address,
- BaiduLat = loc.BaiduLat,
- BaiduLon = loc.BaiduLng,
- CityCode = cityCode,
- GaodeLat = loc.GLat,
- GaodeLon = loc.GLng,
- OriginalLat = loc.OLat,
- OriginalLon = loc.OLng,
- LocationType = loc.LocationType,
-
- Steps = steps,
-
-
- OriginalTime = loc.LastUpdate ?? now,
- UpdateTime = loc.LastUpdate ?? now,
- ExpiredTime = DateTime.Now.AddHours(1),
- Radius = Convert.ToInt32(loc.DeviceStatus),
- SentTicks = sentTicks,
- Province = loc.Province,
- City = loc.City,
- District = loc.District
- };
-
-
- if (loc.LocationType != (int)LocationType.LBS)
- {
-
-
-
-
-
- if (cache != null)
- {
- positionCache.ExpiredTime = cache.ExpiredTime;
-
-
-
- if (
- Utils.ConvertToLocalDateTime(sentTicks) > cache.OriginalTime
- && Utils.ConvertToLocalDateTime(sentTicks) < cache.UpdateTime
- )
- {
-
- positionCache.OriginalTime = Utils.ConvertToLocalDateTime(sentTicks);
-
-
- positionCache.Steps = steps;
- }
- }
-
-
-
- positionStatus.LastPosition = positionCache;
- positionStatus.RequestPosition = loc.LocationType == 3 ? requestPostionVarObj : null;
- _deviceCacheMgr.SetPositionStatusCache(loc.SerialNo, positionStatus);
- _logger.LogInformation($"设备{loc.SerialNo},设备上报消息到IOT设备时间:{Utils.ConvertToLocalDateTime(sentTicks)},更新缓存时间:{DateTime.Now}|{JsonConvert.SerializeObject(positionStatus)}|实际定位类型:{loc.LocationType}");
-
- }
-
- else
- {
-
-
-
- if (cache != null)
- {
-
-
- if (false)
- {
- var distance = GeoUtils.GetDistance2((double)cache.GaodeLon, (double)cache.GaodeLat, (double)positionCache.GaodeLon, (double)positionCache.GaodeLat);
- if (distance >= DEFAULT_LBS_ACCEPT_DISTANCE)
- {
-
- positionStatus.LastPosition = positionCache;
- positionStatus.RequestPosition = loc.LocationType == 3 ? requestPostionVarObj : null;
- _deviceCacheMgr.SetPositionStatusCache(loc.SerialNo, positionStatus);
- _logger.LogInformation($"设备{loc.SerialNo},设备上报消息到IOT设备时间:{Utils.ConvertToLocalDateTime(sentTicks)},更新缓存时间:{DateTime.Now}|缓存内容:{JsonConvert.SerializeObject(positionStatus)}|基于LBS与上次有效定位的距离超过{DEFAULT_LBS_ACCEPT_DISTANCE}米,生成新的LBS定位缓存");
-
- }
- else if (cache.LocationType == (int)LocationType.LBS)
- {
-
-
-
-
-
-
-
- positionStatus.LastPosition = positionCache;
- positionStatus.RequestPosition = loc.LocationType == 3 ? requestPostionVarObj : null;
- _deviceCacheMgr.SetPositionStatusCache(loc.SerialNo, positionStatus);
- _logger.LogInformation($"设备{loc.SerialNo},设备上报消息到IOT设备时间:{Utils.ConvertToLocalDateTime(sentTicks)},更新缓存时间:{DateTime.Now}|缓存内容:{JsonConvert.SerializeObject(positionStatus)}定位缓存类型是LBS且定位缓存经纬度与 IOT LBS 经纬度直线少于2000米,生成新的LBS定位缓存");
- }
-
-
-
-
-
-
-
-
- else
- {
-
- cache.UpdateTime = Utils.ConvertToLocalDateTime(sentTicks);
-
-
- positionStatus.LastPosition = cache;
-
- positionStatus.LastPosition.Steps = steps;
- positionStatus.RequestPosition = loc.LocationType == 3 ? requestPostionVarObj : null;
- _deviceCacheMgr.SetPositionStatusCache(loc.SerialNo, positionStatus);
- _logger.LogInformation($"设备{loc.SerialNo},设备上报消息到IOT设备时间:{Utils.ConvertToLocalDateTime(sentTicks)},更新缓存时间:{DateTime.Now}|缓存内容:{JsonConvert.SerializeObject(positionStatus)}|无效 IOT LBS经纬度|实际IOT定位类型:{loc.LocationType}");
-
- }
-
- }
- else
- {
- positionStatus.LastPosition = positionCache;
- positionStatus.LastPosition.Steps = steps;
- positionStatus.RequestPosition = loc.LocationType == 3 ? requestPostionVarObj : null;
- _deviceCacheMgr.SetPositionStatusCache(loc.SerialNo, positionStatus);
- _logger.LogInformation($"设备{loc.SerialNo},设备上报消息到IOT设备时间:{Utils.ConvertToLocalDateTime(sentTicks)},更新缓存时间:{DateTime.Now}|缓存内容:{JsonConvert.SerializeObject(positionStatus)} 临时开放LBS (覆盖原来有缓存)");
-
- }
-
- }
-
- else
- {
-
- positionStatus.LastPosition = positionCache;
- positionStatus.RequestPosition = loc.LocationType == 3 ? requestPostionVarObj : null;
- _deviceCacheMgr.SetPositionStatusCache(loc.SerialNo, positionStatus);
- _logger.LogInformation($"设备{loc.SerialNo},设备上报消息到IOT设备时间:{Utils.ConvertToLocalDateTime(sentTicks)},更新缓存时间:{DateTime.Now}|缓存内容:{JsonConvert.SerializeObject(positionStatus)}|设备首次定位且是IOT LBS,生成首次LBS数据的定位缓存");
-
- }
-
- }
-
- }
- else
- {
- result.IsHistoryLocation = true;
- }
-
- return result;
- }
- #endregion
- }
- }
|