Former-commit-id: 0052adf50a92a0b678976cd49070f887885683fe
Former-commit-id: e6c3a10b3ccda4b902fc0ca92708310daab01ad8
1.0
wanggang 5 years ago
parent 02152be538
commit 2055660f80

@ -33,7 +33,7 @@ namespace IoT.Shared.Application.Domain.Entities
public List<IoTDevice> Devices { get; set; } = new List<IoTDevice>();
//public List<IoTScene> Scenes { get; set; } = new List<IoTScene>();
public List<IoTGatewayCategoryIoTGateway> CategoryNodes { get; set; } = new List<IoTGatewayCategoryIoTGateway>();
//public List<IoTGatewayCategoryIoTGateway> CategoryNodes { get; set; } = new List<IoTGatewayCategoryIoTGateway>();
//public List<BuildingIoTGateway> BuildingIoTGateways { get; set; } = new List<BuildingIoTGateway>();
}
}

@ -1,17 +0,0 @@
using Infrastructure.Domain;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace IoT.Shared.Application.Domain.Entities
{
[Display(Name = "节点类型")]
[Scope]
[Group("物联管控", "IoTCenter")]
public class IoTGatewayCategory : BaseTreeEntity<IoTGatewayCategory>
{
[Display(Name = "模板")]
public string Template { get; set; }
public List<IoTGatewayCategoryIoTGateway> CategoryNodes { get; set; } = new List<IoTGatewayCategoryIoTGateway>();
}
}

@ -1,17 +0,0 @@
using Infrastructure.Domain;
using System;
using System.ComponentModel.DataAnnotations;
namespace IoT.Shared.Application.Domain.Entities
{
[Display(Name = "节点分类")]
[Scope]
[Group("物联管控", "IoTCenter")]
public class IoTGatewayCategoryIoTGateway : BaseEntity
{
public Guid CategoryId { get; set; }
public Guid NodeId { get; set; }
public IoTGatewayCategory Category { get; set; }
public IoTGateway Node { get; set; }
}
}

@ -4,7 +4,7 @@ using System.ComponentModel.DataAnnotations;
namespace IoT.Shared.Application.Models
{
[Display(Name = "产品")]
public class EditProductModel : EditModel
public class EditIoTProductModel : EditModel
{
[Display(Name = "产品名称")]
[ReadOnlyForEdit]

@ -1,9 +0,0 @@
using IoT.Shared.Application.Domain.Entities;
namespace IoT.Shared.Application.Models
{
public class ProductDto : IoTProduct
{
public string CategoryNumber { get; set; }
}
}

@ -21,7 +21,6 @@ namespace IoT.Shared.Areas.IoTCenter.Controlls
protected readonly IServiceProvider _services;
protected readonly ILogger<AjaxBaseController> _logger;
protected readonly IHttpContextAccessor _httpContext;
protected readonly IRepository<IoTProductCategory> _categoryRepo;
protected readonly IRepository<IoTGateway> _nodeRepo;
protected readonly IRepository<IoTProduct> _productRepo;
protected readonly IRepository<IoTApi> _apiRepo;
@ -33,20 +32,7 @@ namespace IoT.Shared.Areas.IoTCenter.Controlls
this._services = services;
this._logger = logger;
}
public JsonResult GetIoTProductCategory(Guid? selected)
{
using var scope = this._services.CreateScope();
var repo = scope.ServiceProvider.GetRequiredService<IRepository<IoTProductCategory>>();
var list = repo.ReadOnlyTable()
.Where(o => o.ParentId != null)
.OrderBy(o => o.ParentId)
.ThenBy(o => o.DisplayOrder)
.ToList()
.ToTree()
.Select(o => new IoTProductCategory { Id = o.Id, Name = o.GetDisplayName() })
.ToList();
return new JsonResult(new SelectList(list, "Id", "Name", selected));
}
public JsonResult GetIoTProduct(Guid? selected)
{
using var scope = this._services.CreateScope();
@ -112,14 +98,6 @@ namespace IoT.Shared.Areas.IoTCenter.Controlls
return new MultiSelectList(list, "Id", "Name", selected);
}
public SelectList GetCategorySelectList(Guid? selected = null)
{
var list = this._categoryRepo.ReadOnlyTable()
.Select(o => new { o.Id, Name = $"{o.Name}({o.Number})" })
.ToList();
return new SelectList(list, "Id", "Name", selected);
}
#region Node

@ -13,7 +13,6 @@ namespace IoT.Shared
//
modelBuilder.Entity<IoTGateway>().HasIndex(o => o.Number).IsUnique();
//
modelBuilder.Entity<IoTProductCategory>().HasIndex(o => o.Number).IsUnique();
modelBuilder.Entity<IoTProduct>().HasIndex(o => o.Number).IsUnique();
modelBuilder.Entity<IoTApi>().HasOne(o => o.Product).WithMany(o => o.Apis).HasForeignKey(o => o.ProductId);
modelBuilder.Entity<IoTApi>().HasIndex(o => new { o.ProductId, o.Name }).IsUnique();

@ -15,13 +15,13 @@ namespace IoT.Shared.Areas.IoTCenter.Controlls
[Route("IoTCenter/[controller]/[action]")]
[Area("IoTCenter")]
[ControllerScope(ControllerScopeType.Platform)]
public class IoTProductController : CrudController<IoTProduct, EditProductModel>
public class IoTProductController : CrudController<IoTProduct, EditIoTProductModel>
{
public IoTProductController(IRepository<IoTProduct> repo) : base(repo)
{
}
public override IQueryable<IoTProduct> Query(PagedListModel<EditProductModel> model, IQueryable<IoTProduct> query)
public override IQueryable<IoTProduct> Query(PagedListModel<EditIoTProductModel> model, IQueryable<IoTProduct> query)
{
return base.Query(model, query)
.WhereIf(!string.IsNullOrEmpty(model.Query.Name), o => o.Name.Contains(model.Query.Name))

@ -35,9 +35,6 @@ namespace IoTNode
public void OnModelCreating(ModelBuilder modelBuilder)
{
IoTSharedDbConfig.OnModelCreating(modelBuilder);
modelBuilder.Ignore<IoTProductCategory>();
modelBuilder.Ignore<IoTGatewayCategory>();
modelBuilder.Ignore<IoTGatewayCategoryIoTGateway>();
modelBuilder.Entity<User>().Property(o => o.UserName).IsRequired();
modelBuilder.Entity<User>().HasIndex(o => o.UserName).IsUnique();
modelBuilder.Entity<User>().HasIndex(o => o.Email).IsUnique();

@ -22,7 +22,7 @@ namespace Platform.Apis.Controllers
{
private readonly ILogger<NodeController> _logger;
private readonly ISettingService _settingService;
private readonly IRepository<IoTGatewayCategoryIoTGateway> _nodeCategoryNodeRepo;
//private readonly IRepository<IoTGatewayCategoryIoTGateway> _nodeCategoryNodeRepo;
private readonly IRepository<IoTGateway> _nodeRepo;
private readonly IRepository<IoTDevice> _deviceRepo;
private readonly IRepository<Organ> _organRepo;
@ -31,7 +31,7 @@ namespace Platform.Apis.Controllers
public NodeController(
ILogger<NodeController> logger,
ISettingService settingService,
IRepository<IoTGatewayCategoryIoTGateway> nodeCategoryNodeRepo,
//IRepository<IoTGatewayCategoryIoTGateway> nodeCategoryNodeRepo,
IRepository<IoTGateway> nodeRepo,
IRepository<IoTDevice> deviceRepo,
IRepository<Organ> organRepo,
@ -39,7 +39,7 @@ namespace Platform.Apis.Controllers
{
this._logger = logger;
this._settingService = settingService;
this._nodeCategoryNodeRepo = nodeCategoryNodeRepo;
//this._nodeCategoryNodeRepo = nodeCategoryNodeRepo;
this._nodeRepo = nodeRepo;
this._deviceRepo = deviceRepo;
this._organRepo = organRepo;
@ -72,7 +72,7 @@ namespace Platform.Apis.Controllers
o.Image,
o.DisplayOrder,
Count = _deviceRepo.ReadOnlyTable().Count(d => d.NodeId == o.Id),
Category = _nodeCategoryNodeRepo.ReadOnlyTable().Include(ncn => ncn.Category).FirstOrDefault(ncn => ncn.NodeId == o.Id)?.Category
//Category = _nodeCategoryNodeRepo.ReadOnlyTable().Include(ncn => ncn.Category).FirstOrDefault(ncn => ncn.NodeId == o.Id)?.Category
});
return Ok(model);
}

@ -12,6 +12,6 @@ namespace IoT.Shared.Application.Domain.Entities
[Display(Name = "分类图标")]
public string Image { get; set; }
public List<IoTProduct> Products { get; set; } = new List<IoTProduct>();
public List<IoTProductCategoryIoTProduct> CategoryProducts { get; set; } = new List<IoTProductCategoryIoTProduct>();
}
}

@ -0,0 +1,17 @@
using Infrastructure.Domain;
using System;
using System.ComponentModel.DataAnnotations;
namespace IoT.Shared.Application.Domain.Entities
{
[Display(Name = "产品分类关联")]
[Scope(ScopeAttribute.PlatformAll)]
[Group("物联管控", "IoTCenter")]
public class IoTProductCategoryIoTProduct : BaseEntity
{
public Guid CategoryId { get; set; }
public Guid ProductId { get; set; }
public IoTProductCategory Category { get; set; }
public IoTProduct Product { get; set; }
}
}

@ -9,7 +9,7 @@ namespace Platform.Application.Models
[Display(Name = "建筑")]
public class EditBuildingModel : EditModel
{
[SelectList]
[SelectList(nameof(ParentId),"GetBuilding")]
[Display(Name = "机构")]
[Required(ErrorMessage = nameof(RequiredAttribute))]
public Guid? OrganId { get; set; }

@ -0,0 +1,20 @@
using System;
using IoT.Shared.Application.Models;
using System.ComponentModel.DataAnnotations;
namespace Platform.Application.Models.IoTCenter
{
[Display(Name = "网关")]
public class EditPlatformIoTGatewayModel : EditIoTGatewayModel
{
[Display(Name = "机构")]
[SelectList(nameof(BuildingId),"GetBuilding")]
[Required(ErrorMessage = nameof(RequiredAttribute))]
public Guid? OrganId { get; set; }
[Display(Name = "建筑")]
[SelectList]
[Required(ErrorMessage = nameof(RequiredAttribute))]
public Guid? BuildingId { get; set; }
}
}

@ -0,0 +1,15 @@
using IoT.Shared.Application.Models;
using System;
using System.ComponentModel.DataAnnotations;
namespace Platform.Application.Models.IoTCenter
{
[Display(Name = "产品")]
public class EditPlatformIoTProductModel:EditIoTProductModel
{
[Display(Name = "分类")]
[SelectList]
[Required(ErrorMessage = nameof(RequiredAttribute))]
public Guid? CategoryId { get; set; }
}
}

@ -75,7 +75,7 @@ namespace Platform.Areas.Admin.Controllers
this.ViewData.SelectList(o => model.OrganId, () => this._ajax.GetOrgan(model.OrganId).SelectList());
if (model.OrganId.HasValue)
{
ViewData.SelectList(o => model.ParentId, () => this._ajax.GetOrganBuilding(model.OrganId, model.ParentId).SelectList());
ViewData.SelectList(o => model.ParentId, () => this._ajax.GetBuilding(model.OrganId.Value, model.ParentId).SelectList());
}
}
}

@ -1,54 +0,0 @@
@using System.Reflection
@using Microsoft.AspNetCore.Mvc.Controllers
@using Infrastructure.Web.Mvc
@{
var scope = (this.ViewContext.ActionDescriptor as ControllerActionDescriptor).ControllerTypeInfo.GetCustomAttribute<ControllerScopeAttribute>()?.Scope;
}
<script>
$(function () {
$('#OrganId').change(function () {
var id = $(this).find(':selected').val();
update('@Url.Action("GetOrganBuilding", "Ajax",new{area="IoTCenter",scope=scope})', id, "#ParentId");
update('@Url.Action("GetUser", "Ajax",new{area=""})', id, "#UserId");
});;
$('#Query_OrganId').change(function () {
var id = $(this).find(':selected').val();
update('@Url.Action("GetOrganBuilding", "Ajax",new{area=""})', id, "#Query_ParentId");
update('@Url.Action("GetUser", "Ajax",new{area=""})', id, "#Query_UserId");
});;
});
</script>
<script>
//
function VeLoad(node, resolve) {
var parentId = node.root ? null : node.value;
var url = this.url + parentId;
$.getJSON(url, function (data) {
console.log(data);
var parent = node;
var nodes = Enumerable.from(data)
.where(function (o) {
return !Enumerable.from(parent.children).any(function (o2) {
return o.value === o2.value;
});
}).toArray();
resolve(nodes);
});
}
function VeChange(value, id) {
app.$refs[id].value = value;
var text = value[value.length - 1];
$('#' + id).val(text);
console.log($('#' + id).val());
}
</script>
<script>
var app = new Vue({
el: '#app',
data: function () {
return {
a: 1
}
}
});
</script>

@ -3,9 +3,11 @@ using Infrastructure.Data;
using Infrastructure.Extensions;
using Infrastructure.Web.Mvc;
using IoT.Shared.Application.Domain.Entities;
using IoT.Shared.Application.Models;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Platform.Application.Models.IoTCenter;
using Platform.Areas.IoTCenter.Controllers;
using System;
using System.Linq;
@ -16,17 +18,32 @@ namespace IoT.Shared.Areas.IoTCenter.Controlls
[Route("IoTCenter/[controller]/[action]")]
[Area("IoTCenter")]
[ControllerScope(ControllerScopeType.Platform)]
public class IoTGatewayController : IoTSharedController<IoTGateway, EditIoTGatewayModel>
public class IoTGatewayController : IoTSharedController<IoTGateway, EditPlatformIoTGatewayModel>
{
public IoTGatewayController(IRepository<IoTGateway> repo, IServiceProvider sp) : base(repo, sp)
private readonly IRepository<Organ> _organRepo;
private readonly IRepository<Building> _buildingRepo;
private readonly IRepository<BuildingIoTGateway> _buildingGatewayRepo;
private readonly AjaxController _ajax;
public IoTGatewayController(IRepository<IoTGateway> repo,
IServiceProvider sp, IRepository<Organ> organRepo,
IRepository<Building> buildingRepo,
IRepository<BuildingIoTGateway> buildingGatewayRepo,
AjaxController ajax) : base(repo, sp)
{
this._organRepo = organRepo;
this._buildingRepo = buildingRepo;
this._buildingGatewayRepo = buildingGatewayRepo;
this._ajax = ajax;
}
public override IQueryable<IoTGateway> Query(PagedListModel<EditIoTGatewayModel> model, IQueryable<IoTGateway> query)
public override IQueryable<IoTGateway> Query(PagedListModel<EditPlatformIoTGatewayModel> model, IQueryable<IoTGateway> query)
{
return base.Query(model, query)
//.WhereIf(!string.IsNullOrEmpty(model.Query.OrganName), o => o.OrganNodes.Any(o => o.Organ.Name.Contains(model.Query.OrganName)))
//.WhereIf(!string.IsNullOrEmpty(model.Query.CategoryName), o => o.CategoryNodes.Any(o => o.Category.Name.Contains(model.Query.CategoryName)))
query = this._buildingGatewayRepo.ReadOnlyTable()
.WhereIf(model.Query.BuildingId.HasValue, o => o.BuildingId == model.Query.BuildingId.Value)
.WhereIf(model.Query.OrganId.HasValue, o => o.Building.OrganId == model.Query.OrganId.Value)
.Select(o => o.IoTGateway);
return query
.WhereIf(!string.IsNullOrEmpty(model.Query.Name), o => o.Name.Contains(model.Query.Name))
.WhereIf(!string.IsNullOrEmpty(model.Query.Number), o => o.Number.Contains(model.Query.Number))
.WhereIf(!string.IsNullOrEmpty(model.Query.Version), o => o.Version.Contains(model.Query.Version))
@ -34,7 +51,92 @@ namespace IoT.Shared.Areas.IoTCenter.Controlls
.WhereIf(model.Query.Hidden.HasValue, o => o.Hidden == model.Query.Hidden.Value);
}
public override string GetNodeNumber(EditIoTGatewayModel model)
public override void ToDisplayModel(IoTGateway entity, EditPlatformIoTGatewayModel model)
{
var building = this._buildingGatewayRepo.ReadOnlyTable()
.Where(o => o.IoTGatewayId == model.Id)
.Include(o=>o.Building).ThenInclude(o=>o.Organ)
.Select(o=>o.Building)
.FirstOrDefault();
model.BuildingId = building?.Id;
model.OrganId = building?.OrganId;
if (model.OrganId.HasValue)
{
var organ = building?.Organ;
var name = this._organRepo.ReadOnlyTable()
.Where(o => o.ParentId != null)
.Where(o => o.Left <= organ.Left && o.Right >= organ.Right).ToList()
.ToList()
.ToTree()
.FirstOrDefault(o => o.Id == model.OrganId.Value)?.GetDisplayName();
ViewData.Add(model.OrganId, name);
}
if(model.BuildingId.HasValue)
{
var name = this._buildingRepo.ReadOnlyTable()
.Where(o => o.ParentId != null)
.Where(o => o.Left <= building.Left && o.Right >= building.Right).ToList()
.ToList()
.ToTree()
.FirstOrDefault(o => o.Id == model.BuildingId.Value)?.GetDisplayName();
ViewData.Add(model.BuildingId, name);
}
}
public override void ToEditModel(IoTGateway entity, EditPlatformIoTGatewayModel model)
{
if(entity!=null)
{
var building = this._buildingGatewayRepo.ReadOnlyTable()
.Where(o => o.IoTGatewayId == model.Id)
.Include(o => o.Building)
.Select(o => o.Building)
.FirstOrDefault();
model.BuildingId = building?.Id;
model.OrganId = building?.OrganId;
}
ViewData.SelectList(o => model.OrganId, () => this._ajax.GetOrgan(model.OrganId).SelectList());
if(model.OrganId.HasValue)
{
ViewData.SelectList(o => model.BuildingId, () => this._ajax.GetBuilding(model.OrganId.Value, model.BuildingId).SelectList());
}
}
public override void ToEntity(EditPlatformIoTGatewayModel model, IoTGateway entity)
{
if (model.BuildingId.HasValue)
{
var buildingGateway = this._buildingGatewayRepo.Table().FirstOrDefault(o => o.IoTGatewayId == model.Id);
if (model.BuildingId.HasValue)
{
if (buildingGateway == null)
{
buildingGateway = new BuildingIoTGateway { BuildingId = model.BuildingId.Value, IoTGatewayId = model.Id };
this._buildingGatewayRepo.Add(buildingGateway);
}
else
{
if (buildingGateway.BuildingId != model.BuildingId.Value)
{
buildingGateway.BuildingId = model.BuildingId.Value;
}
}
}
else
{
if (buildingGateway != null)
{
this._buildingGatewayRepo.Delete(buildingGateway);
}
}
if(this.ControllerContext.ActionDescriptor.ActionName=="Edit")
{
this._buildingGatewayRepo.SaveChanges();
}
}
}
public override string GetNodeNumber(EditPlatformIoTGatewayModel model)
{
return model.Number;
}

@ -7,6 +7,7 @@ using IoT.Shared.Application.Models;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Platform.Areas.IoTCenter.Controllers;
using System;
using System.Linq;
@ -19,9 +20,9 @@ namespace IoT.Shared.Areas.IoTCenter.Controlls
[ControllerScope(ControllerScopeType.Platform)]
public class IoTProductCategoryController : TreeCrudController<IoTProductCategory, EditIoTProductCategoryModel>
{
private readonly AjaxBaseController _ajax;
private readonly AjaxController _ajax;
public IoTProductCategoryController(IRepository<IoTProductCategory> repo, AjaxBaseController ajax, IServiceProvider sp) : base(repo)
public IoTProductCategoryController(IRepository<IoTProductCategory> repo, AjaxController ajax, IServiceProvider sp) : base(repo)
{
this._ajax = ajax;
}

@ -6,6 +6,9 @@ using IoT.Shared.Application.Domain.Entities;
using IoT.Shared.Application.Models;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Platform.Application.Models.IoTCenter;
using Platform.Areas.IoTCenter.Controllers;
using System.Linq;
namespace IoT.Shared.Areas.IoTCenter.Controlls
@ -15,15 +18,26 @@ namespace IoT.Shared.Areas.IoTCenter.Controlls
[Route("IoTCenter/[controller]/[action]")]
[Area("IoTCenter")]
[ControllerScope(ControllerScopeType.Platform)]
public class IoTProductController : CrudController<IoTProduct, EditProductModel>
public class IoTProductController : CrudController<IoTProduct, EditPlatformIoTProductModel>
{
public IoTProductController(IRepository<IoTProduct> repo) : base(repo)
private readonly IRepository<IoTProductCategoryIoTProduct> _productCategoryProductRepo;
private readonly IRepository<IoTProductCategory> _productCategoryRepo;
private readonly AjaxController _ajax;
public IoTProductController(IRepository<IoTProduct> repo, IRepository<IoTProductCategoryIoTProduct> productCategoryProductRepo, IRepository<IoTProductCategory> productCategoryRepo, AjaxController ajax) : base(repo)
{
this._productCategoryProductRepo = productCategoryProductRepo;
this._productCategoryRepo = productCategoryRepo;
this._ajax = ajax;
}
public override IQueryable<IoTProduct> Query(PagedListModel<EditProductModel> model, IQueryable<IoTProduct> query)
public override IQueryable<IoTProduct> Query(PagedListModel<EditPlatformIoTProductModel> model, IQueryable<IoTProduct> query)
{
return base.Query(model, query)
if(model.Query.CategoryId.HasValue)
{
query = this._productCategoryProductRepo.ReadOnlyTable().Where(o => o.CategoryId == model.Query.CategoryId.Value).Select(o => o.Product);
}
return query
.WhereIf(!string.IsNullOrEmpty(model.Query.Name), o => o.Name.Contains(model.Query.Name))
.WhereIf(!string.IsNullOrEmpty(model.Query.Number), o => o.Number.Contains(model.Query.Number))
.WhereIf(!string.IsNullOrEmpty(model.Query.Number), o => o.Number.Contains(model.Query.Number))
@ -32,5 +46,63 @@ namespace IoT.Shared.Areas.IoTCenter.Controlls
.WhereIf(!string.IsNullOrEmpty(model.Query.ApiJson), o => o.ApiJson.Contains(model.Query.ApiJson))
.OrderBy(o => o.Number);
}
public override void ToDisplayModel(IoTProduct entity, EditPlatformIoTProductModel model)
{
var category = this._productCategoryProductRepo.ReadOnlyTable()
.Where(o => o.ProductId == model.Id)
.Select(o=>o.Category)
.FirstOrDefault();
model.CategoryId = category?.Id;
if(model.CategoryId.HasValue)
{
var name = this._productCategoryRepo.ReadOnlyTable()
.Where(o => o.ParentId != null)
.Where(o => o.Left <= category.Left && o.Right >= category.Right).ToList()
.ToList()
.ToTree()
.FirstOrDefault(o => o.Id == model.CategoryId.Value)?.GetDisplayName();
ViewData.Add(model.CategoryId, name);
}
}
public override void ToEditModel(IoTProduct entity, EditPlatformIoTProductModel model)
{
if(entity!=null)
{
model.CategoryId = this._productCategoryProductRepo
.ReadOnlyTable()
.FirstOrDefault(o => o.ProductId == model.Id)
?.CategoryId;
}
ViewData.SelectList(o => model.CategoryId, () => this._ajax.GetIoTProductCategory(model.CategoryId).SelectList());
}
public override void ToEntity(EditPlatformIoTProductModel model, IoTProduct entity)
{
var productCategory = this._productCategoryProductRepo.Table().FirstOrDefault(o => o.ProductId == model.Id);
if (model.CategoryId.HasValue)
{
if(productCategory==null)
{
productCategory = new IoTProductCategoryIoTProduct { CategoryId=model.CategoryId.Value,ProductId=model.Id };
this._productCategoryProductRepo.Add(productCategory);
}
else
{
if(productCategory.CategoryId!=model.CategoryId.Value)
{
productCategory.CategoryId = model.CategoryId.Value;
}
}
}
else
{
if(productCategory!=null)
{
this._productCategoryProductRepo.Delete(productCategory);
}
}
}
}
}

@ -1,73 +0,0 @@
using Infrastructure.Application;
using Infrastructure.Data;
using Infrastructure.Extensions;
using Infrastructure.Web.Mvc;
using IoT.Shared.Application.Domain.Entities;
using IoT.Shared.Areas.IoTCenter.Controlls;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Platform.Application.Models;
using System.Linq;
namespace Platform.Areas.IoTCenter.Controllers
{
[Authorize]
[ApiController]
[Route("IoTCenter/[controller]/[action]")]
[Area("IoTCenter")]
public class NodeCategoryController : CrudController<IoTGatewayCategory, EditNodeCategoryModel>
{
private readonly AjaxController _ajax;
public NodeCategoryController(IRepository<IoTGatewayCategory> repo, AjaxController ajax) : base(repo)
{
this._ajax = ajax;
}
public override IQueryable<IoTGatewayCategory> Include(IQueryable<IoTGatewayCategory> query)
{
return query.Include(o => o.CategoryNodes).ThenInclude(o => o.Node);
}
public override IQueryable<IoTGatewayCategory> Query(PagedListModel<EditNodeCategoryModel> model, IQueryable<IoTGatewayCategory> query)
{
return base.Query(model, query)
.WhereIf(!string.IsNullOrEmpty(model.Query.Name), o => o.Name.Contains(model.Query.Name))
.WhereIf(!string.IsNullOrEmpty(model.Query.Template), o => o.Template.Contains(model.Query.Template));
}
public override void ToDisplayModel(IoTGatewayCategory entity, EditNodeCategoryModel model)
{
model.Nodes = entity.CategoryNodes.Select(o => o.NodeId).ToList();
entity.CategoryNodes.ForEach(o => ViewData.Add(o.NodeId, o.Node.Name));
}
public override void ToEditModel(IoTGatewayCategory entity, EditNodeCategoryModel model)
{
if (entity != null)
{
model.Nodes = entity.CategoryNodes.Select(o => o.NodeId).ToList();
}
this.ViewData.MultiSelectList(o => model.Nodes, () => this._ajax.GetNodeMultiSelectList(model.Nodes));
}
public override void ToEntity(EditNodeCategoryModel model, IoTGatewayCategory entity)
{
foreach (var id in entity.CategoryNodes.Select(o => o.NodeId).ToList())
{
if (!model.Nodes.Any(o => o == id))
{
entity.CategoryNodes.RemoveAll(o => o.NodeId == id);
}
}
foreach (var id in model.Nodes)
{
if (!entity.CategoryNodes.Any(o => o.NodeId == id))
{
entity.CategoryNodes.Add(new IoTGatewayCategoryIoTGateway { NodeId = id });
}
}
}
}
}

@ -49,13 +49,13 @@ namespace Platform.Areas.IoTCenter.Controllers
.ToList();
return new JsonResult(new SelectList(list, "Id", "Name", selected));
}
public JsonResult GetOrganBuilding(Guid? parentId, Guid? selected)
public JsonResult GetBuilding(Guid parentId, Guid? selected)
{
using var serviceScope = this._services.CreateScope();
var repo = serviceScope.ServiceProvider.GetRequiredService<IRepository<Building>>();
var list = repo.ReadOnlyTable()
.Where(o => o.ParentId != null)
.WhereIf(parentId.HasValue, o => o.OrganId == parentId.Value)
.Where(o => o.OrganId == parentId)
.OrderBy(o => o.ParentId)
.ThenBy(o => o.DisplayOrder)
.ToList()
@ -131,20 +131,21 @@ namespace Platform.Areas.IoTCenter.Controllers
return new JsonResult(new SelectList(list, "Id", "Name", selected));
}
[ApiExplorerSettings(IgnoreApi = true)]
public MultiSelectList GetRoleMultiSelectList(IEnumerable<Guid> selected)
public JsonResult GetIoTProductCategory(Guid? selected)
{
if (selected == null)
{
selected = new List<Guid>();
}
using var scope = this._services.CreateScope();
var repo = scope.ServiceProvider.GetRequiredService<IRepository<OrganRole>>();
var repo = scope.ServiceProvider.GetRequiredService<IRepository<IoTProductCategory>>();
var list = repo.ReadOnlyTable()
.Select(o => new { o.Id, o.Name })
.Where(o => o.ParentId != null)
.OrderBy(o => o.ParentId)
.ThenBy(o => o.DisplayOrder)
.ToList()
.ToTree()
.Select(o => new IoTProductCategory { Id = o.Id, Name = o.GetDisplayName() })
.ToList();
return new MultiSelectList(list, "Id", "Name", selected);
}
return new JsonResult(new SelectList(list, "Id", "Name", selected));
}
public SelectList GetOrganNodeSelectList(Guid parentId, Guid? selected = null)
{

@ -74,6 +74,12 @@ namespace Platform
modelBuilder.Entity<Department>().HasIndex(o => new { o.OrganId, o.Number }).IsUnique();
//IoTCenter
//IoTProductCategory
modelBuilder.Entity<IoTProductCategory>().HasIndex(o => o.Number).IsUnique();
//IoTProductCategoryIoTProduct
modelBuilder.Entity<IoTProductCategoryIoTProduct>().HasOne(o => o.Category).WithMany(o => o.CategoryProducts).HasForeignKey(o => o.CategoryId);
modelBuilder.Entity<IoTProductCategoryIoTProduct>().HasOne(o => o.Product).WithMany().HasForeignKey(o => o.ProductId);
modelBuilder.Entity<IoTProductCategoryIoTProduct>().HasIndex(o => o.ProductId).IsUnique();//通过唯一约束,保证一个商品只有一个分类
//IoTCommand
modelBuilder.Entity<IoTCommand>().HasOne(o => o.Api).WithMany().HasForeignKey(o => o.ApiId);
//OrganIoTScene
@ -86,14 +92,10 @@ namespace Platform
//OrganIoTSceneTigger
modelBuilder.Entity<OrganIoTSceneTigger>().HasOne(o => o.OrganScene).WithMany(o => o.OrganSceneTiggers).HasForeignKey(o => o.OrganSceneId);
modelBuilder.Entity<OrganIoTSceneTigger>().HasOne(o => o.Data).WithMany().HasForeignKey(o => o.DataId);
//IoTGatewayCategoryIoTGateway
modelBuilder.Entity<IoTGatewayCategoryIoTGateway>().HasOne(o => o.Node).WithMany(o => o.CategoryNodes).HasForeignKey(o => o.NodeId);
modelBuilder.Entity<IoTGatewayCategoryIoTGateway>().HasOne(o => o.Category).WithMany(o => o.CategoryNodes).HasForeignKey(o => o.CategoryId);
modelBuilder.Entity<IoTGatewayCategoryIoTGateway>().HasIndex(o => new { o.CategoryId, o.NodeId }).IsUnique();
//BuildingIoTGateway
modelBuilder.Entity<BuildingIoTGateway>().HasOne(o => o.Building).WithMany(o => o.BuildingIoTGateways).HasForeignKey(o => o.BuildingId);
modelBuilder.Entity<BuildingIoTGateway>().HasOne(o => o.IoTGateway).WithMany().HasForeignKey(o => o.IoTGatewayId);
modelBuilder.Entity<BuildingIoTGateway>().HasIndex(o => new { o.BuildingId, o.IoTGatewayId }).IsUnique();
modelBuilder.Entity<BuildingIoTGateway>().HasIndex(o => o.IoTGatewayId).IsUnique();
//LiveRecord
modelBuilder.Entity<LiveRecord>().Property(o => o.DeviceNumber).IsRequired();
}
@ -476,9 +478,6 @@ namespace Platform
set.Add(new Setting { Name = "sms:url", Value = "https://api.netease.im/sms/sendcode.action", Type = SettingType.String });
set.Add(new Setting { Name = "sms:key", Value = "123456", Type = SettingType.String });
set.Add(new Setting { Name = "sms:secret", Value = "123456", Type = SettingType.String });
//
db.Set<IoTGatewayCategory>().Add(new IoTGatewayCategory { Name = "智慧教室", Template = "node" });
db.SaveChanges();
}
}

@ -27,8 +27,6 @@ namespace Platform.Services
IEventHander<EntityInsertedEvent<Organ>>,
IEventHander<EntityUpdatedEvent<Organ>>,
IEventHander<EntityDeletedEvent<Organ>>,
IEventHander<EntityInsertedEvent<IoTGatewayCategory>>,
IEventHander<EntityUpdatedEvent<IoTGatewayCategory>>,
IEventHander<EntityInsertedEvent<OrganIoTSceneTimer>>,
IEventHander<EntityUpdatedEvent<OrganIoTSceneTimer>>,
IEventHander<EntityDeletedEvent<OrganIoTSceneTimer>>,
@ -52,8 +50,6 @@ namespace Platform.Services
private readonly ISettingService _settingService;
private readonly ILogger<IoTCenterEventHandler> _logger;
private readonly IRepository<IoTGateway> _nodeRepo;
private readonly IRepository<IoTGatewayCategory> _nodeCategoryRepo;
private readonly IRepository<IoTGatewayCategoryIoTGateway> _nodeCategoryNodeRepo;
private readonly IRepository<Organ> _organRepo;
private readonly IRepository<BuildingIoTGateway> _buildingIoTGatewayRepo;
private readonly IRepository<IoTDevice> _deviceRepo;
@ -67,8 +63,6 @@ namespace Platform.Services
ISettingService settingService,
ILogger<IoTCenterEventHandler> logger,
IRepository<IoTGateway> nodeRepo,
IRepository<IoTGatewayCategory> nodeCategoryRepo,
IRepository<IoTGatewayCategoryIoTGateway> nodeCategoryNodeRepo,
IRepository<Organ> organRepo,
IRepository<BuildingIoTGateway> buildingIoTGatewayRepo,
IRepository<IoTDevice> deviceRepo,
@ -82,8 +76,6 @@ namespace Platform.Services
this._settingService = settingService;
this._logger = logger;
this._nodeRepo = nodeRepo;
this._nodeCategoryRepo = nodeCategoryRepo;
this._nodeCategoryNodeRepo = nodeCategoryNodeRepo;
this._organRepo = organRepo;
this._buildingIoTGatewayRepo = buildingIoTGatewayRepo;
this._deviceRepo = deviceRepo;
@ -200,20 +192,6 @@ namespace Platform.Services
#endregion organ
#region nodeCategory
public void Handle(EntityInsertedEvent<IoTGatewayCategory> message)
{
this.Notify(message);
}
public void Handle(EntityUpdatedEvent<IoTGatewayCategory> message)
{
this.Notify(message);
}
#endregion nodeCategory
#region Device
public void Handle(EntityInsertedEvent<IoTDevice> message)

@ -14,23 +14,23 @@
<meta name="renderer" content="webkit" />
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport" />
<link rel="shortcut icon" href="/favicon.ico" />
<link rel="stylesheet" href="/lib/fontawesome-free/css/all.min.css" />
<link rel="stylesheet" href="/lib/ionicons/css/ionicons.min.css" />
<link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css" />
<link rel="stylesheet" href="/lib/admin-lte/css/adminlte.min.css" />
<link rel="stylesheet" href="/lib/fancybox/jquery.fancybox.min.css" />
<link rel="stylesheet" href="/lib/sweetalert2/dist/sweetalert2.min.css" />
<link rel="stylesheet" href="/lib/jquery-datetimepicker/jquery.datetimepicker.min.css" />
<link rel="stylesheet" href="/lib/sweetalert2/dist/sweetalert2.min.css" />
<link rel="stylesheet" href="/lib/select2/css/select2.min.css" />
<link rel="stylesheet" href="/lib/select2/dist/select2-bootstrap4.min.css" />
<link rel="stylesheet" href="/lib/tree-multiselect/jquery.tree-multiselect.min.css" />
<link rel="stylesheet" href="/lib/kindeditor/themes/default/default.css" />
<link rel="stylesheet" href="/lib/toastr/toastr.min.css">
<link rel="stylesheet" href="/lib/jqcron/jqCron.css">
<link rel="stylesheet" href="/lib/element-ui/theme-chalk/index.min.css">
<link rel="stylesheet" href="/lib/ant-design-vue/antd.min.css">
<link rel="stylesheet" href="/css/site.css">
<link rel="stylesheet" href="~/lib/fontawesome-free/css/all.min.css" />
<link rel="stylesheet" href="~/lib/ionicons/css/ionicons.min.css" />
<link rel="stylesheet" href="~/lib/bootstrap/css/bootstrap.min.css" />
<link rel="stylesheet" href="~/lib/admin-lte/css/adminlte.min.css" />
<link rel="stylesheet" href="~/lib/fancybox/jquery.fancybox.min.css" />
<link rel="stylesheet" href="~/lib/sweetalert2/dist/sweetalert2.min.css" />
<link rel="stylesheet" href="~/lib/jquery-datetimepicker/jquery.datetimepicker.min.css" />
<link rel="stylesheet" href="~/lib/sweetalert2/dist/sweetalert2.min.css" />
<link rel="stylesheet" href="~/lib/select2/css/select2.min.css" />
<link rel="stylesheet" href="~/lib/select2/dist/select2-bootstrap4.min.css" />
<link rel="stylesheet" href="~/lib/tree-multiselect/jquery.tree-multiselect.min.css" />
<link rel="stylesheet" href="~/lib/kindeditor/themes/default/default.css" />
<link rel="stylesheet" href="~/lib/toastr/toastr.min.css">
<link rel="stylesheet" href="~/lib/jqcron/jqCron.css">
<link rel="stylesheet" href="~/lib/element-ui/theme-chalk/index.min.css">
<link rel="stylesheet" href="~/lib/ant-design-vue/antd.min.css">
<link rel="stylesheet" href="~/css/site.css" asp-append-version="true">
<title>@HtmlTitle</title>
@RenderSection("styles", required: false)
</head>
@ -156,34 +156,34 @@
</div>
</div>
</div>
<script src="/lib/jquery/jquery.min.js"></script>
<script src="/lib/bootstrap/js/bootstrap.bundle.min.js"></script>
<script src="/lib/admin-lte/js/adminlte.min.js"></script>
<script src="/lib/axios/axios.min.js"></script>
<script src="/lib/signalr/signalr.min.js"></script>
<script src="/lib/vue/vue.min.js"></script>
<script src="/lib/linq/linq.min.js"></script>
<script src="/lib/jquery-validation/jquery.validate.min.js"></script>
<script src="/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script>
<script src="/lib/jquery-ajax-unobtrusive/jquery.unobtrusive-ajax.min.js"></script>
<script src="/lib/expressive.annotations.validate/expressive.annotations.validate.min.js"></script>
<script src="/lib/fancybox/jquery.fancybox.min.js"></script>
<script src="/lib/sweetalert2/dist/sweetalert2.all.min.js"></script>
<script src="/lib/jquery-datetimepicker/jquery.datetimepicker.full.min.js"></script>
<script src="/lib/select2/js/select2.full.min.js"></script>
<script src="/lib/select2/js/i18n/zh-CN.js"></script>
<script src="/lib/urijs/URI.min.js"></script>
<script src="/lib/tree-multiselect/jquery.tree-multiselect.min.js"></script>
<script src="/lib/chart.js/Chart.bundle.min.js"></script>
<script src="/lib/kindeditor/kindeditor-all-min.js"></script>
<script src="/lib/flv.js/flv.min.js"></script>
<script src="/lib/toastr/toastr.min.js"></script>
<script src="/lib/jqcron/jqCron.js"></script>
<script src="/lib/jqcron/jqCron.cn.js"></script>
<script src="/lib/element-ui/index.min.js"></script>
<script src="/lib/element-ui/locale/zh-CN.min.js"></script>
<script src="/lib/ant-design-vue/antd.min.js"></script>
<script src="~/lib/jquery/jquery.min.js"></script>
<script src="~/lib/bootstrap/js/bootstrap.bundle.min.js"></script>
<script src="~/lib/admin-lte/js/adminlte.min.js"></script>
<script src="~/lib/axios/axios.min.js"></script>
<script src="~/lib/signalr/signalr.min.js"></script>
<script src="~/lib/vue/vue.min.js"></script>
<script src="~/lib/linq/linq.min.js"></script>
<script src="~/lib/jquery-validation/jquery.validate.min.js"></script>
<script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script>
<script src="~/lib/jquery-ajax-unobtrusive/jquery.unobtrusive-ajax.min.js"></script>
<script src="~/lib/expressive.annotations.validate/expressive.annotations.validate.min.js"></script>
<script src="~/lib/fancybox/jquery.fancybox.min.js"></script>
<script src="~/lib/sweetalert2/dist/sweetalert2.all.min.js"></script>
<script src="~/lib/jquery-datetimepicker/jquery.datetimepicker.full.min.js"></script>
<script src="~/lib/select2/js/select2.full.min.js"></script>
<script src="~/lib/select2/js/i18n/zh-CN.js"></script>
<script src="~/lib/urijs/URI.min.js"></script>
<script src="~/lib/tree-multiselect/jquery.tree-multiselect.min.js"></script>
<script src="~/lib/chart.js/Chart.bundle.min.js"></script>
<script src="~/lib/kindeditor/kindeditor-all-min.js"></script>
<script src="~/lib/flv.js/flv.min.js"></script>
<script src="~/lib/toastr/toastr.min.js"></script>
<script src="~/lib/jqcron/jqCron.js"></script>
<script src="~/lib/jqcron/jqCron.cn.js"></script>
<script src="~/lib/element-ui/index.min.js"></script>
<script src="~/lib/element-ui/locale/zh-CN.min.js"></script>
<script src="~/lib/ant-design-vue/antd.min.js"></script>
@RenderSection("scripts", required: false)
<script src="/js/site.js"></script>
<script src="~/js/site.js" asp-append-version="true"></script>
</body>
</html>

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save