Browse Source

1. 风窗、风门控制修改
2. 修改网关路由

hongrunxia 6 months ago
parent
commit
223837ac12
40 changed files with 404 additions and 259 deletions
  1. 2 2
      src/hooks/system/useCamera.ts
  2. 5 14
      src/hooks/web/useWebSocket.ts
  3. 48 15
      src/layouts/default/header/components/VoiceBroadcast.vue
  4. 1 1
      src/router/helper/routeHelper.ts
  5. 14 2
      src/views/vent/comment/history/history.api.ts
  6. 12 12
      src/views/vent/comment/history/history.data.ts
  7. 4 0
      src/views/vent/deviceManager/comment/DeviceModal.vue
  8. 9 8
      src/views/vent/deviceManager/deviceTable/index.vue
  9. 1 0
      src/views/vent/home/clique/components/dialog-modal.vue
  10. 1 1
      src/views/vent/monitorManager/camera/camera.api.ts
  11. 1 1
      src/views/vent/monitorManager/comment/DeviceEcharts.vue
  12. 3 3
      src/views/vent/monitorManager/comment/HistoryTable.vue
  13. 4 4
      src/views/vent/monitorManager/compressor/components/nitrogenHome_bd.vue
  14. 3 3
      src/views/vent/monitorManager/compressor/components/nitrogenHome_blt.vue
  15. 2 1
      src/views/vent/monitorManager/compressor/index.vue
  16. 2 2
      src/views/vent/monitorManager/compressor/nitrogen.threejs.ts
  17. 2 2
      src/views/vent/monitorManager/deviceMonitor/components/device/device.api.ts
  18. 1 1
      src/views/vent/monitorManager/deviceMonitor/components/device/device.data.ts
  19. 1 1
      src/views/vent/monitorManager/deviceMonitor/components/device/index.vue
  20. 91 85
      src/views/vent/monitorManager/fanLocalMonitor/index.vue
  21. 1 1
      src/views/vent/monitorManager/fireDoorMonitor/fireDoor.api.ts
  22. 1 1
      src/views/vent/monitorManager/fireDoorMonitor/index.vue
  23. 1 1
      src/views/vent/monitorManager/gateMonitor/gate.api.ts
  24. 1 1
      src/views/vent/monitorManager/gateMonitor/index.vue
  25. 59 18
      src/views/vent/monitorManager/mainFanMonitor/components/conditionAssistance.vue
  26. 7 2
      src/views/vent/monitorManager/mainFanMonitor/index.vue
  27. 6 0
      src/views/vent/monitorManager/mainFanMonitor/main.api.ts
  28. 1 1
      src/views/vent/monitorManager/mainFanMonitor/mainWind.xj.threejs.ts
  29. 1 0
      src/views/vent/monitorManager/nitrogen/index.vue
  30. 1 1
      src/views/vent/monitorManager/obfurage1Monitor/gate.api.ts
  31. 2 2
      src/views/vent/monitorManager/safetyMonitor/HistoryTable.vue
  32. 2 2
      src/views/vent/monitorManager/safetyMonitor/index.vue
  33. 1 1
      src/views/vent/monitorManager/safetyMonitor/safety.api.ts
  34. 82 42
      src/views/vent/monitorManager/windowMonitor/index.vue
  35. 1 1
      src/views/vent/monitorManager/windowMonitor/modal.vue
  36. 1 1
      src/views/vent/monitorManager/windowMonitor/window.api.ts
  37. 1 1
      src/views/vent/monitorManager/windowMonitorBet/window.api.ts
  38. 23 20
      src/views/vent/monitorManager/windrectMonitor/duishe.threejs.ts
  39. 4 4
      src/views/vent/monitorManager/windrectMonitor/index.vue
  40. 1 1
      src/views/vent/monitorManager/windrectMonitor/windrect.api.ts

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

@@ -11,8 +11,8 @@ I18N.use(ZH);
 
 export function useCamera() {
   const cameraList = (params) => defHttp.get({ url: '/safety/ventanalyCamera/list', params });
-  const cameraAddrList = (params) => defHttp.post({ url: '/camera/info', params });
-  const cameraAddr = (params) => defHttp.get({ url: '/camera/queryByCameraCode', params });
+  const cameraAddrList = (params) => defHttp.post({ url: '/monitor/camera/info', params });
+  const cameraAddr = (params) => defHttp.get({ url: '/monitor/camera/queryByCameraCode', params });
 
   let webRtcServer = <any[]>[];
   const playerList = <any[]>[];

+ 5 - 14
src/hooks/web/useWebSocket.ts

@@ -14,22 +14,10 @@ const listeners = new Map();
 export function connectWebSocket(url: string) {
   //update-begin-author:taoyan date:2022-4-24 for: v2.4.6 的 websocket 服务端,存在性能和安全问题。 #3278
   const token = (getToken() || '') as string;
-  result = useWebSocket(url, {
-    // 自动重连 (遇到错误最多重复连接10次)
-    autoReconnect: {
-      retries: 10,
-      delay: 5000,
-    },
-    // 心跳检测
-    heartbeat: {
-      message: 'ping',
-      interval: 55000,
-    },
-    protocols: [token],
-  });
+  console.log(url);
+  result = useWebSocket(url);
   //update-end-author:taoyan date:2022-4-24 for: v2.4.6 的 websocket 服务端,存在性能和安全问题。 #3278
   if (result) {
-    console.log('WebSocket连接通了', result);
     result.open = onOpen;
     result.close = onClose;
 
@@ -37,6 +25,9 @@ export function connectWebSocket(url: string) {
     if (ws != null) {
       ws.onerror = onError;
       ws.onmessage = onMessage;
+      console.log('WebSocket连接通了', result, ws);
+    } else {
+      console.log('WebSocket连接连接失败');
     }
   }
 }

+ 48 - 15
src/layouts/default/header/components/VoiceBroadcast.vue

@@ -1,20 +1,21 @@
 <template>
-  <div style="position: fixed; z-index: 999; right: 100px; top: 18px; color: #fff">
+  <div style="position: fixed; z-index: 999; right: 95px; top: 18px; color: #fff">
     <div class="btn" @click="showWarningBroad">
       <!-- <div>语音播报</div>
     <a-badge :count="10">
       <a href="#" class="head-example"></a>
     </a-badge> -->
-      <a-badge dot>
-        <BellOutlined style="font-size: 20px; color: #fff" />
+      <a-badge :dot="isWarningDot">
+        <!-- <BellOutlined style="font-size: 22px; color: #fff; margin-right: 20px" /> -->
+        <WarningOutlined style="font-size: 22px; color: #fff" />
       </a-badge>
     </div>
     <div v-if="isShowWarningBroad" class="broadcast">
       <div class="title">
-        <div class="message-title">消息通知</div>
-        <!-- <div class="badge-box">
-          <SoundOutlined style="font-size: 20px; color: #000" />
-        </div> -->
+        <div class="message-title">预警通知</div>
+        <div class="badge-box">
+          <SoundOutlined :class="{ 'no-play': !isBroad }" style="font-size: 20px; color: #000" @click="handleBroad" />
+        </div>
       </div>
       <div class="broadcast-context">
         <div class="context-tab">
@@ -36,7 +37,7 @@
             <div>{{ item['wardescrip'] || item['nwartype_dictText'] }}</div>
             <div>{{ item['isok'] ? '已解决' : '未解决' }}</div>
           </div>
-          <div v-if="broadcastList.length > 5" class="more" @click="toMore">更多</div>
+          <div v-if="broadcastList.length > 0" class="more" @click="toMore">更多>></div>
         </div>
       </div>
     </div>
@@ -44,28 +45,31 @@
 </template>
 <script lang="ts">
   import { Tooltip, Badge } from 'ant-design-vue';
-  import { SoundOutlined, BellOutlined } from '@ant-design/icons-vue';
+  import { SoundOutlined, BellOutlined, WarningOutlined } from '@ant-design/icons-vue';
   import Icon from '/@/components/Icon';
   import { defineComponent, ref, unref, onMounted } from 'vue';
   import { defHttp } from '/@/utils/http/axios';
   import { useRouter } from 'vue-router';
   import { connectWebSocket, onWebSocket } from '/@/hooks/web/useWebSocket';
   import { getToken } from '/@/utils/auth';
-  import md5 from 'crypto-js/md5';
   import { useUserStore } from '/@/store/modules/user';
   import { useGlobSetting } from '/@/hooks/setting';
+  import SpeakVoice from './notify/speakVoice';
 
   export default defineComponent({
     name: 'VoiceBroadcast',
-    components: { Icon, Tooltip, Badge, SoundOutlined, BellOutlined },
+    components: { Icon, Tooltip, Badge, SoundOutlined, BellOutlined, WarningOutlined },
 
     setup() {
+      const speakVoice = new SpeakVoice();
       const userStore = useUserStore();
       const glob = useGlobSetting();
       const router = useRouter();
       const list = (params) => defHttp.get({ url: '/safety/ventanalyAlarmLog/list', params });
       const activeKey = ref(0);
       const isShowWarningBroad = ref(false);
+      const isBroad = ref(true);
+      const isWarningDot = ref(false);
       const broadcastList = ref([]);
       function showWarningBroad() {
         isShowWarningBroad.value = !isShowWarningBroad.value;
@@ -74,10 +78,16 @@
         }
       }
 
+      function handleBroad() {
+        isBroad.value = !isBroad.value;
+      }
+
       async function toSelectList(key) {
         activeKey.value = key;
         const res = await list({ pageSize: 20, devicetype: '', isok: key == 1 ? 0 : key == 2 ? 1 : null });
         broadcastList.value = res['records'];
+        // const isHasWarning = broadcastList.value.findIndex((item) => !item['isok']);
+        // isWarningDot.value = isHasWarning > -1 ? true : false;
       }
 
       async function toMore() {
@@ -99,9 +109,18 @@
       }
 
       function onWebSocketMessage(data) {
-        console.log('WebSocket 监测消息--------------》', data);
-        if (data.cmd === 'topic' || data.cmd === 'user') {
-          //
+        // console.log('WebSocket 监测消息--------------》', data);
+        if (data.topic === 'warn' || data.cmd === 'user') {
+          if (isBroad.value) {
+            const messageText = data['warndata'];
+            // const messageText = '这是一个测试';
+            speakVoice.handleReply(messageText);
+          }
+          if (!isShowWarningBroad.value) {
+            isWarningDot.value = true;
+          } else {
+            isWarningDot.value = false;
+          }
           setTimeout(() => {
             if (isShowWarningBroad.value) {
               toSelectList(0);
@@ -113,7 +132,7 @@
         initWebSocket();
       });
 
-      return { showWarningBroad, isShowWarningBroad, activeKey, toSelectList, broadcastList, toMore };
+      return { showWarningBroad, isShowWarningBroad, activeKey, toSelectList, broadcastList, toMore, isBroad, handleBroad, isWarningDot };
     },
   });
 </script>
@@ -124,9 +143,20 @@
     cursor: pointer;
     display: flex;
   }
+  .no-play {
+    background: linear-gradient(
+      to bottom left,
+      transparent 0%,
+      transparent calc(50% - 1px),
+      #000000 50%,
+      transparent calc(50% + 1px),
+      transparent 100%
+    );
+  }
   .broadcast {
     width: 400px;
     height: 250px;
+    border-radius: 4px;
     position: fixed;
     top: 42px;
     right: 20px;
@@ -200,6 +230,9 @@
         }
         .more {
           cursor: pointer;
+          &:hover {
+            color: #2174f0;
+          }
         }
       }
     }

+ 1 - 1
src/router/helper/routeHelper.ts

@@ -116,7 +116,7 @@ function asyncImportRoute(routes: AppRouteRecordRaw[] | undefined) {
     }
     children && asyncImportRoute(children);
   });
-  console.log('------------------------>', routes);
+  // console.log('------------------------>', routes);
 }
 
 function dynamicImport(dynamicViewsModules: Record<string, () => Promise<Recordable>>, component: string) {

+ 14 - 2
src/views/vent/comment/history/history.api.ts

@@ -4,7 +4,7 @@ import { defHttp } from '/@/utils/http/axios';
 enum Api {
   listdays = '/safety/ventanalyMonitorData/listdays',
   getDeviceList = '/monitor/device',
-  getHistoryData = '/history/getHistoryData',
+  getHistoryData = '/monitor/history/getHistoryData',
 }
 /**
  * 获取列表的接口
@@ -14,6 +14,18 @@ enum Api {
  * @param pagination 分页数据
  * @returns
  */
+
+const intervalMap = new Map([
+  ['1', '1s'],
+  ['2', '5s'],
+  ['3', '10s'],
+  ['4', '30s'],
+  ['5', '1m'],
+  ['6', '10m'],
+  ['7', '30m'],
+  ['8', '1h'],
+]);
+
 export const list = (deviceCode: string, deviceInfo: any, formData: any, pagination: PaginationProps) => {
   if (deviceInfo.stationType === 'redis') {
     return defHttp.post({
@@ -26,7 +38,7 @@ export const list = (deviceCode: string, deviceInfo: any, formData: any, paginat
         endTime: formData.ttime_end,
         deviceId: formData.gdeviceid,
         strtype: deviceCode,
-        interval: formData.skip || '1h',
+        interval: intervalMap.get(formData['skip']) || '1h',
         isEmployee: deviceCode.startsWith('vehicle') ? false : true,
       },
     });

+ 12 - 12
src/views/vent/comment/history/history.data.ts

@@ -1,6 +1,6 @@
 import dayjs from 'dayjs';
 import { BasicTableProps, PaginationProps, FormProps, FormSchema } from '/@/components/Table';
-// import { getAutoScrollContainer } from '/@/utils/common/compUtils';
+import { getAutoScrollContainer } from '/@/utils/common/compUtils';
 
 /**
  * 默认的查询表单项props
@@ -19,7 +19,7 @@ export const getDefaultSchemas: (dictCode: any[], deviceOptions: any[]) => FormS
     componentProps: {
       showTime: true,
       valueFormat: 'YYYY-MM-DD HH:mm:ss',
-      // getPopupContainer: getAutoScrollContainer,
+      getPopupContainer: getAutoScrollContainer,
     },
     colProps: {
       span: 4,
@@ -34,7 +34,7 @@ export const getDefaultSchemas: (dictCode: any[], deviceOptions: any[]) => FormS
     componentProps: {
       showTime: true,
       valueFormat: 'YYYY-MM-DD HH:mm:ss',
-      // getPopupContainer: getAutoScrollContainer,
+      getPopupContainer: getAutoScrollContainer,
     },
     colProps: {
       span: 4,
@@ -95,40 +95,40 @@ export const getDefaultSchemas: (dictCode: any[], deviceOptions: any[]) => FormS
     label: '间隔时间',
     field: 'skip',
     component: 'Select',
-    defaultValue: '1h',
+    defaultValue: '8',
     componentProps: {
       options: [
         {
           label: '1秒',
-          value: '1s',
+          value: '1',
         },
         {
           label: '5秒',
-          value: '5s',
+          value: '2',
         },
         {
           label: '10秒',
-          value: '10s',
+          value: '3',
         },
         {
           label: '30秒',
-          value: '30s',
+          value: '4',
         },
         {
           label: '1分钟',
-          value: '1m',
+          value: '5',
         },
         {
           label: '10分钟',
-          value: '10m',
+          value: '6',
         },
         {
           label: '30分钟',
-          value: '30m',
+          value: '7',
         },
         {
           label: '1小时',
-          value: '1h',
+          value: '8',
         },
       ],
     },

+ 4 - 0
src/views/vent/deviceManager/comment/DeviceModal.vue

@@ -15,6 +15,9 @@
       <a-tab-pane key="1" tab="基本信息" force-render>
         <FormModal :record="deviceData" @saveOrUpdate="(values) => emit('saveOrUpdate', values)" />
       </a-tab-pane>
+      <!-- <a-tab-pane key="10" v-if="deviceType == 'fanlocal' || deviceType == 'fanmain'" tab="风机曲线" force-render>
+        <FanLineModal :record="deviceData" />
+      </a-tab-pane> -->
       <a-tab-pane key="2" tab="点表关联">
         <PointTable
           :columns="pointColumns"
@@ -82,6 +85,7 @@
   import BackWindDeviceTable from './warningTabel/index3.vue';
   import WorkFacePointTable from './pointTabel/WorkFacePointTable.vue';
   // import editWarnTable from './editWarnTable/index.vue'
+  import FanLineModal from './FanLineModal .vue';
   import FormModal from './FormModal.vue';
   import { cloneDeep } from 'lodash-es';
   import { columns as pointColumns, workFaceColumns, simulationColumns } from './pointTabel/point.data';

+ 9 - 8
src/views/vent/deviceManager/deviceTable/index.vue

@@ -28,6 +28,7 @@
   import { FormSchema } from '/@/components/Table';
   import { getFormSchemaColumns, getTableHeaderColumns } from '/@/hooks/web/useWebColumns';
   import { useRouter } from 'vue-router';
+  import { getAutoScrollContainer } from '/@/utils/common/compUtils';
 
   const { currentRoute } = useRouter();
 
@@ -95,11 +96,11 @@
           columnsItem = {
             label: item.des, //_dictText
             field: item.monitorcode,
-            component: 'JDictSelectTag',
+            component: 'DatePicker',
             componentProps: {
-              dictCode: item.dict,
-              placeholder: '请选择',
-              // stringToNumber: true,
+              showTime: false,
+              valueFormat: 'YYYY-MM-DD',
+              getPopupContainer: getAutoScrollContainer,
             },
           };
         }
@@ -108,11 +109,11 @@
           columnsItem = {
             label: item.des, //_dictText
             field: item.monitorcode,
-            component: 'JDictSelectTag',
+            component: 'DatePicker',
             componentProps: {
-              dictCode: item.dict,
-              placeholder: '请选择',
-              // stringToNumber: true,
+              showTime: true,
+              valueFormat: 'YYYY-MM-DD HH:mm:ss',
+              getPopupContainer: getAutoScrollContainer,
             },
           };
         }

+ 1 - 0
src/views/vent/home/clique/components/dialog-modal.vue

@@ -215,6 +215,7 @@
   // 重新向到新的页面,业务上讲是公司端跳转矿端
   function redictTo() {
     if (!props.centerDetail.ip) return;
+    // 这里保德矿由于暂时网络通,无法用单点登录,需要自动登录
     const url = `http://${props.centerDetail.ip}:8092/micro-vent-3dModal/dashboard/analysis`;
     open(url);
   }

+ 1 - 1
src/views/vent/monitorManager/camera/camera.api.ts

@@ -3,7 +3,7 @@ import { defHttp } from '/@/utils/http/axios';
 enum Api {
   getCameraDevKind = '/safety/ventanalyCamera/getCameraDevKind',
   list = '/safety/ventanalyCamera/listNew',
-  getCameraUrl = '/camera/queryByCameraCode',
+  getCameraUrl = '/monitor/camera/queryByCameraCode',
   getDevice = '/monitor/device',
   getVentanalyCamera = '/safety/ventanalyCamera/list',
 }

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

@@ -184,7 +184,7 @@
       if (globalConfig.History_Type == 'vent') {
         historyList = (params) => defHttp.get({ url: '/safety/ventanalyMonitorData/listdays', params });
       } else {
-        historyList = (params) => defHttp.post({ url: '/history/getHistoryData', params });
+        historyList = (params) => defHttp.post({ url: '/monitor/history/getHistoryData', params });
       }
       const chartsType = ref('listMonitor');
       const deviceId = ref('');

+ 3 - 3
src/views/vent/monitorManager/comment/HistoryTable.vue

@@ -91,7 +91,7 @@
     if (stationType.value !== 'redis') {
       return '/safety/ventanalyMonitorData/export/historydata';
     } else {
-      return '/history/getHistoryData/exportXls';
+      return '/monitor/history/getHistoryData/exportXls';
     }
   };
   const emit = defineEmits(['change']);
@@ -266,7 +266,7 @@
         interval: intervalMap.get(formData['skip']) ? intervalMap.get(formData['skip']) : '1h',
         isEmployee: props.deviceType.startsWith('vehicle') ? false : true,
       };
-      const result = await defHttp.post({ url: '/history/getHistoryData', params: params });
+      const result = await defHttp.post({ url: '/monitor/history/getHistoryData', params: params });
       setPagination({ total: Math.abs(result['total']) || 0 });
       dataSource.value = result['records'] || [];
     }
@@ -439,7 +439,7 @@
     },
     exportConfig: {
       name: '设备历史列表',
-      url: getExportXlsUrl(),
+      url: getExportXlsUrl,
     },
   });
 

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

@@ -823,7 +823,7 @@ async function getDataSource(systemID) {
                         airCompressor['flow'] = el['flow'] || 0
                     });
                     dataArr.push(airCompressor)
-                    console.log(dataArr,'dataArr---------')
+                    // console.log(dataArr,'dataArr---------')
                 }
                 echartData.value = dataArr
 
@@ -1100,7 +1100,7 @@ onUnmounted(() => {
                     text-align: center;
 
                     &:first-child {
-                        background-color: #00bbff11;
+                        background-color: #0032429a;
                     }
 
                     &:last-child {
@@ -1128,8 +1128,8 @@ onUnmounted(() => {
                     border-top: 1px solid #00baffd4;
                     border-left: 1px solid #00baffd4;
                     line-height: 46px;
-                    color: #00e5ff;
-                    background-color: #00bbff21;
+                    color: #e7fdff;
+                    background-color: #0032429a;
                 }
 
             }

+ 3 - 3
src/views/vent/monitorManager/compressor/components/nitrogenHome_blt.vue

@@ -302,10 +302,10 @@ async function getDataSource(systemID) {
 }
 
 function handlerDevice(data, bol) {
-  console.log(bol, 'bol-------')
+  // console.log(bol, 'bol-------')
   kzParam.data = data;
   kzParam.isFw = bol;
-  console.log(kzParam, 'kz--------')
+  // console.log(kzParam, 'kz--------')
   if (bol) {
     modalTitle.value = '一键复位';
     modalType.value = '1';
@@ -319,7 +319,7 @@ function handlerDevice(data, bol) {
   }
 }
 function handleOK(passWord, handlerState) {
-  console.log(kzParam, 'kz----------');
+  // console.log(kzParam, 'kz----------');
   // if (passWord !== '123456') {
   //   message.warning('密码不正确,请重新输入');
   //   return;

+ 2 - 1
src/views/vent/monitorManager/compressor/index.vue

@@ -101,7 +101,7 @@ function changeModalType(currentData) {
   optionType.value = currentData['strtype']
   if (currentData['strsystype'] === '1') {
     // 地上
-    modalType.value = 'nitrogen'
+    modalType.value = 'nitrogenUnderground'
   } else if (currentData['strsystype'] === '2') {
     // 地下
     modalType.value = 'nitrogenUnderground'
@@ -121,6 +121,7 @@ onUnmounted(() => {
 </script>
 
 <style lang="less" scoped>
+@import '/@/design/vent/modal.less';
 @ventSpace: zxm;
 .nitrogen-home-header {
     width: 100%;

+ 2 - 2
src/views/vent/monitorManager/compressor/nitrogen.threejs.ts

@@ -115,8 +115,8 @@ export const setModelType = (type, nitrogenNum?) => {
       nitrogenUndergroundObj.addCssText();
       const oldCameraPosition = { x: -1000, y: 100, z: 500 };
       const oldControlsPosition = { x: -10, y: 10, z: 10 };
-      const newCameraPosition = { x: 20.041424366366176, y: 73.25486610289803, z: 118.22072276980887 },
-        newControlsPosition = { x: -16.17782459332251, y: 11.933306448507814, z: 2.315544702244826 };
+      const newCameraPosition = { x: 21.7662617168586, y: 65.76772405405443, z: 106.19314654690366 },
+        newControlsPosition = { x: -13.223797639205223, y: 13.119121404116392, z: 0.7650646324543227 };
 
       setTimeout(async () => {
         model?.scene?.add(group);

+ 2 - 2
src/views/vent/monitorManager/deviceMonitor/components/device/device.api.ts

@@ -8,9 +8,9 @@ enum Api {
   deviceTypeList = '/safety/ventanalyDeviceInfo/DeviceKind/queryBySystem',
   itemList = '/sys/dictItem/list',
   devPosition = '/sys/dict/getDictItems/devPosVisible',
-  getDepartmentInfo = '/getDepartmentInfo',
+  getDepartmentInfo = '/monitor/getDepartmentInfo',
   listdays = '/safety/ventanalyMonitorData/listdays',
-  getHistoryData = '/history/getHistoryData',
+  getHistoryData = '/monitor/history/getHistoryData',
   safetyDeviceList = '/monitor/codeDict',
   exportXlsUrl = '/monitor/exportXls',
 }

+ 1 - 1
src/views/vent/monitorManager/deviceMonitor/components/device/device.data.ts

@@ -428,7 +428,7 @@ export const locationFormConfig = {
       componentProps: {
         placeholder: '请选择所属部门',
         virtual: false,
-        api: '/getDepartmentInfo',
+        api: '/monitor/getDepartmentInfo',
       },
     },
     {

+ 1 - 1
src/views/vent/monitorManager/deviceMonitor/components/device/index.vue

@@ -86,7 +86,7 @@
           <div class="location-form-item">
             <span class="location-form-label">所属部门:</span>
             <MTreeSelect style="width: 200px" v-model:value="locationForm.department" placeholder="请选择所属部门"
-              api="/getDepartmentInfo" :virtual="false" :isGetPopupContainer="false" />
+              api="/monitor/getDepartmentInfo" :virtual="false" :isGetPopupContainer="false" />
           </div>
           <div class="location-form-item">
             <span class="location-form-label">分站名称:</span>

+ 91 - 85
src/views/vent/monitorManager/fanLocalMonitor/index.vue

@@ -151,7 +151,7 @@
     </div>
     <div class="data-show-box" v-if="!loading">
       <div class="data-item" v-if="leftColumns.length > 0">
-        <div class="item-header">环境监测</div>
+        <div class="item-header">设备监测</div>
         <div class="item-container">
           <div class="tab">
             <div class="tab-item" :class="{ 'tab-item-active-r': warningMonitorRowIndex === 0 }" @click="selectDevice('warningMonitorRowIndex', 0)"
@@ -251,59 +251,58 @@
           </div>
         </div>
       </div>
-      <div class="data-item" v-if="rightColumns.length > 0">
-        <div class="item-header">设备监测</div>
-        <div class="item-container">
-          <div class="tab">
-            <div class="tab-item" :class="{ 'tab-item-active-r': dataMonitorRowIndex == 0 }" @click="selectDevice('dataMonitorRowIndex', 0)"
-              >主机</div
-            >
-            <div class="tab-item" :class="{ 'tab-item-active-r': dataMonitorRowIndex == 1 }" @click="selectDevice('dataMonitorRowIndex', 1)"
-              >备机</div
-            >
-          </div>
-          <div class="container-group container-group-l">
-            <!-- <div class="warning-header">
-              <div class="header-item">
-                <div class="header-title"> 未处理数</div>
-                <div class="header-value">{{ selectData['warnLogNotOkCount'] }} </div>
-              </div>
-            </div> -->
-
-            <div class="warning-group">
-              <template v-if="deviceType">
-                <div v-for="(state, index) in rightColumns" :key="index">
-                  <template
-                    v-if="selectData[state.dataIndex.replace('Fan', 'Fan1')] == 0.0 || selectData[state.dataIndex.replace('Fan', 'Fan1')] > 1"
-                  >
-                    <div class="container-item">
-                      <div class="item-icon">
-                        <CaretRightOutlined class="icon-style" />
-                      </div>
-                      <div class="item-name">{{ state.title }}</div>
-                      <div v-if="state.dataIndex.startsWith('Fan')">
-                        <div class="item-value" v-if="dataMonitorRowIndex == 0">{{
-                          selectData[state.dataIndex.replace('Fan', 'Fan1')] ? selectData[state.dataIndex.replace('Fan', 'Fan1')] : '-'
-                        }}</div>
-                        <div class="item-value" v-if="dataMonitorRowIndex == 1">{{
-                          selectData[state.dataIndex.replace('Fan', 'Fan2')] ? selectData[state.dataIndex.replace('Fan', 'Fan2')] : '-'
-                        }}</div>
-                      </div>
-                      <div v-else>
-                        <div class="item-value">{{ selectData[state.dataIndex] ? selectData[state.dataIndex] : '-' }}</div>
+      <div>
+        <div class="data-item" v-if="rightColumns.length > 0">
+          <div class="item-header">环境监测/设备报警</div>
+          <div class="item-container">
+            <div class="tab">
+              <div class="tab-item" :class="{ 'tab-item-active-r': dataMonitorRowIndex == 0 }" @click="selectDevice('dataMonitorRowIndex', 0)"
+                >主机</div
+              >
+              <div class="tab-item" :class="{ 'tab-item-active-r': dataMonitorRowIndex == 1 }" @click="selectDevice('dataMonitorRowIndex', 1)"
+                >备机</div
+              >
+            </div>
+            <div class="container-group container-group-l">
+              <div class="warning-group" style="max-height: 200px; overflow-y: auto">
+                <template v-if="deviceType">
+                  <div v-for="(state, index) in rightColumns" :key="index">
+                    <template v-if="!state.dataIndex.endsWith('_w')">
+                      <div class="container-item">
+                        <div class="item-icon">
+                          <CaretRightOutlined class="icon-style" />
+                        </div>
+                        <div class="item-name">{{ state.title }}</div>
+                        <div v-if="state.dataIndex.startsWith('Fan')">
+                          <div class="item-value" v-if="dataMonitorRowIndex == 0">{{
+                            selectData[state.dataIndex.replace('Fan', 'Fan1')] ? selectData[state.dataIndex.replace('Fan', 'Fan1')] : '-'
+                          }}</div>
+                          <div class="item-value" v-if="dataMonitorRowIndex == 1">{{
+                            selectData[state.dataIndex.replace('Fan', 'Fan2')] ? selectData[state.dataIndex.replace('Fan', 'Fan2')] : '-'
+                          }}</div>
+                        </div>
+                        <div v-else>
+                          <div class="item-value">{{ selectData[state.dataIndex] ? selectData[state.dataIndex] : '-' }}</div>
+                        </div>
                       </div>
-                    </div>
-                  </template>
-                  <template v-else>
-                    <div class="warning-item">
-                      <div class="item-name"> <div class="icon"></div> {{ state.title }} </div>
-                      <div v-if="state.dataIndex.startsWith('Fan')">
-                        <div class="signal-item" v-if="warningMonitorRowIndex == 0">
-                          <template v-if="selectData['Fan1StartStatus'] == '0' && globalConfig?.simulatedPassword">
-                            <div class="signal-round signal-round-gry"></div>
-                            <div class="vent-margin-l-8">无状态</div>
-                          </template>
-                          <template v-else>
+                    </template>
+                  </div>
+                </template>
+              </div>
+              <div class="warning-group" style="max-height: 200px; overflow-y: auto">
+                <div class="warning-header">
+                  <div class="header-item">
+                    <div class="header-title">报警数量</div>
+                    <div class="header-value">{{ selectData['warnLogNotOkCount'] }} </div>
+                  </div>
+                </div>
+                <template v-if="deviceType">
+                  <div v-for="(state, index) in leftColumns" :key="index">
+                    <template v-if="state.dataIndex.endsWith('_w')">
+                      <div class="warning-item">
+                        <div class="item-name"> <div class="icon"></div> {{ state.title }} </div>
+                        <div v-if="state.dataIndex.startsWith('Fan')">
+                          <div class="signal-item" v-if="warningMonitorRowIndex == 0">
                             <div
                               class="signal-round"
                               :class="{
@@ -321,14 +320,8 @@
                                 ? '正常'
                                 : '异常'
                             }}</div>
-                          </template>
-                        </div>
-                        <div class="signal-item" v-if="warningMonitorRowIndex == 1">
-                          <template v-if="selectData['Fan2StartStatus'] == '0' && globalConfig?.simulatedPassword">
-                            <div class="signal-round signal-round-gry"></div>
-                            <div class="vent-margin-l-8">无状态</div>
-                          </template>
-                          <template v-else>
+                          </div>
+                          <div class="signal-item" v-if="warningMonitorRowIndex == 1">
                             <div
                               class="signal-round"
                               :class="{
@@ -346,28 +339,28 @@
                                 ? '正常'
                                 : '异常'
                             }}</div>
-                          </template>
+                          </div>
                         </div>
-                      </div>
-                      <div v-else>
-                        <div class="signal-item">
-                          <div
-                            class="signal-round vent-margin-l-8"
-                            :class="{
-                              'signal-round-run': selectData[state.dataIndex] == '0',
-                              'signal-round-warning': selectData[state.dataIndex] !== undefined && selectData[state.dataIndex] == '1',
-                              'signal-round-gry': selectData[state.dataIndex] === undefined,
-                            }"
-                          ></div>
-                          <div class="vent-margin-l-8">{{
-                            selectData[state.dataIndex] === undefined ? '无状态' : selectData[state.dataIndex] == '0' ? '正常' : '异常'
-                          }}</div>
+                        <div v-else>
+                          <div class="signal-item">
+                            <div
+                              class="signal-round vent-margin-l-8"
+                              :class="{
+                                'signal-round-run': selectData[state.dataIndex] == '0',
+                                'signal-round-warning': selectData[state.dataIndex] !== undefined && selectData[state.dataIndex] == '1',
+                                'signal-round-gry': selectData[state.dataIndex] === undefined,
+                              }"
+                            ></div>
+                            <div class="vent-margin-l-8">{{
+                              selectData[state.dataIndex] === undefined ? '无状态' : selectData[state.dataIndex] == '0' ? '正常' : '异常'
+                            }}</div>
+                          </div>
                         </div>
                       </div>
-                    </div>
-                  </template>
-                </div>
-              </template>
+                    </template>
+                  </div>
+                </template>
+              </div>
             </div>
           </div>
         </div>
@@ -1630,16 +1623,15 @@
           .header-item {
             flex: 1;
             display: flex;
-            flex-direction: column;
-            margin: 5px 10px;
             justify-content: center;
             align-items: center;
             .header-title {
               color: #39e7fe;
+              margin-top: 10px;
             }
             .header-value {
-              width: 133px;
-              height: 56px;
+              // width: 133px;
+              height: 36px;
               font-weight: 600;
               font-family: 'douyuFont';
               font-size: 16px;
@@ -1647,6 +1639,8 @@
               display: flex;
               justify-content: center;
               align-items: center;
+              margin-top: 15px;
+              margin-left: 8px;
               // background: url('/@/assets/images/vent/count-header-bg.png') no-repeat;
             }
           }
@@ -1662,6 +1656,9 @@
             align-items: center;
             height: 38px;
             .item-name {
+              display: flex;
+              align-items: center;
+              // padding-left: 5px;
               .icon {
                 width: 6px;
                 height: 6px;
@@ -1669,7 +1666,7 @@
                 background-color: #1cd5ff;
                 border-radius: 3px;
                 position: relative;
-                margin-right: 5px;
+                margin-right: 8px;
                 &::before {
                   content: '';
                   width: 10px;
@@ -1682,6 +1679,15 @@
                   left: -2px;
                 }
               }
+              &::before {
+                content: '';
+                display: block;
+                width: 1px;
+                height: 38px;
+                position: absolute;
+                left: 12px;
+                background-color: #00f5fe;
+              }
             }
           }
         }

+ 1 - 1
src/views/vent/monitorManager/fireDoorMonitor/fireDoor.api.ts

@@ -11,7 +11,7 @@ enum Api {
   exportXls = '/sys/user/exportXls',
   baseList = '/safety/ventanalyGate/list',
   cameraList = '/safety/ventanalyCamera/list',
-  cameraAddrList = '/camera/info',
+  cameraAddrList = '/monitor/camera/info',
 }
 /**
  * 导出api

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

@@ -337,7 +337,7 @@
   }
 
   function handleOK(passWord, handlerState) {
-    if (passWord == '') {
+    if (!passWord && !globalConfig?.simulatedPassword) {
       message.warning('请输入密码');
       return;
     }

+ 1 - 1
src/views/vent/monitorManager/gateMonitor/gate.api.ts

@@ -11,7 +11,7 @@ enum Api {
   exportXls = '/sys/user/exportXls',
   baseList = '/safety/ventanalyGate/list',
   cameraList = '/safety/ventanalyCamera/list',
-  cameraAddrList = '/camera/info',
+  cameraAddrList = '/monitor/camera/info',
 }
 /**
  * 导出api

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

@@ -620,7 +620,7 @@
   }
 
   function handleOK(passWord, handlerState) {
-    if (passWord == '') {
+    if (!passWord && !globalConfig?.simulatedPassword) {
       message.warning('请输入密码');
       return;
     }

+ 59 - 18
src/views/vent/monitorManager/mainFanMonitor/components/conditionAssistance.vue

@@ -18,10 +18,18 @@
           <div class="box-title">风机信息</div>
         </dv-decoration7>
         <div class="info-container">
-          <div v-for="(item, index) in fanInfo" class="info-item" :key="index">
-            <div class="title">{{ item.title }}:</div>
-            <div class="value">{{ fanInfoData && fanInfoData[item.code] ? fanInfoData[item.code] : '-' }}</div>
-          </div>
+          <template v-if="isMock">
+            <div v-for="(item, index) in fanInfo" class="info-item" :key="index">
+              <div class="title">{{ item.title }}:</div>
+              <div class="value">{{ fanInfoData && fanInfoData[item.code] ? fanInfoData[item.code] : '-' }}</div>
+            </div>
+          </template>
+          <template v-else>
+            <div v-for="(item, index) in columns" class="info-item" :key="index">
+              <div class="title">{{ item['title'] }}:</div>
+              <div class="value">{{ selectData && selectData[item['dataIndex']] ? selectData[item['dataIndex']] : '-' }}</div>
+            </div>
+          </template>
         </div>
       </div>
       <div class="center-box">
@@ -49,8 +57,8 @@
     </div>
     <div class="setting-box">
       <div class="left-buttons">
-        <div class="btn btn1" @click="edit('info')">编辑风机信息</div>
-        <div class="btn btn1" @click="edit('line')">编辑特性曲线</div>
+        <!-- <div class="btn btn1" @click="edit('info')">编辑风机信息</div> -->
+        <!-- <div class="btn btn1" @click="edit('line')">编辑特性曲线</div> -->
       </div>
       <div class="border-clip"></div>
       <div class="right-inputs">
@@ -63,21 +71,16 @@
         <div class="btn btn1" @click="makeLine">决策工况</div>
       </div>
     </div>
-    <div v-if="formShow" class="is-close" :class="{ 'is-open': formShow }">
+    <!-- <div v-if="formShow" class="is-close" :class="{ 'is-open': formShow }">
       <a-divider orientation="left" style="border-color: #00d8ff22">{{ formType }}</a-divider>
-      <BasicForm
-        @register="registerForm"
-        @submit="handleSubmit"
-        :schemas="formType == '编辑风机信息' ? getSchamas() : getSchamas1()"
-        :model="formType == '编辑风机信息' ? fanInfoData : lineFormData"
-      />
-    </div>
+      <BasicForm @register="registerForm" @submit="handleSubmit" :schemas="columns" />
+    </div> -->
   </BasicModal>
 </template>
 
 <script lang="ts" setup>
   //ts语法
-  import { ref, onMounted, reactive, nextTick } from 'vue';
+  import { ref, onMounted, reactive, nextTick, defineProps, defineEmits, watch } from 'vue';
   import echarts from '/@/utils/lib/echarts';
   import { option, initData, fanInfoData, fanInfo, getSchamas, getSchamas1, lineFormData } from '../main.data.ts';
   import { BasicModal, useModalInner } from '/@/components/Modal';
@@ -86,7 +89,17 @@
   import { Decoration7 as DvDecoration7 } from '@kjgl77/datav-vue3';
   import { message } from 'ant-design-vue';
   import { formatNum } from '/@/utils/ventutil';
-
+  import { getTableHeaderColumns } from '/@/hooks/web/useWebColumns';
+  import { list } from '../main.api';
+  const props = defineProps({
+    deviceType: {
+      type: String,
+    },
+    selectData: {
+      type: Object,
+      default: () => {},
+    },
+  });
   const emit = defineEmits(['close', 'register', 'openModal']);
   type AssistanceItemType = {
     angle: number;
@@ -97,7 +110,8 @@
     min: number;
     max: number;
   };
-
+  const columns = ref([]);
+  const isMock = true;
   // 注册 modal
   const [register, { closeModal }] = useModalInner(() => {
     nextTick(() => {
@@ -117,7 +131,7 @@
   const yDataList: [] = [];
   let lineNum = 0;
   const lineEquation = ref<string[]>([]);
-
+  const deviceData = ref({});
   const uQ = ref<string | undefined>(undefined); // 100 - 400
   const uH = ref<number | undefined>(undefined); //  - 1000
   const resultObj = ref<{ x: number; y: number; Hz: number } | null>(null);
@@ -450,6 +464,33 @@
       formShow.value = false;
     }, 800);
   }
+  function getColumn() {
+    let lineColumns = [];
+    if (props.deviceType) {
+      lineColumns = getTableHeaderColumns(props.deviceType + '_input') as [];
+      if (lineColumns && lineColumns.length < 1) {
+        lineColumns = getTableHeaderColumns(props.deviceType.split('_')[0] + '_input') as [];
+      }
+      if (lineColumns.length > 0) {
+        lineColumns = lineColumns.filter((item) => item['dataIndex'] && item['dataIndex'].includes('_line_'));
+        columns.value = lineColumns;
+      }
+    }
+  }
+  watch(
+    () => props.deviceType,
+    async () => {
+      getColumn();
+      // deviceData.value = await list({ devicetype: 'fanmain', pagetype: 'normal' });
+    }
+  );
+  watch(
+    () => props.selectData,
+    async (selectData) => {
+      debugger;
+      deviceData.value = selectData;
+    }
+  );
   onMounted(() => {});
 </script>
 

+ 7 - 2
src/views/vent/monitorManager/mainFanMonitor/index.vue

@@ -277,7 +277,12 @@
                 <!-- <a-tag :color="record.netStatus == '0' ? '#f00' : 'green'">{{ record.netStatus == '1' ? '报警' : '正常' }}</a-tag> -->
               </template>
               <template #action="{ record }">
-                <a v-if="globalConfig?.showReport" class="table-action-link" @click="deviceEdit($event, 'reportInfo', record)">报表录入</a>
+                <a
+                  v-if="globalConfig?.showReport || (!globalConfig?.showReport && hasPermission('fan:kkjc'))"
+                  class="table-action-link"
+                  @click="deviceEdit($event, 'reportInfo', record)"
+                  >报表录入</a
+                >
                 <a class="table-action-link" @click="deviceEdit($event, 'deviceInfo', record)">设备编辑</a>
               </template>
             </GroupMonitorTable>
@@ -428,7 +433,7 @@
     </div>
   </a-modal>
   <!-- 工况辅助决策 -->
-  <ConditionAssistance @register="registerModal" />
+  <ConditionAssistance @register="registerModal" :deviceType="deviceType" :selectData="selectData" />
   <DeviceBaseInfo @register="registerModalDeviceEdit" :device-type="selectData['deviceType']" />
 </template>
 

+ 6 - 0
src/views/vent/monitorManager/mainFanMonitor/main.api.ts

@@ -8,6 +8,9 @@ enum Api {
   deviceList = '/safety/ventanalyWind/list',
   importExcel = '/sys/user/importExcel',
   exportXls = '/sys/user/exportXls',
+  lineList = '/Vmodel/ventanalyModelFanChart/list',
+  lineAdd = '/Vmodel/ventanalyModelFanChart/add',
+  lineEdit = '/Vmodel/ventanalyModelFanChart/edit',
 }
 /**
  * 导出api
@@ -39,3 +42,6 @@ export const pathList = (params) => defHttp.get({ url: Api.pathList, params });
  * 关键路线列表
  */
 export const deviceList = (params) => defHttp.get({ url: Api.deviceList, params });
+
+// 风机曲线方程
+export const lineList = (params) => defHttp.get({ url: Api.lineList, params });

+ 1 - 1
src/views/vent/monitorManager/mainFanMonitor/mainWind.xj.threejs.ts

@@ -492,7 +492,7 @@ class mainXjWindRect {
   /* 齿轮转动动画 1 - 50  最大3 */
   startGearAnimation(deviceType, flag, smokeDirection, frequencyVal, duration = 8) {
     console.log(deviceType, flag);
-    debugger;
+    // debugger;
     let gearObj, gearDirection;
     if (deviceType === 'front') {
       gearObj = this.gearFront;

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

@@ -57,6 +57,7 @@
 </script>
 
 <style lang="less" scoped>
+  @import '/@/design/vent/modal.less';
   @ventSpace: zxm;
   .nitrogen-home-header {
     width: 100%;

+ 1 - 1
src/views/vent/monitorManager/obfurage1Monitor/gate.api.ts

@@ -11,7 +11,7 @@ enum Api {
   exportXls = '/sys/user/exportXls',
   baseList = '/safety/ventanalyGate/list',
   cameraList = '/safety/ventanalyCamera/list',
-  cameraAddrList = '/camera/info',
+  cameraAddrList = '/monitor/camera/info',
 }
 /**
  * 导出api

+ 2 - 2
src/views/vent/monitorManager/safetyMonitor/HistoryTable.vue

@@ -93,7 +93,7 @@
     if (stationType.value !== 'redis') {
       return '/safety/ventanalyMonitorData/exportXls';
     } else {
-      return '/history/getHistoryData/exportXls';
+      return '/monitor/history/getHistoryData/exportXls';
     }
   };
   const emit = defineEmits(['change']);
@@ -230,7 +230,7 @@
         interval: intervalMap.get(formData['skip']) ? intervalMap.get(formData['skip']) : '1h',
         isEmployee: props.deviceType.startsWith('vehicle') ? false : true,
       };
-      const result = await defHttp.post({ url: '/history/getHistoryData', params: params });
+      const result = await defHttp.post({ url: '/monitor/history/getHistoryData', params: params });
       setPagination({ total: Math.abs(result['total']) || 0 });
       dataSource.value = result['records'] || [];
     }

+ 2 - 2
src/views/vent/monitorManager/safetyMonitor/index.vue

@@ -163,7 +163,7 @@
       </a-tab-pane>
     </a-tabs>
     <div class="right-btn-group">
-      <div class="update-btn">
+      <!-- <div class="update-btn">
         <span>同步分站:</span>
         <a-select
           v-model:value="subStation"
@@ -174,7 +174,7 @@
           style="width: 150px"
         />
         <div class="btn btn1" @click="updateSubstation">确定</div>
-      </div>
+      </div> -->
       <div class="export-btn"><div class="btn btn1" @click="exportData">一键导出</div></div>
     </div>
   </div>

+ 1 - 1
src/views/vent/monitorManager/safetyMonitor/safety.api.ts

@@ -6,7 +6,7 @@ enum Api {
   deviceTypeList = '/safety/ventanalyDeviceInfo/DeviceKind/queryBySystem',
   itemList = '/sys/dictItem/list',
   safetyDeviceList = '/monitor/codeDict',
-  safetyList = '/history/getAlarmHistoryData',
+  safetyList = '/monitor/history/getAlarmHistoryData',
   export = '/safety/reportInfo/expComReport?tempName=aqjk',
   subStationList = '/safety/ventanalySubStation/alllist',
   initSubStation = '/monitor/initSafetyMonitorDeviceInfo',

+ 82 - 42
src/views/vent/monitorManager/windowMonitor/index.vue

@@ -18,34 +18,34 @@
   <div class="scene-box">
     <div class="top-box">
       <div class="top-center">
-        <!-- <div class="input-box">
-          <span class="input-title">风窗面积:</span>
-          <a-input-number size="small" placeholder="0" :min="0" :max="90" :step="1" v-model:value="windowAngle" />
-        </div> -->
-        <template>
-          <div class="row" v-if="selectData.nwindownum > 1">
-            <div v-if="hasPermission('window:control')" class="button-box" @click="setArea(1)">设定前窗面积</div>
-            <div v-if="hasPermission('window:control')" class="button-box" @click="setArea(2)">设定后窗面积</div>
-            <div v-if="hasPermission('window:ldkz')" class="button-box" @click="setArea(3)">自主联动控制</div>
-          </div>
-          <div class="row" v-if="selectData.nwindownum == 1">
-            <div v-if="hasPermission('window:control')" class="button-box" @click="setArea(1)">设定风窗面积</div>
-            <div v-if="hasPermission('window:ldkz')" class="button-box" @click="setArea(3)">自主联动控制</div>
-          </div>
-        </template>
+        <div class="row" v-if="selectData.nwindownum > 1">
+          <div v-if="hasPermission('window:control')" class="button-box" @click="setArea(1)">设定前窗面积</div>
+          <div v-if="hasPermission('window:control')" class="button-box" @click="setArea(2)">设定后窗面积</div>
+          <div v-if="hasPermission('window:ldkz')" class="button-box" @click="setArea(3)">自主联动控制开启</div>
+          <div v-if="hasPermission('window:ldkz')" class="button-box" @click="setArea(4)">自主联动控制停止</div>
+        </div>
+        <div class="row" v-if="selectData.nwindownum == 1">
+          <div v-if="hasPermission('window:control')" class="button-box" @click="setArea(1)">设定风窗面积</div>
+          <div v-if="hasPermission('window:ldkz')" class="button-box" @click="setArea(3)">自主联动控制开启</div>
+          <div v-if="hasPermission('window:ldkz')" class="button-box" @click="setArea(4)">自主联动控制停止</div>
+        </div>
         <template v-if="hasPermission('window:showAngle')">
           <div class="row" v-if="selectData.nwindownum > 1">
             <div v-if="hasPermission('window:control')" class="button-box" @click="setAngle(1)">设定前窗角度</div>
             <div v-if="hasPermission('window:control')" class="button-box" @click="setAngle(2)">设定后窗角度</div>
-            <div v-if="hasPermission('window:ldkz')" class="button-box" @click="setArea(3)">自主联动控制</div>
+            <div v-if="hasPermission('window:ldkz')" class="button-box" @click="setArea(3)">自主联动控制开启</div>
+            <div v-if="hasPermission('window:ldkz')" class="button-box" @click="setArea(4)">自主联动控制停止</div>
           </div>
           <div class="row" v-if="selectData.nwindownum == 1">
             <div v-if="hasPermission('window:control')" class="button-box" @click="setAngle(1)">设定风窗角度</div>
-            <div v-if="hasPermission('window:ldkz')" class="button-box" @click="setArea(3)">自主联动控制</div>
+            <div v-if="hasPermission('window:ldkz')" class="button-box" @click="setArea(3)">自主联动控制开启</div>
+            <div v-if="hasPermission('window:ldkz')" class="button-box" @click="setArea(4)">自主联动控制停止</div>
           </div>
         </template>
       </div>
       <div class="top-right row">
+        <div v-if="hasPermission('window:control')" class="button-box" @click="setArea(5)">一键全开</div>
+        <div v-if="hasPermission('window:control')" class="button-box" @click="setArea(6)">一键全关</div>
         <!-- <div class="control-type row">
           <div class="control-title">控制模式:</div>
           <a-radio-group v-model:value="controlType">
@@ -338,34 +338,64 @@
 
   // 设置风窗面积
   const setArea = (flag) => {
-    if (selectData.nwindownum == 2) {
-      modalTitle.value = flag === 1 ? '设定前窗面积' : '设定后窗面积';
+    modalType.value = flag + '';
+    if (flag == 1 || flag == 2) {
+      if (selectData.nwindownum == 2) {
+        modalTitle.value = flag === 1 ? '设定前窗面积' : '设定后窗面积';
+      } else {
+        modalTitle.value = '设定风窗面积';
+      }
+      modalIsShow.value = true;
     } else {
-      modalTitle.value = '设定风窗面积';
-    }
-
-    if (flag == 3) {
-      modalTitle.value = '自主联动控制';
+      if (!globalConfig?.simulatedPassword) {
+        if (flag == 3) {
+          modalTitle.value = '自主联动控制开启';
+        }
+        if (flag == 4) {
+          modalTitle.value = '自主联动控制停止';
+        }
+        if (flag == 5) {
+          modalTitle.value = '一键全开';
+        }
+        if (flag == 6) {
+          modalTitle.value = '一键全关';
+        }
+        modalIsShow.value = true;
+      } else {
+        handleOK('', modalType.value, selectData.nwindownum);
+      }
     }
-
-    modalType.value = flag + '';
-    modalIsShow.value = true;
   };
 
   // 设置风窗角度
   const setAngle = (flag) => {
-    if (selectData.nwindownum == 2) {
-      modalTitle.value = flag === 1 ? '设定前窗角度' : '设定后窗角度';
+    modalType.value = flag + '';
+    if (flag == 1 || flag == 2) {
+      if (selectData.nwindownum == 2) {
+        modalTitle.value = flag === 1 ? '设定前窗角度' : '设定后窗角度';
+      } else {
+        modalTitle.value = '设定风窗角度';
+      }
+      modalIsShow.value = true;
     } else {
-      modalTitle.value = '设定风窗角度';
-    }
-
-    if (flag == 3) {
-      modalTitle.value = '自主联动控制';
+      if (!globalConfig?.simulatedPassword) {
+        if (flag == 3) {
+          modalTitle.value = '自主联动控制开启';
+        }
+        if (flag == 4) {
+          modalTitle.value = '自主联动控制停止';
+        }
+        if (flag == 5) {
+          modalTitle.value = '一键全开';
+        }
+        if (flag == 6) {
+          modalTitle.value = '一键全关';
+        }
+        modalIsShow.value = true;
+      } else {
+        handleOK('', modalType.value, selectData.nwindownum);
+      }
     }
-
-    modalType.value = flag + '';
-    modalIsShow.value = true;
   };
 
   const handleOK = (passWord, handlerState, windowAngleNum) => {
@@ -373,15 +403,25 @@
       message.warning('请输入密码!');
       return;
     }
-
-    windowAngle.value = windowAngleNum;
-    const data = {
+    let data = {
       deviceid: selectData.deviceID,
       devicetype: selectData.deviceType,
-      paramcode: handlerState == 1 ? 'frontSetValue' : 'rearSetValue',
+      paramcode: '',
       password: passWord || globalConfig?.simulatedPassword,
-      value: windowAngle.value,
+      value: null,
     };
+    if (handlerState == 1 || handlerState == 2) {
+      windowAngle.value = windowAngleNum;
+      data.paramcode = handlerState == 1 ? 'frontSetValue' : 'rearSetValue';
+      data.value = windowAngle.value;
+    } else if (handlerState == 3 || handlerState == 4) {
+      data.paramcode = 'autoRun';
+      data.value = handlerState == 3 ? 1 : 0;
+    } else if (handlerState == 5 || handlerState == 6) {
+      data.paramcode = 'frontSetValue';
+      data.value = handlerState == 5 ? selectData.maxarea : 0;
+    }
+
     deviceControlApi(data)
       .then(() => {
         if (globalConfig.History_Type == 'remote') {

+ 1 - 1
src/views/vent/monitorManager/windowMonitor/modal.vue

@@ -5,7 +5,7 @@
         <ExclamationCircleFilled style="color: #ffb700; font-size: 30px" />
         <div class="warning-text">您是否要进行{{ title }}操作?</div>
       </div>
-      <div class="vent-flex-row input-box" v-if="type !== '3'">
+      <div class="vent-flex-row input-box" v-if="type == '1' || type == '2'">
         <div class="label">{{ title.includes('角度') ? '风窗角度:' : '风窗面积:' }}</div>
         <a-input-number size="small" placeholder="0" :min="0" :max="90" v-model:value="area" />
       </div>

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

@@ -4,7 +4,7 @@ enum Api {
   list = '/monitor/device',
   baseList = '/safety/ventanalyWindow/list',
   cameraList = '/safety/ventanalyCamera/list',
-  cameraAddrList = '/camera/info',
+  cameraAddrList = '/monitor/camera/info',
 }
 /**
  * 列表接口

+ 1 - 1
src/views/vent/monitorManager/windowMonitorBet/window.api.ts

@@ -4,7 +4,7 @@ enum Api {
   list = '/monitor/device',
   baseList = '/safety/ventanalyWindow/list',
   cameraList = '/safety/ventanalyCamera/list',
-  cameraAddrList = '/camera/info',
+  cameraAddrList = '/monitor/camera/info',
 }
 /**
  * 列表接口

+ 23 - 20
src/views/vent/monitorManager/windrectMonitor/duishe.threejs.ts

@@ -271,7 +271,7 @@ class dsWindRect {
     const dsmove = this.group?.getObjectByName('dsmove') as THREE.Object3D;
     const dsTanTou = dsmove?.getObjectByName('probe') as THREE.Object3D;
 
-    if (!dsTanTou || (flag != 'start' && flag != 'moni')) return;
+    if (!dsTanTou || (flag != 'start' && flag != 'moni' && flag != 'up' && flag != 'down')) return;
     dsTanTou.position.setY(0.45);
     if (flag == 'moni') {
       gsap.to(dsTanTou['position'], {
@@ -297,25 +297,28 @@ class dsWindRect {
     } else {
       if (!isDirect) {
         if (this.isRun) return;
-        dsTanTou.position.setY(0.45);
-        this.isRun = true;
-        gsap.to(dsTanTou['position'], {
-          y: -0.32,
-          duration: Math.abs(dsTanTou['position']['y'] + 0.32) * 31,
-          overwrite: true,
-          onComplete: function () {
-            setTimeout(() => {
-              gsap.to(dsTanTou['position'], {
-                y: 0.45,
-                duration: 0.77 * 31,
-                overwrite: true,
-                // onComplete: function () {
-                //   _this.isRun = false;
-                // },
-              });
-            }, 5000);
-          },
-        });
+        if (flag == 'down') {
+          dsTanTou.position.setY(0.45);
+          this.isRun = true;
+          gsap.to(dsTanTou['position'], {
+            y: -0.32,
+            duration: Math.abs(dsTanTou['position']['y'] + 0.32) * 31,
+            overwrite: true,
+          });
+        } else if (flag == 'up') {
+          new Promise((resove) => {
+            gsap.to(dsTanTou['position'], {
+              y: 0.45,
+              duration: 0.77 * 31,
+              overwrite: true,
+              onComplete: function () {
+                resove(null);
+              },
+            });
+          }).then(() => {
+            this.isRun = false;
+          });
+        }
       } else {
         if (!this.isRun) return;
         const dsDown = gsap.getById('dsDown');

+ 4 - 4
src/views/vent/monitorManager/windrectMonitor/index.vue

@@ -500,14 +500,14 @@
     }
 
     if (selectData.deviceType == 'windrect_ds') {
-      if (selectData['apparatusRun'] == 1) {
+      if (selectData['apparatusRun'] == 1 && selectData['sign'] == 2) {
         if (!deviceRunState) {
           deviceRunState = 'start';
-          play('start');
+          play('down');
         }
-      } else {
+      } else if (selectData['apparatusRun'] == 0 && selectData['sign'] == 0 && deviceRunState == 'start') {
         deviceRunState = '';
-        play('start', true);
+        play('up');
       }
     }
   }

+ 1 - 1
src/views/vent/monitorManager/windrectMonitor/windrect.api.ts

@@ -9,7 +9,7 @@ enum Api {
   importExcel = '/sys/user/importExcel',
   exportXls = '/safety/testwindDetail/exportXls',
   cameraList = '/safety/ventanalyCamera/list',
-  cameraAddrList = '/camera/info',
+  cameraAddrList = '/monitor/camera/info',
   resetWind = '/safety/ventanalyCommand/resettestwind',
 }
 /**