Explorar o código

refactor(components):组件调整
feat(TankNavigationComponent):罐体导航组件

HMY hai 8 meses
pai
achega
9b1248f60e

+ 17 - 0
ui/src/api/hnyz/param.js

@@ -69,4 +69,21 @@ export function getAllSetParam(code) {
     url: '/hnyz/param/getAllSetParam/' + code,
     method: 'get'
   })
+}
+
+//根据设备code查询对应所有设置项寄存器
+export function getAllParamConfigDataByCodeList(codeList) {
+  return request({
+    url: '/hnyz/param/getAllParamConfigDataByCodeList',
+    method: 'post', 
+    data: codeList
+  })
+}
+
+//根据设备code查询对应所有设置项寄存器
+export function getAllParamConfigByCode(code) {
+  return request({
+    url: '/hnyz/param/getAllParamConfigByCode/' + code,
+    method: 'get'
+  })
 }

+ 5 - 5
ui/src/components/GeneralComponents/control/PageNavComponent.vue

@@ -1,7 +1,7 @@
 <!-- src/components/GeneralComponents/control/PageNavComponent.vue -->
 <template>
-    <div class="custom-nav">
-        <div v-for="item in items" :key="item.code" class="nav-item" :class="{ active: item.code === currentCode }"
+    <div class="custom_nav">
+        <div v-for="item in items" :key="item.code" class="nav_item" :class="{ active: item.code === currentCode }"
             @click="goToPage(item)">
             {{ item.label }}
         </div>
@@ -32,12 +32,12 @@ const goToPage = (item) => {
 </script>
 
 <style scoped lang="scss">
-.custom-nav {
+.custom_nav {
     display: flex;
     justify-content: center;
     gap: 16px;
     background: #1f1f1f;
-    padding: 12px 24px;
+    padding: 4px 24px;
     border-radius: 12px;
     width: 100%;
     max-width: 1100px;
@@ -45,7 +45,7 @@ const goToPage = (item) => {
     box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
 }
 
-.nav-item {
+.nav_item {
     padding: 8px 20px;
     border-radius: 20px;
     color: #ccc;

+ 2 - 3
ui/src/components/GeneralComponents/control/PumpControl2Component.vue

@@ -348,7 +348,7 @@ function onSpeedInputBlur() {
     border-radius: 5px;
     padding: 2px 8px;
     min-height: 24px;
-    line-height: 24px;
+    // line-height: 24px;
 }
 
 /* 自定义输入框样式 */
@@ -393,5 +393,4 @@ function onSpeedInputBlur() {
     color: #b8cee5;
     white-space: nowrap;
 }
-</style>
-    
+</style>

+ 106 - 96
ui/src/components/GeneralComponents/control/SensorControl2Component.vue

@@ -1,20 +1,26 @@
 <template>
-    <div class="flows_body_right_tanks">
-        <div class="tank_single">
-            <div class="flow_single_title"> {{ title }} </div>
-            <div class="flow_single_body">
-                <div class="body_show">
-                    实时值:
-                    <div class="body_show_value">
-                        {{ sensorDataArr[0] }}
-                    </div>
-                    <div class="body_show_unit"> {{ unit || '' }}</div>
-                </div>
-                <div class="body_show">
-                    设定值:
-                    <input class="body_show_input" v-model="setValue" @blur="handleSet" @keyup.enter="handleSet" />
-                    <div class="body_show_unit"> {{ unit || '' }}</div>
+    <div class="flow_single">
+        <div class="flow_single_title">
+            {{ title }}
+        </div>
+
+        <!-- 实时值显示区域 -->
+        <div class="value_area">
+            <div class="value_label">实时值</div>
+            <div class="value_content">
+                <div class="value_display">
+                    {{ sensorDataArr[0] || 0 }}
                 </div>
+                <div class="value_unit">{{ unit || '' }}</div>
+            </div>
+        </div>
+
+        <!-- 设定值输入区域 -->
+        <div class="set_value_area">
+            <div class="set_value_label">设定值</div>
+            <div class="set_value_content">
+                <input class="set_value_input" v-model="setValue" @blur="handleSet" @keyup.enter="handleSet" />
+                <div class="set_value_unit">{{ unit || '' }}</div>
             </div>
         </div>
     </div>
@@ -57,100 +63,104 @@ const handleSet = () => {
     const data = {
         protocol: registerData.value.protocolId,                    // MODBUS_TCP 协议
         unitId: registerData.value.unitId,                      // 从站 ID
-        dataType: registerData.value.dataType,                 // 1 表示布尔型
-        // resource: '05',                  // 功能码,05 是写单个线圈
+        dataType: registerData.value.dataType,                 // 数据类型
         offsetOrIndex: registerData.value.address,   // 起始地址
         lengthOrQos: 1,                // 数量
-        data: [setValue.value],                 // 写入的值,例如 [true]
-        ipAddress: registerData.value.ipAddress,    // 你的 Modbus TCP 服务地址
-        port: registerData.value.port                      // 默认端口
+        data: [setValue.value],                 // 写入的值
+        ipAddress: registerData.value.ipAddress,    // Modbus TCP 服务地址
+        port: registerData.value.port                      // 端口
     }
     setValues(data)
 }
 </script>
 
 <style lang="scss" scoped>
-.flows_body_right_tanks {
+.flow_single {
+    min-width: 200px;
     display: flex;
     flex-direction: column;
-    align-items: center;
-    justify-content: center;
+    padding: 6px;
+    margin: 10px;
+    border-radius: 5px;
+    border: 1px solid #72e0ff;
+    background: linear-gradient(to bottom, #0e1a2d, #11243e);
 
-    .tank_single {
+    .flow_single_title {
+        padding: 4px 8px;
+        text-align: center;
+        color: #76e1ff;
+        font-size: 18px;
+        font-weight: bold;
+        border-radius: 0px 0px 5px 5px;
+        background: #192846;
+    }
+
+    .value_area,
+    .set_value_area {
         display: flex;
-        flex-direction: column;
         align-items: center;
-        padding: 6px;
+        margin-top: 12px;
+        padding: 0 4px;
+    }
+
+    .value_label,
+    .set_value_label {
+        font-size: 14px;
+        margin-right: 8px;
+        width: 50px;
+        text-align: center;
+        padding: 5px 0;
+        background: #0e2b60;
         border-radius: 5px;
-        border: 1px solid #58c3f0;
-        background: linear-gradient(to bottom, #0e1a2d, #11243e);
-        box-shadow: 0 4px 12px rgba(0, 123, 255, 0.1);
-        margin: 10px;
-        min-width: 260px;
-
-        .flow_single_title {
-            font-size: 20px;
-            font-weight: 600;
-            color: #76e1ff;
-            padding: 6px 12px;
-            border-radius: 6px;
-            background: rgba(118, 225, 255, 0.1);
-            margin-bottom: 12px;
-            text-align: center;
-        }
-
-        .flow_single_body {
-            display: flex;
-            flex-direction: column;
-            justify-content: center;
-            align-items: center;
-
-            .body_show {
-                display: flex;
-                align-items: center;
-                gap: 8px;
-                font-size: 16px;
-                color: #b8cee5;
-
-                .body_show_value {
-                    font-size: 26px;
-                    font-weight: bold;
-                    color: #3ecfff;
-                    padding: 6px 14px;
-                    border-radius: 6px;
-                    border: 1px solid #3ecfff;
-                    background: #0b1c2f;
-                    min-width: 100px;
-                    min-height: 45px;
-                    text-align: center;
-                }
-
-                .body_show_unit {
-                    width: 25px;
-                    font-size: 16px;
-                    color: #b8cee5;
-                }
-
-                .body_show_input {
-                    font-size: 26px;
-                    font-weight: bold;
-                    color: #3ecfff;
-                    padding: 6px 14px;
-                    border-radius: 6px;
-                    border: 1px solid #3ecfff;
-                    background: #0b1c2f;
-                    min-width: 100px;
-                    min-height: 45px;
-                    text-align: center;
-                    width: 100px;
-                }
-
-                .body_show_input:focus {
-                    outline: none;
-                    border-color: #76e1ff;
-                }
-            }
-        }
+        color: #63c8c7;
+    }
+
+    .value_content,
+    .set_value_content {
+        display: flex;
+        align-items: center;
+        flex: 1;
+        justify-content: center;
+        gap: 8px;
+    }
+
+    .value_display {
+        font-size: 22px;
+        font-weight: bold;
+        color: #3ecfff;
+        padding: 6px 14px;
+        border-radius: 6px;
+        border: 1px solid #3ecfff;
+        background: #0b1c2f;
+        min-width: 100px;
+        text-align: center;
+    }
+
+    .set_value_input {
+        font-size: 22px;
+        font-weight: bold;
+        color: #3ecfff;
+        padding: 6px 14px;
+        border-radius: 6px;
+        border: 1px solid #3ecfff;
+        background: #0b1c2f;
+        min-width: 100px;
+        text-align: center;
+        width: 100px;
+    }
+
+    .set_value_input:focus {
+        outline: none;
+        border-color: #76e1ff;
+        box-shadow: 0 0 5px 1px rgba(118, 225, 255, 0.5);
+    }
+
+    .value_unit,
+    .set_value_unit {
+        font-size: 16px;
+        color: #b8cee5;
+        min-width: 20px;
+        text-align: center;
     }
 }
-</style>
+</style>

+ 250 - 0
ui/src/components/GeneralComponents/control/TankNavigationComponent.vue

@@ -0,0 +1,250 @@
+<template>
+    <div v-if="tanks.length > 0" class="equipment_nav">
+        <div class="nav_title">罐体导航</div>
+
+        <!-- 搜索框 -->
+        <div class="nav_search">
+            <input type="text" v-model="searchKeyword" placeholder="搜索罐体..." @input="handleSearch">
+            <i class="search_icon">🔍</i>
+        </div>
+
+        <ul class="nav_list">
+            <li v-for="(tank, index) in filteredTanks" :key="tank.uniqueId" :class="{ active: currentIndex === index }"
+                @click="handleTankClick(tank, index)">
+                <span class="nav_item_text">{{ tank.shortName }}</span>
+            </li>
+
+            <!-- 搜索无结果提示 -->
+            <li v-if="filteredTanks.length === 0 && searchKeyword" class="no_results">
+                没有找到匹配的罐体
+            </li>
+        </ul>
+    </div>
+</template>
+
+<script setup>
+import { ref, watch } from 'vue';
+
+// 接收父组件传入的参数
+const props = defineProps({
+    // 所有罐体数据
+    tanks: {
+        type: Array,
+        required: true,
+        default: () => []
+    },
+    // 当前激活的索引
+    currentIndex: {
+        type: Number,
+        default: -1
+    },
+    // 固定头部的高度,用于计算滚动位置
+    headerHeight: {
+        type: Number,
+        default: 0
+    }
+});
+
+// 子组件向父组件传递事件
+const emit = defineEmits(['tankClick', 'scrollPositionChange']);
+
+// 搜索关键词
+const searchKeyword = ref('');
+// 过滤后的罐体列表
+const filteredTanks = ref([...props.tanks]);
+
+// 监听tanks变化,更新过滤列表
+watch(() => props.tanks, (newVal) => {
+    filteredTanks.value = [...newVal];
+    // 清空搜索关键词
+    searchKeyword.value = '';
+});
+
+// 处理搜索
+const handleSearch = () => {
+    if (!searchKeyword.value.trim()) {
+        filteredTanks.value = [...props.tanks];
+        return;
+    }
+
+    const keyword = searchKeyword.value.trim().toLowerCase();
+    filteredTanks.value = props.tanks.filter(tank =>
+        tank.tankName.toLowerCase().includes(keyword)
+    );
+};
+
+// 处理罐体点击
+const handleTankClick = (tank, index) => {
+    emit('tankClick', tank, index);
+};
+
+// 监听滚动,判断当前可见的罐体
+const handleScroll = () => {
+    if (props.tanks.length === 0) return;
+
+    const scrollPosition = window.scrollY + props.headerHeight + 20;
+
+    // 从后往前检查,找到当前可见的罐体
+    for (let i = props.tanks.length - 1; i >= 0; i--) {
+        const tank = props.tanks[i];
+        const elementId = `tank-${tank.tankName}`;
+
+        const element = document.getElementById(elementId);
+        if (element && element.offsetTop <= scrollPosition) {
+            // 找到在过滤列表中的索引
+            const filteredIndex = filteredTanks.value.findIndex(
+                item => item.uniqueId === tank.uniqueId
+            );
+            emit('scrollPositionChange', filteredIndex);
+            break;
+        }
+    }
+};
+
+// 监听滚动事件
+window.addEventListener('scroll', handleScroll);
+
+// 组件卸载时移除事件监听
+onBeforeUnmount(() => {
+    window.removeEventListener('scroll', handleScroll);
+});
+</script>
+
+<style scoped lang="scss">
+.equipment_nav {
+    width: 240px;
+    flex-shrink: 0;
+    position: sticky;
+    top: 160px;
+    /* 调整顶部距离,考虑固定header的高度 */
+    max-height: calc(100vh - 240px);
+    overflow-y: auto;
+    background-color: rgba(26, 26, 26, 0.8);
+    backdrop-filter: blur(4px);
+    border-radius: 8px;
+    border: 1px solid rgba(114, 224, 255, 0.3);
+    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
+}
+
+.nav_title {
+    padding: 10px 15px;
+    background: #192846;
+    color: #76E1FF;
+    font-weight: normal;
+    font-size: 14px;
+    border-radius: 7px 7px 0 0;
+    border-bottom: 1px solid rgba(114, 224, 255, 0.2);
+}
+
+/* 搜索框样式 */
+.nav_search {
+    position: relative;
+    padding: 10px;
+    border-bottom: 1px solid rgba(114, 224, 255, 0.1);
+
+    input {
+        width: 100%;
+        padding: 6px 10px 6px 30px;
+        background-color: rgba(255, 255, 255, 0.1);
+        border: 1px solid rgba(114, 224, 255, 0.2);
+        border-radius: 4px;
+        color: #fff;
+        font-size: 13px;
+        box-sizing: border-box;
+
+        &::placeholder {
+            color: rgba(255, 255, 255, 0.5);
+        }
+    }
+
+    .search_icon {
+        position: absolute;
+        left: 18px;
+        top: 16px;
+        color: rgba(255, 255, 255, 0.5);
+        font-size: 14px;
+    }
+}
+
+.nav_list {
+    margin: 0;
+    padding: 5px 0;
+    list-style: none;
+    background: transparent;
+    border: none;
+}
+
+.nav_list li {
+    padding: 10px 15px;
+    color: #b8cee5;
+    cursor: pointer;
+    transition: all 0.2s ease;
+    border-bottom: 1px solid rgba(114, 224, 255, 0.1);
+    font-size: 13px;
+}
+
+.nav_list li.no_results {
+    color: rgba(255, 255, 255, 0.5);
+    cursor: default;
+    text-align: center;
+    padding: 20px 15px;
+}
+
+.nav_list li:last-child {
+    border-bottom: none;
+}
+
+.nav_list li:hover:not(.no_results) {
+    background-color: rgba(114, 224, 255, 0.08);
+    color: #76E1FF;
+}
+
+.nav_list li.active {
+    background-color: rgba(114, 224, 255, 0.15);
+    color: #76E1FF;
+    font-weight: normal;
+}
+
+.nav_item_text {
+    display: block;
+    white-space: nowrap;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    font-weight: 500;
+}
+
+/* 滚动条样式优化 */
+.equipment_nav::-webkit-scrollbar {
+    width: 6px;
+}
+
+.equipment_nav::-webkit-scrollbar-track {
+    background: transparent;
+}
+
+.equipment_nav::-webkit-scrollbar-thumb {
+    background: rgba(114, 224, 255, 0.3);
+    border-radius: 3px;
+}
+
+.equipment_nav::-webkit-scrollbar-thumb:hover {
+    background: rgba(114, 224, 255, 0.5);
+}
+
+/* 响应式调整 */
+@media (max-width: 992px) {
+    .equipment_nav {
+        width: 100%;
+        max-height: 300px;
+        overflow-y: auto;
+        margin-bottom: 20px;
+        top: 160px;
+    }
+}
+
+@media (max-width: 768px) {
+    .equipment_nav {
+        top: 140px;
+    }
+}
+</style>

+ 118 - 94
ui/src/components/GeneralComponents/control/WorkModeControl2Component.vue

@@ -1,24 +1,30 @@
 <template>
-    <div class="flows_body_right_tanks">
-        <div class="tank_single">
-            <div class="flow_single_title">工作模式 </div>
-            <div class="flow_single_body">
-                <div class="body_show">
-                    当前模式:
-                    <div class="body_show_value">
-                        {{ getModeText(sensorDataArr[0]) }}
-                    </div>
-                    <div class="body_show_unit"> {{ unit || '' }}</div>
-                </div>
-                <div class="body_show">
-                    设置模式:
-                    <select class="body_show_select" v-model="selectedMode" @change="handleSet">
-                        <option :value="mode.value" v-for="mode in modes" :key="mode.value">
-                            {{ mode.label }}
-                        </option>
-                    </select>
-                    <div class="body_show_unit"> {{ unit || '' }}</div>
+    <div class="flow_single">
+        <div class="flow_single_title">
+            {{ title }}
+        </div>
+
+        <!-- 当前模式显示区域 -->
+        <div class="status_indicator_area">
+            <div class="status_label">当前模式</div>
+            <div class="status_values">
+                <div class="status_value">
+                    {{ getModeText(sensorDataArr[0]) }}
                 </div>
+                <div class="status_unit">{{ unit || '' }}</div>
+            </div>
+        </div>
+
+        <!-- 模式设置区域 -->
+        <div class="operation_area">
+            <div class="operation_label">设置模式</div>
+            <div class="operation_controls">
+                <select class="mode_select" v-model="selectedMode" @change="handleSet">
+                    <option :value="mode.value" v-for="mode in modes" :key="mode.value">
+                        {{ mode.label }}
+                    </option>
+                </select>
+                <div class="operation_unit">{{ unit || '' }}</div>
             </div>
         </div>
     </div>
@@ -30,9 +36,9 @@ import { getMainSetParam } from '@/api/hnyz/param'
 import { setValues } from '@/api/dcs/flowControl';
 
 const props = defineProps({
-    title: String,
-    dataArr: Array,
-    code: String,
+    title: { type: String, default: '工作模式' },
+    dataArr: { type: Array, default: () => [] },
+    code: { type: String }
 })
 
 // 定义模式映射关系
@@ -98,83 +104,101 @@ const handleSet = () => {
 }
 </script>
 
-<style lang="scss" scoped>
-.flows_body_right_tanks {
+<style scoped lang="scss">
+.flow_single {
+    min-width: 200px;
     display: flex;
     flex-direction: column;
-    align-items: center;
-    justify-content: center;
+    padding: 6px;
+    margin: 10px;
+    border-radius: 5px;
+    border: 1px solid #72e0ff;
+    background: linear-gradient(to bottom, #0e1a2d, #11243e);
+
+    .flow_single_title {
+        padding: 4px 8px;
+        text-align: center;
+        color: #76e1ff;
+        font-size: 18px;
+        font-weight: bold;
+        border-radius: 0px 0px 5px 5px;
+        background: #192846;
+    }
 
-    .tank_single {
+    .status_indicator_area,
+    .operation_area {
         display: flex;
-        flex-direction: column;
         align-items: center;
-        padding: 6px;
+        margin-top: 12px;
+        padding: 0 4px;
+    }
+
+    .status_label,
+    .operation_label {
+        font-size: 14px;
+        margin-right: 8px;
+        width: 70px;
+        text-align: center;
+        padding: 5px 0;
+        background: #0e2b60;
         border-radius: 5px;
-        border: 1px solid #58c3f0;
-        background: linear-gradient(to bottom, #0e1a2d, #11243e);
-        box-shadow: 0 4px 12px rgba(0, 123, 255, 0.1);
-        margin: 10px;
-        min-width: 260px;
-
-        .flow_single_title {
-            font-size: 20px;
-            font-weight: 600;
-            color: #76e1ff;
-            padding: 6px 12px;
-            border-radius: 6px;
-            background: rgba(118, 225, 255, 0.1);
-            margin-bottom: 12px;
-            text-align: center;
-        }
-
-        .flow_single_body {
-            display: flex;
-            flex-direction: column;
-            justify-content: center;
-            align-items: center;
-            gap: 10px;
-
-            .body_show {
-                display: flex;
-                align-items: center;
-                gap: 8px;
-                font-size: 16px;
-                color: #b8cee5;
-
-                .body_show_value, .body_show_select {
-                    font-size: 20px;
-                    font-weight: bold;
-                    color: #3ecfff;
-                    padding: 6px 14px;
-                    border-radius: 6px;
-                    border: 1px solid #3ecfff;
-                    background: #0b1c2f;
-                    min-width: 130px;
-                    min-height: 45px;
-                    text-align: center;
-                }
-
-                .body_show_unit {
-                    width: 25px;
-                    font-size: 16px;
-                    color: #b8cee5;
-                }
-
-                .body_show_select {
-                    appearance: none;
-                    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%233ecfff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
-                    background-repeat: no-repeat;
-                    background-position: right 8px center;
-                    cursor: pointer;
-                }
-
-                .body_show_select:focus, .body_show_value:focus {
-                    outline: none;
-                    border-color: #76e1ff;
-                }
-            }
-        }
+        color: #63c8c7;
+    }
+
+    .status_values {
+        display: flex;
+        align-items: center;
+        gap: 6px;
+        padding: 8px 0;
+        flex: 1;
+        justify-content: center;
+    }
+
+    .status_value {
+        font-size: 20px;
+        font-weight: bold;
+        color: #3ecfff;
+        padding: 6px 14px;
+        border-radius: 6px;
+        border: 1px solid #3ecfff;
+        background: #0b1c2f;
+        min-width: 100px;
+        text-align: center;
+    }
+
+    .status_unit, .operation_unit {
+        font-size: 16px;
+        color: #b8cee5;
+        width: 25px;
+        text-align: center;
+    }
+
+    .operation_controls {
+        display: flex;
+        align-items: center;
+        gap: 6px;
+        flex: 1;
+        justify-content: center;
+        padding: 8px 0;
+    }
+
+    .mode_select {
+        font-size: 20px;
+        font-weight: bold;
+        color: #3ecfff;
+        padding: 6px 14px;
+        border-radius: 6px;
+        border: 1px solid #3ecfff;
+        background: #0b1c2f url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%233ecfff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E") no-repeat right 8px center;
+        min-width: 100px;
+        text-align: center;
+        appearance: none;
+        cursor: pointer;
+    }
+
+    .mode_select:focus {
+        outline: none;
+        border-color: #76e1ff;
     }
 }
-</style>
+</style>

+ 11 - 2
ui/src/config.js

@@ -15,12 +15,21 @@ export const navItems_Na2SO4=[
   { label: '反应分离', code: 'Reaction_Control', path: '/controlPage/flowSelect/reaction' },
   // { label: '反应分离2', code: 'SolidLiquidSeparation_Control', path: '/controlPage/flowSelect/solidLiquidSeparation' },
   { label: '24平真空过滤', code: 'FlatBeltFiltration_Control', path: '/controlPage/flowSelect/flatBeltFiltration' },
-  { label: 'G1分解1', code: 'G1Decomposition_Control', path: '/controlPage/flowSelect/G1Decomposition' },
-  { label: 'G1分解2', code: 'G1AccessorySeparator_Control', path: '/controlPage/flowSelect/G1AccessorySeparator' },
+  { label: 'G1分解', code: 'G1Decomposition_Control', path: '/controlPage/flowSelect/G1Decomposition' },
+  // { label: 'G1分解2', code: 'G1AccessorySeparator_Control', path: '/controlPage/flowSelect/G1AccessorySeparator' },
   { label: '溶晶', code: 'DissolvedCrystal_Control', path: '/controlPage/flowSelect/DissolvedCrystal' },
   { label: 'G3分解', code: 'G3Decomposition_Control', path: '/controlPage/flowSelect/G3Decomposition' },
 ]
 
+export const paramItems_Na2SO4=[
+  { label: '反应分离', code: 'Reaction_Param', path: '/controlPage/paramConfiguration/reaction' },
+  { label: '24平真空过滤', code: 'FlatBeltFiltration_Param', path: '/controlPage/paramConfiguration/flatBeltFiltration' },
+  { label: 'G1分解', code: 'G1Decomposition_Param', path: '/controlPage/paramConfiguration/G1Decomposition' },
+  // { label: 'G1分解2', code: 'G1AccessorySeparator_Param', path: '/controlPage/paramConfiguration/G1AccessorySeparator' },
+  { label: '溶晶', code: 'DissolvedCrystal_Param', path: '/controlPage/paramConfiguration/DissolvedCrystal' },
+  { label: 'G3分解', code: 'G3Decomposition_Param', path: '/controlPage/paramConfiguration/G3Decomposition' },
+]
+
 // 硫酸钠组态页面导航栏配置
 export const pageItems_Na2SO4=[
   { label: '反应分离1', code: 'Na2SO4_FY', path: '/configuratePage/Na2SO4_FY' },

+ 2 - 2
ui/src/views/index.vue

@@ -39,7 +39,7 @@
             <el-button type="success" class="nav_button" @click="toConfig">上海组态</el-button>
             <el-button type="primary" class="nav_button" @click="toHNControl">湖南控制</el-button>
             <el-button type="success" class="nav_button" @click="toHnyzConfig">湖南组态</el-button>
-            <el-button type="success" class="nav_button" @click="toSimulatorPage">模拟器</el-button>
+            <el-button type="success" class="nav_button" @click="toSimulatorPage">参数配置</el-button>
           </div>
         </el-card>
       </div>
@@ -221,7 +221,7 @@ function toHnyzConfig() {
 }
 function toSimulatorPage() {
   // 跳转模拟器页面
-  router.push('/MGM')
+  router.push('/controlPage/paramConfiguration/reaction')
 }
 </script>