Commit d109cbdd authored by liuzhaoh's avatar liuzhaoh

设备管理联调

parent c80f0375
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>DCTOM</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<script src="https://cdn.tailwindcss.com"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css" rel="stylesheet">
<title>DCTOM</title>
<style type="text/tailwindcss">
@layer utilities {
.content-auto {
content-visibility: auto;
}
.diagonal-pattern {
background-image: repeating-linear-gradient(
45deg,
rgba(6, 241, 14, 0.829),
rgba(6, 241, 14, 0.829) 10px,
rgba(6, 241, 14, 0.829) 15px,
rgba(255, 255, 255, 0.1) 20px
);
background-size: 28px 28px;
}
.diagonal-pattern-animation {
animation: slide 1s linear infinite;
}
@keyframes slide {
0% {
background-position: 0 0;
}
100% {
background-position: 28px 0;
}
}
}
</style>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>
\ No newline at end of file
......@@ -8,7 +8,7 @@
:height="tableHeight"
>
<template v-for="column in columns" :key="column.prop">
<el-table-column v-bind="column">
<el-table-column v-bind="column" :align="align">
<template #default="scope">
<slot
:name="column.prop"
......@@ -90,6 +90,10 @@ const props = defineProps({
type: Number,
default: 300,
},
align: {
type: String,
default: "left",
}
});
const emit = defineEmits([
......
<template>
<!-- 方形进度条 -->
<div class="healthy-progress">
<div
class="h-8 bg-slate-800/60 test rounded overflow-hidden border border-slate-700 healthy-progress-bar"
>
<div
id="square-progress-bar"
class="healthy-progress-bar h-full transition-all duration-500 ease-out bg-gradient-to-r from-secondary to-green-400 diagonal-pattern diagonal-pattern-animation"
></div>
<div class="justify-between items-center mb-2 healthy-text-position">
<span class="font-semibold">健康度</span>
<span id="square-progress-value" class="text-lg font-bold"> 45%</span>
</div>
</div>
<!-- <div class="justify-between items-center mb-2 ">
<span class="font-semibold">健康度</span>
<span id="square-progress-value" class="text-lg font-bold"> 45%</span>
</div> -->
</div>
</template>
<script setup>
import { onMounted } from "vue";
const props = defineProps({
progress: {
type: Number,
default: 100,
},
});
tailwind.config = {
theme: {
extend: {
colors: {
primary: "#3B82F6",
secondary: "#10B981",
accent: "#8B5CF6",
dark: "#1E293B",
light: "#F8FAFC",
},
fontFamily: {
inter: ["Inter", "sans-serif"],
},
},
},
};
const init = () => {
const squareProgressBar = document.getElementById("square-progress-bar");
const squareProgressValue = document.getElementById("square-progress-value");
// updateProgressBars();
squareProgressBar.style.width = `${props.progress}%`;
squareProgressValue.textContent = `${Math.max(0, props.progress)}%`;
};
const updateProgressBars = () => {
// 方形进度条
squareProgressBar.style.width = `${100 - 20}%`;
squareProgressValue.textContent = `${Math.max(0, props.progress)}%`;
};
onMounted(() => {
init();
});
</script>
<style scoped>
.test {
background-color: #fff;
border-color: rgba(6, 241, 14, 0.829);
}
.healthy-text-position {
position: absolute;
z-index: 99;
top: 50%;
left:0;
transform: translateY(-50%);
padding-left: 10px;
}
.healthy-progress {
height: calc(100%);
}
.healthy-progress-bar {
height: calc(100%);
position: relative;
}
</style>
\ No newline at end of file
<template>
<div class="title layout1">
<span>告警:</span>
<span class="warn-title">告警:</span>
<span class="jump-icon">>></span>
</div>
<div class="content">
<div class="item" v-for="item in listInfo" :key="item.id">
{{item.info}}
<img src="@/assets/icons/notice.png" alt="">{{item.info}}
</div>
</div>
</template>
......@@ -20,6 +20,10 @@ const props = defineProps({
<style scoped lang="scss">
.title {
height: 20px;
.warn-title {
font-weight: bold;
color: rgb(217, 10, 10);
}
.jump-icon {
font-weight: bold;
color: #018796;
......@@ -31,14 +35,24 @@ const props = defineProps({
height: calc(15vh - 30px);
padding: 10px 0px 10px 30px;
box-sizing: border-box;
overflow: hidden;
overflow-y: auto;
.item {
width: 100%;
display: flex;
align-items: center;
margin-bottom: 10px;
padding: 4px 0px 4px 2px;
box-shadow: rgba(53,58,62,0.08) 0px 1px 10px 0px,rgba(53,58,62,0.08) 0px 2px 4px 0px;
img {
width: 20px;
height: auto;
}
}
}
.content::-webkit-scrollbar {
width: 2px;
width: 0px;
background-color: rgba(13, 15, 18, 0.1);
}
......
......@@ -36,7 +36,7 @@
</div>
<div class="layout1">
<div class="left-box">
<div class="part1">
<div class="part1 layout3">
<div class="chart-box" v-for="(item, index) in chartData" :key="item">
<div :id="'chart' + index" class="chart-item"></div>
</div>
......@@ -46,12 +46,16 @@
</div>
</div>
<div class="right-box">
<div class="part1"></div>
<div class="part1">
<div class="battery">
<healthyCom></healthyCom>
</div>
</div>
<div class="part2">
<div class="dust-title">2号窑尾除尘器</div>
<div class="dust-info">
<div class="info-item" v-for="item in dustInfo" :key="item.label">
<span class="lable">{{ item.label }}</span>
<span class="label">{{ item.label }}</span>
<span class="value"
>{{ item.value }}<span class="unit">{{ item.unit }}</span
>
......@@ -64,35 +68,35 @@
<div class="indicator-item" id="indicatorTwo"></div>
</div>
<div class="position-info">
<div class="left">
<div class="left" v-if="detailObj.compartHealthList.length > 0">
<div class="part">
<div class="point warn" v-for="item in 6" :key="item"></div>
<div class="point warn" v-for="item in detailObj.compartHealthList[0]" :key="item"></div>
</div>
<div class="part">
<div class="point warn" v-for="item in 6" :key="item"></div>
<div class="point warn" v-for="item in detailObj.compartHealthList[1]" :key="item"></div>
</div>
</div>
<div class="right">
<!-- <div class="right">
<div class="part">
<div class="point warn" v-for="item in 6" :key="item"></div>
</div>
<div class="part">
<div class="point warn" v-for="item in 6" :key="item"></div>
</div>
</div>
</div> -->
</div>
<div class="other-info">
<div>
<span>反吹仓室:</span>
<span>{{ detailObj.bachflushCompart }}</span>
<div class="other-info-item">
<p class="label">反吹仓室:</p>
<p>{{ detailObj.bachflushCompart }}</p>
</div>
<div>
<span>泄露仓室:</span>
<span>{{ detailObj.leakageCompart }}</span>
<div class="other-info-item">
<p class="label">泄露仓室:</p>
<p>{{ detailObj.leakageCompart }}</p>
</div>
<div>
<span>故障仓室:</span>
<span>{{ detailObj.faultCompart }}</span>
<div class="other-info-item">
<p class="label">故障仓室:</p>
<p>{{ detailObj.faultCompart }}</p>
</div>
</div>
</div>
......@@ -110,6 +114,7 @@ import { getDataFun } from "@/request/method.js";
import { useUsersStore } from "@/pinia/user.js";
import moment from "moment";
import warnCom from "./components/warn.vue";
import healthyCom from "./components/healthyProgress.vue";
import { getLineOption2 } from "@/utils/chart";
const userStore = useUsersStore();
const form = reactive({
......@@ -350,6 +355,7 @@ const detailObj = reactive({
bachflushCompart: "",
leakageCompart: "",
faultCompart: "",
compartHealthList: []
});
// 获取除尘器详情
const getDustDetail = () => {
......@@ -382,6 +388,7 @@ const getDustDetail = () => {
(res.data && res.data.bachflushCompart) || "";
detailObj.leakageCompart = (res.data && res.data.leakageCompart) || "";
detailObj.faultCompart = (res.data && res.data.bachflushCompart) || "";
detailObj.compartHealthList = (res.data && res.data.compartHealthList) || [];
})
.catch(() => {
dustInfo.forEach((item) => {
......@@ -402,17 +409,17 @@ const testList = reactive([
id: 3,
info: "测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1",
},
{
id: 4,
info: "测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1",
},
{
id: 5,
info: "测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1",
},
// {
// id: 4,
// info: "测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1",
// },
// {
// id: 5,
// info: "测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1",
// },
]);
const closedLoopInfoList = reactive([]);
const warnInfoList = reactive([]);
const closedLoopInfoList = ref([]);
const warnInfoList = ref([]);
// 获取告警信息
const getAlarmInfo = () => {
if (!form.dusterNo) {
......@@ -427,13 +434,13 @@ const getAlarmInfo = () => {
};
getDataFun(url, params)
.then((res) => {
closedLoopInfoList =
closedLoopInfoList.value =
(res && res.data && res.data.closedLoopInfoList) || [];
warnInfoList = (res && res.data && res.data.warnInfoList) || [];
warnInfoList.value = (res && res.data && res.data.warnInfoList) || [];
})
.catch(() => {
closedLoopInfoList = [];
warnInfoList = [];
closedLoopInfoList.value = [];
warnInfoList.value = [];
});
};
onMounted(() => {
......@@ -463,15 +470,14 @@ watch(
);
</script>
<style lang="scss" scoped>
$borderColor: #bbbdc3;
$borderColor: #bbbdc391;
.dust-box {
width: 100%;
height: calc(100% - 14px);
box-sizing: border-box;
// border-radius: 6px;
// box-shadow: 0px 3px 6px 0px rgba(13, 15, 18, 0.1);
padding: 1rem;
overflow: hidden;
overflow-y: auto;
}
.top-box {
padding-top: 18px;
......@@ -489,7 +495,7 @@ $borderColor: #bbbdc3;
box-shadow: 0px 3px 6px 0px rgba(13, 15, 18, 0.1);
width: 100%;
height: 100%;
height: 67vh;
height: 63vh;
background: #fff;
.chart-box {
width: 100%;
......@@ -506,16 +512,22 @@ $borderColor: #bbbdc3;
.part1 {
width: 100%;
height: 10vh;
height: 6vh;
border-radius: 6px;
border: 1px solid rgba(13, 15, 18, 0.1);
box-shadow: 0px 3px 6px 0px rgba(13, 15, 18, 0.1);
background: #fff;
padding: 10px;
box-sizing: border-box;
.battery {
width: 100%;
height: calc(100%);
}
}
.part2 {
margin-top: 20px;
margin-top: 10px;
width: 100%;
height: calc(57vh - 20px);
height: calc(57vh - 10px);
border-radius: 6px;
border: 1px solid rgba(13, 15, 18, 0.1);
box-shadow: 0px 3px 6px 0px rgba(13, 15, 18, 0.1);
......@@ -551,10 +563,13 @@ $borderColor: #bbbdc3;
background: white;
border-radius: 6px;
height: 35px;
font-size: 20px;
font-size: 14px;
display: flex;
align-items: center;
justify-content: space-between;
.label {
color: #4e5058;
}
}
.indicator-box {
display: flex;
......@@ -573,7 +588,7 @@ $borderColor: #bbbdc3;
.left,
.right {
padding: 5px;
width: 48%;
width: 100%;
flex-wrap: wrap;
// box-shadow: 0 9px 20px 0 rgba(164, 162, 171, 0.842);
box-shadow: color(srgb 0.360784 0.788235 0.654902 / 0.5) 0px 0px 20px
......@@ -607,6 +622,22 @@ $borderColor: #bbbdc3;
.other-info {
padding: 20px;
border-top: 1px solid $borderColor;
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px;
&-item {
padding: 10px;
min-height: 70px;
background: #e7eef5;
border-radius: 6px;
flex: 1;
}
.label {
color: #4e5058;
}
.value {
}
}
}
.part2::-webkit-scrollbar {
......@@ -632,4 +663,10 @@ $borderColor: #bbbdc3;
justify-content: space-between;
flex-direction: column;
}
.layout3 {
display: flex;
align-items: center;
justify-content: space-around;
flex-direction: column;
}
</style>
<template>
<div class="container" v-if="dialogVisible">
<div class="close-box" @click="cancelFun">
<el-icon size="25"><Close /></el-icon>
</div>
<h1 class="title">sensor设置信息</h1>
<div class="grid-container">
......@@ -11,10 +14,14 @@
v-if="item.type === 'input'"
v-model="item.value"
></el-input>
<el-select
v-model="item.value"
v-if="item.type === 'select'"
></el-select>
<el-select v-model="item.value" v-if="item.type === 'select'">
<el-option
v-for="option in item.options"
:key="option.code"
:label="option.name"
:value="option.code"
></el-option>
</el-select>
</div>
</div>
......@@ -37,34 +44,45 @@
<!-- 复选框区域 -->
<div class="checkbox-group">
<label class="custom-checkbox">
<input type="checkbox" /> 在线反吹
<input type="checkbox" v-model="infoObj.onlineBackblow" /> 在线反吹
</label>
<label class="custom-checkbox">
<input type="checkbox" v-model="infoObj.fastBlow" /> 快/慢
</label>
<label class="custom-checkbox">
<input type="checkbox" checked /> 快/慢
<input type="checkbox" v-model="infoObj.d01Alarm" /> DO1报警
</label>
<label class="custom-checkbox">
<input type="checkbox" checked /> DO1报警
<input type="checkbox" v-model="infoObj.d13Alarm" /> DI3有效
</label>
<label class="custom-checkbox"> <input type="checkbox" /> DI3有效 </label>
</div>
<!-- 仓室顺序 -->
<h4>仓室顺序</h4>
<textarea class="text-area" name="" id="">
1,2,3,4,5,6,7,8,9,10,11,12</textarea
>
<h4 style="margin-bottom: 10px">仓室顺序</h4>
<el-input
type="textarea"
:rows="4"
v-model="infoObj.compartSort"
></el-input>
<!-- 复选框区域 -->
<div class="checkbox-group mgr10">
<label class="custom-checkbox">
<input type="checkbox" checked /> DI接入Y/N
<input type="checkbox" v-model="infoObj.diInput" /> DI接入Y/N
</label>
<label class="custom-checkbox">
<input type="checkbox" checked /> 显示预警
<input type="checkbox" v-model="infoObj.showEarlyWarn" /> 显示预警
</label>
<div class="setting-row">
<span class="device-label">关联设备</span>
<el-select v-model="value" placeholder="请选择"></el-select>
<el-select v-model="infoObj.relateDevicesNum" placeholder="请选择">
<el-option
v-for="(item, index) in 21"
:key="item"
:value="index"
:label="index"
></el-option>
</el-select>
</div>
</div>
......@@ -94,133 +112,155 @@
<div class="mask" v-if="dialogVisible" @click="cancelFun"></div>
</template>
<script setup>
import { ref, reactive, computed, defineEmits } from "vue";
import { ref, reactive, computed, defineEmits, onMounted, watch } from "vue";
import { getDataFun } from "@/request/method.js";
const props = defineProps({
dialogVisible: {
type: Boolean,
default: false,
},
infoObjProps: {
type: Object,
default: () => {},
},
});
watch(
() => props.infoObjProps,
(newVal) => {
Object.assign(infoObj, newVal);
},
{ deep: true, inmediate: true }
);
const emit = defineEmits(["close"]);
const infoObj = reactive({
props1: "", // 点位名称
props2: "", // 仓室数量
props3: "", // 地址
props4: "", // 脉冲阀故障阈值
props5: "", // 斜率
props6: "", // 脉冲阀数量
props7: "", // 截距
props8: "", // 反吹间隔时间
props9: "", // 延时时间
props10: "", // 群聚值
props11: "", // 积分时间
props12: "", // 通信口
props13: "", // 泄露阈值
props14: "", // 故障阈值
props15: "", // 谷值判定%
props16: "", // 阀数量
props17: "", // 提升阀故障
props18: "", // 在线反吹
props19: "", // 块/慢
props20: "", // DO1报警
props21: "", // DI3有效
props22: "", // 仓室顺位
props23: "", // DI接入Y/N
props24: "", // 显示预警
props25: "", // 关联设备
props26: "", // 脉冲阀设备Y/N通信IP
props27: "", // 室内卖出轮流喷吹
deviceName: "", // 点位名称
compartNum: "", // 仓室数量
address: "", // 地址
pulseValveFaultThreshold: "", // 脉冲阀故障阈值
slope: "", // 斜率
pulseValveNum: "", // 脉冲阀数量
intercept: "", // 截距
backblowInterval: "", // 反吹间隔时间
baselineThreshold: "", // 基线阈值,
delayTime: "", // 延时时间
clusterValue: "", // 群聚值
integrationTime: "", // 积分时间
communicationPort: "", // 通信口
leakThreshold: "", // 泄露阈值
faultThreshold: "", // 故障阈值
valleyDection: "", // 谷值判定%
valveNum: "", // 阀数量
liftValveFailure: "", // 提升阀故障
onlineBackblow: false, // 在线反吹
fastBlow: true, // 块/慢
d01Alarm: true, // DO1报警
d13Alarm: false, // DI3有效
compartSort: "123", // 仓室顺位
diInput: true, // DI接入Y/N
showEarlyWarn: true, // 显示预警
relateDevicesNum: "", // 关联设备
liftValveCommunicationIp: "", // 脉冲阀设备Y/N通信IP
indoorPulseBlow: "", // 室内卖出轮流喷吹
liftValveDelayTime: "", // 提升阀延迟时间
});
const communicationPortOptions = ref([])
const infoEnum = reactive([
{
label: "点位名称",
value: infoObj.props1,
value: infoObj.deviceName,
type: "input",
},
{
label: "仓室数量",
value: infoObj.props2,
value: infoObj.compartNum,
type: "input",
},
{
label: "地址",
value: infoObj.props3,
value: infoObj.address,
type: "input",
},
{
label: "脉冲阀故障阈值",
value: infoObj.props4,
value: infoObj.pulseValveFaultThreshold,
type: "input",
},
{
label: "斜率",
value: infoObj.slope,
type: "input",
},
{
label: "脉冲数量",
value: infoObj.pulseValveNum,
type: "input",
},
{
label: "截距",
value: infoObj.props5,
value: infoObj.intercept,
type: "input",
},
{
label: "反吹间隔时间",
value: infoObj.props6,
value: infoObj.backblowInterval,
type: "input",
},
{
label: "基线阈值",
value: infoObj.props7,
value: infoObj.baselineThreshold,
type: "input",
},
{
label: "延时时间",
value: infoObj.props8,
value: infoObj.delayTime,
type: "input",
},
{
label: "群聚值",
value: infoObj.props9,
value: infoObj.clusterValue,
type: "input",
},
{
label: "积分时间",
value: infoObj.props10,
value: infoObj.integrationTime,
type: "input",
},
{
label: "通信口",
value: infoObj.props11,
value: infoObj.communicationPort,
type: "select",
options: []
},
{
label: "泄露阈值",
value: infoObj.props12,
type: "input",
},
{
label: "泄露阈值",
value: infoObj.props12,
value: infoObj.leakThreshold,
type: "input",
},
{
label: "故障阈值",
value: infoObj.props13,
value: infoObj.faultThreshold,
type: "input",
},
{
label: "谷值判定(%)",
value: infoObj.props14,
value: infoObj.valleyDection,
type: "input",
},
{
label: "阀数量",
value: infoObj.props15,
value: infoObj.valveNum,
type: "input",
},
{
label: "提升阀故障",
value: infoObj.props16,
value: infoObj.liftValveFailure,
type: "input",
},
{
label: "提升阀延迟时间",
value: infoObj.props17,
value: infoObj.liftValveDelayTime,
type: "input",
},
]);
......@@ -248,6 +288,24 @@ const confirmFun = () => {
const cancelFun = () => {
emit("close", false);
};
// 获取通信口
const getCommunicationPort = () => {
const url = "/queryCommunicationPort";
getDataFun(url, {}).then((res) => {
communicationPortOptions.value = res && res.data || []
for(let i = 0; i < infoEnum.length; i++) {
if (infoEnum[i].label === '通信口') {
infoEnum[i].options = communicationPortOptions.value
break
}
}
}).catch(err => {
communicationPortOptions.value = []
});
};
onMounted(() => {
getCommunicationPort();
});
</script>
<style scoped lang="scss">
* {
......@@ -350,7 +408,7 @@ body {
.device-label {
color: #1e293b;
font-weight: 500;
width: 100px;
width: 120px;
text-align: center;
}
......@@ -464,14 +522,26 @@ input[type="checkbox"] {
background: #3b82f6;
color: white;
}
.btn-confirm:hover {
background: #0e53c2;
}
.btn-cancel {
background: #e2e8f0;
color: #64748b;
}
.btn-cancel:hover {
background: #b2c3da;
}
.highlight {
color: #ef4444;
font-weight: 700;
}
.close-box {
position: absolute;
right: 20px;
cursor: pointer;
}
</style>
\ No newline at end of file
......@@ -96,6 +96,7 @@
:default-page-size="10"
@pagination-change="handlePaginationChange"
:total="total"
align="center"
:pagination-texts="{
total: '共',
sizeChange: '条/页',
......@@ -109,7 +110,7 @@
</template>
<template #operation="{ row }">
<el-button type="primary" link @click="setParams(row)">
<el-button type="text" @click="getParamsConfig(row)">
参数设置
</el-button>
</template>
......@@ -184,7 +185,7 @@ const tableColumns = ref([
{
prop: "signalName",
label: "信号名称",
width: "25%",
width: "15%",
},
{
prop: "signalNo",
......@@ -320,7 +321,9 @@ const onExportFile = () => {
});
};
// 模板下载
const onDownloadTemplate = () => {};
const onDownloadTemplate = () => {
window.open('http://visimg.bmetech.com/stone/img/1748314002767/设备数据.xlsx')
};
// 页面参数改变
const handlePaginationChange = (pagination) => {
currentPage.value = pagination.currentPage;
......@@ -330,10 +333,6 @@ const handlePaginationChange = (pagination) => {
// 当超出限制时,执行的钩子函数
const handleExceed = (files) => {
console.log("上传超出限制");
// upload.value!.clearFiles()
// const file = files[0] as UploadRawFile
// file.uid = genFileId()
// upload.value!.handleStart(file)
};
// 上传失败
const handleError = () => {
......@@ -349,6 +348,7 @@ const handleSuccess = () => {
type: "success",
duration: 5 * 1000,
});
getDeviceContent();
};
const handleProgress = (evt, uploadFile) => {};
const beforeUpload = (file) => {
......@@ -368,6 +368,53 @@ const beforeUpload = (file) => {
return true;
}
};
// 获取参数
const getParamsConfig = (val) => {
const url = "/getSensorConfig";
const params = {
deviceNo: val.deviceNo,
};
getDataFun(url, params).then((res) => {
console.log(res);
res.data = {
id: 7,
customerId: 26,
deviceNo: "cgq_001",
deviceName: "布袋传感器001",
compartNum: 12,
address: "地址",
pulseValveFaultThreshold: "脉冲阀故障阈值",
slope: "斜率",
pulseValveNum: "脉冲阀数量",
intercept: "截距",
backblowInterval: "反吹间隔时间",
baselineThreshold: "基线阈值",
delayTime: "延时时间",
clusterValue: "群聚值",
integrationTime: "积分时间",
communicationPort: "通信口",
leakThreshold: "泄露阈值",
onlineBackblow: true,
fastBlow: true,
faultThreshold: "故障阈值",
d01Alarm: true,
d13Alarm: true,
valleyDection: "谷值判定",
valveNum: "阀数量",
liftValveFailure: "提升阀故障",
compartSort: "仓室顺序",
liftValveDelayTime: "提升阀延迟时间",
diInput: true,
showEarlyWarn: true,
relateDevicesNum: "关联设备",
liftValveCommunicationIp: "脉冲的设备通信ip",
indoorPulseBlow: true,
};
dialogVisible.value = true;
}).catch(err => {
ElMessage.error('获取参数设置失败');
});
};
onMounted(() => {
getDeviceType();
getProcessOptions();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment