using Cronos; using Infrastructure.Data; using Infrastructure.Extensions; using IoT.Shared.Application.Domain.Entities; using Jint; using Jint.Native; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Linq; namespace IoT.Shared.Areas.IoTCenter.Controlls { [Area("IoTCenter")] public class AjaxBaseController { protected readonly IServiceProvider _services; protected readonly ILogger _logger; protected readonly IHttpContextAccessor _httpContext; protected readonly IRepository _categoryRepo; protected readonly IRepository _organRepo; protected readonly IRepository _buildingIoTGatewayRepo; protected readonly IRepository _organSceneRepo; protected readonly IRepository _nodeRepo; protected readonly IRepository _productRepo; protected readonly IRepository _apiRepo; protected readonly IRepository _deviceRepo; protected readonly IRepository _dataRepo; protected readonly IRepository _commandRepo; protected readonly IRepository _sceneRepo; protected readonly IRepository _sceneTiggerRepo; public AjaxBaseController(IServiceProvider services, ILogger logger, IRepository categoryRepo, IRepository productRepo, IRepository organRepo, IRepository buildingIoTGatewayRepo, IRepository organSceneRepo, IRepository nodeRepo, IRepository sceneRepo, IRepository commandRepo, IRepository deviceRepo, IRepository dataRepo, IRepository apiRepo, IRepository sceneTiggerRepo) { this._services = services; this._logger = logger; this._categoryRepo = categoryRepo; this._productRepo = productRepo; this._organRepo = organRepo; this._buildingIoTGatewayRepo = buildingIoTGatewayRepo; this._organSceneRepo = organSceneRepo; this._nodeRepo = nodeRepo; this._sceneRepo = sceneRepo; this._commandRepo = commandRepo; this._deviceRepo = deviceRepo; this._dataRepo = dataRepo; this._apiRepo = apiRepo; this._sceneTiggerRepo = sceneTiggerRepo; } public MultiSelectList GetNodeMultiSelectList(IEnumerable selected) { if (selected == null) { selected = new List(); } var list = this._nodeRepo.ReadOnlyTable() .Select(o => new { o.Id, o.Name }) .ToList(); return new MultiSelectList(list, "Id", "Name", selected); } public SelectList GetCategorySelectList(Guid? selected = null) { var list = this._categoryRepo.ReadOnlyTable() .Select(o => new { o.Id, Name = $"{o.Name}({o.Number})" }) .ToList(); return new SelectList(list, "Id", "Name", selected); } #region Organ public JsonResult GetOrgan(Guid? selected = null, Guid? currentId = null, string search = null) { var list = this._organRepo.ReadOnlyTable() .Where(o => o.ParentId != null) .WhereIf(!string.IsNullOrEmpty(search), o => o.Name.Contains(search) || o.Number.Contains(search)) .WhereIf(selected.HasValue, o => o.Id == selected.Value) .WhereIf(currentId.HasValue, o => o.Id != currentId.Value) .OrderBy(o => o.Parent) .ThenBy(o => o.DisplayOrder) .Select(o => new { o.Id, Name = $"{o.Name}({o.Number})" }) .Take(20) .ToList(); return new JsonResult(new SelectList(list, "Id", "Name", selected)); } #endregion Organ #region Node public SelectList GetNodeSelectList(Guid? selected = null) { var list = this._nodeRepo.ReadOnlyTable() .Select(o => new { o.Id, Name = $"{o.Name}({o.Number})" }) .ToList(); return new SelectList(list, "Id", "Name", selected); } public SelectList GetNodeJson(Guid? selected = null) { return this.GetNodeSelectList(selected); } public SelectList GetOrganNodeSelectList(Guid parentId, Guid? selected = null) { var list = this._buildingIoTGatewayRepo.ReadOnlyTable() .Where(o => o.Building.OrganId == parentId) .Select(o => o.IoTGateway) .Select(o => new { o.Id, Name = $"{o.Name}({o.Number})" }) .ToList(); return new SelectList(list, "Id", "Name", selected); } public SelectList GetOrganNodeJson(Guid parentId, Guid? selected = null) { return this.GetOrganNodeSelectList(parentId, selected); } #endregion Node #region Scene public SelectList GetSceneSelectList(Guid parentId, Guid? selected = null) { var list = this._sceneRepo.ReadOnlyTable() .Where(o => o.NodeId == parentId) .Include(o => o.Node) .Select(o => new { o.Id, Name = $"{o.Node.Name}->{o.Name}" }) .ToList(); return new SelectList(list, "Id", "Name", selected); } public JsonResult GetSceneJson(Guid parentId, Guid? selected) { return new JsonResult(this.GetSceneSelectList(parentId, selected)); } public SelectList GetOrganSceneSelectList(Guid parentId, Guid? selected = null) { var list = this._organSceneRepo.ReadOnlyTable() .Where(o => o.OrganId == parentId) .Select(o => new { o.Id, o.Name }) .ToList(); return new SelectList(list, "Id", "Name", selected); } public JsonResult GetOrganSceneJson(Guid parentId, Guid? selected) { return new JsonResult(this.GetOrganSceneSelectList(parentId, selected)); } #endregion Scene #region IoTTigger public SelectList GetIoTTiggerSelectList(Guid parentId, Guid? selected = null) { var list = this._sceneTiggerRepo.ReadOnlyTable() .Where(o => o.Scene.NodeId == parentId) .Include(o => o.Scene).ThenInclude(o => o.Node) .Select(o => new { o.Id, Name = $"{o.Scene.Node.Name}->{o.Name}" }) .ToList(); return new SelectList(list, "Id", "Name", selected); } public JsonResult GetIoTTiggerJson(Guid parentId, Guid? selected) { return new JsonResult(this.GetIoTTiggerSelectList(parentId, selected)); } public SelectList GetGlobalIoTTiggerSelectList(Guid? selected = null) { var list = this._sceneTiggerRepo.ReadOnlyTable() .Where(o => o.Scene.NodeId == null) .Include(o => o.Scene.Node) .Select(o => new { o.Id, o.Name }) .ToList(); return new SelectList(list, "Id", "Name", selected); } public JsonResult GetGlobalIoTTiggerJson(Guid? selected) { return new JsonResult(this.GetGlobalIoTTiggerSelectList(selected)); } #endregion IoTTigger public SelectList GetCommandSelectList(Guid parentId, Guid? selected = null) { var list = this._commandRepo.ReadOnlyTable() .Where(o => o.Device.NodeId == parentId) .Include(o => o.Device) .ThenInclude(o => o.Node) .Select(o => new { o.Id, Name = $"{o.Device.Node.Name}->{o.Name}" }) .ToList(); return new SelectList(list, "Id", "Name", selected); } public JsonResult GetCommandJson(Guid parentId, Guid? selected) { return new JsonResult(this.GetCommandSelectList(parentId, selected)); } #region Device public SelectList GetDeviceSelectList(Guid parentId, Guid? selected = null) { var list = this._deviceRepo.ReadOnlyTable() .Where(o => o.NodeId == parentId) .Select(o => new { o.Id, Name = $"{o.DisplayName}({o.Number})" }) .ToList(); return new SelectList(list, "Id", "Name", selected); } public JsonResult GetDeviceJson(Guid parentId, Guid? selected) { return new JsonResult(this.GetDeviceSelectList(parentId, selected)); } public SelectList GetDeviceSelectList2(Guid parentId, Guid? selected = null) { var list = this._deviceRepo.ReadOnlyTable() .Where(o => o.NodeId == parentId && o.Product.Apis.Count() > 0) .Select(o => new { o.Id, Name = $"{o.DisplayName}({o.Number})" }) .ToList(); return new SelectList(list, "Id", "Name", selected); } public JsonResult GetDeviceJson2(Guid parentId, Guid? selected) { return new JsonResult(this.GetDeviceSelectList2(parentId, selected)); } #endregion Device #region Data public SelectList GetDataSelectList(Guid parentId, Guid? selected = null) { var list = this._dataRepo.ReadOnlyTable() .Where(o => !o.Hidden && o.DeviceId == parentId) .Select(o => new { o.Id, Name = $"{o.Name}[当前数据:{o.Value})(当前状态:{o.Description}]" }) .ToList(); return new SelectList(list, "Id", "Name", selected); } public JsonResult GetdataJson(Guid parentId, Guid? selected) { return new JsonResult(this.GetDataSelectList(parentId, selected)); } #endregion Data #region Api public SelectList GetProductSelectList(Guid? selected = null) { var list = this._productRepo.ReadOnlyTable() .Select(o => new { o.Id, o.Name }) .ToList(); return new SelectList(list, "Id", "Name", selected); } public SelectList GetApiSelectList(Guid parentId, Guid? selected = null) { var list = this._deviceRepo.ReadOnlyTable() .Where(o => o.Id == parentId).SelectMany(o => o.Product.Apis) .Select(o => new { o.Id, o.Name }) .ToList(); return new SelectList(list, "Id", "Name", selected); } public JsonResult GetApiJson(Guid parentId, Guid? selected) { return new JsonResult(this.GetApiSelectList(parentId, selected)); } public SelectList GetProductApiSelectList(Guid parentId, Guid? selected = null) { var list = this._apiRepo.ReadOnlyTable() .Where(o => o.ProductId == parentId) .Select(o => new { o.Id, o.Name }) .ToList(); return new SelectList(list, "Id", "Name", selected); } public JsonResult GetProductApiJson(Guid parentId, Guid? selected) { return new JsonResult(this.GetProductApiSelectList(parentId, selected)); } #endregion Api public SelectList GetCameraSelectList(string deviceNumber) { var list = this._deviceRepo.ReadOnlyTable() .Where(o => o.Product.Number == "onvifcamera") .WhereIf(!string.IsNullOrEmpty(deviceNumber), o => o.Number == deviceNumber) .Select(o => new { Id = o.Number, Name = o.DisplayName }) .ToList(); return new SelectList(list, "Id", "Name", deviceNumber); } #pragma warning disable CA1822 // Mark members as static public JsonResult CronValid(string cron) #pragma warning restore CA1822 // Mark members as static { try { CronExpression.Parse(cron, CronFormat.IncludeSeconds); return new JsonResult(true); } catch (Exception ex) { this._logger.LogError(ex.ToString()); return new JsonResult(ex.Message); } } public JsonResult ConditionValid(string condition, Guid dataId) { try { var data = this._dataRepo.ReadOnlyTable().FirstOrDefault(o => o.Id == dataId); var value = data.Value; var engine = new Engine().Execute($"function valid(value){{return {condition};}}"); var result = engine.Invoke("valid", value); if (result == JsValue.True || result == JsValue.False) { return new JsonResult(true); } else { return new JsonResult($"表达式运算结果无效:{result}"); } } catch (Exception ex) { ex.PrintStack(); return new JsonResult(ex.Message); } } protected bool IsAjax() { return this._httpContext.HttpContext.Request.IsAjax(); } } }