Browse Source

1.系统监测:添加冷却塔风机频率、冷冻进出水压力)、进出水温度)、主机的负载数据定位(未有点位数据)

2.系统监测页面区别冷却塔的风机
3.系统控制:列表中手动自动两个位置调换、当自动的时候频率调节输入框禁止输入、设备增加运行时间、冷却塔列表的本地远程状态去掉
4.修复系统一些页面Input设置值enter后再enter的bug错误
5.设备策略:当自动模式选择定时模式的时候,先请求设备定时开关列表是否有定时设置启用,再进行确认操作
6.设备策略需求量、优先级、优先级编号根据返回的min-max值区间选择select(写实现逻辑)
dev
selia-zx 3 weeks ago
parent
commit
3d5560c5c1
  1. 4
      .env.development
  2. 169
      src/views/aircAndWindc/awSysMonitor/index.vue
  3. 4
      src/views/centerairC/delaySwitch/index.vue
  4. 152
      src/views/centerairC/deviceStrategy/index.vue
  5. 17
      src/views/centerairC/sysControl/index.vue
  6. 50
      src/views/centerairC/sysControl/listHeader.vue
  7. 24
      src/views/centerairC/sysControl/vavleheader.vue
  8. 176
      src/views/centerairC/sysMonitor/index.vue
  9. 16
      src/views/centerairC/timeSwitch/index.vue
  10. 258
      src/views/temSys/temMonitor/index.vue

4
.env.development

@ -7,9 +7,9 @@ ENV = 'development'
# 开发环境
# VUE_APP_BASE_API = '/dev-api'
# 后台
# VUE_APP_BASE_API = 'http://192.168.1.222:8080'
VUE_APP_BASE_API = 'http://192.168.1.222:8080'
# 云端
VUE_APP_BASE_API = 'http://106.55.173.225:8090'
# VUE_APP_BASE_API = 'http://106.55.173.225:8090'
# 路由懒加载
VUE_CLI_BABEL_TRANSPILE_MODULES = true

169
src/views/aircAndWindc/awSysMonitor/index.vue

@ -130,29 +130,23 @@
<svg-icon slot="prefix" icon-class="tem_icon" class="tem-icon" />
</el-input>
</div>
<div class="fan-frequency">
<div class="wind-text">风机变频控制</div>
<el-input v-model="frequency" size="mini">
<svg-icon
slot="prefix"
icon-class="percentage-icon"
class="percentage-icon"
/>
</el-input>
</div>
<div class="fan-satatus1">
<div class="fan-satatus3">
<div class="context-li">
<div class="wind-text">风机运行状态</div>
<el-switch
style="display: block"
v-model="runStatus"
active-color="#13ce66"
inactive-color="#ff4949"
active-text="运行"
inactive-text="停止"
>
</el-switch>
<div class="wind-text">风机故障状态:</div>
<div class="goodStautus">正常</div>
<!-- <div class="badStautus">故障</div> -->
</div>
<div class="context-li">
<div class="wind-text">风机运行状态:</div>
<!-- <div class="goodStautus">运行</div> -->
<div class="noneStautus">不运行</div>
</div>
<div class="context-li">
<div class="wind-text">风机压差:</div>
<div class="noneStautus">10v</div>
</div>
</div>
<div class="fan-satatus1">
<div class="context-li">
<div class="wind-text">风机手自动状态</div>
<el-switch
@ -177,18 +171,6 @@
>
</el-switch>
</div>
<div class="context-li">
<div class="wind-text">风机故障状态</div>
<el-switch
style="display: block"
v-model="startStatus"
active-color="#13ce66"
inactive-color="#ff4949"
active-text="未故障"
inactive-text="故障"
>
</el-switch>
</div>
</div>
<div class="fan-satatus2">
<div class="context-li">
@ -223,6 +205,10 @@
</div>
</div>
<div class="wind-valve">
<div class="wind-text">风阀反馈</div>
<div>11%</div>
</div>
<div class="wind-valve2">
<div class="wind-text">风阀调节</div>
<el-input v-model="valvePercent" size="mini">
<svg-icon
@ -312,8 +298,8 @@ export default {
return item.label && item.label.includes("空调风柜");
});
}
// 1 4
const targetLevel = 7;
// 1 5
const targetLevel = 5;
// data[0] 1
if (newRes.data[0]) {
this.removeChildrenAfterLevel(newRes.data[0], 1, targetLevel);
@ -390,16 +376,16 @@ export default {
getIconClass(node) {
// console.log("", node);
if (node.level === 5) {
// 4
// 5
if (node.expanded) {
return "el-icon-document-opened"; //
return "el-icon-document-opened"; // 5
}
return "el-icon-document"; //
return "el-icon-document"; // 5
}
if (node.expanded) {
return "el-icon-folder-opened"; //
return "el-icon-folder-opened"; // 5
}
return "el-icon-folder-add"; //
return "el-icon-folder-add"; // 5
},
handleNodeExpand(node) {
//
@ -575,6 +561,93 @@ export default {
white-space: nowrap;
}
}
.fan-satatus3 {
position: absolute;
top: 1.7rem;
left: 8.5rem;
display: flex;
flex-direction: column;
align-items: flex-start;
.context-li {
z-index: 10;
// width: 2rem;
margin-bottom: 0.1rem;
display: flex;
flex-direction: row;
align-items: center;
}
.wind-text {
color: #00d2ff;
font-size: 0.18rem;
margin-right: 0.15rem;
white-space: nowrap;
}
.goodStautus {
color: rgb(57, 248, 51);
font-size: 0.18rem;
font-weight: bold;
display: flex;
flex-direction: row;
align-items: center;
}
.goodStautus::before {
content: "";
display: inline-block;
width: 0.1rem;
height: 0.1rem;
margin-right: 0.1rem;
border-radius: 50%;
background-color: rgb(57, 248, 51);
}
.badStautus {
color: rgb(248, 48, 41);
font-size: 0.18rem;
font-weight: bold;
display: flex;
flex-direction: row;
align-items: center;
animation: blink 1s infinite;
}
.badStautus::before {
content: "";
display: inline-block;
width: 0.1rem;
height: 0.1rem;
margin-right: 0.1rem;
border-radius: 50%;
background-color: rgb(248, 48, 41);
animation: blink 1s infinite;
}
.noneStautus {
color: rgb(194, 191, 191);
font-size: 0.18rem;
font-weight: bold;
display: flex;
flex-direction: row;
align-items: center;
}
.noneStautus::before {
content: "";
display: inline-block;
width: 0.1rem;
height: 0.1rem;
margin-right: 0.1rem;
border-radius: 50%;
background-color: rgb(194, 191, 191);
}
}
/* 定义灯闪烁的动画 */
@keyframes blink {
0% {
opacity: 1;
}
50% {
opacity: 0.7;
}
100% {
opacity: 1;
}
}
.wind-valve {
z-index: 10;
position: absolute;
@ -591,6 +664,22 @@ export default {
white-space: nowrap;
}
}
.wind-valve2 {
z-index: 10;
position: absolute;
top: 5rem;
left: 3rem;
width: 2rem;
display: flex;
flex-direction: row;
align-items: center;
.wind-text {
color: #00d2ff;
font-size: 0.18rem;
margin-right: 0.1rem;
white-space: nowrap;
}
}
.wind-move {
width: 0.72rem;
height: 0.73rem;

4
src/views/centerairC/delaySwitch/index.vue

@ -158,6 +158,8 @@ export default {
},
//
handleEnter(item, event) {
//
event.target.blur();
console.log("item", item);
console.log("event", event);
this.$confirm(
@ -171,8 +173,6 @@ export default {
)
.then(() => {
this.hadleOperationConrol(item.cpmId, item.curValue);
//
event.target.blur();
this.currentFocusIndex = "";
})
.catch(() => {

152
src/views/centerairC/deviceStrategy/index.vue

@ -20,22 +20,21 @@
v-model="children.curValue"
placeholder="请输入"
size="mini"
@keyup.enter.native="handleEnter(children)"
@keyup.enter.native="handleEnter(children, $event)"
@input="handleInput(children)"
@blur="handleBlur()"
></el-input>
<div v-if="children.inputType === 'radio'">
<el-radio-group
v-model="children.curValue"
@change="handleRadioChange(children, item)"
>
<el-radio
:label="option.pointName"
v-for="option in item.values"
:key="option.id"
>{{ option.pointName }}</el-radio
<template v-if="children.inputType === 'selet'">
<el-select v-model="children.curValue" placeholder="请选择">
<el-option
v-for="option in getOptions(children.min, children.max)"
:key="option"
:label="option.toString()"
:value="option"
>
</el-radio-group>
</div>
</el-option>
</el-select>
</template>
<div class="unit">{{ children.unit }}</div>
</div>
</template>
@ -52,6 +51,7 @@
</div>
</template>
</div>
<div v-if="item.name === '自动模式选择'">:请停机状态下选择</div>
</div>
</div>
</template>
@ -73,6 +73,14 @@ export default {
this.getPolicyList();
},
methods: {
// select
getOptions(min, max) {
const options = [];
for (let i = min; i <= max; i++) {
options.push(i);
}
return options;
},
// radio,policy
hasRadioInput(values) {
return values.some((child) => child.inputType === "radio");
@ -140,8 +148,14 @@ export default {
children.curValue = parts[0] + "." + parts[1].slice(0, 2);
}
},
handleEnter(children) {
//
handleBlur() {
// this.currentFocusIndex = "";
},
handleEnter(children, event) {
console.log("请求后端", children);
//
event.target.blur();
this.$confirm(
`确定要修改"${children.pointName}"的数据为:${children.curValue} ${children.unit}吗?`,
"提示",
@ -160,25 +174,99 @@ export default {
});
},
handleRadioChange(children, item) {
this.$confirm(
`确定要修改"${item.name}"的数据为:${children.curValue} ${children.unit}吗?`,
"提示",
{
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}
)
.then(() => {
console.log("children.curValue", children.curValue);
if (children.curValue) {
this.hadleOperationConrol(children.cpmId, "1");
if (children.curValue === "定时模式") {
// ,
let data = {
systemType: "0",
funPolicyType: "3",
};
policyListData(data)
.then((res) => {
console.log("策略返回res", res);
if (res.code == 200) {
let timeList = res.rows;
// timeList
function checkTimeList() {
for (let i = 0; i < timeList.length; i++) {
let values = timeList[i].values;
for (let j = 0; j < values.length; j++) {
if (
values[j].pointName === "启停标志" &&
values[j].curValue === 1
) {
return true;
}
}
}
return false;
}
//
let result = checkTimeList();
console.log("是否有开启的标志", result);
if (result) {
//
this.$confirm(
`确定要修改"${item.name}"的数据为:${children.curValue} ${children.unit}吗?`,
"提示",
{
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}
)
.then(() => {
console.log("children.curValue", children.curValue);
if (children.curValue) {
this.hadleOperationConrol(children.cpmId, "1");
}
})
.catch(() => {
//
children.curValue = "0";
});
} else {
this.$confirm(
`当前设备定时开关都为停用状态,是否去开启?`,
"提示",
{
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}
)
.then(() => {
//
this.$router.push("/centerairC/strategy/timeSwitch");
})
.catch(() => {
//
children.curValue = "0";
});
}
}
})
.catch((error) => {});
} else {
this.$confirm(
`确定要修改"${item.name}"的数据为:${children.curValue} ${children.unit}吗?`,
"提示",
{
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}
})
.catch(() => {
//
children.curValue = "0";
});
)
.then(() => {
console.log("children.curValue", children.curValue);
if (children.curValue) {
this.hadleOperationConrol(children.cpmId, "1");
}
})
.catch(() => {
//
children.curValue = "0";
});
}
},
hadleOperationConrol(id, param) {
let data = {

17
src/views/centerairC/sysControl/index.vue

@ -30,6 +30,7 @@
:deviceList="hostList"
:isNoShowHz="true"
@operationControl="hadleOperationConrol"
@upList="getOperationList"
></list-header>
</div>
<div class="device-container">
@ -49,7 +50,9 @@
<div class="device-container">
<list-header
:deviceList="coolingTowerFanList"
:isNoShowlocalRemote="true"
@operationControl="hadleOperationConrol"
@upList="getOperationList"
></list-header>
</div>
<div class="device-container">
@ -64,6 +67,7 @@
<list-header
:deviceList="coolingPump"
@operationControl="hadleOperationConrol"
@upList="getOperationList"
></list-header>
</div>
</el-tab-pane>
@ -72,6 +76,7 @@
<list-header
:deviceList="freezingPump"
@operationControl="hadleOperationConrol"
@upList="getOperationList"
></list-header>
</div>
</el-tab-pane>
@ -182,7 +187,7 @@ export default {
!child.name.includes("阀")
) {
deviceItem.automaticText =
Number(child.value) == 0 ? true : false;
Number(child.value) == 0 ? false : true;
deviceItem.automaticId = child.id;
}
//
@ -213,6 +218,13 @@ export default {
else if (child.paramType === "4") {
deviceItem.frequency = child.value;
}
//
else if (
child.paramType === "26" &&
!child.name.includes("阀")
) {
deviceItem.time = child.value;
}
// -
else if (
@ -220,7 +232,7 @@ export default {
child.name.includes("阀")
) {
valveItem.automaticText =
Number(child.value) == 0 ? true : false;
Number(child.value) == 0 ? false : true;
valveItem.automaticId = child.id;
}
// -
@ -232,7 +244,6 @@ export default {
Number(child.value) == 0 ? false : true;
valveItem.controlId = child.id;
}
//
if (
child.name.includes("阀关到位") &&

50
src/views/centerairC/sysControl/listHeader.vue

@ -3,12 +3,13 @@
<div class="device-li">
<div class="device-name">设备名称</div>
<div class="device-name">运行状态</div>
<div class="device-name">手动控制</div>
<div class="device-name">手自动切换</div>
<div class="device-name">本地远程状态</div>
<div class="device-name">手动控制</div>
<div class="device-name" v-if="!isNoShowlocalRemote">本地远程状态</div>
<div class="device-name">故障报警</div>
<div class="device-name" v-if="!isNoShowHz">频率调节</div>
<div class="device-name" v-if="!isNoShowHz">频率反馈</div>
<div class="device-name">运行时间</div>
</div>
<div class="device-li" v-for="(item, index) in deviceList" :key="index">
<div class="device-name">{{ item.name }}</div>
@ -20,28 +21,28 @@
<div class="device-name">
<el-switch
style="display: block"
v-model="item.controlText"
v-model="item.automaticText"
active-color="#13ce66"
inactive-color="#ff4949"
active-text="开启"
inactive-text="停止"
@change="handleControlText(item)"
active-text="手动"
inactive-text="自动"
@change="handleAutomaticText(item)"
>
</el-switch>
</div>
<div class="device-name">
<el-switch
style="display: block"
v-model="item.automaticText"
v-model="item.controlText"
active-color="#13ce66"
inactive-color="#ff4949"
active-text="自动"
inactive-text="手动"
@change="handleAutomaticText(item)"
active-text="开启"
inactive-text="停止"
@change="handleControlText(item)"
>
</el-switch>
</div>
<div class="device-name">
<div class="device-name" v-if="!isNoShowlocalRemote">
<span
:class="
item.localRemote === '远程' ? 'strong-electric' : 'auto-electric'
@ -54,22 +55,27 @@
{{ item.warnText }}
</div>
</div>
<!-- 频率调节 -->
<div class="device-name" v-if="!isNoShowHz">
<el-input
v-if="item.frequencySet !== null && item.frequencySet !== undefined"
v-model="item.frequencySet"
size="mini"
@keyup.enter.native="handleEnter(item)"
@keyup.enter.native="handleEnter(item, $event)"
@input="handleInput(item)"
@blur="handleBlur()"
:disabled="!item.automaticText"
></el-input>
<div class="device-name" v-else></div>
</div>
<!-- 频率反馈 -->
<template v-if="!isNoShowHz">
<div class="device-name" v-if="item.frequency">
{{ item.frequency }}Hz
</div>
<div class="device-name" v-else></div>
</template>
<div class="device-name">{{ item.time }}小时</div>
</div>
</div>
</template>
@ -85,6 +91,10 @@ export default {
type: Boolean,
default: () => false,
},
isNoShowlocalRemote: {
type: Boolean,
default: () => false,
},
},
methods: {
//
@ -93,8 +103,14 @@ export default {
//
item.frequencySet = String(item.frequencySet).replace(/[^\d]/g, "");
},
handleEnter(item) {
//
handleBlur() {
// this.currentFocusIndex = "";
},
handleEnter(item, event) {
console.log("请求后端");
//
event.target.blur();
this.$confirm(
`确定要修改"${item.name}"的频率为:${item.frequencySet} Hz吗?`,
"提示",
@ -110,7 +126,7 @@ export default {
})
.catch(() => {
//
this.getOperationList();
this.$emit("upList");
});
},
//
@ -147,7 +163,7 @@ export default {
handleAutomaticText(item) {
this.$confirm(
`确定要切换设备"${item.name}"的状态为:${
item.automaticText ? "自动" : "手动 吗?"
item.automaticText ? "手动" : "自动 吗?"
}`,
"提示",
{
@ -161,9 +177,9 @@ export default {
console.log("请求后台", item.automaticText);
let param = null;
if (item.automaticText) {
param = 0;
} else {
param = 1;
} else {
param = 0;
}
this.$emit("operationControl", item.automaticId, param);
})

24
src/views/centerairC/sysControl/vavleheader.vue

@ -2,8 +2,8 @@
<div>
<div class="device-li">
<div class="device-name">设备名称</div>
<div class="device-name">手动控制</div>
<div class="device-name">手自动切换</div>
<div class="device-name">手动控制</div>
<div class="device-name">阀开反馈</div>
<div class="device-name">阀关反馈</div>
</div>
@ -12,24 +12,24 @@
<div class="device-name">
<el-switch
style="display: block"
v-model="item.controlText"
v-model="item.automaticText"
active-color="#13ce66"
inactive-color="#ff4949"
active-text="开启"
inactive-text="停止"
@change="handleControlText(item)"
active-text="手动"
inactive-text="自动"
@change="handleAutomaticText(item)"
>
</el-switch>
</div>
<div class="device-name">
<el-switch
style="display: block"
v-model="item.automaticText"
v-model="item.controlText"
active-color="#13ce66"
inactive-color="#ff4949"
active-text="自动"
inactive-text="手动"
@change="handleAutomaticText(item)"
active-text="开启"
inactive-text="停止"
@change="handleControlText(item)"
>
</el-switch>
</div>
@ -93,7 +93,7 @@ export default {
handleAutomaticText(item) {
this.$confirm(
`确定要切换设备"${item.name}"的状态为:${
item.automaticText ? "自动" : "手动 吗?"
item.automaticText ? "手动" : "自动 吗?"
}`,
"提示",
{
@ -107,9 +107,9 @@ export default {
console.log("请求后台", item.automaticText);
let param = null;
if (item.automaticText) {
param = 0;
} else {
param = 1;
} else {
param = 0;
}
// operationControl
this.$emit("operationControl", item.automaticId, param);

176
src/views/centerairC/sysMonitor/index.vue

@ -81,7 +81,7 @@
src="../../../assets/images/haiwang.png"
alt=""
/>
<!-- 主机数据定位 -->
<!-- 主机1数据定位 -->
<div class="hostName1" v-if="hostList.length > 0">
{{ hostList[0].deviceName }}
</div>
@ -96,6 +96,7 @@
alt=""
:class="{ moveClass: hostListRunClass(0) }"
/>
<div class="hostLoad1">11%</div>
<div class="water-flow1">
<div class="water-flow-li">
<span>1#冷却水流:</span>
@ -123,6 +124,7 @@
:lineWidth2="100"
class="host-line1"
></line-children>
<!-- 主机2数据定位 -->
<div class="hostName2" v-if="hostList.length > 0">
{{ hostList[1].deviceName }}
</div>
@ -137,6 +139,7 @@
alt=""
:class="{ moveClass: hostListRunClass(1) }"
/>
<div class="hostLoad2">11%</div>
<div class="water-flow2">
<div class="water-flow-li">
<span>2#冷却水流:</span>
@ -164,7 +167,7 @@
:lineWidth2="300"
class="host-line2"
></line-children>
<!-- 主机名字 -->
<!-- 主机3数据定位 -->
<div class="hostName3" v-if="hostList.length > 0">
{{ hostList[2].deviceName }}
</div>
@ -181,6 +184,8 @@
alt=""
:class="{ moveClass: hostListRunClass(2) }"
/>
<!-- 主机负载 -->
<div class="hostLoad3">11%</div>
<!-- 主机冷却冷冻水流信息 -->
<div class="water-flow3">
<div class="water-flow-li">
@ -210,6 +215,7 @@
:lineWidth2="490"
class="host-line3"
></line-children>
<!-- 冷却泵数据定位 -->
<div class="coolingPump1">1#</div>
<div class="coolingPump2">2#</div>
@ -282,9 +288,16 @@
{{ freezingPumpHz2 }}Hz
</div>
<!-- 冷却塔数据定位 五个风机 三个出水阀 -->
<div class="coolingTower1">3#</div>
<div class="coolingTower2">2#</div>
<div class="coolingTower3">1#</div>
<div class="coolingTower3">3#-1</div>
<div class="coolingTower22">2#-2</div>
<div class="coolingTower21">2#-1</div>
<div class="coolingTower12">1#-2</div>
<div class="coolingTower11">1#-1</div>
<div class="colingTowerHz3">50Hz</div>
<div class="colingTowerHz22">50Hz</div>
<div class="colingTowerHz21">50Hz</div>
<div class="colingTowerHz12">50Hz</div>
<div class="colingTowerHz11">50Hz</div>
<!-- 3号冷却塔风机1 -->
<img
class="fan-img1"
@ -370,6 +383,12 @@
src="../../../assets/images/out-arrow.png"
alt=""
/>
<!-- 冷冻进出水温度 -->
<div class="freezingInTem">20</div>
<div class="freezingOutTem">20</div>
<!-- 冷冻进出水压力 -->
<div class="freezingInPre">20kpa</div>
<div class="freezingOutPre">20kpa</div>
</div>
</div>
</template>
@ -1092,6 +1111,38 @@ export default {
height: 0.6rem;
z-index: 10;
}
.freezingInTem {
z-index: 10;
position: absolute;
top: 4.54rem;
right: 5.4rem;
font-size: 0.14rem;
font-weight: bold;
}
.freezingOutTem {
z-index: 10;
position: absolute;
top: 5.2rem;
right: 3.8rem;
font-size: 0.14rem;
font-weight: bold;
}
.freezingInPre {
z-index: 10;
position: absolute;
top: 5rem;
right: 5.3rem;
font-size: 0.14rem;
font-weight: bold;
}
.freezingOutPre {
z-index: 10;
position: absolute;
top: 5.7rem;
right: 3.7rem;
font-size: 0.14rem;
font-weight: bold;
}
.host-line1 {
position: absolute;
left: -0.96rem;
@ -1190,6 +1241,30 @@ export default {
transform-style: preserve-3d;
transform: translateX(-50%) rotateX(15deg) rotateZ(0deg);
}
.hostLoad1 {
z-index: 10;
position: absolute;
top: 6.2rem;
left: 3rem;
font-size: 0.14rem;
font-weight: bold;
}
.hostLoad2 {
z-index: 10;
position: absolute;
top: 5.42rem;
left: 5rem;
font-size: 0.14rem;
font-weight: bold;
}
.hostLoad3 {
z-index: 10;
position: absolute;
top: 4.52rem;
left: 7.1rem;
font-size: 0.14rem;
font-weight: bold;
}
.water-flow1 {
z-index: 10;
position: absolute;
@ -1436,32 +1511,105 @@ export default {
font-size: 0.14rem;
font-weight: bold;
}
.coolingTower1 {
.coolingTower3 {
z-index: 10;
font-size: 0.18rem;
color: #46f1e3;
position: absolute;
top: 1.8rem;
left: 5.05rem;
font-weight: bold;
transform: rotateX(20deg) rotateY(-25deg) rotateZ(-5deg);
}
.coolingTower22 {
z-index: 10;
font-size: 0.18rem;
color: #46f1e3;
position: absolute;
top: 1.78rem;
left: 5.1rem;
top: 1.5rem;
left: 5.98rem;
font-weight: bold;
transform: rotateX(20deg) rotateY(-25deg) rotateZ(-5deg);
}
.coolingTower2 {
.coolingTower21 {
z-index: 10;
font-size: 0.18rem;
color: #46f1e3;
position: absolute;
top: 1.42rem;
left: 6.3rem;
top: 1.38rem;
left: 6.42rem;
font-weight: bold;
transform: rotateX(20deg) rotateY(-25deg) rotateZ(-5deg);
}
.coolingTower3 {
.coolingTower12 {
z-index: 10;
font-size: 0.18rem;
color: #46f1e3;
position: absolute;
top: 1.07rem;
left: 7.52rem;
top: 1.1rem;
left: 7.3rem;
font-weight: bold;
transform: rotateX(20deg) rotateY(-25deg) rotateZ(-5deg);
}
.coolingTower11 {
z-index: 10;
font-size: 0.18rem;
color: #46f1e3;
position: absolute;
top: 1rem;
left: 7.7rem;
font-weight: bold;
transform: rotateX(20deg) rotateY(-25deg) rotateZ(-5deg);
}
.colingTowerHz11 {
z-index: 10;
font-size: 0.14rem;
color: #ffffff;
position: absolute;
top: -0.1rem;
left: 7.32rem;
font-weight: bold;
transform: rotateX(20deg) rotateY(-25deg) rotateZ(-5deg);
}
.colingTowerHz12 {
z-index: 10;
font-size: 0.14rem;
color: #ffffff;
position: absolute;
top: 0.033rem;
left: 6.8rem;
font-weight: bold;
transform: rotateX(20deg) rotateY(-25deg) rotateZ(-5deg);
}
.colingTowerHz21 {
z-index: 10;
font-size: 0.14rem;
color: #ffffff;
position: absolute;
top: 0.24rem;
left: 6rem;
font-weight: bold;
transform: rotateX(20deg) rotateY(-25deg) rotateZ(-5deg);
}
.colingTowerHz22 {
z-index: 10;
font-size: 0.14rem;
color: #ffffff;
position: absolute;
top: 0.37rem;
left: 5.5rem;
font-weight: bold;
transform: rotateX(20deg) rotateY(-25deg) rotateZ(-5deg);
}
.colingTowerHz3 {
z-index: 10;
font-size: 0.14rem;
color: #ffffff;
position: absolute;
top: 0.64rem;
left: 4.4rem;
font-weight: bold;
transform: rotateX(20deg) rotateY(-25deg) rotateZ(-5deg);
}
/* 定义灯闪烁的动画 */
@keyframes blink {

16
src/views/centerairC/timeSwitch/index.vue

@ -19,14 +19,14 @@
<el-input
size="mini"
v-model="item.delayOpenHour"
@keyup.enter.native="handleEnter(item, 'openHour')"
@keyup.enter.native="handleEnter(item, 'openHour', $event)"
@input="handleInput(item, 'delayOpenHour', 'hour')"
></el-input>
<div class="slip">:</div>
<el-input
size="mini"
v-model="item.delayOpenMinute"
@keyup.enter.native="handleEnter(item, 'openMinute')"
@keyup.enter.native="handleEnter(item, 'openMinute', $event)"
@input="handleInput(item, 'delayOpenMinute', 'minute')"
></el-input>
</div>
@ -34,14 +34,14 @@
<el-input
size="mini"
v-model="item.delayCloseHour"
@keyup.enter.native="handleEnter(item, 'closeHour')"
@keyup.enter.native="handleEnter(item, 'closeHour', $event)"
@input="handleInput(item, 'delayCloseHour', 'hour')"
></el-input>
<div class="slip">:</div>
<el-input
size="mini"
v-model="item.delayCloseMinute"
@keyup.enter.native="handleEnter(item, 'closeMinute')"
@keyup.enter.native="handleEnter(item, 'closeMinute', $event)"
@input="handleInput(item, 'delayCloseMinute', 'minute')"
></el-input>
</div>
@ -51,7 +51,7 @@
active-color="#13ce66"
inactive-color="#ff4949"
active-text="开启"
inactive-text="用"
inactive-text="用"
v-model="item.delayStatus"
@change="handleStatus(item)"
>
@ -190,7 +190,9 @@ export default {
}
item[propertyName] = inputValue;
},
handleEnter(item, name) {
handleEnter(item, name, event) {
//
event.target.blur();
let id = "";
let value = "";
let title = "";
@ -275,7 +277,7 @@ export default {
handleStatus(item) {
this.$confirm(
`确定要切换"${item.name}"的状态为:${
item.delayStatus ? "开启" : "用 吗?"
item.delayStatus ? "开启" : "用 吗?"
}`,
"提示",
{

258
src/views/temSys/temMonitor/index.vue

@ -1,13 +1,263 @@
<template>
<div>温度监测控制</div>
<div class="app-container">
<div class="left-tree">
<!-- el-tree 设置一个固定的高度和滚动条 -->
<div style="height: 7rem; 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>
<div class="right-monitor">111</div>
</div>
</template>
<script>
import { spaceTree } from "@/api/region";
import { temList } from "@/api/temSys/temMonitor";
export default {
data() {
return {
loading: false,
treeData: [],
defaultProps: {
children: "children",
label: "label",
},
deviceList: [],
expandedKeys: [],
currentId: "", //id
currentName: "", //
currentLevel: "", //
currentParentId: "", //id
}
tableData: [], //
};
},
mounted() {
this.getSysBuild();
},
methods: {
getSysBuild() {
spaceTree().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, 1);
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);
this.getTemList();
}
});
}
});
},
// 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"; // 4
}
return "el-icon-document"; // 4
}
if (node.expanded) {
return "el-icon-folder-opened"; // 4
}
return "el-icon-folder-add"; // 4
},
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("第5层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.getTemList();
}
},
getTemList() {
let data = {
systemType: "4",
floorId: this.currentId,
};
temList(data).then((res) => {
console.log("温度返回", res);
if (res.code == 200) {
}
});
},
},
};
</script>
<style>
<style lang="scss" scoped>
.app-container {
display: flex;
flex-direction: row;
justify-content: space-between;
flex-wrap: nowrap;
align-items: stretch;
height: 100%;
.left-tree {
width: 256px;
padding: 15px 10px 10px 10px;
border: 1px solid #004b8c;
}
.right-monitor {
width: calc(100% - 280px);
display: flex;
flex-direction: column;
justify-content: flex-start;
}
}
.tree-container {
height: 300px; /* 设置固定高度 */
overflow-y: auto; /* 启用垂直滚动条 */
}
//
:-webkit-scrollbar {
width: 10px; /* 滚动条宽度 */
}
</style>
::-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;
}
}
}
</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;
}
</style>

Loading…
Cancel
Save