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
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>
|
|
|