using Infrastructure.Application.Services.Settings; using Infrastructure.Data; using Infrastructure.Extensions; using Application.Domain.Entities; using IoT.Shared.Application.Models; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.SignalR; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using Platform.Services; using System; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Threading; namespace Platform.Apis.Controllers { [ApiVersion("1.0")] [Route("api/v{version:apiVersion}/[controller]/[action]")] [ApiController] public class NodeController : ControllerBase { private readonly ILogger _logger; private readonly ISettingService _settingService; //private readonly IRepository _nodeCategoryNodeRepo; private readonly IRepository _nodeRepo; private readonly IRepository _deviceRepo; private readonly IRepository _organRepo; private readonly IHubContext _hub; public NodeController( ILogger logger, ISettingService settingService, //IRepository nodeCategoryNodeRepo, IRepository nodeRepo, IRepository deviceRepo, IRepository organRepo, IHubContext hub) { this._logger = logger; this._settingService = settingService; //this._nodeCategoryNodeRepo = nodeCategoryNodeRepo; this._nodeRepo = nodeRepo; this._deviceRepo = deviceRepo; this._organRepo = organRepo; this._hub = hub; } [HttpPost] public ActionResult GetNodes(string organNumber) { var gateways = this._organRepo.ReadOnlyTable().Where(o => o.Number == organNumber) .SelectMany(o => o.Buildings) .SelectMany(o => o.IoTGateways) .ToList(); try { var model = this._nodeRepo.ReadOnlyTable() //.WhereIf(!string.IsNullOrWhiteSpace(organNumber), o => o.BuildingIoTGateways.Any(on => on.Building.Organ.Number == organNumber)) .Where(o => !o.Hidden) .OrderBy(o => o.Name) .ToList() .Select(o => new { o.Id, o.Name, o.Number, o.IsOnline, o.Image, o.Order, Count = _deviceRepo.ReadOnlyTable().Count(d => d.IoTGatewayId == o.Id), //Category = _nodeCategoryNodeRepo.ReadOnlyTable().Include(ncn => ncn.Category).FirstOrDefault(ncn => ncn.NodeId == o.Id)?.Category }); return Ok(model); } catch (Exception ex) { ex.PrintStack(); return Problem(ex.Message); } } [HttpPost] public ActionResult GetNode([Required(ErrorMessage = nameof(RequiredAttribute))] string number) { try { var model = this._nodeRepo.ReadOnlyTable() //.Include(o => o.Scenes) .Include(o => o.Devices).ThenInclude(o => o.IoTProduct) .Include(o => o.Devices).ThenInclude(o => o.Data) .Where(o => o.Number == number) .FirstOrDefault(); //model.Scenes = model.Scenes.Where(o => !o.Hidden).OrderBy(o => o.Order).ToList(); return Ok(model); } catch (Exception ex) { ex.PrintStack(); return Problem(ex.Message); } } [HttpPost] public ActionResult PowerOn([FromBody][Required(ErrorMessage = nameof(RequiredAttribute))] string number) { return this.Power(number, "On"); } [HttpPost] public ActionResult PowerOff([FromBody][Required(ErrorMessage = nameof(RequiredAttribute))] string number) { return this.Power(number, "Off"); } [HttpPost] public ActionResult Upload([FromBody][Required(ErrorMessage = nameof(RequiredAttribute))] string number) { this._hub.ServerToClient(Methods.UploadNode, "", number); return Ok(); } [HttpPost] public IActionResult Stop([FromBody][Required(ErrorMessage = nameof(RequiredAttribute))] string number) { this._hub.ServerToClient(Methods.StopNode, "", number); return Ok(); } [HttpPost] private ActionResult Power(string number, string command) { var devices = this._deviceRepo.ReadOnlyTable() .Include(o => o.IoTGateway) .Include(o => o.IoTProduct) .ThenInclude(o => o.IoTApis) .Where(o => o.IoTGateway.Number == number) .Where(o => o.Name.Contains("开关") || o.Name.Contains("插座")) .ToList(); foreach (var device in devices) { try { var api = device.IoTProduct.IoTApis.FirstOrDefault(o => o.Command == command); if (api != null) { var message = $"{api.Path}{api.Command}?number={device.Number}"; this._hub.ServerToClient(Methods.ExecDeviceApi, message, device.IoTGateway.Number, null); Delay(0); } } catch (Exception ex) { ex.PrintStack(); } } return Ok(); } private void Delay(int commandDelay) { var delay = 0; try { delay = Convert.ToInt32(this._settingService.GetValue("delay")); } catch (Exception ex) { this._logger.LogError(ex.ToString()); } if (commandDelay > 0) { delay += commandDelay; } if (delay > 0) { Thread.Sleep(delay); } } } }