Ver Fonte

Merge branch 'master' of http://182.92.126.35:3000/hrx/mky-vent-base

lxh há 5 meses atrás
pai
commit
51e4880096
29 ficheiros alterados com 2072 adições e 1316 exclusões
  1. 1 1
      .env.development
  2. 1 1
      src/hooks/system/useCamera.ts
  3. 1 1
      src/layouts/default/header/components/VoiceBroadcast.vue
  4. 1 1
      src/layouts/default/header/index.vue
  5. 2 9
      src/qiankun/index.ts
  6. 1 1
      src/router/guard/index.ts
  7. 1 0
      src/router/guard/paramMenuGuard.ts
  8. 1 0
      src/router/guard/permissionGuard.ts
  9. 7 5
      src/views/vent/gas/gasHome/index.vue
  10. 2 2
      src/views/vent/home/billboard/billboard.data.ts
  11. 210 210
      src/views/vent/home/clique/dustComponents/measure-point.vue
  12. 460 454
      src/views/vent/home/colliery/index.vue
  13. 409 410
      src/views/vent/monitorManager/alarmMonitor/common/fireWork.vue
  14. 1 1
      src/views/vent/monitorManager/alarmMonitor/index.vue
  15. 5 5
      src/views/vent/monitorManager/comment/DeviceEcharts.vue
  16. 1 4
      src/views/vent/monitorManager/compressor/components/nitrogenHome_dltj.vue
  17. 17 5
      src/views/vent/monitorManager/compressor/nitrogen.data.dlt1.ts
  18. 0 113
      src/views/vent/monitorManager/gateMonitor/gate.threejs.qd.ts
  19. 41 4
      src/views/vent/monitorManager/gateMonitor/gate.threejs.ts
  20. 507 0
      src/views/vent/monitorManager/gateMonitor/gate.threejs.window.ts
  21. 0 56
      src/views/vent/monitorManager/gateMonitor/gate.threejs.yy.ts
  22. 27 7
      src/views/vent/monitorManager/gateMonitor/index.vue
  23. 35 4
      src/views/vent/monitorManager/mainFanMonitor/components/conditionAssistance.vue
  24. 18 3
      src/views/vent/monitorManager/mainFanMonitor/main.data.ts
  25. 292 7
      src/views/vent/monitorManager/nitrogen/components/nitrogenHomeBLT.vue
  26. 1 0
      src/views/vent/monitorManager/safetyMonitor/index.vue
  27. 17 9
      src/views/vent/monitorManager/windowMonitor/index.vue
  28. 1 1
      src/views/vent/monitorManager/windowMonitor/window.threejs.ts
  29. 12 2
      src/views/vent/monitorManager/windrectMonitor/index.vue

+ 1 - 1
.env.development

@@ -29,5 +29,5 @@ VITE_GLOB_API_URL_PREFIX=
 #微前端qiankun应用,命名必须以VITE_APP_SUB_开头,jeecg-app-1为子应用的项目名称,也是子应用的路由父路径
 #VITE_APP_SUB_APP = [["micro-need-air", "//10.10.150.72:8099/"], ["micro-vent-3dModal", "//localhost:8091/"], ["micro-fire-front", "//localhost:8090/"]]
 VITE_APP_SUB_APP = [["micro-vent-3dModal", "//192.168.183.154:8091/", "micro-vent-3dModal"], ["micro-need-air", "//localhost:8099/", "micro-need-air"], ["micro-fire-front", "//localhost:8097/", "fire-Micro"]]
-# VITE_APP_SUB_APP = [["micro-vent-3dModal", "//localhost:8091/", "micro-vent-3dModal"], ["micro-need-air", "//localhost:8099/", "micro-need-air"], ["micro-fire-front", "//localhost:8097/", "fire-Micro"]]
+# VITE_APP_SUB_APP = [["micro-vent-3dModal", "//182.92.126.35:8091/", "micro-vent-3dModal"], ["micro-need-air", "//182.92.126.35:8099/", "micro-need-air"], ["micro-fire-front", "//182.92.126.35:8097/", "fire-Micro"]]
 # VITE_APP_SUB_APP = [["micro-vent-3dModal", "//localhost:8091/"], ["micro-need-air", "//localhost:8099/"], ["micro-fire-front", "//localhost:8090/"]]

+ 1 - 1
src/hooks/system/useCamera.ts

@@ -107,7 +107,7 @@ export function useCamera() {
       const playCamrea = () => {
         if (cameraAddrs.length > 0) {
           const promiseList: Promise<any>[] = [];
-          debugger;
+          // debugger;
           cameraAddrs.forEach(async (cameraUrl: { name: string; addr: string; cameraRate: number; devicekind: string }, index) => {
             const promise = new Promise(async (childResolve) => {
               let cameraNameDom: null | HTMLElement = null;

+ 1 - 1
src/layouts/default/header/components/VoiceBroadcast.vue

@@ -62,7 +62,7 @@
     components: { Icon, Tooltip, Badge, SoundOutlined, BellOutlined, WarningOutlined },
 
     setup() {
-      debugger;
+      // debugger;
       let speakVoice;
       const userStore = useUserStore();
       const glob = useGlobSetting();

+ 1 - 1
src/layouts/default/header/index.vue

@@ -56,7 +56,7 @@
   <div :class="`${prefixCls}-action`" style="position: fixed; top: 30px; right: 20px; z-index: 999999">
     <div class="right-position">
       <!-- 公司端不显示语音播报功能 -->
-      <VoiceBroadcast v-if="sysOrgCode == 'sdmtjtgsd'" />
+      <VoiceBroadcast v-if="sysOrgCode != 'sdmtjtgsd'" />
       <UserDropDown v-if="showUserDropdown" :theme="getHeaderTheme" />
       <LoginSelect ref="loginSelectRef" @success="loginSelectOk" />
     </div>

+ 2 - 9
src/qiankun/index.ts

@@ -32,6 +32,7 @@ const mountMicroApp = (path, toPath?) => {
       activeApps[app['activeRule']] = null;
       delete activeApps[app['activeRule']];
     }
+    // debugger;
     const instance = activeApps[app['activeRule']];
     console.log('子应用实例--------------->', instance);
     if (instance) {
@@ -54,15 +55,6 @@ const mountMicroApp = (path, toPath?) => {
               credentials: 'include',
             });
           }
-          // return window.fetch(url, {
-          //   ...args,
-          //   headers: {
-          //     // 'Access-Control-Allow-Origin': '*',
-          //     'Content-Type': 'text/plain',
-          //   },
-          //   mode: 'cors',
-          //   credentials: 'include',
-          // });
           return window.fetch(url, ...args);
         },
       }); // 手动加载子应用
@@ -72,6 +64,7 @@ const mountMicroApp = (path, toPath?) => {
 
 // 卸载app的方法
 const unmountMicroApps = (multipleApp) => {
+  debugger;
   if (JSON.stringify(activeApps) !== '{}' && multipleApp.some) {
     for (const key in activeApps) {
       const isExist = multipleApp.some((name) => name == key);

+ 1 - 1
src/router/guard/index.ts

@@ -37,7 +37,7 @@ RootRoute.redirect = glob.homePath || PageEnum.BASE_HOME;
  */
 function createPageGuard(router: Router) {
   const loadedPageMap = new Map<string, boolean>();
-
+  // debugger;
   router.beforeEach(async (to, from) => {
     if (from.path.startsWith('/micro-') && !to.path.startsWith('/micro-')) {
       unmountMicroApps(['/' + from.path.split('/')[1]]);

+ 1 - 0
src/router/guard/paramMenuGuard.ts

@@ -8,6 +8,7 @@ import { usePermissionStoreWithOut } from '/@/store/modules/permission';
 
 export function createParamMenuGuard(router: Router) {
   const permissionStore = usePermissionStoreWithOut();
+  // debugger;
   router.beforeEach(async (to, _, next) => {
     // filter no name route
     if (!to.name) {

+ 1 - 0
src/router/guard/permissionGuard.ts

@@ -39,6 +39,7 @@ const whitePathList: PageEnum[] = [LOGIN_PATH, OAUTH2_LOGIN_PAGE_PATH, SYS_FILES
 const glob = useGlobSetting();
 
 export function createPermissionGuard(router: Router) {
+  // debugger;
   const userStore = useUserStoreWithOut();
   const permissionStore = usePermissionStoreWithOut();
   const { doAutoLogin, doTokenLogin, validateRoute, tokenValidateRoute } = useAutoLogin();

+ 7 - 5
src/views/vent/gas/gasHome/index.vue

@@ -1,20 +1,20 @@
 <!-- eslint-disable vue/multi-word-component-names -->
 <template>
+  <VentModal style="position: absolute; width: 100%; height: 100%" />
   <div class="scene-box">
     <customHeader> 瓦斯抽采综合管控系统 </customHeader>
     <CustomBadges class="w-1710px ml-100px mt-50px" :badges="headerBadges" />
     <GasMonitor v-if="dataSource" :dataSource="dataSource" />
   </div>
-  <VentModal style="z-index: 0" />
 </template>
 <script lang="ts" setup>
-  import { ref, onMounted } from 'vue';
+  import { ref, onBeforeMount, onBeforeUnmount } from 'vue';
   import CustomHeader from '/@/components/vent/customHeader.vue';
   import CustomBadges from './components/customHeader.vue';
   import GasMonitor from './components/gasMonitor.vue';
   import VentModal from '/@/components/vent/micro/ventModal.vue';
   import { gasSystem } from './gasHome.api';
-  const activeKey = ref('gasHome');
+  import { unmountMicroApps } from '/@/qiankun';
   const dataSource = ref<any | null>(null);
 
   const headerBadges = ref([
@@ -44,10 +44,12 @@
     },
   ]);
 
-  onMounted(async () => {
-    debugger;
+  onBeforeMount(async () => {
     dataSource.value = await gasSystem();
   });
+  onBeforeUnmount(() => {
+    unmountMicroApps(['/micro-vent-3dModal']);
+  });
 </script>
 
 <style lang="less" scoped>

+ 2 - 2
src/views/vent/home/billboard/billboard.data.ts

@@ -395,12 +395,12 @@ export const VENTILATION_STATUS_TREE_CONFIG = {
       suffix: '(m³/min)',
     },
     {
-      prefix: '风机风压',
+      prefix: '风机风压',
       prop: 'fy_merge',
       suffix: '(Pa)',
     },
     {
-      prefix: '风机漏风率',
+      prefix: '风机漏风率',
       prop: 'leakage',
       suffix: '%',
     },

+ 210 - 210
src/views/vent/home/clique/dustComponents/measure-point.vue

@@ -9,249 +9,249 @@
   </div>
 </template>
 <script lang="ts" setup>
-// 该组件和wind-road组件基本上一摸一样,只不过该组件是适配首页中间的卡片而做的
-import { ref, reactive, nextTick, defineProps, watch, onMounted } from 'vue';
-import { SvgIcon } from '/@/components/Icon';
-import * as echarts from 'echarts';
-import { useRouter } from 'vue-router';
+  // 该组件和wind-road组件基本上一摸一样,只不过该组件是适配首页中间的卡片而做的
+  import { ref, reactive, nextTick, defineProps, watch, onMounted } from 'vue';
+  import { SvgIcon } from '/@/components/Icon';
+  import * as echarts from 'echarts';
+  import { useRouter } from 'vue-router';
 
-let props = defineProps({
-  measureData: {
-    type: Object,
-    default: () => {
-      return {};
+  let props = defineProps({
+    measureData: {
+      type: Object,
+      default: () => {
+        return {};
+      },
     },
-  },
-});
-const roadTitle = '监测点位统计与分析';
-const measureRef = ref();
-let router = useRouter(); //路由
-// let xData = ref<any[]>([]);
-// let yData = ref<any[]>([]);
-// let maxData = reactive<any[]>([]);
+  });
+  const roadTitle = '监测点位统计与分析';
+  const measureRef = ref();
+  let router = useRouter(); //路由
+  // let xData = ref<any[]>([]);
+  // let yData = ref<any[]>([]);
+  // let maxData = reactive<any[]>([]);
 
-function getOption() {
-  nextTick(() => {
-    const myChart = echarts.init(measureRef.value);
-    // let color = ['#FF9A22', '#FFD56E', '#00EC28', '#5DF076', '#12B9DB', '#6F8EF2'];
-    let option = {
-      tooltip: {
-        trigger: 'axis',
-        axisPointer: {
-          type: 'shadow',
+  function getOption() {
+    nextTick(() => {
+      const myChart = echarts.init(measureRef.value);
+      // let color = ['#FF9A22', '#FFD56E', '#00EC28', '#5DF076', '#12B9DB', '#6F8EF2'];
+      let option = {
+        tooltip: {
+          trigger: 'axis',
+          axisPointer: {
+            type: 'shadow',
+          },
         },
-      },
-      legend: {
-        textStyle: {
-          color: '#ffffff', // 字体颜色
+        legend: {
+          textStyle: {
+            color: '#ffffff', // 字体颜色
+          },
         },
-      },
-      grid: {
-        top: '40',
-        left: '10',
-        bottom: '10',
-        right: '10',
-        containLabel: true,
-      },
-      xAxis: {
-        type: 'category',
-        data: [
-          '柳塔矿',
-          '寸草塔二矿',
-          '布尔台矿',
-          '乌兰木伦矿',
-          '寸草塔矿',
-          '石圪台矿',
-          '补连塔矿',
-          '哈拉沟矿',
-          '上湾矿',
-          '活鸡兔井',
-          '大柳塔井',
-          '锦界矿',
-          '榆家梁矿',
-          '保德矿',
-        ],
-        // data: [5, 7, 5, 8, 10, 6, 9, 11, 6, 7, 4, 8, 9, 7],
-        //data: [0, 1, 0, 0, 2, 0, 1, 0, 0, 0, 0, 1, 2, 0],
-        axisLabel: {
-          show: true,
-          color: '#ffffff',
-          rotate: 0,
-          formatter: function (params) {
-            let newParamsName = '';
-            const paramsNameNumber = params.length;
-            const provideNumber = 3; // 单行显示文字个数
-            const rowNumber = Math.ceil(paramsNameNumber / provideNumber);
-            if (paramsNameNumber > provideNumber) {
-              for (let p = 0; p < rowNumber; p++) {
-                let tempStr = '';
-                const start = p * provideNumber;
-                const end = start + provideNumber;
-                if (p === rowNumber - 1) {
-                  tempStr = params.substring(start, paramsNameNumber);
-                } else {
-                  tempStr = params.substring(start, end) + '\n';
+        grid: {
+          top: '40',
+          left: '10',
+          bottom: '10',
+          right: '10',
+          containLabel: true,
+        },
+        xAxis: {
+          type: 'category',
+          data: [
+            '柳塔矿',
+            '寸草塔二矿',
+            '布尔台矿',
+            '乌兰木伦矿',
+            '寸草塔矿',
+            '石圪台矿',
+            '补连塔矿',
+            '哈拉沟矿',
+            '上湾矿',
+            '活鸡兔井',
+            '大柳塔井',
+            '锦界矿',
+            '榆家梁矿',
+            '保德矿',
+          ],
+          // data: [5, 7, 5, 8, 10, 6, 9, 11, 6, 7, 4, 8, 9, 7],
+          //data: [0, 1, 0, 0, 2, 0, 1, 0, 0, 0, 0, 1, 2, 0],
+          axisLabel: {
+            show: true,
+            color: '#ffffff',
+            rotate: 0,
+            formatter: function (params) {
+              let newParamsName = '';
+              const paramsNameNumber = params.length;
+              const provideNumber = 3; // 单行显示文字个数
+              const rowNumber = Math.ceil(paramsNameNumber / provideNumber);
+              if (paramsNameNumber > provideNumber) {
+                for (let p = 0; p < rowNumber; p++) {
+                  let tempStr = '';
+                  const start = p * provideNumber;
+                  const end = start + provideNumber;
+                  if (p === rowNumber - 1) {
+                    tempStr = params.substring(start, paramsNameNumber);
+                  } else {
+                    tempStr = params.substring(start, end) + '\n';
+                  }
+                  newParamsName += tempStr;
                 }
-                newParamsName += tempStr;
+              } else {
+                newParamsName = params;
               }
-            } else {
-              newParamsName = params;
-            }
-            return newParamsName;
+              return newParamsName;
+            },
           },
+          // data: xData.value,
         },
-        // data: xData.value,
-      },
-      yAxis: [
-        {
-          type: 'value',
-          max:20,
-          splitLine: {
-            lineStyle: {
-              color: 'rgba(21,80,126,.3)',
-              type: 'dashed', //设置网格线类型 dotted:虚线   solid:实线
+        yAxis: [
+          {
+            type: 'value',
+            max: 20,
+            splitLine: {
+              lineStyle: {
+                color: 'rgba(21,80,126,.3)',
+                type: 'dashed', //设置网格线类型 dotted:虚线   solid:实线
+              },
+              // show: item.linetype == 'line' ? true : false,
+              show: true,
             },
-            // show: item.linetype == 'line' ? true : false,
-            show: true,
           },
-        },
-      ],
+        ],
 
-      series: [
-        {
-          name: '测点异常数',
-          type: 'bar',
-          stack: 'Ad',
-          barMaxWidth: '24',
-          emphasis: {
-            focus: 'series',
-          },
-          itemStyle: {
-            color: '#F56731',
-          },
-          label: {
-            show: true,
-            formatter: (params) => (params.value > 0 ? params.value : ''),
-          },
-          data: [0, 1, 0, 0, 2, 0, 1, 0, 0, 0, 0, 1, 2, 0],
-        },
-        {
-          name: '测点正常数',
-          type: 'bar',
-          stack: 'Ad',
-          barMaxWidth: '24',
-          emphasis: {
-            focus: 'series',
-          },
-          itemStyle: {
-            color: '#00E8FFBB',
+        series: [
+          {
+            name: '测点异常数',
+            type: 'bar',
+            stack: 'Ad',
+            barMaxWidth: '24',
+            emphasis: {
+              focus: 'series',
+            },
+            itemStyle: {
+              color: '#F56731',
+            },
+            label: {
+              show: true,
+              formatter: (params) => (params.value > 0 ? params.value : ''),
+            },
+            data: [0, 1, 0, 0, 2, 0, 1, 0, 0, 0, 0, 1, 2, 0],
           },
+          {
+            name: '测点正常数',
+            type: 'bar',
+            stack: 'Ad',
+            barMaxWidth: '24',
+            emphasis: {
+              focus: 'series',
+            },
+            itemStyle: {
+              color: '#00E8FFBB',
+            },
 
-          label: {
-            show: true,
-            textStyle: {
-              //数值样式
-              color: '#000',
+            label: {
+              show: true,
+              textStyle: {
+                //数值样式
+                color: '#000',
+              },
             },
+            data: [5, 6, 5, 8, 8, 6, 8, 11, 6, 7, 4, 7, 7, 7],
           },
-          data: [5, 6, 5, 8, 8, 6, 8, 11, 6, 7, 4, 7, 7, 7],
-        },
-        {
-          name: '',
-          type: 'bar',
-          // stack: 'Ad',
-          barGap: '-100%',
-          barMaxWidth: '24',
-          z: 1,
-          emphasis: {
-            focus: 'series',
-          },
-          itemStyle: {
-            color: '#00E8FF00',
-          },
-          tooltip: {
-            show: false,
-          },
-          label: {
-            show: true,
-            position: 'top', //在上方显示
-            textStyle: {
-              //数值样式
-              color: '#fff',
-              fontSize: 14,
+          {
+            name: '',
+            type: 'bar',
+            // stack: 'Ad',
+            barGap: '-100%',
+            barMaxWidth: '24',
+            z: 1,
+            emphasis: {
+              focus: 'series',
+            },
+            itemStyle: {
+              color: '#00E8FF00',
+            },
+            tooltip: {
+              show: false,
             },
+            label: {
+              show: true,
+              position: 'top', //在上方显示
+              textStyle: {
+                //数值样式
+                color: '#fff',
+                fontSize: 14,
+              },
+            },
+            data: [5, 7, 5, 8, 10, 6, 9, 11, 6, 7, 4, 8, 9, 7],
           },
-          data: [5, 7, 5, 8, 10, 6, 9, 11, 6, 7, 4, 8, 9, 7],
-        },
-      ],
-    };
-    myChart.setOption(option);
-    // 监听柱状图的点击事件
-    myChart.on('click', function (params) {
-      if (params.componentType === 'series') {
-        // alert('您点击的是第 ' + (params.dataIndex + 1) + ' 个柱子,其值为 ' + params.value);
-        router.push('/micro-vent-3dModal/dashboard/analysis?type=tunMonitor&deviceType=dusting')
-      }
+        ],
+      };
+      myChart.setOption(option);
+      // 监听柱状图的点击事件
+      myChart.on('click', function (params) {
+        if (params.componentType === 'series') {
+          // alert('您点击的是第 ' + (params.dataIndex + 1) + ' 个柱子,其值为 ' + params.value);
+          router.push('/micro-vent-3dModal/dashboard/analysis?type=tunMonitor&deviceType=dusting');
+        }
+      });
+      window.onresize = function () {
+        myChart.resize();
+      };
     });
-    window.onresize = function () {
-      myChart.resize();
-    };
-  });
-}
+  }
 
-watch(
-  () => props.measureData,
-  (newV, oldV) => {
-    if (JSON.stringify(newV) != '{}') {
-      getOption();
+  watch(
+    () => props.measureData,
+    (newV, oldV) => {
+      if (JSON.stringify(newV) != '{}') {
+        getOption();
+      }
+    },
+    {
+      immediate: true,
+      deep: true,
     }
-  },
-  {
-    immediate: true,
-    deep: true,
-  }
-);
-onMounted(() => {
-  getOption();
-});
+  );
+  onMounted(() => {
+    getOption();
+  });
 </script>
 <style lang="less" scoped>
-@font-face {
-  font-family: 'douyuFont';
-  src: url('../../../../assets/font/douyuFont.otf');
-}
-
-.measure-point {
-  width: 100%;
-  height: 100%;
-  position: relative;
-
-  .title {
-    position: absolute;
-    left: 50px;
-    top: 10px;
-    color: #fff;
+  @font-face {
     font-family: 'douyuFont';
-    font-size: 14px;
+    src: url('../../../../assets/font/douyuFont.otf');
   }
 
-  .measure-content {
-    // width: 100%;
-    // position: relative;
+  .measure-point {
+    width: 100%;
     height: 100%;
-    padding: 42px 40px 15px 40px;
-    box-sizing: border-box;
+    position: relative;
 
-    .echart-box {
-      // position: absolute;
-      width: 100%;
+    .title {
+      position: absolute;
+      left: 50px;
+      top: 10px;
+      color: #fff;
+      font-family: 'douyuFont';
+      font-size: 14px;
+    }
+
+    .measure-content {
+      // width: 100%;
+      // position: relative;
       height: 100%;
+      padding: 42px 40px 15px 40px;
+      box-sizing: border-box;
 
-      .measure {
+      .echart-box {
+        // position: absolute;
         width: 100%;
         height: 100%;
+
+        .measure {
+          width: 100%;
+          height: 100%;
+        }
       }
     }
   }
-}
 </style>

+ 460 - 454
src/views/vent/home/colliery/index.vue

@@ -7,8 +7,9 @@
           <span>{{ nowTimeWeek }}</span>
           <span>{{ nowTime }}</span>
         </div>
-        <div class="main-title"><img v-if="hasPermission('home:logo')" class="logo"
-            :src="`${baseUrl}/sys/common/static/${logoUrl}`" />{{ title }}</div>
+        <div class="main-title"
+          ><img v-if="hasPermission('home:logo')" class="logo" :src="`${baseUrl}/sys/common/static/${logoUrl}`" />{{ title }}</div
+        >
       </div>
       <div class="home-contents">
         <div class="left-content">
@@ -46,8 +47,10 @@
               <!-- <div class="btn-icon" @click="goModalDetail"></div> -->
               <!-- 展会不显示按钮 -->
               <div v-if="sysOrgCode !== 'mkyzhpt'" class="btn-icon" @click="goModalDetail"></div>
-              <VentModal ref="centerModalRef"
-                style="width: calc(100% - 30px); height: calc(100% - 30px); position: absolute; background-color: #fff" />
+              <VentModal
+                ref="centerModalRef"
+                style="width: calc(100% - 30px); height: calc(100% - 30px); position: absolute; background-color: #fff"
+              />
             </div>
           </div>
           <!-- 风量监测 -->
@@ -72,520 +75,523 @@
       </div>
     </div>
   </div>
-  <Network ref="NetworkRef" v-if="pageType == 'timesolution'" :pageResult="pageResult" @changePageType="changePageType"
-    style="position: absolute" />
-  <VentModal v-if="pageType == 'model3D' || pageType == 'timesolution'" ref="fullModalRef"
-    style="width: calc(100% - 30px); height: calc(100% - 30px); position: absolute" />
+  <Network ref="NetworkRef" v-if="pageType == 'timesolution'" :pageResult="pageResult" @changePageType="changePageType" style="position: absolute" />
+  <VentModal
+    v-if="pageType == 'model3D' || pageType == 'timesolution'"
+    ref="fullModalRef"
+    style="width: calc(100% - 30px); height: calc(100% - 30px); position: absolute"
+  />
 </template>
 <script lang="ts" setup>
-import { reactive, onMounted, ref, nextTick, computed, unref, inject, onBeforeUnmount, onUnmounted } from 'vue';
-import fanMonitor from './components/fan-monitor.vue';
-import mainMonitor from './components/main-monitor.vue';
-import windDevice from './components/wind-device.vue';
-import windMonitor from './components/wind-monitor.vue';
-import windLine from './components/wind-line.vue';
-import workMonitor from './components/work-monitor.vue';
-import deviceWarn from './components/device-warn.vue';
-import { useGlobSetting } from '/@/hooks/setting';
-import { list } from './clique.api';
-import Network from '../../monitorManager/deviceMonitor/components/network/index.vue';
-import { useRouter } from 'vue-router';
-import { router } from '/@/router';
-// import { Modal } from 'ant-design-vue';
-// import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
-import dayjs from 'dayjs';
-import { getActions } from '/@/qiankun/state';
-import { unmountMicroApps, mountMicroApp } from '/@/qiankun';
-import { getDate } from './clique.data';
-import VentModal from '/@/components/vent/micro/ventModal.vue';
-import { usePermission } from '/@/hooks/web/usePermission';
-
-const { currentRoute } = useRouter();
-const { hasPermission } = usePermission();
-
-const { title, logoUrl, sysOrgCode } = useGlobSetting();
-const baseUrl = VUE_APP_URL.baseUrl;
-const actions = getActions();
-let timer: NodeJS.Timeout | null = null;
-let fanLocalList = reactive<any[]>([]); //局部风机数据
-let mainList = ref<any[]>([]); //主通风机数据
-let centerList = reactive<any[]>([]); //中间区域数据
-let flList = ref<any[]>([]); //风量监测数据
-let lineList = ref<any>([]); //关键路线数据
-let workList = ref<any>([]); //工作面数据
-let warnData = ref<any>([]); //预警数据
-let deviceData = ref<any>({}); //设备监测数据
-let navList = reactive([
-  { name: '总回风量(m³/min)', isShow: true, valList: [] },
-  { name: '总进风量(m³/min)', isShow: true, valList: [] },
-  { name: '计划风量(m³/min)', isShow: true, valList: [] },
-  // { name: '有效风量(m³/min)', isShow: true, valList: [] },
-  // { name: '等积孔(m²)', isShow: true, valList: [] },
-  // { name: '外部漏风率', isShow: false, val: 0 },
-  { name: '有效风量率', isShow: false, val: '0%' },
-]);
-let nowTimeYear = ref('');
-let nowTimeWeek = ref('');
-let nowTime = ref('');
-
-const centerModalRef = ref();
-const fullModalRef = ref();
-
-const globSetting = useGlobSetting();
-const pageType = ref('');
-let router = useRouter();
-const pageResult = ref({});
-
-function goDetail(deviceType) {
-  //lxh
-  // pageType.value = deviceType;
-  if (deviceType == 'fanMain') {
-    router.push('/monitorChannel/monitor-fanmain');
-  } else if (deviceType == 'fanLocal') {
-    if (sysOrgCode !== 'ymdnymdn') {
-      router.push('/monitorChannel/monitor-fanlocal');
-    } else {
-      router.push('/fanlocal-page/home');
+  import { reactive, onMounted, ref, nextTick, computed, unref, inject, onBeforeUnmount, onUnmounted } from 'vue';
+  import fanMonitor from './components/fan-monitor.vue';
+  import mainMonitor from './components/main-monitor.vue';
+  import windDevice from './components/wind-device.vue';
+  import windMonitor from './components/wind-monitor.vue';
+  import windLine from './components/wind-line.vue';
+  import workMonitor from './components/work-monitor.vue';
+  import deviceWarn from './components/device-warn.vue';
+  import { useGlobSetting } from '/@/hooks/setting';
+  import { list } from './clique.api';
+  import Network from '../../monitorManager/deviceMonitor/components/network/index.vue';
+  import { useRouter } from 'vue-router';
+  import { router } from '/@/router';
+  // import { Modal } from 'ant-design-vue';
+  // import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
+  import dayjs from 'dayjs';
+  import { getActions } from '/@/qiankun/state';
+  import { unmountMicroApps, mountMicroApp } from '/@/qiankun';
+  import { getDate } from './clique.data';
+  import VentModal from '/@/components/vent/micro/ventModal.vue';
+  import { usePermission } from '/@/hooks/web/usePermission';
+
+  const { currentRoute } = useRouter();
+  const { hasPermission } = usePermission();
+
+  const { title, logoUrl, sysOrgCode } = useGlobSetting();
+  const baseUrl = VUE_APP_URL.baseUrl;
+  const actions = getActions();
+  let timer: NodeJS.Timeout | null = null;
+  let fanLocalList = reactive<any[]>([]); //局部风机数据
+  let mainList = ref<any[]>([]); //主通风机数据
+  let centerList = reactive<any[]>([]); //中间区域数据
+  let flList = ref<any[]>([]); //风量监测数据
+  let lineList = ref<any>([]); //关键路线数据
+  let workList = ref<any>([]); //工作面数据
+  let warnData = ref<any>([]); //预警数据
+  let deviceData = ref<any>({}); //设备监测数据
+  let navList = reactive([
+    { name: '总回风量(m³/min)', isShow: true, valList: [] },
+    { name: '总进风量(m³/min)', isShow: true, valList: [] },
+    { name: '计划风量(m³/min)', isShow: true, valList: [] },
+    // { name: '有效风量(m³/min)', isShow: true, valList: [] },
+    // { name: '等积孔(m²)', isShow: true, valList: [] },
+    // { name: '外部漏风率', isShow: false, val: 0 },
+    { name: '有效风量率', isShow: false, val: '0%' },
+  ]);
+  let nowTimeYear = ref('');
+  let nowTimeWeek = ref('');
+  let nowTime = ref('');
+
+  const centerModalRef = ref();
+  const fullModalRef = ref();
+
+  const globSetting = useGlobSetting();
+  const pageType = ref('');
+  let router = useRouter();
+  const pageResult = ref({});
+
+  function goDetail(deviceType) {
+    //lxh
+    // pageType.value = deviceType;
+    if (deviceType == 'fanMain') {
+      router.push('/monitorChannel/monitor-fanmain');
+    } else if (deviceType == 'fanLocal') {
+      if (sysOrgCode !== 'ymdnymdn') {
+        router.push('/monitorChannel/monitor-fanlocal');
+      } else {
+        router.push('/fanlocal-page/home');
+      }
+    } else if (deviceType == 'windrect') {
+      router.push('/monitorChannel/monitor-windrect');
+    } else if (deviceType == 'warning') {
+      router.push('/monitorChannel/monitor-alarm-home');
     }
-  } else if (deviceType == 'windrect') {
-    router.push('/monitorChannel/monitor-windrect');
-  } else if (deviceType == 'warning') {
-    router.push('/monitorChannel/monitor-alarm-home');
   }
-}
-function goHome() {
-  pageType.value = 'home';
-}
-
-function getList() {
-  list({}).then((res) => {
-    console.log(res, 'res-----------');
-    fanLocalList.length = 0;
-    fanLocalList.push(res.fanlocal);
-    mainList.value = res.fanmain;
-    centerList = res.midinfo[0].sysdata;
-    // 窝兔沟模拟风量
-    // centerList = {
-    //   zongfengliang: "8010", // 总风量
-    //   xufengliang: '7232', // 有效风量
-    //   zonghuifeng: '8188' // 总会风
-    // }
-    // 总回
-    navList[0].valList =
-      centerList && centerList.zonghuifeng
-        ? centerList.zonghuifeng.split('').map((el) => {
-          return { val: el };
-        })
-        : [];
-    // 总进
-    navList[1].valList =
-      centerList && centerList.zongjinfeng
-        ? centerList.zongjinfeng
-          .toString()
-          .split('')
-          .map((el) => {
-            return { val: el };
-          })
-        : [];
-    // 计划风量
-    navList[2].valList =
-      centerList && centerList.xufengliang
-        ? centerList.xufengliang
-          .toString()
-          .split('')
-          .map((el) => {
-            return { val: el };
-          })
-        : [];
-    // if (centerList && centerList.zongfengliang && centerList.zongjinfeng) {
-    //   // 外部漏风率  (zongfengliang-zongjinfeng)/zongfengliang
-    //   navList[3].val =
-    //     (((parseFloat(centerList.zongfengliang) - parseFloat(centerList.zongjinfeng)) / parseFloat(centerList.zongfengliang)) * 100).toFixed(2) +
-    //     '%';
-    // } else {
-    //   navList[3].val = '0%';
-    // }
-
-    // if (res.midinfo[0] && res.midinfo[0].sysinfo) {
-    //   navList[4].val = (res.midinfo[0].sysinfo.useM3Perent ? res.midinfo[0].sysinfo.useM3Perent : '0') + '%';
-    // }
-    navList[3].val = `${res.midinfo[0].sysinfo.useM3Perent}%` || '--'
-
-    flList.value = res.windrect || res.sys_wind;
-
-    if (res.sys_majorpath.length != 0) {
-      lineList.value = res.sys_majorpath;
-    } else {
-      let paramArr: any = [];
-      // paramArr.push({
-      //   deviceName: '关键路线1',
-      //   deviceType: 'sys_majorpath',
-      //   deviceID: Math.random() * 100,
-      //   majorpath: {
-      //     drag_1: 380,
-      //     drag_2: 167,
-      //     drag_3: 333,
-      //     drag_total: Math.abs(
-      //       Number(
-      //         res.fanmain && res.fanmain[0]
-      //           ? res.fanmain[0].readData.Fan1FanPre ||
-      //               res.fanmain[0].readData.Fan2FanPre ||
-      //               res.fanmain[0].readData.DataPa ||
-      //               680 + (Math.random() * 2 - 1 * 5)
-      //           : 680 + (Math.random() * 2 - 1 * 5)
-      //       )
-      //     ),
-      //     m3_total: Number(
-      //       res.fanmain && res.fanmain[0]
-      //         ? res.fanmain[0].readData.Fan1m3 ||
-      //             res.fanmain[0].readData.Fan2m3 ||
-      //             res.fanmain[0].readData.m3 ||
-      //             8138 + (Math.random() * 2 - 1 * 20)
-      //         : 8138 + (Math.random() * 2 - 1 * 20)
-      //     ),
-      //   },
-      // });
-      lineList.value = paramArr;
-    }
+  function goHome() {
+    pageType.value = 'home';
+  }
+
+  function getList() {
+    list({}).then((res) => {
+      console.log(res, 'res-----------');
+      fanLocalList.length = 0;
+      fanLocalList.push(res.fanlocal);
+      mainList.value = res.fanmain;
+      centerList = res.midinfo[0].sysdata;
+      // 窝兔沟模拟风量
+      // centerList = {
+      //   zongfengliang: "8010", // 总风量
+      //   xufengliang: '7232', // 有效风量
+      //   zonghuifeng: '8188' // 总会风
+      // }
+      // 总回
+      navList[0].valList =
+        centerList && centerList.zonghuifeng
+          ? centerList.zonghuifeng.split('').map((el) => {
+              return { val: el };
+            })
+          : [];
+      // 总进
+      navList[1].valList =
+        centerList && centerList.zongjinfeng
+          ? centerList.zongjinfeng
+              .toString()
+              .split('')
+              .map((el) => {
+                return { val: el };
+              })
+          : [];
+      // 计划风量
+      navList[2].valList =
+        centerList && centerList.xufengliang
+          ? centerList.xufengliang
+              .toString()
+              .split('')
+              .map((el) => {
+                return { val: el };
+              })
+          : [];
+      // if (centerList && centerList.zongfengliang && centerList.zongjinfeng) {
+      //   // 外部漏风率  (zongfengliang-zongjinfeng)/zongfengliang
+      //   navList[3].val =
+      //     (((parseFloat(centerList.zongfengliang) - parseFloat(centerList.zongjinfeng)) / parseFloat(centerList.zongfengliang)) * 100).toFixed(2) +
+      //     '%';
+      // } else {
+      //   navList[3].val = '0%';
+      // }
+
+      // if (res.midinfo[0] && res.midinfo[0].sysinfo) {
+      //   navList[4].val = (res.midinfo[0].sysinfo.useM3Perent ? res.midinfo[0].sysinfo.useM3Perent : '0') + '%';
+      // }
+      navList[3].val = `${res.midinfo[0].sysinfo.useM3Perent}%` || '--';
+
+      flList.value = res.windrect || res.sys_wind;
+
+      if (res.sys_majorpath.length != 0) {
+        lineList.value = res.sys_majorpath;
+      } else {
+        let paramArr: any = [];
+        // paramArr.push({
+        //   deviceName: '关键路线1',
+        //   deviceType: 'sys_majorpath',
+        //   deviceID: Math.random() * 100,
+        //   majorpath: {
+        //     drag_1: 380,
+        //     drag_2: 167,
+        //     drag_3: 333,
+        //     drag_total: Math.abs(
+        //       Number(
+        //         res.fanmain && res.fanmain[0]
+        //           ? res.fanmain[0].readData.Fan1FanPre ||
+        //               res.fanmain[0].readData.Fan2FanPre ||
+        //               res.fanmain[0].readData.DataPa ||
+        //               680 + (Math.random() * 2 - 1 * 5)
+        //           : 680 + (Math.random() * 2 - 1 * 5)
+        //       )
+        //     ),
+        //     m3_total: Number(
+        //       res.fanmain && res.fanmain[0]
+        //         ? res.fanmain[0].readData.Fan1m3 ||
+        //             res.fanmain[0].readData.Fan2m3 ||
+        //             res.fanmain[0].readData.m3 ||
+        //             8138 + (Math.random() * 2 - 1 * 20)
+        //         : 8138 + (Math.random() * 2 - 1 * 20)
+        //     ),
+        //   },
+        // });
+        lineList.value = paramArr;
+      }
+
+      if (res.sys_surface_caimei.length != 0) {
+        workList.value = res.sys_surface_caimei;
+      } else {
+        let paramArr: any = [];
+        // paramArr.push({
+        //   deviceName: '工作面',
+        //   deviceType: 'sys_surface_caimei',
+        //   deviceID: '11111',
+        //   history: [],
+        //   jin: 100,
+        //   hui: 200,
+        //   xufengliang: 300,
+        // });
+        workList.value = getDate(paramArr);
+      }
+      warnData.value = res.warn || [];
+      deviceData.value = res.device || {};
+    });
+  }
+
+  //获取当前时间年月日时分秒
+  function getNowTime() {
+    setInterval(() => {
+      nowTimeYear.value = dayjs().format('YYYY/MM/DD');
+      let week = dayjs(new Date().getTime()).day();
+      switch (week) {
+        case 0:
+          nowTimeWeek.value = '星期日';
+          break;
+        case 1:
+          nowTimeWeek.value = '星期一';
+          break;
+        case 2:
+          nowTimeWeek.value = '星期二';
+          break;
+        case 3:
+          nowTimeWeek.value = '星期三';
+          break;
+        case 4:
+          nowTimeWeek.value = '星期四';
+          break;
+        case 5:
+          nowTimeWeek.value = '星期五';
+          break;
+        case 6:
+          nowTimeWeek.value = '星期六';
+          break;
+      }
+      let date = new Date();
+      let hours = date.getHours();
+      let minutes = date.getMinutes();
+      let seconds = date.getSeconds();
+      if (minutes >= 0 && minutes <= 9) {
+        minutes = `0${minutes}`;
+      }
+      if (seconds >= 0 && seconds <= 9) {
+        seconds = `0${seconds}`;
+      }
+      nowTime.value = `${hours}:${minutes}:${seconds}`;
+    }, 1000);
+  }
+
+  function goModalDetail() {
+    router.push('/micro-vent-3dModal/dashboard/analysis?type=model3D');
+  }
+
+  const changePageType = (pageType) => {
+    actions.setGlobalState({ pageObj: { pageType: pageType } });
+  };
 
-    if (res.sys_surface_caimei.length != 0) {
-      workList.value = res.sys_surface_caimei;
+  onMounted(() => {
+    const currentRouteObj = unref(currentRoute);
+    if (currentRouteObj && currentRouteObj['query'] && currentRouteObj['query']['deviceType']) {
+      pageType.value = 'model3D';
     } else {
-      let paramArr: any = [];
-      // paramArr.push({
-      //   deviceName: '工作面',
-      //   deviceType: 'sys_surface_caimei',
-      //   deviceID: '11111',
-      //   history: [],
-      //   jin: 100,
-      //   hui: 200,
-      //   xufengliang: 300,
-      // });
-      workList.value = getDate(paramArr);
+      pageType.value = 'home';
     }
-    warnData.value = res.warn || [];
-    deviceData.value = res.device || {};
-  });
-}
-
-//获取当前时间年月日时分秒
-function getNowTime() {
-  setInterval(() => {
-    nowTimeYear.value = dayjs().format('YYYY/MM/DD');
-    let week = dayjs(new Date().getTime()).day();
-    switch (week) {
-      case 0:
-        nowTimeWeek.value = '星期日';
-        break;
-      case 1:
-        nowTimeWeek.value = '星期一';
-        break;
-      case 2:
-        nowTimeWeek.value = '星期二';
-        break;
-      case 3:
-        nowTimeWeek.value = '星期三';
-        break;
-      case 4:
-        nowTimeWeek.value = '星期四';
-        break;
-      case 5:
-        nowTimeWeek.value = '星期五';
-        break;
-      case 6:
-        nowTimeWeek.value = '星期六';
-        break;
-    }
-    let date = new Date();
-    let hours = date.getHours();
-    let minutes = date.getMinutes();
-    let seconds = date.getSeconds();
-    if (minutes >= 0 && minutes <= 9) {
-      minutes = `0${minutes}`;
-    }
-    if (seconds >= 0 && seconds <= 9) {
-      seconds = `0${seconds}`;
-    }
-    nowTime.value = `${hours}:${minutes}:${seconds}`;
-  }, 1000);
-}
-
-function goModalDetail() {
-  router.push('/micro-vent-3dModal/dashboard/analysis?type=model3D');
-}
-
-const changePageType = (pageType) => {
-  actions.setGlobalState({ pageObj: { pageType: pageType } });
-};
-
-onMounted(() => {
-  const currentRouteObj = unref(currentRoute);
-  if (currentRouteObj && currentRouteObj['query'] && currentRouteObj['query']['deviceType']) {
-    pageType.value = 'model3D';
-  } else {
-    pageType.value = 'home';
-  }
-  actions.onGlobalStateChange((newState) => {
-    for (const key in newState) {
-      if (key === 'pageObj') {
-        const pageObj = newState[key];
-        if (pageObj && pageObj.pageType) {
-          pageType.value = pageObj.pageType;
-          if (pageObj.timesolution) {
-            pageResult.value = pageObj.timesolution;
+    actions.onGlobalStateChange((newState) => {
+      for (const key in newState) {
+        if (key === 'pageObj') {
+          const pageObj = newState[key];
+          if (pageObj && pageObj.pageType) {
+            pageType.value = pageObj.pageType;
+            if (pageObj.timesolution) {
+              pageResult.value = pageObj.timesolution;
+            }
           }
         }
       }
-    }
+    });
+    getNowTime();
+    getList();
+    timer = Number(
+      setInterval(() => {
+        getList();
+      }, 10000)
+    );
+  });
+  onBeforeUnmount(() => {
+    clearInterval(timer);
+    timer = null;
+  });
+  onUnmounted(() => {
+    pageType.value = '';
   });
-  getNowTime();
-  getList();
-  timer = Number(
-    setInterval(() => {
-      getList();
-    }, 10000)
-  );
-});
-onBeforeUnmount(() => {
-  clearInterval(timer);
-  timer = null;
-});
-onUnmounted(() => {
-  pageType.value = '';
-});
 </script>
 
 <style lang="less" scoped>
-@font-face {
-  font-family: 'douyuFont';
-  src: url('../../../../assets/font/douyuFont.otf');
-}
-
-@font-face {
-  font-family: 'yjsz';
-  src: url('../../../../assets/font/yjsz.TTF');
-}
-
-.home-container {
-  width: 100%;
-  height: 100%;
-  position: relative;
-
-  .header {
+  @font-face {
+    font-family: 'douyuFont';
+    src: url('../../../../assets/font/douyuFont.otf');
+  }
+
+  @font-face {
+    font-family: 'yjsz';
+    src: url('../../../../assets/font/yjsz.TTF');
+  }
+
+  .home-container {
     width: 100%;
-    height: 76px;
+    height: 100%;
     position: relative;
-    background: url('../../../../assets//images//home-container/header-nav.png') no-repeat;
-
-    .head-time {
-      position: absolute;
-      top: 14px;
-      left: 15px;
-      color: #b5c9e9;
-      font-size: 14px;
-
-      span {
-        margin-right: 20px;
-        letter-spacing: 2px;
+
+    .header {
+      width: 100%;
+      height: 76px;
+      position: relative;
+      background: url('../../../../assets//images//home-container/header-nav.png') no-repeat;
+
+      .head-time {
+        position: absolute;
+        top: 14px;
+        left: 15px;
+        color: #b5c9e9;
+        font-size: 14px;
+
+        span {
+          margin-right: 20px;
+          letter-spacing: 2px;
+        }
       }
-    }
 
-    .main-title {
-      position: absolute;
-      left: 50%;
-      top: 50%;
-      transform: translate(-50%, -50%);
-      color: #fff;
-      font-size: 28px;
-      font-weight: 600;
-      display: flex;
-      align-items: center;
+      .main-title {
+        position: absolute;
+        left: 50%;
+        top: 50%;
+        transform: translate(-50%, -50%);
+        color: #fff;
+        font-size: 28px;
+        font-weight: 600;
+        display: flex;
+        align-items: center;
 
-      .logo {
-        width: 32px;
-        height: 32px;
-        margin-right: 5px;
+        .logo {
+          width: 32px;
+          height: 32px;
+          margin-right: 5px;
+        }
       }
     }
-  }
-
-  .home-contents {
-    display: flex;
-    justify-content: space-between;
-    height: calc(100% - 76px);
-    padding: 10px;
-    box-sizing: border-box;
 
-    .left-content {
+    .home-contents {
       display: flex;
-      flex-direction: column;
-      flex: 1;
       justify-content: space-between;
-      height: 100%;
+      height: calc(100% - 76px);
+      padding: 10px;
+      box-sizing: border-box;
 
-      .monitor-box {
+      .left-content {
         display: flex;
+        flex-direction: column;
         flex: 1;
-        width: 100%;
-        background: url('../../../../assets/images/home-container/dialog.png') no-repeat;
-        background-size: 100% 100%;
-      }
+        justify-content: space-between;
+        height: 100%;
 
-      .monitor-box1 {
-        margin: 10px 0px;
-      }
-    }
+        .monitor-box {
+          display: flex;
+          flex: 1;
+          width: 100%;
+          background: url('../../../../assets/images/home-container/dialog.png') no-repeat;
+          background-size: 100% 100%;
+        }
 
-    .center-content {
-      display: flex;
-      flex-direction: column;
-      justify-content: space-between;
-      flex: 2;
-      height: 100%;
-      margin: 0px 10px;
+        .monitor-box1 {
+          margin: 10px 0px;
+        }
+      }
 
-      .three-box {
-        position: relative;
+      .center-content {
         display: flex;
-        background-color: #fff;
+        flex-direction: column;
+        justify-content: space-between;
         flex: 2;
-        width: 100%;
-        margin-bottom: 15px;
-        background: url('../../../../assets/images/home-container/three-dialog.png') no-repeat;
-        background-size: 100% 100%;
-
-        .three-nav {
-          position: absolute;
-          z-index: 9999;
-          left: 50%;
-          top: 38px;
-          transform: translate(-50%, 0);
-          width: 812px;
-          height: 89px;
-          padding: 0px 20px;
-          box-sizing: border-box;
+        height: 100%;
+        margin: 0px 10px;
+
+        .three-box {
+          position: relative;
           display: flex;
-          justify-content: space-around;
-          align-items: center;
-          background: url('../../../../assets/images/home-container/three-nav.png') no-repeat;
+          background-color: #fff;
+          flex: 2;
+          width: 100%;
+          margin-bottom: 15px;
+          background: url('../../../../assets/images/home-container/three-dialog.png') no-repeat;
+          background-size: 100% 100%;
 
-          .nav-item {
+          .three-nav {
+            position: absolute;
+            z-index: 9999;
+            left: 50%;
+            top: 38px;
+            transform: translate(-50%, 0);
+            width: 812px;
+            height: 89px;
+            padding: 0px 20px;
+            box-sizing: border-box;
             display: flex;
-            flex: 1;
-            flex-direction: column;
             justify-content: space-around;
             align-items: center;
-            height: 80%;
-
-            .item-label {
-              color: #98f5ff;
-            }
+            background: url('../../../../assets/images/home-container/three-nav.png') no-repeat;
 
-            .item-value {
-              position: relative;
-              width: 125px;
-              height: 37px;
-              padding: 0px 5px;
-              box-sizing: border-box;
+            .nav-item {
               display: flex;
-              justify-content: space-between;
+              flex: 1;
+              flex-direction: column;
+              justify-content: space-around;
               align-items: center;
-              background: url('../../../../assets/images/home-container/item-value.png') no-repeat;
+              height: 80%;
+
+              .item-label {
+                color: #98f5ff;
+              }
 
-              .bg-box {
+              .item-value {
                 position: relative;
-                width: 20px;
-                height: 26px;
-                border-bottom: 2px solid #063493;
-                background: linear-gradient(to right, rgba(1, 194, 249), rgba(0, 125, 252));
-
-                .box-line {
-                  position: absolute;
-                  left: 0;
-                  top: 50%;
-                  transform: translate(0, -50%);
-                  height: 1px;
-                  width: 100%;
-                  background-color: rgba(6, 52, 147, 0.6);
+                width: 125px;
+                height: 37px;
+                padding: 0px 5px;
+                box-sizing: border-box;
+                display: flex;
+                justify-content: space-between;
+                align-items: center;
+                background: url('../../../../assets/images/home-container/item-value.png') no-repeat;
+
+                .bg-box {
+                  position: relative;
+                  width: 20px;
+                  height: 26px;
+                  border-bottom: 2px solid #063493;
+                  background: linear-gradient(to right, rgba(1, 194, 249), rgba(0, 125, 252));
+
+                  .box-line {
+                    position: absolute;
+                    left: 0;
+                    top: 50%;
+                    transform: translate(0, -50%);
+                    height: 1px;
+                    width: 100%;
+                    background-color: rgba(6, 52, 147, 0.6);
+                  }
+
+                  .value-text {
+                    position: absolute;
+                    left: 50%;
+                    top: 50%;
+                    transform: translate(-50%, -50%);
+                    color: #fff;
+                    font-size: 22px;
+                    font-family: 'yjsz';
+                    font-weight: 500;
+                  }
                 }
 
-                .value-text {
-                  position: absolute;
-                  left: 50%;
-                  top: 50%;
-                  transform: translate(-50%, -50%);
+                .value-text1 {
+                  width: 100%;
+                  text-align: center;
                   color: #fff;
                   font-size: 22px;
                   font-family: 'yjsz';
                   font-weight: 500;
                 }
               }
+            }
+          }
 
-              .value-text1 {
-                width: 100%;
-                text-align: center;
-                color: #fff;
-                font-size: 22px;
-                font-family: 'yjsz';
-                font-weight: 500;
-              }
+          .three-modal {
+            width: 100%;
+            height: 100%;
+            padding: 20px 17px 20px 15px;
+            box-sizing: border-box;
+            // position: absolute;
+            // background-color: var(--vent-base-color);
+
+            .btn-icon {
+              width: 40px;
+              height: 40px;
+              background: url('/@/assets/images/vent/home/tosmall.png') no-repeat center;
+              background-size: 100% 100%;
+              position: absolute;
+              z-index: 99999;
+              bottom: 30px;
+              right: 30px;
             }
           }
         }
 
-        .three-modal {
+        .wind-box {
+          display: flex;
+          flex: 1;
           width: 100%;
-          height: 100%;
-          padding: 20px 17px 20px 15px;
-          box-sizing: border-box;
-          // position: absolute;
-          // background-color: var(--vent-base-color);
-
-          .btn-icon {
-            width: 40px;
-            height: 40px;
-            background: url('/@/assets/images/vent/home/tosmall.png') no-repeat center;
-            background-size: 100% 100%;
-            position: absolute;
-            z-index: 99999;
-            bottom: 30px;
-            right: 30px;
-          }
+          background: url('../../../../assets/images/home-container/dialog1.png') no-repeat;
+          background-size: 100% 100%;
         }
       }
 
-      .wind-box {
+      .right-content {
         display: flex;
+        flex-direction: column;
+        justify-content: space-between;
         flex: 1;
-        width: 100%;
-        background: url('../../../../assets/images/home-container/dialog1.png') no-repeat;
-        background-size: 100% 100%;
-      }
-    }
+        height: 100%;
 
-    .right-content {
-      display: flex;
-      flex-direction: column;
-      justify-content: space-between;
-      flex: 1;
-      height: 100%;
-
-      .monitor-box {
-        display: flex;
-        flex: 1;
-        width: 100%;
-        background: url('../../../../assets/images/home-container/dialog.png') no-repeat;
-        background-size: 100% 100%;
-      }
+        .monitor-box {
+          display: flex;
+          flex: 1;
+          width: 100%;
+          background: url('../../../../assets/images/home-container/dialog.png') no-repeat;
+          background-size: 100% 100%;
+        }
 
-      .monitor-box1 {
-        margin: 10px 0px;
+        .monitor-box1 {
+          margin: 10px 0px;
+        }
       }
     }
   }
-}
 
-// #__qiankun_microapp_wrapper_for_micro_vent_3_d_modal__{
-//   width: 100% !important;
-//   height: 100% !important;
-// }</style>
+  // #__qiankun_microapp_wrapper_for_micro_vent_3_d_modal__{
+  //   width: 100% !important;
+  //   height: 100% !important;
+  // }
+</style>

+ 409 - 410
src/views/vent/monitorManager/alarmMonitor/common/fireWork.vue

@@ -37,8 +37,7 @@
         <div class="text">束管系统监测</div>
         <div class="select-box">
           <a-select v-model:value="selectData" style="width: 250px" @change="changeSelect">
-            <a-select-option v-for="file in selectList" :key="file.label" :value="file.value">{{ file.label
-              }}</a-select-option>
+            <a-select-option v-for="file in selectList" :key="file.label" :value="file.value">{{ file.label }}</a-select-option>
           </a-select>
         </div>
       </div>
@@ -68,487 +67,487 @@
 </template>
 
 <script lang="ts" setup>
-import { onMounted, ref, reactive, watch, defineProps } from 'vue';
-import imgUrl from '../../../../../assets/images/fire/pie.png';
-import echartLine from './echartLine.vue';
-import echartLine1 from './echartLine1.vue';
-import { topList, contentList } from '../common.data';
-
-let props = defineProps({
-  listData: Object,
-});
-let selectSj = ref<any[]>([]);
-let selectData = ref('');
-let selectList = reactive<any[]>([]);
-let maxY1 = ref<any>(0);
-let maxY = ref(100);
-let echartDw = ref('(­°C)');
-//光钎测温-图表数据
-let echartDataGq = reactive({
-  maxData: {
-    lengedData: '当前温度',
-    data: [],
-  },
-  xData: [],
-});
-//束管监测-图表数据
-let echartDataSg = reactive({
-  xData: [],
-  yData: [],
-  lengedData: 'O₂',
-  lengedDataName: '(%)',
-});
-let echartDataSgList = reactive<any[]>([]);
-
-function getmaxY() {
-  maxY1.value = echartDataSg.yData.reduce((acr, cur) => {
-    return acr > cur ? acr : cur;
+  import { onMounted, ref, reactive, watch, defineProps } from 'vue';
+  import imgUrl from '../../../../../assets/images/fire/pie.png';
+  import echartLine from './echartLine.vue';
+  import echartLine1 from './echartLine1.vue';
+  import { topList, contentList } from '../common.data';
+
+  let props = defineProps({
+    listData: Object,
   });
-  maxY1.value =
-    maxY1.value.toString().indexOf('.') == -1 ? maxY1.value.toString() : maxY1.value.toString().substring(0, maxY1.value.toString().indexOf('.'));
-  if (maxY1.value.length < 2 && Number(maxY1.value) < 1) {
-    maxY1.value = 1
-  } else if (maxY1.value.length < 2 && Number(maxY1.value) >= 1) {
-    maxY1.value = 10
-  } else if (maxY1.value.length < 3) {
-    maxY1.value = (Number(maxY1.value[0]) + 1) * 10
-  } else if (maxY1.value.length < 4) {
-    maxY1.value = (Number(maxY1.value[0]) + 1) * 100
-  } else if (maxY1.value.length < 5) {
-    maxY1.value = (Number(maxY1.value[0]) + 1) * 1000
-  } else if (maxY1.value.length < 6) {
-    maxY1.value = (Number(maxY1.value[0]) + 1) * 10000
-  }
-}
-//束管实时数据选项点击
-function getSgClick(items) {
-  echartDataSg.xData.length = 0;
-  echartDataSg.yData.length = 0;
-  echartDataSg.lengedData = items.title;
-  echartDataSg.lengedDataName = items.dw;
-
-  switch (items.title) {
-    case 'O₂':
-      echartDataSgList.forEach((el) => {
-        echartDataSg.xData.push(el.time);
-        echartDataSg.yData.push(el.o2val);
-      });
-      getmaxY();
-      break;
-    case 'C₂H₄':
-      echartDataSgList.forEach((el) => {
-        echartDataSg.xData.push(el.time);
-        echartDataSg.yData.push(el.ch2val);
-      });
-      getmaxY();
-      break;
-    case 'CO':
-      echartDataSgList.forEach((el) => {
-        echartDataSg.xData.push(el.time);
-        echartDataSg.yData.push(el.coval);
-      });
-      getmaxY();
-      break;
-    case 'CH₄':
-      echartDataSgList.forEach((el) => {
-        echartDataSg.xData.push(el.time);
-        echartDataSg.yData.push(el.chval);
-      });
-      getmaxY();
-      break;
-    case 'CO₂':
-      echartDataSgList.forEach((el) => {
-        echartDataSg.xData.push(el.time);
-        echartDataSg.yData.push(el.co2val);
-      });
-      getmaxY();
-      break;
-    case 'C₂H₂':
-      echartDataSgList.forEach((el) => {
-        echartDataSg.xData.push(el.time);
-        echartDataSg.yData.push(el.gasval);
-      });
-      getmaxY();
-      break;
-  }
-}
-function changeSelect(val) {
-  selectData.value = val;
-  let data = selectSj.value.filter((v) => v.strinstallpos == selectData.value)[0];
-  contentList[0].list[0].value = data.readData.o2val;
-  contentList[0].list[1].value = data.readData.ch2val;
-  contentList[1].list[0].value = data.readData.coval;
-  contentList[1].list[1].value = data.readData.chval;
-  contentList[2].list[0].value = data.readData.co2val;
-  contentList[2].list[1].value = data.readData.gasval;
-  contentList.forEach((el) => {
-    el.list.forEach((v) => {
-      v.time = data.readTime.substring(0, data.readTime.lastIndexOf(':'));
-    });
+  let selectSj = ref<any[]>([]);
+  let selectData = ref('');
+  let selectList = reactive<any[]>([]);
+  let maxY1 = ref<any>(0);
+  let maxY = ref(100);
+  let echartDw = ref('(­°C)');
+  //光钎测温-图表数据
+  let echartDataGq = reactive({
+    maxData: {
+      lengedData: '当前温度',
+      data: [],
+    },
+    xData: [],
   });
-}
-
-watch(
-  () => props.listData,
-  (val, val1) => {
-    echartDataGq.xData.length = 0;
-    echartDataGq.maxData.data.length = 0;
-    echartDataSgList.length = 0;
+  //束管监测-图表数据
+  let echartDataSg = reactive({
+    xData: [],
+    yData: [],
+    lengedData: 'O₂',
+    lengedDataName: '(%)',
+  });
+  let echartDataSgList = reactive<any[]>([]);
+
+  function getmaxY() {
+    maxY1.value = echartDataSg.yData.reduce((acr, cur) => {
+      return acr > cur ? acr : cur;
+    });
+    maxY1.value =
+      maxY1.value.toString().indexOf('.') == -1 ? maxY1.value.toString() : maxY1.value.toString().substring(0, maxY1.value.toString().indexOf('.'));
+    if (maxY1.value.length < 2 && Number(maxY1.value) < 1) {
+      maxY1.value = 1;
+    } else if (maxY1.value.length < 2 && Number(maxY1.value) >= 1) {
+      maxY1.value = 10;
+    } else if (maxY1.value.length < 3) {
+      maxY1.value = (Number(maxY1.value[0]) + 1) * 10;
+    } else if (maxY1.value.length < 4) {
+      maxY1.value = (Number(maxY1.value[0]) + 1) * 100;
+    } else if (maxY1.value.length < 5) {
+      maxY1.value = (Number(maxY1.value[0]) + 1) * 1000;
+    } else if (maxY1.value.length < 6) {
+      maxY1.value = (Number(maxY1.value[0]) + 1) * 10000;
+    }
+  }
+  //束管实时数据选项点击
+  function getSgClick(items) {
     echartDataSg.xData.length = 0;
     echartDataSg.yData.length = 0;
-    selectList.length = 0;
-    if (JSON.stringify(val) != '{}') {
-      if (val.fiber.length != 0) {
-        topList[0].value = val.fiber[0].readData.fmax;
-        topList[1].value = val.fiber[0].readData.fmin;
-        topList[2].value = val.fiber[0].readData.favg;
-        topList[3].text = val.fiber[0].warnFlag ? '报警' : '正常';
-        JSON.parse(val.fiber[0].readData.fibreTemperature).forEach((el) => {
-          echartDataGq.xData.push(el.pos);
-          echartDataGq.maxData.data.push(el.value);
-        });
-      } else {
-        topList[0].value = '--';
-        topList[1].value = '--';
-        topList[2].value = '--';
-        topList[3].text = '正常';
-      }
+    echartDataSg.lengedData = items.title;
+    echartDataSg.lengedDataName = items.dw;
 
-      if (val.bundletube.length != 0) {
-        selectSj.value = val.bundletube;
-        selectSj.value.forEach((el) => {
-          selectList.push({ label: el.strinstallpos, value: el.strinstallpos });
+    switch (items.title) {
+      case 'O₂':
+        echartDataSgList.forEach((el) => {
+          echartDataSg.xData.push(el.time);
+          echartDataSg.yData.push(el.o2val);
         });
-        selectData.value = selectData.value ? selectData.value : selectList[0].value;
-        let dataVal = selectData.value ? selectSj.value.filter((v) => v.strinstallpos == selectData.value)[0] : selectSj.value[0];
-        contentList[0].list[0].value = dataVal.readData.o2val;
-        contentList[0].list[1].value = dataVal.readData.ch2val;
-        contentList[1].list[0].value = dataVal.readData.coval;
-        contentList[1].list[1].value = dataVal.readData.chval;
-        contentList[2].list[0].value = dataVal.readData.co2val;
-        contentList[2].list[1].value = dataVal.readData.gasval;
-        contentList.forEach((el) => {
-          el.list.forEach((v) => {
-            v.time = dataVal.readTime.substring(0, dataVal.readTime.lastIndexOf(':'));
-          });
+        getmaxY();
+        break;
+      case 'C₂H₄':
+        echartDataSgList.forEach((el) => {
+          echartDataSg.xData.push(el.time);
+          echartDataSg.yData.push(el.ch2val);
         });
-
-        dataVal.history.forEach((el) => {
+        getmaxY();
+        break;
+      case 'CO':
+        echartDataSgList.forEach((el) => {
           echartDataSg.xData.push(el.time);
-          if (echartDataSg.lengedData == 'O₂') {
-            echartDataSg.yData.push(el.o2val);
-          } else if (echartDataSg.lengedData == 'C₂H₄') {
-            echartDataSg.yData.push(el.ch2val);
-          } else if (echartDataSg.lengedData == 'C₂H₂') {
-            echartDataSg.yData.push(el.gasval);
-          } else if (echartDataSg.lengedData == 'CH₄') {
-            echartDataSg.yData.push(el.chval);
-          } else if (echartDataSg.lengedData == 'CO') {
-            echartDataSg.yData.push(el.coval);
-          } else if (echartDataSg.lengedData == 'CO₂') {
-            echartDataSg.yData.push(el.co2val);
-          }
-          echartDataSgList.push(el);
+          echartDataSg.yData.push(el.coval);
         });
         getmaxY();
-      } else {
-        contentList[0].list[0].value = '--';
-        contentList[0].list[1].value = '--';
-        contentList[1].list[0].value = '--';
-        contentList[1].list[1].value = '--';
-        contentList[2].list[0].value = '--';
-        contentList[2].list[1].value = '--';
-        contentList.forEach((el) => {
-          el.list.forEach((v) => {
-            v.time = '--';
-          });
+        break;
+      case 'CH₄':
+        echartDataSgList.forEach((el) => {
+          echartDataSg.xData.push(el.time);
+          echartDataSg.yData.push(el.chval);
         });
-      }
+        getmaxY();
+        break;
+      case 'CO₂':
+        echartDataSgList.forEach((el) => {
+          echartDataSg.xData.push(el.time);
+          echartDataSg.yData.push(el.co2val);
+        });
+        getmaxY();
+        break;
+      case 'C₂H₂':
+        echartDataSgList.forEach((el) => {
+          echartDataSg.xData.push(el.time);
+          echartDataSg.yData.push(el.gasval);
+        });
+        getmaxY();
+        break;
     }
-  },
-  { deep: true }
-);
+  }
+  function changeSelect(val) {
+    selectData.value = val;
+    let data = selectSj.value.filter((v) => v.strinstallpos == selectData.value)[0];
+    contentList[0].list[0].value = data.readData.o2val;
+    contentList[0].list[1].value = data.readData.ch2val;
+    contentList[1].list[0].value = data.readData.coval;
+    contentList[1].list[1].value = data.readData.chval;
+    contentList[2].list[0].value = data.readData.co2val;
+    contentList[2].list[1].value = data.readData.gasval;
+    contentList.forEach((el) => {
+      el.list.forEach((v) => {
+        v.time = data.readTime.substring(0, data.readTime.lastIndexOf(':'));
+      });
+    });
+  }
+
+  watch(
+    () => props.listData,
+    (val, val1) => {
+      echartDataGq.xData.length = 0;
+      echartDataGq.maxData.data.length = 0;
+      echartDataSgList.length = 0;
+      echartDataSg.xData.length = 0;
+      echartDataSg.yData.length = 0;
+      selectList.length = 0;
+      if (JSON.stringify(val) != '{}') {
+        if (val.fiber.length != 0) {
+          topList[0].value = val.fiber[0].readData.fmax;
+          topList[1].value = val.fiber[0].readData.fmin;
+          topList[2].value = val.fiber[0].readData.favg;
+          topList[3].text = val.fiber[0].warnFlag ? '报警' : '正常';
+          JSON.parse(val.fiber[0].readData.fibreTemperature).forEach((el) => {
+            echartDataGq.xData.push(el.pos);
+            echartDataGq.maxData.data.push(el.value);
+          });
+        } else {
+          topList[0].value = '--';
+          topList[1].value = '--';
+          topList[2].value = '--';
+          topList[3].text = '正常';
+        }
+
+        if (val.bundletube.length != 0) {
+          selectSj.value = val.bundletube;
+          selectSj.value.forEach((el) => {
+            selectList.push({ label: el.strinstallpos, value: el.strinstallpos });
+          });
+          selectData.value = selectData.value ? selectData.value : selectList[0].value;
+          let dataVal = selectData.value ? selectSj.value.filter((v) => v.strinstallpos == selectData.value)[0] : selectSj.value[0];
+          contentList[0].list[0].value = dataVal.readData.o2val;
+          contentList[0].list[1].value = dataVal.readData.ch2val;
+          contentList[1].list[0].value = dataVal.readData.coval;
+          contentList[1].list[1].value = dataVal.readData.chval;
+          contentList[2].list[0].value = dataVal.readData.co2val;
+          contentList[2].list[1].value = dataVal.readData.gasval;
+          contentList.forEach((el) => {
+            el.list.forEach((v) => {
+              v.time = dataVal.readTime.substring(0, dataVal.readTime.lastIndexOf(':'));
+            });
+          });
+
+          dataVal.history.forEach((el) => {
+            echartDataSg.xData.push(el.time);
+            if (echartDataSg.lengedData == 'O₂') {
+              echartDataSg.yData.push(el.o2val);
+            } else if (echartDataSg.lengedData == 'C₂H₄') {
+              echartDataSg.yData.push(el.ch2val);
+            } else if (echartDataSg.lengedData == 'C₂H₂') {
+              echartDataSg.yData.push(el.gasval);
+            } else if (echartDataSg.lengedData == 'CH₄') {
+              echartDataSg.yData.push(el.chval);
+            } else if (echartDataSg.lengedData == 'CO') {
+              echartDataSg.yData.push(el.coval);
+            } else if (echartDataSg.lengedData == 'CO₂') {
+              echartDataSg.yData.push(el.co2val);
+            }
+            echartDataSgList.push(el);
+          });
+          getmaxY();
+        } else {
+          contentList[0].list[0].value = '--';
+          contentList[0].list[1].value = '--';
+          contentList[1].list[0].value = '--';
+          contentList[1].list[1].value = '--';
+          contentList[2].list[0].value = '--';
+          contentList[2].list[1].value = '--';
+          contentList.forEach((el) => {
+            el.list.forEach((v) => {
+              v.time = '--';
+            });
+          });
+        }
+      }
+    },
+    { deep: true }
+  );
 </script>
 
 <style lang="less" scoped>
-.fireWork {
-  width: 100%;
-  height: 100%;
-  padding: 20px;
-  box-sizing: border-box;
-
-  .work-nav {
-    height: 15%;
+  .fireWork {
     width: 100%;
-    margin-bottom: 20px;
-    background: url('../../../../../assets/images/fire/bj1.png') no-repeat center;
-    background-size: 100% 100%;
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-
-    .nav {
+    height: 100%;
+    padding: 20px;
+    box-sizing: border-box;
+
+    .work-nav {
+      height: 15%;
+      width: 100%;
+      margin-bottom: 20px;
+      background: url('../../../../../assets/images/fire/bj1.png') no-repeat center;
+      background-size: 100% 100%;
       display: flex;
-      justify-content: center;
+      justify-content: space-between;
       align-items: center;
 
-      &:nth-child(1) {
-        flex: 1;
-        height: 100%;
-        border-right: 2px solid;
-        border-image: linear-gradient(to bottom, transparent, rgba(2, 70, 136, 1), transparent) 1 1 1;
-      }
-
-      &:nth-child(2) {
-        flex: 1;
-        height: 100%;
-        border-right: 2px solid;
-        border-image: linear-gradient(to bottom, transparent, rgba(2, 70, 136, 1), transparent) 1 1 1;
-      }
+      .nav {
+        display: flex;
+        justify-content: center;
+        align-items: center;
 
-      &:nth-child(3) {
-        flex: 1;
-        height: 100%;
-        border-right: 2px solid;
-        border-image: linear-gradient(to bottom, transparent, rgba(2, 70, 136, 1), transparent) 1 1 1;
-      }
+        &:nth-child(1) {
+          flex: 1;
+          height: 100%;
+          border-right: 2px solid;
+          border-image: linear-gradient(to bottom, transparent, rgba(2, 70, 136, 1), transparent) 1 1 1;
+        }
 
-      &:nth-child(4) {
-        flex: 0.6;
-        color: #b3b8cc;
-        font-size: 16px;
-        height: 100%;
-        border-right: 2px solid;
-        border-image: linear-gradient(to bottom, transparent, rgba(2, 70, 136, 1), transparent) 1 1 1;
-      }
+        &:nth-child(2) {
+          flex: 1;
+          height: 100%;
+          border-right: 2px solid;
+          border-image: linear-gradient(to bottom, transparent, rgba(2, 70, 136, 1), transparent) 1 1 1;
+        }
 
-      &:nth-child(5) {
-        flex: 1.4;
-        height: 100%;
+        &:nth-child(3) {
+          flex: 1;
+          height: 100%;
+          border-right: 2px solid;
+          border-image: linear-gradient(to bottom, transparent, rgba(2, 70, 136, 1), transparent) 1 1 1;
+        }
 
-        .percent {
-          width: 100%;
-          height: 82%;
-          padding: 0px 20px;
-          box-sizing: border-box;
-          display: flex;
-          flex-direction: column;
-          justify-content: space-around;
+        &:nth-child(4) {
+          flex: 0.6;
+          color: #b3b8cc;
+          font-size: 16px;
+          height: 100%;
+          border-right: 2px solid;
+          border-image: linear-gradient(to bottom, transparent, rgba(2, 70, 136, 1), transparent) 1 1 1;
+        }
 
-          .title {
-            font-size: 14px;
-            padding: 5px 0px;
-            color: #b3b8cc;
-            text-align: center;
-          }
+        &:nth-child(5) {
+          flex: 1.4;
+          height: 100%;
 
-          .value {
+          .percent {
+            width: 100%;
+            height: 82%;
+            padding: 0px 20px;
+            box-sizing: border-box;
             display: flex;
-            justify-content: space-between;
+            flex-direction: column;
+            justify-content: space-around;
+
+            .title {
+              font-size: 14px;
+              padding: 5px 0px;
+              color: #b3b8cc;
+              text-align: center;
+            }
 
-            span {
-              font-family: 'douyuFont';
-              font-size: 18px;
+            .value {
+              display: flex;
+              justify-content: space-between;
+
+              span {
+                font-family: 'douyuFont';
+                font-size: 18px;
+              }
             }
           }
         }
-      }
 
-      .pic {
-        width: 30%;
-        height: 82%;
+        .pic {
+          width: 30%;
+          height: 82%;
 
-        img {
-          width: 100%;
-          height: 100%;
+          img {
+            width: 100%;
+            height: 100%;
+          }
         }
-      }
 
-      .content {
-        height: 82%;
-        margin-left: 15px;
-        color: #fff;
-        display: flex;
-        flex-direction: column;
-        justify-content: space-around;
+        .content {
+          height: 82%;
+          margin-left: 15px;
+          color: #fff;
+          display: flex;
+          flex-direction: column;
+          justify-content: space-around;
 
-        span {
-          font-size: 14px;
+          span {
+            font-size: 14px;
 
-          &:nth-child(1) {
-            padding: 5px 0px;
-            color: #b3b8cc;
-          }
+            &:nth-child(1) {
+              padding: 5px 0px;
+              color: #b3b8cc;
+            }
 
-          &:nth-child(2) {
-            font-family: 'douyuFont';
-            font-size: 16px;
-            color: #3df6ff;
+            &:nth-child(2) {
+              font-family: 'douyuFont';
+              font-size: 16px;
+              color: #3df6ff;
+            }
           }
         }
       }
-    }
 
-    .nav:nth-child(1) .pic {
-      background: url('../../../../../assets/images/fire/max.svg') no-repeat center;
-      background-size: 50% 50%;
-    }
+      .nav:nth-child(1) .pic {
+        background: url('../../../../../assets/images/fire/max.svg') no-repeat center;
+        background-size: 50% 50%;
+      }
 
-    .nav:nth-child(2) .pic {
-      background: url('../../../../../assets/images/fire/min.svg') no-repeat center;
-      background-size: 50% 50%;
-    }
+      .nav:nth-child(2) .pic {
+        background: url('../../../../../assets/images/fire/min.svg') no-repeat center;
+        background-size: 50% 50%;
+      }
 
-    .nav:nth-child(3) .pic {
-      background: url('../../../../../assets/images/fire/pj.svg') no-repeat center;
-      background-size: 50% 50%;
+      .nav:nth-child(3) .pic {
+        background: url('../../../../../assets/images/fire/pj.svg') no-repeat center;
+        background-size: 50% 50%;
+      }
     }
-  }
 
-  .center-echart {
-    width: 100%;
-    height: 32%;
-    padding: 10px;
-    margin-bottom: 20px;
-    box-sizing: border-box;
-    background: url('../../../../../assets/images/fire/bj1.png') no-repeat center;
-    background-size: 100% 100%;
+    .center-echart {
+      width: 100%;
+      height: 32%;
+      padding: 10px;
+      margin-bottom: 20px;
+      box-sizing: border-box;
+      background: url('../../../../../assets/images/fire/bj1.png') no-repeat center;
+      background-size: 100% 100%;
+
+      .nav-title {
+        height: 30px;
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
 
-    .nav-title {
-      height: 30px;
-      display: flex;
-      justify-content: space-between;
-      align-items: center;
+        .title {
+          font-family: 'douyuFont';
+          font-size: 14px;
+          color: #fff;
+          // color: #3df6ff;
+        }
+      }
 
-      .title {
-        font-family: 'douyuFont';
-        font-size: 14px;
-        color: #fff;
-        // color: #3df6ff;
+      .echart-box {
+        width: 100%;
+        height: calc(100% - 30px);
       }
     }
 
-    .echart-box {
+    .bot-content {
+      position: relative;
       width: 100%;
-      height: calc(100% - 30px);
-    }
-  }
+      height: calc(53% - 40px);
+      padding: 10px 10px 0px 10px;
+      box-sizing: border-box;
+      background: url('../../../../../assets/images/fire/bj1.png') no-repeat center;
+      background-size: 100% 100%;
 
-  .bot-content {
-    position: relative;
-    width: 100%;
-    height: calc(53% - 40px);
-    padding: 10px 10px 0px 10px;
-    box-sizing: border-box;
-    background: url('../../../../../assets/images/fire/bj1.png') no-repeat center;
-    background-size: 100% 100%;
+      .title {
+        height: 35px;
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+        margin-bottom: 10px;
 
-    .title {
-      height: 35px;
-      display: flex;
-      justify-content: space-between;
-      align-items: center;
-      margin-bottom: 10px;
-
-      .text {
-        // height: 30px;
-        // line-height: 30px;
-        font-family: 'douyuFont';
-        font-size: 14px;
-        color: #fff;
+        .text {
+          // height: 30px;
+          // line-height: 30px;
+          font-family: 'douyuFont';
+          font-size: 14px;
+          color: #fff;
+        }
       }
-    }
 
-    .content {
-      height: calc(100% - 45px);
-      display: flex;
-      flex-direction: column;
-      justify-content: space-between;
-
-      .content-box {
-        width: 100%;
-        height: 29%;
+      .content {
+        height: calc(100% - 45px);
         display: flex;
+        flex-direction: column;
         justify-content: space-between;
-        margin-top: 0px !important;
-
-        .box-item {
-          position: relative;
-          width: 16%;
-          height: 100%;
-          background: url('../../../../../assets/images/fire/14174.png') no-repeat center;
-          background-size: 100% 100%;
-          cursor: pointer;
-
-          .content-title {
-            position: absolute;
-            left: 50%;
-            top: 0;
-            transform: translate(-50%);
-            color: #fff;
-            font-size: 14px;
-          }
 
-          .content-item {
-            position: absolute;
-            width: 93%;
-            height: 27%;
-            display: flex;
-            align-items: center;
-            padding: 0px 10px;
-            box-sizing: border-box;
-            background: url('../../../../../assets/images/fire/contetn.png') no-repeat center;
+        .content-box {
+          width: 100%;
+          height: 29%;
+          display: flex;
+          justify-content: space-between;
+          margin-top: 0px !important;
+
+          .box-item {
+            position: relative;
+            width: 16%;
+            height: 100%;
+            background: url('../../../../../assets/images/fire/14174.png') no-repeat center;
             background-size: 100% 100%;
-            color: #fff;
-            font-size: 14px;
+            cursor: pointer;
 
-            &:nth-child(2) {
+            .content-title {
+              position: absolute;
               left: 50%;
-              top: 28%;
+              top: 0;
               transform: translate(-50%);
-              display: flex;
-              justify-content: space-between;
+              color: #fff;
+              font-size: 14px;
             }
 
-            &:nth-child(3) {
-              left: 50%;
-              top: 62%;
-              transform: translate(-50%);
+            .content-item {
+              position: absolute;
+              width: 93%;
+              height: 27%;
               display: flex;
-              justify-content: space-between;
-            }
-
-            .bolds {
-              font-family: 'douyuFont';
-              color: #3df6ff;
-              font-size: 12px;
+              align-items: center;
+              padding: 0px 10px;
+              box-sizing: border-box;
+              background: url('../../../../../assets/images/fire/contetn.png') no-repeat center;
+              background-size: 100% 100%;
+              color: #fff;
+              font-size: 14px;
+
+              &:nth-child(2) {
+                left: 50%;
+                top: 28%;
+                transform: translate(-50%);
+                display: flex;
+                justify-content: space-between;
+              }
+
+              &:nth-child(3) {
+                left: 50%;
+                top: 62%;
+                transform: translate(-50%);
+                display: flex;
+                justify-content: space-between;
+              }
+
+              .bolds {
+                font-family: 'douyuFont';
+                color: #3df6ff;
+                font-size: 12px;
+              }
             }
           }
         }
       }
-    }
 
-    .echart-box {
-      position: absolute;
-      left: 50%;
-      top: 50px;
-      transform: translate(-50%, 0);
-      width: 66%;
-      height: calc(100% - 50px);
+      .echart-box {
+        position: absolute;
+        left: 50%;
+        top: 50px;
+        transform: translate(-50%, 0);
+        width: 66%;
+        height: calc(100% - 50px);
+      }
     }
   }
-}
 
-:deep(.zxm-select:not(.zxm-select-customize-input) .zxm-select-selector) {
-  border: 1px solid #3ad8ff77 !important;
-  background-color: #ffffff00 !important;
-}
+  :deep(.zxm-select:not(.zxm-select-customize-input) .zxm-select-selector) {
+    border: 1px solid #3ad8ff77 !important;
+    background-color: #ffffff00 !important;
+  }
 
-:deep(.zxm-select-selection-item) {
-  color: #fff !important;
-}
+  :deep(.zxm-select-selection-item) {
+    color: #fff !important;
+  }
 
-:deep(.zxm-select-arrow) {
-  color: #fff;
-}
+  :deep(.zxm-select-arrow) {
+    color: #fff;
+  }
 </style>

+ 1 - 1
src/views/vent/monitorManager/alarmMonitor/index.vue

@@ -401,7 +401,7 @@
         break;
       case 'sbyj':
         // router.push('/device/warn/home');
-        router.push('/monitorChannel/device-monitor/deviceHistory/home');
+        router.push('/device/warn/home');
         break;
     }
   }

+ 5 - 5
src/views/vent/monitorManager/comment/DeviceEcharts.vue

@@ -1,12 +1,12 @@
 <template>
   <div class="charts-container">
     <a-select ref="select" v-model:value="chartsType" size="small" style="position: absolute; z-index: 99; top: 2px; left: 2px; width: 98px">
-      <a-select-option value="listMonitor">实时监测</a-select-option>
-      <a-select-option value="detail">详情监测</a-select-option>
+      <!-- <a-select-option value="listMonitor">实时监测</a-select-option> -->
       <a-select-option value="history">历史记录</a-select-option>
+      <a-select-option value="detail">详情监测</a-select-option>
     </a-select>
 
-    <div class="charts-box" v-if="chartsType === 'listMonitor'" style="position: absolute; top: 20px">
+    <!-- <div class="charts-box" v-if="chartsType === 'listMonitor'" style="position: absolute; top: 20px">
       <BarAndLine
         :chartsColumnsType="chartsColumnsType"
         :xAxisPropType="xAxisPropType"
@@ -16,8 +16,8 @@
         :option="echartsOption"
         :chartsColumns="chartsColumns"
       />
-    </div>
-    <div class="charts-box" v-else-if="chartsType === 'detail' && deviceListApi">
+    </div> -->
+    <div class="charts-box" v-if="chartsType === 'detail' && deviceListApi">
       <Select
         :options="options"
         :fieldNames="{ label: 'strname', value: 'deviceID' }"

+ 1 - 4
src/views/vent/monitorManager/compressor/components/nitrogenHome_dltj.vue

@@ -592,10 +592,7 @@
       // }
       airCompressor[`InputFlux`] =
         monitorData.value['InputFlux'] || Number(monitorData.value['InputFlux1']) + Number(monitorData.value['InputFlux2']);
-      monitorData.value['RunTime31'] = (Number(monitorData.value['RunTime31']) / 24).toFixed(0);
-      monitorData.value['RunTime41'] = (Number(monitorData.value['RunTime41']) / 24).toFixed(0);
-      monitorData.value['RunTime32'] = (Number(monitorData.value['RunTime32']) / 24).toFixed(0);
-      monitorData.value['RunTime42'] = (Number(monitorData.value['RunTime42']) / 24).toFixed(0);
+
       monitorData.value['FluxTotal'] = airCompressor[`InputFlux`];
       //图表数据
       if (dataArr.length <= 5) {

+ 17 - 5
src/views/vent/monitorManager/compressor/nitrogen.data.dlt1.ts

@@ -208,22 +208,34 @@ export const preMonitorList = [
     unit: '℃',
     child: [],
   },
+  // {
+  //   title: `加载时间`,
+  //   code: `LoadTime`,
+  //   unit: 'h',
+  //   child: [],
+  // },
   {
-    title: `加载时间`,
-    code: `LoadTime`,
+    title: `运行时间`,
+    code: `RunTime3`,
     unit: 'h',
     child: [],
   },
   {
     title: `运行时间`,
-    code: `RunTime3`,
-    unit: 'd',
+    code: `RunTime2`,
+    unit: 'min',
+    child: [],
+  },
+  {
+    title: `运行时间`,
+    code: `RunTime1`,
+    unit: 's',
     child: [],
   },
   {
     title: `保养时间`,
     code: `RunTime4`,
-    unit: 'd',
+    unit: 'h',
     child: [],
   },
   {

+ 0 - 113
src/views/vent/monitorManager/gateMonitor/gate.threejs.qd.ts

@@ -55,32 +55,6 @@ class Fm3 {
     pointLight3.position.set(-0.5, -0.5, 0.75);
     pointLight3.shadow.bias = 0.05;
     this.group?.add(pointLight3);
-
-    // const pointLight4 = new THREE.PointLight(0xffeeee, 1, 150);
-    // pointLight4.position.set(4.3, 1, -0.9);
-    // pointLight4.shadow.bias = 0.05;
-    // this.group?.add(pointLight4);
-
-    // const pointLight5 = new THREE.PointLight(0xffeeee, 1, 150);
-    // pointLight5.position.set(4.3, 1, -0.9);
-    // pointLight5.shadow.bias = 0.05;
-    // this.group?.add(pointLight5);
-
-    // const pointLight6 = new THREE.PointLight(0xffeeee, 1, 150);
-    // pointLight6.position.set(-4.4, 1, -0.9);
-    // pointLight6.shadow.bias = 0.05;
-    // this.group?.add(pointLight6);
-
-    // const pointLightHelper2 = new THREE.PointLightHelper(pointLight2, 1);
-    // this.model.scene?.add(pointLightHelper2);
-
-    // gui.add(pointLight2.position, 'x', -300, 300);
-    // gui.add(pointLight2.position, 'y', -300, 300);
-    // gui.add(pointLight2.position, 'z', -300, 300);
-
-    // gui.add(pointLight3.position, 'x', -300, 300);
-    // gui.add(pointLight3.position, 'y', -300, 300);
-    // gui.add(pointLight3.position, 'z', -300, 300);
   }
   // 重置摄像头
   resetCamera() {
@@ -243,41 +217,6 @@ class Fm3 {
       clearTimeout(this.animationTimer);
       this.animationTimer = null;
     }
-
-    // 判断是否点击到视频
-    intersects.find((intersect) => {
-      const mesh = intersect.object;
-      // if (mesh.name === 'player1') {
-      //   if (new Date().getTime() - this.playerStartClickTime1 < 400) {
-      //     // 双击,视频放大
-      //     if (this.player1) {
-      //       this.player1.requestPictureInPicture();
-      //     }
-      //   }
-      //   this.playerStartClickTime1 = new Date().getTime();
-      //   return true;
-      // } else if (mesh.name === 'player2') {
-      //   if (new Date().getTime() - this.playerStartClickTime2 < 400) {
-      //     // 双击,视频放大
-      //     if (this.player2) {
-      //       this.player2.requestPictureInPicture();
-      //     }
-      //   }
-      //   this.playerStartClickTime2 = new Date().getTime();
-      //   return true;
-      // } else if (mesh.name.startsWith('hotPoint')) {
-      //   if (this.deviceDetailCSS3D) {
-      //     this.deviceDetailCSS3D.position.set(mesh.position.x + 0.035, mesh.position.y + 0.68, mesh.position.z + 0.02);
-      //     console.log('[ deviceDetailCSS3D.position ] >', this.deviceDetailCSS3D.position);
-      //     this.deviceDetailCSS3D.visible = true;
-      //     return true;
-      //   }
-      // } else {
-      //   if (this.deviceDetailCSS3D) this.deviceDetailCSS3D.visible = false;
-      //   console.log('[ 点击事件 ] >');
-      // }
-      return false;
-    });
   }
 
   mouseUpModel() {
@@ -395,60 +334,10 @@ class Fm3 {
             if (this.backDamperClosedMesh) this.backDamperClosedMesh.visible = true;
           };
           break;
-        // case 5: // 打开前后门
-        //   handler = () => {
-        //     this.clipActionArr.backDoor.paused = true;
-        //     this.clipActionArr.frontDoor.paused = true;
-
-        //     this.clipActionArr.frontDoor.reset();
-        //     this.clipActionArr.frontDoor.time = 0;
-        //     this.clipActionArr.frontDoor.timeScale = 0.01;
-        //     this.clipActionArr.frontDoor.clampWhenFinished = true;
-        //     this.clipActionArr.frontDoor.play();
-
-        //     this.clipActionArr.backDoor.reset();
-        //     this.clipActionArr.backDoor.time = 0;
-        //     this.clipActionArr.backDoor.timeScale = 0.01;
-        //     this.clipActionArr.backDoor.clampWhenFinished = true;
-        //     this.clipActionArr.backDoor.play();
-        //     this.frontClock.start();
-        //     this.backClock.start();
-        //   };
-        //   break;
-        // case 6: // 关闭前后门
-        //   handler = () => {
-        //     debugger;
-        //     this.clipActionArr.backDoor.paused = true;
-        //     this.clipActionArr.frontDoor.paused = true;
-
-        //     this.clipActionArr.frontDoor.reset();
-        //     this.clipActionArr.frontDoor.time = 4;
-        //     this.clipActionArr.frontDoor.timeScale = -0.01;
-        //     this.clipActionArr.frontDoor.clampWhenFinished = true;
-        //     this.clipActionArr.frontDoor.play();
-        //     this.clipActionArr.backDoor.reset();
-        //     this.clipActionArr.backDoor.time = 4;
-        //     this.clipActionArr.backDoor.timeScale = -0.01;
-        //     this.clipActionArr.backDoor.clampWhenFinished = true;
-        //     this.clipActionArr.backDoor.play();
-        //     this.frontClock.start();
-        //     this.backClock.start();
-        //   };
-        //   break;
         default:
       }
       handler();
     }
-    // model.clock.start();
-    // const honglvdeng = group.getObjectByName('honglvdeng');
-    // const material = honglvdeng.material;
-    // setTimeout(() => {
-    //   if (handlerState === 2 || handlerState === 4 || handlerState === 6) {
-    //     material.color = new THREE.Color(0x00ff00);
-    //   } else {
-    //     material.color = new THREE.Color(0xff0000);
-    //   }
-    // }, 1000);
   }
 
   async initCamera(dom1) {
@@ -563,8 +452,6 @@ class Fm3 {
       this.clipActionArr.frontDoor = undefined;
 
       this.mixers = undefined;
-
-      // document.getElementById('damper3D').parentElement.remove(document.getElementById('damper3D'))
     }
   }
 }

+ 41 - 4
src/views/vent/monitorManager/gateMonitor/gate.threejs.ts

@@ -17,7 +17,15 @@ let model,
   fmXr: FmXR, //行人风门
   fmTwoSs, //
   group: THREE.Object3D,
-  fmType = '';
+  fmType = '',
+  windowType = 'singleWindow';
+
+const rotationParam = {
+  frontDeg0: 0, // 前门初始
+  frontDeg1: 0, // 前门目标
+  backDeg0: 0, // 后门初始
+  backDeg1: 0, // 后门目标
+};
 
 const { mouseDownFn } = useEvent();
 
@@ -102,6 +110,31 @@ export const play = (handlerState, flag?) => {
   }
 };
 
+export const playWindow = (rotationParam, flag) => {
+  if (fmType === 'fm3' && fm3) {
+    return fm3.playWindow.call(fm3, rotationParam, flag);
+  }
+};
+
+export function computePlay(data, maxarea, isFirst = false) {
+  debugger;
+  if (data.OpenDegree1 || data.OpenDegree2) {
+    maxarea = 90;
+    rotationParam.frontDeg0 = (90 / maxarea) * Number(isFirst ? 0 : data.OpenDegree1);
+    rotationParam.backDeg0 = (90 / maxarea) * Number(isFirst ? 0 : data.OpenDegree2);
+    rotationParam.frontDeg1 = (90 / maxarea) * Number(data.OpenDegree1) || 0;
+    rotationParam.backDeg1 = (90 / maxarea) * Number(data.OpenDegree2) || 0;
+
+    // if (!rotationParam.frontDeg1 && !rotationParam.backDeg1) {
+    //   // 当返回值有误时默认关闭
+    //   fm3.playWindow.call(fm3, rotationParam, 1);
+    //   fm3.playWindow.call(fm3, rotationParam, 2);
+    // }
+    fm3.playWindow.call(fm3, rotationParam, 1);
+    fm3.playWindow.call(fm3, rotationParam, 2);
+  }
+}
+
 // 切换风门类型
 export const setModelType = (type) => {
   debugger;
@@ -289,11 +322,11 @@ export const initCameraCanvas = async (playerVal1) => {
 
 export const mountedThree = (playerDom) => {
   const { sysOrgCode } = useGlobSetting();
-  // const sysOrgCode = 'zmjthjg';
+  // const sysOrgCode = 'gsgszdek';
   return new Promise(async (resolve) => {
     model = new UseThree('#damper3D', '', '#deviceDetail');
     model.setEnvMap('test1');
-    model.renderer.toneMappingExposure = 1.0;
+    model.renderer.toneMappingExposure = 0.9;
     model.camera.position.set(100, 0, 1000);
     switch (sysOrgCode) {
       case 'yjmdsankuang': //窑街三矿
@@ -302,7 +335,6 @@ export const mountedThree = (playerDom) => {
         const FmYj = await import('./gate.threejs.yj');
         if (FmYj) fm3 = new FmYj.default(model);
         if (fm3) fm3.mountedThree(playerDom);
-
         const FmTwoYj = await import('./gate.threejs.two.yj');
         if (FmTwoYj) fmTwoSs = new FmTwoYj.default(model);
         fmTwoSs.mountedThree(playerDom);
@@ -312,6 +344,11 @@ export const mountedThree = (playerDom) => {
         if (FmNoSubStation) fm3 = new FmNoSubStation.default(model);
         if (fm3) fm3.mountedThree(playerDom);
         break;
+      case 'gsgszdek':
+        const FmDc = await import('./gate.threejs.window');
+        if (FmDc) fm3 = new FmDc.default(model);
+        if (fm3) fm3.mountedThree(playerDom);
+        break;
       default:
         fm3 = new Fm3(model);
         fm3.mountedThree(playerDom);

+ 507 - 0
src/views/vent/monitorManager/gateMonitor/gate.threejs.window.ts

@@ -0,0 +1,507 @@
+import * as THREE from 'three';
+import { CSS2DObject } from 'three/examples/jsm/renderers/CSS2DRenderer.js';
+import { getTextCanvas, renderVideo } from '/@/utils/threejs/util';
+import gsap from 'gsap';
+import { drawHot } from '/@/utils/threejs/util';
+import { useAppStore } from '/@/store/modules/app';
+
+// import * as dat from 'dat.gui';
+// const gui = new dat.GUI();
+// gui.domElement.style = 'position:absolute;top:100px;left:10px;z-index:99999999999999';
+
+class FmDc {
+  modelName = 'fmDc';
+  model; //
+  group;
+  isLRAnimation = true; // 是否开启左右摇摆动画
+  direction = 1; // 摇摆方向
+  animationTimer: NodeJS.Timeout | null = null; // 摇摆开启定时器
+  player1;
+  player2;
+  deviceDetailCSS3D;
+  playerStartClickTime1 = new Date().getTime();
+  playerStartClickTime2 = new Date().getTime();
+
+  fmClock = new THREE.Clock();
+  mixers: THREE.AnimationMixer | undefined;
+  appStore = useAppStore();
+
+  backDamperOpenMesh;
+  backDamperClosedMesh;
+  frontDamperOpenMesh;
+  frontDamperClosedMesh;
+
+  clipActionArr = {
+    frontDoor: null as unknown as THREE.AnimationAction,
+    backDoor: null as unknown as THREE.AnimationAction,
+  };
+  windowsActionArr = {
+    frontWindow: <THREE.Mesh[]>[],
+    backWindow: <THREE.Mesh[]>[],
+  };
+
+  constructor(model) {
+    this.model = model;
+  }
+
+  addLight() {}
+  // 重置摄像头
+  resetCamera() {
+    this.model.camera.far = 274;
+    this.model.orbitControls?.update();
+    this.model.camera.updateProjectionMatrix();
+  }
+  // 设置模型位置
+  setModalPosition() {
+    this.group?.scale.set(22, 22, 22);
+    this.group?.position.set(-20, 20, 9);
+  }
+
+  /* 添加监控数据 */
+  addMonitorText(selectData) {
+    if (!this.group) {
+      return;
+    }
+    const screenDownText = VENT_PARAM['modalText']
+      ? VENT_PARAM['modalText']
+      : History_Type['type'] == 'remote'
+      ? `国能神东煤炭集团监制`
+      : '煤炭科学技术研究院有限公司研制';
+
+    const screenDownTextX = 80 - (screenDownText.length - 10) * 6;
+
+    const textArr = [
+      {
+        text: `远程控制自动风门`,
+        font: 'normal 30px Arial',
+        color: '#00FF00',
+        strokeStyle: '#007400',
+        x: 120,
+        y: 100,
+      },
+      {
+        text: `净通行高度(m):`,
+        font: 'normal 30px Arial',
+        color: '#00FF00',
+        strokeStyle: '#007400',
+        x: 0,
+        y: 155,
+      },
+      {
+        text: `${selectData.fclearheight ? selectData.fclearheight : '-'}`,
+        font: 'normal 30px Arial',
+        color: '#00FF00',
+        strokeStyle: '#007400',
+        x: 290,
+        y: 155,
+      },
+      {
+        text: `净通行宽度(m): `,
+        font: 'normal 30px Arial',
+        color: '#00FF00',
+        strokeStyle: '#007400',
+        x: 0,
+        y: 215,
+      },
+      {
+        text: ` ${selectData.fclearwidth ? selectData.fclearwidth : '-'}`,
+        font: 'normal 30px Arial',
+        color: '#00FF00',
+        strokeStyle: '#007400',
+        x: 280,
+        y: 215,
+      },
+      {
+        text: `故障诊断:`,
+        font: 'normal 30px Arial',
+        color: '#00FF00',
+        strokeStyle: '#007400',
+        x: 0,
+        y: 275,
+      },
+      {
+        text: `${selectData.warnLevel_str ? selectData.warnLevel_str : '-'}`,
+        font: 'normal 30px Arial',
+        color: '#00FF00',
+        strokeStyle: '#007400',
+        x: 280,
+        y: 275,
+      },
+      {
+        text: screenDownText,
+        font: 'normal 28px Arial',
+        color: '#00FF00',
+        strokeStyle: '#007400',
+        x: screenDownTextX,
+        y: 325,
+      },
+    ];
+    //
+    getTextCanvas(526, 346, textArr, '').then((canvas: HTMLCanvasElement) => {
+      const textMap = new THREE.CanvasTexture(canvas); // 关键一步
+      textMap.colorSpace = THREE.SRGBColorSpace;
+      const textMaterial = new THREE.MeshBasicMaterial({
+        // 关于材质并未讲解 实操即可熟悉                 这里是漫反射类似纸张的材质,对应的就有高光类似金属的材质.
+        map: textMap, // 设置纹理贴图
+        transparent: true,
+        side: THREE.FrontSide, // 这里是双面渲染的意思
+      });
+      textMaterial.blending = THREE.CustomBlending;
+      const monitorPlane = this.group.getObjectByName('monitorText');
+      if (monitorPlane) {
+        monitorPlane.material = textMaterial;
+      } else {
+        const planeGeometry = new THREE.PlaneGeometry(526, 346); // 平面3维几何体PlaneGeometry
+        const planeMesh = new THREE.Mesh(planeGeometry, textMaterial);
+        planeMesh.name = 'monitorText';
+        planeMesh.scale.set(0.002, 0.002, 0.002);
+        planeMesh.position.set(4.025, 0.67, -0.27);
+        this.group.add(planeMesh);
+      }
+      textMap.dispose();
+    });
+  }
+
+  /** 添加热点 */
+  drawHots() {
+    const hotPositions = [
+      { x: -0.37, y: 0.26, z: -0.32 },
+      { x: 0.28, y: -0.2, z: -0.43 },
+      { x: 0.55, y: -0.22, z: -0.38 },
+    ];
+    for (let i = 0; i < 3; i++) {
+      const hotPoint = drawHot(0.1);
+      const position = hotPositions[i];
+      hotPoint.scale.set(0.1, 0.1, 0.1);
+      hotPoint.position.set(position.x, position.y, position.z);
+      hotPoint.name = 'hotPoint' + i;
+      this.group?.add(hotPoint);
+    }
+  }
+
+  /* 风门动画 */
+  render() {
+    if (!this.model) {
+      return;
+    }
+    if (this.isLRAnimation && this.group) {
+      // 左右摇摆动画
+      if (Math.abs(this.group.rotation.y) >= 0.2) {
+        this.direction = -this.direction;
+        this.group.rotation.y += 0.00002 * 30 * this.direction;
+      } else {
+        this.group.rotation.y += 0.00002 * 30 * this.direction;
+      }
+    }
+
+    if (this.mixers && this.fmClock.running) {
+      this.mixers.update(2);
+    }
+  }
+
+  /* 点击风窗,风窗全屏 */
+  mousedownModel(intersects: THREE.Intersection<THREE.Object3D<THREE.Event>>[]) {
+    this.isLRAnimation = false;
+    if (this.animationTimer) {
+      clearTimeout(this.animationTimer);
+      this.animationTimer = null;
+    }
+  }
+
+  mouseUpModel() {
+    // 10s后开始摆动
+    if (!this.animationTimer && !this.isLRAnimation) {
+      this.animationTimer = setTimeout(() => {
+        this.isLRAnimation = true;
+      }, 10000);
+    }
+  }
+
+  /* 提取风门序列帧,初始化前后门动画 */
+  initAnimation() {
+    const fmGroup = this.group?.getObjectByName('fm-window');
+    if (fmGroup) {
+      const tracks = fmGroup.animations[0].tracks;
+      const fontTracks: any[] = [],
+        backTracks: any[] = [];
+      for (let i = 0; i < tracks.length; i++) {
+        const track = tracks[i];
+        if (track.name.includes('_1')) {
+          fontTracks.push(track);
+        } else {
+          backTracks.push(track);
+        }
+      }
+      const parentGroup = fmGroup.getObjectByName('MeiCangLianLuoHangFengMen');
+      // const frontGroup = parentGroup.getObjectByName('FengMen2');
+      // const backGroup = parentGroup.getObjectByName('FengMen1');
+      debugger;
+      this.mixers = new THREE.AnimationMixer(parentGroup);
+
+      const frontDoor = new THREE.AnimationClip('frontDoor', 2.5, fontTracks);
+      const frontClipAction = this.mixers.clipAction(frontDoor, parentGroup);
+      frontClipAction.clampWhenFinished = true;
+      frontClipAction.loop = THREE.LoopOnce;
+      this.clipActionArr.frontDoor = frontClipAction;
+
+      const backDoor = new THREE.AnimationClip('backDoor', 2.5, backTracks);
+      const backClipAction = this.mixers.clipAction(backDoor, parentGroup);
+      backClipAction.clampWhenFinished = true;
+      backClipAction.loop = THREE.LoopOnce;
+      this.clipActionArr.backDoor = backClipAction;
+    }
+    // 编写风窗
+  }
+  /* 提取风门序列帧,初始化前后门动画 */
+  initWindowAnimation() {
+    const meshArr01: THREE.Object3D[] = [];
+    const meshArr02: THREE.Object3D[] = [];
+    const windowGroup = new THREE.Group();
+    windowGroup.name = 'hiddenGroup';
+    const fmGroup = this.group?.getObjectByName('fm-window');
+    const parentGroup = fmGroup.getObjectByName('MeiCangLianLuoHangFengMen');
+    const frontGroup = parentGroup.getObjectByName('FengMen2');
+    const backGroup = parentGroup.getObjectByName('FengMen');
+
+    frontGroup.traverse((obj) => {
+      if (obj.type === 'Mesh' && obj.name && obj.name.startsWith('shanye')) {
+        obj.rotateOnAxis(new THREE.Vector3(0, 0, 1), 0);
+        meshArr01.push(obj);
+      }
+    });
+    backGroup.traverse((obj) => {
+      if (obj.type === 'Mesh' && obj.name && obj.name.startsWith('shanye')) {
+        obj.rotateOnAxis(new THREE.Vector3(0, 0, 1), 0);
+        meshArr02.push(obj);
+      }
+    });
+
+    this.windowsActionArr.frontWindow = meshArr01;
+    this.windowsActionArr.backWindow = meshArr02;
+    this.group?.add(windowGroup);
+  }
+
+  deviceDetailCard(position = { x: 0, y: 0, z: 0 }) {
+    const element = document.getElementById('deviceCard') as HTMLElement;
+    if (element) {
+      this.deviceDetailCSS3D = new CSS2DObject(element);
+      this.deviceDetailCSS3D.name = 'deviceCard';
+      this.deviceDetailCSS3D.position.set(position.x, position.y, position.z);
+      this.deviceDetailCSS3D.visible = false;
+      // this.model.scene.add(this.deviceDetailCSS3D);
+      this.group.add(this.deviceDetailCSS3D);
+    }
+  }
+
+  // 播放动画
+  play(handlerState, timeScale = 0.01) {
+    let handler = () => {};
+    if (this.clipActionArr.frontDoor && this.clipActionArr.backDoor) {
+      switch (handlerState) {
+        case 1: // 打开前门
+          handler = () => {
+            this.clipActionArr.frontDoor.paused = true;
+            this.clipActionArr.frontDoor.reset();
+            this.clipActionArr.frontDoor.time = 0;
+            this.clipActionArr.frontDoor.timeScale = timeScale;
+            // this.clipActionArr.frontDoor.clampWhenFinished = true;
+            this.clipActionArr.frontDoor.play();
+            this.fmClock.start();
+
+            // 显示打开前门文字
+            if (this.frontDamperOpenMesh) this.frontDamperOpenMesh.visible = true;
+            if (this.frontDamperClosedMesh) this.frontDamperClosedMesh.visible = false;
+          };
+          break;
+        case 2: // 关闭前门
+          handler = () => {
+            this.clipActionArr.frontDoor.paused = true;
+            this.clipActionArr.frontDoor.reset(); //
+            this.clipActionArr.frontDoor.time = 2.5;
+            this.clipActionArr.frontDoor.timeScale = -timeScale;
+            // this.clipActionArr.frontDoor.clampWhenFinished = true;
+            this.clipActionArr.frontDoor.play();
+            this.fmClock.start();
+
+            if (this.frontDamperOpenMesh) this.frontDamperOpenMesh.visible = false;
+            if (this.frontDamperClosedMesh) this.frontDamperClosedMesh.visible = true;
+          };
+          break;
+        case 3: // 打开后门
+          handler = () => {
+            this.clipActionArr.backDoor.paused = true;
+            this.clipActionArr.backDoor.reset();
+            this.clipActionArr.backDoor.time = 0;
+            this.clipActionArr.backDoor.timeScale = timeScale;
+            // this.clipActionArr.backDoor.clampWhenFinished = true;
+            this.clipActionArr.backDoor.play();
+            this.fmClock.start();
+
+            if (this.backDamperOpenMesh) this.backDamperOpenMesh.visible = true;
+            if (this.backDamperClosedMesh) this.backDamperClosedMesh.visible = false;
+          };
+          break;
+        case 4: // 关闭后门
+          handler = () => {
+            this.clipActionArr.backDoor.paused = true;
+            this.clipActionArr.backDoor.reset();
+            this.clipActionArr.backDoor.time = 2.5;
+            this.clipActionArr.backDoor.timeScale = -timeScale;
+            // this.clipActionArr.backDoor.clampWhenFinished = true;
+            this.clipActionArr.backDoor.play();
+            this.fmClock.start();
+
+            if (this.backDamperOpenMesh) this.backDamperOpenMesh.visible = false;
+            if (this.backDamperClosedMesh) this.backDamperClosedMesh.visible = true;
+          };
+          break;
+        default:
+      }
+      handler();
+    }
+  }
+
+  playWindow(rotationParam, flag) {
+    if (this.windowsActionArr.frontWindow.length <= 0 || this.windowsActionArr.backWindow.length <= 0) {
+      return;
+    }
+    debugger;
+    if (flag === 1) {
+      // 前风窗动画
+      this.windowsActionArr.frontWindow.forEach((mesh) => {
+        gsap.to(mesh.rotation, {
+          z: THREE.MathUtils.degToRad(rotationParam.frontDeg1),
+          duration: (1 / 9) * Math.abs(rotationParam.frontDeg1 - mesh.rotation.z),
+          overwrite: true,
+        });
+      });
+    } else if (flag === 2) {
+      // 后风窗动画
+      this.windowsActionArr.backWindow.forEach((mesh) => {
+        gsap.to(mesh.rotation, {
+          z: THREE.MathUtils.degToRad(rotationParam.backDeg1),
+          duration: (1 / 9) * Math.abs(rotationParam.backDeg1 - mesh.rotation.z),
+          overwrite: true,
+        });
+      });
+    } else if (flag === 0) {
+      ([...this.windowsActionArr.frontWindow, ...this.windowsActionArr.backWindow] as THREE.Mesh[]).forEach((mesh) => {
+        gsap.to(mesh.rotation, {
+          z: 0,
+          overwrite: true,
+        });
+      });
+    }
+  }
+
+  async initCamera(dom1) {
+    const videoPlayer1 = dom1;
+    this.player1 = dom1;
+    let monitorPlane: THREE.Mesh | null = null;
+    if (!videoPlayer1) {
+      const textArr = [
+        {
+          text: `无信号输入`,
+          font: 'normal 40px Arial',
+          color: '#009900',
+          strokeStyle: '#002200',
+          x: 170,
+          y: 40,
+        },
+      ];
+      const canvas = await getTextCanvas(320, 180, '', 'noSinge.png');
+
+      let textMaterial: THREE.MeshBasicMaterial | null = null;
+      if (canvas) {
+        const textMap = new THREE.CanvasTexture(canvas); // 关键一步
+        textMaterial = new THREE.MeshBasicMaterial({
+          map: textMap, // 设置纹理贴图
+          transparent: true,
+          side: THREE.DoubleSide, // 这里是双面渲染的意思
+        });
+        textMaterial.blending = THREE.CustomBlending;
+
+        const planeGeometry = new THREE.PlaneGeometry(100, 100); // 平面3维几何体PlaneGeometry
+        monitorPlane = new THREE.Mesh(planeGeometry, textMaterial);
+
+        textMaterial.dispose();
+        planeGeometry.dispose();
+        textMap.dispose();
+      }
+    }
+    const player1 = this.group.getObjectByName('player1');
+    if (player1) {
+      this.model.clearMesh(player1);
+      this.group.remove(player1);
+    }
+    const noPlayer1 = this.group.getObjectByName('noPlayer1');
+    if (noPlayer1) {
+      this.model.clearMesh(noPlayer1);
+      this.group.remove(noPlayer1);
+    }
+    if (!videoPlayer1 && videoPlayer1 === null) {
+      if (monitorPlane && !this.group.getObjectByName('noPlayer1')) {
+        const planeMesh = monitorPlane.clone();
+        planeMesh.name = 'noPlayer1';
+        planeMesh.scale.set(0.0085, 0.0055, 0.012);
+        planeMesh.position.set(-3.64, 0.01, -0.41);
+        this.group?.add(planeMesh.clone());
+      }
+    } else if (videoPlayer1) {
+      try {
+        const mesh = renderVideo(this.group, videoPlayer1, 'player1');
+        if (mesh) {
+          mesh?.scale.set(-0.0275, 0.028, 1);
+          mesh?.position.set(-3.643, 0.02, -0.4);
+          mesh.rotation.y = -Math.PI;
+          this.group.add(mesh);
+        }
+      } catch (error) {
+        console.log('视频信号异常');
+      }
+    }
+  }
+
+  mountedThree(playerDom) {
+    this.group = new THREE.Object3D();
+    this.group.name = this.modelName;
+    return new Promise((resolve) => {
+      this.model.setGLTFModel(['fm-window'], this.group).then(() => {
+        console.log('带风窗风门模型----->', this.group);
+        this.setModalPosition();
+        // 初始化左右摇摆动画;
+        this.initAnimation();
+        this.initWindowAnimation();
+        // this.drawHots();
+        this.addLight();
+        // this.deviceDetailCard();
+        this.model.animate();
+
+        resolve(this.model);
+      });
+    });
+  }
+
+  destroy() {
+    if (this.model) {
+      if (this.mixers) {
+        this.mixers.uncacheClip(this.clipActionArr.frontDoor.getClip());
+        this.mixers.uncacheClip(this.clipActionArr.backDoor.getClip());
+        this.mixers.uncacheAction(this.clipActionArr.frontDoor.getClip(), this.group);
+        this.mixers.uncacheAction(this.clipActionArr.backDoor.getClip(), this.group);
+        this.mixers.uncacheRoot(this.group);
+
+        if (this.model.animations[0]) this.model.animations[0].tracks = [];
+      }
+      this.model.clearGroup(this.group);
+      this.clipActionArr.backDoor = undefined;
+      this.clipActionArr.frontDoor = undefined;
+
+      this.windowsActionArr.frontWindow = undefined;
+      this.windowsActionArr.backWindow = undefined;
+
+      this.mixers = undefined;
+    }
+  }
+}
+export default FmDc;

+ 0 - 56
src/views/vent/monitorManager/gateMonitor/gate.threejs.yy.ts

@@ -55,32 +55,6 @@ class Fm1 {
     pointLight3.position.set(-0.5, -0.5, 0.75);
     pointLight3.shadow.bias = 0.05;
     this.group?.add(pointLight3);
-
-    // const pointLight4 = new THREE.PointLight(0xffeeee, 1, 150);
-    // pointLight4.position.set(4.3, 1, -0.9);
-    // pointLight4.shadow.bias = 0.05;
-    // this.group?.add(pointLight4);
-
-    // const pointLight5 = new THREE.PointLight(0xffeeee, 1, 150);
-    // pointLight5.position.set(4.3, 1, -0.9);
-    // pointLight5.shadow.bias = 0.05;
-    // this.group?.add(pointLight5);
-
-    // const pointLight6 = new THREE.PointLight(0xffeeee, 1, 150);
-    // pointLight6.position.set(-4.4, 1, -0.9);
-    // pointLight6.shadow.bias = 0.05;
-    // this.group?.add(pointLight6);
-
-    // const pointLightHelper2 = new THREE.PointLightHelper(pointLight2, 1);
-    // this.model.scene?.add(pointLightHelper2);
-
-    // gui.add(pointLight2.position, 'x', -300, 300);
-    // gui.add(pointLight2.position, 'y', -300, 300);
-    // gui.add(pointLight2.position, 'z', -300, 300);
-
-    // gui.add(pointLight3.position, 'x', -300, 300);
-    // gui.add(pointLight3.position, 'y', -300, 300);
-    // gui.add(pointLight3.position, 'z', -300, 300);
   }
   // 重置摄像头
   resetCamera() {
@@ -246,36 +220,6 @@ class Fm1 {
 
     // 判断是否点击到视频
     intersects.find((intersect) => {
-      const mesh = intersect.object;
-      // if (mesh.name === 'player1') {
-      //   if (new Date().getTime() - this.playerStartClickTime1 < 400) {
-      //     // 双击,视频放大
-      //     if (this.player1) {
-      //       this.player1.requestPictureInPicture();
-      //     }
-      //   }
-      //   this.playerStartClickTime1 = new Date().getTime();
-      //   return true;
-      // } else if (mesh.name === 'player2') {
-      //   if (new Date().getTime() - this.playerStartClickTime2 < 400) {
-      //     // 双击,视频放大
-      //     if (this.player2) {
-      //       this.player2.requestPictureInPicture();
-      //     }
-      //   }
-      //   this.playerStartClickTime2 = new Date().getTime();
-      //   return true;
-      // } else if (mesh.name.startsWith('hotPoint')) {
-      //   if (this.deviceDetailCSS3D) {
-      //     this.deviceDetailCSS3D.position.set(mesh.position.x + 0.035, mesh.position.y + 0.68, mesh.position.z + 0.02);
-      //     console.log('[ deviceDetailCSS3D.position ] >', this.deviceDetailCSS3D.position);
-      //     this.deviceDetailCSS3D.visible = true;
-      //     return true;
-      //   }
-      // } else {
-      //   if (this.deviceDetailCSS3D) this.deviceDetailCSS3D.visible = false;
-      //   console.log('[ 点击事件 ] >');
-      // }
       return false;
     });
   }

+ 27 - 7
src/views/vent/monitorManager/gateMonitor/index.vue

@@ -29,9 +29,14 @@
         <div v-if="hasPermission('btn:control') && selectData.deviceType == 'gate_ss'" class="button-box" @click="playAnimation(9)">关闭中间门</div>
         <div v-if="hasPermission('btn:control')" class="button-box" @click="playAnimation(3)">打开后门</div>
         <div v-if="hasPermission('btn:control')" class="button-box" @click="playAnimation(4)">关闭后门</div>
-        <div v-if="hasPermission('btn:control') && selectData.deviceType != 'gate_ss'" class="button-box" @click="playAnimation(5)">同时打开</div>
-        <div v-if="hasPermission('btn:control') && selectData.deviceType != 'gate_ss'" class="button-box" @click="playAnimation(6)">同时关闭</div>
-        <div v-if="hasPermission('btn:controlWindow')" class="button-box" @click="playAnimation(10)">风窗控制</div>
+        <div v-if="!hasPermission('btn:controlWindow') && selectData.deviceType != 'gate_ss'" class="button-box" @click="playAnimation(5)"
+          >同时打开</div
+        >
+        <div v-if="!hasPermission('btn:controlWindow') && selectData.deviceType != 'gate_ss'" class="button-box" @click="playAnimation(6)"
+          >同时关闭</div
+        >
+        <div v-if="hasPermission('btn:controlWindow')" class="button-box" @click="playAnimation(10)">A风窗控制</div>
+        <div v-if="hasPermission('btn:controlWindow')" class="button-box" @click="playAnimation(11)">B风窗控制</div>
       </div>
       <!-- 控制模式 -->
       <div class="top-right row" v-if="hasPermission('btn:remote')">
@@ -300,7 +305,7 @@
   import HandlerHistoryTable from '../comment/HandlerHistoryTable.vue';
   import HandleModal from './modal.vue';
   import DeviceBaseInfo from '../comment/components/DeviceBaseInfo.vue';
-  import { mountedThree, addMonitorText, play, destroy, setModelType, initCameraCanvas } from './gate.threejs';
+  import { mountedThree, addMonitorText, play, destroy, setModelType, computePlay, playWindow } from './gate.threejs';
   import { deviceControlApi } from '/@/api/vent/index';
   import { message } from 'ant-design-vue';
   import { list, getTableList, cameraList, cameraAddrList } from './gate.api';
@@ -574,10 +579,16 @@
         break;
 
       case 10: // 风窗控制
-        modalTitle.value = '风窗控制';
+        modalTitle.value = '前门风窗控制';
         modalType.value = '10';
         modalIsShow.value = true;
         break;
+
+      case 11: // 风窗控制
+        modalTitle.value = '后门风窗控制';
+        modalType.value = '11';
+        modalIsShow.value = true;
+        break;
     }
 
     if (globalConfig?.simulatedPassword) {
@@ -784,10 +795,13 @@
           selectData.autoRoManual = null;
         }
         break;
-      case '10': // 风窗控制
+      case '10': // 前门风窗控制
         data.paramcode = 'frontSetValue';
         data.value = value;
-
+        break;
+      case '11': // 后门风窗控制
+        data.paramcode = 'rearSetValue';
+        data.value = value;
         break;
     }
 
@@ -821,6 +835,8 @@
   let midDeviceState = 0; //记录设备状态,为了与下一次监测数据做比较
   function monitorAnimation(selectData) {
     const timeScale = 0.005;
+    // 带风窗 风窗动画
+    playWindowAnimation(selectData);
 
     if (selectData.frontGateOpen == '1' && selectData.frontGateClose == '0' && !isFrontOpenRunning) {
       isFrontOpenRunning = true;
@@ -922,6 +938,10 @@
     }
   }
 
+  function playWindowAnimation(data, maxarea = 90, isFirst = false) {
+    computePlay(data, maxarea, isFirst);
+  }
+
   function handleCancel() {
     modalIsShow.value = false;
     modalTitle.value = '';

+ 35 - 4
src/views/vent/monitorManager/mainFanMonitor/components/conditionAssistance.vue

@@ -91,7 +91,8 @@
   import { message } from 'ant-design-vue';
   import { formatNum } from '/@/utils/ventutil';
   import { getTableHeaderColumns } from '/@/hooks/web/useWebColumns';
-  import { list } from '../main.api';
+  import { useGlobSetting } from '/@/hooks/setting';
+  const { sysOrgCode } = useGlobSetting();
   const props = defineProps({
     deviceType: {
       type: String,
@@ -182,7 +183,14 @@
         })
       ) - 10;
     // const xDataMax = Math.max.apply(Math, assistanceDataList.map(item => { return item.max }))
-    const xDataMax = 230;
+    let xDataMax;
+    if (sysOrgCode == 'sdmtjtdltmk') {
+      // 大柳塔井特殊处理
+      xDataMax = 260;
+    } else {
+      xDataMax = 230;
+      // xDataMax = 260;
+    }
     fanInfoData.flfw = `${xDataMin}~${xDataMax}`;
     const computeItem = (item: AssistanceItemType) => {
       const min = item.min;
@@ -208,6 +216,7 @@
         type: 'line',
         smooth: true,
         showSymbol: false,
+        symbol: 'none',
         emphasis: {
           focus: 'series',
         },
@@ -276,15 +285,37 @@
 
   function reSetLine() {
     let minIndex = -1;
+    // for (let i = 0; i < yDataList.length; i++) {
+    //   if (i !== lineNum && i != lineNum + 1) {
+    //     if (yDataList[i]['lineStyle']) yDataList[i]['lineStyle']['color'] = '#ffffff88';
+    //     if (yDataList[i]['lineStyle']) yDataList[i]['lineStyle']['width'] = 1;
+    //     if (yDataList[i]['endLabel'] && yDataList[i]['endLabel']['color']) yDataList[i]['endLabel']['color'] = '#39E9FE99';
+    //     if (yDataList[i]['endLabel'] && yDataList[i]['endLabel']['backgroundColor']) yDataList[i]['endLabel']['backgroundColor'] = 'transparent';
+    //     if (yDataList[i]['z']) yDataList[i]['z'] = 1;
+    //   }
+    //   if (`${resultObj.value.Hz}Hz` == yDataList[i]['name']) {
+    //     minIndex = i;
+    //   }
+    // }
+    // if (minIndex != -1) {
+    //   yDataList[minIndex]['lineStyle']['color'] = '#9A60B4';
+    //   yDataList[minIndex]['lineStyle']['width'] = 2;
+    //   yDataList[minIndex]['endLabel']['color'] = '#9A60B4';
+    //   yDataList[minIndex]['endLabel']['backgroundColor'] = '#111';
+    //   yDataList[minIndex]['z'] = 999;
+    // }
     for (let i = 0; i < yDataList.length; i++) {
       if (i !== lineNum && i != lineNum + 1) {
         if (yDataList[i]['lineStyle']) yDataList[i]['lineStyle']['color'] = '#ffffff88';
         if (yDataList[i]['lineStyle']) yDataList[i]['lineStyle']['width'] = 1;
-        if (yDataList[i]['endLabel'] && yDataList[i]['endLabel']['color']) yDataList[i]['endLabel']['color'] = '#39E9FE99';
+        if (yDataList[i]['endLabel'] && yDataList[i]['endLabel']['color']) {
+          yDataList[i]['endLabel']['color'] = '#39E9FE99';
+        }
         if (yDataList[i]['endLabel'] && yDataList[i]['endLabel']['backgroundColor']) yDataList[i]['endLabel']['backgroundColor'] = 'transparent';
         if (yDataList[i]['z']) yDataList[i]['z'] = 1;
       }
-      if (`${resultObj.value.Hz}Hz` == yDataList[i]['name']) {
+
+      if (resultObj.value && `${resultObj.value.Hz}Hz` == yDataList[i]['name']) {
         minIndex = i;
       }
     }

+ 18 - 3
src/views/vent/monitorManager/mainFanMonitor/main.data.ts

@@ -3,6 +3,7 @@ import { FormSchema } from '/@/components/Table';
 import { rules } from '/@/utils/helper/validator';
 import { reactive } from 'vue';
 import type { EChartsOption } from 'echarts';
+import { useGlobSetting } from '/@/hooks/setting';
 
 type CtrlLockOpenType = {
   CtrlLockOpen: boolean | undefined;
@@ -879,6 +880,7 @@ export const option = reactive<EChartsOption>({
 });
 
 export const initData = () => {
+  const { sysOrgCode } = useGlobSetting();
   const assistanceData = {
     '30': {
       angle: 0,
@@ -1071,7 +1073,7 @@ export const initData = () => {
     },
   };
   const num = 21;
-  const a = -0.17624,
+  const a = -0.17624, //-0.17624,
     m = 2770.6411125432646,
     n = -124.15442010894235;
   let i = 21;
@@ -1080,8 +1082,21 @@ export const initData = () => {
     i -= 1;
     const p = i;
     const item = assistanceData[key];
-    item['b'] = 2 * a * (n + p);
-    item['c'] = a * (n + p) * (n + p) + m - i * 50;
+    if (sysOrgCode == 'sdmtjtdltmk') {
+      // 大柳塔井整体向右下移动
+      item['min'] = item['min'] + 20;
+      item['max'] = item['max'] + 20;
+      item['b'] = 2 * a * (n + p) + 3;
+      item['c'] = a * (n + p) * (n + p) + m - i * 60;
+    } else {
+      item['b'] = 2 * a * (n + p);
+      item['c'] = a * (n + p) * (n + p) + m - i * 50;
+      // item['min'] = item['min'] + 20;
+      // item['max'] = item['max'] + 20;
+      // item['b'] = 2 * a * (n + p) + 3;
+      // item['c'] = a * (n + p) * (n + p) + m - i * 60;
+    }
+
     data.push(item);
   }
   console.log(data);

+ 292 - 7
src/views/vent/monitorManager/nitrogen/components/nitrogenHomeBLT.vue

@@ -62,13 +62,14 @@
   <div class="nitrogen-home">
     <div style="position: absolute; color: #fff; top: 30px; pointer-events: auto; display: flex">
       <div
-        v-for="(sysItem, sysIndex) in monitorDataGroupArr"
+        v-for="(sysItem, sysIndex) in ['北风井', '南风井']"
         :key="sysIndex"
         class="tab-button-box"
         :class="{ 'tab-button-box-active': monitorDataGroupFlag == sysIndex + 1 }"
         @click="setMonitorGroupNum(sysIndex + 1)"
-        >{{ monitorData['deviceType'] === 'forcFan_north' ? '北风井' : '南风井' }} (运行: <p style="padding: 0 5px"></p
-        ><span
+        >{{ sysItem }}
+        <!-- (运行: <p style="padding: 0 5px"></p>
+        <span
           :class="{
             'signal-round': true,
             'signal-round-run':
@@ -86,9 +87,9 @@
             'signal-round-gry':
               sysIndex + 1 == 1 ? sysStateList[sysIndex] && !sysStateList[sysIndex].fault : sysStateList1[sysIndex] && !sysStateList1[sysIndex].fault,
           }"
-        ></span
-        ><p style="padding: 0 5px"></p> )</div
-      >
+        ></span>
+        <p style="padding: 0 5px"></p> ) -->
+      </div>
     </div>
     <div class="total-data">
       <div class="vent-flex-row">
@@ -222,7 +223,291 @@
   }
 
   async function getDataSource() {
-    const res = await list({ devicetype: 'forcFan', pagetype: 'normal' });
+    // const res = await list({ devicetype: 'forcFan', pagetype: 'normal' });
+    const res = {
+      cmd: 'monitordata',
+      msgTxt: [
+        {
+          datalist: [
+            {
+              msgType: null,
+              deviceID: '1749326253834444802',
+              strname: '北风井压风',
+              strinstallpos: '北风井压风',
+              fsectarea: 'null',
+              stationname: '北风井压风',
+              stationtype: 'redis',
+              deviceType: 'forcFan_north',
+              typeName: '压风机北',
+              netStatus: 1,
+              warnFlag: 0,
+              warnLevel: 0,
+              warnLevel_str: '正常',
+              syswarnLevel: null,
+              syswarnLevel_str: null,
+              syswarnLevel_des: null,
+              warnTime: null,
+              readTime: '2024-12-02 18:40:56',
+              warnDes: '',
+              frontGateOpenCtrl: null,
+              rearGateOpenCtrl: null,
+              readData: {
+                PRE1_CPR_InletPre: '2.00',
+                PRE2_CPR_HeadTemp: '13.00',
+                PRE1_MOT_PhaseATemp: '56.40',
+                PRE2_MOT_PhaseAOverTemp: '0',
+                sign: '0',
+                PRE1_CPR_UnLoadPre: '6.20',
+                PRE1_CPR_LoadorUnload: '0',
+                PRE2_CPR_ExhaustTemp: '15.00',
+                PRE2_FaultSignal1: '0',
+                PRE2_CPR_LoadorUnload: '1',
+                PRE2_MOT_PhaseCOverTemp: '0',
+                PRE1_MOT_PhaseBOverTemp: '0',
+                PRE1_CPR_ExhaustPre: '6.40',
+                PRE1_MOT_FrontAxleTemp2: '35.80',
+                PRE1_MOT_FrontAxleTemp1: '0.00',
+                PRE2_CPR_CoolantTemp: '12.00',
+                PRE1_FaultSignal: '0',
+                PRE2_FaultSignal: '0',
+                PRE2_MOT_FrontAxleTemp: '0.00',
+                PRE1_MOT_TotalRunTime: '5477.00',
+                PRE1_CPR_LoadTime: '2405.00',
+                PRE2_CPR_LoadTime: '4464.00',
+                PRE1_CPR_HeadTemp: '86.00',
+                PRE1_MOT_PhaseAOverTemp: '0',
+                PRE2_MOT_PhaseBTemp: '18.50',
+                PRE2_HostorLoc: '0',
+                PRE2_MOT_TotalRunTime: '6534.00',
+                PRE2_MOT_BackAxleTemp: '0.00',
+                PRE2_MOT_RunReturn: '0',
+                TotalInPipeFlow: '869.00',
+                PRE2_CPR_InletPre: '0.00',
+                PRE1_FaultSignal1: '0',
+                PRE2_CPR_ExhaustPre: '5.90',
+                PRE2_MOT_Current: '0.00',
+                PRE1_MOT_BackAxleTemp: '0.00',
+                PRE1_MOT_Current: '24.50',
+                PRE2_MOT_PhaseATemp: '18.20',
+                PRE1_MOT_PhaseCOverTemp: '0',
+                PRE2_MOT_PhaseBOverTemp: '0',
+                PRE1_HostorLoc: '0',
+                PRE1_CPR_LoadPre: '7.00',
+                PRE1_CPR_SeparationCylinderPressure: '77.00',
+                PRE1_MOT_RunReturn: '1',
+                PRE2_MOT_CtrlMode: '1',
+                PRE1_MOT_CtrlMode: '0',
+                PRE2_CPR_LoadPre: '7.00',
+                PRE1_MOT_PhaseCTemp: '32.60',
+                TotalOutPipePre: '6.40',
+                PRE1_CPR_CoolantTemp: '64.00',
+                PRE1_MOT_PhaseBTemp: '59.30',
+                PRE2_MOT_PhaseCTemp: '18.20',
+                PRE2_CPR_UnLoadPre: '6.20',
+                PRE2_CPR_SeparationCylinderPressure: '5.90',
+                isRun: '-2',
+                PRE1_CPR_ExhaustTemp: '23.20',
+              },
+              readDataDes: null,
+              summaryHour: [],
+              summaryDay: [],
+              history: [],
+              dayhistory: [],
+              totalInfo: null,
+              sign: null,
+              cameras: [
+                {
+                  id: '1854452465886429185',
+                  addr: 'c70e0a6f7e0947368e4d9acd37bb3bac',
+                  name: '北压风机房',
+                  devicekind: 'toHKHLs',
+                  cameraRate: null,
+                },
+                {
+                  id: '1854452718454833154',
+                  addr: 'dfa82251816845a4a1c7957384bf2443',
+                  name: '北压风机房变电所',
+                  devicekind: 'toHKHLs',
+                  cameraRate: null,
+                },
+              ],
+              links: [],
+              other1: null,
+              other2: null,
+              other3: null,
+              remarkInfo: null,
+              linkInfo: null,
+              addrIndex: null,
+              warnLogNotOkCount: 0,
+              otherInfo: null,
+            },
+            {
+              msgType: null,
+              deviceID: '1749326210754748418',
+              strname: '南风井压风',
+              strinstallpos: '南风井压风',
+              fsectarea: 'null',
+              stationname: '南风井压风',
+              stationtype: 'redis',
+              deviceType: 'forcFan_south',
+              typeName: '压风机南',
+              netStatus: 1,
+              warnFlag: 0,
+              warnLevel: 0,
+              warnLevel_str: '正常',
+              syswarnLevel: null,
+              syswarnLevel_str: null,
+              syswarnLevel_des: null,
+              warnTime: null,
+              readTime: '2024-12-02 18:40:56',
+              warnDes: '',
+              frontGateOpenCtrl: null,
+              rearGateOpenCtrl: null,
+              readData: {
+                PRE1_MOT_FrontAxleOverTempAlam: '0',
+                PRE3_MOT_PhaseBTempStop: '0',
+                PRE3_CPR_CoolantTemp: '72.00',
+                PRE1_MOT_PhaseATemp: '83.40',
+                PRE2_MOT_PhaseCTempStop: '0',
+                PRE2_MOT_PhaseAOverTemp: '0',
+                PRE2_MOT_BackAxleOverTempAlam: '0',
+                PRE3_AlarmHistory: '0.00',
+                PRE1_MOT_BackAxleOverTempStop: '0',
+                PRE2_CPR_LoadorUnload: '1',
+                PRE3_MOT_PhaseBTemp: '74.80',
+                PRE1_MOT_PhaseBOverTemp: '0',
+                PRE1_CPR_ExhaustPre: '5.00',
+                PRE3_MOT_RunReturn: '1',
+                PRE1_ExitPressure: '26214.00',
+                PRE2_ExitPressure: '5130.00',
+                PRE1_CPR_LoadTime: '8272.00',
+                PRE2_CPR_LoadTime: '424.00',
+                PRE1_MOT_PhaseAOverTemp: '0',
+                PRE2_MOT_Power: '0.00',
+                PRE3_CPR_LoadTime: '244.00',
+                PRE2_MOT_PhaseBTempStop: '0',
+                PRE1_MOT_PhaseATempStop: '0',
+                PRE2_MOT_RunReturn: '1',
+                PRE2_AlarmHistory: '3.10',
+                PRE1_Status: '8454',
+                PRE3_MOT_PhaseATempStop: '0',
+                PRE2_CPR_ExhaustPre: '5.10',
+                PRE3_CPR_ExhaustTemp: '48.00',
+                PRE3_MOT_TotalRunTime: '244.00',
+                PRE1_MOT_BackAxleTemp: '0.00',
+                PRE3_MOT_PhaseAOverTemp: '0',
+                PRE2_MOT_PhaseATemp: '71.20',
+                PRE2_MOT_BackAxleOverTempStop: '0',
+                PRE3_MOT_FrontAxleOverTempAlam: '0',
+                PRE3_MOT_BackAxleOverTempStop: '0',
+                PRE1_HostorLoc: '0',
+                PRE1_CPR_LoadPre: '6.30',
+                PRE1_MOT_RunReturn: '1',
+                PRE3_CPR_LoadPre: '6.30',
+                PRE1_MOT_CtrlMode: '1',
+                PRE2_CPR_LoadPre: '6.30',
+                PRE3_MOT_CtrlMode: '1',
+                PRE3_CPR_LoadorUnload: '1',
+                PRE1_CPR_CoolantTemp: '71.00',
+                PRE1_MOT_PhaseBTemp: '83.10',
+                PRE2_MOT_FrontAxleOverTempAlam: '0',
+                PRE2_MOT_PhaseCTemp: '57.20',
+                PRE3_MOT_PhaseCTemp: '73.80',
+                PRE2_CPR_HeadTemp: '98.00',
+                sign: '0',
+                PRE1_CPR_UnLoadPre: '7.00',
+                PRE1_CPR_LoadorUnload: '1',
+                PRE3_CPR_ExhaustPre: '5.10',
+                PRE2_MOT_PhaseATempStop: '0',
+                PRE1_MOT_PhaseBTempStop: '0',
+                PRE2_CPR_ExhaustTemp: '62.00',
+                PRE2_MOT_PhaseCOverTemp: '0',
+                PRE3_MOT_PhaseBOverTemp: '0',
+                PRE3_FaultSignal: '0',
+                PRE3_MOT_Power: '1000.00',
+                PRE3_MOT_PhaseATemp: '82.20',
+                PRE2_CPR_CoolantTemp: '76.00',
+                PRE3_HostorLoc: '0',
+                PRE2_FaultSignal: '0',
+                PRE1_FaultSignal: '0',
+                PRE2_MOT_FrontAxleTemp: '0.00',
+                PRE3_MOT_BackAxleTemp: '20.50',
+                PRE1_MOT_TotalRunTime: '22.00',
+                PRE3_MOT_FrontAxleTemp: '43.10',
+                PRE1_CPR_HeadTemp: '92.00',
+                PRE1_MOT_PhaseCTempStop: '0',
+                PRE3_MOT_BackAxleOverTempAlam: '0',
+                PRE2_HostorLoc: '0',
+                PRE3_MOT_FrontAxleOverTempStop: '0',
+                PRE2_MOT_PhaseBTemp: '64.20',
+                PRE3_MOT_PhaseCTempStop: '0',
+                PRE3_CPR_HeadTemp: '95.00',
+                PRE2_MOT_TotalRunTime: '2802.00',
+                PRE1_MOT_BackAxleOverTempAlam: '0',
+                PRE2_MOT_BackAxleTemp: '0.00',
+                TotalInPipeFlow: '1005.80',
+                PRE3_CPR_UnLoadPre: '7.00',
+                PRE3_MOT_PhaseCOverTemp: '0',
+                PRE1_MOT_PhaseCOverTemp: '0',
+                PRE1_MOT_FrontAxleTemp: '0.00',
+                PRE2_MOT_PhaseBOverTemp: '0',
+                PRE1_MOT_Power: '0.00',
+                PRE1_MOT_FrontAxleOverTempStop: '0',
+                PRE2_MOT_CtrlMode: '1',
+                PRE1_MOT_PhaseCTemp: '82.90',
+                TotalOutPipePre: '5.60',
+                PRE1_AlarmHistory: '2.00',
+                PRE2_MOT_FrontAxleOverTempStop: '0',
+                PRE2_CPR_UnLoadPre: '7.00',
+                isRun: '-2',
+                PRE1_CPR_ExhaustTemp: '56.00',
+              },
+              readDataDes: null,
+              summaryHour: [],
+              summaryDay: [],
+              history: [],
+              dayhistory: [],
+              totalInfo: null,
+              sign: null,
+              cameras: [
+                {
+                  id: '1854452219160690689',
+                  addr: 'd37096a7d41244a1974bd99b4e2cfe35',
+                  name: '南压风机房配电室',
+                  devicekind: 'toHKHLs',
+                  cameraRate: null,
+                },
+                {
+                  id: '1854452329282142210',
+                  addr: '0f22a6377b084f8bb74435ef9eeff958',
+                  name: '南压风机',
+                  devicekind: 'toHKHLs',
+                  cameraRate: null,
+                },
+              ],
+              links: [],
+              other1: null,
+              other2: null,
+              other3: null,
+              remarkInfo: null,
+              linkInfo: null,
+              addrIndex: null,
+              warnLogNotOkCount: 0,
+              otherInfo: null,
+            },
+          ],
+          avginfo: {
+            warnFlag: {
+              value: 0,
+            },
+          },
+          typeName: '压风机',
+          type: 'forcFan',
+          locallist: [],
+        },
+      ],
+    };
+
     if (res.msgTxt[0] && res.msgTxt[0].datalist && res.msgTxt[0].datalist.length > 0) {
       let dataSource;
       let dataSourceNorth = res.msgTxt[0].datalist.find((item) => item.deviceType === 'forcFan_north');

+ 1 - 0
src/views/vent/monitorManager/safetyMonitor/index.vue

@@ -336,6 +336,7 @@
       dataSource.value = [];
     }
   }
+
   async function getSubstation() {
     const list: [] = await subStationList({ monitorparam: 'safetymonitor*' });
     subStationOptions.value = list;

+ 17 - 9
src/views/vent/monitorManager/windowMonitor/index.vue

@@ -344,7 +344,7 @@
   };
 
   // 判断前后窗的面积是否发生改变,如果改变则开启动画
-  const playAnimation = (data, maxarea, isFirst = false) => {
+  const playAnimation = (data, maxarea = 90, isFirst = false) => {
     computePlay(data, maxarea, isFirst);
   };
 
@@ -438,11 +438,15 @@
           fengliangR: windowAngleNum,
         };
       }
-      windControl(params).then(() => {
-        if (globalConfig.History_Type == 'remote') {
-          message.success('指令已下发至生产管控平台成功!');
+      windControl(params).then((res) => {
+        if (res.success) {
+          if (globalConfig.History_Type == 'remote') {
+            message.success('指令已下发至生产管控平台成功!');
+          } else {
+            message.success('指令已下发成功!');
+          }
         } else {
-          message.success('指令已下发成功!');
+          message.error(res.message);
         }
       });
     } else {
@@ -459,11 +463,15 @@
       }
 
       deviceControlApi(data)
-        .then(() => {
-          if (globalConfig.History_Type == 'remote') {
-            message.success('指令已下发至生产管控平台成功!');
+        .then((res) => {
+          if (res.success) {
+            if (globalConfig.History_Type == 'remote') {
+              message.success('指令已下发至生产管控平台成功!');
+            } else {
+              message.success('指令已下发成功!');
+            }
           } else {
-            message.success('指令已下发成功!');
+            message.error(res.message);
           }
         })
         .finally(() => {

+ 1 - 1
src/views/vent/monitorManager/windowMonitor/window.threejs.ts

@@ -246,7 +246,7 @@ export const mountedThree = (playerDom) => {
       singleWindowObj = new singleWindow(model);
     }
 
-    if (sysOrgCode === 'sdmtjtswmk') {
+    if (sysOrgCode === 'sdmtjtswmk' || sysOrgCode === 'sdmtjtbltmk') {
       const doubleWindow = await import('./shuangdaoFcSw.threejs');
       if (doubleWindow) doubleWindowObj = new doubleWindow.default(model);
     } else {

+ 12 - 2
src/views/vent/monitorManager/windrectMonitor/index.vue

@@ -649,7 +649,12 @@
   function controlDevice(passWord, type) {
     try {
       if (type == 'sing') {
-        testWind({ ids: [selectData.deviceID], password: passWord || globalConfig?.simulatedPassword }).then((res) => {
+        testWind({
+          ids: [selectData.deviceID],
+          maxnum: 1000,
+          windnum: 1,
+          password: passWord || globalConfig?.simulatedPassword,
+        }).then((res) => {
           if (res && res.success === false) {
             message.error(res.message);
           } else {
@@ -663,7 +668,12 @@
         });
       } else if (type == 'multiple') {
         const ids = toRaw(modalTable.value.selectedRowKeys);
-        testWind({ ids: ids, password: passWord || globalConfig?.simulatedPassword }).then((res) => {
+        testWind({
+          ids: ids,
+          maxnum: 1000,
+          windnum: modalTable.value.selectedRowKeys.length,
+          password: passWord || globalConfig?.simulatedPassword,
+        }).then((res) => {
           if (res && res.success === false) {
             message.error(res.message);
           } else {