228 lines
7.7 KiB
C#
228 lines
7.7 KiB
C#
using GraphQL;
|
|
using LY.App.Common.Redis;
|
|
using LY.App.Device;
|
|
using LY.App.Extensions.DI;
|
|
using LY.App.Model;
|
|
using Mapster;
|
|
using Newtonsoft.Json;
|
|
using SqlSugar;
|
|
|
|
namespace LY.App.Service
|
|
{
|
|
/// <summary>
|
|
/// 设备服务
|
|
/// </summary>
|
|
[ServiceInjection(InjectionType.Transient)]
|
|
public class DeviceService
|
|
{
|
|
private readonly SqlSugarClient _db;
|
|
private readonly RedisService _redisService;
|
|
private readonly AlarmService _alarmService;
|
|
private readonly DeviceManager deviceManager = DeviceManager.Instance;
|
|
/// <summary>
|
|
/// 构造函数
|
|
/// </summary>
|
|
/// <param name="db"></param>
|
|
/// <param name="redisService"></param>
|
|
/// <param name="alarmService"></param>
|
|
public DeviceService(SqlSugarClient db, RedisService redisService, AlarmService alarmService)
|
|
{
|
|
_db = db;
|
|
_redisService = redisService;
|
|
_alarmService = alarmService;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 分页查询
|
|
/// </summary>
|
|
/// <param name="pageNum"></param>
|
|
/// <param name="pageSize"></param>
|
|
/// <param name="key"></param>
|
|
/// <returns></returns>
|
|
public async Task<ApiResult> List(int pageNum, int pageSize, string key)
|
|
{
|
|
RefAsync<int> total = 0;
|
|
var items = await _db.Queryable<DeviceEntity>()
|
|
.Where(s => s.IsDeleted == false)
|
|
.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
|
|
{
|
|
total = total.Value,
|
|
items
|
|
}
|
|
};
|
|
}
|
|
/// <summary>
|
|
/// 新增设备
|
|
/// </summary>
|
|
/// <param name="input"></param>
|
|
/// <returns></returns>
|
|
public async Task<ApiResult> Add(AddDevice input)
|
|
{
|
|
var entity = input.Adapt<DeviceEntity>();
|
|
var exists = await _db.Queryable<DeviceEntity>().FirstAsync(s => s.DeviceSN == entity.DeviceSN && s.IsDeleted == false);
|
|
if (exists != null)
|
|
{
|
|
return new ApiResult()
|
|
{
|
|
code = 1,
|
|
msg = "设备SN已存在"
|
|
};
|
|
}
|
|
var id = await _db.Insertable(entity).ExecuteReturnSnowflakeIdAsync();
|
|
entity.Id = id;
|
|
await AddDevice2Manager(entity);
|
|
var key = RedisKeyList.DeviceInfo(entity.DeviceSN);
|
|
await _redisService.SetAsync(key, entity, TimeSpan.FromDays(10));
|
|
return new ApiResult()
|
|
{
|
|
code = 0,
|
|
msg = "success"
|
|
};
|
|
}
|
|
/// <summary>
|
|
/// 获取协议列表
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public Task<ApiResult> ProtocolTypeList()
|
|
{
|
|
var dict = new Dictionary<int, string>();
|
|
foreach (ProtocolType protocol in Enum.GetValues(typeof(ProtocolType)))
|
|
{
|
|
dict.Add((int)protocol, protocol.ToString());
|
|
}
|
|
return Task.FromResult(new ApiResult()
|
|
{
|
|
data = dict
|
|
});
|
|
}
|
|
/// <summary>
|
|
/// 更新设备信息
|
|
/// </summary>
|
|
/// <param name="input"></param>
|
|
/// <returns></returns>
|
|
public async Task<ApiResult> updata(UpdateDevice input)
|
|
{
|
|
var entity = input.Adapt<DeviceEntity>();
|
|
await _db.Updateable(entity).ExecuteCommandAsync();
|
|
await deviceManager.RemoveDevice(entity.Id);
|
|
await AddDevice2Manager(entity);
|
|
var key = RedisKeyList.DeviceInfo(input.DeviceSN);
|
|
await _redisService.SetAsync(key, entity);
|
|
return new ApiResult()
|
|
{
|
|
code = 0,
|
|
msg = "success"
|
|
};
|
|
}
|
|
/// <summary>
|
|
/// 删除设备
|
|
/// </summary>
|
|
/// <param name="Id"></param>
|
|
/// <returns></returns>
|
|
public async Task<ApiResult> delete(long Id)
|
|
{
|
|
var entity = await _db.Queryable<DeviceEntity>().FirstAsync(s => s.Id == Id);
|
|
entity.IsDeleted = true;
|
|
await _db.Updateable(entity).ExecuteCommandAsync();
|
|
await deviceManager.RemoveDevice(entity.Id);
|
|
return new ApiResult()
|
|
{
|
|
code = 0,
|
|
msg = "success"
|
|
};
|
|
}
|
|
/// <summary>
|
|
/// 取单个设备详情
|
|
/// </summary>
|
|
/// <param name="id"></param>
|
|
/// <returns></returns>
|
|
public async Task<DeviceEntity> detail(long Id)
|
|
{
|
|
return await _db.Queryable<DeviceEntity>()
|
|
.FirstAsync(s => s.Id == Id);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取首页数据
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public async Task<List<DeviceEntity>> All()
|
|
{
|
|
var result = await _db.Queryable<DeviceEntity>()
|
|
.Where(s => s.IsDeleted == false)
|
|
.ToListAsync();
|
|
return result;
|
|
}
|
|
|
|
private Task AddDevice2Manager(DeviceEntity entity)
|
|
{
|
|
var device = new Device.Device()
|
|
{
|
|
Id = entity.Id,
|
|
Port = entity.Port,
|
|
GraphQlEndpoint = entity.GraphQlEndpoint,
|
|
Topic = entity.Topic,
|
|
IpAddress = entity.ip,
|
|
Protocol = entity.Protocol,
|
|
username = entity.account,
|
|
password = entity.password,
|
|
DataReceived = async (data) =>
|
|
{
|
|
try
|
|
{
|
|
var input = JsonConvert.DeserializeObject<RevData>(data);
|
|
// Console.WriteLine($"rev data:{data}");
|
|
await _alarmService.AddAlarm(input);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine($"error:{ex.Message},data:{data}");
|
|
}
|
|
}
|
|
};
|
|
deviceManager.AddDevice(device);
|
|
return Task.CompletedTask;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 初始化,加载所有设备
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public async Task Init()
|
|
{
|
|
var devices = await _db.Queryable<DeviceEntity>().Where(s => s.IsDeleted == false).ToListAsync();
|
|
foreach (var item in devices)
|
|
{
|
|
var key = RedisKeyList.DeviceInfo(item.DeviceSN);
|
|
await _redisService.SetAsync(key, item, TimeSpan.FromDays(100));
|
|
await AddDevice2Manager(item);
|
|
}
|
|
// 加载防区信息
|
|
var position = await _db.Queryable<PositionInfo>()
|
|
.Where(s => s.IsDeleted == false).ToListAsync();
|
|
foreach (var item in position)
|
|
{
|
|
var key = RedisKeyList.PositioinRegion(item.Id);
|
|
await _redisService.SetAsync(key, item);
|
|
}
|
|
// 加载白名单信息
|
|
var whithlist = await _db.Queryable<Whitelist>()
|
|
.Where(s => s.IsDeleted == false).ToListAsync();
|
|
foreach (var item in whithlist)
|
|
{
|
|
var key = RedisKeyList.white_list(item.sn);
|
|
await _redisService.SetAsync(key, item);
|
|
}
|
|
}
|
|
}
|
|
}
|