You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
iot/projects/IoT.Shared/Areas/Admin/Controlls/AjaxController.cs

352 lines
13 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using Application.Domain.Entities;
using Cronos;
using Infrastructure.Data;
using Infrastructure.Extensions;
using Jint;
using Jint.Native;
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.Admin.Controlls
{
[Area("Admin")]
public class AjaxController
{
private readonly ILogger<AjaxController> _logger;
private readonly IRepository<Category> _categoryRepo;
private readonly IRepository<Organ> _organRepo;
private readonly IRepository<OrganNode> _organNodeRepo;
private readonly IRepository<OrganScene> _organSceneRepo;
private readonly IRepository<Node> _nodeRepo;
private readonly IRepository<Product> _productRepo;
private readonly IRepository<Api> _apiRepo;
private readonly IRepository<Device> _deviceRepo;
private readonly IRepository<Data> _dataRepo;
private readonly IRepository<Command> _commandRepo;
private readonly IRepository<Scene> _sceneRepo;
private readonly IRepository<SceneTigger> _sceneTiggerRepo;
public AjaxController(ILogger<AjaxController> logger,
IRepository<Category> categoryRepo,
IRepository<Product> productRepo,
IRepository<Organ> organRepo,
IRepository<OrganNode> organNodeRepo,
IRepository<OrganScene> organSceneRepo,
IRepository<Node> nodeRepo,
IRepository<Scene> sceneRepo,
IRepository<Command> commandRepo,
IRepository<Device> deviceRepo,
IRepository<Data> dataRepo,
IRepository<Api> apiRepo,
IRepository<SceneTigger> sceneTiggerRepo)
{
this._logger = logger;
this._categoryRepo = categoryRepo;
this._productRepo = productRepo;
this._organRepo = organRepo;
this._organNodeRepo = organNodeRepo;
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<Guid> selected)
{
if (selected == null)
{
selected = new List<Guid>();
}
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 SelectList GetOrganSelectList(Guid? selected = null)
{
var list = this._organRepo.ReadOnlyTable()
.Select(o => new { o.Id, Name = $"{o.Name}({o.Number})" })
.ToList();
return 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._organNodeRepo.ReadOnlyTable()
.Where(o => o.OrganId == parentId)
.Select(o => o.Node)
.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)
.Include(o => o.Node)
.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}[<5B><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>:{o.Value})(<28><>ǰ״̬:{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($"<22><><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>{result}");
}
}
catch (Exception ex)
{
ex.PrintStack();
return new JsonResult(ex.Message);
}
}
}
}