From e7bef8f799b0cefd5ea1817d578cc868cbfea1f4 Mon Sep 17 00:00:00 2001
From: web <candymxq888@outlook.com>
Date: 星期五, 11 四月 2025 10:48:16 +0800
Subject: [PATCH] fix:修改水温实时监测界面,对接数据

---
 src/views/screen/flow/shebei/index.vue         |    4 
 src/api/facility/point.js                      |    6 
 src/views/screen/temperature/monitor/index.vue |  367 ++++++++++++++++++++++++++--------------------------
 src/views/screen/temperature/shebei/index.vue  |    2 
 src/views/screen/flow/graphic/index.vue        |    2 
 src/router/index.js                            |    2 
 src/views/screen/temperature/graphic/index.vue |    2 
 7 files changed, 194 insertions(+), 191 deletions(-)

diff --git a/src/api/facility/point.js b/src/api/facility/point.js
index f265ba7..db5afd1 100644
--- a/src/api/facility/point.js
+++ b/src/api/facility/point.js
@@ -36,6 +36,12 @@
 				data
 			});
 		},
+		get: (id) => {
+			return publicRequest({
+				url: `/waterMonitoryPoint/get?id=${id}`,
+				method: 'get',
+			});
+		},
 		getParentPoint: () => {
 			return publicRequest({
 				url: 'waterMonitoryPoint/getListTree',
diff --git a/src/router/index.js b/src/router/index.js
index 2a61bcd..0d21012 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -36,7 +36,7 @@
   {
     path: '/',
     hidden: true,
-    redirect: '/user'
+    redirect: '/screen'
   },
   {
     path: '/login',
diff --git a/src/views/screen/flow/graphic/index.vue b/src/views/screen/flow/graphic/index.vue
index 14b3d7d..bb71b1a 100644
--- a/src/views/screen/flow/graphic/index.vue
+++ b/src/views/screen/flow/graphic/index.vue
@@ -215,7 +215,6 @@
         flex-shrink: 0;
         width: 80%;
         height: 100%;
-        background: linear-gradient( 180deg, #91BDDB 0%, rgba(102, 102, 102, 0.5) 100%);
         .monitor-tool{
             width: 100%;
             height: 60px;
@@ -243,6 +242,7 @@
         }
         .monitor-box{
             height: calc(100% - 60px);
+            background: linear-gradient(180deg, #91BDDB 0%, rgba(102, 102, 102, 0.5) 100%);
             .monitor-list{
                 height: 100%;
                 display: flex;
diff --git a/src/views/screen/flow/shebei/index.vue b/src/views/screen/flow/shebei/index.vue
index 1aab8e1..3bd1f87 100644
--- a/src/views/screen/flow/shebei/index.vue
+++ b/src/views/screen/flow/shebei/index.vue
@@ -90,7 +90,7 @@
                     </el-select>
                     <el-input v-model="searchVal" style="width: 20rem" placeholder="请输入设备名称" clearable />
                     <el-button @click="getDataList"><el-icon><Search /></el-icon>搜索</el-button>
-                    <el-button style="margin-left: 0" v-if="userType === '1'" @click="router.push('/facilityList')"><el-icon><Plus /></el-icon>新增</el-button>
+                    <el-button style="margin-left: 0" v-if="userType === '1'" @click="router.push('/monitorList')"><el-icon><Plus /></el-icon>新增</el-button>
                 </div>
                 <div class="tool-r" @click="handleFullScreen">
                     <img src="@/assets/images/flow/fullscreen.png" />
@@ -193,7 +193,6 @@
         flex-shrink: 0;
         width: 80%;
         height: 100%;
-        background: linear-gradient( 180deg, #91BDDB 0%, rgba(102, 102, 102, 0.5) 100%);
         .monitor-tool{
             width: 100%;
             height: 60px;
@@ -222,6 +221,7 @@
         .monitor-box{
             height: calc(100% - 60px);
             padding-top: 10px;
+            background: linear-gradient(180deg, #91BDDB 0%, rgba(102, 102, 102, 0.5) 100%);
             .list{
                 height: 100%;
                 padding: 0 30px;
diff --git a/src/views/screen/temperature/graphic/index.vue b/src/views/screen/temperature/graphic/index.vue
index ef65b59..3fb2e77 100644
--- a/src/views/screen/temperature/graphic/index.vue
+++ b/src/views/screen/temperature/graphic/index.vue
@@ -257,7 +257,6 @@
         flex-shrink: 0;
         width: 80%;
         height: 100%;
-        background: linear-gradient(180deg, #91BDDB 0%, rgba(102, 102, 102, 0.5) 100%);
         .graphic-tool {
             width: 100%;
             height: 60px;
@@ -290,6 +289,7 @@
         .graphic-box{
             height: calc(100% - 60px);
             padding: 10px 30px;
+            background: linear-gradient(180deg, #91BDDB 0%, rgba(102, 102, 102, 0.5) 100%);
             .chartList{
                 height: 100%;
                 display: flex;
diff --git a/src/views/screen/temperature/monitor/index.vue b/src/views/screen/temperature/monitor/index.vue
index 290654a..aed73f9 100644
--- a/src/views/screen/temperature/monitor/index.vue
+++ b/src/views/screen/temperature/monitor/index.vue
@@ -1,35 +1,60 @@
- <script setup>
- import {ref} from "vue";
- import {getUserType} from '@/utils/auth.js'
- import {setTempMonitor } from '@/api/screen/monitor/index.js'
+<script setup>
+import {ref, onMounted} from "vue";
+import {getUserType} from '@/utils/auth.js'
+import {setTempMonitor} from '@/api/screen/monitor/index.js'
+import {getTemperaturePointList} from '@/api/screen/index.js'
+import pointApi from '@/api/facility/point.js'
+import {useRouter} from "vue-router";
+import {ElMessage} from 'element-plus'
 
- const userType = ref(getUserType())
- const monitorRef = ref()
- const searchVal = ref('')
- const selectType = ref(1);
- const typeOption = ref([
-     { label: '水电站流量监测点', value: 1 },
-     { label: '新扎口流量监测点', value: 2 },
- ])
- const setData = reactive({
-     licheng: '',
-     toufang: '',
-     gaocheng: '',
-     shuiwei: '',
-     shuiwen: '',
-     shuiweiji: '',
-     jilu: '',
-     shuju: ''
- })
+const router = useRouter()
 
- const setMonitorData = () => {
+const menuList = ref([])
+const monitorList = ref([])
+const userType = ref(getUserType())
+const monitorRef = ref()
+const searchVal = ref('')
 
- }
+// 选择菜单
+const handleSelectMenu = (id) => {
+    pointApi().get(id).then(res => {
+        monitorList.value = [res.data]
+    })
+}
 
- // 全屏操作
- const handleFullScreen = () => {
-     monitorRef.value.requestFullscreen()
- }
+// 获取水温监控点菜单
+const getTempMonitor = () => {
+    getTemperaturePointList().then(res => {
+        menuList.value = res.data
+    })
+}
+
+// 获取监控点列表
+const getMonitorList = () => {
+    pointApi().search({type: 1, page: 1, limit: 100, keywords: searchVal.value}).then(res => {
+        monitorList.value = res.data.list.filter(el => el.parentId !== 0)
+    })
+}
+
+
+const setMonitorData = (data) => {
+    setTempMonitor(data).then(res => {
+        if (res.code === 200) {
+            ElMessage.success('设置成功')
+            getMonitorList()
+        }
+    })
+}
+
+// 全屏操作
+const handleFullScreen = () => {
+    monitorRef.value.requestFullscreen()
+}
+
+onMounted(() => {
+    getTempMonitor()
+    getMonitorList()
+})
 
 </script>
 
@@ -37,188 +62,120 @@
     <div class="monitor">
         <div class="monitor-menu">
             <div class="menu-t">监测点列表</div>
-            <el-menu class="el-menu">
-                <el-sub-menu index="1">
-                    <template #title>
-                        <span>可移动监测点</span>
+            <el-menu class="el-menu-vertical-demo" @select="handleSelectMenu">
+                <template v-for="(item, index) in menuList" :key="index+1">
+                    <template v-if="item?.childrenList?.length === 0">
+                        <el-menu-item :index="item.id">{{ item.pointName }}</el-menu-item>
                     </template>
-                    <el-menu-item index="1-1">水电站流量监测点</el-menu-item>
-                </el-sub-menu>
-                <el-sub-menu index="2">
-                    <template #title>
-                        <span>固定位监测点</span>
+                    <template v-else>
+                        <el-sub-menu :index="item.id">
+                            <template #title>
+                                <span>{{ item.pointName }}</span>
+                            </template>
+                            <el-menu-item v-for="(child, cidx) in item.childrenList" :key="cidx" :index="child.id">
+                                {{ child.pointName }}
+                            </el-menu-item>
+                        </el-sub-menu>
                     </template>
-                    <el-menu-item index="2-1">新扎口流量监测点</el-menu-item>
-                </el-sub-menu>
+                </template>
             </el-menu>
         </div>
         <div class="monitor-info">
             <div class="monitor-tool">
                 <div class="tool-l">
-                    <div class="name">监测点区域</div>
-                    <el-select
-                        v-model="selectType"
-                        class="tool-select"
-                        placeholder="Select"
-                        style="width: 15rem"
-                    >
-                        <el-option
-                            v-for="item in typeOption"
-                            :key="item.value"
-                            :label="item.label"
-                            :value="item.value"
-                        />
-                    </el-select>
-                    <el-input v-model="searchVal" style="width: 20rem" placeholder="请输入监测点名称" />
-                    <el-button><el-icon><Search /></el-icon>搜索</el-button>
-                    <el-button style="margin-left: 0" v-if="userType === '1'"><el-icon><Plus /></el-icon>新增</el-button>
+                    <el-input v-model="searchVal" style="width: 20rem" placeholder="请输入监测点名称" clearable/>
+                    <el-button @click="getMonitorList">
+                        <el-icon>
+                            <Search/>
+                        </el-icon>
+                        搜索
+                    </el-button>
+                    <el-button style="margin-left: 0" v-if="userType === '1'" @click="router.push('/monitorList')">
+                        <el-icon>
+                            <Plus/>
+                        </el-icon>
+                        新增
+                    </el-button>
                 </div>
                 <div class="tool-r" @click="handleFullScreen">
-                    <img src="@/assets/images/flow/fullscreen.png" />
+                    <img src="@/assets/images/flow/fullscreen.png"/>
                     全屏
                 </div>
             </div>
             <div class="monitor-box" ref="monitorRef">
                 <div class="monitor-list">
-                    <div class="item">
-                        <div class="item-t">电站进水口水温监测点</div>
+                    <div class="item" v-for="(item, index) in monitorList" :key="index">
+                        <div class="item-t">{{ item.pointName }}</div>
                         <div class="item-data">
                             <div class="data">
                                 <div class="name">水温:</div>
-                                <div class="val"><span>2</span>°C</div>
+                                <div class="val"><span>{{ item.waterTemperature }}</span>°C</div>
                             </div>
                             <div class="data">
                                 <div class="name">水位:</div>
-                                <div class="val"><span>2000</span>m</div>
+                                <div class="val"><span>{{ item.waterLevel }}</span>m</div>
                             </div>
                         </div>
                         <div class="item-status">
                             压力式水位水温计工作状况:
-                            <span >设备运作正常</span>
+                            <span v-if="item.isOnline === 1">设备运作正常</span>
+                            <span v-else style="color: red">设备运作异常</span>
                         </div>
                         <div class="item-set">
                             <div class="setbox">
                                 <div class="name">里程设置:</div>
-                                <el-input v-model="setData.licheng" />
+                                <el-input v-model="item.range"/>
                             </div>
                             <div class="setbox">
                                 <div class="name">投放度设置:</div>
-                                <el-input v-model="setData.toufang" />
+                                <el-input v-model="item.putAngle"/>
                             </div>
                             <div class="setbox">
                                 <div class="name">高程设置:</div>
-                                <el-input v-model="setData.gaocheng" />
+                                <el-input v-model="item.elevation"/>
                             </div>
                             <div class="setbox">
-                                <div class="name">水位下限设置:</div>
-                                <el-input v-model="setData.shuiwei" />
+                                <div class="name">水温上限设置:</div>
+                                <el-input v-model="item.tallWaterLevel"/>
                             </div>
                             <div class="setbox">
                                 <div class="name">水温下限设置:</div>
-                                <el-input v-model="setData.shuiwen" />
+                                <el-input v-model="item.lowWaterLevel"/>
                             </div>
                             <div class="setbox">
                                 <div class="name">水位计采集间隔设置:</div>
-                                <el-select v-model="setData.shuiweiji">
-                                    <el-option value="60">60s</el-option>
-                                    <el-option value="120">120s</el-option>
-                                    <el-option value="300">300s</el-option>
-                                    <el-option value="600">600s</el-option>
+                                <el-select v-model="item.gatherIntervalTime">
+                                    <el-option :value="1" label="一分钟"/>
+                                    <el-option :value="2" label="两分钟"/>
+                                    <el-option :value="3" label="五分钟"/>
+                                    <el-option :value="10" label="十分钟"/>
                                 </el-select>
                             </div>
                             <div class="setbox">
                                 <div class="name">记录上报间隔设置:</div>
-                                <el-select v-model="setData.jilu">
-                                    <el-option value="60">60s</el-option>
-                                    <el-option value="120">120s</el-option>
-                                    <el-option value="300">300s</el-option>
-                                    <el-option value="600">600s</el-option>
+                                <el-select v-model="item.historyIntervalTime">
+                                    <el-option :value="1" label="一分钟"/>
+                                    <el-option :value="2" label="两分钟"/>
+                                    <el-option :value="3" label="五分钟"/>
+                                    <el-option :value="10" label="十分钟"/>
                                 </el-select>
                             </div>
                             <div class="setbox">
                                 <div class="name">实时数据上报间隔设置:</div>
-                                <el-select v-model="setData.shuju">
-                                    <el-option value="60">60s</el-option>
-                                    <el-option value="120">120s</el-option>
-                                    <el-option value="300">300s</el-option>
-                                    <el-option value="600">600s</el-option>
+                                <el-select v-model="item.newIntervalTime">
+                                    <el-option :value="1" label="一分钟"/>
+                                    <el-option :value="2" label="两分钟"/>
+                                    <el-option :value="3" label="五分钟"/>
+                                    <el-option :value="10" label="十分钟"/>
                                 </el-select>
                             </div>
                         </div>
-                        <div class="item-btn"><el-button size="large" type="success">批量应用</el-button></div>
-<!--                        <div class="item-error">-->
-<!--                            <img src="@/assets/images/warning.png" />-->
-<!--                        </div>-->
-                    </div>
-                    <div class="item">
-                        <div class="item-t">电站进水口水温监测点</div>
-                        <div class="item-data">
-                            <div class="data">
-                                <div class="name">水温:</div>
-                                <div class="val"><span>2</span>°C</div>
-                            </div>
-                            <div class="data">
-                                <div class="name">水位:</div>
-                                <div class="val"><span>2000</span>m</div>
-                            </div>
+                        <div class="item-btn">
+                            <el-button size="large" type="success" @click="setMonitorData(item)">应用</el-button>
                         </div>
-                        <div class="item-status">
-                            压力式水位水温计工作状况:
-                            <span >设备运作正常</span>
-                        </div>
-                        <div class="item-set">
-                            <div class="setbox">
-                                <div class="name">里程设置:</div>
-                                <el-input v-model="setData.licheng" />
-                            </div>
-                            <div class="setbox">
-                                <div class="name">投放度设置:</div>
-                                <el-input v-model="setData.toufang" />
-                            </div>
-                            <div class="setbox">
-                                <div class="name">高程设置:</div>
-                                <el-input v-model="setData.gaocheng" />
-                            </div>
-                            <div class="setbox">
-                                <div class="name">水位下限设置:</div>
-                                <el-input v-model="setData.shuiwei" />
-                            </div>
-                            <div class="setbox">
-                                <div class="name">水温下限设置:</div>
-                                <el-input v-model="setData.shuiwen" />
-                            </div>
-                            <div class="setbox">
-                                <div class="name">水位计采集间隔设置:</div>
-                                <el-select v-model="setData.shuiweiji">
-                                    <el-option value="60">60s</el-option>
-                                    <el-option value="120">120s</el-option>
-                                    <el-option value="300">300s</el-option>
-                                    <el-option value="600">600s</el-option>
-                                </el-select>
-                            </div>
-                            <div class="setbox">
-                                <div class="name">记录上报间隔设置:</div>
-                                <el-select v-model="setData.jilu">
-                                    <el-option value="60">60s</el-option>
-                                    <el-option value="120">120s</el-option>
-                                    <el-option value="300">300s</el-option>
-                                    <el-option value="600">600s</el-option>
-                                </el-select>
-                            </div>
-                            <div class="setbox">
-                                <div class="name">实时数据上报间隔设置:</div>
-                                <el-select v-model="setData.shuju">
-                                    <el-option value="60">60s</el-option>
-                                    <el-option value="120">120s</el-option>
-                                    <el-option value="300">300s</el-option>
-                                    <el-option value="600">600s</el-option>
-                                </el-select>
-                            </div>
-                        </div>
-                        <div class="item-btn"><el-button size="large" type="success">批量应用</el-button></div>
-                        <div class="item-error">
-                            <img src="@/assets/images/warning.png" />
-                        </div>
+                        <!--                        <div class="item-error">-->
+                        <!--                            <img src="@/assets/images/warning.png" />-->
+                        <!--                        </div>-->
                     </div>
                 </div>
             </div>
@@ -230,6 +187,7 @@
 .monitor {
     height: 100%;
     display: flex;
+
     &-menu {
         flex-shrink: 0;
         width: 20%;
@@ -269,80 +227,102 @@
             }
         }
     }
-    .monitor-info{
+
+    .monitor-info {
         flex-shrink: 0;
         width: 80%;
         height: 100%;
-        background: linear-gradient( 180deg, #91BDDB 0%, rgba(102, 102, 102, 0.5) 100%);
-        .monitor-tool{
+
+        .monitor-tool {
             width: 100%;
             height: 60px;
             padding: 0 30px;
-            background: linear-gradient( 90deg, #91BDDB 0%, #DADFE3 100%);
+            background: linear-gradient(90deg, #91BDDB 0%, #DADFE3 100%);
             display: flex;
             align-items: center;
             justify-content: space-between;
-            .tool-l{
+
+            .tool-l {
                 display: flex;
                 align-items: center;
                 gap: 1rem;
-                .name{
+
+                .name {
                     font-size: 1.1rem;
                 }
             }
-            .tool-r{
+
+            .tool-r {
                 display: flex;
                 align-items: center;
-                img{
+
+                img {
                     width: 25px;
                     margin-right: 10px;
                 }
             }
         }
-        .monitor-box{
+
+        .monitor-box {
+            background: linear-gradient(180deg, #91BDDB 0%, rgba(102, 102, 102, 0.5) 100%);
             height: calc(100% - 60px);
-            .monitor-list{
+            padding: 0 2rem;
+            overflow-y: scroll;
+
+            &::-webkit-scrollbar {
+                display: none;
+            }
+
+            .monitor-list {
                 height: 100%;
                 display: flex;
                 align-items: center;
                 justify-content: space-between;
-                padding: 0 30px;
-                .item{
+                flex-wrap: wrap;
+                gap: 3rem;
+
+                .item {
                     width: 48%;
                     height: 96%;
-                    background: rgba(23,108,229,0.3);
+                    background: rgba(23, 108, 229, 0.3);
                     border: 1px solid #176CE5;
                     padding: 20px;
                     border-radius: 8px;
                     position: relative;
-                    &-error{
+
+                    &-error {
                         position: absolute;
                         left: 0;
                         top: 0;
                         width: 100%;
                         height: 100%;
                         background: rgba(0, 0, 0, 0.3);
-                        img{
+
+                        img {
                             width: 100%;
                         }
                     }
-                    .item-t{
+
+                    .item-t {
                         font-size: 36px;
                         color: #fff;
                         text-align: center;
                     }
-                    .item-data{
+
+                    .item-data {
                         height: 30%;
                         display: flex;
                         align-items: center;
-                        .data{
+
+                        .data {
                             width: 50%;
                             display: flex;
                             align-items: center;
                             color: #fff;
                             font-size: 22px;
-                            .val{
-                                span{
+
+                            .val {
+                                span {
                                     display: inline-block;
                                     font-size: 30px;
                                     padding: 0 30px;
@@ -350,45 +330,62 @@
                             }
                         }
                     }
-                    .item-status{
+
+                    :deep(.el-input__inner) {
+                        color: #fff;
+                    }
+
+                    :deep(.el-select__placeholder) {
+                        color: #fff;
+                    }
+
+                    .item-status {
                         height: 8%;
                         font-size: 22px;
                         color: #fff;
                     }
-                    .item-set{
+
+                    .item-set {
                         display: flex;
                         flex-wrap: wrap;
                         align-content: center;
-                        .setbox{
+
+                        .setbox {
                             width: 50%;
                             margin-top: 40px;
                             padding: 0 10px;
                             display: flex;
                             align-items: center;
-                            .name{
+
+                            .name {
                                 flex-shrink: 0;
                                 color: #fff;
                             }
-                            :deep(.el-input__wrapper){
+
+                            :deep(.el-input__wrapper) {
                                 background-color: transparent;
                                 border-bottom: 1px solid #fff;
                                 box-shadow: none;
                                 border-radius: 0;
                             }
-                            :deep(.el-select__wrapper){
+
+                            :deep(.el-select__wrapper) {
                                 background-color: transparent;
                                 box-shadow: none;
                                 border-radius: 0;
-                                .el-select__placeholder.is-transparent{
+
+                                .el-select__placeholder.is-transparent {
                                     color: #FFF;
                                 }
-                                .el-select__suffix .el-select__caret{
+
+                                .el-select__suffix .el-select__caret {
                                     color: #fff;
                                 }
                             }
                         }
                     }
-                    .item-btn{
+
+                    .item-btn {
                         height: 10%;
                         display: flex;
                         align-items: center;
diff --git a/src/views/screen/temperature/shebei/index.vue b/src/views/screen/temperature/shebei/index.vue
index d6158a2..4a3434f 100644
--- a/src/views/screen/temperature/shebei/index.vue
+++ b/src/views/screen/temperature/shebei/index.vue
@@ -194,7 +194,6 @@
         flex-shrink: 0;
         width: 80%;
         height: 100%;
-        background: linear-gradient( 180deg, #91BDDB 0%, rgba(102, 102, 102, 0.5) 100%);
         .monitor-tool{
             width: 100%;
             height: 60px;
@@ -221,6 +220,7 @@
             }
         }
         .monitor-box{
+            background: linear-gradient( 180deg, #91BDDB 0%, rgba(102, 102, 102, 0.5) 100%);
             height: calc(100% - 60px);
             padding-top: 10px;
             .list{

--
Gitblit v1.9.3