210 lines
7.5 KiB
C#
210 lines
7.5 KiB
C#
/*
|
||
*接口编写处...
|
||
*如果接口需要做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; } = "";
|
||
}
|
||
}
|