Files
SecMPS/api_sqlsugar/VolPro.WebApi/Controllers/Warehouse/Partial/gateway_nodesController.cs
2026-05-16 23:24:41 +08:00

210 lines
7.5 KiB
C#
Raw 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.
/*
*接口编写处...
*如果接口需要做Action的权限验证请在Action上使用属性
*如: [ApiActionPermission("gateway_nodes",Enums.ActionPermissionOptions.Search)]
*/
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Http;
using VolPro.Entity.DomainModels;
using Warehouse.IServices;
namespace Warehouse.Controllers
{
public partial class gateway_nodesController
{
private readonly Igateway_nodesService _service;//访问业务代码
private readonly IHttpContextAccessor _httpContextAccessor;
[ActivatorUtilitiesConstructor]
public gateway_nodesController(
Igateway_nodesService service,
IHttpContextAccessor httpContextAccessor
)
: base(service)
{
_service = service;
_httpContextAccessor = httpContextAccessor;
}
[ActivatorUtilitiesConstructor]
public gateway_nodesController(
Igateway_nodesService service,
IHttpContextAccessor httpContextAccessor
)
: base(service)
{
_service = service;
_httpContextAccessor = httpContextAccessor;
}
/// <summary>A1: 网关注册 (Upsert)</summary>
[HttpPost]
[Route("/api/gateway/register")]
public async Task<IActionResult> RegisterGateway([FromBody] GatewayRegisterRequest req)
{
if (string.IsNullOrEmpty(req.NodeCode) || string.IsNullOrEmpty(req.Token))
return BadRequest(new { message = "NodeCode and Token required" });
var existing = await _service.FindAsIQueryable(x => x.NodeCode == req.NodeCode)
.FirstOrDefaultAsync();
gateway_nodes entity;
if (existing != null)
{
// 验证 Token
if (existing.NodeToken != req.Token)
return StatusCode(401, new { message = "认证失败" });
entity = existing;
entity.AdapterTypes = req.AdapterTypes;
entity.BaseUrl = req.BaseUrl;
entity.IsOnline = "在线";
entity.LastHeartbeat = DateTime.Now;
await _service.UpdateAsync(entity);
}
else
{
entity = new gateway_nodes
{
NodeCode = req.NodeCode,
NodeName = req.NodeCode,
NodeToken = req.Token,
AdapterTypes = req.AdapterTypes,
BaseUrl = req.BaseUrl,
IsOnline = "在线",
LastHeartbeat = DateTime.Now,
Enable = "启用",
CreateDate = DateTime.Now
};
await _service.AddAsync(entity);
}
var devices = await _service.ServiceProvider.GetService<VolPro.WebApi.Controllers.Warehouse.base_deviceController>()
?.GetDevicesForGateway(entity.NodeId) ?? new List<object>();
return Ok(new { nodeId = entity.NodeId, devices });
}
/// <summary>A2: 心跳</summary>
[HttpPost]
[Route("/api/gateway/heartbeat")]
public async Task<IActionResult> GatewayHeartbeat([FromBody] GatewayHeartbeatRequest req)
{
var entity = await _service.FindAsIQueryable(x => x.NodeCode == req.NodeCode && x.NodeToken == req.Token)
.FirstOrDefaultAsync();
if (entity == null)
return StatusCode(401, new { message = "认证失败" });
entity.IsOnline = "在线";
entity.LastHeartbeat = DateTime.Now;
await _service.UpdateAsync(entity);
return Ok(new { status = "ok", serverTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") });
}
/// <summary>A3: 设备数据同步</summary>
[HttpPost]
[Route("/api/gateway/sync/devices")]
public async Task<IActionResult> SyncDevices([FromBody] SyncDevicesRequest req)
{
var node = await _service.FindAsIQueryable(x => x.NodeCode == req.NodeCode && x.NodeToken == req.Token)
.FirstOrDefaultAsync();
if (node == null) return StatusCode(401, new { message = "认证失败" });
int added = 0, updated = 0;
foreach (var d in req.Devices)
{
// delegate to base_device service
}
return Ok(new { added, updated, removed = 0 });
}
/// <summary>A4: 告警同步</summary>
[HttpPost]
[Route("/api/gateway/sync/alarms")]
public async Task<IActionResult> SyncAlarms([FromBody] SyncAlarmsRequest req)
{
var node = await _service.FindAsIQueryable(x => x.NodeCode == req.NodeCode && x.NodeToken == req.Token)
.FirstOrDefaultAsync();
if (node == null) return StatusCode(401, new { message = "认证失败" });
int added = 0;
foreach (var a in req.Alarms)
{
var alarm = new iot_alarm
{
SourceAlarmId = a.SourceAlarmId,
DeviceId = null, // resolved later
AdapterCode = a.AdapterCode,
AlarmLevel = a.Level,
AlarmDesc = a.Desc,
AlarmValue = a.Value,
StartTime = DateTime.Parse(a.StartTime),
State = "未确认",
CreateDate = DateTime.Now
};
await _service.ServiceProvider.GetService<IIoT_AlarmService>()?.AddAsync(alarm);
added++;
}
return Ok(new { added });
}
}
public class GatewayRegisterRequest
{
public string NodeCode { get; set; } = "";
public string Token { get; set; } = "";
public string AdapterTypes { get; set; } = "";
public string BaseUrl { get; set; } = "";
}
public class GatewayHeartbeatRequest
{
public string NodeCode { get; set; } = "";
public string Token { get; set; } = "";
}
public class SyncDevicesRequest
{
public string NodeCode { get; set; } = "";
public string Token { get; set; } = "";
public List<SyncDeviceItem> Devices { get; set; } = new();
}
public class SyncDeviceItem
{
public string AdapterCode { get; set; } = "";
public string SourceId { get; set; } = "";
public string Name { get; set; } = "";
public string Category { get; set; } = "";
public string Group { get; set; } = "";
public bool IsParent { get; set; }
public string? ParentSourceId { get; set; }
public bool IsOnline { get; set; }
public string? IpAddress { get; set; }
public int? Port { get; set; }
public Dictionary<string, object?>? ExtraData { get; set; }
}
public class SyncAlarmsRequest
{
public string NodeCode { get; set; } = "";
public string Token { get; set; } = "";
public List<SyncAlarmItem> Alarms { get; set; } = new();
}
public class SyncAlarmItem
{
public string SourceAlarmId { get; set; } = "";
public string DeviceSourceId { get; set; } = "";
public string AdapterCode { get; set; } = "";
public string Level { get; set; } = "";
public string Desc { get; set; } = "";
public double? Value { get; set; }
public string StartTime { get; set; } = "";
}
}