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.DependencyInjection; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Linq; namespace IoT.Shared.Areas.IoTCenter.Controlls { public class AjaxBaseController { protected readonly IServiceProvider _services; protected readonly ILogger _logger; protected readonly IHttpContextAccessor _httpContext; protected readonly IRepository _nodeRepo; protected readonly IRepository _productRepo; protected readonly IRepository _apiRepo; protected readonly IRepository _deviceRepo; protected readonly IRepository _dataRepo; public AjaxBaseController(IServiceProvider services,ILogger logger) { this._services = services; this._logger = logger; } public JsonResult GetIoTProduct(Guid? selected) { using var scope = this._services.CreateScope(); var repo = scope.ServiceProvider.GetRequiredService>(); var list = repo.ReadOnlyTable() .Select(o => new { o.Id, o.Name }) .ToList(); return new JsonResult(new SelectList(list, "Id", "Name", selected)); } public JsonResult GetIoTApi(Guid parentId, Guid? selected = null) { using var scope = this._services.CreateScope(); var repo = scope.ServiceProvider.GetRequiredService>(); var list = repo.ReadOnlyTable() .Where(o => o.ProductId == parentId) .Select(o => new { o.Id, o.Name }) .ToList(); return new JsonResult(new SelectList(list, "Id", "Name", selected)); } public JsonResult GetIoTApiByDevice(Guid parentId, Guid? selected = null) { using var scope = this._services.CreateScope(); var repo = scope.ServiceProvider.GetRequiredService>(); var list = repo.ReadOnlyTable() .Where(o => o.Id == parentId) .Select(o=>o.Product) .SelectMany(o=>o.Apis) .Select(o => new { o.Id, o.Name }) .ToList(); return new JsonResult(new SelectList(list, "Id", "Name", selected)); } public JsonResult GetIoTGateway(Guid? selected = null) { using var scope = this._services.CreateScope(); var repo = scope.ServiceProvider.GetRequiredService>(); var list = repo.ReadOnlyTable() .Select(o => new { o.Id, Name = $"[{o.Number}]{o.Name}" }) .ToList(); return new JsonResult(new SelectList(list, "Id", "Name", selected)); } public JsonResult GetIoTDevice(Guid parentId, Guid? selected = null) { using var scope = this._services.CreateScope(); var repo = scope.ServiceProvider.GetRequiredService>(); var list = repo.ReadOnlyTable() .Where(o => o.NodeId == parentId) .Select(o => new { o.Id, o.Name }) .ToList(); return new JsonResult(new SelectList(list, "Id", "Name", selected)); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 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); } #region Node #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)); //} #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 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 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(); } } }