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

552 lines
16 KiB

<template>
<div class="app-container policy-flex" v-loading="loading">
<div
class="policy"
:class="{ 'radio-style': hasRadioInput(item.values) }"
v-for="(item, index) in policyList"
:key="index"
>
<div class="policy-title">{{ item.name }}</div>
<div
class="policy-li"
v-for="(children, index) in item.values"
:key="index + 1"
>
<template v-if="children.inputType === 'text'">
<div>{{ children.pointName }}:</div>
<div class="right-data">
<el-input
v-if="children.inputType === 'text'"
v-model="children.curValue"
placeholder="请输入"
size="mini"
@keyup.enter.native="handleEnter(children, $event)"
@input="handleInput(children)"
@blur="handleBlur()"
></el-input>
<div class="unit">{{ children.unit }}</div>
</div>
</template>
<template v-if="children.inputType === 'select'">
<div>{{ children.pointName }}:</div>
<div class="right-data">
<el-select
v-model="children.curValue"
placeholder="请选择"
size="mini"
ref="selectRef"
@change="selectThink(children)"
@visible-change="
(visible) => handleVisibleChange(visible, children)
"
>
<el-option
v-for="option in getOptions(children.min, children.max)"
:key="option"
:label="option.toString()"
:value="option"
>
</el-option>
</el-select>
<div class="unit">{{ children.unit }}</div>
</div>
</template>
<template v-if="children.inputType === 'radio'">
<div class="right-data">
<el-radio-group
v-model="children.curValue"
@change="handleRadioChange(children, item)"
>
<el-radio border :label="children.pointName">{{
children.pointName
}}</el-radio>
</el-radio-group>
</div>
</template>
</div>
<div v-if="item.name === '自动模式选择'" class="tips-text">
:请停机状态下选择
</div>
</div>
</div>
</template>
<script>
import { policyListData } from "@/api/centerairC/strategy";
import { operationConrol } from "@/api/hotWater/waterControl";
export default {
name: "deviceStrategy",
data() {
return {
loading: false,
policyList: [],
policyDetails: [],
value: "",
// 用于存储选择前的值
oldValue: null,
};
},
mounted() {
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");
},
// 请求列表
getPolicyList() {
return new Promise((resolve, reject) => {
let data = {
systemType: "0",
funPolicyType: "1",
};
policyListData(data)
.then((res) => {
console.log("策略返回res", res);
if (res.code == 200) {
this.policyList = res.rows;
this.initRadioSelection();
} else {
this.policyList = [];
}
// 成功时解析 Promise
resolve(res);
})
.catch((error) => {
// 失败时拒绝 Promise
reject(error);
});
});
},
// 处理select下拉框显示或隐藏事件
handleVisibleChange(visible, children) {
if (visible) {
// 当下拉框打开时保存原值
this.$set(children, "_oldValue", children.curValue);
}
},
// 处理select的选中值
selectThink(children) {
const oldValue = children._oldValue;
this.$confirm(
`确定要修改"${children.pointName}"的数据为:${children.curValue}吗?`,
"提示",
{
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}
)
.then(() => {
this.hadleOperationConrol(children.cpmId, children.curValue);
})
.catch(() => {
// 用户取消操作,恢复原来的值
children.curValue = oldValue;
});
},
// 当select下拉框显示或隐藏时触发
handleSelectVisibleChange(val, visible) {
if (visible) {
// 下拉框显示时,保存当前的值
this.oldValue = val;
console.log("显示的旧值", this.oldValue);
}
return val;
},
// 处理初始页面时候radio的默认选中值
initRadioSelection() {
this.policyList.forEach((item) => {
item.values.forEach((children) => {
if (children.inputType === "radio") {
if (Number(children.curValue) == 0) {
// console.log("当前项是0", children.curValue);
children.curValue = null; // 设置为 null 确保 radio 不选中
} else {
console.log("当前项是1", children.curValue);
const selectedOption = item.values.find(
(option) => option.curValue === 1
);
// 选中当前的pointName
if (selectedOption) {
children.curValue = selectedOption.pointName;
}
}
}
});
});
},
// 处理输入事件,过滤非数字字符
handleInput(children) {
console.log("校验");
// 实时校验并过滤非数字和非小数点字符
children.curValue = String(children.curValue).replace(/[^\d.]/g, "");
// 确保只有一个小数点
const parts = children.curValue.split(".");
if (parts.length > 2) {
// 如果有多个小数点,只保留第一个小数点及之前的部分和第一个小数点之后的部分
children.curValue = parts[0] + "." + parts[1];
}
// 确保小数点后最多两位
if (parts.length === 2) {
children.curValue = parts[0] + "." + parts[1].slice(0, 2);
}
},
// 失去焦点
handleBlur() {
// this.currentFocusIndex = "";
},
handleEnter(children, event) {
console.log("请求后端", children);
// 失去焦点
event.target.blur();
this.$confirm(
`确定要修改"${children.pointName}"的数据为:${children.curValue} ${children.unit}吗?`,
"提示",
{
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}
)
.then(() => {
this.hadleOperationConrol(children.cpmId, children.curValue);
})
.catch(() => {
// 用户取消操作,需要更新原来的频率
// this.getOperationList();
});
},
handleRadioChange(children, item) {
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, "2");
}
})
.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",
}
)
.then(() => {
console.log("children.curValue", children.curValue);
if (children.curValue) {
this.hadleOperationConrol(children.cpmId, "1");
}
})
.catch(() => {
// 用户取消操作,需要更新原来的数据
children.curValue = "0";
});
}
},
hadleOperationConrol(id, param) {
let data = {
id: id,
param: param,
};
console.log("操作参数", data);
operationConrol([data])
.then((res) => {
if (res.code == 200) {
this.$modal.msgSuccess("指令下发成功!");
// 开启 loading 效果
this.loading = true;
// 更新所有设备状态;
setTimeout(() => {
this.getPolicyList().finally(() => {
// 关闭 loading 效果
this.loading = false;
});
}, 5000);
} else {
// this.$modal.msgError("操作失败");
console.log("应该更新状态的");
// 更新所有设备状态;
this.getPolicyList();
}
})
.catch((error) => {
console.log("请求发生错误,更新设备状态", error);
// 更新所有设备状态;
this.getPolicyList();
});
},
},
};
</script>
<style lang="scss" scoped>
.policy-flex {
margin-top: 15px;
width: 100%;
display: flex;
flex-direction: row;
flex-wrap: wrap;
.policy {
display: flex;
flex-direction: column;
position: relative;
width: calc(33.33% - 40px);
margin: 0 20px;
min-height: 350px;
background-image: url(../../../assets/images/strategy-border.png);
background-size: 100% 100%;
border-bottom: 1px solid #1587cc;
border-left: 1px solid #1587cc;
margin-bottom: 25px;
padding: 70px 60px 20px 40px;
.policy-title {
font-size: 0.18rem;
font-weight: bold;
position: absolute;
top: 18px;
left: 25px;
margin-bottom: 20px;
}
.policy-li {
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
z-index: 0;
font-size: 0.16rem;
color: #94b8ce;
margin-bottom: 10px;
.right-data {
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
flex-wrap: wrap;
// max-width: 2.5rem;
.unit {
width: 25px;
white-space: nowrap;
}
}
.el-input {
width: 80px !important;
margin: 0 15px 0 5px;
}
.el-select {
width: 80px !important;
margin: 0 15px 0 5px;
}
.tips-text {
font-size: 14px;
}
}
}
.radio-style {
display: flex;
flex-direction: row !important;
align-items: flex-start !important;
flex-wrap: wrap;
align-content: flex-start; /* 调整多行元素的对齐方式 */
.policy-li {
margin: 10px;
width: calc(50% - 20px) !important;
}
}
}
@media (min-width: 1560px) and (max-width: 1670px) {
.policy {
padding: 70px 0.3rem 20px 40px !important;
}
}
@media (min-width: 1400px) and (max-width: 1560px) {
.policy {
padding: 70px 0.3rem 20px 40px !important;
width: calc(33.33% - 20px) !important;
margin: 0 10px 25px 10px !important;
}
.policy-li {
font-size: 14px !important;
}
}
@media (min-width: 1340px) and (max-width: 1400px) {
.policy {
padding: 70px 0.3rem 20px 40px !important;
width: calc(33.33% - 20px) !important;
margin: 0 10px 25px 10px !important;
}
.policy-li {
font-size: 14px !important;
}
.radio-style {
padding: 70px 0.3rem 20px 20px !important;
.policy-li {
width: calc(50% - 20px) !important;
}
}
}
@media (min-width: 1025px) and (max-width: 1340px) {
.policy {
width: calc(49% - 20px) !important;
margin: 0 10px 25px 10px !important;
padding: 70px 30px 15px 40px !important;
}
.policy-title {
font-size: 16px !important;
}
.policy-li {
font-size: 14px !important;
}
}
@media (max-width: 1240px) {
.policy {
width: calc(80% - 20px) !important;
margin: 0 10px 25px 10px !important;
padding: 70px 60px 15px 40px !important;
}
.policy-title {
font-size: 16px !important;
left: 40px !important;
}
.policy-li {
font-size: 14px !important;
}
}
// 媒体查询,适配大于2000px分辨率的大屏样式
@media (min-width: 2000px) {
.policy-flex {
margin-top: 0.15rem !important;
}
.policy-flex .policy {
min-height: 3.5rem !important;
margin-bottom: 0.2rem !important;
padding: 0.7rem 0.6rem 0.2rem 0.4rem !important;
}
.policy-flex .policy .policy-title {
font-size: 0.18rem;
top: 0.18rem !important;
left: 0.25rem !important;
margin-bottom: 0.2rem !important;
}
.policy-flex .policy .policy-li {
margin-bottom: 0.1rem !important;
}
.policy-flex .policy .policy-li .el-input {
width: 0.8rem !important;
margin: 0 0.15rem 0 0.05rem !important;
}
.policy-flex .policy .policy-li .right-data .unit {
width: 0.25rem !important;
}
.policy-flex .policy .policy-li .el-select {
width: 0.8rem !important;
margin: 0 0.15rem 0 0.05rem !important;
}
.tips-text {
font-size: 0.14rem !important;
}
.policy-li .el-radio {
margin-bottom: 0.05rem !important;
}
}
</style>
<style scoped>
.policy-li >>> .el-input__inner {
background-color: #04193a;
border: 1px solid #1262db;
color: #3ef0fd;
font-weight: 700;
text-align: center;
padding: 0 0.1rem !important;
}
.policy-li >>> .el-radio {
margin-bottom: 5px;
}
.policy-li >>> .el-radio__label {
color: #3ef0fd;
}
.policy-li >>> .el-radio__inner {
border: 1px solid #042063;
/* background-color: transparent !important; */
}
.policy-li >>> .el-radio.is-bordered {
border: 1px solid #2c6afa;
}
</style>