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
{
[ServiceInjection(InjectionType.Transient)]
public class DeviceService
{
private readonly SqlSugarClient _db;
private readonly IConfiguration _config;
private readonly RedisService _redisService;
private readonly AlarmService _alarmService;
private readonly DeviceManager deviceManager = DeviceManager.Instance;
public DeviceService(SqlSugarClient db, IConfiguration config, RedisService redisService, AlarmService alarmService)
{
_db = db;
_config = config;
_redisService = redisService;
_alarmService = alarmService;
}
///
/// 分页查询
///
///
///
///
///
public async Task List(int pageNum, int pageSize, string key)
{
RefAsync total = 0;
var items = await _db.Queryable()
.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);
return new ApiResult()
{
data = new
{
total = total.Value,
items
}
};
}
///
/// 新增设备
///
///
///
public async Task Add(AddDevice input)
{
var entity = input.Adapt();
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"
};
}
///
/// 获取协议列表
///
///
public Task ProtocolTypeList()
{
var dict = new Dictionary();
foreach (ProtocolType protocol in Enum.GetValues(typeof(ProtocolType)))
{
dict.Add((int)protocol, protocol.ToString());
}
return Task.FromResult(new ApiResult()
{
data = dict
});
}
///
/// 更新设备信息
///
///
///
public async Task updata(UpdateDevice input)
{
var entity = input.Adapt();
await _db.Updateable(entity).ExecuteCommandAsync();
await deviceManager.RemoveDevice(entity.Id);
await AddDevice2Manager(entity);
return new ApiResult()
{
code = 0,
msg = "success"
};
}
///
/// 删除设备
///
///
///
public async Task delete(long Id)
{
var entity = await _db.Queryable().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"
};
}
///
/// 取单个设备详情
///
///
///
public async Task detail(long Id)
{
return await _db.Queryable()
.FirstAsync(s => s.Id == Id);
}
///
/// 获取首页数据
///
///
public async Task> All()
{
var result = await _db.Queryable()
.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(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;
}
///
/// 初始化,加载所有设备
///
///
public async Task Init()
{
var devices = await _db.Queryable().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()
.Where(s => s.IsDeleted == false).ToListAsync();
foreach (var item in position)
{
var key = RedisKeyList.PositioinRegion(item.Id);
await _redisService.SetAsync(key, item.Region);
}
}
}
}