Sfoglia il codice sorgente

[Feat 0000]三级防灭火系统整改

bobo04052021@163.com 1 mese fa
parent
commit
c247f88db1

BIN
src/assets/images/beltFire/1-2-1.png


BIN
src/assets/images/beltFire/1-2-2.png


BIN
src/assets/images/beltFire/1-2-3.png


+ 15 - 0
src/views/vent/dataCenter/deviceCenter/device.api.ts

@@ -4,6 +4,8 @@ enum Api {
   deviceTypeList = '/safety/ventanalyDeviceInfo/DeviceKind/queryByCatagory',
   deviceList = '/dataCenter/compute/deviceData/getDeviceAll',
   devMonitorList = '/dataCenter/compute/deviceData/getDeviceMonitorInfo',
+  devicecontrol = '/collect/ventanalyMonitorData/devicecontrol',
+  ponitList = '/ventanaly-collect/collect/ventanalyMonitorParams/list',
 }
 export const getDeviceTypeList = (params) => defHttp.get({ url: Api.deviceTypeList, params });
 //根据设备类型获取设备列表
@@ -19,3 +21,16 @@ export const getDevMonitorListById = (params) =>
     url: Api.devMonitorList,
     params,
   });
+//控制接口
+export const deviceControl = (params) =>
+  defHttp.put({
+    url: Api.devicecontrol,
+    params,
+  });
+// 获取控制点位
+export const getPonitList = (params) => {
+  return defHttp.get({
+    url: Api.ponitList,
+    params,
+  });
+};

+ 92 - 1
src/views/vent/dataCenter/deviceCenter/index.vue

@@ -86,6 +86,7 @@
                     {{ record.netStatus ? '在线' : '断开' }}
                   </span>
                 </template>
+                <template v-else-if="column.dataIndex === 'action'"> <a class="table-action-link" @click="handleControl(record)">控制</a> </template>
                 <template v-else>
                   {{ record[column.dataIndex] }}
                 </template>
@@ -114,6 +115,25 @@
       </div>
     </div>
   </div>
+  <a-modal v-model:visible="controlModalVisible" title="设备控制" width="500px" @ok="handleControlConfirm" @cancel="handleControlCancel">
+    <div style="display: flex; justify-content: center; padding: 20px 0">
+      <a-form layout="vertical" :model="controlForm" ref="controlFormRef" style="width: 80%; min-width: 300px">
+        <a-form-item label="请选择控制点位" name="cmd">
+          <a-select v-model:value="controlForm.paramcode" placeholder="请选择控制点位" style="width: 100%">
+            <a-select-option v-for="item in pointOptions" :key="item.value" :value="item.value">
+              {{ item.label }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item label="控制数据" name="password">
+          <a-input v-model:value="controlForm.value" placeholder="请输入" style="width: 100%" />
+        </a-form-item>
+        <a-form-item label="操作密码" name="password">
+          <a-input-password v-model:value="controlForm.password" placeholder="请输入操作密码" style="width: 100%" />
+        </a-form-item>
+      </a-form>
+    </div>
+  </a-modal>
 </template>
 
 <script setup lang="ts">
@@ -121,7 +141,7 @@ import { ref, nextTick, reactive, onMounted, onUnmounted, watch, shallowRef, com
 import { usePermission } from '/@/hooks/web/usePermission';
 import customHeader from '/@/components/vent/customHeader.vue';
 import { message, TreeProps } from 'ant-design-vue';
-import { getDeviceTypeList, getDeviceListByType, getDevMonitorListById } from './device.api';
+import { getDeviceTypeList, getDeviceListByType, getDevMonitorListById, deviceControl, getPonitList } from './device.api';
 import HistoryTableFan from './history/HistoryTableFan.vue';
 import HistoryTable from './history/HistoryTable.vue';
 import { RightCircleTwoTone, DownCircleTwoTone } from '@ant-design/icons-vue';
@@ -164,6 +184,71 @@ async function onChangeTab(tab) {
     // 获取历史数据
   }
 }
+const controlModalVisible = ref(false);
+const controlFormRef = ref();
+const pointOptions = ref([]);
+const devicetype = ref('');
+const controlForm = ref({
+  paramcode: '',
+  value: '',
+  password: '',
+  deviceid: '',
+  devicetype: '',
+});
+// 获取控制点位
+async function getPonitList1(type) {
+  if (!type) return;
+
+  try {
+    const params = {
+      devicetype: type,
+      pageNo: 1,
+      pageSize: 1000,
+      valuetype: 1,
+    };
+
+    // 调用接口
+    const res = await getPonitList(params);
+    console.log('返回结果:', res);
+
+    // 安全赋值
+    const list = res?.records || [];
+    pointOptions.value = list.map((item) => ({
+      label: item.valuename,
+      value: item.valuecode,
+    }));
+  } catch (err) {
+    console.error('获取失败:', err);
+  }
+}
+// 控制按钮
+const handleControl = (record) => {
+  // 先赋值设备ID
+  controlForm.value.deviceid = record.id;
+  controlForm.value.devicetype = record.strtype;
+  controlForm.value.paramcode = '';
+  controlForm.value.password = '';
+
+  // 先清空下拉框
+  pointOptions.value = [];
+  controlModalVisible.value = true;
+  getPonitList1(record.strtype);
+};
+// 确认控制
+const handleControlConfirm = async () => {
+  try {
+    // 调用后端控制接口
+    await deviceControl(controlForm.value);
+    message.success('控制指令发送成功');
+    controlModalVisible.value = false;
+  } catch (err) {}
+};
+
+// 取消
+const handleControlCancel = () => {
+  controlModalVisible.value = false;
+};
+
 //树形菜单选择事件
 const onSelect: TreeProps['onSelect'] = (keys, e) => {
   deviceType.value = '';
@@ -287,6 +372,12 @@ const outerColumns = [
     key: 'netStatus',
     align: 'center',
   },
+  {
+    title: '操作',
+    dataIndex: 'action',
+    width: 100,
+    align: 'center',
+  },
 ];
 
 // 内层表格列配置

+ 13 - 17
src/views/vent/dataCenter/operation/log.data.ts

@@ -1,28 +1,22 @@
 import { BasicColumn, FormSchema } from '/@/components/Table';
 import { getUSerInfo, getDeviceKind } from './operation.api';
+import { getAutoScrollContainer } from '/@/utils/common/compUtils';
 export const searchFormSchema: FormSchema[] = [
   {
     label: '设备类型',
     field: 'devicetype',
     component: 'ApiSelect',
     colProps: { span: 5 },
-    componentProps: () => {
-      return {
-        api: async () => {
-          const res = await getDeviceKind();
-          console.log('接口原始返回数据:', res); // 确认接口是否返回了数据
-
-          const arr = Object.entries(res.result || {}).map(([key, value]) => ({
-            id: key,
-            name: value,
-          }));
-          console.log('转换后的数组:', arr); // 确认转换后的数组格式对不对
-          return arr;
-        },
-        labelField: 'name',
-        valueField: 'id',
-        showSearch: true,
-      };
+    componentProps: {
+      api: async () => {
+        const res = await getDeviceKind();
+        return Object.entries(res || {}).map(([key, value]) => ({
+          id: key,
+          name: value,
+        }));
+      },
+      labelField: 'name',
+      valueField: 'id',
     },
   },
   {
@@ -43,6 +37,7 @@ export const searchFormSchema: FormSchema[] = [
     componentProps: {
       showTime: true,
       valueFormat: 'YYYY-MM-DD HH:mm:ss',
+      getPopupContainer: getAutoScrollContainer,
     },
     colProps: { span: 4 },
   },
@@ -53,6 +48,7 @@ export const searchFormSchema: FormSchema[] = [
     componentProps: {
       showTime: true,
       valueFormat: 'YYYY-MM-DD HH:mm:ss',
+      getPopupContainer: getAutoScrollContainer,
     },
     colProps: { span: 4 },
   },

+ 1 - 1
src/views/vent/dataCenter/operation/operation.api.ts

@@ -19,5 +19,5 @@ export const getUSerInfo = () =>
 // 查询设备种类
 export const getDeviceKind = () =>
   defHttp.get({
-    url: Api.getLogList,
+    url: Api.getDeviceKind,
   });

+ 1 - 1
src/views/vent/deviceManager/comment/warningTabel/indexLeather.vue

@@ -87,7 +87,7 @@ async function onSubmit(flag, values) {
   if (flag == 'update') {
     await warningLogEdit(values);
   } else {
-    if (values.alarmType === 'leather_') {
+    if (values.alarmType === 'belt_part_warn') {
       // 调用第二个接口
       await warningLogAddLeather({ ...values, sysId: props.deviceId });
     } else {

+ 46 - 22
src/views/vent/deviceManager/comment/warningTabel/warning.data.ts

@@ -363,14 +363,14 @@ export const deviceFormColumns: FormSchema[] = [
     colProps: { span: 12 },
   },
   {
-    label: '报警限值',
-    field: 'fmax',
+    label: '报警限值',
+    field: 'fmin',
     component: 'InputNumber',
     colProps: { span: 12 },
   },
   {
-    label: '报警限值',
-    field: 'fmin',
+    label: '报警限值',
+    field: 'fmax',
     component: 'InputNumber',
     colProps: { span: 12 },
   },
@@ -391,7 +391,7 @@ export const deviceFormColumns: FormSchema[] = [
     colProps: { span: 12 },
   },
   {
-    label: '数据趋势持续时间(h)',
+    label: '数据趋势持续时间',
     field: 'trendCxTime',
     component: 'InputNumber',
     colProps: { span: 12 },
@@ -399,7 +399,19 @@ export const deviceFormColumns: FormSchema[] = [
   {
     label: '数据趋势持续时间单位',
     field: 'trendCxTimeUnit',
-    component: 'Input',
+    component: 'Select',
+    componentProps: {
+      options: [
+        {
+          label: '分钟',
+          value: '0',
+        },
+        {
+          label: '小时',
+          value: '1',
+        },
+      ],
+    },
     colProps: { span: 12 },
   },
   {
@@ -671,25 +683,37 @@ export const monitorWarningFormSchemas = (param) =>
       },
     },
     {
-      label: '数据趋势持续时间(h)',
+      label: '数据趋势持续时间',
       field: 'trendCxTime',
       component: 'InputNumber',
     },
-    // {
-    //   label: '数据趋势持续时间单位',
-    //   field: 'trendCxTimeUnit',
-    //   component: 'Input',
-    // },
-    // {
-    //   label: '持续范围下限值',
-    //   field: 'trendMin',
-    //   component: 'InputNumber',
-    // },
-    // {
-    //   label: '持续范围上限值',
-    //   field: 'trendMax',
-    //   component: 'InputNumber',
-    // },
+    {
+      label: '数据趋势持续时间单位',
+      field: 'trendCxTimeUnit',
+      component: 'Select',
+      componentProps: {
+        options: [
+          {
+            label: '分钟',
+            value: '0',
+          },
+          {
+            label: '小时',
+            value: '1',
+          },
+        ],
+      },
+    },
+    {
+      label: '持续范围下限值',
+      field: 'trendMin',
+      component: 'InputNumber',
+    },
+    {
+      label: '持续范围上限值',
+      field: 'trendMax',
+      component: 'InputNumber',
+    },
   ];
 
 export const controlWarningFormSchemas: FormSchema[] = [

+ 48 - 8
src/views/vent/home/configurable/belt/belt-new.vue

@@ -24,8 +24,8 @@
       </template>
       <template v-else>
         <ModuleCommon
-          v-for="cfg in configs"
-          :key="cfg.deviceType"
+          v-for="cfg in cfgs"
+          :key="cfg.deviceType + cfg.moduleName"
           :show-style="cfg.showStyle"
           :module-data="cfg.moduleData"
           :module-name="cfg.moduleName"
@@ -33,6 +33,19 @@
           :page-type="cfg.pageType"
           :data="data"
           :visible="true"
+          style="z-index: 20"
+        />
+        <ModuleCommonDual
+          v-if="cfgA && cfgB"
+          :show-style="cfgA.showStyle"
+          :module-data-a="cfgA.moduleData"
+          :module-name-a="cfgA.moduleName"
+          :device-type-a="cfgA.deviceType"
+          :module-data-b="cfgB.moduleData"
+          :module-name-b="cfgB.moduleName"
+          :device-type-b="cfgB.deviceType"
+          :data="data"
+          :visible="true"
         />
       </template>
     </div>
@@ -40,20 +53,24 @@
 </template>
 
 <script setup lang="ts">
-import { onMounted, ref, watch, nextTick } from 'vue';
+import { onMounted, ref, watch, nextTick, computed, onUnmounted } from 'vue';
 import customHeader from './components/customHeader-belt.vue';
 import { useInitConfigs, useInitPage } from '../hooks/useInit';
 import { testBeltNew, testYjkf, testSpary } from './configurable.data';
 import ModuleCommon from './components/ModuleCommon.vue';
+import ModuleCommonDual from './components/ModuleCommonDual.vue';
 import Three3D from '/@/views/vent/home/configurable/components/three3D.vue';
 import BeltNav from './components/BeltNav.vue';
 import { useRouter, useRoute } from 'vue-router';
-import { getSystem, getMonitorAndAlertBelt, getDevice, getDataHome, getWarnResult } from './configurable.api';
+import { getSystem, getMonitorAndAlertBelt, getWarnInfo, getDevice, getDataHome, getWarnResult } from './configurable.api';
 import { modalAnimate } from './threejs/belt.threejs';
 import History from './components/detail/history.vue';
 import sys from '/@/locales/lang/en/sys';
 // 初始化配置
 const { configs, fetchConfigs } = useInitConfigs();
+const cfgs = computed(() => configs.value.filter((_, index) => index !== 2 && index !== 3));
+const cfgA = computed<any>(() => configs.value[2]);
+const cfgB = computed<any>(() => configs.value[3]);
 const { updateEnhancedConfigs, updateData, data } = useInitPage('矿井全域皮带巷三级防灭火系统');
 const isInitModal = ref(false);
 const pageCache = ref({
@@ -61,7 +78,7 @@ const pageCache = ref({
   emergencyControl: { configs: testYjkf },
   sprayControl: { configs: testSpary },
 });
-
+let timer = null;
 const pageType = ref('fire_risk_warn');
 const route = useRoute();
 const modalMonitorData = ref({});
@@ -92,6 +109,21 @@ function goToHistory() {
     pageType.value = 'history';
   }
 }
+// 预警等级映射
+const warnTypeMap = {
+  '102': '蓝色预警(一般风险)',
+  '103': '黄色预警(较大风险)',
+  '104': '橙色预警(重大风险)',
+  '201': '红色预警(特别重大风险)',
+};
+const deviceRuleMap = {
+  modelsensor_co: { label: 'CO浓度', useFminMax: true },
+  modelsensor_temperature: { label: '温度传感器', useFminMax: true },
+  modelsensor_hcl: { label: 'HCL浓度', useFminMax: true },
+  fiber_v1: { label: '光纤测温', useFminMax: false },
+  modelsensor_fire: { label: '火焰传感器', useFminMax: false },
+  modelsensor_smoke: { label: '烟雾传感器', useFminMax: false },
+};
 // 刷新数据
 async function refresh() {
   // await fetchConfigs('sys_Leather');
@@ -174,7 +206,6 @@ async function refresh() {
       alarmLevel: '103,104',
     };
     const sprayData = [];
-    console.log(data.value, '=======');
     if (data.value?.deviceInfo) {
       // 遍历对象的所有 value
       Object.values(data.value.deviceInfo).forEach((item) => {
@@ -198,7 +229,8 @@ async function refresh() {
 
 // // 定时刷新
 function initInterval() {
-  setInterval(() => {
+  if (timer) clearInterval(timer);
+  timer = setInterval(() => {
     refresh();
   }, 60000);
 }
@@ -228,7 +260,12 @@ function initModalAnimate(modal) {
   modal.isRender = true;
   modalAnimate(modal, modalMonitorData);
 }
-
+function clearTimer() {
+  if (timer) {
+    clearInterval(timer);
+    timer = null;
+  }
+}
 watch(
   () => route.query.pageType,
   (newQueryType) => {
@@ -253,6 +290,9 @@ onMounted(async () => {
   await refresh();
   initInterval();
 });
+onUnmounted(() => {
+  clearTimer();
+});
 </script>
 <style lang="less" scoped>
 .company-home {

+ 1 - 8
src/views/vent/home/configurable/belt/belt.vue

@@ -49,7 +49,6 @@ const handleItemClick = (item) => {
   const clickId = item.id;
   if (!clickId) return;
   currentSelectedId.value = clickId;
-  console.log('爷组件已更新选中ID:', clickId);
 };
 function goToHistory() {
   showHistory.value = !showHistory.value;
@@ -70,9 +69,6 @@ const filterDataById = (sourceData, clickId: string | number) => {
   };
 };
 
-// ==============================
-// 🔥 修复:正常拉取config,但不覆盖!保证 dataList 正常传参
-// ==============================
 function refresh() {
   fetchConfigs('belt').then(() => {
     // 🔥 关键:只有为空时才赋值,不重复覆盖!
@@ -100,12 +96,9 @@ function refresh() {
       ];
       let showData = res;
 
-      // 只要用户选过,就永远保持选中,绝不自动切走
       if (currentSelectedId.value) {
         showData = filterDataById(res, currentSelectedId.value);
-      }
-      // 从未选过 → 默认第一个
-      else {
+      } else {
         const firstId = res.monitor_alert?.[0]?.sysId;
         if (firstId) {
           currentSelectedId.value = firstId;

+ 44 - 55
src/views/vent/home/configurable/belt/components/ModuleCommon.vue

@@ -1,10 +1,9 @@
 <template>
-  <!-- 常用模块 -->
   <Transition
     :enter-active-class="`animate__animated  animate__fadeIn${capitalizedPosition}`"
     :leave-active-class="`animate__animated  animate__fadeOut${capitalizedPosition}`"
   >
-    <ventBox1 v-if="visible" :class="getModuleClass(showStyle)" :style="style" :pageType="pageType">
+    <ventBox1 v-if="visible" :class="getModuleClass(showStyle)" :style="style" :pageType="pageType" :alarmClass="alarmBgClass">
       <template v-if="moduleName" #title>
         <div :class="{ 'cursor-pointer': !!moduleData.to }" style="font-weight: bold; font-style: italic" @click="redirectTo">{{ moduleName }}</div>
       </template>
@@ -17,7 +16,7 @@
             :moduleData="moduleData"
             :data="selectedDevice"
             :chartData="chartData"
-            @clickItem="(data) => emit('clickItem', data)"
+            @clickItem="handleAlarmItem"
             :active-id="activeId"
           />
           <Content
@@ -32,58 +31,52 @@
     </ventBox1>
   </Transition>
 </template>
+
 <script lang="ts" setup>
 import Header from './header.vue';
 import Content from '../../components/content.vue';
-// import ModuleLeft from './original/moduleLeft.vue';
-// import ModuleBottom from './original/moduleBottom.vue';
 import { computed, ref, watch } from 'vue';
 import ventBox1 from './ventBoxBelt.vue';
 import { openWindow } from '/@/utils';
 import { getFormattedText } from '../../hooks/helper';
 import { useInitModule } from '../../hooks/useInit';
-// import { ModuleProps } from '../types';
 
 const props = defineProps<{
   pageType: string;
-  /** 配置的详细模块信息 */
   moduleData: any;
-  /** 配置的详细样式信息 */
   showStyle: any;
-  /** 该模块配置中的设备标识符 */
   deviceType: string;
-  /** api返回的数据 */
   data: any;
   moduleName: string;
   visible: boolean;
   chartData?: any;
-  activeId?: [String, Number]; // 接收ID
+  activeId?: string | number;
 }>();
-// defineEmits(['close', 'click']);
+
 const emit = defineEmits<{
   (e: 'close'): void;
   (e: 'click'): void;
   (e: 'clickItem', data: any): void;
 }>();
-const { header } = props.moduleData;
 
+const { header } = props.moduleData;
 const { selectedDeviceID, selectedDevice, options, init } = useInitModule(props.deviceType, props.moduleData);
-
 const selectedData = ref();
-
+const selectedAlarmItem = ref({});
+const alarmBgClass = ref('');
+const handleAlarmItem = (data) => {
+  selectedAlarmItem.value = data;
+  emit('clickItem', data);
+};
 const style = computed(() => {
   const size = props.showStyle.size;
   const position = props.showStyle.position;
   return size + position + 'position: absolute; pointer-events: auto; z-index: 1';
 });
-const pageType = computed(() => {
-  return props.pageType || '';
-});
-const capitalizedPosition = computed(() => {
-  return props.showStyle.position.includes('left') ? 'Left' : 'Right';
-});
 
-// 根据配置里的定位判断应该使用哪个class
+const pageType = computed(() => props.pageType || '');
+const capitalizedPosition = computed(() => (props.showStyle.position.includes('left') ? 'Left' : 'Right'));
+
 function getModuleClass({ size, position }) {
   const [_, width] = size.match(/width:([0-9]+)px/) || [];
   if (position.includes('bottom') || parseInt(width) > 800) {
@@ -98,23 +91,6 @@ function redirectTo() {
   openWindow(getFormattedText(props.data, to));
 }
 
-/**
- * 模块选择切换事件
- * @param selectedItem
- */
-// function handleSelect(selectedItem: any) {
-//   selectedData.value = selectedItem;
-//   if (!selectedItem) return;
-
-//   selectedDeviceID.value = options.value[0]?.value;
-//   if (selectedItem.id !== undefined && selectedItem.id !== null) {
-//     // 确保这个 ID 在当前的 options 里存在
-//     const isValid = options.value.some((opt) => opt.value === selectedItem.id);
-//     if (isValid) {
-//       selectedDeviceID.value = selectedItem.id;
-//     }
-//   }
-// }
 watch(
   () => props.data,
   (d) => {
@@ -123,18 +99,41 @@ watch(
       selectedDeviceID.value = options.value[0]?.value;
     }
   },
-  {
-    immediate: true,
-  }
+  { immediate: true }
+);
+watch(
+  () => selectedAlarmItem.value?.value,
+  (newVal, oldVal) => {
+    if (newVal === oldVal) return;
+    const val = newVal;
+    switch (val) {
+      case '0':
+      case '101':
+      case '102':
+        alarmBgClass.value = 'alarm-normal';
+        break;
+      case '103':
+        alarmBgClass.value = 'alarm-yellow';
+        break;
+      case '104':
+        alarmBgClass.value = 'alarm-orange';
+        break;
+      case '201':
+      case '1001':
+        alarmBgClass.value = 'alarm-warning';
+        break;
+      default:
+        alarmBgClass.value = 'alarm-normal';
+    }
+  },
+  { immediate: true } // 初始立即执行一次
 );
 </script>
 <style lang="less" scoped>
 @import '/@/design/theme.less';
-
 .module-common .box1-center {
   height: calc(100% - 48px);
 }
-
 :deep(.box1-center) {
   height: calc(100% - 48px);
 }
@@ -143,14 +142,4 @@ watch(
   padding: 0 !important;
   width: 100% !important;
 }
-.module-common-longer {
-  :deep(.box1-top) {
-    --image-box1-top: url('/@/assets/images/beltFire/1-1.png');
-    background-image: url('/@/assets/images/beltFire/1-1.png');
-  }
-  :deep(.box1-bottom) {
-    --image-box1-bottom: url('/@/assets/images/beltFire/1-2.png');
-    background-image: url('/@/assets/images/beltFire/1-2.png');
-  }
-}
-</style>
+</style>

+ 197 - 0
src/views/vent/home/configurable/belt/components/ModuleCommonDual.vue

@@ -0,0 +1,197 @@
+<template>
+  <div class="dane-bd" :style="style" :class="daneClass">
+    <div class="dane-title">
+      <div class="common-navL">
+        <span :class="{ deactived: index === 1 }" @click="index = 0">
+          {{ moduleNameA }}
+        </span>
+        <span class="ml-20px mr-20px">|</span>
+        <span :class="{ deactived: index === 0 }" @click="index = 1">
+          {{ moduleNameB }}
+        </span>
+      </div>
+    </div>
+    <div class="dane-content">
+      <slot>
+        <Content v-if="index === 0" style="height: 100%" :moduleData="moduleDataA" :data="data" />
+        <Content v-if="index === 1" style="height: 100%" :moduleData="moduleDataB" :data="data" />
+      </slot>
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import Content from '../../components/content.vue';
+import { defineProps, defineEmits, computed, ref, watch } from 'vue';
+import { ModuleData, ShowStyle } from '../../../../deviceManager/configurationTable/types';
+import { useInitModule } from '../../hooks/useInit';
+
+const props = defineProps<{
+  moduleDataA: ModuleData;
+  moduleNameA: string;
+  deviceTypeA: string;
+  moduleDataB: ModuleData;
+  moduleNameB: string;
+  deviceTypeB: string;
+  showStyle: ShowStyle;
+  visible: boolean;
+  data: any;
+}>();
+const emit = defineEmits(['close', 'select']);
+
+const index = ref(0);
+
+const headerA = props.moduleDataA.header;
+const headerB = props.moduleDataB.header;
+
+const {
+  selectedDeviceID: selectedDeviceIDA,
+  selectedDevice: selectedDeviceA,
+  options: optionsA,
+  init: initA,
+} = useInitModule(props.deviceTypeA, props.moduleDataA);
+const {
+  selectedDeviceID: selectedDeviceIDB,
+  selectedDevice: selectedDeviceB,
+  options: optionsB,
+  init: initB,
+} = useInitModule(props.deviceTypeB, props.moduleDataB);
+
+const style = computed(() => {
+  const size = props.showStyle.size;
+  const position = props.showStyle.position;
+  return size + position;
+});
+
+// 根据配置里的定位判断应该使用哪个module组件
+const daneClass = computed(() => {
+  const position = props.showStyle.position;
+  const size = props.showStyle.size;
+  const [_, width] = size.match(/width:([0-9]+)px/) || [];
+  if (position.includes('bottom') || parseInt(width) > 800) {
+    return 'dane-w';
+  }
+  if (position.includes('left')) {
+    return 'dane-m';
+  }
+  if (position.includes('right')) {
+    return 'dane-m';
+  }
+  return 'dane-m';
+});
+
+watch(
+  () => props.data,
+  (d) => {
+    initA(d);
+    initB(d);
+    if (!selectedDeviceIDA.value) selectedDeviceIDA.value = optionsA.value[0]?.value;
+    if (!selectedDeviceIDB.value) selectedDeviceIDB.value = optionsB.value[0]?.value;
+  },
+  {
+    immediate: true,
+  }
+);
+</script>
+
+<style scoped lang="less">
+@import '/@/design/theme.less';
+.dane-bd {
+  --image-module-title: url('/@/assets/images/beltFire/1-1.png');
+  --image-common-border: url('/@/assets/images/beltFire/1-5.png');
+  position: absolute;
+  width: 100%;
+  height: 100%;
+  background-image: var(--image-common-border);
+  background-repeat: no-repeat;
+  background-position: center top;
+  background-size: 100% 100%;
+  z-index: 2;
+
+  .dane-title {
+    display: flex;
+    box-sizing: border-box;
+    align-items: center;
+    justify-content: space-between;
+    width: 100%;
+    height: 34px;
+    padding: 0 40px 0 50px;
+    background: var(--image-module-title);
+    background-repeat: no-repeat;
+    .common-navL {
+      display: flex;
+      position: relative;
+      align-items: center;
+      color: #fff;
+      font-size: 14px;
+      font-style: italic;
+      font-weight: bold;
+    }
+  }
+
+  .dane-content {
+    height: calc(100% - 34px);
+  }
+}
+
+.deactived {
+  cursor: pointer;
+  color: #8087a1;
+}
+
+:deep(.zxm-select-selector) {
+  height: 22px !important;
+  border: none !important;
+  // background-color: rgb(15 64 88) !important;
+  background-color: transparent !important;
+  color: #8087a1 !important;
+}
+
+:deep(.zxm-select-selection-placeholder) {
+  color: #8087a1 !important;
+}
+
+:deep(.zxm-select-arrow) {
+  color: #8087a1 !important;
+}
+
+:deep(.zxm-picker) {
+  border: none !important;
+  background-color: rgb(15 64 88) !important;
+  box-shadow: none;
+  color: #a1dff8 !important;
+}
+
+:deep(.zxm-picker-input > input) {
+  color: #a1dff8 !important;
+  text-align: center !important;
+}
+
+:deep(.zxm-picker-separator) {
+  color: #a1dff8 !important;
+}
+
+:deep(.zxm-picker-active-bar) {
+  display: none !important;
+}
+
+:deep(.zxm-picker-suffix) {
+  color: #a1dff8 !important;
+}
+
+:deep(.zxm-switch) {
+  min-width: 48px !important;
+}
+
+:deep(.zxm-switch-checked) {
+  background-color: rgb(15 64 89) !important;
+}
+
+:deep(.zxm-switch-handle::before) {
+  background-color: rgb(33 179 247) !important;
+}
+
+:deep(.zxm-select-selection-item) {
+  color: #fff !important;
+}
+</style>

+ 6 - 9
src/views/vent/home/configurable/belt/components/ventBoxBelt.vue

@@ -13,16 +13,13 @@
     <div class="box1-bottom" :class="`box1-bottom-${pageType}`"></div>
   </div>
 </template>
-<script>
-import { defineComponent } from 'vue';
-export default defineComponent({
-  name: 'VentBox1',
-  props: {
-    pageType: {
-      type: String,
-    },
+<script setup lang="ts">
+import { onMounted, defineProps } from 'vue';
+// 定义 props
+const props = defineProps({
+  pageType: {
+    type: String,
   },
-  setup() {},
 });
 </script>
 

+ 3 - 0
src/views/vent/home/configurable/belt/configurable.api.ts

@@ -17,6 +17,8 @@ enum Api {
   changeStatus = '/ventanaly-device/safety/deviceVehiclePass/switch/change',
   // 查询预警结果
   getWarnResult = '/ventanaly-device/monitor/disaster/beltAlertRecords',
+  // 预警指标信息获取
+  getWarnInfo = '/ventanaly-device/monitor/disaster/findAlarmsBySystemAndMonitorType',
 }
 export const getSystem = (params) => defHttp.post({ url: Api.getSystem, params });
 export const getMonitorAndAlertBelt = (params) => defHttp.post({ url: Api.monitorAndAlertBelt, params });
@@ -25,3 +27,4 @@ export const getStatus = () => defHttp.get({ url: Api.getStatus });
 export const changeStatus = (params) => defHttp.get({ url: Api.changeStatus, params });
 export const getDevice = (params) => defHttp.post({ url: Api.getDevice, params });
 export const getWarnResult = (params) => defHttp.post({ url: Api.getWarnResult, params });
+export const getWarnInfo = (params) => defHttp.post({ url: Api.getWarnInfo, params });

+ 371 - 75
src/views/vent/home/configurable/belt/configurable.data.ts

@@ -451,6 +451,89 @@ export const testBeltNew: Config[] = [
     },
   },
 
+  {
+    deviceType: 'fire_risk_warn',
+    moduleName: '火灾监测设备状态',
+    pageType: 'fireMonitor',
+    moduleData: {
+      header: {
+        show: false,
+        readFrom: '',
+        selector: {
+          show: false,
+          value: '${beltName}',
+        },
+        slot: {
+          show: false,
+          value: '',
+        },
+      },
+      background: {
+        show: false,
+        type: 'video',
+        link: '',
+      },
+      layout: {
+        direction: 'column',
+        items: [
+          {
+            name: 'fire_sensor_analysis',
+            basis: '100%',
+          },
+        ],
+      },
+      board: [],
+      chart: [],
+      gallery: [],
+      gallery_list: [],
+      table: [],
+      list: [],
+      complex_list: [],
+      preset: [
+        {
+          readFrom: 'fire_risk_warn',
+          config: [
+            {
+              title: '火焰传感器',
+              items: [
+                {
+                  label: '是否报警',
+                  code: '${modelsensor_fire.flag}',
+                  trans: { true: '报警', false: '正常' },
+                },
+                {
+                  label: '最大值产生于',
+                  code: '${modelsensor_fire.time}',
+                  info: { code: '${modelsensor_fire.position}' },
+                },
+              ],
+            },
+            {
+              title: '烟雾传感器',
+              items: [
+                {
+                  label: '是否报警',
+                  code: '${modelsensor_smoke.flag}',
+                  trans: { true: '报警', false: '正常' },
+                },
+                {
+                  label: '最大值产生于',
+                  code: '${modelsensor_smoke.time}',
+                  info: { code: '${modelsensor_smoke.position}' },
+                },
+              ],
+            },
+          ],
+        },
+      ],
+    },
+    showStyle: {
+      size: 'width:400px;height:400px;',
+      version: '原版',
+      position: 'top:20px;right:25px;',
+    },
+  },
+
   // ==================== 中央中部:预警结果列表 ====================
   {
     deviceType: 'warn_result',
@@ -537,17 +620,17 @@ export const testBeltNew: Config[] = [
       position: 'bottom:25px;left:445px;',
     },
   },
-
+  // 中下2
   {
-    deviceType: 'fire_risk_warn',
-    moduleName: '火灾监测设备状态',
-    pageType: 'fireMonitor',
+    deviceType: 'warnInfo',
+    moduleName: '预警指标',
+    pageType: 'fireMonitorMid',
     moduleData: {
       header: {
         show: false,
         readFrom: '',
         selector: {
-          show: false,
+          show: true,
           value: '${beltName}',
         },
         slot: {
@@ -564,7 +647,7 @@ export const testBeltNew: Config[] = [
         direction: 'column',
         items: [
           {
-            name: 'fire_sensor_analysis',
+            name: 'warning_result',
             basis: '100%',
           },
         ],
@@ -578,49 +661,64 @@ export const testBeltNew: Config[] = [
       complex_list: [],
       preset: [
         {
-          readFrom: 'fire_risk_warn',
-          config: [
+          readFrom: '',
+          type: 'C',
+          tableReadFrom: 'warnInfo',
+          columns: [
             {
-              title: '火焰传感器',
-              items: [
-                {
-                  label: '是否报警',
-                  code: '${modelsensor_fire.flag}',
-                  trans: { true: '报警', false: '正常' },
-                },
-                {
-                  label: '最大值产生于',
-                  code: '${modelsensor_fire.time}',
-                  info: { code: '${modelsensor_fire.position}' },
-                },
-              ],
+              name: '级别名称',
+              prop: 'warnType',
+              width: '180px',
             },
             {
-              title: '烟雾传感器',
-              items: [
-                {
-                  label: '是否报警',
-                  code: '${modelsensor_smoke.flag}',
-                  trans: { true: '报警', false: '正常' },
-                },
-                {
-                  label: '最大值产生于',
-                  code: '${modelsensor_smoke.time}',
-                  info: { code: '${modelsensor_smoke.position}' },
-                },
-              ],
+              name: 'CO浓度(ppm)',
+              prop: 'fmin fmax',
+              width: '180px',
+            },
+            {
+              name: '温度(环境)',
+              prop: 'status',
+              width: '180px',
+            },
+            {
+              name: 'CO变化率(ppm/min)',
+              prop: 'trendMmin trendMax',
+              width: '220px',
+            },
+            {
+              name: 'HCL浓度(ppm)',
+              prop: 'trendMmin trendMax',
+              width: '180px',
+            },
+            {
+              name: '设备升温(△T/△t)',
+              prop: 'trendMmin trendMax',
+              width: '180px',
+            },
+            {
+              name: '其他',
+              prop: '',
+              width: '180px',
+            },
+            {
+              name: '操作',
+              prop: 'warnType',
+              width: '180px',
             },
           ],
+          otherProps: {
+            title: '火灾风险预警',
+            prop: 'status',
+          },
         },
       ],
     },
     showStyle: {
-      size: 'width:400px;height:400px;',
+      size: 'width:1030px;height:300px;',
       version: '原版',
-      position: 'top:20px;right:25px;',
+      position: 'bottom:25px;left:445px;',
     },
   },
-
   // ==================== 右侧下部:车辆定位与CO浓度关联分析 ====================
   {
     deviceType: 'vehicle_co_correlate',
@@ -896,6 +994,68 @@ export const testSpary: Config[] = [
       position: 'top:30px;left:25px;',
     },
   },
+
+  {
+    deviceType: '',
+    moduleName: '摄像头视频信号',
+    pageType: 'beltYjkf',
+    moduleData: {
+      header: {
+        show: false,
+        readFrom: '',
+        selector: {
+          show: false,
+          value: '${beltName}',
+        },
+        slot: {
+          show: false,
+          value: '',
+        },
+      },
+      background: {
+        show: false,
+        type: 'video',
+        link: '',
+      },
+      layout: {
+        direction: 'row',
+        items: [
+          {
+            name: 'cameraList',
+            basis: '100%',
+          },
+        ],
+      },
+      board: [],
+      chart: [],
+      gallery: [],
+      gallery_list: [],
+      table: [],
+      list: [],
+      complex_list: [],
+      preset: [
+        {
+          readFrom: 'deviceInfo.gate.datalist',
+          config: {
+            title: 'name',
+            contents: [
+              {
+                code: '',
+                value: '',
+                info: '',
+              },
+            ],
+          },
+        },
+      ],
+      // mock: BDfireMock,
+    },
+    showStyle: {
+      size: 'width:440px;height:850px;',
+      version: '原版',
+      position: 'top:0px;right:25px;',
+    },
+  },
   {
     deviceType: 'warn_result',
     moduleName: '预警结果',
@@ -982,15 +1142,15 @@ export const testSpary: Config[] = [
     },
   },
   {
-    deviceType: '',
-    moduleName: '摄像头视频信号',
-    pageType: 'beltYjkf',
+    deviceType: 'warnInfo',
+    moduleName: '预警指标',
+    pageType: 'fireMonitorMid',
     moduleData: {
       header: {
         show: false,
         readFrom: '',
         selector: {
-          show: false,
+          show: true,
           value: '${beltName}',
         },
         slot: {
@@ -1004,10 +1164,10 @@ export const testSpary: Config[] = [
         link: '',
       },
       layout: {
-        direction: 'row',
+        direction: 'column',
         items: [
           {
-            name: 'cameraList',
+            name: 'warning_result',
             basis: '100%',
           },
         ],
@@ -1021,25 +1181,62 @@ export const testSpary: Config[] = [
       complex_list: [],
       preset: [
         {
-          readFrom: 'deviceInfo.gate.datalist',
-          config: {
-            title: 'name',
-            contents: [
-              {
-                code: '',
-                value: '',
-                info: '',
-              },
-            ],
+          readFrom: '',
+          type: 'C',
+          tableReadFrom: 'warnInfo',
+          columns: [
+            {
+              name: '级别名称',
+              prop: 'warnType',
+              width: '180px',
+            },
+            {
+              name: 'CO浓度(ppm)',
+              prop: 'fmin fmax',
+              width: '180px',
+            },
+            {
+              name: '温度(环境)',
+              prop: 'status',
+              width: '180px',
+            },
+            {
+              name: 'CO变化率(ppm/min)',
+              prop: 'trendMmin trendMax',
+              width: '220px',
+            },
+            {
+              name: 'HCL浓度(ppm)',
+              prop: 'trendMmin trendMax',
+              width: '180px',
+            },
+            {
+              name: '设备升温(△T/△t)',
+              prop: 'trendMmin trendMax',
+              width: '180px',
+            },
+            {
+              name: '其他',
+              prop: '',
+              width: '180px',
+            },
+            {
+              name: '操作',
+              prop: 'warnType',
+              width: '180px',
+            },
+          ],
+          otherProps: {
+            title: '火灾风险预警',
+            prop: 'status',
           },
         },
       ],
-      // mock: BDfireMock,
     },
     showStyle: {
-      size: 'width:440px;height:850px;',
+      size: 'width:1030px;height:300px;',
       version: '原版',
-      position: 'top:0px;right:25px;',
+      position: 'bottom:25px;left:445px;',
     },
   },
 ];
@@ -1127,6 +1324,68 @@ export const testYjkf: Config[] = [
       position: 'top:30px;left:25px;',
     },
   },
+
+  {
+    deviceType: '',
+    moduleName: '摄像头视频信号',
+    pageType: 'beltYjkf',
+    moduleData: {
+      header: {
+        show: false,
+        readFrom: '',
+        selector: {
+          show: false,
+          value: '${beltName}',
+        },
+        slot: {
+          show: false,
+          value: '',
+        },
+      },
+      background: {
+        show: false,
+        type: 'video',
+        link: '',
+      },
+      layout: {
+        direction: 'row',
+        items: [
+          {
+            name: 'cameraList',
+            basis: '100%',
+          },
+        ],
+      },
+      board: [],
+      chart: [],
+      gallery: [],
+      gallery_list: [],
+      table: [],
+      list: [],
+      complex_list: [],
+      preset: [
+        {
+          readFrom: 'deviceInfo.gate.datalist',
+          config: {
+            title: 'name',
+            contents: [
+              {
+                code: '',
+                value: '',
+                info: '',
+              },
+            ],
+          },
+        },
+      ],
+      // mock: BDfireMock,
+    },
+    showStyle: {
+      size: 'width:440px;height:850px;',
+      version: '原版',
+      position: 'top:0px;right:25px;',
+    },
+  },
   {
     deviceType: 'warn_result',
     moduleName: '预警结果',
@@ -1212,15 +1471,15 @@ export const testYjkf: Config[] = [
     },
   },
   {
-    deviceType: '',
-    moduleName: '摄像头视频信号',
-    pageType: 'beltYjkf',
+    deviceType: 'warnInfo',
+    moduleName: '预警指标',
+    pageType: 'fireMonitorMid',
     moduleData: {
       header: {
         show: false,
         readFrom: '',
         selector: {
-          show: false,
+          show: true,
           value: '${beltName}',
         },
         slot: {
@@ -1234,10 +1493,10 @@ export const testYjkf: Config[] = [
         link: '',
       },
       layout: {
-        direction: 'row',
+        direction: 'column',
         items: [
           {
-            name: 'cameraList',
+            name: 'warning_result',
             basis: '100%',
           },
         ],
@@ -1251,25 +1510,62 @@ export const testYjkf: Config[] = [
       complex_list: [],
       preset: [
         {
-          readFrom: 'deviceInfo.gate.datalist',
-          config: {
-            title: 'name',
-            contents: [
-              {
-                code: '',
-                value: '',
-                info: '',
-              },
-            ],
+          readFrom: '',
+          type: 'C',
+          tableReadFrom: 'warnInfo',
+          columns: [
+            {
+              name: '级别名称',
+              prop: 'warnType',
+              width: '180px',
+            },
+            {
+              name: 'CO浓度(ppm)',
+              prop: 'fmin fmax',
+              width: '180px',
+            },
+            {
+              name: '温度(环境)',
+              prop: 'status',
+              width: '180px',
+            },
+            {
+              name: 'CO变化率(ppm/min)',
+              prop: 'trendMmin trendMax',
+              width: '220px',
+            },
+            {
+              name: 'HCL浓度(ppm)',
+              prop: 'trendMmin trendMax',
+              width: '180px',
+            },
+            {
+              name: '设备升温(△T/△t)',
+              prop: 'trendMmin trendMax',
+              width: '180px',
+            },
+            {
+              name: '其他',
+              prop: '',
+              width: '180px',
+            },
+            {
+              name: '操作',
+              prop: 'warnType',
+              width: '180px',
+            },
+          ],
+          otherProps: {
+            title: '火灾风险预警',
+            prop: 'status',
           },
         },
       ],
-      // mock: BDfireMock,
     },
     showStyle: {
-      size: 'width:440px;height:850px;',
+      size: 'width:1030px;height:300px;',
       version: '原版',
-      position: 'top:0px;right:25px;',
+      position: 'bottom:25px;left:445px;',
     },
   },
 ];

+ 2 - 4
src/views/vent/home/configurable/components/belt/ComplexList1Belt.vue

@@ -1,8 +1,6 @@
-<!-- eslint-disable vue/multi-word-component-names -->
 <template>
   <div class="list flex items-center" :class="`list_${type}`">
     <div class="flex-grow" :class="`list_wrapper_${type}`">
-      <!-- 遍历每一组传感器数据 -->
       <div v-for="(item, i) in listConfig" :key="`customlist${i}`" class="list-item" :class="`list-item_${type}`">
         <div
           v-for="(ctx, j) in item.contents"
@@ -66,7 +64,7 @@ const alarmMap: Record<string | number | null, string> = {
 
 // 获取背景样式
 const getBgClass = (riskLevel: string | number | null) => {
-  // 统一处理 null  0
+  // 统一处理 null  0
   const val = riskLevel ?? '0';
 
   switch (val) {
@@ -92,7 +90,7 @@ const handleItemClick = (ctx) => {
   emit('clickItem', ctx);
 };
 
-// 获取预警名称(核心修复)
+// 获取预警名称
 const getAlertName = (riskLevel: string | number | null) => {
   // 空值:null / undefined / 空字符串 → 正常
   if (riskLevel === null || riskLevel === undefined || riskLevel === '') {

+ 9 - 20
src/views/vent/home/configurable/components/belt/ComplexListBelt.vue

@@ -2,22 +2,18 @@
 <template>
   <div class="list flex items-center" :class="`list_${type}`">
     <div class="flex-grow" :class="`list_wrapper_${type}`">
-      <!-- 👇 核心修改点:增加 v-if 判断 -->
-      <div v-if="listConfig && listConfig.length > 0">
-        <!-- 遍历每一组传感器数据 -->
-        <div v-for="(item, i) in listConfig" :key="`customlist${i}`" class="list-item" :class="`list-item_${type}`">
-          <div v-for="(ctx, j) in item.contents" :key="`vvhccdclc${j}`" :class="`list-item__content_${type}`">
-            <div class="item-top">
-              <div class="sensor-icon"></div>
-              <div class="risk-text">{{ getAlertName(ctx.value) }}</div>
-            </div>
-            <div class="item-bottom">
-              {{ ctx.label }}
-            </div>
+      <!-- 遍历每一组传感器数据 -->
+      <div v-for="(item, i) in listConfig" :key="`customlist${i}`" class="list-item" :class="`list-item_${type}`">
+        <div v-for="(ctx, j) in item.contents" :key="`vvhccdclc${j}`" :class="`list-item__content_${type}`">
+          <div class="item-top">
+            <div class="sensor-icon"></div>
+            <div class="risk-text">{{ getAlertName(ctx.value) }}</div>
+          </div>
+          <div class="item-bottom">
+            {{ ctx.label }}
           </div>
         </div>
       </div>
-      <div v-else class="no-data"> 暂无数据 </div>
     </div>
   </div>
 </template>
@@ -159,11 +155,4 @@ onMounted(() => {});
   line-height: 1.2;
   width: 100%;
 }
-.no-data {
-  padding: 20px;
-  width: 100%;
-  text-align: center;
-  color: #999;
-  font-size: 16px;
-}
 </style>

+ 15 - 63
src/views/vent/home/configurable/components/belt/WarningResultList.vue

@@ -11,11 +11,11 @@
           </tr>
         </thead>
         <tbody>
-          <tr v-for="(row, index) in data[config.tableReadFrom]" :key="index" class="table-row">
+          <!-- 给 tr 绑定行样式 -->
+          <tr v-for="(row, index) in data[config.tableReadFrom]" :key="index" class="table-row" :class="getRowStatusClass(row.status)">
             <td v-for="col in config.columns" :key="col.prop" class="table-cell">
-              <!-- 渲染逻辑:如果是 status 字段,自动变色 -->
               <span v-if="col.render" v-html="col.render(row, index)"></span>
-              <span v-else-if="col.prop === 'status'" :class="getStatusClass(row[col.prop])">
+              <span v-else-if="col.prop === 'status'">
                 {{ row[col.prop] || '-' }}
               </span>
               <span v-else>{{ row[col.prop] || '-' }}</span>
@@ -28,8 +28,7 @@
 </template>
 
 <script setup lang="ts">
-import { onMounted, ref } from 'vue';
-
+import { onMounted } from 'vue';
 const props = defineProps<{
   config: {
     tableReadFrom: string;
@@ -49,13 +48,13 @@ const props = defineProps<{
   };
 }>();
 
-// 根据 status 返回对应的样式类
-function getStatusClass(status: string) {
+// 给整行添加颜色样式
+function getRowStatusClass(status: string) {
   if (!status) return '';
-  if (status.includes('黄色预警')) return 'status-yellow';
-  if (status.includes('橙色预警')) return 'status-orange';
-  if (status.includes('红色预警')) return 'status-red';
-  return 'status-default';
+  if (status.includes('黄色预警')) return 'row-status-yellow';
+  if (status.includes('橙色预警')) return 'row-status-orange';
+  if (status.includes('红色预警')) return 'row-status-red';
+  return '';
 }
 
 onMounted(() => {});
@@ -80,6 +79,7 @@ onMounted(() => {});
   flex: 1;
   overflow-y: auto;
   -webkit-overflow-scrolling: touch;
+  padding: 0px 15px;
 }
 
 .warning-table {
@@ -119,27 +119,23 @@ thead tr {
 :deep(.table-cell) {
   padding: 8px;
   font-size: 14px;
-  color: #fff;
   vertical-align: middle;
   text-align: center !important;
 }
 
-/* ====================== 预警类型 ====================== */
-.status-yellow {
+/* ====================== 整行预警颜色 ====================== */
+.row-status-yellow {
   color: #ffd700 !important;
   font-weight: bold;
 }
-.status-orange {
+.row-status-orange {
   color: #ff9500 !important;
   font-weight: bold;
 }
-.status-red {
+.row-status-red {
   color: #ff3333 !important;
   font-weight: bold;
 }
-.status-default {
-  color: #ffffff !important;
-}
 
 /* 操作列按钮样式 */
 :deep(.btn-start-spray) {
@@ -153,48 +149,4 @@ thead tr {
   font-weight: bold;
   transition: all 0.2s;
 }
-
-/* ====================== 开关滑块样式 ====================== */
-:deep(.tip) {
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  gap: 8px;
-}
-
-:deep(.text),
-:deep(.text1) {
-  font-size: 12px;
-  color: #fff;
-}
-
-:deep(.toggle-switch) {
-  position: relative;
-  display: inline-block;
-  width: 36px;
-  height: 18px;
-  background-color: #ccc;
-  border-radius: 18px;
-  cursor: pointer;
-  transition: background-color 0.3s;
-}
-
-:deep(.toggle-switch.is-on) {
-  background-color: #2192d9;
-}
-
-:deep(.slider) {
-  position: absolute;
-  top: 2px;
-  left: 2px;
-  width: 14px;
-  height: 14px;
-  background-color: white;
-  border-radius: 50%;
-  transition: transform 0.3s;
-}
-
-:deep(.toggle-switch.is-on .slider) {
-  transform: translateX(18px);
-}
 </style>

+ 0 - 1
src/views/vent/home/configurable/hooks/useInit.ts

@@ -309,7 +309,6 @@ export function useInitPage(title: string) {
   }
 
   function updateData(d: any) {
-    console.log(d, '------');
     data.value = d;
   }