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

286 lines
10 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<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<SceneTimer> _sceneTimerRepo;
private readonly IRepository<SceneTigger> _sceneTiggerRepo;
public AjaxController(ILogger<AjaxController> logger,
IRepository<Category> categoryRepo,
IRepository<Product> productRepo,
IRepository<Node> nodeRepo,
IRepository<Scene> sceneRepo,
IRepository<Command> commandRepo,
IRepository<Device> deviceRepo,
IRepository<Data> dataRepo,
IRepository<Api> apiRepo,
IRepository<SceneTimer> sceneTimerRepo,
IRepository<SceneTigger> sceneTiggerRepo)
{
this._logger = logger;
this._categoryRepo = categoryRepo;
this._productRepo = productRepo;
this._nodeRepo = nodeRepo;
this._sceneRepo = sceneRepo;
this._commandRepo = commandRepo;
this._deviceRepo = deviceRepo;
this._dataRepo = dataRepo;
this._apiRepo = apiRepo;
this._sceneTimerRepo = sceneTimerRepo;
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 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);
}
#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 GetGlobalSceneSelectList(Guid? selected = null)
{
var list = this._sceneRepo.ReadOnlyTable()
.Where(o => o.NodeId == null)
.Include(o => o.Node)
.Select(o => new { o.Id, o.Name })
.ToList();
return new SelectList(list, "Id", "Name", selected);
}
public JsonResult GetGlobalSceneJson(Guid? selected)
{
return new JsonResult(this.GetGlobalSceneSelectList(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));
}
#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));
}
#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)
{
ex.PrintStack();
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);
}
}
}
}