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,