using System; using System.Collections.Generic; using System.Linq; using Application.Domain.Entities; using Application.Models; using Application.Services; using Infrastructure.Application; using Infrastructure.Data; using Infrastructure.Extensions; using Infrastructure.Web.Mvc; using IoTShared.Controllers; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.AspNetCore.SignalR; using Microsoft.EntityFrameworkCore; namespace IoTCenter.Areas.Admin.Controllers { [Authorize] [Area(nameof(Admin))] public class CommandController : CrudController, DisplayCommandModel, EditCommandModel> { private readonly IRepository _nodeRepo; private readonly IRepository _senceRepo; private readonly IRepository _apiRepo; private readonly IRepository _repo; private readonly AjaxController _ajax; private readonly IHubContext _pageHubContext; public CommandController(IRepository nodeRepo, IRepository senceRepo, IRepository apiRepo, IRepository repo, AjaxController ajax, IHubContext pageHubContext) : base(repo) { this._repo = repo; this._nodeRepo = nodeRepo; this._senceRepo = senceRepo; this._apiRepo = apiRepo; this._ajax = ajax; this._pageHubContext = pageHubContext; } public override IActionResult Add(EditCommandModel model) { if (ModelState.IsValid) { var number = this._nodeRepo.ReadOnlyTable().FirstOrDefault(o => o.Id == model.NodeId).Number; this._pageHubContext.Clients.Group(number).SendAsync(nameof(INodeService.CreateCommand), model); return RedirectTo(); } ModelState.AddModelError("", "服务器出现异常,请稍后重试"); return View(model); } public override IActionResult Edit(EditCommandModel model) { if (ModelState.IsValid) { var entity = this._repo.Table().FirstOrDefault(o => o.Id == model.Id); var number = this._nodeRepo.ReadOnlyTable().FirstOrDefault(o => o.Id == model.NodeId).Number; this._pageHubContext.Clients.Group(number).SendAsync(nameof(INodeService.EditCommand), model); return RedirectTo(); } ModelState.AddModelError("", "服务器出现异常,请稍后重试"); return View(model); } public override IActionResult Delete(List list) { foreach (var id in list) { try { var entity = this._repo.Table().FirstOrDefault(o => o.Id == id); var number = this._nodeRepo.ReadOnlyTable().FirstOrDefault(o => o.Sences.Any(s => s.Id == entity.SenceId)).Number; this._pageHubContext.Clients.Group(number).SendAsync(nameof(INodeService.DeleteCommand), id); } catch (Exception ex) { ex.PrintStack(); return RedirectTo(message: ex.Message); } } return RedirectTo(); } public IActionResult Api(Guid id) { var model = this.GetParameters(id, null); return PartialView("_Api", model); } public override IQueryable Include(IQueryable query) { return query.Include(o => o.Sence).Include(o => o.Api).ThenInclude(o => o.Device).ThenInclude(o => o.Node); } public override void ToDisplayModel(Command entity, DisplayCommandModel model) { model.NodeId = entity.Api.Device.Node.Name; model.DeviceId = entity.Api.Device.DisplayName; model.ApiId = entity.Api.Name; model.SenceId = entity.Sence.Name; } public override void ToModel(Command entity, EditCommandModel model) { if (entity != null) { model.NodeId = entity.Api.Device.NodeId; model.DeviceId = entity.Api.DeviceId; } ViewData.SelectList(o => model.NodeId, () => this._ajax.GetNodeSelectList(model.NodeId)); ViewData.SelectList(o => model.SenceId, () => this._ajax.GetSenceSelectList(model.NodeId.Value, model.SenceId), model.NodeId.HasValue); ViewData.SelectList(o => model.DeviceId, () => this._ajax.GetDeviceSelectList(model.NodeId.Value, model.DeviceId), model.NodeId.HasValue); ViewData.SelectList(o => model.ApiId, () => this._ajax.GetApiSelectList(model.DeviceId.Value, model.ApiId), model.DeviceId.HasValue); if (model.ApiId.HasValue) { model.Parameters = this.GetParameters(model.ApiId.Value, entity.QueryString); } } public override void ToEntity(EditCommandModel model, Command entity) { entity.QueryString = model.GetQueryString(); } private List GetParameters(Guid apiId, string queryString) { var api = this._apiRepo.ReadOnlyTable().Include(o => o.Parameters).Include(o => o.Device).ThenInclude(o => o.Data).FirstOrDefault(o => o.Id == apiId); ViewData["Number"] = api.Device.Number; var parameters = api.Parameters.Select(o => o.To()).ToList(); if (!string.IsNullOrEmpty(queryString)) { foreach (var item in queryString.Split('&')) { var array = item.Split('='); var name = array[0]; var vlaue = array[1]; var param = parameters.FirstOrDefault(o => o.Name == name); if (param != null) { param.Value = vlaue; } } } if (api.Device.Name == "红外转发器") { if (!api.Path.Contains("add") && !api.Path.Contains("get")) { foreach (var item in parameters) { if (item.Name == "code") { var list = api.Device.Data.Where(o => o.Name != "状态").ToList() .Select(o => new SelectListItem { Text = o.Name, Value = o.Value }); item.SelectList = new SelectList(list, "Value", "Text", item.Value); } } } } return parameters; } } }