You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
iot/projects/Platform/Views/Home/Building.cshtml

236 lines
9.7 KiB

@model Platform.ViewModels.HomeModel
@{
HideBread = true;
}
<br />
<div class="row">
<div class="col-2">
<div class="card" style="height:calc(100% - 16px);">
<div class="card-header">
组织机构
</div>
<div class="card-body">
<div class="jstree">
<ul>
@RenderOrgans(Model.Organs)
</ul>
</div>
</div>
</div>
</div>
<div class="col-10">
<div class="card">
<div class="card-header">
<h5 class="card-title">
当前:
@Model.Organ.GetDisplayName()
@if (Model.BuildingId.HasValue)
{
<text> / @Model.Building.GetDisplayName()</text>
}
</h5>
</div>
<div class="card-body">
<div class="row">
<div class="col-sm-3">
<div class="position-relative p-3 bg-gray">
<div class="ribbon-wrapper">
<div class="ribbon bg-primary">
光照
</div>
</div>
<p>最大值:@(Model.MaxLight.HasValue?$"{Model.MaxLight.Value} Lux":"无设备")</p>
<p>最小值:@(Model.MinLight.HasValue?$"{Model.MinLight.Value} Lux":"无设备")</p>
</div>
</div>
<div class="col-sm-3">
<div class="position-relative p-3 bg-gray">
<div class="ribbon-wrapper">
<div class="ribbon bg-primary">
温度
</div>
</div>
<p>最大值:@(Model.MaxTemperatures.HasValue?$"{Model.MaxTemperatures.Value.ToString("f2")} ℃":"无设备")</p>
<p>最小值:@(Model.MinTemperaturest.HasValue?$"{Model.MinTemperaturest.Value.ToString("f2")} ℃":"无设备")</p>
</div>
</div>
<div class="col-sm-3">
<div class="position-relative p-3 bg-gray">
<div class="ribbon-wrapper">
<div class="ribbon bg-primary">
湿度
</div>
</div>
<p>最大值:@(Model.MaxHumidity.HasValue?$"{Model.MaxHumidity.Value.ToString("f2")} RH%" :"无设备")</p>
<p>最小值:@(Model.MinHumidity.HasValue?$"{Model.MinHumidity.Value.ToString("f2")} RH%" :"无设备")</p>
</div>
</div>
<div class="col-sm-3">
<div class="position-relative p-3 bg-gray">
<div class="ribbon-wrapper">
<div class="ribbon bg-primary">
用电
</div>
</div>
<p>开:@(Model.Open.HasValue?$"{Model.Open.Value}":"无设备")</p>
<p>关:@(Model.Close.HasValue?$"{Model.Close.Value}":"无设备")</p>
</div>
</div>
</div>
</div>
</div>
@if (Model.Scenes.Any())
{
<div class="card">
<div class="card-header">建筑场景</div>
<div class="card-body">
<div class="row">
@foreach (var item in Model.Scenes)
{
<div class="col-sm-1">
<div class="card bg-light p-2">
<a class="card-body text-center" href="#" style="padding:0;">
<img class="card-img-top" src="@Url.Content2(item.Image)" alt="@item.Name" style="width:48px;height:48px;">
<div>@item.Name</div>
</a>
</div>
</div>
}
</div>
</div>
</div>
}
@if (Model.Buildings.Any())
{<div class="card">
<div class="card-header">下级建筑</div>
<div class="card-body">
<div class="row">
@foreach (var item in Model.Buildings)
{
<div class="col-sm-2">
<div class="card bg-gray">
<div class="card-body bg-gray text-center">
<img class="card-img-top" src="@Url.Content2(item.Image)" alt="@item.Name" style="width:64px;height:64px;margin:0 auto;">
@*<div class="row">
<div class="col-sm-3"></div>
</div>*@
<br />
<a class="btn btn-block btn-primary btn-sm" href="@Url.Action(null,null,new { buildingId = item.Id})">@item.Name</a>
</div>
</div>
</div>
}
</div>
</div>
</div>
}
<div class="card">
<div class="card-header">
<h5 class="card-title">设备</h5>
<div class="card-tools">
<label style="margin:0;">
全部:@Html.CheckBoxFor(o => o.ShowAll, new { style = "width:20px;height:20px;vertical-align:bottom;margin-right:10px;" })
</label>
</div>
</div>
@if (Model.Deviceses.Any())
{
<div class="card-body">
<div class="row">
@foreach (var item in Model.Deviceses.OrderBy(o => o.IoTProductId))
{
try
{
@await Html.PartialAsync($"/Views/Shared/Device/{item.Icon}.cshtml", item)
}
catch
{
@await Html.PartialAsync($"/Views/Shared/Device/default.cshtml", item)
}
}
</div>
</div>
@if (Model.PageCount() > 1)
{
<div class="card-footer">@(await Html.PartialAsync("_Paged"))</div>
}
}
</div>
</div>
</div>
@functions{
object RenderOrgans(List<Organ> list)
{
foreach (var item in list)
{
dynamic data = new System.Dynamic.ExpandoObject();
data.selected = !Model.BuildingId.HasValue && Model.OrganId.HasValue && item.Id == Model.OrganId.Value;
data.opend = true;
<li data-jstree='@Html.Raw((data as object).ToJson())'>
<a href="@Url.Action(null,null,new { organId=item.Id})">@item.Name</a>
@if (item.Children.Any() || item.Buildings.Any())
{
<ul>
@if (item.Children.Any())
{
@RenderOrgans(item.Children)
}
@if (item.Buildings.Any())
{
@RenderBuildings(item.Buildings)
}
</ul>
}
</li>
}
return null;
}
object RenderBuildings(List<Building> list)
{
foreach (var item in list)
{
dynamic data = new System.Dynamic.ExpandoObject();
data.selected = Model.BuildingId.HasValue && item.Id == Model.BuildingId.Value;
data.icon = "jstree-file";
<li data-jstree='@Html.Raw((data as object).ToJson())'>
<a href="@Url.Action(null,null,new { buildingId=item.Id})">@item.Name</a>
@if (item.Children.Any())
{
<ul>
@if (item.Children.Any())
{
@RenderBuildings(item.Children)
}
</ul>
}
</li>
}
return null;
}
}
@section scripts{
<script>
$('#ShowAll').click(function () {
var url = new URI(window.location.href).removeSearch('showAll').addSearch('showAll', $('#ShowAll:checked').val() ? true : false);
window.location.href = url;
});
var tree = $('.jstree').on('changed.jstree', function (e, data) {
if (data.event) {
var url = new URI(data.event.currentTarget.href).removeSearch('showAll').addSearch('showAll', $('#ShowAll:checked').val() ? true : false);
window.location.href = url;
}
else {
var parents = data.instance.get_node(data.selected).parents;
for (var i = 0; i < parents.length; i++) {
var item = parents[i];
data.instance.open_node(item);
}
}
}).jstree();
</script>
}