Files
Web_IoTBase_Sever_Prod/BooliveMQTT_Auth/Controllers/DeviceinfoesController.cs
2025-12-11 14:04:39 +08:00

473 lines
16 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.Json;
using System.Threading.Tasks;
using Common;
using CommonEntity;
using IotManager.Common;
using LogCap.Common;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.VisualBasic;
using MySQLAccess.PGModels;
using NLog;
using NPOI.OpenXmlFormats.Dml;
using Proto.Extensions;
using RestSharp;
using ViewModels;
namespace IotManager.Controllers
{
[Route("api/[controller]/[action]")]
[ApiController]
public class DeviceinfoesController : ControllerBase
{
private readonly Logger _logger = LogManager.GetCurrentClassLogger();
private readonly PostgresContext _context;
public DeviceinfoesController(PostgresContext context)
{
_context = context;
}
// GET: api/Deviceinfoes
[HttpPost()]
public async Task<ReturnInfo> GetDeviceinfos(QueryAll_Or_Single Q)
{
ReturnInfo r = new ReturnInfo();
try
{
if (Q.IsAll)
{
r.isok = true;
r.response = await _context.Deviceinfos.ToListAsync();
}
else
{
var deviceinfo = await _context.Deviceinfos.FindAsync(Q.ID);
if (deviceinfo == null)
{
r.isok = false;
r.message = "找不到此数据";
}
r.isok = true;
r.response = deviceinfo;
}
}
catch (Exception ex)
{
r.isok = false;
r.message = ex.Message;
}
return r;
}
[HttpPost()]
public async Task<ReturnInfo> GetAllBatchFlag(QueryMachineType S)
{
ReturnInfo r = new ReturnInfo();
try
{
int one = S.MachineType;
var st = S.StartTime;
var et = S.EndTime;
var ST = DateTime.Parse(st);
var ET = DateTime.Parse(et);
var data = await _context.Deviceinfos.Where(A => A.MachineType == one && A.CreateTime > ST && A.CreateTime <= ET)
.GroupBy(d => d.ExcelBatchFlag)
.Select(g => new
{
ExcelBatchFlag = g.Key.ToString(),
CreateTime = g.Select(x => x.CreateTime).FirstOrDefault(),
Count = g.Count()
})
.ToListAsync();
r.isok = true;
r.response = data;
return r;
}
catch (Exception ex)
{
r.isok = false;
r.response = ex.Message;
}
return r;
}
[Authorize()]
[HttpPost()]
public async Task<ReturnInfo> GetDeviceinfosByBatchFlag(Dictionary<string, string> Q)
{
ReturnInfo r = new ReturnInfo();
try
{
string batchflag = Q["FileBatchFlag"];
long NNN = 0L;
long.TryParse(batchflag, out NNN);
var data = from a in _context.Deviceinfos
join b in _context.EmqxLogininfos
on a.Uuid equals b.DeviceUuid
into DeviceInfo
from d in DeviceInfo.DefaultIfEmpty()
where a.ExcelBatchFlag == NNN
select new { a.DeviceName, a.OrderNo, a.ClientId, a.SecretKey, a.Remark, d.PassWord };
var data1 = await data.Select(A => new DeviceInfoResponse
{
DeviceName = A.DeviceName,
MO = A.OrderNo,
ClientID = A.ClientId,
MQTT_Login_Password = A.PassWord,
Key = A.SecretKey,
Remark = A.Remark
}).ToListAsync();
r.isok = true;
r.response = data1;
}
catch (Exception ex)
{
r.isok = false;
r.response = ex.Message;
}
return r;
}
[Authorize()]
[HttpPost()]
public async Task<ReturnInfo> EditDeviceinfo(Deviceinfo deviceinfo)
{
ReturnInfo r = new ReturnInfo();
try
{
if (!DeviceinfoExists(deviceinfo.ClientId))
{
r.isok = false;
r.message = "not found";
return r;
}
_context.Entry(deviceinfo).State = EntityState.Modified;
await _context.SaveChangesAsync();
r.isok = true;
}
catch (Exception ex)
{
r.isok = false;
r.message = ex.Message;
}
return r;
}
public string GetId(string device_name, string uuid)
{
string NNN = PasswordGenerator.Generate(16);
//string data = string.Format("inhaos_{0}_{1}_{2}", device_name, uuid, NNN);
//// 密钥用于生成MAC
//string key = "[secNret)Key#&!";
//// 计算MAC
//byte[] mac = Base64.ComputeHMACSHA256(data, key);
//string str = Convert.ToBase64String(mac);
return NNN;
}
public record DeviceInfoRequest
{
public int id { get; set; }
public string DeviceName { get; set; }
public string MO { get; set; }
public int MachineType { get; set; }
public string Remark { get; set; }
}
public record DeviceInfoResponse
{
public string? DeviceName { get; set; }
public string? MO { get; set; }
public long? ClientID { get; set; }
public string? MQTT_Login_Password { get; set; }
public string? Key { get; set; }
public string? Remark { get; set; }
}
public record IdFilter
{
public int id { get; set; }
public string UUID { get; set; }
}
/// <summary>
/// 设备查询参数
/// </summary>
public class DeviceQueryParams
{
public int MachineType { get; set; }
public string Mcu_Uuid { get; set; }
public int? Brandld { get; set; }
}
public class UserData
{
public string username { get; set; }
public string password { get; set; }
}
[HttpPost()]
public async Task<string> SendHttpData(List<UserData> userdata)
{
string resp = "";
try
{
resp = await RedisWriter(userdata);
}
catch (Exception ex)
{
_logger.Error(ex.Message);
}
return resp;
}
private async Task<string> RedisWriter(List<UserData> userdata)
{
RestClient client1 = new RestClient("http://iot-manage.uts-data.com:5001");
string ti = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");
var request1 = new RestRequest("/api/Values/SetChache", Method.Post);
request1.AddJsonBody(userdata);
var re = await client1.ExecuteAsync(request1);
string resp = re.Content;
_logger.Error("Redis缓存" + resp);
return resp;
}
[Authorize()]
[HttpPost]
public async Task<ReturnInfo> AddDeviceinfo(List<DeviceInfoRequest> List_LLL)
{
ReturnInfo returnInfo = new ReturnInfo();
try
{
var QQQ = List_LLL.Select(A => A.DeviceName);
var q1 = _context.Deviceinfos.Any(A => QQQ.Contains(A.DeviceName));
if (q1)
{
returnInfo.isok = false;
returnInfo.message = "设备名字重复,不可导入";
return returnInfo;
}
var worker = new IdWorker(31, 30);
long filebatch = worker.nextId();
List<UserData> lll = new List<UserData>();
_context.Database.BeginTransaction();
var DT = DateTime.Now;
var LT = Tools.ToUnixTimestampBySeconds(DT);
List<Deviceinfo> device_list = new List<Deviceinfo>();
List<EmqxLogininfo> login_list = new List<EmqxLogininfo>();
foreach (var LLL in List_LLL)
{
UserData u = new UserData();
var LLL1 = new Deviceinfo();
var uuid = Guid.NewGuid().ToString("N");
LLL1.Uuid = uuid;
LLL1.DeviceName = LLL.DeviceName;
LLL1.OrderNo = LLL.MO;
LLL1.MachineType = LLL.MachineType;
LLL1.SecretKey = PasswordGenerator.Generate(16);
LLL1.Remark = LLL.Remark;
LLL1.ExcelBatchFlag = filebatch;
LLL1.CreateTime = DT;
LLL1.UpdateTime = DT;
LLL1.CreateTimeUnix = LT;
LLL1.UpdateTimeUnix = LT;
device_list.Add(LLL1);
// 如果 是MQTT才会
if (LLL.MachineType != 1)
{
EmqxLogininfo l = new EmqxLogininfo();
l.DeviceUuid = uuid;
l.UserName = LLL.DeviceName;
l.PassWord = GetId(l.UserName, uuid);
l.UpdateTime = DT;
l.UpdateTimeUnix = LT;
l.CreateTime = DT;
l.CreateTimeUnix = LT;
login_list.Add(l);
u.username = LLL1.DeviceName;
u.password = l.PassWord;
lll.Add(u);
}
//_context.EmqxLogininfos.Add(l);
}
_context.Deviceinfos.AddRange(device_list);
_context.EmqxLogininfos.AddRange(login_list);
_context.SaveChanges();
if (lll.Count > 0)
{
string tr = await RedisWriter(lll);
if (!string.IsNullOrEmpty(tr))
{
var rest = JsonSerializer.Deserialize<ReturnInfo>(tr);
if (rest?.isok == false)
{
throw new Exception("Redis写入失败");
}
}
}
_context.Database.CommitTransaction();
returnInfo.response = filebatch.ToString();
returnInfo.isok = true;
}
catch (Exception ex)
{
returnInfo.isok = false;
returnInfo.message = ex.Message;
}
return returnInfo;
}
[HttpPost()]
public async Task<ReturnInfo> DeleteDeviceinfo(Dictionary<string, string> data)
{
ReturnInfo r = new ReturnInfo();
try
{
string id = data["id"];
var deviceinfo = await _context.Deviceinfos.FindAsync(id);
if (deviceinfo == null)
{
r.isok = false;
r.message = "not found this data";
}
_context.Deviceinfos.Remove(deviceinfo);
await _context.SaveChangesAsync();
}
catch (Exception ex)
{
r.isok = false;
r.isok = true;
}
return r;
}
/// <summary>
/// 条件查询接口 - 根据MachineType、UUID和Brandld查询唯一记录
/// </summary>
/// <param name="queryParams">查询参数</param>
/// <returns>查询结果</returns>
[HttpPost]
public async Task<ReturnInfo> GetDeviceByCondition(DeviceQueryParams queryParams)
{
ReturnInfo r = new();
try
{
var query = _context.Deviceinfos
.Where(d => d.MachineType == queryParams.MachineType && d.McuUuid.Equals(queryParams.Mcu_Uuid));
// 如果Brandld不为空则添加Brandld条件
if (queryParams.Brandld != null)
{
query = query.Where(d => d.Brandld == queryParams.Brandld);
}
var ddd = query.ToList();
var deviceinfo = await query.FirstOrDefaultAsync();
r.isok = true;
r.response = deviceinfo;
}
catch (Exception ex)
{
r.isok = false;
r.message = ex.Message;
}
return r;
}
private bool DeviceinfoExists(long id)
{
return _context.Deviceinfos.Any(e => e.ClientId == id);
}
/// <summary>
/// 条件查询并修改接口
/// </summary>
/// <param name="queryParams">查询参数</param>
/// <returns>查询或更新后的记录</returns>
[HttpPost]
public async Task<ReturnInfo> GetOrUpdateDevice(DeviceQueryParams queryParams)
{
ReturnInfo r = new();
try
{
// 第一步:根据条件查询
var query = _context.Deviceinfos
.Where(d => d.MachineType == queryParams.MachineType && d.McuUuid.Equals(queryParams.Mcu_Uuid));
// 如果Brandld不为空则添加Brandld条件
if (queryParams.Brandld != null)
{
query = query.Where(d => d.Brandld == queryParams.Brandld);
}
var deviceinfo = await query.FirstOrDefaultAsync();
if (deviceinfo == null)
{
// 第二步查询ClientId最小MachineType匹配且Uuid为空的记录
var minClientIdQuery = _context.Deviceinfos
.Where(d => d.MachineType == queryParams.MachineType && string.IsNullOrEmpty(d.McuUuid))
.OrderBy(d => d.ClientId);
var minClientIdDevice = await minClientIdQuery.FirstOrDefaultAsync();
if (minClientIdDevice != null)
{
// 第三步:更新记录
minClientIdDevice.McuUuid = queryParams.Mcu_Uuid;
minClientIdDevice.Brandld = queryParams.Brandld;
minClientIdDevice.UpdateTime = DateTime.Now;
minClientIdDevice.UpdateTimeUnix = Tools.ToUnixTimestampBySeconds(DateTime.Now);
_context.Deviceinfos.Update(minClientIdDevice);
await _context.SaveChangesAsync();
// 第四步:查询更新后的记录
deviceinfo = await _context.Deviceinfos.FindAsync(minClientIdDevice.ClientId);
}
}
r.isok = true;
r.response = deviceinfo;
}
catch (Exception ex)
{
r.isok = false;
r.message = ex.Message;
}
return r;
}
}
}