From 5f9ef2bb86a16e7829cf78b408bcc99a23d0407a Mon Sep 17 00:00:00 2001 From: wanggang <76527413@qq.com> Date: Fri, 18 Oct 2019 16:59:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8E=E5=8F=B0=E7=AE=A1=E7=90=86=E9=83=A8?= =?UTF-8?q?=E5=88=86=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Former-commit-id: 740f96251dbcd0b19abce138885c0fc772546d55 --- docs/研发/v1.0任务分解.xlsx | Bin 22762 -> 23631 bytes .../Application/Domain/Entities/Scene.cs | 5 -- .../Services/IoTCenter/IoTCenterHub.cs | 2 +- .../IoTCenter/Controllers/AppController.cs | 63 ++++++++++++++++++ .../IoTCenter/Controllers/HomeController.cs | 8 ++- projects/IoTCenter/wwwroot/home.html | 13 +++- projects/IoTCenter/wwwroot/node.html | 6 ++ 7 files changed, 88 insertions(+), 9 deletions(-) diff --git a/docs/研发/v1.0任务分解.xlsx b/docs/研发/v1.0任务分解.xlsx index bf0328975b0c7536c62aa08559e376954d69a941..67ef239e846adff2223c0b4a6fa889f333266c7c 100644 GIT binary patch delta 16144 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 Bfn5Lq delta 15355 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 diff --git a/projects/IoT.Shared/Application/Domain/Entities/Scene.cs b/projects/IoT.Shared/Application/Domain/Entities/Scene.cs index c0c31c93..835fafd3 100644 --- a/projects/IoT.Shared/Application/Domain/Entities/Scene.cs +++ b/projects/IoT.Shared/Application/Domain/Entities/Scene.cs @@ -25,11 +25,6 @@ namespace Application.Domain.Entities /// public Node Node { get; set; } - /// - /// 命令 - /// - public List Commands { get; set; } = new List(); - public List SceneCommands { get; set; } = new List(); } } \ No newline at end of file diff --git a/projects/IoT.Shared/Services/IoTCenter/IoTCenterHub.cs b/projects/IoT.Shared/Services/IoTCenter/IoTCenterHub.cs index 915c4426..194ab8b7 100644 --- a/projects/IoT.Shared/Services/IoTCenter/IoTCenterHub.cs +++ b/projects/IoT.Shared/Services/IoTCenter/IoTCenterHub.cs @@ -179,7 +179,7 @@ namespace IoTCenter.Services this._dataService.Edit(model); this._eventPublisher.Publish(new EntityUpdatedEvent(model.To())); // - var device = _deviceRepo.ReadOnlyTable().Include(o => o.Data).Where(o => o.Id == model.DeviceId).FirstOrDefault(); + var device = _deviceRepo.ReadOnlyTable().Include(o => o.Data).Include(o => o.Commands).Where(o => o.Id == model.DeviceId).FirstOrDefault(); this.Clients.Group("page").SendAsync("UpdateDevice", device.ToJson()); } else if (method == $"Delete{nameof(Data)}")//删除数据返回 diff --git a/projects/IoTCenter/Controllers/AppController.cs b/projects/IoTCenter/Controllers/AppController.cs index 28924954..9528eaa0 100644 --- a/projects/IoTCenter/Controllers/AppController.cs +++ b/projects/IoTCenter/Controllers/AppController.cs @@ -27,6 +27,8 @@ namespace IoTCenter.Controllers private readonly IJwtHelper _jwtHelper; private readonly IRepository _nodeRepo; private readonly IRepository _sceneRepo; + private readonly IRepository _sceneCommandRepo; + private readonly IRepository _commandRepo; private readonly IRepository _deviceRepo; private readonly IRepository _liveRecordRepo; private readonly IHubContext _hub; @@ -35,6 +37,8 @@ namespace IoTCenter.Controllers IJwtHelper jwtHelper, IRepository nodeRepo, IRepository sceneRepo, + IRepository sceneCommandRepo, + IRepository commandRepo, IRepository deviceRepo, IRepository liveRecordRepo, IHubContext hub) @@ -43,6 +47,8 @@ namespace IoTCenter.Controllers this._jwtHelper = jwtHelper; this._nodeRepo = nodeRepo; this._sceneRepo = sceneRepo; + this._sceneCommandRepo = sceneCommandRepo; + this._commandRepo = commandRepo; this._deviceRepo = deviceRepo; this._liveRecordRepo = liveRecordRepo; this._hub = hub; @@ -74,6 +80,15 @@ namespace IoTCenter.Controllers return Json(model); } + public IActionResult GetSceneList(string token) + { + var userName = this._jwtHelper.GetPayload(token)["UserName"].ToString(); + var model = this._sceneRepo.ReadOnlyTable() + .Where(o => o.NodeId == null) + .ToList(); + return Json(model); + } + public IActionResult GetNode(string token, string number) { var userName = this._jwtHelper.GetPayload(token)["UserName"].ToString(); @@ -81,6 +96,8 @@ namespace IoTCenter.Controllers .Include(o => o.Scenes) .Include(o => o.Devices) .ThenInclude(o => o.Data) + .Include(o => o.Devices) + .ThenInclude(o => o.Commands) .FirstOrDefault(o => o.Number == number); return Json(model); } @@ -157,6 +174,52 @@ namespace IoTCenter.Controllers } } + [System.Diagnostics.CodeAnalysis.SuppressMessage("Design", "CA1031:不捕获常规异常类型", Justification = "<挂起>")] + public IActionResult ExecGlobalScene(string connectionId, Guid id) + { + try + { + var commands = this._sceneCommandRepo.ReadOnlyTable() + .Include(o => o.Command).ThenInclude(o => o.Device).ThenInclude(o => o.Node) + .Where(o => o.SceneId == id) + .Select(o => o.Command) + .ToList(); + foreach (var command in commands) + { + try + { + this._hub.ServerToClient(command.Device.Node.Number, Methods.ExecCommand, command.Id, connectionId); + } + catch (Exception ex) + { + ex.PrintStack(); + } + } + return Json(ApiResponse.AsyncSuccess()); + } + catch (Exception ex) + { + ex.PrintStack(); + return Json(ApiResponse.Error(ex)); + } + } + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Design", "CA1031:不捕获常规异常类型", Justification = "<挂起>")] + public IActionResult ExecCommand(string connectionId, Guid id) + { + try + { + var command = this._commandRepo.ReadOnlyTable().Include(o => o.Device).ThenInclude(o => o.Node).FirstOrDefault(o => o.Id == id); + this._hub.ServerToClient(command.Device.Node.Number, Methods.ExecCommand, command.Id, connectionId); + return Json(ApiResponse.AsyncSuccess()); + } + catch (Exception ex) + { + ex.PrintStack(); + return Json(ApiResponse.Error(ex)); + } + } + public IActionResult Data(Guid id, string time = "10m") { var device = this._deviceRepo.ReadOnlyTable().Include(o => o.Node).Include(o => o.Data).FirstOrDefault(o => o.Id == id); diff --git a/projects/IoTCenter/Controllers/HomeController.cs b/projects/IoTCenter/Controllers/HomeController.cs index 4c3e49ab..917e13ed 100644 --- a/projects/IoTCenter/Controllers/HomeController.cs +++ b/projects/IoTCenter/Controllers/HomeController.cs @@ -19,6 +19,7 @@ namespace IoTCenter.Controllers public class HomeController : Controller { private readonly IConfiguration _cfg; + private readonly IRepository _sceneRepo; private readonly IRepository _nodeRepo; private readonly IRepository _deviceRepo; private readonly IRepository _dataRepo; @@ -27,6 +28,7 @@ namespace IoTCenter.Controllers private readonly IEventPublisher _eventPublisher; public HomeController(IConfiguration cfg, + IRepository sceneRepo, IRepository nodeRepo, IRepository deviceRepo, IRepository dataRepo, @@ -35,6 +37,7 @@ namespace IoTCenter.Controllers IEventPublisher eventPublisher) { this._cfg = cfg; + this._sceneRepo = sceneRepo; this._nodeRepo = nodeRepo; this._deviceRepo = deviceRepo; this._dataRepo = dataRepo; @@ -117,7 +120,8 @@ namespace IoTCenter.Controllers data = energy.Select(o => o.Sum), labels = energy.Select(o => o.Key) }, - Nodes = this._nodeRepo.ReadOnlyTable().Where(o => !o.Disabled).Include(o => o.Scenes).ToList() + Nodes = this._nodeRepo.ReadOnlyTable().Where(o => !o.Disabled).Include(o => o.Scenes).ToList(), + Scenes = this._sceneRepo.ReadOnlyTable().Where(o => o.NodeId == null).ToList() }; return Json(model); } @@ -136,6 +140,8 @@ namespace IoTCenter.Controllers .Include(o => o.Scenes) .Include(o => o.Devices) .ThenInclude(o => o.Data) + .Include(o => o.Devices) + .ThenInclude(o => o.Commands) .Where(o => o.Number == number) .FirstOrDefault(); return Json(model); diff --git a/projects/IoTCenter/wwwroot/home.html b/projects/IoTCenter/wwwroot/home.html index 776b9edd..0db2d434 100644 --- a/projects/IoTCenter/wwwroot/home.html +++ b/projects/IoTCenter/wwwroot/home.html @@ -115,6 +115,13 @@ +
+
+
+ +
+
+
@@ -141,7 +148,7 @@
@@ -289,7 +296,9 @@ } else if ($(this).hasClass('NodeSocketOff')) { ajax('/App/NodeSocketOff', { node: $(this).attr('data-node-number') }, 'post'); } else if ($(this).hasClass('Scene')) { - ajax('/App/Scene', { node: $(this).attr('data-node-number'), name: $(this).attr('data-scene-name') }, 'post'); + ajax('/App/ExecScene', { connectionId: connectionId, id: $(this).attr('data-scene-id') }, 'post'); + } else if ($(this).hasClass('GlobalScene')) { + ajax('/App/ExecGlobalScene', { connectionId: connectionId, id: $(this).attr('data-scene-id') }, 'post'); } return false; }); diff --git a/projects/IoTCenter/wwwroot/node.html b/projects/IoTCenter/wwwroot/node.html index 48e9404c..4413cb90 100644 --- a/projects/IoTCenter/wwwroot/node.html +++ b/projects/IoTCenter/wwwroot/node.html @@ -450,6 +450,10 @@
+
+
@@ -858,6 +862,8 @@ ajax('/App/NodeSocketOff', { node: $(this).attr('data-node-number') }, 'post'); } else if ($(this).hasClass('Scene')) { ajax('/App/ExecScene', { connectionId: connectionId, id: $(this).attr('data-scene-id') }, 'post'); + }else if ($(this).hasClass('Command')) { + ajax('/App/ExecCommand', { connectionId: connectionId, id: $(this).attr('data-command-id') }, 'post'); } return false; });