Compare commits

...

21 Commits

Author SHA1 Message Date
yanghongwei 90b3bc70ec 细节调整 2025-09-20 17:21:03 +08:00
yanghongwei e479ee3337 bug调整 2025-09-20 16:29:21 +08:00
yanghongwei a61dfeddb0 细节调整 2025-09-11 00:51:53 +08:00
yanghongwei 5fb29db7e9 细节调整 2025-09-11 00:12:48 +08:00
yanghongwei 1175c776bf 设备状态调整 2025-09-11 00:01:46 +08:00
yanghongwei a474ded6a1 设备列表加入是否在线 2025-08-27 22:06:49 +08:00
yanghongwei 5122193a28 白名单 调整 2025-08-27 21:46:05 +08:00
yanghongwei 9653eb6f18 细节调整 2025-08-26 15:12:26 +08:00
yanghongwei 1c9a4afcbc 细节调整,上传批次按sn来 分组 2025-08-24 16:32:14 +08:00
yanghongwei 48b4d35672 细节调整 2025-08-23 01:33:25 +08:00
yanghongwei 25b9d20cb3 细节调整 2025-08-23 01:32:07 +08:00
yanghongwei 7574049a3f 细节调整 2025-08-23 01:28:34 +08:00
yanghongwei 6fab2df9fb 细节调整 2025-08-23 01:06:19 +08:00
yanghongwei b8279ad728 细节调整,预警列表,字段新加白名单,预警等级 2025-08-22 16:50:41 +08:00
yanghongwei dceaf4e424 细节调整 2025-08-20 22:46:00 +08:00
yanghongwei 83df6abc46 首页缓存计算时长调整 2025-08-16 17:33:02 +08:00
yanghongwei f94bdcc506 细节调整 2025-08-16 15:34:19 +08:00
yanghongwei 97b9cc06dc 0换成1 2025-08-16 15:32:57 +08:00
yanghongwei b389dcbf30 细节调整 2025-07-21 17:33:13 +08:00
yanghongwei 965f987086 分页细节调整 2025-07-21 17:32:05 +08:00
yanghongwei 45c19fcdf9 白名单调整 2025-07-09 20:47:01 +08:00
9 changed files with 139 additions and 35 deletions

23
Common/DateTimeHelper.cs Normal file
View File

@ -0,0 +1,23 @@
namespace LY.App.Common
{
/// <summary>
/// 日期时间帮助类
/// </summary>
public static class DateTimeHelper
{
/// <summary>
/// //当前剩余秒数
/// </summary>
/// <returns></returns>
public static int GetRemainSeconds()
{
// 当前时间
DateTime now = DateTime.Now;
// 当天结束时间23:59:59.999
DateTime endOfDay = now.Date.AddDays(1).AddTicks(-1);
int remainSeconds = (int)(endOfDay - DateTime.Now).TotalSeconds;
return remainSeconds;
}
}
}

View File

@ -25,7 +25,19 @@ namespace LY.App.Controllers
[HttpGet("list")]
public async Task<IActionResult> List([FromQuery] AlarmReq input)
{
var result = await _alarmService.GetPage(input);
var result = await _alarmService.CreateHistoryPage(input);
return Ok(result);
}
/// <summary>
///列表
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpGet("list1")]
public async Task<IActionResult> List1([FromQuery] AlarmReq input)
{
var result = await _alarmService.CreateHistoryPage(input);
return Ok(result);
}

View File

@ -1,4 +1,5 @@
using LY.App.Common.Redis;
using LY.App.Common;
using LY.App.Common.Redis;
using LY.App.Device;
using LY.App.Model;
using LY.App.Service;
@ -48,7 +49,7 @@ namespace LY.App.Controllers
var positions = await _positionService.Index();
var alarmCount = await _redisService.GetOrSetAsync(RedisKeyList.index_data(),
async () => await _alarmService.IndexCount(),
TimeSpan.FromDays(1));
TimeSpan.FromSeconds(DateTimeHelper.GetRemainSeconds()));
var weather = await _redisService.GetOrSetAsync(RedisKeyList.Index_Weather,
async () => await _weatherService.GetWeather(),
TimeSpan.FromHours(3));

View File

@ -331,7 +331,7 @@ namespace LY.App.Device
private async Task HandleDeviceConnection(Device device)
{
int retryDelay = 1000; // 初始重连间隔1秒
int retryDelay = 10000; // 初始重连间隔1秒
int maxDelay = 30000; // 最大重连间隔30秒
var _log = ServiceLocator.Instance.GetService<LogService>();
await _log?.AddLog(new AddLog { Message = $"设备 {device.Id} 掉线,重新连接中...", Parameters = "", StackTrace = "", url = "" });

View File

@ -21,6 +21,7 @@ namespace LY.App.Model
[JsonConverter(typeof(ValueToStringConverter))]
public long positionId { get; set; }
public string positionName { get; set; }
public int alarmLevel { get; set; }
//public long position_id { get; set; }
}

View File

@ -1,4 +1,5 @@
using LY.App.Device;
using GraphQL;
using LY.App.Device;
using Newtonsoft.Json;
using SqlSugar;
@ -75,6 +76,8 @@ namespace LY.App.Model
[SugarColumn(ColumnName = "is_move", ColumnDescription = "是否移动设备", IsNullable = true)]
public bool isMove { get; set; }
[SugarColumn(IsIgnore = true)]
public bool online { get; set; }
}

View File

@ -25,14 +25,16 @@ namespace LY.App.Model
public List<long> positionId { get; set; }
[SugarColumn(IsIgnore = true)]
public List<string> positionIds { get; set; }
/// <summary>
/// 所属单位
/// </summary>
[SugarColumn(IsNullable = true)]
public string company { get; set; }
/// <summary>
/// 备注
/// </summary>
public string mark { get; set; }
/// <summary>
/// 创建人
/// </summary>
public string createBy { get; set; }
}
public class AddWhitelist
@ -69,6 +71,10 @@ namespace LY.App.Model
/// 备注
/// </summary>
public string mark { get; set; }
/// <summary>
/// 创建人
/// </summary>
public string createBy { get; set; }
}
public class UpdateWhitelist : AddWhitelist

View File

@ -7,6 +7,8 @@ using Mapster;
using NetTopologySuite.Geometries;
using NetTopologySuite.IO;
using SqlSugar;
using StackExchange.Redis;
using System.Text;
namespace LY.App.Service
{
@ -54,8 +56,15 @@ namespace LY.App.Service
entity = entity.Where(s => checkDistance(s.drone_lat, s.drone_lon, deviceinfo.Lat, deviceinfo.Lon) == true).ToList();
if (O4entity.Any())
{
entity.AddRange(O4entity);
foreach (var item in O4entity)
{
if (!entity.Exists(s => s.serial_number == item.serial_number))
{
entity.Add(item);
}
}
}
entity = entity.Distinct().ToList();
if (entity.Any())
{
foreach (var item in entity)
@ -134,35 +143,17 @@ namespace LY.App.Service
private async Task<bool> Iswhitlist(string serial_number, double lat, double lon)
{
string key = RedisKeyList.white_list(serial_number);
if (!await _redisService.ExistsAsync(key))
return false;
else
if (await _redisService.ExistsAsync(key))
{
var entity = await _redisService.GetAsync<Whitelist>(key);
//判断 是否在防区内
if (entity.positionId.Any())
//判断时间是否在区在
if (entity.allDay)
{
foreach (var item in entity.positionId)
{
var region = await _redisService.GetAsync<PositionInfo>(RedisKeyList.PositioinRegion(item));
if (region != null)
{
region.SetRegionJson();
if (IsPointInGeoJson(lat, lon, region.RegionJson))
{
//判断时间是否在区在
if (entity.allDay)
{
return true;
}
else
{
return entity.startTime <= DateTime.Now && DateTime.Now <= entity.endTime;
}
}
}
}
return true;
}
else
{
return entity.startTime <= DateTime.Now && DateTime.Now <= entity.endTime;
}
}
return false;
@ -390,7 +381,70 @@ namespace LY.App.Service
.ToPageListAsync(input.pageNum, input.pageSize, total);
return Tuple.Create(total.Value, items);
}
public async Task<ApiResult> CreateHistoryPage(AlarmReq input)
{
var tables = _db.SplitHelper<Alarm>().GetTables();
string coutsql = @" SELECT COUNT(*)
FROM (
SELECT batch_id
FROM (
{0}
) AS unionTable
GROUP BY batch_id
) AS CountTable;";
string page = @" SELECT *
FROM (
SELECT batch_id
FROM (
{0}
) AS unionTable
GROUP BY batch_id ORDER BY batch_id desc LIMIT {1},{2}
) AS CountTable ";
string tablesql = string.Join(" UNION ALL ", tables.Select(item => $"SELECT batch_id FROM {item.TableName} GROUP BY batch_id "));
if (!string.IsNullOrEmpty(input.sn))
{
tablesql = string.Join(" UNION ALL ", tables.Select(item => $"SELECT batch_id FROM {item.TableName} where serial_number like '%{input.sn}%' GROUP BY batch_id"));
}
var pageitem = await _db.Ado.SqlQueryAsync<int, long>(string.Format(coutsql, tablesql) + string.Format(page, tablesql, (input.pageNum - 1) * input.pageSize, input.pageSize));
var temp = await _db.Queryable<Alarm>()
.Where(s => pageitem.Item2.Contains(s.BatchId)).SplitTable().Select(s => new { s.BatchId, s.freq, s.Id, s.positionId, s.PostionName, s.alarmLevel, s.device_type }).ToListAsync();
var query = await _db.Queryable<Alarm>()
.Where(s => pageitem.Item2.Contains(s.BatchId)).SplitTable()
.GroupBy(s => new { s.BatchId, s.serial_number })
.Select(st => new AlarmRepDto
{
batchId = st.BatchId.ToString(),
startTime = SqlFunc.AggregateMin(st.CreateTime),
endTime = SqlFunc.AggregateMax(st.CreateTime),
sn = st.serial_number,
duration = (SqlFunc.AggregateMax(st.CreateTime) - SqlFunc.AggregateMin(st.CreateTime)).TotalSeconds,
IsWhitelist = SqlFunc.AggregateMax(st.IsWhitelist),
}).OrderByDescending(s => s.batchId).ToListAsync();
query.ForEach(s =>
{
s.duration = s.duration == 0 ? 1 : s.duration;
s.Frequency = temp.Where(m => m.BatchId == long.Parse(s.batchId)).OrderByDescending(o => o.Id).FirstOrDefault().freq;
s.positionId = temp.Where(m => m.BatchId == long.Parse(s.batchId)).OrderByDescending(o => o.Id).FirstOrDefault().positionId;
s.positionName = temp.Where(m => m.BatchId == long.Parse(s.batchId)).OrderByDescending(o => o.Id).FirstOrDefault().PostionName;
s.alarmLevel = temp.Where(m => m.BatchId == long.Parse(s.batchId)).Any(o => o.alarmLevel == 1) ? 1 : 0;
s.model = temp.Where(m => m.BatchId == long.Parse(s.batchId)).OrderByDescending(o => o.Id).FirstOrDefault().device_type;
}); return new ApiResult()
{
code = 0,
data = new
{
total = pageitem.Item1.First(),
items = query
}
};
}
/// <summary>
/// 报表统计

View File

@ -47,6 +47,10 @@ namespace LY.App.Service
.WhereIF(!string.IsNullOrEmpty(key), s => s.Name.Contains(key) || s.DeviceSN.Contains(key))
.OrderByDescending(s => s.Id)
.ToPageListAsync(pageNum, pageSize, total);
foreach (var item in items)
{
item.online = await _redisService.ExistsAsync(RedisKeyList.DeviceStatus(item.DeviceSN));
}
return new ApiResult()
{
data = new