diff --git a/projects/IoT.Shared/Application/Domain/Entities/Node.cs b/projects/IoT.Shared/Application/Domain/Entities/Node.cs index ea8245a4..e2956500 100644 --- a/projects/IoT.Shared/Application/Domain/Entities/Node.cs +++ b/projects/IoT.Shared/Application/Domain/Entities/Node.cs @@ -14,6 +14,13 @@ namespace Application.Domain.Entities [Required] public string OrganNumber { get; set; } + [Display(Name = "分类名称")] + public string CategoryName { get; set; } + + [Display(Name = "分类编号")] + [Required] + public string CategoryNumber { get; set; } + [Display(Name = "节点名称")] public string Name { get; set; } diff --git a/projects/IoT.Shared/Application/Models/EditNodeModel.cs b/projects/IoT.Shared/Application/Models/EditNodeModel.cs index 788ee2a6..acbf5d63 100644 --- a/projects/IoT.Shared/Application/Models/EditNodeModel.cs +++ b/projects/IoT.Shared/Application/Models/EditNodeModel.cs @@ -17,12 +17,23 @@ namespace Application.Models [Required(ErrorMessage = nameof(RequiredAttribute))] public string OrganNumber { get; set; } + [MaxLength(64, ErrorMessage = "{0}最大长度为{1}")] + [Display(Name = "分类名称")] + public string CategoryName { get; set; } + + [MaxLength(64, ErrorMessage = "{0}最大长度为{1}")] + [Display(Name = "分类编号")] + [Required] + public string CategoryNumber { get; set; } + [Display(Name = "节点名称")] + [MaxLength(64, ErrorMessage = "{0}最大长度为{1}")] [Required(ErrorMessage = nameof(RequiredAttribute))] public string Name { get; set; } [Display(Name = "节点编号")] [ReadOnly(true)] + [MaxLength(64, ErrorMessage = "{0}最大长度为{1}")] [Required(ErrorMessage = nameof(RequiredAttribute))] public string Number { get; set; } diff --git a/projects/IoT.Shared/Services/IoTNode/IoTNodeClient.cs b/projects/IoT.Shared/Services/IoTNode/IoTNodeClient.cs index 51e4d1c4..85c569d5 100644 --- a/projects/IoT.Shared/Services/IoTNode/IoTNodeClient.cs +++ b/projects/IoT.Shared/Services/IoTNode/IoTNodeClient.cs @@ -15,10 +15,8 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; -using System.Diagnostics; using System.Linq; using System.Net.Http; -using System.Reflection; using System.Threading; using System.Threading.Tasks; @@ -86,6 +84,7 @@ namespace IoT.Shared.Services InitConnection(); } Connection.StartAsync().Wait(); + this._logger.LogDebug($"{_notifyHost} OnConnected"); this.OnConnected(); } else @@ -102,7 +101,20 @@ namespace IoT.Shared.Services } catch (Exception ex) { - ex.PrintStack(); + this._logger.LogError(ex, ex.Message); + } + try + { + var now = DateTime.Now; + if (now.Hour == 0 && now.Minute == 0 && now.Second > 0 && now.Second <= 10) + { + this._logger.LogInformation("upload at 00:00 everyday"); + this.OnConnected(); + } + } + catch (Exception ex) + { + this._logger.LogError(ex, ex.Message); } } else @@ -193,8 +205,6 @@ namespace IoT.Shared.Services public void OnConnected() { - this._logger.LogDebug($"{_notifyHost} OnConnected"); - //上传节点 this.UpdateEntityIdList(null, Methods.UpdateNodeResponse); diff --git a/projects/IoTCenter/Application/Domain/NodeCategory.cs b/projects/IoTCenter/Application/Domain/NodeCategory.cs index 4a64bafa..225bf857 100644 --- a/projects/IoTCenter/Application/Domain/NodeCategory.cs +++ b/projects/IoTCenter/Application/Domain/NodeCategory.cs @@ -10,6 +10,8 @@ namespace IoTCenter.Application.Domain [Display(Name = "分类名称")] public string Name { get; set; } + public string Number { get; set; } + [Display(Name = "模板")] public string Template { get; set; } diff --git a/projects/IoTCenter/Application/Domain/Organ.cs b/projects/IoTCenter/Application/Domain/Organ.cs index dd473b75..041ae4e8 100644 --- a/projects/IoTCenter/Application/Domain/Organ.cs +++ b/projects/IoTCenter/Application/Domain/Organ.cs @@ -4,13 +4,15 @@ using System.ComponentModel.DataAnnotations; namespace IoTCenter.Application.Domain { - [Display(Name = "用户")] + [Display(Name = "机构")] public class Organ : BaseEntity { public string Name { get; set; } public string Number { get; set; } + [Display(Name = "分类图标")] public string Image { get; set; } + public List OrganNodes { get; set; } = new List(); } } \ No newline at end of file diff --git a/projects/IoTCenter/Services/IoTCenterEventHandler.cs b/projects/IoTCenter/Services/IoTCenterEventHandler.cs index 8444c612..7ed63595 100644 --- a/projects/IoTCenter/Services/IoTCenterEventHandler.cs +++ b/projects/IoTCenter/Services/IoTCenterEventHandler.cs @@ -28,6 +28,8 @@ namespace IoTCenter.Services public class IoTCenterEventHandler : IEventHander>, IEventHander>, + IEventHander>, + IEventHander>, IEventHander>, IEventHander>, IEventHander>, @@ -55,6 +57,8 @@ namespace IoTCenter.Services private readonly ISettingService _settingService; private readonly ILogger _logger; private readonly IRepository _nodeRepo; + private readonly IRepository _nodeCategoryRepo; + private readonly IRepository _nodeCategoryNodeRepo; private readonly IRepository _organRepo; private readonly IRepository _organNodeRepo; private readonly IRepository _sceneRepo; @@ -68,6 +72,8 @@ namespace IoTCenter.Services ISettingService settingService, ILogger logger, IRepository nodeRepo, + IRepository nodeCategoryRepo, + IRepository nodeCategoryNodeRepo, IRepository organRepo, IRepository organNodeRepo, IRepository sceneRepo, @@ -81,6 +87,8 @@ namespace IoTCenter.Services this._settingService = settingService; this._logger = logger; this._nodeRepo = nodeRepo; + this._nodeCategoryRepo = nodeCategoryRepo; + this._nodeCategoryNodeRepo = nodeCategoryNodeRepo; this._organRepo = organRepo; this._organNodeRepo = organNodeRepo; this._sceneRepo = sceneRepo; @@ -193,6 +201,22 @@ namespace IoTCenter.Services #endregion organ + #region nodeCategory + + public void Handle(EntityInsertedEvent message) + { + this.Notify(message); + this.UpdateNodeCategory(message.Data); + } + + public void Handle(EntityUpdatedEvent message) + { + this.Notify(message); + this.UpdateNodeCategory(message.Data); + } + + #endregion nodeCategory + #region Device public void Handle(EntityInsertedEvent message) @@ -466,6 +490,24 @@ namespace IoTCenter.Services private void UpdateOrganNode(Node node) { + try + { + var category = this._nodeCategoryRepo.ReadOnlyTable().FirstOrDefault(o => o.Number == node.CategoryNumber); + if (category != null) + { + var nodeCategory = this._nodeCategoryNodeRepo.Table().FirstOrDefault(o => o.NodeId == node.Id); + if (nodeCategory == null) + { + nodeCategory = new NodeCategoryNode { CategoryId = category.Id, NodeId = node.Id }; + this._nodeCategoryNodeRepo.Add(nodeCategory); + this._nodeCategoryNodeRepo.SaveChanges(); + } + } + } + catch (Exception ex) + { + this._logger.LogError(ex.ToString()); + } try { var organ = this._organRepo.ReadOnlyTable().FirstOrDefault(o => o.Number == node.OrganNumber); @@ -507,5 +549,27 @@ namespace IoTCenter.Services this._logger.LogError(ex.ToString()); } } + + private void UpdateNodeCategory(NodeCategory category) + { + try + { + var nodes = this._nodeRepo.ReadOnlyTable().Where(o => o.CategoryNumber == category.Number).Select(o => o.Id).ToList(); + foreach (var nodeId in nodes) + { + var categoryNode = this._nodeCategoryNodeRepo.Table().FirstOrDefault(o => o.NodeId == nodeId); + if (categoryNode == null) + { + categoryNode = new NodeCategoryNode { CategoryId = category.Id, NodeId = nodeId }; + this._nodeCategoryNodeRepo.Add(categoryNode); + this._nodeCategoryNodeRepo.SaveChanges(); + } + } + } + catch (Exception ex) + { + this._logger.LogError(ex.ToString()); + } + } } } \ No newline at end of file diff --git a/projects/IoTCenter/db.sql b/projects/IoTCenter/db.sql index 579c7509..4c7bcf0c 100644 --- a/projects/IoTCenter/db.sql +++ b/projects/IoTCenter/db.sql @@ -20,6 +20,8 @@ CREATE TABLE "iot_Node" ( "IsDeleted" TEXT NULL, "OrganName" TEXT NULL, "OrganNumber" TEXT NOT NULL, + "CategoryName" TEXT NULL, + "CategoryNumber" TEXT NOT NULL, "Name" TEXT NULL, "Number" TEXT NOT NULL, "IsOnline" INTEGER NOT NULL, @@ -33,6 +35,7 @@ CREATE TABLE "iot_NodeCategory" ( "Id" TEXT NOT NULL CONSTRAINT "PK_iot_NodeCategory" PRIMARY KEY, "IsDeleted" TEXT NULL, "Name" TEXT NULL, + "Number" TEXT NULL, "Template" TEXT NULL, "DisplayOrder" INTEGER NOT NULL ); diff --git a/projects/IoTNode/DbConfig.cs b/projects/IoTNode/DbConfig.cs index 1fec5bba..9f431a21 100644 --- a/projects/IoTNode/DbConfig.cs +++ b/projects/IoTNode/DbConfig.cs @@ -96,7 +96,9 @@ namespace IoTNode { Id = $"nodeid-{sn}".ToGuid(), OrganName = "默认机构名称", - OrganNumber = "默认机构编码", + OrganNumber = "默认机构编号", + CategoryName = "默认分类名称", + CategoryNumber = "默认分类编号", Name = "节点", Number = sn, IsOnline = true, diff --git a/projects/IoTNode/db.sql b/projects/IoTNode/db.sql index 0db08ff2..014a416a 100644 --- a/projects/IoTNode/db.sql +++ b/projects/IoTNode/db.sql @@ -11,6 +11,8 @@ CREATE TABLE "iot_Node" ( "IsDeleted" TEXT NULL, "OrganName" TEXT NULL, "OrganNumber" TEXT NOT NULL, + "CategoryName" TEXT NULL, + "CategoryNumber" TEXT NOT NULL, "Name" TEXT NULL, "Number" TEXT NOT NULL, "IsOnline" INTEGER NOT NULL,