diff --git a/projects/Infrastructure/Views/Shared/DisplayTemplates/Object.cshtml b/projects/Infrastructure/Views/Shared/DisplayTemplates/Object.cshtml index b3dfd89c..8ac96f04 100644 --- a/projects/Infrastructure/Views/Shared/DisplayTemplates/Object.cshtml +++ b/projects/Infrastructure/Views/Shared/DisplayTemplates/Object.cshtml @@ -19,7 +19,7 @@
@Html.Label(prop.PropertyName, prop.GetDisplayName() + ":", new { @class = "col-sm-2 col-form-label",style= "text-align: right;overflow:hidden;" })
-
+
@Html.Display(prop.PropertyName, uihit)
diff --git a/projects/Infrastructure/Views/Shared/EditorTemplates/AjaxSelect.cshtml b/projects/Infrastructure/Views/Shared/EditorTemplates/AjaxSelect.cshtml index 7a4bf69f..46d1188f 100644 --- a/projects/Infrastructure/Views/Shared/EditorTemplates/AjaxSelect.cshtml +++ b/projects/Infrastructure/Views/Shared/EditorTemplates/AjaxSelect.cshtml @@ -1,5 +1,5 @@ @{ - var htmlClass = "form-control select2bs4 search"; + var htmlClass = "form-control select2bs4 ajax"; var list = (ViewData[ViewData.ModelMetadata.PropertyName + "SelectList"] as SelectList) ?? new SelectList(new List()); @Html.DropDownList("", list, "请选择", new { @class = htmlClass }) } \ No newline at end of file diff --git a/projects/Infrastructure/Views/Shared/EditorTemplates/Object.cshtml b/projects/Infrastructure/Views/Shared/EditorTemplates/Object.cshtml index b8969eac..aff793fd 100644 --- a/projects/Infrastructure/Views/Shared/EditorTemplates/Object.cshtml +++ b/projects/Infrastructure/Views/Shared/EditorTemplates/Object.cshtml @@ -1,4 +1,5 @@ @using System.Reflection +@using System.ComponentModel @using Microsoft.AspNetCore.Mvc.Controllers @using Infrastructure.Web.Mvc @{ @@ -13,12 +14,18 @@
@Html.AntiForgeryToken()
-
- @Html.ValidationSummary(true, "错误:", new { @class = "text-danger col-sm-8" }, "div") +
+ @Html.ValidationSummary(true, "错误:", new { @class = "text-danger col-sm-6" }, "div") +
@foreach (var prop in props) { var metadata = prop as Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.DefaultModelMetadata; + var isReadOnly = metadata.Attributes.Attributes.Any(o => o.GetType() == typeof(ReadOnlyAttribute)); + if (action == "Edit") + { + isReadOnly = isReadOnly || metadata.Attributes.Attributes.Any(o => o.GetType() == typeof(ReadOnlyForEditAttribute)); + } if (scope != null && scope == ControllerScopeType.Organ && prop.PropertyName == "OrganId") { @Html.Hidden(prop.PropertyName) @@ -33,9 +40,9 @@
@Html.Label(prop.PropertyName, prop.GetDisplayName() + ":", new { @class = "col-sm-2 col-form-label", style = "text-align: right;overflow:hidden;" })
- @if (metadata.Attributes.Attributes.Any(o => o.GetType() == typeof(System.ComponentModel.ReadOnlyAttribute))) + @if (isReadOnly) { -
+
@Html.Hidden(prop.PropertyName) @Html.Display(prop.PropertyName, uihit)
diff --git a/projects/IoT.Shared/wwwroot/js/site.js b/projects/IoT.Shared/wwwroot/js/site.js index bcd4b140..8be24b8f 100644 --- a/projects/IoT.Shared/wwwroot/js/site.js +++ b/projects/IoT.Shared/wwwroot/js/site.js @@ -159,24 +159,30 @@ function InitControls() { theme: "bootstrap4", language: "zh-CN", placeholder: '请选择', - //allowClear: true, - //minimumInputLength: 2, - //ajax: { - // url: $(this).attr('data-ajax-url'), - // data: function (params) { - // var query = { - // search: params.term, - // type: 'public' - // } - // return query; - // }, - // dataType: 'json', - // processResults: function (data) { - // return { - // results: Enumerable.from(data).select(function (o) { return { id: o.value, text: o.text }; }).toArray() - // }; - // } - //} + allowClear: true + }); + $('select.select2bs4.ajax').select2({ + theme: "bootstrap4", + language: "zh-CN", + placeholder: '请选择', + allowClear: true, + minimumInputLength: 2, + ajax: { + url: $(this).attr('data-ajax-url'), + data: function (params) { + var query = { + search: params.term, + type: 'public' + } + return query; + }, + dataType: 'json', + processResults: function (data) { + return { + results: Enumerable.from(data).select(function (o) { return { id: o.value, text: o.text }; }).toArray() + }; + } + } }); // $('input.cron').each(function () { diff --git a/projects/Platform/Application/Domain/Entities/Users/Building.cs b/projects/Platform/Application/Domain/Entities/Users/Building.cs index 60f43471..74e905cc 100644 --- a/projects/Platform/Application/Domain/Entities/Users/Building.cs +++ b/projects/Platform/Application/Domain/Entities/Users/Building.cs @@ -14,7 +14,7 @@ namespace IoT.Shared.Application.Domain.Entities public string CustomType { get; set; } public string Image { get; set; } public string Description { get; set; } - public Guid? OrganId { get; set; } + public Guid OrganId { get; set; } public Organ Organ { get; set; } public List BuildingIoTGateways { get; set; } = new List(); } diff --git a/projects/Platform/Application/Domain/Entities/Users/OrganUser.cs b/projects/Platform/Application/Domain/Entities/Users/OrganUser.cs index 6302b871..8e49cece 100644 --- a/projects/Platform/Application/Domain/Entities/Users/OrganUser.cs +++ b/projects/Platform/Application/Domain/Entities/Users/OrganUser.cs @@ -6,7 +6,7 @@ using System.ComponentModel.DataAnnotations; namespace IoT.Shared.Application.Domain.Entities { [Display(Name = "机构用户")] - [Scope(ScopeAttribute.PlatformAll | ScopeAttribute.OrganAll | ScopeType.UserRead | ScopeType.UserEdit)] + [Scope(ScopeAttribute.PlatformAll | ScopeAttribute.OrganAll | ScopeType.UserRead | ScopeType.UserDelete)] [Group("基础设置", "Admin")] public class OrganUser : BaseEntity { diff --git a/projects/Platform/Application/Models/EditOrganUserModel.cs b/projects/Platform/Application/Models/EditOrganUserModel.cs index 5fb86ba8..64f3369d 100644 --- a/projects/Platform/Application/Models/EditOrganUserModel.cs +++ b/projects/Platform/Application/Models/EditOrganUserModel.cs @@ -13,18 +13,18 @@ namespace Platform.Application.Models [Display(Name = "机构")] [SelectList] [ReadOnlyForEdit] - [Required] + [Required(ErrorMessage = nameof(RequiredAttribute))] public Guid? OrganId { get; set; } [Display(Name = "用户")] [ReadOnlyForEdit] [AjaxSelect("GetUser", "Ajax")] - [Required] + [Required(ErrorMessage = nameof(RequiredAttribute))] public Guid? UserId { get; set; } [Display(Name = "类型")] [DataType("SelectList")] - [Required] + [Required(ErrorMessage = nameof(RequiredAttribute))] public OrganUserType? Type { get; set; } [Display(Name = "自定义类型")] diff --git a/projects/Platform/Application/Models/EditRoleModel.cs b/projects/Platform/Application/Models/EditRoleModel.cs index 2831c57e..1629adbd 100644 --- a/projects/Platform/Application/Models/EditRoleModel.cs +++ b/projects/Platform/Application/Models/EditRoleModel.cs @@ -14,6 +14,9 @@ namespace IoT.Shared.Application.Models [Required(ErrorMessage = nameof(RequiredAttribute))] [Display(Name = "名称")] public string Name { get; set; } + [Required(ErrorMessage = nameof(RequiredAttribute))] + [Display(Name = "编号")] + public string Number { get; set; } [Display(Name = "权限")] [MultiSelectList] public List Permissions { get; set; } = new List(); diff --git a/projects/Platform/Areas/Admin/Controllers/AreaController.cs b/projects/Platform/Areas/Admin/Controllers/AreaController.cs index 29e6f021..95045338 100644 --- a/projects/Platform/Areas/Admin/Controllers/AreaController.cs +++ b/projects/Platform/Areas/Admin/Controllers/AreaController.cs @@ -44,7 +44,8 @@ namespace Platform.Areas.Admin.Controllers if (model.ParentId.HasValue) { var name = this.Repo.ReadOnlyTable() - .Where(o => o.Left < entity.Left && o.Left > 1).ToList() + .Where(o => o.ParentId != null) + .Where(o => o.Left < entity.Left && o.Right > entity.Right).ToList() .ToList() .ToTree() .FirstOrDefault(o => o.Id == model.ParentId.Value)?.GetDisplayName(); diff --git a/projects/Platform/Areas/Admin/Controllers/BuildingController.cs b/projects/Platform/Areas/Admin/Controllers/BuildingController.cs index 6bdb8321..a93d7444 100644 --- a/projects/Platform/Areas/Admin/Controllers/BuildingController.cs +++ b/projects/Platform/Areas/Admin/Controllers/BuildingController.cs @@ -50,19 +50,21 @@ namespace Platform.Areas.Admin.Controllers if (entity.ParentId.HasValue) { var name = this.Repo.ReadOnlyTable() - .Where(o => o.Left < entity.Left && o.Left > 1) + .Where(o=>o.ParentId!=null) + .Where(o => o.Left < entity.Left && o.Right > entity.Right) .ToList() .ToTree() .FirstOrDefault(o => o.Id == model.ParentId.Value)?.GetDisplayName(); ViewData.Add(model.ParentId.Value, name); } - if (entity.OrganId.HasValue) + if (entity != null) { var name = this._organRepo.ReadOnlyTable() - .Where(o => o.Left < entity.Left && o.Left > 1) + .Where(o => o.ParentId != null) + .Where(o => o.Left <= entity.Organ.Left && o.Right >= entity.Organ.Right) .ToList() .ToTree() - .FirstOrDefault(o => o.Id == entity.OrganId.Value)?.GetDisplayName(); + .FirstOrDefault(o => o.Id == entity.OrganId)?.GetDisplayName(); ViewData.Add(model.OrganId, name); } } @@ -71,7 +73,10 @@ namespace Platform.Areas.Admin.Controllers { base.ToEditModel(entity, model); this.ViewData.SelectList(o => model.OrganId, () => this._ajax.GetOrgan(model.OrganId).SelectList()); - ViewData.SelectList(o => model.ParentId, () => this._ajax.GetOrganBuilding(model.OrganId, model.ParentId).SelectList()); + if (model.OrganId.HasValue) + { + ViewData.SelectList(o => model.ParentId, () => this._ajax.GetOrganBuilding(model.OrganId, model.ParentId).SelectList()); + } } } } \ No newline at end of file diff --git a/projects/Platform/Areas/Admin/Controllers/OrganController.cs b/projects/Platform/Areas/Admin/Controllers/OrganController.cs index 35aa3e11..bafdc902 100644 --- a/projects/Platform/Areas/Admin/Controllers/OrganController.cs +++ b/projects/Platform/Areas/Admin/Controllers/OrganController.cs @@ -52,7 +52,8 @@ namespace Platform.Areas.Admin.Controllers if(model.AreaId.HasValue) { var name = this._areaRepo.ReadOnlyTable() - .Where(o => o.Left <= entity.Area.Left && o.Left > 1) + .Where(o => o.ParentId != null) + .Where(o => o.Left <= entity.Area.Left && o.Right > entity.Area.Right) .ToList() .ToTree().FirstOrDefault(o => o.Id == model.AreaId.Value)?.GetDisplayName(); ViewData.Add(model.AreaId.Value, name); @@ -60,7 +61,8 @@ namespace Platform.Areas.Admin.Controllers if(model.ParentId.HasValue) { var name = this.Repo.ReadOnlyTable() - .Where(o => o.Left < entity.Left && o.Left > 1) + .Where(o => o.ParentId != null) + .Where(o => o.Left < entity.Left && o.Right > entity.Right) .ToList() .ToTree() .FirstOrDefault(o => o.Id == model.ParentId.Value)?.GetDisplayName(); diff --git a/projects/Platform/Areas/Admin/Controllers/OrganUserController.cs b/projects/Platform/Areas/Admin/Controllers/OrganUserController.cs index ebddd017..6262f9d0 100644 --- a/projects/Platform/Areas/Admin/Controllers/OrganUserController.cs +++ b/projects/Platform/Areas/Admin/Controllers/OrganUserController.cs @@ -65,10 +65,7 @@ namespace Platform.Areas.Admin.Controllers public override void ToEditModel(OrganUser entity, EditOrganUserModel model) { this.ViewData.SelectList(o => model.OrganId, () => this._ajax.GetOrgan(model.OrganId).SelectList()); - if (model.OrganId.HasValue) - { - ViewData.SelectList(o => model.UserId, () => this._ajax.GetUser(model.OrganId.Value, model.UserId).SelectList()); - } + ViewData.SelectList(o => model.UserId, () => this._ajax.GetUser(model.OrganId, model.UserId).SelectList()); if (entity != null) { model.Roles = entity.UserRoles.Select(o => o.OrganRoleId).ToList(); diff --git a/projects/Platform/DbConfig.cs b/projects/Platform/DbConfig.cs index e203cdd7..c22c1590 100644 --- a/projects/Platform/DbConfig.cs +++ b/projects/Platform/DbConfig.cs @@ -28,53 +28,74 @@ namespace Platform public void OnModelCreating(ModelBuilder modelBuilder) { IoTSharedDbConfig.OnModelCreating(modelBuilder); - // + + //Admin + //User modelBuilder.Entity().Property(o => o.UserName).IsRequired(); modelBuilder.Entity().HasIndex(o => o.UserName).IsUnique(); modelBuilder.Entity().HasIndex(o => o.Email).IsUnique(); modelBuilder.Entity().HasIndex(o => o.PhoneNumber).IsUnique(); + //OrganRole modelBuilder.Entity().Property(o => o.Name).IsRequired(); - modelBuilder.Entity().HasIndex(o => new { o.OrganId, o.Name }).IsUnique(); + modelBuilder.Entity().Property(o => o.Number).IsRequired(); + modelBuilder.Entity().HasIndex(o => new { o.OrganId, o.Number }).IsUnique(); modelBuilder.Entity().HasOne(o => o.Organ).WithMany(o => o.Roles).HasForeignKey(o => o.OrganId).OnDelete(DeleteBehavior.Cascade); + //Permission + modelBuilder.Entity().Property(o => o.Name).IsRequired(); + modelBuilder.Entity().Property(o => o.Number).IsRequired(); modelBuilder.Entity().HasIndex(o => o.Number).IsUnique(); modelBuilder.Entity().HasOne(o => o.Category).WithMany(o => o.Permissions).HasForeignKey(o => o.CategoryId).OnDelete(DeleteBehavior.SetNull); + //OrganUserRole modelBuilder.Entity().HasOne(o => o.OrganUser).WithMany(o => o.UserRoles).HasForeignKey(o => o.OrganUserId); modelBuilder.Entity().HasOne(o => o.OrganRole).WithMany(o => o.UserRoles).HasForeignKey(o => o.OrganRoleId); modelBuilder.Entity().HasIndex(o => new { o.OrganUserId, o.OrganRoleId }).IsUnique(); + //OrganRolePermission modelBuilder.Entity().HasOne(o => o.Role).WithMany(o => o.RolePermissions).HasForeignKey(o => o.RoleId); modelBuilder.Entity().HasOne(o => o.Permission).WithMany(o => o.RolePermissions).HasForeignKey(o => o.PermissionId); modelBuilder.Entity().HasIndex(o => new { o.RoleId, o.PermissionId }).IsUnique(); - //基础设置 + //Site modelBuilder.Entity().Property(o => o.Name).IsRequired(); modelBuilder.Entity().HasIndex(o => o.Name).IsUnique(); - modelBuilder.Entity().HasIndex(o => o.Number).IsUnique(); ; - modelBuilder.Entity().HasIndex(o => new { o.OrganId, o.Number }).IsUnique(); + //Area + modelBuilder.Entity().HasIndex(o => o.Number).IsUnique(); + //Organ modelBuilder.Entity().HasIndex(o => o.Name).IsUnique(); modelBuilder.Entity().HasIndex(o => o.Number).IsUnique(); modelBuilder.Entity().HasOne(o => o.Area).WithMany(o => o.Organs).HasForeignKey(o => o.AreaId).OnDelete(DeleteBehavior.SetNull); - modelBuilder.Entity().HasIndex(o => o.Number).IsUnique(); - modelBuilder.Entity().HasOne(o => o.Organ).WithMany(o => o.Buildings).HasForeignKey(o => o.OrganId).OnDelete(DeleteBehavior.SetNull); + //Building + modelBuilder.Entity().Property(o => o.OrganId).IsRequired(); + modelBuilder.Entity().HasIndex(o => new { o.OrganId, o.ParentId, o.Number }).IsUnique(); + modelBuilder.Entity().HasOne(o => o.Organ).WithMany(o => o.Buildings).HasForeignKey(o => o.OrganId); + //OrganUser modelBuilder.Entity().HasOne(o => o.Organ).WithMany(o => o.OrganUsers).HasForeignKey(o => o.OrganId); modelBuilder.Entity().HasOne(o => o.User).WithMany(o => o.OrganUsers).HasForeignKey(o => o.UserId); modelBuilder.Entity().HasIndex(o => new { o.OrganId, o.UserId }).IsUnique(); + //Department + modelBuilder.Entity().HasIndex(o => new { o.OrganId, o.Number }).IsUnique(); - //物联网 + //IoTCenter + //IoTCommand modelBuilder.Entity().HasOne(o => o.Api).WithMany().HasForeignKey(o => o.ApiId); + //OrganIoTScene modelBuilder.Entity().HasOne(o => o.Organ).WithMany(o => o.OrganScenes).HasForeignKey(o => o.OrganId); + //OrganIoTSceneIoTCommand modelBuilder.Entity().HasOne(o => o.OrganScene).WithMany(o => o.OrganSceneCommands).HasForeignKey(o => o.OrganSceneId); modelBuilder.Entity().HasOne(o => o.Command).WithMany().HasForeignKey(o => o.CommandId); + //OrganIoTSceneTimer modelBuilder.Entity().HasOne(o => o.OrganScene).WithMany(o => o.OrganSceneTimers).HasForeignKey(o => o.OrganSceneId); + //OrganIoTSceneTigger modelBuilder.Entity().HasOne(o => o.OrganScene).WithMany(o => o.OrganSceneTiggers).HasForeignKey(o => o.OrganSceneId); modelBuilder.Entity().HasOne(o => o.Data).WithMany().HasForeignKey(o => o.DataId); - + //IoTGatewayCategoryIoTGateway modelBuilder.Entity().HasOne(o => o.Node).WithMany(o => o.CategoryNodes).HasForeignKey(o => o.NodeId); modelBuilder.Entity().HasOne(o => o.Category).WithMany(o => o.CategoryNodes).HasForeignKey(o => o.CategoryId); modelBuilder.Entity().HasIndex(o => new { o.CategoryId, o.NodeId }).IsUnique(); - modelBuilder.Entity().Property(o => o.DeviceNumber).IsRequired(); - + //BuildingIoTGateway modelBuilder.Entity().HasOne(o => o.Building).WithMany(o => o.BuildingIoTGateways).HasForeignKey(o => o.BuildingId); modelBuilder.Entity().HasOne(o => o.IoTGateway).WithMany().HasForeignKey(o => o.IoTGatewayId); modelBuilder.Entity().HasIndex(o => new { o.BuildingId, o.IoTGatewayId }).IsUnique(); + //LiveRecord + modelBuilder.Entity().Property(o => o.DeviceNumber).IsRequired(); } public void Seed(DbContext db) @@ -259,34 +280,36 @@ namespace Platform db.SaveChanges(); //初始化建筑 + var organId = db.Set().FirstOrDefault(o => o.Number == "xuexiao").Id; var buildingRoot = new Building { Name = "建筑", Number = "root", + OrganId = organRoot.Id, Children = new List { new Building { - Organ= db.Set().FirstOrDefault(o => o.Number == "xuexiao"), + OrganId=organId, Type= BuildingType.Building, Name="默认建筑", Number="1", Children = new List { new Building { - Organ= db.Set().FirstOrDefault(o => o.Number == "xuexiao"), + OrganId=organId, Type= BuildingType.Layer, Name="1楼", Number="11", Children=new List { new Building{ - Organ= db.Set().FirstOrDefault(o => o.Number == "xuexiao"), + OrganId=organId, Type= BuildingType.Room, Name="101室", Number="101" }, new Building{ - Organ= db.Set().FirstOrDefault(o => o.Number == "xuexiao"), + OrganId=organId, Type= BuildingType.Room, Name="102室", Number="102" @@ -294,20 +317,20 @@ namespace Platform } }, new Building { - Organ= db.Set().FirstOrDefault(o => o.Number == "xuexiao"), + OrganId=organId, Type= BuildingType.Layer, Name="2楼", Number="12", Children=new List { new Building{ - Organ= db.Set().FirstOrDefault(o => o.Number == "xuexiao"), + OrganId=organId, Type= BuildingType.Room, Name="201室", Number="201" }, new Building{ - Organ= db.Set().FirstOrDefault(o => o.Number == "xuexiao"), + OrganId=organId, Type= BuildingType.Room, Name="202室", Number="202" @@ -327,10 +350,10 @@ namespace Platform db.Set().FirstOrDefault(o => o.Number == "root").Update(); db.SaveChanges(); - var organId = db.Set().FirstOrDefault(o => o.IsReadOnly).Id; - var superRole = new OrganRole { OrganId = organId, Name = "超级管理员", IsReadOnly = true }; - var adminRole = new OrganRole { OrganId = organId, Name = "管理员" }; - var organRole = new OrganRole { OrganId = organId, Name = "机构管理员" }; + var defaultOrganId = db.Set().FirstOrDefault(o => o.IsReadOnly).Id; + var superRole = new OrganRole { OrganId = defaultOrganId,Number="super", Name = "超级管理员", IsReadOnly = true }; + var adminRole = new OrganRole { OrganId = defaultOrganId, Number = "admin", Name = "管理员" }; + var organRole = new OrganRole { OrganId = defaultOrganId, Number = "organ", Name = "机构管理员" }; //初始化角色 var skips = new string[] { @@ -366,7 +389,7 @@ namespace Platform new OrganUser { IsReadOnly=true, Type= OrganUserType.Type1, - OrganId=organId, + OrganId=defaultOrganId, UserRoles=new List { new OrganUserRole{ @@ -394,7 +417,7 @@ namespace Platform OrganUsers = new List { new OrganUser { Type= OrganUserType.Type1, - OrganId=organId, + OrganId=defaultOrganId, UserRoles=new List { new OrganUserRole{ OrganRoleId=adminRole.Id} @@ -414,7 +437,7 @@ namespace Platform OrganUsers = new List { new OrganUser { Type= OrganUserType.Type1, - OrganId=organId, + OrganId=defaultOrganId, UserRoles=new List { new OrganUserRole{ OrganRoleId=organRole.Id} diff --git a/projects/Platform/db.sql b/projects/Platform/db.sql index b167813e..45fcbc84 100644 --- a/projects/Platform/db.sql +++ b/projects/Platform/db.sql @@ -169,11 +169,11 @@ CREATE TABLE `iot_Building` ( `CustomType` longtext CHARACTER SET utf8mb4 NULL, `Image` longtext CHARACTER SET utf8mb4 NULL, `Description` longtext CHARACTER SET utf8mb4 NULL, - `OrganId` char(36) NULL, + `OrganId` char(36) NOT NULL, `AreaId` char(36) NULL, CONSTRAINT `PK_iot_Building` PRIMARY KEY (`Id`), CONSTRAINT `FK_iot_Building_iot_Area_AreaId` FOREIGN KEY (`AreaId`) REFERENCES `iot_Area` (`Id`) ON DELETE RESTRICT, - CONSTRAINT `FK_iot_Building_iot_Organ_OrganId` FOREIGN KEY (`OrganId`) REFERENCES `iot_Organ` (`Id`) ON DELETE SET NULL, + CONSTRAINT `FK_iot_Building_iot_Organ_OrganId` FOREIGN KEY (`OrganId`) REFERENCES `iot_Organ` (`Id`) ON DELETE CASCADE, CONSTRAINT `FK_iot_Building_iot_Building_ParentId` FOREIGN KEY (`ParentId`) REFERENCES `iot_Building` (`Id`) ON DELETE RESTRICT ); @@ -209,8 +209,8 @@ CREATE TABLE `iot_OrganIoTScene` ( CREATE TABLE `iot_OrganRole` ( `Id` char(36) NOT NULL, `IsDeleted` longtext CHARACTER SET utf8mb4 NULL, - `Name` varchar(255) CHARACTER SET utf8mb4 NOT NULL, - `Number` longtext CHARACTER SET utf8mb4 NULL, + `Name` longtext CHARACTER SET utf8mb4 NOT NULL, + `Number` varchar(255) CHARACTER SET utf8mb4 NOT NULL, `IsReadOnly` tinyint(1) NOT NULL, `OrganId` char(36) NOT NULL, CONSTRAINT `PK_iot_OrganRole` PRIMARY KEY (`Id`), @@ -327,8 +327,8 @@ CREATE TABLE `iot_OrganUserRole` ( CREATE TABLE `iot_Permission` ( `Id` char(36) NOT NULL, `IsDeleted` longtext CHARACTER SET utf8mb4 NULL, - `Name` longtext CHARACTER SET utf8mb4 NULL, - `Number` varchar(255) CHARACTER SET utf8mb4 NULL, + `Name` longtext CHARACTER SET utf8mb4 NOT NULL, + `Number` varchar(255) CHARACTER SET utf8mb4 NOT NULL, `IsReadOnly` tinyint(1) NOT NULL, `Type` int NOT NULL, `CategoryId` char(36) NULL, @@ -453,12 +453,10 @@ CREATE INDEX `IX_iot_Area_ParentId` ON `iot_Area` (`ParentId`); CREATE INDEX `IX_iot_Building_AreaId` ON `iot_Building` (`AreaId`); -CREATE UNIQUE INDEX `IX_iot_Building_Number` ON `iot_Building` (`Number`); - -CREATE INDEX `IX_iot_Building_OrganId` ON `iot_Building` (`OrganId`); - CREATE INDEX `IX_iot_Building_ParentId` ON `iot_Building` (`ParentId`); +CREATE UNIQUE INDEX `IX_iot_Building_OrganId_ParentId_Number` ON `iot_Building` (`OrganId`, `ParentId`, `Number`); + CREATE INDEX `IX_iot_BuildingIoTGateway_IoTGatewayId` ON `iot_BuildingIoTGateway` (`IoTGatewayId`); CREATE UNIQUE INDEX `IX_iot_BuildingIoTGateway_BuildingId_IoTGatewayId` ON `iot_BuildingIoTGateway` (`BuildingId`, `IoTGatewayId`); @@ -533,7 +531,7 @@ CREATE INDEX `IX_iot_OrganIoTSceneTigger_OrganSceneId` ON `iot_OrganIoTSceneTigg CREATE INDEX `IX_iot_OrganIoTSceneTimer_OrganSceneId` ON `iot_OrganIoTSceneTimer` (`OrganSceneId`); -CREATE UNIQUE INDEX `IX_iot_OrganRole_OrganId_Name` ON `iot_OrganRole` (`OrganId`, `Name`); +CREATE UNIQUE INDEX `IX_iot_OrganRole_OrganId_Number` ON `iot_OrganRole` (`OrganId`, `Number`); CREATE INDEX `IX_iot_OrganRolePermission_PermissionId` ON `iot_OrganRolePermission` (`PermissionId`);