楼宇能效监测控制系统
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.
 
 
 
 
 

2098 lines
62 KiB

<template>
<div class="monitor" v-loading="loading">
<div class="monitor-top">
<img
class="title-left"
src="../../../assets/images/title-left.png"
alt=""
/>
<img
class="title-center"
src="../../../assets/images/title-center.png"
alt=""
/>
<img
class="title-right"
src="../../../assets/images/title-right.png"
alt=""
/>
<div class="sys-title" @click="goSys">生活热水供水监控系统</div>
<!-- logo -->
<img src="../../../assets/images/logo-3.png" class="sys-logo" alt="" />
<div class="nowTime">{{ formattedDate }}</div>
<div class="monitor-time">已监测时长:{{ dayData }}天</div>
<img
class="icon_warning"
src="../../../assets/images/warning.png"
title="报警记录"
@click="goWarning"
v-if="isShowWarning"
alt=""
/>
<img
class="icon_home"
src="../../../assets/images/icon_home.png"
title="首页"
@click="goSys"
alt=""
/>
<img
class="back-icon"
src="../../../assets/images/back-icon.png"
title="返回"
@click="goBack"
alt=""
/>
</div>
<div class="app-container">
<div class="left-tree">
<!-- 为 el-tree 设置一个固定的高度和滚动条 -->
<div style="height: 5rem; overflow-y: auto">
<el-tree
ref="tree"
:data="treeData"
node-key="id"
:default-expand-all="false"
:default-expanded-keys="expandedKeys"
:auto-expand-parent="true"
icon-class="none"
@node-expand="handleNodeExpand"
@node-collapse="handleNodeCollapse"
:highlight-current="true"
@node-click="handleNodeClick"
>
<template #default="{ node }">
<span class="custom-tree-node">
<!-- 根据节点状态动态设置图标类名 -->
<div class="tree-left">
<i :class="getIconClass(node)" class="custom-tree-icon"></i>
<span class="tree-label">{{ node.label }}</span>
</div>
</span>
</template>
</el-tree>
</div>
<div class="base-mes">
<div class="base-title">公共信息</div>
<div class="base-height">
<div
class="base-li"
v-for="(item, index) in baseTable"
:key="index"
>
{{ item.name }}:<span class="deepColor">{{ item.value }}</span
>{{ item.unit }}
</div>
</div>
</div>
</div>
<div class="right-monitor">
<div class="buildingDiv">
<img
class="title-bg"
src="../../../assets/images/title-bg.png"
alt=""
/>
<div class="title-word">楼层:{{ currentName }}</div>
</div>
<div class="folw">
<!-- 动态流程图 -->
<div class="changeimage">
<!-- <img class="img-rad" src="" alt="" /> -->
<div class="flowimg">
<!-- <img v-if="this.useWater == '运行'" src="../../../assets/images/flowimg/move.gif" class="bigMove" alt="" />
<img v-else src="../../../assets/images/flowimg/nomove.png" class="bigMove" alt="" /> -->
<!-- 文字定位 -->
<div class="flow-text text1">{{ progressName1 }}供水泵1</div>
<div class="flow-text text6">{{ progressName1 }}供水泵2</div>
<div class="flow-text text9">{{ progressName2 }}供水泵1</div>
<div class="flow-text text10">{{ progressName2 }}供水泵2</div>
<div class="flow-text text2">回水管</div>
<div class="flow-text text3">无线网关</div>
<div class="flow-text text4">回水阀</div>
<div class="flow-text text5">房间</div>
<div class="flow-text text7">循环加热泵</div>
<div class="flow-text text8">补水阀</div>
<!-- 补水阀定位 -->
<img
class="replenish"
v-if="this.useWaterState === '1'"
src="../../../assets/flowimg/replenish-move.gif"
alt=""
/>
<img
class="replenish"
v-else
src="../../../assets/flowimg/replenish-nomove.png"
alt=""
/>
<!-- 供水定位 -->
<img
class="supply"
v-if="
this.upWaterState1 === '1' ||
this.upWaterState2 === '1' ||
this.upWaterState3 === '1' ||
this.upWaterState4 === '1'
"
src="../../../assets/flowimg/supply-move.gif"
alt=""
/>
<img
class="supply"
v-else
src="../../../assets/flowimg/supply-nomove.png"
alt=""
/>
<!-- 加热定位 -->
<img
class="circulate"
v-if="this.hotPumState === '1' && this.isBad !== '1'"
src="../../../assets/flowimg/circulate-move.gif"
alt=""
/>
<img
class="circulate"
v-else
src="../../../assets/flowimg/circulate-nomove.png"
alt=""
/>
<!-- 供水泵1定位 -->
<img
class="coolpum"
v-if="this.upWaterState1 === '1'"
src="../../../assets/flowimg/startpum.png"
alt=""
/>
<img
class="coolpum"
v-else
src="../../../assets/flowimg/closepum.png"
alt=""
/>
<!-- 供水泵2定位 -->
<img
class="waterpum"
v-if="this.upWaterState2 === '1'"
src="../../../assets/flowimg/startpum.png"
alt=""
/>
<img
class="waterpum"
v-else
src="../../../assets/flowimg/closepum.png"
alt=""
/>
<!-- 供水泵3定位 -->
<img
class="waterpum2"
v-if="this.upWaterState3 === '1'"
src="../../../assets/flowimg/startpum.png"
alt=""
/>
<img
class="waterpum2"
v-else
src="../../../assets/flowimg/closepum.png"
alt=""
/>
<!-- 供水泵4定位 -->
<img
class="waterpum3"
v-if="this.upWaterState4 === '1'"
src="../../../assets/flowimg/startpum.png"
alt=""
/>
<img
class="waterpum3"
v-else
src="../../../assets/flowimg/closepum.png"
alt=""
/>
<!-- 补水定位 -->
<img
class="buwaterpum2"
v-if="backWaterState === '1'"
src="../../../assets/flowimg/bu-move.gif"
alt=""
/>
<img
class="buwaterpum"
v-else
src="../../../assets/flowimg/bu-nomove.png"
alt=""
/>
<!-- 循环加热泵定位-->
<img
class="cirpum"
v-if="this.hotPumState === '1' && this.isBad !== '1'"
src="../../../assets/flowimg/startpum.png"
alt=""
/>
<img
class="cirpum"
v-else
src="../../../assets/flowimg/closepum.png"
alt=""
/>
<!-- 热泵定位 -->
<div :class="getHotPumPositionClass">
<div
class="hotPump-li"
v-for="(item, index) in tableData"
:key="index"
>
<template v-if="tableData.length === 2">
<template v-if="index === 0">
<div class="hotPump-name">{{ item.pumpName }}</div>
<img
class="hotPump-img"
:src="getImageSrc(item)"
alt=""
/>
<!-- <div class="hotPump-tem1">温度:{{ item.waterTemp }}℃</div>
-->
<img
class="tem2"
src="../../../assets/flowimg/thermometer.png"
alt=""
/>
<div class="temContainer2">
<div
class="temprogress"
:style="{ height: item.waterTemp + '%' }"
></div>
</div>
<b class="temdiv2">{{ item.waterTemp }}℃</b>
</template>
<template v-else>
<img
class="hotPump-img"
:src="getImageSrc(item)"
alt=""
/>
<div class="hotPump-name">{{ item.pumpName }}</div>
<img
class="tem2"
src="../../../assets/flowimg/thermometer.png"
alt=""
/>
<div class="temContainer2">
<div
class="temprogress"
:style="{ height: item.waterTemp + '%' }"
></div>
</div>
<b class="temdiv2">{{ item.waterTemp }}℃</b>
</template>
</template>
<template v-else-if="tableData.length === 4">
<template v-if="index < 2">
<template v-if="index === 0">
<div class="hotPump-name">{{ item.pumpName }}</div>
<img
class="hotPump-img"
:src="getImageSrc(item)"
alt=""
/>
<!-- <div class="hotPump-tem1">温度:{{ item.waterTemp }}℃</div>
-->
<img
class="tem2"
src="../../../assets/flowimg/thermometer.png"
alt=""
/>
<div class="temContainer2">
<div
class="temprogress"
:style="{ height: item.waterTemp + '%' }"
></div>
</div>
<b class="temdiv2">{{ item.waterTemp }}℃</b>
</template>
<template v-else>
<div class="hotPump-name">{{ item.pumpName }}</div>
<img
class="hotPump-img"
:src="getImageSrc(item)"
alt=""
/>
<img
class="tem1"
src="../../../assets/flowimg/thermometer.png"
alt=""
/>
<div class="temContainer1">
<div
class="temprogress"
:style="{ height: item.waterTemp + '%' }"
></div>
</div>
<b class="temdiv1">{{ item.waterTemp }}℃</b>
</template>
</template>
<template v-else>
<template v-if="index === 2">
<img
class="hotPump-img"
:src="getImageSrc(item)"
alt=""
/>
<div class="hotPump-name">{{ item.pumpName }}</div>
<!-- <div class="hotPump-tem1">温度:{{ item.waterTemp }}℃</div>
-->
<img
class="tem2"
src="../../../assets/flowimg/thermometer.png"
alt=""
/>
<div class="temContainer2">
<div
class="temprogress"
:style="{ height: item.waterTemp + '%' }"
></div>
</div>
<b class="temdiv2">{{ item.waterTemp }}℃</b>
</template>
<template v-else>
<img
class="hotPump-img"
:src="getImageSrc(item)"
alt=""
/>
<div class="hotPump-name">{{ item.pumpName }}</div>
<img
class="tem1"
src="../../../assets/flowimg/thermometer.png"
alt=""
/>
<div class="temContainer1">
<div
class="temprogress"
:style="{ height: item.waterTemp + '%' }"
></div>
</div>
<b class="temdiv1">{{ item.waterTemp }}℃</b>
</template>
</template>
</template>
</div>
</div>
<!-- 热泵名称定位 -->
<!-- <div class="pumname">{{ this.pumname }}</div> -->
<!-- 热泵定位 -->
<!-- <img
class="hotpum"
v-if="this.hotPumState === '1' && this.isBad !== '1'"
src="../../../assets/flowimg/starthotpum.png"
alt=""
/>
<img
class="hotpum"
v-else-if="this.isBad === '1'"
src="../../../assets/flowimg/badhotpum.png"
alt=""
/>
<img
class="hotpum"
v-else
src="../../../assets/flowimg/closehotpum.png"
alt=""
/> -->
<!-- 无线网关定位 无状态。-->
<img
class="web"
:src="
webstate == 0
? require('../../../assets/flowimg/badweb.png')
: require('../../../assets/flowimg/onlineweb.png')
"
alt=""
/>
<!-- 保温水箱定位 -->
<img
class="waterBox"
src="../../../assets/flowimg/waterBox.png"
alt=""
/>
<!-- 温度定位1 -->
<!-- <img
class="tem1"
src="../../../assets/flowimg/thermometer.png"
alt=""
/>
<div class="temContainer1">
<div class="temprogress" :style="{ height: temdata + '%' }"></div>
</div>
<b class="temdiv1">{{ temdata }}℃</b> -->
<!-- 温度定位2 -->
<!-- <img
class="tem2"
src="../../../assets/flowimg/thermometer.png"
alt=""
/>
<div class="temContainer2">
<div class="temprogress" :style="{ height: temdata + '%' }"></div>
</div>
<b class="temdiv2">{{ temdata }}℃</b> -->
<!-- 水位定位1 -->
<div class="progressContainer1" v-if="progress1 > 50">
<div
class="progress"
:style="{ height: progress1 + '%' }"
></div>
<b class="propo">{{ progress1 }}%</b>
</div>
<div class="progressContainer2" v-else>
<div
class="progress"
:style="{ height: progress1 + '%' }"
></div>
<b class="propo">{{ progress1 }}%</b>
</div>
<div class="progressName1">{{ progressName1 }}</div>
<!-- 水位定位2 -->
<div class="progressContainer3" v-if="progress2 > 50">
<div
class="progress"
:style="{ height: progress2 + '%' }"
></div>
<b class="propo">{{ progress2 }}%</b>
</div>
<div class="progressContainer4" v-else>
<div
class="progress"
:style="{ height: progress2 + '%' }"
></div>
<b class="propo">{{ progress2 }}%</b>
</div>
<div class="progressName2">{{ progressName2 }}</div>
</div>
</div>
<div class="changecontent">
<div class="tablemaeta">系统状态显示</div>
<el-table
class="maintable"
ref="maintable"
:data="tableData"
height="200"
highlight-current-row
@row-click="handlerow"
:cell-style="tableRowStyle"
:show-overflow-tooltip="true"
:header-cell-style="{ 'text-align': 'center' }"
>
<el-table-column label="序号" min-width="50">
<template slot-scope="scope">
{{ scope.$index + 1 }}
</template>
</el-table-column>
<el-table-column prop="curDate" label="状态时间" min-width="130">
</el-table-column>
<el-table-column prop="pumpName" label="热泵名称">
</el-table-column>
<el-table-column
prop="tempSet"
label="设置温度(℃)"
min-width="100"
>
<template slot-scope="{ row }">
<span>{{ row.tempSet }} </span>
</template>
</el-table-column>
<el-table-column
prop="waterTemp"
label="实际温度(℃)"
min-width="100"
>
<template slot-scope="{ row }">
<span>{{ row.waterTemp }} </span>
</template>
</el-table-column>
<!-- 裙楼、高区 -->
<el-table-column
prop="levelSet1"
label="设置水位1(%)"
min-width="100"
>
<template slot-scope="{ row }">
<span>{{ row.levelSet1 }}</span>
</template>
</el-table-column>
<el-table-column
prop="waterLevel1"
label="实际水位1(%)"
min-width="100"
>
<template slot-scope="{ row }">
<span>{{ row.waterLevel1 }} </span>
</template>
</el-table-column>
<!-- 中厨、中区 -->
<el-table-column
prop="levelSet2"
label="设置水位2(%)"
min-width="100"
>
<template slot-scope="{ row }">
<span>{{ row.levelSet2 }}</span>
</template>
</el-table-column>
<el-table-column
prop="waterLevel2"
label="实际水位2(%)"
min-width="100"
>
<template slot-scope="{ row }">
<span>{{ row.waterLevel2 }} </span>
</template>
</el-table-column>
<el-table-column prop="upWaterState" label="补水状态">
<template slot-scope="{ row }">
<span v-if="row.useWaterState === '0'">不运行 </span>
<span v-if="row.useWaterState === '1'">运行 </span>
</template>
</el-table-column>
<el-table-column prop="backWaterState" label="回水状态">
<template slot-scope="{ row }">
<span v-if="row.backWaterState === '0'">不运行 </span>
<span v-if="row.backWaterState === '1'">运行 </span>
</template>
</el-table-column>
<el-table-column prop="runState" label="热泵状态">
<template slot-scope="{ row }">
<span v-if="row.runState === '0'">不运行 </span>
<span v-if="row.runState === '1'">运行 </span>
</template>
</el-table-column>
<el-table-column prop="isFault" label="是否故障">
<template slot-scope="{ row }">
<span v-if="row.isFault === '0'">无故障</span>
<span v-if="row.isFault === '1'">有故障</span>
</template>
</el-table-column>
</el-table>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import { runTime } from "@/api/centerairC/sysMonitor";
import { alarmRecordList } from "@/api/alarm/alarmRecord";
import { getDay } from "@/utils/datetime";
import { floorTree } from "@/api/region";
import { waterPublic, waterMonitorList } from "@/api/hotWater/waterMonitor";
export default {
data() {
return {
loading: false,
currentDate: new Date(),
nowTimer: null,
timer: null, // 用于存储定时器 ID
isShowWarning: false, //是否有报警
dayData: "", //监测天数
treeData: [],
defaultProps: {
children: "children",
label: "label",
},
deviceList: [],
expandedKeys: [],
currentId: "", //当前选中高亮的id
currentName: "", //当前选中的名称
currentLevel: "", //当前节点的层级
currentParentId: "", //当前节点的上级的id
baseTable: [], //公共信息列表数据
tableData: [], //系统状态表格数据
// 供水阀状态 0表示关闭 1表示开启
useWaterState: "",
upWaterState1: "", //供水泵1状态
upWaterState2: "", //供水泵2状态
upWaterState3: "", //供水泵3状态
upWaterState4: "", //供水泵4状态
backWaterState: "", //回水阀状态
// 热泵状态 两个系数
hotPumState: "",
isBad: "无故障",
// 网关在线状态 0表示离线 1表示在线
webstate: 1,
// 水位变化数值
progress1: 0,
progress2: 0,
progressName1: "",
progressName2: "",
// 温度变化数值
temdata: 0,
// 热泵名称
pumname: "",
currentWeekday: "",
};
},
computed: {
formattedDate() {
const year = this.currentDate.getFullYear();
const month = String(this.currentDate.getMonth() + 1).padStart(2, "0");
const day = String(this.currentDate.getDate()).padStart(2, "0");
const hours = String(this.currentDate.getHours()).padStart(2, "0");
const minutes = String(this.currentDate.getMinutes()).padStart(2, "0");
const seconds = String(this.currentDate.getSeconds()).padStart(2, "0");
const weekDays = [
"星期日",
"星期一",
"星期二",
"星期三",
"星期四",
"星期五",
"星期六",
];
const weekDay = weekDays[this.currentDate.getDay()];
return `${year}${month}${day}${hours}:${minutes}:${seconds} ${weekDay}`;
},
getHotPumPositionClass() {
if (this.tableData.length === 4) {
return "hotPumPosition-four";
} else if (this.tableData.length === 2) {
return "hotPumPosition-two";
}
return "";
},
},
created() {
const weekdays = [
"星期日",
"星期一",
"星期二",
"星期三",
"星期四",
"星期五",
"星期六",
];
const date = new Date();
const dayIndex = date.getDay();
this.currentWeekday = weekdays[dayIndex];
console.log("今天是星期几", this.currentWeekday);
},
mounted() {
this.requestFullscreen();
this.getSysBuild();
this.getAlarnStatus();
this.getDayData();
// 设置定时器,每 10 秒执行一次
this.timer = setInterval(() => {
this.baseMessgae();
this.sysStatus();
}, 10000);
// 每秒更新一次时间
this.nowTimer = setInterval(() => {
this.currentDate = new Date();
}, 1000);
},
beforeDestroy() {
// 组件销毁前清除定时器
if (this.timer) {
clearInterval(this.timer);
}
// 组件销毁前清除定时器
if (this.nowTimer) {
clearInterval(this.nowTimer);
}
},
methods: {
// 全屏操作
requestFullscreen() {
const element = document.documentElement;
console.log("全屏了吗");
if (element.requestFullscreen) {
element.requestFullscreen();
} else if (element.mozRequestFullScreen) {
// Firefox
element.mozRequestFullScreen();
} else if (element.webkitRequestFullscreen) {
// Chrome, Safari and Opera
element.webkitRequestFullscreen();
} else if (element.msRequestFullscreen) {
// IE/Edge
element.msRequestFullscreen();
}
},
// 退出全屏
exitFullscreen() {
if (document.exitFullscreen) {
document.exitFullscreen();
} else if (document.mozCancelFullScreen) {
// Firefox
document.mozCancelFullScreen();
} else if (document.webkitExitFullscreen) {
// Chrome, Safari and Opera
document.webkitExitFullscreen();
} else if (document.msExitFullscreen) {
// IE/Edge
document.msExitFullscreen();
}
},
// 进入系统首页
goSys() {
// this.exitFullscreen();
this.$router.push("/");
},
// 返回上一页
goBack() {
window.history.go(-2);
},
// 监测天数
getDayData() {
runTime().then((res) => {
if (res.code == 200) {
this.dayData = res.data.runTime;
}
});
},
// 报警列表
getAlarnStatus() {
let data = {
pageNum: 1,
pageSize: 10,
status: "0",
};
let timeArr = [getDay(0), getDay(0)];
alarmRecordList(this.addDateRange(data, timeArr)).then((res) => {
if (res.code == 200 && res.rows.length > 0) {
this.isShowWarning = true;
} else {
this.isShowWarning = false;
}
});
},
goWarning() {
// this.exitFullscreen();
this.$router.push("/alarm/alarmRecord");
},
getImageSrc(item) {
// console.log("item", item);
if (item.runState === "1" && item.isFault !== "1") {
// 使用 require 函数导入图片
return require("@/assets/flowimg/starthotpum.png");
} else if (item.isFault === "1") {
return require("@/assets/flowimg/badhotpum.png");
} else {
return require("@/assets/flowimg/closehotpum.png");
}
},
getSysBuild() {
floorTree().then((res) => {
if (res.code == 200) {
// 只需要保留热水的系统
console.log("楼栋返回值", res);
let newRes = { ...res };
if (newRes.data && newRes.data[0] && newRes.data[0].children) {
newRes.data[0].children = newRes.data[0].children.filter((item) => {
// 假设子项有一个 label属性,用于检查是否包含 "热水"
return item.label && item.label.includes("热水");
});
}
// 指定要保留的最大层级(从 1 开始计数),这里假设指定为第 4 级
const targetLevel = 4;
// 从 data[0] 开始处理,当前层级为 1
if (newRes.data[0]) {
this.removeChildrenAfterLevel(newRes.data[0], 1, targetLevel);
}
console.log("筛选后的新结果", newRes);
this.treeData = newRes.data;
this.$nextTick(() => {
// 默认展开节点
this.getExpandedKeys(this.treeData, 2);
if (this.treeData.length > 0) {
// 找到最后一层的第一个子节点
const lastLevelFirstChild = this.findLastLevelFirstChild(
this.treeData[0]
);
// this.$refs.tree.setCurrentKey(
// this.treeData[0].children[0].children[0].children[0].id
// );
// 设置当前选中的节点,默认高亮
this.$refs.tree.setCurrentKey(lastLevelFirstChild.id);
// 更新当前节点的信息
this.currentId = lastLevelFirstChild.id;
this.currentLevel = lastLevelFirstChild.level;
this.currentName = lastLevelFirstChild.label;
console.log("当前选中节点ID", this.currentId);
console.log("当前选中节点层级", this.currentLevel);
console.log("当前选中节点名称", this.currentName);
if (this.currentName === "-1楼") {
this.progressName1 = "裙楼";
this.progressName2 = "中厨";
} else if (this.currentName === "3楼") {
this.progressName1 = "高区";
this.progressName2 = "中区";
}
this.baseMessgae();
this.sysStatus();
}
});
}
});
},
// 递归函数,用于去除指定层级往后的 children 数据
removeChildrenAfterLevel(obj, currentLevel, targetLevel) {
if (currentLevel >= targetLevel) {
// 当达到指定层级时,将 children 属性置为空数组
obj.children = [];
return;
}
if (obj.children && obj.children.length > 0) {
// 若存在 children 数组,则递归处理每个子项
for (let i = 0; i < obj.children.length; i++) {
this.removeChildrenAfterLevel(
obj.children[i],
currentLevel + 1,
targetLevel
);
}
}
},
// 递归函数,找到最后一层的第一个子节点
findLastLevelFirstChild(node, level = 1) {
if (!node.children || node.children.length === 0) {
return {
id: node.id,
level,
label: node.label,
};
}
return this.findLastLevelFirstChild(node.children[0], level + 1);
},
// 默认只展示一二级菜单
getExpandedKeys(nodes, level) {
nodes.forEach((node) => {
if (level <= this.currentId + 4) {
this.expandedKeys.push(node.id);
}
if (node.children) {
this.getExpandedKeys(node.children, level + 1);
}
});
},
// 更换图标
getIconClass(node) {
// console.log("当前图标的节点内容", node);
if (node.level === 4) {
// 4级菜单时的图标
if (node.expanded) {
return "el-icon-document-opened"; // 三级菜单展开时的图标类名
}
return "el-icon-document"; // 三级菜单收缩时的图标类名
}
if (node.expanded) {
return "el-icon-folder-opened"; // 非三级菜单展开时的图标类名
}
return "el-icon-folder-add"; // 非三级菜单收缩时的图标类名
},
handleNodeExpand(node) {
// 节点展开时触发
},
handleNodeCollapse(node) {
// 节点收缩时触发
},
// 点击当前节点,保存节点内容
handleNodeClick(node, data) {
console.log("点击的当前节点", node, data);
if (data.level !== 4) {
console.log("不是第4层000");
// 设置当前选中的节点,默认高亮
this.$refs.tree.setCurrentKey(this.currentId);
console.log("当前选中节点ID", this.currentId);
console.log("当前选中节点层级", this.currentLevel);
console.log("当前选中节点名称", this.currentName);
} else {
console.log("第4层111");
this.currentId = node.id;
this.currentLevel = data.level;
this.currentName = node.label;
// 设置当前选中的节点,默认高亮
this.$refs.tree.setCurrentKey(this.currentId);
console.log("当前选中节点ID", this.currentId);
console.log("当前选中节点层级", this.currentLevel);
console.log("当前选中节点名称", this.currentName);
this.baseMessgae();
this.sysStatus();
}
if (this.currentName === "-1楼") {
this.progressName1 = "裙楼";
this.progressName2 = "中厨";
} else if (this.currentName === "3楼") {
this.progressName1 = "高区";
this.progressName2 = "中区";
}
},
handleClick(tab, event) {
console.log(tab, event);
console.log("activeName", this.activeName);
},
//查询单个热泵状态 点击表格的某一行
handlerow(row, event, column) {
console.log("row", row);
//水位 温度 热泵名称
this.progress1 = row.waterLevel1;
this.progress2 = row.waterLevel2;
this.temdata = row.waterTemp;
this.pumname = row.pumpName;
// 热泵状态 是否故障
this.hotPumState = row.runState;
this.isBad = row.isFault;
this.useWaterState = row.useWaterState;
this.upWaterState1 = row.upWaterState1;
this.upWaterState2 = row.upWaterState2;
this.upWaterState3 = row.upWaterState3;
this.upWaterState4 = row.upWaterState4;
this.backWaterState = row.backWaterState;
console.log("补水阀状态11111111111111111111", this.useWaterState);
},
/* 加入小手状态 */
tableRowStyle({ row, column, rowIndex, columnIndex }) {
if (row) {
return "cursor:pointer;text-align:center";
}
},
// 公共信息
baseMessgae() {
let data = {
systemType: "1",
floorId: this.currentId,
};
waterPublic(data).then((res) => {
console.log("公共信息返回", res);
if (res.code == 200 && res.rows.length > 0) {
this.baseTable = [];
res.rows.forEach((item) => {
// 初始化一个空对象来存储阀门处理后的结果
let baseltem = {
name: item.name,
};
if (item.name.includes("温度")) {
baseltem.unit = "℃";
}
if (item.name.includes("压力")) {
baseltem.unit = "bar";
}
if (item.value.includes("采集失败")) {
baseltem.value = "0";
} else {
baseltem.value = item.value;
}
// 将处理后的对象添加到 deviceList 中
if (Object.keys(baseltem).length > 1) {
this.baseTable.push(baseltem);
}
});
console.log("处理后的公共信息返回", this.baseTable);
}
});
},
// 系统状态显示
sysStatus() {
let data = {
systemType: "1",
floorId: this.currentId,
};
waterMonitorList(data).then((res) => {
console.log("系统状态返回", res);
if (res.code == 200 && res.rows.length > 0) {
this.tableData = [];
res.rows.forEach((item) => {
let deviceItem = {
...item,
runState: Number(item.runState) == 0 ? "0" : "1", //运行状态
upWaterState: Number(item.upWaterState) == 0 ? "0" : "1", //供水状态
isFault: Number(item.isFault) == 0 ? "0" : "1", //故障状态
};
this.tableData.push(deviceItem);
});
console.log("处理后的tableData", this.tableData);
if (this.tableData.length > 0) {
// 获取第一行数据
const firstRow = this.tableData[0];
// 模拟点击第一行
this.handlerow(firstRow);
// 设置当前选中行
this.$refs.maintable.setCurrentRow(firstRow);
}
} else {
this.tableData = [];
}
});
},
},
};
</script>
<style lang="scss" scoped>
.buildingDiv {
padding-left: 54px;
display: flex;
flex-direction: row;
align-items: center;
margin-bottom: 20px;
position: relative;
.title-bg {
width: 208px;
height: 38px;
position: absolute;
left: 0;
z-index: 0;
}
.title-word {
z-index: 10;
font-family: YouSheBiaoTiHei;
font-size: 24px;
color: #ffffff;
white-space: nowrap;
}
}
.monitor {
width: 100%;
min-height: 100vh;
background-color: black;
color: #fff;
.monitor-top {
width: 100%;
display: flex;
flex-direction: row;
align-items: flex-start;
justify-content: space-between;
flex-wrap: nowrap;
padding: 0.1rem 0.2rem;
position: relative;
.title-left {
width: 3.41rem;
height: 0.8rem;
}
.title-center {
width: 9.46rem;
height: 0.69rem;
}
.title-right {
width: 5.04rem;
height: 0.78rem;
}
.sys-title {
position: absolute;
top: 40%;
left: 50%;
transform: translate(-50%, -50%);
font-size: 0.28rem;
color: #ffffff;
font-weight: bold;
z-index: 100;
cursor: pointer;
}
.nowTime {
position: absolute;
top: 0.37rem;
right: 0.6rem;
font-size: 0.18rem;
color: #ffffff;
font-weight: bold;
z-index: 100;
}
.sys-logo {
width: 1.8rem;
height: 0.5rem;
position: absolute;
top: 0.26rem;
left: 0.8rem;
z-index: 10;
}
.monitor-time {
position: absolute;
top: 0.44rem;
left: 4.2rem;
z-index: 10;
font-size: 0.18rem;
color: #ffffff;
font-weight: bold;
}
.icon_warning {
position: absolute;
top: 0.39rem;
right: 4.4rem;
z-index: 10;
width: 0.35rem;
height: 0.32rem;
margin: 0 0.25rem 0 0.27rem;
cursor: pointer;
/* 添加闪烁动画 */
animation: blink 1s infinite;
}
@keyframes blink {
100% {
opacity: 1;
}
50% {
opacity: 0;
}
}
.icon_home {
position: absolute;
top: 0.39rem;
right: 4rem;
z-index: 10;
width: 0.35rem;
height: 0.32rem;
margin: 0 0.2rem 0 0.27rem;
cursor: pointer;
}
.back-icon {
position: absolute;
top: 0.39rem;
right: 3.7rem;
z-index: 10;
width: 0.35rem;
height: 0.32rem;
cursor: pointer;
}
}
}
.app-container {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: stretch;
height: 100%;
padding: 0.3rem 0.2rem 0 0.35rem;
width: 100%;
.left-tree {
width: 256px;
padding: 15px 10px 10px 10px;
border: 1px solid #004b8c;
display: flex;
flex-direction: column;
justify-content: space-between;
.status {
display: flex;
flex-direction: row;
justify-content: space-between;
flex-wrap: wrap;
margin-top: 20px;
.status-li {
width: 50%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
margin-bottom: 15px;
}
.status1,
.status2,
.status3,
.status4 {
display: flex;
flex-direction: row;
align-items: center;
margin-bottom: 5px;
}
.status1::before {
content: "";
width: 10px;
height: 10px;
border-radius: 50%;
background-color: #00d2ff;
margin-right: 5px;
}
.status2::before {
content: "";
width: 10px;
height: 10px;
border-radius: 50%;
background-color: #ff2f2f;
margin-right: 5px;
}
.status3::before {
content: "";
width: 10px;
height: 10px;
border-radius: 50%;
background-color: #ff9908;
margin-right: 5px;
}
.status4::before {
content: "";
width: 10px;
height: 10px;
border-radius: 50%;
background-color: #7398c7;
margin-right: 5px;
}
}
.base-mes {
background-color: #142c4e;
padding: 20px 10px;
font-size: 16px;
border-radius: 6px;
color: #129bd1;
.base-title {
font-family: SourceHanSansCN-Medium;
font-size: 18px;
font-style: italic;
color: #d1d6df;
margin-bottom: 20px;
}
.base-height {
height: 2.6rem;
overflow-y: auto;
.base-li {
margin-bottom: 20px;
.deepColor {
display: inline-block;
margin: 0 10px 0 5px;
color: #20ebfa;
font-weight: bold;
font-size: 18px;
}
}
}
}
}
.right-monitor {
width: calc(100% - 280px);
display: flex;
flex-direction: column;
justify-content: flex-start;
.folw {
width: 100%;
margin-top: -0.2rem;
.changeimage {
width: 100%;
display: flex;
flex-direction: column;
align-items: center;
.flowimg {
width: 12.27rem;
height: 5.6rem;
background-size: 100% 100%;
background-repeat: no-repeat;
position: relative;
.bigMove {
width: 12.27rem;
height: 4.6rem;
position: absolute;
top: 0;
}
.flow-text {
font-size: 0.17rem;
line-height: 0.18rem;
letter-spacing: 0.01rem;
color: #fefefe;
}
.text1 {
position: absolute;
top: 3.15rem;
left: 0.55rem;
z-index: 1;
}
.text2 {
position: absolute;
top: 0.22rem;
left: 5.3rem;
z-index: 1;
}
.text3 {
position: absolute;
top: 0.6rem;
width: 0.4rem;
right: 1.2rem;
line-height: 0.28rem;
z-index: 1;
}
.text4 {
position: absolute;
top: 2.6rem;
right: 0.5rem;
z-index: 1;
}
.text5 {
position: absolute;
top: 4.4rem;
right: 0.2rem;
z-index: 1;
}
.text6 {
position: absolute;
top: 4.3rem;
left: 0.55rem;
z-index: 1;
}
.text7 {
position: absolute;
top: 3.1rem;
left: 5.75rem;
z-index: 1;
}
.text8 {
position: absolute;
top: 0.5rem;
left: 1.4rem;
z-index: 1;
}
.text9 {
position: absolute;
top: 5.4rem;
left: 0.55rem;
z-index: 1;
}
.text10 {
position: absolute;
top: 6.4rem;
left: 0.55rem;
z-index: 1;
}
.replenish {
position: absolute;
top: 0.7rem;
left: 0rem;
width: 2.55rem;
height: 0.34rem;
z-index: 1;
}
.supply {
position: absolute;
top: 1.2rem;
left: 0rem;
width: 12.3rem;
height: 4.9rem;
z-index: 0;
}
.circulate {
position: absolute;
top: 1.5rem;
left: 4.8rem;
width: 3.5rem;
height: 1.2rem;
}
.coolpum {
width: 0.9rem;
height: 0.68rem;
position: absolute;
top: 2.4rem;
left: 0.6rem;
z-index: 2;
}
.waterpum {
width: 0.9rem;
height: 0.68rem;
position: absolute;
top: 3.55rem;
left: 0.6rem;
}
.waterpum2 {
width: 0.9rem;
height: 0.68rem;
position: absolute;
top: 4.65rem;
left: 0.6rem;
}
.waterpum3 {
width: 0.9rem;
height: 0.68rem;
position: absolute;
top: 5.65rem;
left: 0.6rem;
}
.buwaterpum {
width: 8.5rem;
height: 2.9rem;
position: absolute;
top: -0.1rem;
right: -0.02rem;
z-index: 2;
}
.buwaterpum2 {
width: 8.5rem;
height: 4.4rem;
position: absolute;
top: -0.9rem;
right: -0.02rem;
z-index: 2;
}
.cirpum {
width: 1rem;
height: 0.78rem;
position: absolute;
top: 2.15rem;
left: 5.64rem;
}
.hotpum {
width: 2.2rem;
height: 2.2rem;
position: absolute;
top: 1.2rem;
left: 7.9rem;
}
.web {
width: 0.78rem;
height: 1.12rem;
position: absolute;
top: 0.26rem;
right: 0.36rem;
}
.tem1 {
width: 0.6rem;
height: 1.15rem;
position: absolute;
top: 2.25rem;
left: 3.2rem;
z-index: 3;
}
.tem2 {
width: 0.6rem;
height: 1.15rem;
position: absolute;
top: 2.25rem;
left: 4.51rem;
z-index: 3;
}
.temContainer1 {
width: 0.06rem;
height: 0.65rem;
background-color: #02072d;
// background-color: #11aaea;
position: absolute;
top: 2.63rem;
left: 3.46rem;
z-index: 3;
.temprogress {
background-color: #d22727;
width: 100%;
position: absolute;
bottom: 0;
z-index: 3;
}
}
.temContainer2 {
width: 0.06rem;
height: 0.65rem;
background-color: #02072d;
// background-color: #11aaea;
position: absolute;
top: 2.63rem;
left: 4.77rem;
z-index: 3;
.temprogress {
background-color: #d22727;
width: 100%;
position: absolute;
bottom: 0;
z-index: 3;
}
}
.waterBox {
position: absolute;
top: 0.3rem;
left: 2.47rem;
width: 2.86rem;
height: 3.32rem;
z-index: 2;
}
.temdiv1 {
font-size: 0.15rem;
line-height: 0.18rem;
letter-spacing: 0.01rem;
color: #d22727;
position: absolute;
top: 2.15rem;
left: 3.2rem;
z-index: 3;
}
.temdiv2 {
font-size: 0.15rem;
line-height: 0.18rem;
letter-spacing: 0.01rem;
color: #d22727;
position: absolute;
top: 2.15rem;
left: 4.5rem;
z-index: 3;
}
.progressContainer1 {
width: 0.3rem;
height: 1.7rem;
background-color: #dff1fa;
margin-left: 2%;
position: absolute;
top: 1.8rem;
left: 2.8rem;
border: solid 0.01rem #11aaea;
z-index: 3;
.progress {
background-color: #1167db;
width: 100%;
position: absolute;
bottom: 0;
z-index: 3;
}
b {
font-family: AdobeHeitiStd-Regular;
font-size: 0.17rem;
line-height: 0.2rem;
letter-spacing: 0rem;
color: #d22727;
position: absolute;
top: -0.3rem;
z-index: 3;
}
}
.progressContainer2 {
width: 0.3rem;
height: 1.7rem;
background-color: #dff1fa;
margin-left: 2%;
position: absolute;
top: 1.8rem;
left: 2.8rem;
border: solid 0.01rem red;
z-index: 3;
.progress {
background-color: red;
width: 100%;
position: absolute;
bottom: 0;
z-index: 3;
}
b {
font-family: AdobeHeitiStd-Regular;
font-size: 0.17rem;
line-height: 0.2rem;
letter-spacing: 0rem;
color: #d22727;
position: absolute;
top: -0.3rem;
z-index: 3;
}
}
.progressContainer3 {
width: 0.3rem;
height: 1.7rem;
background-color: #dff1fa;
margin-left: 2%;
position: absolute;
top: 1.8rem;
left: 4.2rem;
border: solid 0.01rem #11aaea;
z-index: 3;
.progress {
background-color: #1167db;
width: 100%;
position: absolute;
bottom: 0;
z-index: 3;
}
b {
font-family: AdobeHeitiStd-Regular;
font-size: 0.17rem;
line-height: 0.2rem;
letter-spacing: 0rem;
color: #d22727;
position: absolute;
top: -0.3rem;
z-index: 3;
}
}
.progressContainer4 {
width: 0.3rem;
height: 1.7rem;
background-color: #dff1fa;
margin-left: 2%;
position: absolute;
top: 1.8rem;
left: 4.2rem;
border: solid 0.01rem red;
z-index: 3;
.progress {
background-color: red;
width: 100%;
position: absolute;
bottom: 0;
z-index: 3;
}
b {
font-family: AdobeHeitiStd-Regular;
font-size: 0.17rem;
line-height: 0.2rem;
letter-spacing: 0rem;
color: #d22727;
position: absolute;
top: -0.3rem;
z-index: 3;
}
}
.progressName1 {
font-size: 0.17rem;
font-weight: normal;
font-stretch: normal;
line-height: 0.2rem;
letter-spacing: 0.01rem;
color: #0a3797;
position: absolute;
top: 2rem;
left: 2.6rem;
z-index: 3;
}
.progressName2 {
font-size: 0.17rem;
font-weight: normal;
font-stretch: normal;
line-height: 0.2rem;
letter-spacing: 0.01rem;
color: #0a3797;
position: absolute;
top: 2rem;
left: 4rem;
z-index: 3;
}
.pumname {
font-size: 0.17rem;
font-weight: normal;
font-stretch: normal;
line-height: 0.2rem;
letter-spacing: 0.01rem;
color: #fefefe;
position: absolute;
top: 0.8rem;
left: 8.8rem;
z-index: 1;
}
/* 四个元素时的样式 */
.hotPumPosition-four {
font-size: 0.17rem;
font-weight: normal;
font-stretch: normal;
line-height: 0.2rem;
letter-spacing: 0.01rem;
color: #fefefe;
position: absolute;
top: 0.7rem;
left: 7.8rem;
z-index: 1;
display: flex;
flex-direction: row;
flex-wrap: wrap;
width: 2.3rem !important;
.hotPump-li {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 50% !important;
position: relative;
// margin-bottom: 0.2rem;
.hotPump-img {
width: 1rem;
height: 1rem;
margin: 0.1rem 0;
}
.hotPump-tem1 {
position: absolute;
bottom: 0.2rem;
color: #ee3a7f;
font-size: 0.13rem;
font-weight: bold;
}
.hotPump-tem2 {
position: absolute;
bottom: 0.4rem;
color: #ee3a7f;
font-size: 0.13rem;
font-weight: bold;
}
.tem1 {
width: 0.4rem;
height: 0.7rem;
position: absolute;
top: 0.3rem;
left: 1rem;
z-index: 3;
}
.tem2 {
width: 0.4rem;
height: 0.7rem;
position: absolute;
top: 0.3rem;
left: -0.3rem;
z-index: 3;
}
.temContainer2 {
width: 0.042rem;
height: 0.4rem;
background-color: #02072d;
// background-color: #11aaea;
position: absolute;
top: 0.52rem;
left: -0.12rem;
z-index: 3;
.temprogress {
background-color: #d22727;
width: 100%;
position: absolute;
bottom: 0;
z-index: 3;
}
}
.temdiv2 {
font-size: 0.15rem;
line-height: 0.18rem;
letter-spacing: 0.01rem;
color: #d22727;
position: absolute;
top: 1rem;
left: -0.5rem;
z-index: 3;
}
.temContainer1 {
width: 0.042rem;
height: 0.4rem;
background-color: #02072d;
// background-color: #11aaea;
position: absolute;
top: 0.52rem;
left: 1.18rem;
z-index: 3;
.temprogress {
background-color: #d22727;
width: 100%;
position: absolute;
bottom: 0;
z-index: 3;
}
}
.temdiv1 {
font-size: 0.15rem;
line-height: 0.18rem;
letter-spacing: 0.01rem;
color: #d22727;
position: absolute;
top: 1rem;
left: 1.1rem;
z-index: 3;
}
}
}
/* 两个元素时的样式 */
.hotPumPosition-two {
font-size: 0.17rem;
font-weight: normal;
font-stretch: normal;
line-height: 0.2rem;
letter-spacing: 0.01rem;
color: #fefefe;
position: absolute;
top: 0.7rem;
left: 7.8rem;
z-index: 1;
display: flex;
flex-direction: row;
flex-wrap: wrap;
width: 1.2rem !important;
.hotPump-li {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 100% !important;
position: relative;
// margin-bottom: 0.2rem;
.hotPump-img {
width: 1rem;
height: 1rem;
margin: 0.1rem 0;
}
.hotPump-tem1 {
position: absolute;
bottom: 0.2rem;
color: #ee3a7f;
font-size: 0.13rem;
font-weight: bold;
}
.hotPump-tem2 {
position: absolute;
bottom: 0.4rem;
color: #ee3a7f;
font-size: 0.13rem;
font-weight: bold;
}
.tem2 {
width: 0.4rem;
height: 0.7rem;
position: absolute;
top: 0.3rem;
left: -0.3rem;
z-index: 3;
}
.temContainer2 {
width: 0.042rem;
height: 0.4rem;
background-color: #02072d;
// background-color: #11aaea;
position: absolute;
top: 0.52rem;
left: -0.12rem;
z-index: 3;
.temprogress {
background-color: #d22727;
width: 100%;
position: absolute;
bottom: 0;
z-index: 3;
}
}
.temdiv2 {
font-size: 0.15rem;
line-height: 0.18rem;
letter-spacing: 0.01rem;
color: #d22727;
position: absolute;
top: 1rem;
left: -0.5rem;
z-index: 3;
}
.temContainer1 {
width: 0.042rem;
height: 0.4rem;
background-color: #02072d;
// background-color: #11aaea;
position: absolute;
top: 0.52rem;
left: -0.12rem;
z-index: 3;
.temprogress {
background-color: #d22727;
width: 100%;
position: absolute;
bottom: 0;
z-index: 3;
}
}
.temdiv1 {
font-size: 0.15rem;
line-height: 0.18rem;
letter-spacing: 0.01rem;
color: #d22727;
position: absolute;
top: 1rem;
left: -0.5rem;
z-index: 3;
}
}
}
}
}
.changecontent {
background: #142c4e;
border-radius: 6px;
// height: 250px;
padding: 10px;
overflow: hidden;
margin-top: 100px;
.tablemaeta {
font-family: SourceHanSansCN-Medium;
font-size: 18px;
font-style: italic;
color: #d1d6df;
margin-bottom: 20px;
}
}
}
}
}
.tree-container {
height: 300px; /* 设置固定高度 */
overflow-y: auto; /* 启用垂直滚动条 */
}
// 滚动条
:-webkit-scrollbar {
width: 10px; /* 滚动条宽度 */
}
::-webkit-scrollbar-track {
background: transparent !important; /* 滚动条轨道背景色 */
}
.custom-tree-node {
flex: 1;
display: flex;
align-items: center;
justify-content: space-between;
font-size: 14px;
padding-right: 8px;
.tree-left {
.custom-tree-icon {
margin-right: 5px;
}
}
}
// @media (min-width: 1270px) and (max-width: 1490px) {
// .changeimage {
// transform: scale(0.9);
// }
// }
// @media (min-width: 1120px) and (max-width: 1270px) {
// .changeimage {
// transform: scale(0.8);
// }
// }
// @media (min-width: 990px) and (max-width: 1120px) {
// .changeimage {
// transform: scale(0.7);
// }
// }
// 媒体查询,适配大于2000px分辨率的大屏样式
@media (min-width: 2000px) {
.base-mes {
padding: 0.2rem 0.1rem !important;
font-size: 0.16rem !important;
border-radius: 0.06rem !important;
.base-title {
font-size: 0.18rem !important;
margin-bottom: 0.2rem !important;
}
.base-height {
height: 2.6rem !important;
.base-li {
margin-bottom: 0.2rem !important;
.deepColor {
margin: 0 0.1rem 0 0.05rem !important;
font-size: 0.18rem !important;
}
}
}
}
.changecontent {
border-radius: 0.06rem !important;
// height: 3rem !important;
padding: 0.1rem !important;
margin-top: 1rem !important;
.tablemaeta {
font-size: 0.18rem !important;
margin-bottom: 0.2rem !important;
}
}
}
// 手机端样式
@media (min-width: 0px) and (max-width: 990px) {
.buildingDiv {
padding-left: 0.54rem !important;
margin-bottom: 0.2rem !important;
.title-bg {
width: 2.08rem !important;
height: 0.38rem !important;
}
.title-word {
font-size: 15px !important;
}
}
.app-container .left-tree .base-mes {
padding: 0.2rem 0.1rem !important;
font-size: 14px !important;
border-radius: 0.06rem !important;
}
.app-container .left-tree .base-mes .base-title {
font-size: 15px !important;
}
.app-container .left-tree .base-mes .base-height {
height: 5.7rem !important;
}
.app-container .right-monitor .folw .changecontent .tablemaeta {
font-size: 14px !important;
}
.app-container {
padding: 0rem 0.2rem 0 0.35rem !important;
}
.app-container .left-tree {
width: 200px !important;
min-height: 340px !important;
padding: 0.15rem 0.1rem 0.1rem 0.1rem !important;
}
.app-container .tree-div {
height: 300px !important;
width: 100%;
overflow-x: hidden !important;
}
.app-container .right-monitor {
width: calc(100% - 210px) !important;
.folw {
.changecontent {
border-radius: 0.06rem !important;
padding: 0.1rem !important;
margin-top: 1rem !important;
}
}
}
.custom-tree-node {
font-size: 12px !important;
}
}
</style>
<style scoped>
/* 自定义高亮颜色 */
.left-tree
>>> .el-tree--highlight-current
.el-tree-node.is-current
> .el-tree-node__content {
background-color: #285b9e !important;
/* color: #f56c6c; */
color: #25f1f8;
}
/* 手机端样式 */
@media (min-width: 0px) and (max-width: 990px) {
.left-tree >>> .el-tree-node__content > .el-tree-node__expand-icon {
padding: 3px !important;
}
}
</style>