diff --git a/projects/Infrastructure/Extensions/ObjectMapperExtensions.cs b/projects/Infrastructure/Extensions/ObjectMapperExtensions.cs index 3792e43b..60df117f 100644 --- a/projects/Infrastructure/Extensions/ObjectMapperExtensions.cs +++ b/projects/Infrastructure/Extensions/ObjectMapperExtensions.cs @@ -52,10 +52,7 @@ namespace Infrastructure.Extensions protected override void SetValue(object source, object target, PropertyInfo sp, PropertyInfo tp) { - if (!sp.CustomAttributes.Any(o => o.AttributeType == typeof(ReadOnlyAttribute))) - { - base.SetValue(source, target, sp, tp); - } + base.SetValue(source, target, sp, tp); } } diff --git a/projects/IoT/IoT.Shared/Application/Domain/Entities/Device.cs b/projects/IoT/IoT.Shared/Application/Domain/Entities/Device.cs index d57643ae..25aa0b37 100644 --- a/projects/IoT/IoT.Shared/Application/Domain/Entities/Device.cs +++ b/projects/IoT/IoT.Shared/Application/Domain/Entities/Device.cs @@ -9,15 +9,15 @@ namespace Application.Domain.Entities [Display(Name = "设备")] public class Device : BaseEntity { - [Display(Name = "网关编号")] - public string Gateway { get; set; } - [Display(Name = "名称")] public string Name { get; set; } [Display(Name = "编号")] public string Number { get; set; } + [Display(Name = "网关编号")] + public string Gateway { get; set; } + [Display(Name = "显示名称")] public string DisplayName { get; set; } diff --git a/projects/IoT/IoT.Shared/Application/Models/EditDeviceModel.cs b/projects/IoT/IoT.Shared/Application/Models/EditDeviceModel.cs index 87d01e91..d7be63e2 100644 --- a/projects/IoT/IoT.Shared/Application/Models/EditDeviceModel.cs +++ b/projects/IoT/IoT.Shared/Application/Models/EditDeviceModel.cs @@ -1,4 +1,6 @@ using Infrastructure.Application; +using Microsoft.AspNetCore.Mvc; +using System.ComponentModel; using System.ComponentModel.DataAnnotations; namespace Application.Models @@ -6,21 +8,15 @@ namespace Application.Models [Display(Name = "设备")] public class EditDeviceModel : EditModel { - [Display(Name = "节点编号")] - [Required(ErrorMessage = nameof(RequiredAttribute))] - public string NodeNumber { get; set; } - - [Display(Name = "型号")] - [Required(ErrorMessage = nameof(RequiredAttribute))] - public string InfoNumber { get; set; } - - [Display(Name = "网关编号")] - public string GatewayNumber { get; set; } + [HiddenInput(DisplayValue = false)] + [ScaffoldColumn(true)] + public string ProductNumber { get; set; } - [Display(Name = "分类编号")] - [Required(ErrorMessage = nameof(RequiredAttribute))] - public string CategoryNumber { get; set; } + [HiddenInput(DisplayValue = false)] + [ScaffoldColumn(true)] + public string NodeNumber { get; set; } + [ReadOnly(true)] [Display(Name = "名称")] [Required(ErrorMessage = nameof(RequiredAttribute))] public string Name { get; set; } @@ -28,24 +24,27 @@ namespace Application.Models [Display(Name = "显示名称")] public string DisplayName { get; set; } - [Display(Name = "标记")] - public string Tag { get; set; } - [Display(Name = "用户名")] public string UserName { get; set; } [Display(Name = "密码")] public string Password { get; set; } + [Display(Name = "启用")] + public bool Enable { get; set; } + + [ReadOnly(true)] [Display(Name = "编号")] [Required(ErrorMessage = nameof(RequiredAttribute))] public string Number { get; set; } + [ReadOnly(true)] [Display(Name = "在线状态")] public bool IsOnline { get; set; } [Display(Name = "连接Id")] [Required(ErrorMessage = nameof(RequiredAttribute))] + [ReadOnly(true)] public string ConnectId { get; set; } } } \ No newline at end of file diff --git a/projects/IoT/IoT.Shared/Application/Models/Methods.cs b/projects/IoT/IoT.Shared/Application/Models/Methods.cs index ef85516b..8782eaef 100644 --- a/projects/IoT/IoT.Shared/Application/Models/Methods.cs +++ b/projects/IoT/IoT.Shared/Application/Models/Methods.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace IoT.Shared.Application.Models +namespace IoT.Shared.Application.Models { public class Methods { @@ -26,5 +22,11 @@ namespace IoT.Shared.Application.Models public const string EditNodeRequest = nameof(EditNodeRequest); public const string EditNodeResponse = nameof(EditNodeResponse); + + public const string EditDeviceRequest = nameof(EditDeviceRequest); + public const string EditDeviceResponse = nameof(EditDeviceResponse); + + public const string DeleteDeviceRequest = nameof(DeleteDeviceRequest); + public const string DeleteDeviceResponse = nameof(DeleteDeviceResponse); } } \ No newline at end of file diff --git a/projects/IoT/IoT.Shared/Infrastructure/ClientService.cs b/projects/IoT/IoT.Shared/Infrastructure/ClientService.cs index fcd108de..ffffa4df 100644 --- a/projects/IoT/IoT.Shared/Infrastructure/ClientService.cs +++ b/projects/IoT/IoT.Shared/Infrastructure/ClientService.cs @@ -114,6 +114,38 @@ namespace IoT.Shared.Infrastructure } } } + else if (method == Methods.EditDeviceRequest) + { + var model = message.FromJson(); + using (var scope = this.applicationServices.CreateScope()) + { + var deviceRepo = scope.ServiceProvider.GetService>(); + var device = deviceRepo.Table().FirstOrDefault(o => o.Number == model.Number); + if (device != null) + { + device.From(model); + deviceRepo.SaveChanges(); + var deviceDto = device.To(); + deviceDto.NodeNumber = model.NodeNumber; + deviceDto.ProductNumber = model.ProductNumber; + this.ClientToServer(Methods.EditDeviceResponse, deviceDto.ToJson()); + } + } + } + else if (method == Methods.DeleteDeviceRequest) + { + using (var scope = this.applicationServices.CreateScope()) + { + var deviceRepo = scope.ServiceProvider.GetService>(); + var device = deviceRepo.Table().FirstOrDefault(o => o.Number == message); + if (device != null) + { + deviceRepo.Delete(device); + deviceRepo.SaveChanges(); + this.ClientToServer(Methods.DeleteDeviceResponse, message); + } + } + } } public void SendNode(NodeDto node) diff --git a/projects/IoTCenter/Areas/Admin/Controllers/IoT/DeviceController.cs b/projects/IoTCenter/Areas/Admin/Controllers/IoT/DeviceController.cs index 2ec51328..1ef89544 100644 --- a/projects/IoTCenter/Areas/Admin/Controllers/IoT/DeviceController.cs +++ b/projects/IoTCenter/Areas/Admin/Controllers/IoT/DeviceController.cs @@ -1,9 +1,18 @@ using Application.Domain.Entities; using Application.Models; using Infrastructure.Data; +using Infrastructure.Extensions; using Infrastructure.Web.Mvc; +using IoT.Shared.Application.Models; +using IoTCenter.Services; +using IoTShared.Controllers; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.SignalR; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; namespace IoTCenter.Areas.Admin.Controllers { @@ -11,8 +20,62 @@ namespace IoTCenter.Areas.Admin.Controllers [Area(nameof(Admin))] public class DeviceController : CrudController { - public DeviceController(IRepository repo) : base(repo) + private readonly AjaxController _ajax; + private readonly IHubContext _pageHubContext; + + public DeviceController(IRepository repo, AjaxController ajax, IHubContext pageHubContext) : base(repo) + { + this._ajax = ajax; + this._pageHubContext = pageHubContext; + } + + public override IQueryable Include(IQueryable query) + { + return query.Include(o => o.Product).Include(o => o.Node); + } + + public override IQueryable Query(DeviceSearchMode model, IQueryable query) + { + ViewData.SelectList(o => model.NodeId, () => this._ajax.GetNodeSelectList(model.NodeId)); + return query.WhereIf(model.NodeId.HasValue, o => o.NodeId == model.NodeId.Value) + .WhereIf(!string.IsNullOrEmpty(model.Keyword), o => o.Name.Contains(model.Keyword)); + } + + public override void ToModel(Device entity, EditDeviceModel model) + { + model.NodeNumber = entity.Node.Number; + model.ProductNumber = entity.Product.Number; + } + + public override IActionResult Edit(EditDeviceModel model) + { + if (ModelState.IsValid) + { + var deviceDto = model.To(); + this._pageHubContext.Clients.Group(model.NodeNumber).SendAsync(Methods.ServerToClient, Methods.EditDeviceRequest, deviceDto.ToJson(), null); + return RedirectTo(); + } + ModelState.AddModelError("", "쳣Ժ"); + return View(model); + } + + public override IActionResult Delete(List list) { + foreach (var id in list) + { + try + { + var entity = this.repo.Table().Include(o => o.Node).FirstOrDefault(o => o.Id == id); + var number = entity.Node.Number; + this._pageHubContext.Clients.Group(number).SendAsync(Methods.ServerToClient, Methods.DeleteDeviceRequest, entity.Number, null); + } + catch (Exception ex) + { + ex.PrintStack(); + return RedirectTo(message: ex.Message); + } + } + return RedirectTo(); } } } \ No newline at end of file diff --git a/projects/IoTCenter/Areas/Admin/Controllers/IoT/NodeController.cs b/projects/IoTCenter/Areas/Admin/Controllers/IoT/NodeController.cs index 6d9079c2..fd7adeb7 100644 --- a/projects/IoTCenter/Areas/Admin/Controllers/IoT/NodeController.cs +++ b/projects/IoTCenter/Areas/Admin/Controllers/IoT/NodeController.cs @@ -29,7 +29,6 @@ namespace IoTCenter.Areas.Admin.Controllers if (ModelState.IsValid) { var nodeDto = model.To(); - nodeDto.Number = model.Number; this._pageHubContext.Clients.Group(model.Number).SendAsync(Methods.ServerToClient, Methods.EditNodeRequest, nodeDto.ToJson(), null); return RedirectTo(); } diff --git a/projects/IoTCenter/Services/PageHub.cs b/projects/IoTCenter/Services/PageHub.cs index 8d3a36d2..41971b21 100644 --- a/projects/IoTCenter/Services/PageHub.cs +++ b/projects/IoTCenter/Services/PageHub.cs @@ -56,6 +56,14 @@ namespace IoTCenter.Services { this.UpdateNode(message); } + else if (method == Methods.EditDeviceResponse) + { + this.UpdateDevice(message); + } + else if (method == Methods.DeleteDeviceResponse) + { + this.DeleteDevice(message); + } } private void UpdateNode(string message) @@ -164,6 +172,29 @@ namespace IoTCenter.Services } } + private void DeleteDevice(string number) + { + try + { + Console.WriteLine("iot center> receive device message"); + using (var scope = this._applicationService.CreateScope()) + { + var deviceRepo = scope.ServiceProvider.GetService>(); + var device = deviceRepo.Table().FirstOrDefault(o => o.Number == number); + if (device != null) + { + deviceRepo.Delete(device); + deviceRepo.SaveChanges(); + this.Clients.Group("page").SendAsync("DeleteDevice", number); + } + } + } + catch (Exception ex) + { + ex.PrintStack(); + } + } + private void UpdateData(string message) { Console.WriteLine("iot center> receive data message"); diff --git a/projects/IoTClient/Assets/StreamingAssets/wwwroot/index.html b/projects/IoTClient/Assets/StreamingAssets/wwwroot/index.html index 07c5b1b8..b556be24 100644 --- a/projects/IoTClient/Assets/StreamingAssets/wwwroot/index.html +++ b/projects/IoTClient/Assets/StreamingAssets/wwwroot/index.html @@ -892,10 +892,10 @@ } }); connection.on("DeleteDevice", (message) => { - var newDevice = JSON.parse(message); + var number = message; if (node && node.Node.Id === newDevice.NodeId) { for (var i = 0; i < node.Node.Devices.length; i++) { - if (node.Node.Devices[i].Number == newDevice.Number) { + if (node.Node.Devices[i].Number == number) { node.Node.Devices.splice(i, 1); break; }