From 5c0664e8309ce5abe7fd7587557433a1e21429b3 Mon Sep 17 00:00:00 2001 From: yanghongwei Date: Sat, 12 Apr 2025 23:17:49 +0800 Subject: [PATCH] =?UTF-8?q?=E7=99=BD=E5=90=8D=E5=8D=95=20=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Common/Redis/RedisKeyList.cs | 9 ++++++ Model/PositionDeviceDto.cs | 1 + Model/Whitelist.cs | 13 ++++----- Program.cs | 2 +- Service/AlarmService.cs | 55 ++++++++++++++++++++++++++++++++---- Service/DeviceService.cs | 12 ++++++-- Service/WhitListService.cs | 17 +++++++++-- appsettings.json | 1 - 8 files changed, 89 insertions(+), 21 deletions(-) diff --git a/Common/Redis/RedisKeyList.cs b/Common/Redis/RedisKeyList.cs index 7fcc18a..0ae00e3 100644 --- a/Common/Redis/RedisKeyList.cs +++ b/Common/Redis/RedisKeyList.cs @@ -47,5 +47,14 @@ { return $"position_region_{id}"; } + /// + /// 白名单 + /// + /// + /// + public static string white_list(string sn) + { + return $"white_list{sn}"; + } } } diff --git a/Model/PositionDeviceDto.cs b/Model/PositionDeviceDto.cs index 665cb02..85bc889 100644 --- a/Model/PositionDeviceDto.cs +++ b/Model/PositionDeviceDto.cs @@ -23,5 +23,6 @@ namespace LY.App.Model /// public string icon { get; set; } public string Img { get; set; } + public bool isMove { get; set; } } } diff --git a/Model/Whitelist.cs b/Model/Whitelist.cs index bf38c10..19c1777 100644 --- a/Model/Whitelist.cs +++ b/Model/Whitelist.cs @@ -17,9 +17,9 @@ namespace LY.App.Model [SugarColumn(IsNullable = true)] public DateTime? endTime { get; set; } [JsonConverter(typeof(ValueToStringConverter))] - [SugarColumn(ColumnName = "position_id", ColumnDescription = "阵地id")] - public long positionId { get; set; } - public string positionName { get; set; } + [SugarColumn(ColumnName = "position_id", ColumnDescription = "阵地id", IsJson = true)] + public List positionId { get; set; } + } public class AddWhitelist { @@ -42,11 +42,8 @@ namespace LY.App.Model /// /// 阵地id /// - public long positionId { get; set; } - /// - /// 阵地名称 - /// - public string positionName { get; set; } + public List positionId { get; set; } + } public class UpdateWhitelist : AddWhitelist { diff --git a/Program.cs b/Program.cs index 5206bc2..02a0a06 100644 --- a/Program.cs +++ b/Program.cs @@ -85,7 +85,7 @@ builder.Services.AddTransient(sp => }; //ݿͱִһ //db.DbMaintenance.CreateDatabase(); - db.CodeFirst.SetStringDefaultLength(2000).InitTables(typeof(Whitelist)); + //db.CodeFirst.SetStringDefaultLength(2000).InitTables(typeof(Whitelist)); #endif //д // db.QueryFilter.AddTableFilter(it => it.IsDeleted == false); diff --git a/Service/AlarmService.cs b/Service/AlarmService.cs index cc5b0a3..98c9a17 100644 --- a/Service/AlarmService.cs +++ b/Service/AlarmService.cs @@ -64,8 +64,8 @@ namespace LY.App.Service item.PostionName = deviceinfo.PositionName; item.Time = input.time; item.distance = GisHelper.HaversineDistance(item.drone_lat, item.drone_lon, item.app_lat, item.app_lon); - item.alarmLevel = await GetAlarmLevel(deviceinfo.PositionId, item.drone_lon, item.drone_lat); - item.IsWhitelist = Iswhitlist(item.serial_number); + item.IsWhitelist = await Iswhitlist(item.serial_number, item.drone_lat, item.drone_lon); + item.alarmLevel = item.IsWhitelist == true ? 0 : await GetAlarmLevel(deviceinfo.PositionId, item.drone_lon, item.drone_lat); } await _db.CopyNew().Insertable(entity).SplitTable().ExecuteReturnSnowflakeIdListAsync(); //推送报警信息 @@ -89,16 +89,59 @@ namespace LY.App.Service return distance < maxDistance; } - private bool Iswhitlist(string serial_number) + /// + /// 判断是否在白名单中 + /// + /// + /// + /// + /// + private async Task Iswhitlist(string serial_number, double lat, double lon) { - var whitelist = _config["Whitelist"].Split(','); - if (whitelist.Any()) + string key = RedisKeyList.white_list(serial_number); + if (!await _redisService.ExistsAsync(key)) + return false; + else { - return whitelist.Contains(serial_number); + var entity = await _redisService.GetAsync(key); + //判断 是否在防区内 + if (entity.positionId.Any()) + { + foreach (var item in entity.positionId) + { + var region = await _redisService.GetAsync(RedisKeyList.PositioinRegion(item)); + if (region != null && IsPointInGeoJson(lat, lon, region)) + { + //判断时间是否在区在 + if (entity.allDay) + { + return true; + } + else + { + return entity.startTime <= DateTime.Now && DateTime.Now <= entity.endTime; + } + } + + } + } } return false; } + static bool IsPointInGeoJson(double latitude, double longitude, string geoJson) + { + // 使用 NetTopologySuite 解析 GeoJSON + var reader = new GeoJsonReader(); + Geometry geometry = reader.Read(geoJson); + // 创建点 + var point = new Point(longitude, latitude); + + // 判断点是否在几何图形内 + return geometry.Contains(point); + } + + /// /// 计算入侵级别 /// diff --git a/Service/DeviceService.cs b/Service/DeviceService.cs index 537927a..c2cef66 100644 --- a/Service/DeviceService.cs +++ b/Service/DeviceService.cs @@ -165,7 +165,7 @@ namespace LY.App.Service try { var input = JsonConvert.DeserializeObject(data); - Console.WriteLine($"rev data:{data}"); + // Console.WriteLine($"rev data:{data}"); await _alarmService.AddAlarm(input); } catch (Exception ex) @@ -191,7 +191,7 @@ namespace LY.App.Service await _redisService.SetAsync(key, item, TimeSpan.FromDays(100)); await AddDevice2Manager(item); } - // 加载阵地信息 + // 加载防区信息 var position = await _db.Queryable() .Where(s => s.IsDeleted == false).ToListAsync(); foreach (var item in position) @@ -199,6 +199,14 @@ namespace LY.App.Service var key = RedisKeyList.PositioinRegion(item.Id); await _redisService.SetAsync(key, item.Region); } + // 加载白名单信息 + var whithlist = await _db.Queryable() + .Where(s => s.IsDeleted == false).ToListAsync(); + foreach (var item in whithlist) + { + var key = RedisKeyList.white_list(item.sn); + await _redisService.SetAsync(key, item); + } } } } diff --git a/Service/WhitListService.cs b/Service/WhitListService.cs index 2961c88..723bccf 100644 --- a/Service/WhitListService.cs +++ b/Service/WhitListService.cs @@ -1,4 +1,5 @@ -using LY.App.Extensions.DI; +using LY.App.Common.Redis; +using LY.App.Extensions.DI; using LY.App.Model; using Mapster; using SqlSugar; @@ -13,13 +14,15 @@ namespace LY.App.Service public class WhitListService { private readonly SqlSugarClient _db; + private readonly RedisService _redisService; /// /// 构造函数 /// /// - public WhitListService(SqlSugarClient sqlSugarClient) + public WhitListService(SqlSugarClient sqlSugarClient, RedisService redisService) { _db = sqlSugarClient; + _redisService=redisService; } /// /// 新增白名单 @@ -30,7 +33,15 @@ namespace LY.App.Service { var result = new ApiResult(); var entity = input.Adapt(); - var id = await _db.Insertable(entity).ExecuteReturnIdentityAsync(); + var exisit = await _db.Queryable().AnyAsync(x => x.sn == entity.sn); + if (exisit) + { + result.code = 1; + result.msg = $"sn:{input.sn}已经存在白名单中"; + return result; + } + var id = await _db.Insertable(entity).ExecuteReturnSnowflakeIdAsync(); + await _redisService.SetAsync(entity.sn, entity); result.data = id.ToString(); return result; } diff --git a/appsettings.json b/appsettings.json index 62673e6..c573826 100644 --- a/appsettings.json +++ b/appsettings.json @@ -29,7 +29,6 @@ "Weather": "https://weather.cma.cn/api/now/54511", //天气预报地址,中国气象 "Vertify": 5, //登录失败次数 "BatchId": 60, //无人机批次连续时间,如果超过这个时间,则变成下一个批次 - "Whitelist": "sn123,sn234", //白名单sn,用逗号分隔 "MaxDistance": 3000, //最大距离,如果超过这个距离,探测到的无人机数据会被丢弃 单位:米 "SnowFlakeWordId": 1 //雪花算法的wordId,多台服务器时,需要配置不同的wordId,