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

1432 lines
42 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=""
@click="goSys"
/>
<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="monitor-content">
<!-- 整体图 -->
<img
class="monitor-img"
src="../../../assets/images/steamHeating.png"
alt=""
/>
<!-- 箭头 -->
<img class="in-arrow" src="../../../assets/images/in-arrow.png" alt="" />
<img
class="out-arrow"
src="../../../assets/images/out-arrow.png"
alt=""
/>
<!-- 采暖锅炉温度 -->
<div class="performance-div">
<div
class="performance"
v-for="(item, index) in steamHeatingFire"
:key="index"
>
<div class="title">{{ item.deviceName }}</div>
<div class="perdformance-bg">
<div class="weather-li">
<span>出水温度:</span>
<span class="deepColor">{{
getTemperature(item.properties, "出水温度")
}}</span>
<span>℃</span>
</div>
<div class="weather-li">
<span>回水温度:</span>
<span class="deepColor">{{
getTemperature(item.properties, "回水温度")
}}</span>
<span>℃</span>
</div>
<div class="weather-li">
<span>炉水温度:</span>
<span class="deepColor">{{
getTemperature(item.properties, "炉水温度")
}}</span>
<span>℃</span>
</div>
<div class="weather-li">
<span>烟道温度:</span>
<span class="deepColor">{{
getTemperature(item.properties, "烟道温度")
}}</span>
<span>℃</span>
</div>
</div>
</div>
</div>
<!-- 采暖锅炉名称 -->
<div
class="steamHeatingBoiler1"
v-if="steamHeatingFire.length > 0 && steamHeatingFire[0].deviceName"
:title="`${steamHeatingFire[0].deviceName}详情`"
@click="goBoilerDetail(steamHeatingFire[0], false)"
>
{{ steamHeatingFire[0].deviceName }}
</div>
<div
class="steamHeatingBoiler2"
v-if="steamHeatingFire.length > 1 && steamHeatingFire[0].deviceName"
:title="`${steamHeatingFire[1].deviceName}详情`"
@click="goBoilerDetail(steamHeatingFire[1], false)"
>
{{ steamHeatingFire[1].deviceName }}
</div>
<!-- 采暖锅炉点击跳转 -->
<div
class="steamHeatingBoiler-main1"
v-if="steamHeatingFire.length > 0 && steamHeatingFire[0].deviceName"
:title="`${steamHeatingFire[0].deviceName}详情`"
@click="goBoilerDetail(steamHeatingFire[0], false)"
></div>
<div
class="steamHeatingBoiler-main2"
v-if="steamHeatingFire.length > 1 && steamHeatingFire[1].deviceName"
:title="`${steamHeatingFire[1].deviceName}详情`"
@click="goBoilerDetail(steamHeatingFire[1], false)"
></div>
<!-- 采暖锅炉运行状态 -->
<img
class="steamHeatingBoiler-img1"
src="../../../assets/images/fan-img.png"
alt=""
v-if="steamHeatingBoilerRunClass(1)"
:class="{ moveClass2: steamHeatingBoilerRunClass(1) }"
/>
<img
class="steamHeatingBoiler-img2"
src="../../../assets/images/fan-img.png"
alt=""
v-if="steamHeatingBoilerRunClass(2)"
:class="{ moveClass2: steamHeatingBoilerRunClass(2) }"
/>
<!-- 采暖泵名称 -->
<div
class="steamHeatingPump1"
v-if="
steamHeatingHzAndRun.length > 0 && steamHeatingHzAndRun[0].deviceName
"
:title="`${steamHeatingHzAndRun[0].deviceName}详情`"
@click="goPumpDetail(steamHeatingHzAndRun[0], false)"
>
1#
</div>
<div
class="steamHeatingPump2"
v-if="
steamHeatingHzAndRun.length > 1 && steamHeatingHzAndRun[0].deviceName
"
:title="`${steamHeatingHzAndRun[1].deviceName}详情`"
@click="goPumpDetail(steamHeatingHzAndRun[1], false)"
>
2#
</div>
<div
class="steamHeatingPump3"
v-if="
steamHeatingHzAndRun.length > 2 && steamHeatingHzAndRun[0].deviceName
"
:title="`${steamHeatingHzAndRun[2].deviceName}详情`"
@click="goPumpDetail(steamHeatingHzAndRun[2], false)"
>
3#
</div>
<!-- 采暖泵点击跳转 -->
<div
class="steamHeatingPump-main1"
v-if="
steamHeatingHzAndRun.length > 0 && steamHeatingHzAndRun[0].deviceName
"
:title="`${steamHeatingHzAndRun[0].deviceName}详情`"
@click="goPumpDetail(steamHeatingHzAndRun[0], false)"
></div>
<div
class="steamHeatingPump-main2"
v-if="
steamHeatingHzAndRun.length > 1 && steamHeatingHzAndRun[1].deviceName
"
:title="`${steamHeatingHzAndRun[1].deviceName}详情`"
@click="goPumpDetail(steamHeatingHzAndRun[1], false)"
></div>
<div
class="steamHeatingPump-main3"
v-if="
steamHeatingHzAndRun.length > 2 && steamHeatingHzAndRun[2].deviceName
"
:title="`${steamHeatingHzAndRun[2].deviceName}详情`"
@click="goPumpDetail(steamHeatingHzAndRun[2], false)"
></div>
<!-- 采暖泵运行状态 -->
<img
class="steamHeatingPump-img1"
src="../../../assets/images/fan-img.png"
alt=""
v-if="steamHeatingPumpRunClass(1)"
:class="{ moveClass2: steamHeatingPumpRunClass(1) }"
/>
<img
class="steamHeatingPump-img2"
src="../../../assets/images/fan-img.png"
alt=""
v-if="steamHeatingPumpRunClass(2)"
:class="{ moveClass2: steamHeatingPumpRunClass(2) }"
/>
<img
class="steamHeatingPump-img3"
src="../../../assets/images/fan-img.png"
alt=""
v-if="steamHeatingPumpRunClass(3)"
:class="{ moveClass2: steamHeatingPumpRunClass(3) }"
/>
<!-- 采暖泵频率反馈 -->
<div
class="steamHeatingPump-hz1"
v-if="steamHeatingPumpHz(1) && steamHeatingPumpRunClass(1)"
>
{{ steamHeatingPumpHz1 }}Hz
</div>
<div
class="steamHeatingPump-hz2"
v-if="steamHeatingPumpHz(2) && steamHeatingPumpRunClass(2)"
>
{{ steamHeatingPumpHz2 }}Hz
</div>
<div
class="steamHeatingPump-hz3"
v-if="steamHeatingPumpHz(3) && steamHeatingPumpRunClass(3)"
>
{{ steamHeatingPumpHz3 }}Hz
</div>
<!-- 热量计供回水温度 -->
<div class="steamHeatingInTem">{{ steamHeatingInTem }}℃</div>
<div class="steamHeatingOutTem">{{ steamHeatingOutTem }}℃</div>
<!--供暖区进水阀 -->
<div class="hotOut-vavle">
<div class="water-flow-li">
<span
@click="goControlList(hotInletBuild, null, '裙楼供暖进水阀')"
style="cursor: pointer"
>裙楼供暖进水阀:</span
>
<span
class="break"
:class="{ connect: hostAndCoolingControlClass(this.hotInletBuild) }"
></span>
<div class="outInre">
{{ getValueByType(this.hotInletBuild, "13") }}bar
</div>
</div>
<div class="water-flow-li">
<span
@click="goControlList(hotInletGuest, null, '客房供暖进水阀')"
style="cursor: pointer"
>客房供暖进水阀:</span
>
<span
class="break"
:class="{ connect: hostAndCoolingControlClass(this.hotInletGuest) }"
></span>
<div class="outInre">
{{ getValueByType(this.hotInletGuest, "13") }}bar
</div>
</div>
</div>
<line-children
:angle1="-75"
:angle2="0"
:lineWidth1="280"
:lineWidth2="240"
class="hotOut-line"
></line-children>
<!--供暖区出水阀 -->
<div class="hotIn-vavle">
<div class="water-flow-li">
<span
@click="goControlList(hotOutletBuild, null, '裙楼供暖出水阀')"
style="cursor: pointer"
>裙楼供暖出水阀:</span
>
<span
class="break"
:class="{
connect: hostAndCoolingControlClass(this.hotOutletBuild),
}"
></span>
<div class="outInre">
{{ getValueByType(this.hotOutletBuild, "13") }}bar
</div>
</div>
<div class="water-flow-li">
<span
@click="goControlList(hotOutletGuest, null, '客房供暖出水阀')"
style="cursor: pointer"
>客房供暖出水阀:</span
>
<span
class="break"
:class="{
connect: hostAndCoolingControlClass(this.hotOutletGuest),
}"
></span>
<div class="outInre">
{{ getValueByType(this.hotOutletGuest, "13") }}bar
</div>
</div>
</div>
<line-children
:angle1="-75"
:angle2="0"
:lineWidth1="330"
:lineWidth2="240"
class="hotIn-line"
></line-children>
<!-- 采暖监测设备报警信息 -->
<div class="alarm">
<div class="special-div one">
<div class="special-top">
<div class="special-title">
<div class="title-left">
<div>采暖报警信息</div>
</div>
</div>
</div>
<div class="pumpli-monitor">
<div class="pumpli-li">
<div class="pumpli-li-text">报警位置</div>
<div class="pumpli-li-text">报警时间</div>
</div>
<template v-if="alarmList && alarmList.length > 0">
<div
class="pumpli-li"
v-for="(item, index) in alarmList"
:key="index + 3"
>
<div class="pumpli-li-text">{{ item.otherName }}</div>
<div class="pumpli-li-text">{{ item.curTime }}</div>
</div>
</template>
<template v-else><div class="none-data">暂无数据</div></template>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import { runTime } from "@/api/centerairC/sysMonitor";
import LineChildren from "./components/lineChildren.vue";
import { alarmRecordList } from "@/api/alarm/alarmRecord";
import { monitorList } from "@/api/centerairC/sysMonitor";
import { heatPumpAlarmList } from "@/api/boiler/heatingPump";
import { getDay } from "@/utils/datetime";
export default {
name: "boilerMonitorDetails",
components: { LineChildren },
data() {
return {
loading: false,
currentDate: new Date(),
nowTimer: null,
timer: null, // 用于存储定时器 ID
isShowWarning: false, //是否有报警
dayData: "", //监测天数
currentWeekday: "",
// 频率反馈
steamHeatingPumpHz1: "",
steamHeatingPumpHz2: "",
steamHeatingPumpHz3: "",
hotOutletBuild: [], //裙楼供暖出水阀
hotInletBuild: [], //裙楼供暖进水阀
hotOutletGuest: [], //客房供暖出水阀
hotInletGuest: [], //客房供暖进水阀
steamHeatingHzAndRun: [], //运行和频率
steamHeatingFire: [], //热水锅炉火力
steamHeatingTem: [], //热量计供回水温度数组
steamHeatingInTem: "", //回水温度
steamHeatingOutTem: "", //供水温度
// 报警列表
alarmList: [],
};
},
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}`;
},
},
created() {
const weekdays = [
"星期日",
"星期一",
"星期二",
"星期三",
"星期四",
"星期五",
"星期六",
];
const date = new Date();
const dayIndex = date.getDay();
this.currentWeekday = weekdays[dayIndex];
console.log("今天是星期几", this.currentWeekday);
},
mounted() {
this.getAlarnStatus();
this.getDayData();
// 获取当蒸汽采暖数据
this.getSteamHeatingData();
this.getMonitorList();
// 设置定时器,每 10 秒执行一次
this.timer = setInterval(() => {
this.getAlarnStatus();
this.getDayData();
// 获取当蒸汽采暖数据
this.getSteamHeatingData();
this.getMonitorList();
}, 10000);
},
beforeDestroy() {
// 组件销毁前清除定时器
if (this.timer) {
clearInterval(this.timer);
}
// 组件销毁前清除定时器
if (this.nowTimer) {
clearInterval(this.nowTimer);
}
},
methods: {
// 进入系统首页
goSys() {
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.$router.push("/alarm/alarmRecord");
},
// 获取蒸汽锅炉运行监测数据
getSteamHeatingData() {
monitorList({ systemType: 3 }).then((res) => {
if (res.code === 200) {
console.log("设备监测列表返回", res);
// 初始化各个设备列表
this.steamHeatingHzAndRun = []; //频率和运行状态
this.steamHeatingFire = []; //热水锅炉火力
this.steamHeatingTem = []; //热量计供回水温度
res.rows.forEach((row) => {
switch (row.name) {
case "11":
this.steamHeatingHzAndRun = this.processDeviceList(row.values);
console.log(
"裙蒸汽锅炉频率和运行状态",
this.steamHeatingHzAndRun
);
break;
case "25":
this.steamHeatingFire = this.processDeviceList(row.values);
console.log("裙蒸汽锅炉火力", this.steamHeatingFire);
break;
case "6":
this.steamHeatingTem = row.values;
console.log("裙蒸汽锅炉热量计供回水温度", this.steamHeatingTem);
this.steamHeatingTem.forEach((element) => {
if (
element.collectName.includes("回水温度") &&
element.paramType == "12"
) {
this.steamHeatingInTem = element.collectValue;
}
if (
element.collectName.includes("供水温度") &&
element.paramType == "12"
) {
this.steamHeatingOutTem = element.collectValue;
}
});
break;
default:
break;
}
});
}
});
},
getMonitorList() {
monitorList({ systemType: 0 }).then((res) => {
if (res.code === 200) {
console.log("设备监测列表返回", res);
// 初始化各个设备列表
this.hotOutletBuild = []; //裙楼供暖出水阀
this.hotInletBuild = []; //裙楼供暖进水阀
this.hotOutletGuest = []; //客房供暖出水阀
this.hotInletGuest = []; //客房供暖进水阀
res.rows.forEach((row) => {
switch (row.name) {
case "18":
let buildInData = row.values;
buildInData.forEach((item) => {
if (item.deviceName.includes("供暖")) {
this.hotInletBuild.push(item);
}
});
console.log("裙楼供暖进水阀", this.hotInletBuild);
break;
case "19":
let buildOutData = row.values;
buildOutData.forEach((item) => {
if (item.deviceName.includes("供暖")) {
this.hotOutletBuild.push(item);
}
});
console.log("裙楼供暖出水阀", this.hotOutletBuild);
break;
case "20":
let guestInData = row.values;
guestInData.forEach((item) => {
if (item.deviceName.includes("供暖")) {
this.hotInletGuest.push(item);
}
});
console.log("客房供暖进水阀", this.hotInletGuest);
break;
case "21":
let guestOutData = row.values;
guestOutData.forEach((item) => {
if (item.deviceName.includes("供暖")) {
this.hotOutletGuest.push(item);
}
});
console.log("客房供暖出水阀", this.hotOutletGuest);
break;
default:
break;
}
});
this.getHotPumpAlarmList();
}
});
},
// 封装一个通用函数来处理设备列表
processDeviceList(values) {
const deviceList = [];
// 遍历每个设备属性
values.forEach((item) => {
// 提取设备编号
const match = item.deviceName.match(/(\d+)号/);
if (match) {
const deviceNumber = parseInt(match[1]);
// 如果 deviceList 中对应编号的对象还不存在,则创建一个新对象
if (!deviceList[deviceNumber - 1]) {
deviceList[deviceNumber - 1] = {
deviceName: item.deviceName,
properties: [],
};
}
// 将当前属性添加到对应设备的 properties 数组中
deviceList[deviceNumber - 1].properties.push(item);
}
});
// 过滤掉 deviceList 中可能存在的空元素
return deviceList.filter((item) => item);
},
// 裙楼-客房进出水阀启停状态
hostAndCoolingControlClass(item) {
// 检查数组中是否存在 paramType 为 "7" 的对象
const hasParamType7 = item.some((obj) => obj.paramType === "7");
if (!hasParamType7) {
// 如果没有 paramType 为 "7" 的对象
for (let i = 0; i < item.length; i++) {
if (item[i].paramType === "2") {
if (Number(item[i].collectValue) !== 0) {
return true;
}
}
}
} else {
// 如果有 paramType 为 "7" 的对象
for (let i = 0; i < item.length; i++) {
if (item[i].paramType === "7") {
const { collectName, collectValue } = item[i];
if (
(collectName.includes("开到位") && Number(collectValue) === 1) ||
(collectName.includes("关到位") && Number(collectValue) === 0)
) {
return true;
}
}
}
}
return false;
},
// 裙楼、客房的进出水压力
getValueByType(arr, targetType) {
const targetItem = arr.find((item) => item.paramType === targetType);
return targetItem ? targetItem.collectValue : 0;
},
// 采暖泵运行状态
steamHeatingPumpRunClass(index) {
// 从 this.steamHeatingHzAndRun 中查找 deviceName 包含与 index 相同数字的对象
let targetDevice = null;
for (let i = 0; i < this.steamHeatingHzAndRun.length; i++) {
const device = this.steamHeatingHzAndRun[i];
const indexStr = index.toString();
const deviceName = device.deviceName.toString();
for (let j = 0; j < indexStr.length; j++) {
if (deviceName.includes(indexStr[j])) {
targetDevice = device;
break;
}
}
if (targetDevice) {
break;
}
}
// 如果未找到匹配的设备,返回 false
if (!targetDevice) {
return false;
}
// 获取匹配设备的 properties 数组
const properties = targetDevice.properties;
// 检查 properties 数组是否存在
if (!properties || properties.length === 0) {
return false;
}
// 遍历 properties 数组,如果当前对象paramType === 1并且item.collectValue !== "0.00"则便是运行状态中的运行
for (let i = 0; i < properties.length; i++) {
const item = properties[i];
if (item.paramType === "1" && Number(item.collectValue) == !0) {
return true;
}
}
// 否则代表运行状态中的不运行
return false;
},
// 采暖泵频率
steamHeatingPumpHz(index) {
// 从 this.steamHeatingHzAndRun 中查找 deviceName 包含与 index 相同数字的对象
let targetDevice = null;
for (let i = 0; i < this.steamHeatingHzAndRun.length; i++) {
const device = this.steamHeatingHzAndRun[i];
const indexStr = index.toString();
const deviceName = device.deviceName.toString();
for (let j = 0; j < indexStr.length; j++) {
if (deviceName.includes(indexStr[j])) {
targetDevice = device;
break;
}
}
if (targetDevice) {
break;
}
}
// 如果未找到匹配的设备,返回 false
if (!targetDevice) {
return false;
}
// 获取匹配设备的 properties 数组
const properties = targetDevice.properties;
// 检查 properties 数组是否存在
if (!properties || properties.length === 0) {
return false;
}
// 遍历 properties 数组,如果当前对象paramType === 4则有频率反馈
for (let i = 0; i < properties.length; i++) {
const item = properties[i];
if (item.paramType === "4") {
// 动态构造属性名
const propertyName = `steamHeatingPumpHz${index}`;
// 使用方括号语法动态设置属性值
this[propertyName] = item.collectValue;
// this.steamHeatingPumpHz[index] = item.collectValue;
return true;
}
}
// 否则代表运行状态中的不运行
return false;
},
// 采暖锅炉运行状态
steamHeatingBoilerRunClass(index) {
// 从 this.steamHeatingFire 中查找 deviceName 包含与 index 相同数字的对象
let targetDevice = null;
for (let i = 0; i < this.steamHeatingFire.length; i++) {
const device = this.steamHeatingFire[i];
const indexStr = index.toString();
const deviceName = device.deviceName.toString();
for (let j = 0; j < indexStr.length; j++) {
if (deviceName.includes(indexStr[j])) {
targetDevice = device;
break;
}
}
if (targetDevice) {
break;
}
}
// 如果未找到匹配的设备,返回 false
if (!targetDevice) {
return false;
}
// 获取匹配设备的 properties 数组
const properties = targetDevice.properties;
// 检查 properties 数组是否存在
if (!properties || properties.length === 0) {
return false;
}
// console.log("锅炉列表111", properties);
// 遍历 properties 数组,如果当前对象paramType === 45并且item.collectValue !== "0.00"则便是运行状态中的运行
for (let i = 0; i < properties.length; i++) {
const item = properties[i];
if (
item.paramType === "45" &&
item.collectName.includes("火力") &&
Number(item.collectValue) !== 0
) {
return true;
}
}
// 否则代表运行状态中的不运行
return false;
},
// 采暖锅炉温度
getTemperature(values, targetName) {
// console.log("values和targetName", values, targetName);
const targetItem = values.find((item) =>
item.collectName.includes(targetName)
);
// console.log("得到的targetItem", targetItem.collectValue);
return targetItem ? targetItem.collectValue : "";
},
// 采暖锅炉跳转
goBoilerDetail(item, val) {
// console.log("item", item);
// let hostId = item.properties[0].deviceLedgerId;
this.$router.push({
path: "/hotWaterBoilerDetails",
// query: {
// hostId: hostId,
// hostName: item.deviceName,
// isMagnetic: val,
// },
});
},
// 采暖泵跳转
goPumpDetail() {
this.$router.push({
path: "/heatingPumpDetails",
});
},
// 采暖泵报警数据
getHotPumpAlarmList() {
let queryParams = {
systemType: "3",
type: "0",
};
heatPumpAlarmList(queryParams).then((res) => {
if (res.code == 200 && res.rows.length > 0) {
console.log("采暖泵报警数据", res.rows);
this.alarmList = res.rows;
// 上面只是采暖泵报警信息,再处理采暖锅炉报警信息,添加在this.alarmList 最后一行
this.getBoilerAlarmObj(this.alarmList);
} else {
this.alarmList = [];
this.getBoilerAlarmObj(this.alarmList);
}
});
},
// 采暖锅炉报警数据
getBoilerAlarmObj(alarmList) {
this.steamHeatingFire.forEach((item) => {
item.properties.forEach((prop) => {
if (
prop.paramType === "5" &&
prop.collectName.includes("故障报警") &&
Number(prop.collectValue) !== 0
) {
const newAlarmItem = {
otherName: prop.collectName,
curTime: prop.collectTime,
};
alarmList.push(newAlarmItem);
}
});
});
this.alarmList = alarmList;
},
},
};
</script>
<style lang="scss" scoped>
.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.8rem;
}
.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;
}
}
.monitor-content {
width: 100%;
min-height: calc(10.74rem - 1rem);
position: relative;
.monitor-img {
position: absolute;
top: 1rem;
left: calc((100% - 12.4rem) / 2);
// left:1rem;
width: 12.4rem;
height: 7.25rem;
z-index: 1;
}
.in-arrow {
position: absolute;
top: 3.46rem;
right: 6.95rem;
transform: rotate(180deg);
width: 0.3rem;
height: 0.45rem;
z-index: 10;
}
.out-arrow {
position: absolute;
top: 3.35rem;
right: 7.25rem;
width: 0.3rem;
height: 0.45rem;
z-index: 10;
}
.performance-div {
position: absolute;
top: 1.1rem !important;
left: 0.5rem !important;
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: flex-start;
font-size: 0.16rem;
}
.performance {
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: flex-start;
font-size: 0.16rem;
margin-top: 0.55rem;
.perdformance-bg {
width: 2.85rem;
z-index: 10;
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: flex-start;
font-size: 0.2rem;
color: #ffffff;
background-image: url(../../../assets/images/border4.png);
background-size: 100% 100%;
background-repeat: no-repeat;
padding: 0.15rem 0.1rem 0.25rem 0rem;
}
.title {
z-index: 10;
width: 100%;
background-image: url(../../../assets/images/text_img_title.png);
background-repeat: no-repeat;
background-repeat: no-repeat;
background-size: 2rem 0.45rem;
background-position: bottom left;
font-family: SourceHanSansCN-Medium;
font-size: 0.2rem;
font-style: italic;
font-weight: bold;
line-height: 0.6rem;
color: #ffffff;
padding-left: 0.5rem;
margin-bottom: 0.01rem;
margin-left: 0.4rem;
}
.weather {
min-width: 2.85rem;
min-height: 1.6rem;
z-index: 10;
position: absolute;
top: 0.8rem;
left: 0rem;
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: flex-start;
font-size: 0.2rem;
// color: rgb(18, 155, 209);
// color: rgb(147, 204, 236);
color: #ffffff;
background-image: url(../../../assets/images/border1.png);
background-size: 100% 100%;
background-repeat: no-repeat;
padding: 0.15rem 0.1rem 0.25rem 0rem;
}
.weather-li {
width: 100%;
padding: 0.05rem 0 0.05rem 0.3rem;
/* 初始设置上下边框宽度为 1px,颜色和样式可以先设为透明,后续由 border-image 覆盖 */
border-top: 1px solid transparent;
border-bottom: 1px dashed #1a3f8f;
position: relative;
.deepColor {
display: inline-block;
margin: 0 0.1rem 0 0.05rem;
// color: #20ebfa;
// color: #18f13c;
// color: #6cf02f;
color: #6cf02f;
font-weight: bold;
font-family: DIN;
font-size: 0.25rem;
}
}
}
.steamHeatingBoiler1 {
border-bottom: 1px solid rgba(0, 255, 255, 1);
z-index: 10;
font-size: 0.22rem;
font-weight: bold;
color: aqua;
position: absolute;
cursor: pointer;
top: 5rem;
left: 7.5rem;
transform: rotateX(50deg) rotateY(0deg) rotateZ(40deg); /* 分别在 X、Y、Z 轴上旋转 */
transform-origin: bottom center; /* 设置旋转的基点为底部中心 */
text-shadow: 0.02rem 0.02rem 0.04rem rgba(0, 0, 0, 0.9); /* 添加文字阴影增强立体感 */
}
.steamHeatingBoiler2 {
border-bottom: 1px solid rgba(0, 255, 255, 1);
z-index: 10;
font-size: 0.22rem;
font-weight: bold;
color: aqua;
position: absolute;
cursor: pointer;
top: 5.8rem;
left: 9rem;
transform: rotateX(50deg) rotateY(0deg) rotateZ(38deg); /* 分别在 X、Y、Z 轴上旋转 */
transform-origin: bottom center; /* 设置旋转的基点为底部中心 */
text-shadow: 0.02rem 0.02rem 0.04rem rgba(0, 0, 0, 0.9); /* 添加文字阴影增强立体感 */
}
.steamHeatingBoiler-main1 {
z-index: 100;
position: absolute;
top: 4.6rem;
left: 8.6rem;
width: 0.7rem;
height: 0.7rem;
// background-color: #007bff;
cursor: pointer;
opacity: 0.4;
transform-style: preserve-3d;
}
.steamHeatingBoiler-main2 {
z-index: 100;
position: absolute;
top: 5.25rem;
left: 10.2rem;
width: 0.7rem;
height: 0.7rem;
// background-color: #007bff;
cursor: pointer;
opacity: 0.4;
transform-style: preserve-3d;
}
.steamHeatingBoiler-img1 {
z-index: 10;
position: absolute;
top: 4.42rem;
left: 8.95rem;
width: 0.35rem;
height: 0.35rem;
transform-style: preserve-3d;
transform: translateX(-50%) rotateX(60deg) rotateZ(0deg);
}
.steamHeatingBoiler-img2 {
z-index: 10;
position: absolute;
top: 5.12rem;
left: 10.55rem;
width: 0.35rem;
height: 0.35rem;
transform-style: preserve-3d;
transform: translateX(-50%) rotateX(60deg) rotateZ(0deg);
}
.steamHeatingPump1 {
cursor: pointer;
z-index: 10;
font-size: 0.15rem;
font-weight: bold;
color: #46f1e3;
position: absolute;
top: 4.7rem;
left: 9.85rem;
}
.steamHeatingPump2 {
cursor: pointer;
z-index: 10;
font-size: 0.15rem;
font-weight: bold;
color: #46f1e3;
position: absolute;
top: 4.9rem;
left: 10.5rem;
}
.steamHeatingPump3 {
cursor: pointer;
z-index: 10;
font-size: 0.15rem;
font-weight: bold;
color: #46f1e3;
position: absolute;
top: 5.2rem;
left: 11.1rem;
}
.steamHeatingPump-main1 {
z-index: 100;
position: absolute;
top: 4.35rem;
left: 9.77rem;
width: 0.3rem;
height: 0.55rem;
// background-color: #007bff;
cursor: pointer;
opacity: 0.4;
transform-style: preserve-3d;
}
.steamHeatingPump-main2 {
z-index: 100;
position: absolute;
top: 4.6rem;
left: 10.4rem;
width: 0.3rem;
height: 0.55rem;
// background-color: #007bff;
cursor: pointer;
opacity: 0.4;
transform-style: preserve-3d;
}
.steamHeatingPump-main3 {
z-index: 100;
position: absolute;
top: 4.85rem;
left: 11rem;
width: 0.3rem;
height: 0.55rem;
// background-color: #007bff;
cursor: pointer;
opacity: 0.4;
transform-style: preserve-3d;
}
.steamHeatingPump-img1 {
z-index: 10;
position: absolute;
top: 4.23rem;
left: 9.96rem;
width: 0.35rem;
height: 0.35rem;
transform-style: preserve-3d;
transform: translateX(-50%) rotateX(60deg) rotateZ(0deg);
}
.steamHeatingPump-img2 {
z-index: 10;
position: absolute;
top: 4.46rem;
left: 10.59rem;
width: 0.35rem;
height: 0.35rem;
transform-style: preserve-3d;
transform: translateX(-50%) rotateX(60deg) rotateZ(0deg);
}
.steamHeatingPump-img3 {
z-index: 10;
position: absolute;
top: 4.7rem;
left: 11.2rem;
width: 0.35rem;
height: 0.35rem;
transform-style: preserve-3d;
transform: translateX(-50%) rotateX(60deg) rotateZ(0deg);
}
.steamHeatingPump-hz1 {
z-index: 10;
position: absolute;
top: 4.15rem;
left: 9.7rem;
font-size: 0.16rem;
font-weight: bold;
}
.steamHeatingPump-hz2 {
z-index: 10;
position: absolute;
top: 4.4rem;
left: 10.35rem;
font-size: 0.16rem;
font-weight: bold;
}
.steamHeatingPump-hz3 {
z-index: 10;
position: absolute;
top: 4.64rem;
left: 11rem;
font-size: 0.16rem;
font-weight: bold;
}
.steamHeatingInTem {
z-index: 10;
position: absolute;
top: 5.3rem;
right: 6.5rem;
font-size: 0.16rem;
font-weight: bold;
}
.steamHeatingOutTem {
z-index: 10;
position: absolute;
top: 4.9rem;
right: 7.1rem;
font-size: 0.16rem;
font-weight: bold;
}
.hotIn-vavle {
z-index: 10;
position: absolute;
top: 1rem;
right: 4.14rem;
font-size: 0.16rem;
}
.hotIn-line {
z-index: 10;
position: absolute;
top: 3.82rem;
right: 8.3rem;
font-size: 0.16rem;
}
.hotOut-vavle {
z-index: 10;
position: absolute;
top: 2rem;
right: 3rem;
font-size: 0.16rem;
}
.hotOut-line {
z-index: 10;
position: absolute;
top: 4.35rem;
right: 7rem;
font-size: 0.16rem;
}
.outInre {
font-size: 0.16rem;
font-weight: bold;
color: #ffffff;
margin-left: 0.1rem;
}
.water-flow-li {
margin-bottom: 0.04rem;
color: #46f1e3;
display: flex;
flex-direction: row;
align-items: center;
span {
background-color: rgba(0, 255, 255, 0.2);
border-radius: 0.1rem;
padding: 0.01rem 0.03rem;
}
.break {
margin-left: 0.07rem;
display: inline-block;
width: 0.18rem;
height: 0.18rem;
border-radius: 50%;
border: 1px solid #46f1e3;
background-color: transparent !important;
}
.connect {
animation: blink 1s infinite;
background-color: #38fc52 !important;
}
}
.moveClass {
animation: host 2s linear infinite;
}
.moveClass2 {
animation: fan 2s linear infinite;
}
/* 定义 fan 动画关键帧 */
@keyframes fan {
0% {
/* 修改初始旋转角度 */
transform: translateX(-50%) rotateX(60deg) rotateZ(0deg);
}
100% {
/* 修改结束旋转角度 */
transform: translateX(-50%) rotateX(60deg) rotateZ(360deg);
}
}
.startClass {
/* 应用动画 */
animation: blink 1s infinite;
background-color: #38fc52 !important;
}
.alarm {
position: absolute;
top: 6.3rem;
right: 0.5rem;
width: 3.7rem;
.pumpli-monitor {
margin-top: 0.2rem;
display: flex;
flex-direction: column;
width: 100%;
height: 2rem;
overflow-y: auto;
.pumpli-li {
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
padding: 0.1rem 0;
background-color: rgba(0, 71, 125, 0.2);
border-bottom: 1px solid #00264f !important;
.pumpli-li-text {
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
width: 50%;
font-size: 0.14rem !important;
}
}
.none-data {
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
padding: 0.1rem 0;
background-color: rgba(0, 71, 125, 0.2);
border-bottom: 1px solid #00264f !important;
width: 100%;
font-size: 0.14rem !important;
}
.pumpli-li:nth-child(1) {
font-size: 0.13rem !important;
height: 0.4rem !important;
background-color: #00477d !important;
color: #b5dfff !important;
position: sticky;
top: 0;
z-index: 1;
}
}
}
}
}
</style>
<style scoped>
.special-div .special-title {
padding-left: 0.36rem !important;
font-size: 0.2rem !important;
line-height: 0.23rem !important;
background-size: 1.4rem 0.35rem !important;
background-position: 0px -0.03rem !important;
}
.special-div .special-top {
padding: 0.04rem 0.26rem 0.04rem 0px;
min-height: 0.37rem;
}
</style>