using System.ComponentModel;
using Admin.Bodk.Device.Entities.equipment;
using Admin.Bodk.Device.Entities.TaskChain;
using Admin.NET.Core;
using Furion.DatabaseAccessor;
using Furion.DependencyInjection;
using Furion.DynamicApiController;
using Furion.FriendlyException;
using Mapster;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using NewLife.Caching;
using SqlSugar;
namespace Admin.Bodk.Device.Services;
///
/// 设备管理服务
///
[ApiDescriptionSettings(Order = 2)]
public class DeviceService : IDynamicApiController, ITransient
{
private readonly SqlSugarRepository _repository;
private readonly SqlSugarRepository _taskChainRepository;
private readonly ICache _cache;
public DeviceService(SqlSugarRepository repository,
SqlSugarRepository taskChainRepository,
ICache cache)
{
_repository = repository;
_taskChainRepository = taskChainRepository;
_cache = cache;
}
///
/// 获取设备列表
///
///
///
[DisplayName("获取设备列表")]
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme + "," + SignatureAuthenticationDefaults.AuthenticationScheme)]
public async Task> PostList(DeviceInpt input)
{
return await _repository.AsQueryable()
// .LeftJoin((u, a) => u.Id == a.EquipmentId)
.WhereIF(!string.IsNullOrWhiteSpace(input.Name),
m => m.Name != null && m.Name.Contains(input.Name))
.WhereIF(!string.IsNullOrWhiteSpace(input.Type), m => m.Type == input.Type)
.Select((u) => new EquipmentDto()
{
Id = u.Id,
Name = u.Name,
Type = u.Type,
BaseName = u.BaseName,
PicUrl = u.PicUrl,
Address = u.Address,
Remark = u.Remark,
Code = u.Code,
Ip = u.Ip,
Status = u.Status,
CreateTime = u.CreateTime,
})
.Mapper(d =>
{
var cache = _cache.Get($"bodk:device:{d.Code}:summary");
if (cache is not null)
{
d.Temperature = cache?.TankTopTemperature;
d.LiquidNitrogenHeight = cache?.LiquidHeight;
d.Humidity = cache?.CavityHumidity;
}
else
{
d.Temperature = -192.5f;
d.LiquidNitrogenHeight = 182;
d.Humidity = 0.5f;
}
})
.ToPagedListAsync(input.Page, input.PageSize);
}
///
/// 增加设备
///
///
///
[UnitOfWork]
[ApiDescriptionSettings(Name = "Add"), HttpPost]
[DisplayName("增加设备")]
public async Task AddEquipment(EquipmentDto input)
{
if (input is null) throw Oops.Oh("参数不能为空");
var equipment = input.Adapt();
// if( a is double b)
// {
// Console.WriteLine(b);
// }
var newEquipment = await _repository.AsInsertable(equipment).ExecuteReturnEntityAsync();
// if (input?.TaskChainList is { Count: > 0 })
// {
// foreach (var taskChain in input.TaskChainList)
// {
// taskChain.EquipmentId = newEquipment.Id;
// await _taskChainRepository.AsInsertable(taskChain).ExecuteReturnEntityAsync();
// }
// }
input.Id = newEquipment.Id;
return newEquipment.Id;
}
///
/// 更新设备
///
///
///
[UnitOfWork]
[ApiDescriptionSettings(Name = "Update"), HttpPost]
[DisplayName("更新设备")]
public async Task Update(EquipmentDto input)
{
_taskChainRepository.AsDeleteable().Where(tc => tc.EquipmentId == input.Id).ExecuteCommand();
// if (input?.TaskChainList is { Count: > 0 })
// {
// foreach (var taskChain in input.TaskChainList)
// {
// taskChain.EquipmentId = input.Id;
// await _taskChainRepository.AsInsertable(taskChain).ExecuteReturnEntityAsync();
// }
// }
await _repository.AsUpdateable(input.Adapt())
.UpdateColumns(m => new { m.Type, m.Name, m.Remark, m.Code })
.ExecuteCommandAsync();
}
///
/// 删除设备
///
///
///
[UnitOfWork]
[ApiDescriptionSettings(Name = "Delete"), HttpPost]
[DisplayName("删除设备")]
public async Task Delete(DeleteEquipmentInput input)
{
var user = await _repository.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh("设备不存在");
await _repository.DeleteAsync(user);
}
}