using Application.Domain.Entities; using Application.Models; using Infrastructure.Application; using Infrastructure.Data; using Infrastructure.Extensions; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; namespace IoT.Shared.Areas.Admin.Controlls { [Authorize] [Area(nameof(Admin))] public class CommandController : SharedController, EditCommandModel, EditCommandModel> { private readonly IRepository _nodeRepo; private readonly IRepository _apiRepo; private readonly IRepository _deviceRepo; private readonly AjaxController _ajax; public CommandController(IRepository nodeRepo, IRepository repo, IRepository apiRepo, IRepository deviceRepo, AjaxController ajax, IServiceProvider sp) : base(repo, sp) { this._nodeRepo = nodeRepo; this._apiRepo = apiRepo; this._deviceRepo = deviceRepo; this._ajax = ajax; } public override IQueryable Include(IQueryable query) { return query.Include(o => o.Device).ThenInclude(o => o.Node).Include(o => o.Api); } public IActionResult Api(Guid apiId, Guid deviceId) { var model = this.GetParameters(apiId, deviceId, null); return PartialView("_Api", model); } public override void ToDisplayModel(Command entity, EditCommandModel model) { if (entity != null) { model.NodeId = entity.Device.NodeId; ViewData.Add(model.ApiId, entity.Api.Name); ViewData.Add(model.DeviceId, entity.Device.DisplayName); ViewData.Add(model.NodeId, entity.Device.Node.Name); } } public override void ToEditModel(Command entity, EditCommandModel model) { this.ToDisplayModel(entity, model); ViewData.SelectList(o => model.NodeId, () => this._ajax.GetNodeSelectList(model.NodeId)); 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, model.DeviceId.Value, model.QueryString); } } private List GetParameters(Guid apiId, Guid deviceId, string queryString) { var api = this._apiRepo.ReadOnlyTable().Include(o => o.Parameters).FirstOrDefault(o => o.Id == apiId); var device = this._deviceRepo.ReadOnlyTable().Include(o => o.Data).FirstOrDefault(o => o.Id == deviceId); ViewData["Number"] = device.Number; var parameters = api.Parameters.Where(o => o.Description != "设备编号").ToList().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 (device.Name == "红外转发器") { if (!api.Path.Contains("add") && !api.Path.Contains("get")) { foreach (var item in parameters) { if (item.Name == "code") { var list = 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; } public override void ToEntity(EditCommandModel model, Command entity) { model.QueryString = model.GetQueryString(); } public override string GetNodeNumber(EditCommandModel model) { return this._nodeRepo.ReadOnlyTable().Where(o => o.Id == model.NodeId).Select(o => o.Number).FirstOrDefault(); } } }