Browse Source

1. 新增寸草1、寸草2压风页面
2. 新增寸草1、寸草2瓦斯泵抽采页面
3. 新增星空风窗
4. 优化历史查询、传感器查询

hongrunxia 11 months ago
parent
commit
a8c39443b5
51 changed files with 3509 additions and 2728 deletions
  1. 2 2
      public/js/config.js
  2. 4 1
      src/components/CADViewer/src/hooks/useCADViewer.ts
  3. 9 6
      src/components/Form/src/jeecg/components/JSelectMultiple.vue
  4. 30 28
      src/components/jeecg/OnLine/SearchFormItem.vue
  5. 8 12
      src/qiankun/index.ts
  6. 3 3
      src/views/vent/comment/threejs/Smoke1.ts
  7. 8 8
      src/views/vent/comment/threejs/SmokePartical1.ts
  8. 0 78
      src/views/vent/deviceManager/deviceCategory/category.api.ts
  9. 0 83
      src/views/vent/deviceManager/deviceCategory/category.data.ts
  10. 0 87
      src/views/vent/deviceManager/deviceCategory/components/CategoryModal.vue
  11. 0 286
      src/views/vent/deviceManager/deviceCategory/index.vue
  12. 29 32
      src/views/vent/deviceManager/deviceTable/index.vue
  13. 1 1
      src/views/vent/deviceManager/pointTabel/point.data.ts
  14. 1 1
      src/views/vent/deviceManager/substationTabel/index.vue
  15. 1 1
      src/views/vent/home/colliery/components/fan-monitor.vue
  16. 12 8
      src/views/vent/home/colliery/components/main-monitor.vue
  17. 4 2
      src/views/vent/home/colliery/index.vue
  18. 5 4
      src/views/vent/monitorManager/chamberMonitor/chamber.threejs.base.ts
  19. 13 8
      src/views/vent/monitorManager/comment/HistoryTable.vue
  20. 6 2
      src/views/vent/monitorManager/comment/MonitorTable.vue
  21. 614 600
      src/views/vent/monitorManager/compressor/components/nitrogenHome_ln.vue
  22. 3 3
      src/views/vent/monitorManager/compressor/nitrogen.data.blt.ts
  23. 4 7
      src/views/vent/monitorManager/compressor/nitrogen.data.ts
  24. 3 3
      src/views/vent/monitorManager/deviceMonitor/components/device/device.data.ts
  25. 16 9
      src/views/vent/monitorManager/deviceMonitor/components/device/index.vue
  26. 1 1
      src/views/vent/monitorManager/deviceMonitor/components/network/index.vue
  27. 45 8
      src/views/vent/monitorManager/fanLocalMonitor/index.vue
  28. 154 0
      src/views/vent/monitorManager/gasPumpMonitor/components/DetailModalCC.vue
  29. 485 0
      src/views/vent/monitorManager/gasPumpMonitor/components/gasPumpHomeCC.vue
  30. 0 600
      src/views/vent/monitorManager/gasPumpMonitor/components/gasPumpHomeNew.vue
  31. 53 343
      src/views/vent/monitorManager/gasPumpMonitor/gasPump.data.ts
  32. 352 0
      src/views/vent/monitorManager/gasPumpMonitor/gasPump.dataCc.ts
  33. 418 0
      src/views/vent/monitorManager/gasPumpMonitor/gasPump.dataCc2_1.ts
  34. 322 0
      src/views/vent/monitorManager/gasPumpMonitor/gasPump.dataCc2_2.ts
  35. 2 4
      src/views/vent/monitorManager/gasPumpMonitor/index.vue
  36. 4 3
      src/views/vent/monitorManager/gateMonitor/gate.threejs.ts
  37. 17 4
      src/views/vent/monitorManager/gateMonitor/index.vue
  38. 13 14
      src/views/vent/monitorManager/mainFanMonitor/index.vue
  39. 10 5
      src/views/vent/monitorManager/nitrogen/components/nitrogenAlarmHistory.vue
  40. 161 96
      src/views/vent/monitorManager/nitrogen/components/nitrogenHome.vue
  41. 14 137
      src/views/vent/monitorManager/nitrogen/nitrogen.data.1.ts
  42. 3 0
      src/views/vent/monitorManager/nitrogen/nitrogen.dataBet.ts
  43. 192 0
      src/views/vent/monitorManager/nitrogen/nitrogen.dataCc.ts
  44. 175 0
      src/views/vent/monitorManager/nitrogen/nitrogen.dataLT.ts
  45. 9 3
      src/views/vent/monitorManager/sensorMonitor/index.vue
  46. 58 12
      src/views/vent/monitorManager/windowMonitor/dandaoFcXk.threejs.ts
  47. 9 53
      src/views/vent/monitorManager/windowMonitor/index.vue
  48. 64 8
      src/views/vent/monitorManager/windowMonitor/window.threejs.ts
  49. 151 148
      src/views/vent/monitorManager/workFaceMonitor/components/workFaceVentHome.vue
  50. 3 1
      src/views/vent/performance/comment/CADModal.vue
  51. 18 13
      src/views/vent/reportManager/comment/DeviceModal.vue

+ 2 - 2
public/js/config.js

@@ -3,8 +3,8 @@ const VUE_APP_URL = {
   webRtcUrl: '/webRtc' // rtsp服务器IP地址
 }
 const History_Type = {
-  type: 'remote', // remote、vent  (remote 代表的是历史查询走的装备院的接口,vent是走的咱们的,目前神东的项目都用remote, 其他矿用vent)
-  // type: 'vent', // remote、vent
+  // type: 'remote', // remote、vent  (remote 代表的是历史查询走的装备院的接口,vent是走的咱们的,目前神东的项目都用remote, 其他矿用vent)
+  type: 'vent', // remote、vent
   deviceType: []
 }
 

+ 4 - 1
src/components/CADViewer/src/hooks/useCADViewer.ts

@@ -2,6 +2,9 @@ import { CAD_VIEWER_IFRAME_ID } from '../viewer.data';
 import { message } from 'ant-design-vue';
 import { transformCadFile } from '../viewer.api';
 import { SupportedOperationName } from '../types';
+import { useGlobSetting } from '/@/hooks/setting';
+const globSetting = useGlobSetting();
+const baseApiUrl = globSetting.domainUrl;
 
 export default function useCADViewer() {
   /** 向CADViewer发送指令 */
@@ -27,7 +30,7 @@ export default function useCADViewer() {
       .then((result) => {
         const filepath = result.replace('/data/file/', '');
         if (import.meta.env.PROD) {
-          return window.location.origin + `/sys/common/static/${filepath}`.replace(/\/+/g, '/');
+          return `${baseApiUrl}/sys/common/static/${filepath}`.replace(/\/+/g, '/');
         } else {
           return import.meta.env.VITE_GLOB_DOMAIN_URL + `/sys/common/static/${filepath}`.replace(/\/+/g, '/');
         }

+ 9 - 6
src/components/Form/src/jeecg/components/JSelectMultiple.vue

@@ -98,13 +98,16 @@
       );
 
       //适用于 动态改变下拉选项的操作
-      watch(()=>props.options, ()=>{
-        if (props.dictCode) {
-          // nothing to do
-        } else {
-          dictOptions.value = props.options;
+      watch(
+        () => props.options,
+        () => {
+          if (props.dictCode) {
+            // nothing to do
+          } else {
+            dictOptions.value = props.options;
+          }
         }
-      });
+      );
 
       function onChange(selectedValue) {
         if (props.triggerChange) {

+ 30 - 28
src/components/jeecg/OnLine/SearchFormItem.vue

@@ -4,12 +4,7 @@
       <span :title="item.label" class="label-text">{{ item.label }}</span>
     </template>
     <template v-if="single_mode === item.mode">
-      <a-date-picker
-        :showTime="false"
-        valueFormat="YYYY-MM-DD"
-        :placeholder="'请选择' + item.label"
-        v-model:value="queryParam[item.field]"
-      ></a-date-picker>
+      <a-date-picker :showTime="false" valueFormat="YYYY-MM-DD" :placeholder="'请选择' + item.label" v-model:value="queryParam[item.field]" />
     </template>
     <template v-else>
       <a-date-picker
@@ -18,7 +13,7 @@
         placeholder="开始日期"
         v-model:value="queryParam[item.field + '_begin']"
         style="width: calc(50% - 15px)"
-      ></a-date-picker>
+      />
       <span class="group-query-strig">~</span>
       <a-date-picker
         :showTime="false"
@@ -26,7 +21,7 @@
         placeholder="结束日期"
         v-model:value="queryParam[item.field + '_end']"
         style="width: calc(50% - 15px)"
-      ></a-date-picker>
+      />
     </template>
   </a-form-item>
 
@@ -40,7 +35,7 @@
         :show-time="true"
         valueFormat="YYYY-MM-DD HH:mm:ss"
         v-model:value="queryParam[item.field]"
-      ></a-date-picker>
+      />
     </template>
     <template v-else>
       <a-date-picker
@@ -49,7 +44,7 @@
         valueFormat="YYYY-MM-DD HH:mm:ss"
         v-model:value="queryParam[item.field + '_begin']"
         style="width: calc(50% - 9px); min-width: 60px"
-      ></a-date-picker>
+      />
       <span class="group-query-strig" style="width: auto; padding: 0 4px">~</span>
       <a-date-picker
         placeholder="选择结束时间"
@@ -57,7 +52,7 @@
         valueFormat="YYYY-MM-DD HH:mm:ss"
         v-model:value="queryParam[item.field + '_end']"
         style="width: calc(50% - 9px); min-width: 60px"
-      ></a-date-picker>
+      />
     </template>
   </a-form-item>
 
@@ -66,7 +61,7 @@
       <span :title="item.label" class="label-text">{{ item.label }}</span>
     </template>
     <template v-if="single_mode === item.mode">
-      <a-date-picker :placeholder="'请选择' + item.label" mode="time" valueFormat="HH:mm:ss" v-model:value="queryParam[item.field]"></a-date-picker>
+      <a-date-picker :placeholder="'请选择' + item.label" mode="time" valueFormat="HH:mm:ss" v-model:value="queryParam[item.field]" />
     </template>
     <template v-else>
       <a-date-picker
@@ -75,7 +70,7 @@
         valueFormat="HH:mm:ss"
         v-model:value="queryParam[item.field + '_begin']"
         style="width: calc(50% - 15px)"
-      ></a-date-picker>
+      />
       <span class="group-query-strig">~</span>
       <a-date-picker
         placeholder="请选择结束时间"
@@ -83,7 +78,7 @@
         valueFormat="HH:mm:ss"
         v-model:value="queryParam[item.field + '_end']"
         style="width: calc(50% - 15px)"
-      ></a-date-picker>
+      />
     </template>
   </a-form-item>
 
@@ -95,8 +90,7 @@
     <template #label>
       <span :title="item.label" class="label-text">{{ item.label }}</span>
     </template>
-    <JDictSelectTag v-if="item.config === '1'" :placeholder="'请选择' + item.label" v-model="queryParam[item.field]" :dictCode="getDictCode(item)">
-    </JDictSelectTag>
+    <JDictSelectTag v-if="item.config === '1'" :placeholder="'请选择' + item.label" v-model="queryParam[item.field]" :dictCode="getDictCode(item)" />
     <a-select v-else :placeholder="'请选择' + item.label" v-model:value="queryParam[item.field]">
       <template v-for="(obj, index) in dictOptions[getDictOptionKey(item)]" :key="index">
         <a-select-option :value="obj.value"> {{ obj.text }}</a-select-option>
@@ -116,8 +110,7 @@
       :pidValue="item.pidValue"
       :hasChildField="item.hasChildField"
       load-triggle-change
-    >
-    </JTreeSelect>
+    />
   </a-form-item>
 
   <a-form-item v-else-if="item.view === CompTypeEnum.CatTree" :labelCol="labelCol" :class="'jeecg-online-search'">
@@ -131,15 +124,14 @@
     <template #label>
       <span :title="item.label" class="label-text">{{ item.label }}</span>
     </template>
-    <JOnlineSearchSelect v-model:value="queryParam[item.field]" :placeholder="'请选择' + item.label" :sql="item.sql">
-  </JOnlineSearchSelect>
+    <JOnlineSearchSelect v-model:value="queryParam[item.field]" :placeholder="'请选择' + item.label" :sql="item.sql" />
   </a-form-item>
 
   <a-form-item v-else-if="item.view === CompTypeEnum.SelUser" :labelCol="labelCol" :class="'jeecg-online-search'">
     <template #label>
       <span :title="item.label" class="label-text">{{ item.label }}</span>
     </template>
-    <JSelectUserByDept v-model:value="queryParam[item.field]" :placeholder="'请选择' + item.label"></JSelectUserByDept>
+    <JSelectUserByDept v-model:value="queryParam[item.field]" :placeholder="'请选择' + item.label" />
   </a-form-item>
 
   <a-form-item v-else-if="item.view == CompTypeEnum.SelDepart" :labelCol="labelCol" :class="'jeecg-online-search'">
@@ -194,16 +186,16 @@
     <template #label>
       <span :title="item.label" class="label-text">{{ item.label }}</span>
     </template>
-    <template v-if="single_mode === item.mode && 'string'== item.view">
-      <j-input :placeholder="'请输入' + item.label" v-model:value="queryParam[item.field]"></j-input>
+    <template v-if="single_mode === item.mode && 'string' == item.view">
+      <j-input :placeholder="'请输入' + item.label" v-model:value="queryParam[item.field]" />
     </template>
     <template v-else-if="single_mode === item.mode">
-      <a-input :placeholder="'请输入' + item.label" v-model:value="queryParam[item.field]"></a-input>
+      <a-input :placeholder="'请输入' + item.label" v-model:value="queryParam[item.field]" />
     </template>
     <template v-else>
-      <a-input :placeholder="'请输入开始' + item.label" v-model:value="queryParam[item.field + '_begin']" style="width: calc(50% - 15px)"></a-input>
+      <a-input :placeholder="'请输入开始' + item.label" v-model:value="queryParam[item.field + '_begin']" style="width: calc(50% - 15px)" />
       <span class="group-query-strig">~</span>
-      <a-input :placeholder="'请输入结束' + item.label" v-model:value="queryParam[item.field + '_end']" style="width: calc(50% - 15px)"></a-input>
+      <a-input :placeholder="'请输入结束' + item.label" v-model:value="queryParam[item.field + '_end']" style="width: calc(50% - 15px)" />
     </template>
   </a-form-item>
 </template>
@@ -213,7 +205,17 @@
   import { defineComponent, ref } from 'vue';
   import { DateTypeEnum } from '/@/enums/DateTypeEnum.ts';
   import { CompTypeEnum } from '/@/enums/CompTypeEnum.ts';
-  import { JDictSelectTag, JTreeSelect, JCategorySelect, JSelectUserByDept, JSelectDept, JPopup, JAreaLinkage,JInput,JSearchSelect } from '/@/components/Form';
+  import {
+    JDictSelectTag,
+    JTreeSelect,
+    JCategorySelect,
+    JSelectUserByDept,
+    JSelectDept,
+    JPopup,
+    JAreaLinkage,
+    JInput,
+    JSearchSelect,
+  } from '/@/components/Form';
   export default defineComponent({
     name: 'SearchFormItem',
     components: {
@@ -302,7 +304,7 @@
 </script>
 
 <style lang="less" scoped>
-@ventSpace: zxm;
+  @ventSpace: zxm;
 
   .group-query-strig {
     width: 30px;

+ 8 - 12
src/qiankun/index.ts

@@ -34,20 +34,16 @@ const mountMicroApp = (path, toPath?) => {
       if (toPath) {
         app['props']['data']['publicPath'] = toPath;
       }
+      debugger;
       activeApps[app['activeRule']] = loadMicroApp(app, {
         fetch(url, ...args) {
-          // 给指定的微应用 entry 开启跨域请求
-          if (url === 'http://1.1.1.3:89/cookie/flash.js') {
-            return window.fetch(url, {
-              ...args,
-              headers: {
-                'Access-Control-Allow-Origin': '*',
-              },
-              mode: 'cors',
-              credentials: 'include',
-            });
-          }
-          return window.fetch(url, ...args);
+          return window.fetch(url, {
+            ...args,
+            headers: {
+              'Access-Control-Allow-Origin': '*',
+              'Content-Type': 'text/html',
+            },
+          });
         },
       }); // 手动加载子应用
     }

+ 3 - 3
src/views/vent/comment/threejs/Smoke1.ts

@@ -15,7 +15,7 @@ export default class Smoke {
   updateTimer;
   path;
 
-  constructor(smokeTexturePath, color, range = 10, center?, opacityFactor?, scaleFactor?, life?) {
+  constructor(smokeTexturePath, color, range = 2, center = { x: 0, y: 0, z: 0 }, opacityFactor = 1, scaleFactor = 0.01, life = 300) {
     this.smokeTexturePath = smokeTexturePath;
     this.color = color;
     this.opacityFactor = opacityFactor;
@@ -80,8 +80,8 @@ export default class Smoke {
     // 创建粒子
     let particals: SmokePartical1[] = [];
     setInterval(() => {
-      particals.push(new SmokePartical1(this.range, { x: 0, y: 100, z: 0 }));
-    }, 100);
+      particals.push(new SmokePartical1(this.range, { x: 0, y: 680, z: 0 }));
+    }, 50);
 
     // 校验粒子,并更新粒子位置等数据
     this.updateTimer = setInterval(() => {

+ 8 - 8
src/views/vent/comment/threejs/SmokePartical1.ts

@@ -15,17 +15,17 @@ export default class SmokePartical1 {
   constructor(range = 10, center = { x: 0, y: 0, z: 0 }) {
     this.range = range; // 粒子的分布半径
     this.center = center; // 粒子的分布中心
-    this.life = 1000; // 粒子的存活时间,毫秒
+    this.life = 400; // 粒子的存活时间,毫秒
     this.createTime = Date.now(); // 粒子创建时间
     this.updateTime = Date.now(); // 上次更新时间
-    this.size = 200; // 粒子大小
+    this.size = 3; // 粒子大小
 
     // 粒子透明度,及系数
-    this.opacityFactor = 0.4;
+    this.opacityFactor = 0.8;
     this.opacity = 1 * this.opacityFactor;
 
     // 粒子放大量,及放大系数
-    this.scaleFactor = 2.5;
+    this.scaleFactor = 10.5;
     this.scale = (this.scaleFactor * (this.updateTime - this.createTime)) / this.life; // 初始1,到达生命周期时为3
 
     // 粒子位置
@@ -43,7 +43,7 @@ export default class SmokePartical1 {
     // 粒子的扩散速度
     this.speed = {
       x: speedAround,
-      y: Math.random() * 10 - this.life * 14,
+      y: -this.life * 14,
       z: speedAround,
     };
   }
@@ -53,9 +53,9 @@ export default class SmokePartical1 {
     const time = now - this.updateTime;
 
     // 更新位置
-    this.position.x += (this.speed.x * time) / 1000;
-    this.position.y += (this.speed.y * time) / 1000;
-    this.position.z += (this.speed.z * time) / 1000;
+    this.position.x += (this.speed.x * time) / 2000;
+    this.position.y += (this.speed.y * time) / 2000;
+    this.position.z += (this.speed.z * time) / 2000;
 
     // 计算粒子透明度
     this.opacity = 1 - (now - this.createTime) / this.life;

+ 0 - 78
src/views/vent/deviceManager/deviceCategory/category.api.ts

@@ -1,78 +0,0 @@
-import { defHttp } from '/@/utils/http/axios';
-import { Modal } from 'ant-design-vue';
-
-enum Api {
-  list = '/sys/dict/DeviceKind/query',
-  save = '/sys/dict/DeviceKind/add',
-  edit = '/sys/dict/DeviceKind/edit',
-  deleteCategory = '/sys/dict/DeviceKind/delete',
-  deleteBatch = '/sys/category/deleteBatch',
-  importExcel = '/sys/category/importExcel',
-  exportXls = '/sys/category/exportXls',
-  loadTreeData = '/sys/category/loadTreeRoot',
-  getChildList = '/sys/dict/getDictItems/',
-  getChildListBatch = '/sys/category/getChildListBatch',
-}
-/**
- * 导出api
- * @param params
- */
-export const getExportUrl = Api.exportXls;
-/**
- * 导入api
- * @param params
- */
-export const getImportUrl = Api.importExcel;
-/**
- * 列表接口
- * @param params
- */
-export const list = (params) => defHttp.get({ url: Api.list, params });
-/**
- * 删除
- */
-export const deleteCategory = (params, handleSuccess) => {
-  return defHttp.delete({ url: Api.deleteCategory, params }, { joinParamsToUrl: true }).then(() => {
-    handleSuccess();
-  });
-};
-/**
- * 批量删除
- * @param params
- */
-export const batchDeleteCategory = (params, handleSuccess) => {
-  Modal.confirm({
-    title: '确认删除',
-    content: '是否删除选中数据',
-    okText: '确认',
-    cancelText: '取消',
-    onOk: () => {
-      return defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true }).then(() => {
-        handleSuccess();
-      });
-    },
-  });
-};
-/**
- * 保存或者更新
- * @param params
- */
-export const saveOrUpdateDict = (params, isUpdate) => {
-  const url = isUpdate ? Api.edit : Api.save;
-  return defHttp.post({ url: url, params });
-};
-/**
- * 查询全部树形节点数据
- * @param params
- */
-export const loadTreeData = (params) => defHttp.get({ url: Api.loadTreeData, params });
-/**
- * 查询子节点数据
- * @param params
- */
-export const getChildList = (params) => defHttp.get({ url: Api.getChildList, params });
-/**
- * 批量查询子节点数据
- * @param params
- */
-export const getChildListBatch = (params) => defHttp.get({ url: Api.getChildListBatch, params }, { isTransformResponse: false });

+ 0 - 83
src/views/vent/deviceManager/deviceCategory/category.data.ts

@@ -1,83 +0,0 @@
-import { BasicColumn } from '/@/components/Table';
-import { FormSchema } from '/@/components/Table';
-
-export const columns: BasicColumn[] = [
-  {
-    title: '类型名称',
-    dataIndex: 'itemText',
-    width: 350,
-    align: 'left',
-  },
-  {
-    title: '值',
-    dataIndex: 'itemValue',
-  },
-  {
-    title: 'sortOrder',
-    dataIndex: 'code',
-  },
-  {
-    title: '描述',
-    dataIndex: 'description',
-  },
-];
-
-export const searchFormSchema: FormSchema[] = [
-  {
-    label: '类型名称',
-    field: 'itemText',
-    component: 'Input',
-    colProps: { span: 6 },
-  },
-];
-
-export const formSchema: FormSchema[] = [
-  {
-    label: '',
-    field: 'id',
-    component: 'Input',
-    show: false,
-  },
-  {
-    label: '父级类型',
-    field: 'dictId',
-    component: 'TreeSelect',
-    componentProps: {
-      replaceFields: {
-        value: 'key',
-      },
-      dropdownStyle: {
-        maxHeight: '50vh',
-      },
-      getPopupContainer: () => document.body,
-    },
-    show: ({ values }) => {
-      return values.dictId !== '0';
-    },
-    dynamicDisabled: ({ values }) => {
-      return !!values.id;
-    },
-  },
-  {
-    label: '类型名称',
-    field: 'itemText',
-    required: true,
-    component: 'Input',
-  },
-  {
-    label: '值',
-    field: 'itemValue',
-    required: true,
-    component: 'Input',
-  },
-  {
-    label: '排序',
-    field: 'sortOrder',
-    component: 'InputNumber',
-  },
-  {
-    label: '描述',
-    field: 'description',
-    component: 'InputTextArea',
-  },
-];

+ 0 - 87
src/views/vent/deviceManager/deviceCategory/components/CategoryModal.vue

@@ -1,87 +0,0 @@
-<template>
-  <BasicModal v-bind="$attrs" @register="registerModal" destroyOnClose :title="getTitle" @ok="handleSubmit">
-    <BasicForm @register="registerForm" />
-  </BasicModal>
-</template>
-<script lang="ts" setup>
-  import { ref, computed, unref } from 'vue';
-  import { BasicModal, useModalInner } from '/src/components/Modal';
-  import { BasicForm, useForm } from '/src/components/Form';
-  import { formSchema } from '../category.data';
-  import { loadTreeData, saveOrUpdateDict } from '../category.api';
-  // 获取emit
-  const emit = defineEmits(['register', 'success']);
-  const isUpdate = ref(true);
-  const expandedRowKeys = ref([]);
-  const treeData = ref([]);
-  //表单配置
-  const [registerForm, { resetFields, setFieldsValue, validate, updateSchema }] = useForm({
-    schemas: formSchema,
-    showActionButtonGroup: false,
-    labelCol: {
-      xs: { span: 24 },
-      sm: { span: 4 },
-    },
-    wrapperCol: {
-      xs: { span: 24 },
-      sm: { span: 18 },
-    },
-  });
-  //表单赋值
-  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
-    //重置表单
-    await resetFields();
-    expandedRowKeys.value = [];
-    setModalProps({ confirmLoading: false, minHeight: 80 });
-    isUpdate.value = !!data?.isUpdate;
-    if (data?.record) {
-      //表单赋值
-      await setFieldsValue({
-        ...data.record,
-      });
-    }
-    //父级节点树信息
-    treeData.value = await loadTreeData({ async: false, pcode: '' });
-    updateSchema({
-      field: 'pid',
-      componentProps: { treeData },
-    });
-  });
-  //设置标题
-  const getTitle = computed(() => (!unref(isUpdate) ? '新增字典' : '编辑字典'));
-
-  /**
-   * 根据pid获取展开的节点
-   * @param pid
-   * @param arr
-   */
-  function getExpandKeysByPid(pid, arr) {
-    if (pid && arr && arr.length > 0) {
-      for (let i = 0; i < arr.length; i++) {
-        if (arr[i].key == pid && unref(expandedRowKeys).indexOf(pid) < 0) {
-          expandedRowKeys.value.push(arr[i].key);
-          getExpandKeysByPid(arr[i]['parentId'], unref(treeData));
-        } else {
-          getExpandKeysByPid(pid, arr[i].children);
-        }
-      }
-    }
-  }
-  //表单提交事件
-  async function handleSubmit() {
-    try {
-      let values = await validate();
-      setModalProps({ confirmLoading: true });
-      //提交表单
-      await saveOrUpdateDict(values, isUpdate.value);
-      //关闭弹窗
-      closeModal();
-      //展开的节点信息
-      await getExpandKeysByPid(values['pid'], unref(treeData));
-      //刷新列表(isUpdate:是否编辑;values:表单信息;expandedArr:展开的节点信息)
-      emit('success', { isUpdate: unref(isUpdate), values: { ...values }, expandedArr: unref(expandedRowKeys).reverse() });
-    } finally {
-      setModalProps({ confirmLoading: false });
-    }
-  }
-</script>

+ 0 - 286
src/views/vent/deviceManager/deviceCategory/index.vue

@@ -1,286 +0,0 @@
-<template>
-  <div class="device-manager-box">
-    <!--引用表格-->
-    <BasicTable
-      @register="registerTable"
-      :rowSelection="rowSelection"
-      :expandedRowKeys="expandedRowKeys"
-      @expand="handleExpand"
-      @fetch-success="onFetchSuccess"
-    >
-      <!--插槽:table标题-->
-      <template #tableTitle>
-        <a-button type="primary" preIcon="ant-design:plus-outlined" @click="handleCreate"> 新增</a-button>
-        <a-button type="primary" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
-        <j-upload-button type="primary" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
-        <a-dropdown v-if="selectedRowKeys.length > 0">
-          <template #overlay>
-            <a-menu>
-              <a-menu-item key="1" @click="batchHandleDelete">
-                <Icon icon="ant-design:delete-outlined" />
-                删除
-              </a-menu-item>
-            </a-menu>
-          </template>
-          <a-button
-            >批量操作
-            <Icon icon="ant-design:down-outlined" />
-          </a-button>
-        </a-dropdown>
-      </template>
-      <!--操作栏-->
-      <template #action="{ record }">
-        <TableAction :actions="getTableAction(record)" />
-      </template>
-    </BasicTable>
-    <!--字典弹窗-->
-    <CategoryModal @register="registerModal" @success="handleSuccess" />
-  </div>
-</template>
-
-<script lang="ts" name="system-category" setup>
-  //ts语法
-  import { ref, unref } from 'vue';
-  import { BasicTable, TableAction } from '/@/components/Table';
-  import CategoryModal from './components/CategoryModal.vue';
-  import { useModal } from '/@/components/Modal';
-  // import { useMethods } from '/@/hooks/system/useMethods';
-  import { columns, searchFormSchema } from './category.data';
-  import { list, deleteCategory, batchDeleteCategory, getExportUrl, getImportUrl, getChildList, getChildListBatch } from './category.api';
-  import { useListPage } from '/@/hooks/system/useListPage';
-  import { defHttp } from '/@/utils/http/axios';
-
-  const expandedRowKeys = ref([]);
-  // const { handleExportXls, handleImportXls } = useMethods();
-  //字典model
-  const [registerModal, { openModal }] = useModal();
-  // 列表页面公共参数、方法
-  const { prefixCls, onExportXls, onImportXls, tableContext } = useListPage({
-    designScope: 'category-template',
-    tableProps: {
-      title: '设备分类',
-      api: list,
-      columns: columns,
-      actionColumn: {
-        width: 180,
-      },
-      formConfig: {
-        schemas: searchFormSchema,
-      },
-    },
-    exportConfig: {
-      name: '设备分类列表',
-      url: getExportUrl,
-    },
-    importConfig: {
-      url: getImportUrl,
-    },
-  });
-
-  //注册table数据
-  const [registerTable, { reload, collapseAll, updateTableDataRecord, findTableDataRecord, getDataSource }, { rowSelection, selectedRowKeys }] =
-    tableContext;
-
-  /**
-   * 新增事件
-   */
-  function handleCreate() {
-    openModal(true, {
-      isUpdate: false,
-    });
-  }
-
-  /**
-   * 编辑事件
-   */
-  async function handleEdit(record) {
-    openModal(true, {
-      record,
-      isUpdate: true,
-    });
-  }
-
-  /**
-   * 详情
-   */
-  async function handleDetail(record) {
-    openModal(true, {
-      record,
-      isUpdate: true,
-      hideFooter: true,
-    });
-  }
-
-  /**
-   * 删除事件
-   */
-  async function handleDelete(record) {
-    await deleteCategory({ id: record.id }, importSuccess);
-  }
-
-  /**
-   * 批量删除事件
-   */
-  async function batchHandleDelete() {
-    const ids = selectedRowKeys.value.filter((item) => !item.includes('loading'));
-    await batchDeleteCategory({ ids: ids }, importSuccess);
-  }
-  /**
-   * 导入
-   */
-  function importSuccess() {
-    //update-begin---author:wangshuai ---date:20220530  for:[issues/54]树字典,勾选,然后批量删除,系统错误------------
-    (selectedRowKeys.value = []) && reload();
-    //update-end---author:wangshuai ---date:20220530  for:[issues/54]树字典,勾选,然后批量删除,系统错误--------------
-  }
-  /**
-   * 添加下级
-   */
-  function handleAddSub(record) {
-    openModal(true, {
-      record,
-      isUpdate: false,
-    });
-  }
-  /**
-   * 成功回调
-   */
-  async function handleSuccess({ isUpdate, values, expandedArr }) {
-    if (isUpdate) {
-      //编辑回调
-      updateTableDataRecord(values.id, values);
-    } else {
-      if (!values['pid']) {
-        //新增根节点
-        reload();
-      } else {
-        //新增子集
-        expandedRowKeys.value = [];
-        for (let key of unref(expandedArr)) {
-          await expandTreeNode(key);
-        }
-      }
-    }
-  }
-
-  /**
-   * 接口请求成功后回调
-   */
-  function onFetchSuccess(result) {
-    getDataByResult(result.items) && loadDataByExpandedRows();
-  }
-  /**
-   * 根据已展开的行查询数据(用于保存后刷新时异步加载子级的数据)
-   */
-  async function loadDataByExpandedRows() {
-    if (unref(expandedRowKeys).length > 0) {
-      const res = await getChildListBatch({ parentIds: unref(expandedRowKeys).join(',') });
-      if (res.success && res.result.records.length > 0) {
-        //已展开的数据批量子节点
-        let records = res.result.records;
-        const listMap = new Map();
-        for (let item of records) {
-          let pid = item['pid'];
-          if (unref(expandedRowKeys).includes(pid)) {
-            let mapList = listMap.get(pid);
-            if (mapList == null) {
-              mapList = [];
-            }
-            mapList.push(item);
-            listMap.set(pid, mapList);
-          }
-        }
-        let childrenMap = listMap;
-        let fn = (list) => {
-          if (list) {
-            list.forEach((data) => {
-              if (unref(expandedRowKeys).includes(data.id)) {
-                data.children = getDataByResult(childrenMap.get(data.id));
-                fn(data.children);
-              }
-            });
-          }
-        };
-        fn(getDataSource());
-      }
-    }
-  }
-  /**
-   * 处理数据集
-   */
-  function getDataByResult(result) {
-    if (result && result.length > 0) {
-      return result.map((item) => {
-        //判断是否标记了带有子节点
-        if (item['hasChild'] == '1') {
-          let loadChild = { id: item.id + '_loadChild', name: 'loading...', isLoading: true };
-          item.children = [loadChild];
-        }
-        return item;
-      });
-    }
-  }
-  /**
-   *树节点展开合并
-   * */
-  async function handleExpand(expanded, record) {
-    // 判断是否是展开状态,展开状态(expanded)并且存在子集(children)并且未加载过(isLoading)的就去查询子节点数据
-    if (expanded) {
-      expandedRowKeys.value.push(record.id);
-      if (record.children.length > 0 && !!record.children[0].isLoading) {
-        let result = await defHttp.get({ url: `/sys/dict/getDictItems/${record.devicekind + 'kind'}` }, {}); //defHttp.get({ url: `/sys/dict/getDictItems/${record.devicekind + 'kind'}` }, {})
-        if (result && result.length > 0) {
-          record.children = getDataByResult(result);
-        } else {
-          record.children = null;
-          record.hasChild = '0';
-        }
-      }
-    } else {
-      let keyIndex = expandedRowKeys.value.indexOf(record.id);
-      if (keyIndex >= 0) {
-        expandedRowKeys.value.splice(keyIndex, 1);
-      }
-    }
-  }
-  /**
-   *操作表格后处理树节点展开合并
-   * */
-  async function expandTreeNode(key) {
-    let record = findTableDataRecord(key);
-    expandedRowKeys.value.push(key);
-    let result = await getChildList({ pid: key });
-    if (result && result.length > 0) {
-      record.children = getDataByResult(result);
-    } else {
-      record.children = null;
-      record.hasChild = '0';
-    }
-    updateTableDataRecord(key, record);
-  }
-  /**
-   * 操作栏
-   */
-  function getTableAction(record) {
-    debugger;
-    return [
-      {
-        label: '编辑',
-        onClick: handleEdit.bind(null, record),
-      },
-      {
-        label: '删除',
-        popConfirm: {
-          title: '确定删除吗?',
-          confirm: handleDelete.bind(null, record),
-        },
-      },
-      {
-        label: '添加下级',
-        onClick: handleAddSub.bind(null, { pid: record.id }),
-      },
-    ];
-  }
-</script>
-
-<style scoped></style>

+ 29 - 32
src/views/vent/deviceManager/deviceTable/index.vue

@@ -19,24 +19,24 @@
 
 <script lang="ts" name="system-user" setup>
   //ts语法
-  import { ref, onMounted, unref } from 'vue'
+  import { ref, onMounted, unref } from 'vue';
   import NormalTable from '../comment/NormalTable.vue';
   import { list, deleteById, batchDeleteById, saveOrUpdate } from './device.api';
   import { list as substationList } from '../substationTabel/substation.api';
-  
+
   import { searchFormSchema } from './device.data';
   import { FormSchema } from '/@/components/Table';
   import { getFormSchemaColumns, getTableHeaderColumns } from '/@/hooks/web/useWebColumns';
   import { useRouter } from 'vue-router';
 
-  const { currentRoute } = useRouter()
+  const { currentRoute } = useRouter();
 
-  const formSchema = ref<FormSchema[]>([])
-  const isRefresh = ref(false)
+  const formSchema = ref<FormSchema[]>([]);
+  const isRefresh = ref(false);
 
-  const deviceType = ref('')
+  const deviceType = ref('');
 
-  const columns = ref<any[]>([])
+  const columns = ref<any[]>([]);
 
   const arrToFormColumns = (tableHeaderColumns = []) => {
     const columnList: any[] = [];
@@ -93,16 +93,16 @@
       }
       columnList.push(columnsItem);
     });
-    formSchema.value = columnList
+    formSchema.value = columnList;
     formSchema.value.unshift(
       {
         label: '设备id', //_dictText
         field: 'id',
         component: 'Input',
         componentProps: {
-          disabled: true
+          disabled: true,
         },
-      }, 
+      },
       {
         label: '点表',
         field: 'strtype',
@@ -113,33 +113,30 @@
           // stringToNumber: true,
         },
       }
-    )
-    formSchema.value.push(
-      {
-        label: '备用分站',
-        field: 'stationids',
-        component: 'ApiSelect',
-        componentProps: {
-          api: substationList,
-          labelField: 'strname',
-          valueField: 'id',
-        },
+    );
+    formSchema.value.push({
+      label: '备用分站',
+      field: 'stationids',
+      component: 'ApiSelect',
+      componentProps: {
+        api: substationList,
+        labelField: 'strname',
+        valueField: 'id',
       },
-    )
+    });
   };
 
   onMounted(() => {
-    const route = unref(currentRoute)
-    const pageType = route.name
-    deviceType.value = pageType
-    searchFormSchema[0].componentProps['dictCode'] =  `${deviceType.value}kind`
-    columns.value = getTableHeaderColumns(`${deviceType.value}_list`) || []
-    const formSchemaColumns = getFormSchemaColumns(`${deviceType.value}_edit`) || []
-    
-    arrToFormColumns(formSchemaColumns)
-    isRefresh.value = true
-  })
+    const route = unref(currentRoute);
+    const pageType = route.name;
+    deviceType.value = pageType;
+    searchFormSchema[0].componentProps['dictCode'] = `${deviceType.value}kind`;
+    columns.value = getTableHeaderColumns(`${deviceType.value}_list`) || [];
+    const formSchemaColumns = getFormSchemaColumns(`${deviceType.value}_edit`) || [];
 
+    arrToFormColumns(formSchemaColumns);
+    isRefresh.value = true;
+  });
 </script>
 
 <style scoped></style>

+ 1 - 1
src/views/vent/deviceManager/pointTabel/point.data.ts

@@ -236,7 +236,7 @@ export const formSchema: FormSchema[] = [
   },
   {
     label: '开始指令',
-    field: 'startcommand ',
+    field: 'startcommand',
     component: 'InputTextArea',
   },
   {

+ 1 - 1
src/views/vent/deviceManager/substationTabel/index.vue

@@ -20,7 +20,7 @@
       </template>
       <template #action="{ record }">
         <a
-          v-if="record['strtype'] == 'http' || record['strtype'] == 'kafka' || record['strtype'] == 'ftp'"
+          v-if="record['strtype'] == 'http' || record['strtype'] == 'kafka' || record['strtype'] == 'ftp' || record['strtype'] == 'database'"
           class="table-action-link"
           @click="addDevices(record)"
           >同步设备</a

+ 1 - 1
src/views/vent/home/colliery/components/fan-monitor.vue

@@ -13,7 +13,7 @@
         @change="changeSelect"
       />
       <div class="status-yx">
-        <template v-if="!isShowGif">
+        <template v-if="fjStatus !== '断开'">
           <div class="now-name">
             <i style="margin: 0px 5px 0px 5px">
               <SvgIcon class="icon" size="14" name="yxfj" />

+ 12 - 8
src/views/vent/home/colliery/components/main-monitor.vue

@@ -38,7 +38,8 @@
   import { ref, reactive, onMounted, nextTick, defineProps, watch } from 'vue';
   import { SvgIcon } from '/@/components/Icon';
   import * as echarts from 'echarts';
-
+  import { useGlobSetting } from '/@/hooks/setting';
+  const { sysOrgCode } = useGlobSetting();
   let props = defineProps({
     maindata: Array,
   });
@@ -50,7 +51,8 @@
     dataQ: 0,
     dataH: 0,
   });
-  let maxM3 = 400; // 高家梁是150,其他400
+  let maxM3 = ref(150); // 高家梁是150,其他400
+  let maxMPa = ref(4000); //
   //风机启动状态
   let runStatus = ref('');
   //获取dom节点
@@ -137,7 +139,7 @@
             color: '#ffffff',
             fontSize: 14, // 字体颜色
           },
-          data: ['风', '负压'],
+          data: ['风', '负压'],
         },
         tooltip: {
           backgroundColor: 'rgba(0,0,0,0.8)',
@@ -189,7 +191,7 @@
             },
             type: 'value',
             min: 0,
-            max: maxM3, // 高家梁最大9000,
+            max: maxM3.value, // 高家梁最大9000,
           },
           {
             name: '',
@@ -258,7 +260,7 @@
             },
             type: 'value',
             min: 0,
-            max: 4000,
+            max: maxMPa.value,
           },
         ],
         series: [
@@ -280,7 +282,7 @@
             data: echartData.ydata2,
           },
           {
-            name: '风',
+            name: '风',
             yAxisIndex: 0,
             xAxisIndex: 1,
             type: 'line',
@@ -326,13 +328,15 @@
     // 风压特性曲线2
     let data2 = [];
     let datax = [];
+    maxM3.value = Q1 < 100 ? 150 : Q1 < 200 ? 250 : Q1 < 300 ? 400 : Q1 < 400 ? 500 : Q1 < 600 ? 800 : 1000;
+    maxMPa.value = H1 < 2000 ? 4000 : H1 < 2500 ? 5000 : 6000;
 
-    for (let i = 30; i <= maxM3; i++) {
+    for (let i = 30; i <= maxM3.value; i++) {
       let x = i;
       let y4 = character.dataha0 * (x - q) * (x - q) + character.dataha1 * (x - q) + character.dataha2 + h;
       data2.push([x, y4]);
     }
-    for (let i = 0; i <= maxM3; i++) {
+    for (let i = 0; i <= maxM3.value; i++) {
       let x = i;
       let y = (H1 / Q1 / Q1) * x * x;
       data.push([x, y]);

+ 4 - 2
src/views/vent/home/colliery/index.vue

@@ -42,7 +42,9 @@
               </template>
             </div>
             <div class="three-modal" id="modalBox" style="position: relative">
-              <div class="btn-icon" @click="goModalDetail"></div>
+              <!-- <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" />
             </div>
           </div>
@@ -98,7 +100,7 @@
   import VentModal from '/@/components/vent/micro/ventModal.vue';
 
   const { currentRoute } = useRouter();
-  const { title, logoUrl } = useGlobSetting();
+  const { title, logoUrl, sysOrgCode } = useGlobSetting();
   const actions = getActions();
   let timer: NodeJS.Timeout | null = null;
   let fanLocalList = reactive<any[]>([]); //局部风机数据

+ 5 - 4
src/views/vent/monitorManager/chamberMonitor/chamber.threejs.base.ts

@@ -41,14 +41,14 @@ class ChamberBase {
     this.smoke.points.scale.set(55, 100, 55);
     this.smoke.points.position.set(272.432, 547.837, 1174.679);
 
-    // 喷粉
+    // // 喷粉
     this.smoke1 = new Smoke1('/model/img/texture-smoke.png', '#ffffff', 0.1);
     await this.smoke1.setPoints();
     this.group?.add(this.smoke1.points);
   }
 
   changeSmoke() {
-    this.smoke?.startSmoke(0);
+    // this.smoke?.startSmoke(0);
     this.smoke1?.startSmoke();
   }
 
@@ -61,8 +61,8 @@ class ChamberBase {
           // this.group.position.y += 40;
           resolve(null);
           this.addLight();
-          // await this.initSmoke();
-          // this.changeSmoke();
+          await this.initSmoke();
+          this.changeSmoke();
         }
       });
     });
@@ -70,6 +70,7 @@ class ChamberBase {
 
   destroy() {
     if (this.smoke) this.smoke.clearSmoke();
+    if (this.smoke1) this.smoke1.clearSmoke();
     this.model.clearGroup(this.group);
     this.model = null;
     this.group = null;

+ 13 - 8
src/views/vent/monitorManager/comment/HistoryTable.vue

@@ -38,9 +38,9 @@
       type: String,
       required: true,
     },
-    // deviceListApi: {
-    //   type: Function,
-    // },
+    deviceListApi: {
+      type: Function,
+    },
     deviceArr: {
       type: Array,
       // required: true,
@@ -164,11 +164,16 @@
     // if (props.deviceType.split('_')[1] && props.deviceType.split('_')[1] === 'history') return;
     let result;
     if (!props.sysId) {
-      const res = await deviceListApi({ devicekind: props.deviceType, pageSize: 10000 });
-      if (res['records'] && res['records'].length > 0) {
-        result = res['records'];
-      } else if (res['msgTxt'] && res['msgTxt'][0] && res['msgTxt'][0]['datalist']) {
-        result = res['msgTxt'][0]['datalist'];
+      if (props.deviceListApi) {
+        const res = await props.deviceListApi();
+        if (res['records'] && res['records'].length > 0) result = res['records'];
+      } else {
+        const res = await deviceListApi({ devicekind: props.deviceType, pageSize: 10000 });
+        if (res['records'] && res['records'].length > 0) {
+          result = res['records'];
+        } else if (res['msgTxt'] && res['msgTxt'][0] && res['msgTxt'][0]['datalist']) {
+          result = res['msgTxt'][0]['datalist'];
+        }
       }
     } else {
       if (globalConfig.History_Type == 'vent') {

+ 6 - 2
src/views/vent/monitorManager/comment/MonitorTable.vue

@@ -169,8 +169,12 @@
         showQuickJumper: false
       } : false,
       beforeFetch: (params) => {
-        if(props.deviceType?.startsWith('safetymonitor')){
-          return Object.assign(params, { filterParams: {'dataTypeName': params['dataTypeName'], strinstallpos: '*'+params['strinstallpos']+'*' } });
+        if(props.deviceType?.startsWith('safetymonitor')){ 
+          return Object.assign(params, { filterParams: {'dataTypeName': params['dataTypeName'], strinstallpos: '*'+params['strinstallpos']+'*'} });
+        }else if(props.deviceType?.startsWith('location')) {
+          return Object.assign(params, { filterParams: {strinstallpos: '*'+params['strinstallpos']+'*', userName: '*'+params['strname']+'*' } });
+        }else if(props.deviceType?.startsWith('vehicle')) {
+          return Object.assign(params, { filterParams: {strinstallpos: '*'+params['strinstallpos']+'*', vehicleName: '*'+params['strname']+'*' } });
         }else{
           return Object.assign(params, { column: 'createTime' });
         }

+ 614 - 600
src/views/vent/monitorManager/compressor/components/nitrogenHome_ln.vue

@@ -1,7 +1,10 @@
 <template>
   <div id="nitrogen3D" style="width: 100%; height: 100%; position: absolute; overflow: hidden"></div>
-  <div id="nitrogenCss3D" class="threejs-Object-CSS"
-    style="width: 100%; height: 100%; position: absolute; pointer-events: none; overflow: hidden; z-index: 2; top: 0px; left: 0px">
+  <div
+    id="nitrogenCss3D"
+    class="threejs-Object-CSS"
+    style="width: 100%; height: 100%; position: absolute; pointer-events: none; overflow: hidden; z-index: 2; top: 0px; left: 0px"
+  >
     <a-spin :spinning="loading" />
     <div v-for="groupNum in monitorDataGroupNum" :key="groupNum" class="modal-monitor">
       <fourBorderBg :class="`kyj${groupNum}`" :id="`nitrogenMonitor${groupNum}`">
@@ -9,9 +12,10 @@
         <template v-for="(preMonitor, preMonitorIndex) in preMonitorList" :key="preMonitorIndex">
           <div v-if="preMonitor.code !== 'signal'" class="monitor-item">
             <span class="monitor-title">{{ preMonitor.title }}:</span>
-            <span class="monitor-val"><span class="val">{{ monitorData[groupNum] ?
-      monitorData[groupNum][preMonitor.code] : '-' }}</span><span class="unit">{{ preMonitor.unit
-                }}</span></span>
+            <span class="monitor-val"
+              ><span class="val">{{ monitorData[groupNum] ? monitorData[groupNum][preMonitor.code] : '-' }}</span
+              ><span class="unit">{{ preMonitor.unit }}</span></span
+            >
           </div>
         </template>
       </fourBorderBg>
@@ -58,13 +62,15 @@
             <template #container>
               <div class="input-item" v-for="(preFan, index) in nitrogenMonitorData" :key="index">
                 <div class="title">{{ preFan.title }}</div>
-                <div v-if="preFan.unit !== 'signal'" class="value">{{ monitorData[0] ?
-      formatNum(Number(monitorData[0][preFan.code])) : '-' }}</div>
-                <div v-else :class="{
-      'signal-round': true,
-      'signal-round-warning': monitorData[0][preFan.code] == '1',
-      'signal-round-run': monitorData[0][preFan.code] == '0',
-    }"></div>
+                <div v-if="preFan.unit !== 'signal'" class="value">{{ monitorData[0] ? formatNum(Number(monitorData[0][preFan.code])) : '-' }}</div>
+                <div
+                  v-else
+                  :class="{
+                    'signal-round': true,
+                    'signal-round-warning': monitorData[0][preFan.code] == '1',
+                    'signal-round-run': monitorData[0][preFan.code] == '0',
+                  }"
+                ></div>
                 <div class="unit">{{ preFan.unit !== 'signal' ? `(${preFan.unit})` : '' }}</div>
               </div>
             </template>
@@ -78,16 +84,18 @@
                 <div class="monitor-box">
                   <div class="monitor-item">
                     <div class="state-item" v-for="(preFan, index) in preFanMonitorData" :key="index">
-                      <div class="state-title">{{ preFan.title + (preFan.unit !== 'signal' && preFan.unit !== '' ?
-      `(${preFan.unit})` : '') }}</div>
+                      <div class="state-title">{{ preFan.title + (preFan.unit !== 'signal' && preFan.unit !== '' ? `(${preFan.unit})` : '') }}</div>
                       <div v-if="preFan.unit !== 'signal'" class="state-val">{{
-      monitorData[groupNum] ? monitorData[groupNum][preFan.code] : '-'
-    }}</div>
-                      <div v-else :class="{
-        'signal-round': true,
-        'signal-round-warning': monitorData[groupNum][preFan.code] == '1',
-        'signal-round-run': monitorData[groupNum][preFan.code] == '0',
-      }"></div>
+                        monitorData[groupNum] ? monitorData[groupNum][preFan.code] : '-'
+                      }}</div>
+                      <div
+                        v-else
+                        :class="{
+                          'signal-round': true,
+                          'signal-round-warning': monitorData[groupNum][preFan.code] == '1',
+                          'signal-round-run': monitorData[groupNum][preFan.code] == '0',
+                        }"
+                      ></div>
                     </div>
                   </div>
                 </div>
@@ -102,8 +110,15 @@
               <div>设备实时监测曲线</div>
             </template>
             <template #container>
-              <BarAndLine v-if="chartsColumns.length > 0" xAxisPropType="readTime" :dataSource="echartData"
-                height="340px" :chartsColumns="chartsColumns" chartsType="listMonitor" :option="echatsOption" />
+              <BarAndLine
+                v-if="chartsColumns.length > 0"
+                xAxisPropType="readTime"
+                :dataSource="echartData"
+                height="340px"
+                :chartsColumns="chartsColumns"
+                chartsType="listMonitor"
+                :option="echatsOption"
+              />
             </template>
           </ventBox1>
           <div ref="playerRef" style="height: auto; width: 100%; margin-top: 10px"></div>
@@ -113,708 +128,707 @@
   </div>
 </template>
 <script lang="ts" setup name="nitrogenHome">
-import { onMounted, onUnmounted, ref, watch, reactive, defineProps, nextTick, inject } from 'vue';
-import ventBox1 from '/@/components/vent/ventBox1.vue';
-import fourBorderBg from '../../../comment/components/fourBorderBg.vue';
-import { mountedThree, destroy, setModelType } from '../nitrogen.threejs';
-import { getDevice } from '../nitrogen.api';
-import BarAndLine from '/@/components/chart/BarAndLine.vue';
-import { deviceControlApi } from '/@/api/vent/index';
-import { preMonitorList, preFanMonitorData, nitrogenMonitorData } from '../nitrogen.data.ln';
-import { formatNum } from '/@/utils/ventutil';
-import { useCamera } from '/@/hooks/system/useCamera';
-import { message } from 'ant-design-vue';
-import lodash from 'lodash';
-
-const globalConfig = inject('globalConfig');
-
-const props = defineProps({
-  deviceId: {
-    type: String,
-    require: true,
-  },
-  modalType: {
-    type: String,
-    require: true,
-  },
-});
-const playerRef = ref();
-const refresh = ref(false);
-const modalTitle = ref(''); // 模态框标题显示内容,根据设备操作类型决定
-const modalType = ref(''); // 模态框内容显示类型,设备操作类型
-const modalIsShow = ref<boolean>(false); // 是否显示模态框
-const loading = ref(true);
-let kzParam = reactive<any>({
-  data: {},
-  isFw: null,
-});
-
-// const kyjs = ['1号空压机', '1号空压机', '1号空压机', '1号空压机'];
-const flvURL1 = () => {
-  // return `https://sf1-hscdn-tos.pstatp.com/obj/media-fe/xgplayer_doc_video/flv/xgplayer-demo-360p.flv`;
-  return '';
-};
-const colors = ['#FDB146', '#EE6666', '#9BCB75', '#03C2EC', '#DA3914', '#9C83D9'];
-const echatsOption = {
-  grid: {
-    top: '35%',
-    left: '15%',
-    right: '20px',
-    bottom: '8%',
-    // containLabel: true
-  },
-  toolbox: {
-    feature: {},
-  },
-};
-
-const monitorDataGroupNum = ref(0);
-const statusKyj = ref(''); //空压机工作状态
-const statusZdj = ref(''); //制氮机远近程状态
-
-let airCompressorState = reactive<any[]>([]);
-
-const chartsColumns = ref([
-  {
-    legend: '氮气流量',
-    seriesName: '(m³/h)',
-    ymax: 1000,
-    yname: 'm³/h',
-    linetype: 'line',
-    yaxispos: 'left',
-    color: '#FDB146',
-    sort: 1,
-    xRotate: 0,
-    dataIndex: 'nitrogen_flow_rate',
-  },
-]);
-const { getCamera, webRtcServer } = useCamera();
-
-const monitorData = reactive<any[]>([]);
-
-//图表数据
-let echartData = ref<any>([]);
-
-// https获取监测数据
-let timer: null | NodeJS.Timeout = null;
-async function getMonitor(flag?) {
-  if (Object.prototype.toString.call(timer) === '[object Null]') {
-    timer = await setTimeout(
-      async () => {
-        if (props.deviceId) {
-          await getDataSource(props.deviceId);
+  import { onMounted, onUnmounted, ref, watch, reactive, defineProps, nextTick, inject } from 'vue';
+  import ventBox1 from '/@/components/vent/ventBox1.vue';
+  import fourBorderBg from '../../../comment/components/fourBorderBg.vue';
+  import { mountedThree, destroy, setModelType } from '../nitrogen.threejs';
+  import { getDevice } from '../nitrogen.api';
+  import BarAndLine from '/@/components/chart/BarAndLine.vue';
+  import { deviceControlApi } from '/@/api/vent/index';
+  import { preMonitorList, preFanMonitorData, nitrogenMonitorData } from '../nitrogen.data.ln';
+  import { formatNum } from '/@/utils/ventutil';
+  import { useCamera } from '/@/hooks/system/useCamera';
+  import { message } from 'ant-design-vue';
+  import lodash from 'lodash';
+
+  const globalConfig = inject('globalConfig');
+
+  const props = defineProps({
+    deviceId: {
+      type: String,
+      require: true,
+    },
+    modalType: {
+      type: String,
+      require: true,
+    },
+  });
+  const playerRef = ref();
+  const refresh = ref(false);
+  const modalTitle = ref(''); // 模态框标题显示内容,根据设备操作类型决定
+  const modalType = ref(''); // 模态框内容显示类型,设备操作类型
+  const modalIsShow = ref<boolean>(false); // 是否显示模态框
+  const loading = ref(true);
+  let kzParam = reactive<any>({
+    data: {},
+    isFw: null,
+  });
+
+  // const kyjs = ['1号空压机', '1号空压机', '1号空压机', '1号空压机'];
+  const flvURL1 = () => {
+    // return `https://sf1-hscdn-tos.pstatp.com/obj/media-fe/xgplayer_doc_video/flv/xgplayer-demo-360p.flv`;
+    return '';
+  };
+  const colors = ['#FDB146', '#EE6666', '#9BCB75', '#03C2EC', '#DA3914', '#9C83D9'];
+  const echatsOption = {
+    grid: {
+      top: '35%',
+      left: '15%',
+      right: '20px',
+      bottom: '8%',
+      // containLabel: true
+    },
+    toolbox: {
+      feature: {},
+    },
+  };
+
+  const monitorDataGroupNum = ref(0);
+  const statusKyj = ref(''); //空压机工作状态
+  const statusZdj = ref(''); //制氮机远近程状态
+
+  let airCompressorState = reactive<any[]>([]);
+
+  const chartsColumns = ref([
+    {
+      legend: '氮气流量',
+      seriesName: '(m³/h)',
+      ymax: 1000,
+      yname: 'm³/h',
+      linetype: 'line',
+      yaxispos: 'left',
+      color: '#FDB146',
+      sort: 1,
+      xRotate: 0,
+      dataIndex: 'nitrogen_flow_rate',
+    },
+  ]);
+  const { getCamera, webRtcServer } = useCamera();
+
+  const monitorData = reactive<any[]>([]);
+
+  //图表数据
+  let echartData = ref<any>([]);
+
+  // https获取监测数据
+  let timer: null | NodeJS.Timeout = null;
+  async function getMonitor(flag?) {
+    if (Object.prototype.toString.call(timer) === '[object Null]') {
+      timer = await setTimeout(
+        async () => {
+          if (props.deviceId) {
+            await getDataSource(props.deviceId);
+          }
+          if (timer) {
+            timer = null;
+          }
+          await getMonitor();
+        },
+        flag ? 0 : 3000
+      );
+    }
+  }
+
+  async function getDataSource(systemID) {
+    const res = await getDevice({ devicetype: 'sys', systemID, type: 'all' });
+    if (res) {
+      const result = res;
+      if (!result || result.msgTxt.length < 1) return;
+      airCompressorState.length = 0;
+      monitorData.length = 0;
+      result.msgTxt.forEach((item) => {
+        if (item.type && item.type.startsWith('nitrogen_auto')) {
+          monitorData.splice(0, 0, { ...item['datalist'][0], ...item['datalist'][0].readData });
+        } else if (item.type && item.type.startsWith('nitrogen_air_compressor')) {
+          monitorData.push({ ...item['datalist'][0], ...item['datalist'][0].readData });
         }
-        if (timer) {
-          timer = null;
+        statusKyj.value = monitorData[1] ? monitorData[1]['operation_shutdown'] : '';
+        statusZdj.value = monitorData[0] ? monitorData[0]['remote_local'] : '';
+        monitorDataGroupNum.value = monitorData.length - 1;
+        airCompressorState.push({
+          id: monitorData[1] ? monitorData[1]['deviceID'] : '',
+          deviceType: monitorData[1] ? monitorData[1]['deviceType'] : '',
+        });
+        const airCompressor = { readTime: monitorData[0]['readTime'].substring(11) };
+        const dataArr = lodash.cloneDeep(echartData.value);
+        //图表数据
+        if (dataArr.length <= 5) {
+          airCompressor[`nitrogen_flow_rate`] = monitorData[0]['nitrogen_flow_rate'] || 0;
+          dataArr.push(airCompressor);
+        } else {
+          dataArr.shift();
+          dataArr.push(airCompressor);
         }
-        await getMonitor();
-      },
-      flag ? 0 : 3000
-    );
-  }
-}
-
-async function getDataSource(systemID) {
-  const res = await getDevice({ devicetype: 'sys', systemID, type: 'all' });
-  if (res) {
-    const result = res;
-    if (!result || result.msgTxt.length < 1) return;
-    airCompressorState.length = 0;
-    monitorData.length = 0
-    result.msgTxt.forEach((item) => {
-      if (item.type && item.type.startsWith('nitrogen_auto')) {
-        monitorData.splice(0, 0, { ...item['datalist'][0], ...item['datalist'][0].readData });
-      } else if (item.type && item.type.startsWith('nitrogen_air_compressor')) {
-        monitorData.push({ ...item['datalist'][0], ...item['datalist'][0].readData });
-      }
-      statusKyj.value = monitorData[1] ? monitorData[1]['operation_shutdown'] : '';
-      statusZdj.value = monitorData[0] ? monitorData[0]['remote_local'] : '';
-      monitorDataGroupNum.value = monitorData.length - 1;
-      airCompressorState.push({
-        id: monitorData[1] ? monitorData[1]['deviceID'] : '',
-        deviceType: monitorData[1] ? monitorData[1]['deviceType'] : '',
+        echartData.value = dataArr;
       });
-      const airCompressor = { readTime: monitorData[0]['readTime'].substring(11) };
-      const dataArr = lodash.cloneDeep(echartData.value);
-      //图表数据
-      if (dataArr.length <= 5) {
-        airCompressor[`nitrogen_flow_rate`] = monitorData[0]['nitrogen_flow_rate'] || 0;
-        dataArr.push(airCompressor);
-      } else {
-        dataArr.shift();
-        dataArr.push(airCompressor);
-      }
-      echartData.value = dataArr;
+      refresh.value = true;
+      nextTick(() => {
+        refresh.value = false;
+      });
+    }
+  }
 
-    });
-    refresh.value = true;
-    nextTick(() => {
-      refresh.value = false;
-    });
+  function handlerDevice(data, bol) {
+    kzParam.data = data;
+    kzParam.isFw = bol;
+    if (bol == '制氮机启动' || bol == '空压机启动') {
+      modalTitle.value = bol;
+      modalType.value = '1';
+      modalIsShow.value = true;
+      kzParam.data.start = true;
+      kzParam.data.stop = false;
+    } else {
+      modalTitle.value = bol;
+      modalType.value = '2';
+      modalIsShow.value = true;
+      kzParam.data.start = false;
+      kzParam.data.stop = true;
+    }
   }
-}
-
-function handlerDevice(data, bol) {
-  kzParam.data = data;
-  kzParam.isFw = bol;
-  if (bol == '制氮机启动' || bol == '空压机启动') {
-    modalTitle.value = bol;
-    modalType.value = '1';
-    modalIsShow.value = true;
-    kzParam.data.start = true;
-    kzParam.data.stop = false;
-  } else {
-    modalTitle.value = bol;
-    modalType.value = '2';
-    modalIsShow.value = true;
-    kzParam.data.start = false;
-    kzParam.data.stop = true;
+  function handleOK(passWord, handlerState) {
+    console.log(kzParam, 'kz----------');
+    // if (passWord !== '123456') {
+    //   message.warning('密码不正确,请重新输入');
+    //   return;
+    // }
+
+    let data = {};
+    if (kzParam.isFw == '制氮机启动' || kzParam.isFw == '空压机启动') {
+      data = {
+        deviceid: kzParam.data.id,
+        devicetype: kzParam.data.deviceType,
+        password: passWord,
+        start: kzParam.data.start,
+      };
+    } else {
+      data = {
+        deviceid: kzParam.data.id,
+        password: passWord,
+        devicetype: kzParam.data.deviceType,
+        stop: kzParam.data.stop,
+      };
+    }
+
+    deviceControlApi(data).then((res) => {
+      // 模拟时开启
+      if (res.success) {
+        modalIsShow.value = false;
+        getDataSource(props.deviceId);
+        if (globalConfig.History_Type == 'remote') {
+          message.success('指令已下发至生产管控平台成功!');
+        } else {
+          message.success('指令已下发成功!');
+        }
+      }
+    });
   }
-}
-function handleOK(passWord, handlerState) {
-  console.log(kzParam, 'kz----------');
-  // if (passWord !== '123456') {
-  //   message.warning('密码不正确,请重新输入');
-  //   return;
-  // }
-
-  let data = {};
-  if (kzParam.isFw == '制氮机启动' || kzParam.isFw == '空压机启动') {
-    data = {
-      deviceid: kzParam.data.id,
-      devicetype: kzParam.data.deviceType,
-      password: passWord,
-      start: kzParam.data.start,
-    };
-  } else {
-    data = {
-      deviceid: kzParam.data.id,
-      password: passWord,
-      devicetype: kzParam.data.deviceType,
-      stop: kzParam.data.stop,
-    };
+  function handleCancel() {
+    modalIsShow.value = false;
+    modalTitle.value = '';
+    modalType.value = '';
   }
 
-  deviceControlApi(data).then((res) => {
-    // 模拟时开启
-    if (res.success) {
-      modalIsShow.value = false;
-      getDataSource(props.deviceId);
-      if (globalConfig.History_Type == 'remote') {
-        message.success('指令已下发至生产管控平台成功!');
-      } else {
-        message.success('指令已下发成功!');
+  watch([monitorDataGroupNum, loading], ([newMonitorDataGroupNum, newLoading]) => {
+    nextTick(() => {
+      if (newMonitorDataGroupNum && !newLoading) {
+        setModelType(props.modalType, newMonitorDataGroupNum);
       }
-    }
+    });
   });
-}
-function handleCancel() {
-  modalIsShow.value = false;
-  modalTitle.value = '';
-  modalType.value = '';
-}
-
-watch([monitorDataGroupNum, loading], ([newMonitorDataGroupNum, newLoading]) => {
-  nextTick(() => {
-    if (newMonitorDataGroupNum && !newLoading) {
-      setModelType(props.modalType, newMonitorDataGroupNum);
-    }
+
+  onMounted(async () => {
+    await getMonitor(true);
+    await mountedThree().then(() => {
+      loading.value = false;
+    });
+    await getCamera(props.deviceId, playerRef.value);
   });
-});
 
-onMounted(async () => {
-  await getMonitor(true);
-  await mountedThree().then(() => {
-    loading.value = false;
+  onUnmounted(() => {
+    destroy();
+    if (webRtcServer.length > 0) {
+      webRtcServer.forEach((item) => {
+        item.disconnect();
+      });
+    }
+    if (timer) {
+      clearTimeout(timer);
+      timer = undefined;
+    }
   });
-  await getCamera(props.deviceId, playerRef.value);
-});
-
-onUnmounted(() => {
-  destroy();
-  if (webRtcServer.length > 0) {
-    webRtcServer.forEach((item) => {
-      item.disconnect();
-    });
-  }
-  if (timer) {
-    clearTimeout(timer);
-    timer = undefined;
-  }
-});
 </script>
 
 <style lang="less" scoped>
-@ventSpace: zxm;
-
-.nitrogen-box {
-  width: 100%;
-  height: 100%;
-  display: flex;
-  justify-content: center;
-}
-
-#nitrogenCss3D {
-  .modal-monitor {
-    width: 200px;
-    position: absolute;
-    left: 0px;
-    top: 0px;
-  }
+  @ventSpace: zxm;
 
-  &:deep(.win) {
-    margin: 0 !important;
-    background: #00000044;
-  }
-}
-
-.nitrogen-home {
-  width: 100%;
-  height: 100%;
-  position: fixed;
-  z-index: 9999;
-  display: flex;
-  flex-direction: column;
-  justify-content: center;
-  align-items: center;
-  pointer-events: none;
-  top: 20px;
-
-  .nitrogen-container {
+  .nitrogen-box {
     width: 100%;
-    height: calc(100% - 100px);
+    height: 100%;
     display: flex;
-    justify-content: space-between;
-    margin-bottom: 100px;
+    justify-content: center;
+  }
 
-    .device-state {
-      width: 100%;
+  #nitrogenCss3D {
+    .modal-monitor {
+      width: 200px;
       position: absolute;
-      top: 20px;
-      color: #e90000;
-      display: flex;
-      justify-content: center;
-      font-size: 20px;
+      left: 0px;
+      top: 0px;
+    }
+
+    &:deep(.win) {
+      margin: 0 !important;
+      background: #00000044;
     }
+  }
+
+  .nitrogen-home {
+    width: 100%;
+    height: 100%;
+    position: fixed;
+    z-index: 9999;
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+    align-items: center;
+    pointer-events: none;
+    top: 20px;
 
-    .top-box {
+    .nitrogen-container {
       width: 100%;
-      padding: 10px;
-      overflow: hidden;
+      height: calc(100% - 100px);
       display: flex;
       justify-content: space-between;
-      // margin-top: 40px;
+      margin-bottom: 100px;
 
-      .center-item-box {
+      .device-state {
+        width: 100%;
         position: absolute;
-        left: 50%;
-        top: 50px;
-        transform: translate(-48%, 0);
-        width: calc(100% - 720px);
-        height: 50px;
+        top: 20px;
+        color: #e90000;
         display: flex;
-        align-items: center;
-        pointer-events: auto;
+        justify-content: center;
+        font-size: 20px;
+      }
 
-        .top-left {
+      .top-box {
+        width: 100%;
+        padding: 10px;
+        overflow: hidden;
+        display: flex;
+        justify-content: space-between;
+        // margin-top: 40px;
+
+        .center-item-box {
+          position: absolute;
+          left: 50%;
+          top: 50px;
+          transform: translate(-48%, 0);
+          width: calc(100% - 720px);
+          height: 50px;
           display: flex;
-          width: 40%;
-          color: #fff;
+          align-items: center;
+          pointer-events: auto;
 
-          .button-box {
-            position: relative;
-            width: auto;
-            height: 32px;
+          .top-left {
             display: flex;
-            align-items: center;
-            justify-content: center;
-            border-radius: 5px;
+            width: 40%;
             color: #fff;
-            padding: 10px 15px;
-            margin: 0px 10px;
-            box-sizing: border-box;
-            cursor: pointer;
-            background: linear-gradient(#1fa6cb, #127cb5);
-
-            &:hover {
-              background: linear-gradient(#1fa6cbcc, #127cb5cc);
+
+            .button-box {
+              position: relative;
+              width: auto;
+              height: 32px;
+              display: flex;
+              align-items: center;
+              justify-content: center;
+              border-radius: 5px;
+              color: #fff;
+              padding: 10px 15px;
+              margin: 0px 10px;
+              box-sizing: border-box;
+              cursor: pointer;
+              background: linear-gradient(#1fa6cb, #127cb5);
+
+              &:hover {
+                background: linear-gradient(#1fa6cbcc, #127cb5cc);
+              }
             }
           }
-        }
 
-        .top-center {
-          display: flex;
-          //   flex: 1;
-          width: 15%;
-          justify-content: center;
-          align-items: center;
-          font-size: 20px;
-          color: #fff;
+          .top-center {
+            display: flex;
+            //   flex: 1;
+            width: 15%;
+            justify-content: center;
+            align-items: center;
+            font-size: 20px;
+            color: #fff;
 
-          .top-c-label {
-            color: yellow;
+            .top-c-label {
+              color: yellow;
+            }
           }
-        }
-
-        .top-right {
-          display: flex;
-          //   flex: 2;
-          width: 45%;
-          justify-content: right;
-          align-items: center;
-          color: #fff;
 
-          .control-type {
+          .top-right {
             display: flex;
+            //   flex: 2;
+            width: 45%;
+            justify-content: right;
+            align-items: center;
             color: #fff;
 
-            .control-title {
-              color: #73e8fe;
+            .control-type {
+              display: flex;
+              color: #fff;
+
+              .control-title {
+                color: #73e8fe;
+              }
             }
           }
         }
-      }
-
-      .lr-box {
-        height: 100%;
-        display: flex;
-        flex-direction: column;
-        position: relative;
-        // overflow: hidden;
-        z-index: 9999;
-        pointer-events: auto;
-        overflow-y: auto;
-        overflow-x: hidden;
-        height: calc(100% - 70px);
-      }
 
-      .item {
-        width: 305px;
-        height: auto;
-        position: relative;
-        border-radius: 5px;
-        margin-top: 10px;
-        margin-bottom: 0px;
-        pointer-events: auto;
-        color: #fff;
-        // overflow: hidden;
-
-        &:first-child {
-          margin-top: 0px;
+        .lr-box {
+          height: 100%;
+          display: flex;
+          flex-direction: column;
+          position: relative;
+          // overflow: hidden;
+          z-index: 9999;
+          pointer-events: auto;
+          overflow-y: auto;
+          overflow-x: hidden;
+          height: calc(100% - 70px);
         }
 
-        .base-title {
-          color: #fff;
-          margin-bottom: 8px;
-          padding-left: 10px;
+        .item {
+          width: 305px;
+          height: auto;
           position: relative;
-          font-size: 16px;
-
-          &::after {
-            content: '';
-            position: absolute;
-            display: block;
-            width: 4px;
-            height: 12px;
-            top: 7px;
-            left: 0px;
-            background: #45d3fd;
-            border-radius: 4px;
-          }
-        }
+          border-radius: 5px;
+          margin-top: 10px;
+          margin-bottom: 0px;
+          pointer-events: auto;
+          color: #fff;
+          // overflow: hidden;
 
-        .monitor-item {
-          width: 100%;
-          display: flex;
-          flex-direction: row;
-          flex-wrap: wrap;
+          &:first-child {
+            margin-top: 0px;
+          }
 
-          .state-item {
-            width: 50%;
-            padding: 5px;
-            display: flex;
-            align-items: center;
-            justify-content: space-between;
+          .base-title {
+            color: #fff;
+            margin-bottom: 8px;
+            padding-left: 10px;
+            position: relative;
+            font-size: 16px;
 
-            .state-title {
-              width: 100px;
-              color: #ffffffdd;
-              flex: 9;
-              font-size: 14px;
+            &::after {
+              content: '';
+              position: absolute;
+              display: block;
+              width: 4px;
+              height: 12px;
+              top: 7px;
+              left: 0px;
+              background: #45d3fd;
+              border-radius: 4px;
+            }
+          }
 
-              .unit {
-                // color: #ffffffbb;
+          .monitor-item {
+            width: 100%;
+            display: flex;
+            flex-direction: row;
+            flex-wrap: wrap;
+
+            .state-item {
+              width: 50%;
+              padding: 5px;
+              display: flex;
+              align-items: center;
+              justify-content: space-between;
+
+              .state-title {
+                width: 100px;
+                color: #ffffffdd;
+                flex: 9;
+                font-size: 14px;
+
+                .unit {
+                  // color: #ffffffbb;
+                }
               }
-            }
 
-            .state-val {
-              flex: 1;
-              color: #e4a300;
-              margin-right: 5px;
-              text-align: right;
-              font-size: 14px;
+              .state-val {
+                flex: 1;
+                color: #e4a300;
+                margin-right: 5px;
+                text-align: right;
+                font-size: 14px;
+              }
             }
           }
-        }
 
-        .signal-box {
-          margin: 5px 0;
-          display: flex;
-          align-items: center;
+          .signal-box {
+            margin: 5px 0;
+            display: flex;
+            align-items: center;
 
-          .signal-title {
-            color: #7af5ff;
-            margin: 0 5px;
-          }
+            .signal-title {
+              color: #7af5ff;
+              margin: 0 5px;
+            }
 
-          &:last-child {
-            margin-right: 0px;
+            &:last-child {
+              margin-right: 0px;
+            }
           }
-        }
 
-        .list-item {
-          padding: 0 10px;
-          display: flex;
-          justify-content: space-between;
-          align-items: center;
+          .list-item {
+            padding: 0 10px;
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
 
-          .item-data-key {
-            color: #ffffff99;
+            .item-data-key {
+              color: #ffffff99;
+            }
           }
-        }
 
-        .item-data-box {
-          color: #fff;
+          .item-data-box {
+            color: #fff;
 
-          .state-icon {
-            display: inline-block;
-            width: 12px;
-            height: 12px;
-            border-radius: 12px;
-          }
+            .state-icon {
+              display: inline-block;
+              width: 12px;
+              height: 12px;
+              border-radius: 12px;
+            }
 
-          .open {
-            border: 5px solid #133a56;
-            background: #4ecb73;
-          }
+            .open {
+              border: 5px solid #133a56;
+              background: #4ecb73;
+            }
 
-          .close {
-            border: 5px solid #192961;
-            background: #6d7898;
+            .close {
+              border: 5px solid #192961;
+              background: #6d7898;
+            }
           }
         }
-      }
-
-      .item-l {
-        width: 100%;
 
-        .monitor-box {
+        .item-l {
           width: 100%;
 
-          .parameter-title {
-            position: relative;
+          .monitor-box {
             width: 100%;
-            height: 14px;
-            margin-top: 10px;
 
-            .icon,
-            span {
-              position: absolute;
-              top: -10px;
+            .parameter-title {
+              position: relative;
+              width: 100%;
+              height: 14px;
+              margin-top: 10px;
+
+              .icon,
+              span {
+                position: absolute;
+                top: -10px;
+              }
             }
-          }
 
-          .group-parameter-title {
-            background-image: linear-gradient(to right, #39a3ff50, #39a3ff00);
+            .group-parameter-title {
+              background-image: linear-gradient(to right, #39a3ff50, #39a3ff00);
 
-            .icon {
-              left: -12px;
-              top: -17px;
-            }
+              .icon {
+                left: -12px;
+                top: -17px;
+              }
 
-            span {
-              left: 18px;
-            }
+              span {
+                left: 18px;
+              }
 
-            .item-col {
-              background-image: linear-gradient(to right, #39a3ff00, #39a3ff10);
+              .item-col {
+                background-image: linear-gradient(to right, #39a3ff00, #39a3ff10);
+              }
             }
-          }
 
-          .device-parameter-title {
-            background-image: linear-gradient(to right, #3df6ff40, #3df6ff00);
+            .device-parameter-title {
+              background-image: linear-gradient(to right, #3df6ff40, #3df6ff00);
 
-            .icon {
-              left: -10px;
-              top: -14px;
-            }
+              .icon {
+                left: -10px;
+                top: -14px;
+              }
 
-            span {
-              left: 18px;
-            }
+              span {
+                left: 18px;
+              }
 
-            .item-col {
-              background-image: linear-gradient(to right, #3df6ff10, #3df6ff00);
+              .item-col {
+                background-image: linear-gradient(to right, #3df6ff10, #3df6ff00);
+              }
             }
           }
         }
-      }
 
-      .right-box {
-        width: 300px;
-        margin-top: 50px;
-      }
+        .right-box {
+          width: 300px;
+          margin-top: 50px;
+        }
 
-      .left-box {
-        width: 335px;
-        margin-top: 80px;
+        .left-box {
+          width: 335px;
+          margin-top: 80px;
 
-        .input-item {
-          display: flex;
-          justify-content: space-between;
-          align-items: center;
-          padding: 4px 8px;
-          margin: 6px 0;
-          background-image: linear-gradient(to right, #39deff15, #3977e500);
+          .input-item {
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+            padding: 4px 8px;
+            margin: 6px 0;
+            background-image: linear-gradient(to right, #39deff15, #3977e500);
 
-          .title {
-            width: 200px;
-          }
+            .title {
+              width: 200px;
+            }
 
-          .title-auto {
-            width: auto;
-          }
+            .title-auto {
+              width: auto;
+            }
 
-          .input-value {
-            width: 80px;
-            height: 28px;
-            line-height: 28px !important;
-            background: transparent !important;
-            border-color: #228da2 !important;
-            color: #fff !important;
-          }
+            .input-value {
+              width: 80px;
+              height: 28px;
+              line-height: 28px !important;
+              background: transparent !important;
+              border-color: #228da2 !important;
+              color: #fff !important;
+            }
 
-          .value {
-            width: 100px;
-            color: #00d8ff;
-            padding-right: 20px;
-          }
+            .value {
+              width: 100px;
+              color: #00d8ff;
+              padding-right: 20px;
+            }
 
-          .unit {
-            width: 80px;
+            .unit {
+              width: 80px;
+            }
           }
         }
       }
-    }
 
-    &:deep(.win) {
-      width: 100%;
-      margin: 0 !important;
+      &:deep(.win) {
+        width: 100%;
+        margin: 0 !important;
+      }
     }
   }
-}
-
-&:deep(.main) {
-  .title {
-    height: 34px;
-    text-align: center;
-    font-weight: 600;
-    color: #7af5ff;
-    // background-image: url('../../../assets/img/yfj/light.png');
-    background-repeat: no-repeat;
-    background-position-x: center;
-    background-position-y: 100%;
-    background-size: 80%;
-    font-size: 16px;
-  }
 
-  .monitor-item {
-    width: 200px;
-    display: flex;
-    flex-direction: row;
-    width: auto;
-    margin-bottom: 3px;
+  &:deep(.main) {
+    .title {
+      height: 34px;
+      text-align: center;
+      font-weight: 600;
+      color: #7af5ff;
+      // background-image: url('../../../assets/img/yfj/light.png');
+      background-repeat: no-repeat;
+      background-position-x: center;
+      background-position-y: 100%;
+      background-size: 80%;
+      font-size: 16px;
+    }
 
-    .monitor-val {
-      color: #ffb700;
+    .monitor-item {
+      width: 200px;
       display: flex;
+      flex-direction: row;
       width: auto;
+      margin-bottom: 3px;
 
-      .val {
-        width: 80px;
-        font-size: 14px;
-      }
+      .monitor-val {
+        color: #ffb700;
+        display: flex;
+        width: auto;
 
-      .unit {
-        color: #ffffffbb;
-        font-size: 14px;
+        .val {
+          width: 80px;
+          font-size: 14px;
+        }
+
+        .unit {
+          color: #ffffffbb;
+          font-size: 14px;
+        }
       }
     }
-  }
 
-  .monitor-title {
-    // width: 100px;
-    width: 125px;
-    color: #7af5ff;
-    font-weight: 400;
-    font-size: 14px;
-  }
+    .monitor-title {
+      // width: 100px;
+      width: 125px;
+      color: #7af5ff;
+      font-weight: 400;
+      font-size: 14px;
+    }
 
-  .signal-item {
-    display: flex;
-    justify-content: space-between;
-
-    // margin-bottom: 5px;
-    .signal-round {
-      display: inline-block;
-      width: 8px;
-      height: 8px;
-      border-radius: 50%;
-      margin: 0 10px;
-      position: relative;
-
-      &::after {
-        display: block;
-        content: '';
-        position: absolute;
-        width: 12px;
-        height: 12px;
-        top: -2px;
-        left: -2px;
+    .signal-item {
+      display: flex;
+      justify-content: space-between;
+
+      // margin-bottom: 5px;
+      .signal-round {
+        display: inline-block;
+        width: 8px;
+        height: 8px;
         border-radius: 50%;
+        margin: 0 10px;
+        position: relative;
+
+        &::after {
+          display: block;
+          content: '';
+          position: absolute;
+          width: 12px;
+          height: 12px;
+          top: -2px;
+          left: -2px;
+          border-radius: 50%;
+        }
       }
-    }
 
-    .signal-round-gry {
-      background-color: #858585;
+      .signal-round-gry {
+        background-color: #858585;
 
-      &::after {
-        background-color: #85858544;
-        box-shadow: 0 0 1px 1px #85858599;
+        &::after {
+          background-color: #85858544;
+          box-shadow: 0 0 1px 1px #85858599;
+        }
       }
-    }
 
-    .signal-round-run {
-      background-color: #67fc00;
+      .signal-round-run {
+        background-color: #67fc00;
 
-      &::after {
-        background-color: #67fc0044;
-        box-shadow: 0 0 1px 1px #c6ff77;
+        &::after {
+          background-color: #67fc0044;
+          box-shadow: 0 0 1px 1px #c6ff77;
+        }
       }
-    }
 
-    .signal-round-warning {
-      background-color: #e9170b;
+      .signal-round-warning {
+        background-color: #e9170b;
 
-      &::after {
-        background-color: #e9170b44;
-        box-shadow: 0 0 1px 1px #e9170b;
+        &::after {
+          background-color: #e9170b44;
+          box-shadow: 0 0 1px 1px #e9170b;
+        }
       }
     }
   }
-}
 
-:deep(.zxm-radio-wrapper) {
-  color: #fff !important;
-}
+  :deep(.zxm-radio-wrapper) {
+    color: #fff !important;
+  }
 </style>

+ 3 - 3
src/views/vent/monitorManager/compressor/nitrogen.data.blt.ts

@@ -94,9 +94,9 @@ export const preFanMonitorData = [
     unit: 'Mpa',
   },
   {
-    title: '电机电压',
-    code: 'AirCompressor_SysVoltage',
-    unit: 'V',
+    title: '风机电流',
+    code: 'AirCompressor_Fan_Current',
+    unit: 'A',
   },
   {
     title: '电机电压',

+ 4 - 7
src/views/vent/monitorManager/compressor/nitrogen.data.ts

@@ -212,8 +212,6 @@ export const zhudanOption = reactive({
 
 export function getMonitorComponent() {
   const { sysOrgCode } = useGlobSetting();
-  debugger;
-  console.log(sysOrgCode, 'sysOrgCode----------------------');
   let nitrogenHome;
   switch (sysOrgCode) {
     case 'sdmtjtdltmk': //大柳塔井
@@ -228,17 +226,16 @@ export function getMonitorComponent() {
     case 'sdmtjtbltmk': // 补连塔
       nitrogenHome = defineAsyncComponent(() => import('./components/nitrogenHome_blt.vue'));
       return nitrogenHome;
+    case 'sdmtjtcctmk': // 寸草塔
+      nitrogenHome = defineAsyncComponent(() => import('./components/nitrogenHome_blt.vue'));
+      return nitrogenHome;
     case 'lahgjtlnmy': // 潞宁
       nitrogenHome = defineAsyncComponent(() => import('./components/nitrogenHome_ln.vue'));
       return nitrogenHome;
-      case 'sdmtjtltmk'://柳塔
-      nitrogenHome = defineAsyncComponent(() => import('./components/nitrogenHome_lt.vue'));
-      break;
     default:
       // nitrogenHome = defineAsyncComponent(() => import('./components/nitrogenHome_dltj.vue'));
       // nitrogenHome = defineAsyncComponent(() => import('./components/nitrogenHome_ln.vue'));
-      // nitrogenHome = defineAsyncComponent(() => import('./components/nitrogenHome_bet.vue'));
-      nitrogenHome = defineAsyncComponent(() => import('./components/nitrogenHome_lt.vue'));
+      nitrogenHome = defineAsyncComponent(() => import('./components/nitrogenHome_blt.vue'));
       return nitrogenHome;
   }
 }

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

@@ -57,9 +57,9 @@ export function getMonitorComponent() {
     case 'sdmtjthlgmk': //哈拉沟
       FiberModal = defineAsyncComponent(() => import('./modal/fiber.modal.vue'));
       break;
-      case 'shsddlsjh'://沙吉海
+    case 'shsddlsjh': //沙吉海
       FiberModal = defineAsyncComponent(() => import('./modal/fiber.sjh.vue'));
-        break;
+      break;
     default:
       FiberModal = defineAsyncComponent(() => import('./modal/fiber.modal1.vue'));
   }
@@ -69,7 +69,7 @@ export function getMonitorComponent() {
   const AtomizingModal = defineAsyncComponent(() => import('./modal/atomizing.modal.vue'));
   const GaspatrolModal = defineAsyncComponent(() => import('./modal/gaspatrol.modal.vue'));
 
-  return { FiberModal, BundleModal, DustModal, BallvalveModal,AtomizingModal, GaspatrolModal };
+  return { FiberModal, BundleModal, DustModal, BallvalveModal, AtomizingModal, GaspatrolModal };
 }
 
 // export const searchFormSchema: FormSchema[] = [

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

@@ -400,7 +400,6 @@ const onSelect: TreeProps['onSelect'] = (keys, e) => {
   systemID.value = ''
   deviceList.value = []
   const title = e.node.title; // 在
-  debugger;
   if (e.node.parent && (e.node.parent.node.type.toString()).startsWith('sys')) {
     systemType.value = e.node.parent.node.type
     deviceType.value = e.node.parent.node.type
@@ -564,10 +563,10 @@ async function getDataSource() {
         searchForm = formData.getFieldsValue()
         if(deviceType.value.startsWith('safetymonitor')){
           resultData = await list({ devicetype: deviceType.value, pagetype: 'normal', filterParams: { ...searchForm } })
-        }else if(deviceType.value.startsWith('location') || deviceType.value.startsWith('vehicle')) {
-          const {strname, stationname} = searchForm
-          // resultData = await list({ devicetype: deviceType.value, pagetype: 'normal', strname: strname? '*'+strname+'*':'', stationname: stationname? '*'+stationname+'*':''  })
-          resultData = await list({ devicetype: deviceType.value, pagetype: 'normal', ...searchForm})
+        }else if(deviceType.value.startsWith('location')) {
+          resultData = await list({ devicetype: deviceType.value, pagetype: 'normal', filterParams: {strinstallpos: '*'+searchForm['stationname']+'*', userName: '*'+searchForm['strname']+'*' }, ...searchForm,})
+        }else if(deviceType.value.startsWith('vehicle')) {
+          resultData = await list({ devicetype: deviceType.value, pagetype: 'normal', filterParams: {strinstallpos: '*'+searchForm['stationname']+'*', vehicleName: '*'+searchForm['strname']+'*' ,...searchForm,}})
         }else{
           resultData = await list({ devicetype: deviceType.value, pagetype: 'normal'})
         }
@@ -727,7 +726,18 @@ async function findTreeDataValue(obj) {
 
       if (item.type == type) {
         deviceType.value = obj.deviceid ? 'sys' : item.type
-        if (obj.deviceid) systemID.value = obj.deviceid
+        if(type.startsWith('sys_') && item.children[0]){
+          systemID.value = item.children[0]['type']
+          selectedKeys.value = [item.children[0]['key']]
+          expandedKeys.value = [item.children[0]['key']]
+          treeNodeTitle.value = item.children[0]['title']
+          deviceType.value = type.substring(4)
+        }else{
+          if (obj.deviceid) systemID.value = obj.deviceid
+          selectedKeys.value = [item.key]
+          expandedKeys.value = [item.key]
+          treeNodeTitle.value = item.title
+        }
         // const setKey = (item) => {
         //   if(item.parentKey){
         //     selectedKeys.value.push(item.parentKey)
@@ -737,9 +747,6 @@ async function findTreeDataValue(obj) {
         //   expandedKeys.value.push(item.key)
         // }
         // setKey(item)
-        selectedKeys.value = [item.key]
-        expandedKeys.value = [item.key]
-        treeNodeTitle.value = item.title
         return true
       }
       return false

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

@@ -234,7 +234,7 @@ const props = defineProps({
 let count = 0;
 
 const pageData = reactive({
-  currentTime: dayjs(new Date('2022-10-11 15:03:11').getTime() + count).format('YYYY-MM-DD HH:mm:ss'),
+  currentTime: dayjs(new Date().getTime() + count).format('YYYY-MM-DD HH:mm:ss'),
   totalEnterNum: '-',
   totalToNum: '-',
   totallength: '-', // 总长

+ 45 - 8
src/views/vent/monitorManager/fanLocalMonitor/index.vue

@@ -5,9 +5,18 @@
     <div id="fanLocal3DCSS" class="threejs-Object-CSS" style="width: 100%; height: 100%; position: absolute; overflow: hidden; pointer-events: none">
       <div style="z-index: -1; position: relative" v-if="hasPermission('show:sensorMonitor')">
         <div class="elementTag" id="inputBox">
-          <div class="elementContent" v-if="selectData.windSpeed1 || selectData.gas3">
-            <p v-if="selectData.windSpeed1"
-              >风筒入口风速:<span class="value">{{ selectData.windSpeed1 ? selectData.windSpeed1 : '-' }}</span> <span class="unit"> m/s</span></p
+          <div class="elementContent" v-if="selectData.windSpeed1 || selectData.gas3 || selectData.windSpeed_merge">
+            <p v-if="selectData.windSpeed1 || selectData.windSpeed_merge"
+              >风筒入口风速:<span class="value">{{
+                selectData.windSpeed1 ? selectData.windSpeed1 : selectData.windSpeed_merge ? selectData.windSpeed_merge : '-'
+              }}</span>
+              <span class="unit"> m/s</span></p
+            >
+            <p v-if="selectData.windQuantity1 || selectData.inletAirVolume_merge"
+              >风筒入口风量:<span class="value">{{
+                selectData.windQuantity1 ? selectData.windQuantity1 : selectData.inletAirVolume_merge ? selectData.inletAirVolume_merge : '-'
+              }}</span>
+              <span class="unit"> m³/min</span></p
             >
             <p v-if="selectData.gas3"
               >风筒入口瓦斯浓度: <span class="value">{{ selectData.gas3 ? selectData.gas3 : '-' }}</span> <span class="unit"> %</span></p
@@ -15,9 +24,15 @@
           </div>
         </div>
         <div class="elementTag" id="outBox">
-          <div class="elementContent elementContent-r" v-if="selectData.windQuantity1 || selectData.gas1">
-            <p v-if="selectData.windQuantity1"
-              >迎头供风量:<span class="value">{{ selectData.windQuantity1 ? selectData.windQuantity2 : '-' }}</span>
+          <div class="elementContent elementContent-r" v-if="selectData.windQuantity2 || selectData.gas1 || selectData.ductOutletAirVolume_merge">
+            <p v-if="selectData.windQuantity2 || selectData.ductOutletAirVolume_merge"
+              >迎头供风量:<span class="value">{{
+                selectData.windQuantity2
+                  ? selectData.windQuantity2
+                  : selectData.ductOutletAirVolume_merge
+                  ? selectData.ductOutletAirVolume_merge
+                  : '-'
+              }}</span>
               <span class="unit"> m³/min</span></p
             >
             <p v-if="selectData.gas1"
@@ -447,10 +462,10 @@
   import { message } from 'ant-design-vue';
   import { useCamera } from '/@/hooks/system/useCamera';
   import { CaretRightOutlined } from '@ant-design/icons-vue';
-  import { usePermission } from '/@/hooks/web/usePermission';
   import { DownloadOutlined } from '@ant-design/icons-vue';
   import reportInfo from '../comment/components/reportInfo.vue';
   import { save, reportList } from '../../reportManager/reportManager.api';
+  import { usePermission } from '/@/hooks/web/usePermission';
   const { hasPermission } = usePermission();
   const globalConfig = inject('globalConfig');
   const [registerModal, { openModal, closeModal }] = useModal();
@@ -466,11 +481,16 @@
         permission: 'btn:openclose',
       },
       {
-        key: 'changeSmoke',
+        key: 'changeSmoke', // 主备两个点位
         value: '一键倒机',
         permission: 'btn:change',
       },
       {
+        key: 'changeFan', // 主备一个点位
+        value: '一键倒机',
+        permission: 'btn:CtrlFanChange',
+      },
+      {
         key: 'fan1ToFan2',
         value: '主机倒备机',
         permission: 'btn:ctrlFan1ToFan2',
@@ -995,6 +1015,23 @@
       // } else if (mainWindIsShow1.value === 'stop' && mainWindIsShow2.value === 'stop') {
       //   // playSmoke(handType, '', frequency, 'stop');
       // }
+    } else if (handType === 'changeFan') {
+      data.paramcode = 'CtrlFanStart';
+      btnClick.value = false;
+      deviceControlApi(data)
+        .then((res) => {
+          if (globalConfig.History_Type == 'remote') {
+            message.success('指令已下发至生产管控平台成功!');
+          } else {
+            message.success('指令已下发成功!');
+          }
+          modalTitle.value = '';
+          modalIsShow.value = false;
+          btnClick.value = true;
+        })
+        .catch((err) => {
+          btnClick.value = true;
+        });
     } else if (handType === 'fan1ToFan2') {
       data.paramcode = 'CtrlFan1ToFan2';
       deviceControlApi(data).then(() => {

+ 154 - 0
src/views/vent/monitorManager/gasPumpMonitor/components/DetailModalCC.vue

@@ -0,0 +1,154 @@
+<template>
+  <BasicModal @register="register" title="设备控制" width="700px" v-bind="$attrs" @ok="onSubmit" @cancel="onSubmit">
+    <div>
+      <div class="password-box">
+        <div class="vent-flex-row">
+          <ExclamationCircleFilled style="color: #ffb700; font-size: 30px" />
+          <div class="warning-text">请先输入密码再进行操作!</div>
+        </div>
+        <div class="vent-flex-row input-box">
+          <div class="label">操作密码:</div>
+          <a-input size="small" type="password" v-model:value="passWord" />
+        </div>
+      </div>
+      <a-divider class="divider">设备控制</a-divider>
+      <div class="">
+        <template v-for="(ctrlItem, ctrlIndex) in detailCtrl" :key="ctrlIndex">
+          <div class="parameter-title group-parameter-title"
+            ><SvgIcon class="icon" size="14" name="pulp-title" /><span>{{ ctrlItem.title }}</span></div
+          >
+          <div class="vent-margin-b-10">
+            <div v-for="(ctrlType, index) in ctrlItem.type" :key="index">
+              <template v-for="(ctrlTitleItem, deviceTypeIndex) in ctrlType.childTitle" :key="deviceTypeIndex">
+                <div class="device-group">
+                  <div class="title">{{ ctrlTitleItem }}:</div>
+                  <div class="btn-group">
+                    <a-button
+                      class="btn"
+                      v-for="(device, i) in ctrlItem.items"
+                      :key="i"
+                      type="primary"
+                      @click="handlerFn(ctrlType.key[deviceTypeIndex] + device.code)"
+                      >{{ device.title }}</a-button
+                    >
+                  </div>
+                </div>
+              </template>
+            </div>
+          </div>
+        </template>
+      </div>
+    </div>
+  </BasicModal>
+</template>
+<script lang="ts" setup>
+  import { onMounted, ref, defineEmits, onUnmounted, inject } from 'vue';
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import { detailCtrl } from '../gasPump.dataCc';
+  import { SvgIcon } from '/@/components/Icon';
+  import { message } from 'ant-design-vue';
+  import { ExclamationCircleFilled } from '@ant-design/icons-vue';
+  import { deviceControlApi } from '/@/api/vent/index';
+  const globalConfig = inject('globalConfig');
+
+  const emit = defineEmits(['close', 'register']);
+  const props = defineProps({
+    deviceType: {
+      type: String,
+      required: true,
+    },
+    deviceId: {
+      type: String,
+      required: true,
+    },
+  });
+
+  const passWord = ref('');
+  // 注册 modal
+  const [register, { closeModal }] = useModalInner(() => {
+    passWord.value = '';
+  });
+
+  async function onSubmit() {
+    emit('close');
+    closeModal();
+  }
+
+  function handlerFn(paramcode) {
+    if (!passWord.value) {
+      message.warning('请先输入密码!!!');
+      return;
+    }
+    let value = null;
+    const data = {
+      deviceid: props.deviceId,
+      devicetype: props.deviceType,
+      paramcode: paramcode,
+      password: passWord.value,
+      value: value,
+    };
+    deviceControlApi(data)
+      .then((res) => {
+        if (globalConfig.History_Type == 'remote') {
+          message.success('指令已下发至生产管控平台成功!');
+        } else {
+          message.success('指令已下发成功!');
+        }
+      })
+      .catch((err) => {
+        // message.success('控制异常');
+      });
+  }
+
+  onMounted(async () => {});
+  onUnmounted(() => {});
+</script>
+<style scoped lang="less">
+  @import '/@/design/vent/modal.less';
+  @import '../../comment/less/workFace.less';
+  @ventSpace: zxm;
+
+  .@{ventSpace}-input {
+    width: 150px;
+  }
+  .password-box {
+    .warning-text {
+      font-size: 24px;
+      margin-left: 8px;
+    }
+    .input-box {
+      margin-top: 10px;
+      margin-left: 40px;
+      .label {
+        width: 80px;
+        color: #73e8fe;
+      }
+    }
+  }
+
+  .btn-group {
+    margin-bottom: 8px;
+    .btn-item {
+      width: calc(50% - 16px);
+      margin: 0 4px;
+    }
+  }
+  .divider {
+    color: #fff;
+    border-color: #73e8fe;
+  }
+  .parameter-title {
+    margin-bottom: 15px;
+  }
+  .device-group {
+    display: flex;
+    align-items: center;
+    .title {
+      width: 100px;
+      color: #73e8fe;
+    }
+    .btn {
+      margin: 0 5px;
+    }
+  }
+</style>

+ 485 - 0
src/views/vent/monitorManager/gasPumpMonitor/components/gasPumpHomeCC.vue

@@ -0,0 +1,485 @@
+<template>
+  <div class="monitor-container">
+    <div
+      v-if="deviceType == 'pump_under' && deviceProperty.modelMonitor.length > 0"
+      id="FlowSensor"
+      class="FlowSensor-box"
+      style="position: absolute; display: none"
+    >
+      <div class="elementContent">
+        <fourBorderBg>
+          <div v-for="(item, index) in deviceProperty.modelMonitor" :key="index" class="gas-monitor-row">
+            <div class="title">{{ item.title }}</div>
+            <template v-if="item.type !== 'sign' && item.type !== 'warning'">
+              <div class="value">{{ selectData[item.code] ? selectData[item.code] : '-' }}</div>
+            </template>
+            <template v-else>
+              <div class="value">
+                <span
+                  :class="{
+                    'signal-round': true,
+                    'signal-round-run': item.type === 'sign' && selectData[item.code] == '1',
+                    'signal-round-gry': selectData[item.code] == '0' || !selectData[item.code],
+                    'signal-round-warning': item.type === 'warning' && selectData[item.code] == '1',
+                  }"
+                ></span>
+              </div>
+            </template>
+          </div>
+        </fourBorderBg>
+      </div>
+    </div>
+    <div v-if="selectData['netStatus'] == 0" class="device-state">网络断开</div>
+    <div class="btn-group">
+      <a-button v-if="deviceProperty.detailCtrl.length > 0" class="btn-item" type="primary" @click="openModal">瓦斯泵控制</a-button>
+    </div>
+    <div class="lr left-box">
+      <div class="left-container">
+        <div class="monitor-box">
+          <template v-for="(device, leftIndex) in deviceProperty.leftMonitor" :key="leftIndex">
+            <ventBox1 :class="{ 'vent-margin-t-10': leftIndex > 0 }">
+              <template #title>
+                <div>{{ device.title }}</div>
+              </template>
+              <template #container>
+                <template v-for="(deviceChild, deviceChildIndex) in device.children" :key="deviceChildIndex">
+                  <div v-for="(deviceKey, deviceIndex) in deviceChild.key" :key="deviceIndex">
+                    <div v-if="deviceChild.key.length > 1" class="parameter-title group-parameter-title"
+                      ><SvgIcon class="icon" size="14" name="pulp-title" /><span>{{ deviceChild.childTitle[deviceIndex] }}</span></div
+                    >
+                    <div class="input-box">
+                      <div v-for="(item, index) in deviceChild.list" class="input-item" :key="index">
+                        <div
+                          :class="{
+                            'w-280px': item.type == 'sign' || item.type == 'warning',
+                            title: item.type !== 'sign' && item.type !== 'warning',
+                          }"
+                          >{{ item.title }}:</div
+                        >
+                        <template v-if="item.type !== 'sign' && item.type !== 'warning'">
+                          <div class="value">{{
+                            selectData && selectData[deviceKey + item.code] ? formatNum(selectData[deviceKey + item.code], 1) : '-'
+                          }}</div>
+                        </template>
+                        <template v-else>
+                          <div class="value">
+                            <span
+                              :class="{
+                                'signal-round': true,
+                                'signal-round-run': item.type === 'sign' && selectData[deviceKey + item.code] == '1',
+                                'signal-round-gry': selectData[deviceKey + item.code] == '0' || !selectData[deviceKey + item.code],
+                                'signal-round-warning': item.type === 'warning' && selectData[deviceKey + item.code] == '1',
+                              }"
+                            ></span>
+                          </div>
+                        </template>
+                      </div>
+                    </div>
+                  </div>
+                </template>
+              </template>
+            </ventBox1>
+          </template>
+        </div>
+      </div>
+    </div>
+    <div class="lr right-box">
+      <div class="item-box sensor-container">
+        <ventBox1 v-for="(device, rightIndex) in deviceProperty.rightMonitor" :key="rightIndex" class="vent-margin-t-10">
+          <template #title>
+            <div>{{ device.title }}</div>
+          </template>
+          <template #container>
+            <div v-if="device.type == 'table'">
+              <div class="state-header">
+                <div class="header-item" v-for="(header, index) in device.stateHeader" :key="index">{{ header }}</div>
+              </div>
+              <div class="">
+                <div v-for="(child, index) in device.children" :key="index">
+                  <div class="device-row" v-for="(valveKey, valveIndex) in child.key" :key="valveIndex">
+                    <div class="state">{{ child.childTitle[valveIndex] }} </div>
+                    <div class="state" v-for="(state, i) in device['list']" :key="i">
+                      <span v-if="state['dict']">{{
+                        state['dict'][selectData[valveKey + state.code]] ? state['dict'][selectData[valveKey + state.code]] : '-'
+                      }}</span>
+                      <span
+                        v-else
+                        :class="{
+                          'signal-round': true,
+                          'signal-round-run': selectData[selectData[valveKey + state.code]] == '1',
+                          'signal-round-gry': selectData[selectData[valveKey + state.code]] != '1',
+                        }"
+                      ></span>
+                    </div>
+                  </div>
+                </div>
+              </div>
+            </div>
+            <div v-else>
+              <template v-for="(deviceChild, deviceChildIndex) in device.children" :key="deviceChildIndex">
+                <div v-for="(deviceKey, deviceIndex) in deviceChild.key" :key="deviceIndex">
+                  <div v-if="deviceChild.key.length > 1" class="parameter-title group-parameter-title"
+                    ><SvgIcon class="icon" size="14" name="pulp-title" /><span>{{ deviceChild.childTitle[deviceIndex] }}</span></div
+                  >
+                  <div class="input-box">
+                    <div v-for="(item, index) in deviceChild.list" class="input-item" :key="index">
+                      <div
+                        :class="{ 'w-280px': item.type == 'sign' || item.type == 'warning', title: item.type !== 'sign' && item.type !== 'warning' }"
+                        >{{ item.title }}:</div
+                      >
+                      <template v-if="item.type !== 'sign' && item.type !== 'warning'">
+                        <div class="value">{{
+                          selectData && selectData[deviceKey + item.code] ? formatNum(selectData[deviceKey + item.code], 1) : '-'
+                        }}</div>
+                      </template>
+                      <template v-else>
+                        <div class="value">
+                          <span
+                            :class="{
+                              'signal-round': true,
+                              'signal-round-run': item.type === 'sign' && selectData[deviceKey + item.code] == '1',
+                              'signal-round-gry': selectData[deviceKey + item.code] == '0' || !selectData[deviceKey + item.code],
+                              'signal-round-warning': item.type === 'warning' && selectData[deviceKey + item.code] == '1',
+                            }"
+                          ></span>
+                        </div>
+                      </template>
+                    </div>
+                  </div>
+                </div>
+              </template>
+            </div>
+          </template>
+        </ventBox1>
+      </div>
+    </div>
+    <div ref="playerRef" class="player-box"></div>
+  </div>
+  <DetailModal @register="register" :device-type="deviceType" :device-id="deviceId" />
+  <PasswordModal
+    :modal-is-show="passwordModalIsShow"
+    modal-title="密码检验"
+    :modal-type="handlerType"
+    @handle-ok="handleOK"
+    @handle-cancel="handleCancel"
+  />
+</template>
+
+<script setup lang="ts">
+  import { ref, onMounted, onUnmounted, reactive, defineProps, watch, inject, nextTick, onBeforeUnmount } from 'vue';
+  import ventBox1 from '/@/components/vent/ventBox1.vue';
+  import { setModelType } from '../gasPump.threejs';
+  import { getMonitorData, devicePropertyType } from '../gasPump.data';
+  // import { leftMonitor, rightMonitor, modelMonitor, detailCtrl } from '../gasPump.dataCc2_2';
+  import { list } from '../gasPump.api';
+  import { SvgIcon } from '/@/components/Icon';
+  import { formatNum } from '/@/utils/ventutil';
+  import DetailModal from './DetailModalCC.vue';
+  import { useModal } from '/@/components/Modal';
+  import { deviceControlApi } from '/@/api/vent/index';
+  import PasswordModal from '../../comment/components/PasswordModal.vue';
+  import { message } from 'ant-design-vue';
+  import fourBorderBg from '/@/components/vent/fourBorderBg.vue';
+  import { useCamera } from '/@/hooks/system/useCamera';
+
+  const globalConfig = inject('globalConfig');
+
+  const props = defineProps({
+    deviceId: {
+      type: String,
+      require: true,
+    },
+    deviceType: {
+      type: String,
+      require: true,
+    },
+  });
+  const [register, { openModal }] = useModal();
+  const loading = ref(false);
+  const passwordModalIsShow = ref(false);
+  const handlerType = ref('');
+  const playerRef = ref();
+  const deviceProperty = ref({
+    leftMonitor: [] as devicePropertyType[],
+    rightMonitor: [] as devicePropertyType[],
+    modelMonitor: [] as devicePropertyType[],
+    detailCtrl: [] as devicePropertyType[],
+  });
+
+  // 监测数据
+  const selectData = reactive({});
+
+  const { getCamera, removeCamera } = useCamera();
+
+  // https获取监测数据
+  let timer: null | NodeJS.Timeout = null;
+  function getMonitor(flag?) {
+    if (Object.prototype.toString.call(timer) === '[object Null]') {
+      return new Promise((resolve) => {
+        timer = setTimeout(
+          async () => {
+            if (props.deviceId) {
+              const data = await getDataSource(props.deviceId);
+              Object.assign(selectData, data);
+            }
+            if (timer) {
+              timer = null;
+            }
+            resolve(null);
+            await getMonitor();
+            loading.value = false;
+          },
+          flag ? 0 : 1000
+        );
+      });
+    }
+  }
+
+  async function getDataSource(systemID) {
+    const res = await list({ devicetype: props.deviceType, ids: systemID });
+    const result = res.msgTxt[0]['datalist'][0];
+    Object.assign(result, result['readData']);
+    return result;
+  }
+
+  function handler(passWord, paramcode) {
+    let value = '';
+    if (paramcode == 'ykjdqh') {
+      value = selectData['paramcode'] == '1' ? '2' : '1';
+    }
+    if (paramcode == 'jxmsqh') {
+      value = selectData['jxmsqh'] == '1' ? '2' : '1';
+    }
+    const data = {
+      deviceid: selectData['deviceID'],
+      devicetype: selectData['deviceType'],
+      paramcode: paramcode,
+      password: passWord,
+      value: value,
+    };
+
+    deviceControlApi(data)
+      .then((res) => {
+        if (globalConfig.History_Type == 'remote') {
+          message.success('指令已下发至生产管控平台成功!');
+        } else {
+          message.success('指令已下发成功!');
+        }
+      })
+      .catch((err) => {
+        message.success('控制异常');
+      });
+  }
+
+  function handleOK(passWord, handlerState) {
+    handler(passWord, handlerState);
+    passwordModalIsShow.value = false;
+    handlerType.value = '';
+  }
+
+  function handleCancel() {
+    passwordModalIsShow.value = false;
+    handlerType.value = '';
+  }
+
+  watch(
+    () => props.deviceType,
+    () => {
+      nextTick(async () => {
+        if (props.deviceType == 'pump_over') {
+          setModelType('gasPump');
+        } else if (props.deviceType == 'pump_under') {
+          setModelType('gasPumpUnder');
+        }
+        deviceProperty.value = await getMonitorData(props.deviceType);
+      });
+    }
+  );
+  watch(
+    () => props.deviceId,
+    async (deviceID) => {
+      removeCamera();
+      if (deviceID) await getCamera(deviceID, playerRef.value);
+    }
+  );
+
+  onMounted(async () => {
+    timer = null;
+    await getMonitor(true);
+    if (selectData && selectData['deviceID']) await getCamera(selectData['deviceID'], playerRef.value);
+  });
+
+  onBeforeUnmount(() => {
+    removeCamera();
+  });
+
+  onUnmounted(() => {
+    removeCamera();
+    if (timer) {
+      clearTimeout(timer);
+      timer = undefined;
+    }
+  });
+</script>
+<style lang="less" scoped>
+  @import '/@/design/vent/modal.less';
+  @import '../../comment/less/workFace.less';
+  @ventSpace: zxm;
+  .elementContent {
+    :deep(.main-container) {
+      display: flex;
+      flex-wrap: wrap;
+      width: 690px;
+      padding: 10px 12px 10px 15px;
+      border: 1px solid #d3e1ff33;
+      background-color: #061c2a55;
+      box-shadow: 0 0 15px #3b567f55;
+      background-color: #38383833;
+      .gas-monitor-row {
+        display: flex;
+        flex-direction: row;
+        flex-wrap: wrap;
+        color: #fff;
+        line-height: 32px;
+        .title {
+          width: 250px;
+          color: #baeaff;
+        }
+        .value {
+          width: 80px;
+          color: #efae05;
+        }
+      }
+    }
+  }
+
+  .device-state {
+    width: 100%;
+    position: absolute;
+    top: 20px;
+    color: #e90000;
+    display: flex;
+    justify-content: center;
+    font-size: 20px;
+  }
+
+  .lr {
+    margin-top: 0 !important;
+  }
+  .left-box {
+    width: 360px !important;
+    direction: rtl;
+    overflow-y: auto;
+    overflow-x: hidden;
+    height: calc(100% - 60px);
+    margin-top: 30px !important;
+
+    .left-container {
+      direction: ltr;
+      :deep(.input-item .title) {
+        width: 220px !important;
+      }
+    }
+  }
+  .right-box {
+    width: 350px !important;
+    overflow-y: auto;
+    overflow-x: hidden;
+    .environment-monitor {
+      .item {
+        flex: 1;
+        margin: 0 5px;
+        .title {
+          color: #7ae5ff;
+          text-align: center;
+          margin-bottom: 2px;
+        }
+        .num {
+          width: 100%;
+          height: 30px;
+          text-align: center;
+          border-top: 2px solid #50c8fc;
+          border-radius: 4px;
+          background-image: linear-gradient(#2e4d5955, #3780b499, #2e465955);
+        }
+      }
+    }
+    .pool-box {
+      width: 327px;
+      height: 65px;
+      padding: 0 5px;
+      background: url('/@/assets/images/vent/pump1.png') no-repeat;
+      background-size: cover;
+      background-origin: content-box;
+      margin-top: 2px;
+      .num {
+        color: aqua;
+      }
+      .center {
+        padding-right: 5px;
+      }
+    }
+  }
+  .player-box {
+    position: absolute;
+    height: 100%;
+    width: 100%;
+    padding: 0 20px 0 20px;
+    z-index: 9999;
+    display: flex;
+    align-items: end;
+    bottom: 80px;
+    :deep(#LivePlayerBox) {
+      display: flex;
+      justify-content: end;
+    }
+  }
+  .input-box {
+    width: calc(100%);
+    display: flex;
+    flex-direction: row !important;
+    flex-wrap: wrap !important;
+    .input-item {
+      width: calc(50% - 8px);
+      padding: 0 2px;
+
+      &:nth-child(2n) {
+        margin-left: 4px;
+      }
+    }
+  }
+  .btn-group {
+    width: 100%;
+    position: fixed;
+    display: flex;
+    justify-content: end;
+    right: 380px;
+    top: 85px;
+    pointer-events: auto;
+    .btn-item {
+      width: auto;
+      text-align: center;
+    }
+  }
+  .state-header {
+    display: flex;
+    color: #73e8fe;
+    .header-item {
+      width: 25%;
+      text-align: center;
+    }
+  }
+  .device-row {
+    display: flex;
+    margin-top: 10px;
+    .state {
+      width: 25%;
+      text-align: center;
+      font-size: 13px;
+    }
+  }
+
+  :deep(.@{ventSpace}-tabs-tabpane-active) {
+    overflow: auto;
+  }
+</style>

+ 0 - 600
src/views/vent/monitorManager/gasPumpMonitor/components/gasPumpHomeNew.vue

@@ -1,600 +0,0 @@
-<template>
-    <div class="monitor-container">
-        <!-- <div id="FlowSensor" class="FlowSensor-box" style="position: absolute; display: none">
-            <div class="elementContent" v-if="deviceType == 'pump_under'">
-                <fourBorderBg>
-                    <template v-for="(item, index) in modelMonitor" :key="index">
-                        <div class="gas-monitor-row">
-                            <div class="title">{{ item.title }}</div>
-                            <div class="value">{{ selectData[item.code] ? selectData[item.code] : '-' }}</div>
-                        </div>
-                    </template>
-</fourBorderBg>
-</div>
-</div> -->
-        <div v-if="selectData['netStatus'] == 0" class="device-state">网络断开</div>
-        <div class="lr left-box">
-            <div class="left-container">
-                <div class="monitor-box">
-                    <ventBox1>
-                        <template #title>
-                            <div>瓦斯泵</div>
-                        </template>
-                        <template #container>
-                            <div v-for="key in 2" :key="key">
-                                <div class="parameter-title group-parameter-title">
-                                    <SvgIcon class="icon" size="14" name="pulp-title" /><span>{{ key }}#变频器</span>
-                                </div>
-                                <div class="input-box">
-                                    <div v-for="(item, index) in pumpMonitorDataNew" class="input-item" :key="index">
-                                        <div class="title">{{ item.title }}:</div>
-                                        <template v-if="item.type !== 'sign' && item.type !== 'warning'">
-                                            <div class="value">{{
-            selectData && selectData[item[`code${key-1}`]]
-                ? formatNum(selectData[item[`code${key-1}`]]) : '-'
-        }}</div>
-                                        </template>
-                                        <template v-else>
-                                            <div class="value">
-                                                <span :class="{
-                'signal-round': true,
-                'signal-round-run': item.type === 'sign' && selectData[item[`code${key-1}`]] == '1',
-                'signal-round-gry': selectData[item[`code${key-1}`]] == '0',
-                'signal-round-warning': item.type === 'warning' && selectData[item[`code${key-1}`]] == '1',
-            }"></span>
-                                            </div>
-                                        </template>
-                                    </div>
-                                </div>
-                            </div>
-                        </template>
-                    </ventBox1>
-
-                    <ventBox1 class="vent-margin-t-10">
-                        <template #title>
-                            <div>水泵</div>
-                        </template>
-                        <template #container>
-                            <div v-for="key in 2" :key="key">
-                                <div class="parameter-title group-parameter-title">
-                                    <SvgIcon class="icon" size="14" name="pulp-title" /><span>{{ key }}#水泵</span>
-                                </div>
-                                <div class="input-box">
-                                    <div v-for="(item, index) in waterPumpDataNew" class="input-item" :key="index">
-                                        <div class="title">{{ item.title }}:</div>
-                                        <template v-if="item.type !== 'sign'">
-                                            <div class="value">{{
-            selectData && selectData[item[`code${key-1}`]]
-                ? formatNum(selectData[item[`code${key-1}`]])
-                : '-'
-        }}</div>
-                                        </template>
-                                        <template v-else>
-                                            <div class="value">
-                                                <span :class="{
-                'signal-round': true,
-                'signal-round-run': selectData[item[`code${key-1}`]],
-                'signal-round-gry': selectData[item[`code${key-1}`]] == '0',
-            }"></span>
-                                            </div>
-                                        </template>
-                                    </div>
-                                </div>
-                            </div>
-                        </template>
-                    </ventBox1>
-                    <ventBox1 class="vent-margin-t-10">
-                        <template #title>
-                            <div>xxx</div>
-                        </template>
-                        <template #container>
-                            <div v-for="key in 2" :key="key">
-                                <div class="parameter-title group-parameter-title">
-                                    <SvgIcon class="icon" size="14" name="pulp-title" /><span>{{ key }}#xxx</span>
-                                </div>
-                                <div class="input-box">
-                                    <div v-for="(item, index) in dewateringPumpDataNew" class="input-item" :key="index">
-                                        <div class="title">{{ item.title }}:</div>
-                                        <template v-if="item.type !== 'sign'">
-                                            <div class="value">{{
-            selectData && selectData[item[`code${key-1}`]]
-                ? formatNum(selectData[item[`code${key-1}`]])
-                : '-'
-        }}</div>
-                                        </template>
-                                        <template v-else>
-                                            <div class="value">
-                                                <span :class="{
-                'signal-round': true,
-                'signal-round-run': selectData[item[`code${key-1}`]],
-                'signal-round-gry': selectData[item[`code${key-1}`]] == '0',
-            }"></span>
-                                            </div>
-                                        </template>
-                                    </div>
-                                </div>
-                            </div>
-                        </template>
-                    </ventBox1>
-                </div>
-            </div>
-        </div>
-        <div class="lr right-box">
-            <div class="item-box sensor-container">
-                <ventBox1 class="vent-margin-t-10">
-                    <template #title>
-                        <div>xxxx</div>
-                    </template>
-                    <template #container>
-                        <div v-for="key in 2" :key="key">
-                            <div class="parameter-title group-parameter-title">
-                                <SvgIcon class="icon" size="14" name="pulp-title" /><span>{{ key }}#xxxx</span>
-                            </div>
-                            <div class="input-box">
-                                <div v-for="(item, index) in otherPumpDataNew" class="input-item" :key="index">
-                                    <div class="title">{{ item.title }}:</div>
-                                    <template v-if="item.type !== 'sign'">
-                                        <div class="value">{{
-            selectData && selectData[item[`code${key-1}`]]
-                ? formatNum(selectData[item[`code${key-1}`]])
-                : '-'
-        }}</div>
-                                    </template>
-                                    <template v-else>
-                                        <div class="value">
-                                            <span :class="{
-                              'signal-round': true,
-                              'signal-round-run': selectData[item[`code${key-1}`]],
-                              'signal-round-gry': selectData[item[`code${key-1}`]] == '0',
-                            }"></span>
-                                        </div>
-                                    </template>
-                                </div>
-                            </div>
-                        </div>
-                    </template>
-                </ventBox1>
-            </div>
-        </div>
-        <div ref="playerRef" class="player-box"></div>
-    </div>
-    <DetailModal @register="register" :device-type="deviceType" :device-id="deviceId" />
-    <PasswordModal :modal-is-show="passwordModalIsShow" modal-title="密码检验" :modal-type="handlerType"
-        @handle-ok="handleOK" @handle-cancel="handleCancel" />
-</template>
-
-<script setup lang="ts">
-import { ref, onMounted, onUnmounted, reactive, defineProps, watch, inject, nextTick, onBeforeUnmount } from 'vue';
-import ventBox1 from '/@/components/vent/ventBox1.vue';
-import { setModelType } from '../gasPump.threejs';
-import {
-    pumpMonitorDataNew,
-    waterPumpDataNew,
-    dewateringPumpDataNew,
-    otherPumpDataNew,
-    // modelMonitor,
-} from '../gasPump.data';
-import { list } from '../gasPump.api';
-import { SvgIcon } from '/@/components/Icon';
-import { formatNum } from '/@/utils/ventutil';
-import DetailModal from './DetailModal.vue';
-import { useModal } from '/@/components/Modal';
-import { deviceControlApi } from '/@/api/vent/index';
-import PasswordModal from '../../comment/components/PasswordModal.vue';
-import { message } from 'ant-design-vue';
-// import fourBorderBg from '/@/components/vent/fourBorderBg.vue';
-import { useCamera } from '/@/hooks/system/useCamera';
-
-const globalConfig = inject('globalConfig');
-
-const props = defineProps({
-    deviceId: {
-        type: String,
-        require: true,
-    },
-    deviceType: {
-        type: String,
-        require: true,
-    },
-});
-const [register, { openModal }] = useModal();
-const loading = ref(false);
-const passwordModalIsShow = ref(false);
-const handlerType = ref('');
-const playerRef = ref();
-
-// 监测数据
-const selectData = reactive({});
-
-const { getCamera, removeCamera } = useCamera();
-
-// https获取监测数据
-let timer: null | NodeJS.Timeout = null;
-function getMonitor(flag?) {
-    if (Object.prototype.toString.call(timer) === '[object Null]') {
-        return new Promise((resolve) => {
-            timer = setTimeout(
-                async () => {
-                    if (props.deviceId) {
-                        const data = await getDataSource(props.deviceId);
-                        Object.assign(selectData, data);
-                    }
-                    if (timer) {
-                        timer = null;
-                    }
-                    resolve(null);
-                    await getMonitor();
-                    loading.value = false;
-                },
-                flag ? 0 : 1000
-            );
-        });
-    }
-}
-
-async function getDataSource(systemID) {
-    const res = await list({ devicetype: props.deviceType, ids: systemID });
-    const result={}
-    res.msgTxt.forEach(el=>{
-        Object.assign(result,el['datalist'][0],el['datalist'][0].readData)
-    })
-    console.log(result,'result--------------')
-    return result;
-}
-
-function handler(passWord, paramcode) {
-    let value = '';
-    if (paramcode == 'ykjdqh') {
-        value = selectData['ykjdqh'] == '1' ? '2' : '1';
-    }
-    if (paramcode == 'jxmsqh') {
-        value = selectData['jxmsqh'] == '1' ? '2' : '1';
-    }
-    const data = {
-        deviceid: selectData['deviceID'],
-        devicetype: selectData['deviceType'],
-        paramcode: paramcode,
-        password: passWord,
-        value: value,
-    };
-    deviceControlApi(data)
-        .then((res) => {
-            if (globalConfig.History_Type == 'remote') {
-                message.success('指令已下发至生产管控平台成功!');
-            } else {
-                message.success('指令已下发成功!');
-            }
-        })
-        .catch((err) => {
-            message.success('控制异常');
-        });
-}
-
-function changeCtr(e) {
-    if (e.target.value == 1) {
-        // 就地
-        handlerType.value = 'jxmsqh';
-    } else if (e.target.value == 2) {
-        // 远程
-        handlerType.value = 'jxmsqh';
-    }
-    passwordModalIsShow.value = true;
-}
-
-function changeMode(e) {
-    if (e.target.value == 1) {
-        // 检修开
-        handlerType.value = 'ykjdqh';
-    } else if (e.target.value == 2) {
-        // 检修关
-        handlerType.value = 'ykjdqh';
-    }
-    passwordModalIsShow.value = true;
-}
-
-function handlerFn(paramcode) {
-    handlerType.value = paramcode;
-    passwordModalIsShow.value = true;
-}
-
-function handleOK(passWord, handlerState) {
-    handler(passWord, handlerState);
-    passwordModalIsShow.value = false;
-    handlerType.value = '';
-}
-
-function handleCancel() {
-    passwordModalIsShow.value = false;
-    handlerType.value = '';
-}
-
-
-watch(
-    () => props.deviceType,
-    () => {
-        nextTick(async () => {
-            if (props.deviceType == 'pump_over') {
-                setModelType('gasPump');
-            } else if (props.deviceType == 'pump_under') {
-                setModelType('gasPumpUnder');
-            }
-        });
-    }
-);
-watch(
-    () => props.deviceId,
-    async (deviceID) => {
-        removeCamera();
-        if (deviceID) await getCamera(deviceID, playerRef.value);
-    }
-);
-
-onMounted(async () => {
-    timer = null;
-    await getMonitor(true);
-    if (selectData && selectData['deviceID']) await getCamera(selectData['deviceID'], playerRef.value);
-});
-
-onBeforeUnmount(() => {
-    removeCamera();
-});
-
-onUnmounted(() => {
-    removeCamera();
-    if (timer) {
-        clearTimeout(timer);
-        timer = undefined;
-    }
-});
-</script>
-<style lang="less" scoped>
-@import '/@/design/vent/modal.less';
-@import '../../comment/less/workFace.less';
-@ventSpace: zxm;
-
-// .elementContent {
-//     :deep(.main-container) {
-//         display: flex;
-//         flex-wrap: wrap;
-//         width: 690px;
-//         padding: 10px 12px 10px 15px;
-//         border: 1px solid #d3e1ff33;
-//         background-color: #061c2a55;
-//         box-shadow: 0 0 15px #3b567f55;
-//         background-color: #38383833;
-
-//         .gas-monitor-row {
-//             display: flex;
-//             flex-direction: row;
-//             flex-wrap: wrap;
-//             color: #fff;
-//             line-height: 32px;
-
-//             .title {
-//                 width: 250px;
-//                 color: #baeaff;
-//             }
-
-//             .value {
-//                 width: 80px;
-//                 color: #efae05;
-//             }
-//         }
-//     }
-// }
-
-.device-state {
-    width: 100%;
-    position: absolute;
-    top: 20px;
-    color: #e90000;
-    display: flex;
-    justify-content: center;
-    font-size: 20px;
-}
-
-.lr {
-    margin-top: 0 !important;
-}
-
-.left-box {
-    width: 360px !important;
-    direction: rtl;
-    overflow-y: auto;
-    overflow-x: hidden;
-    height: calc(100% - 60px);
-    margin-top: 30px !important;
-
-    .left-container {
-        direction: ltr;
-    }
-}
-
-.right-box {
-    width: 350px !important;
-    overflow-y: auto;
-    overflow-x: hidden;
-
-    .environment-monitor {
-        .item {
-            flex: 1;
-            margin: 0 5px;
-
-            .title {
-                color: #7ae5ff;
-                text-align: center;
-                margin-bottom: 2px;
-            }
-
-            .num {
-                width: 100%;
-                height: 30px;
-                text-align: center;
-                border-top: 2px solid #50c8fc;
-                border-radius: 4px;
-                background-image: linear-gradient(#2e4d5955, #3780b499, #2e465955);
-            }
-        }
-    }
-
-    .pool-box {
-        width: 327px;
-        height: 65px;
-        padding: 0 5px;
-        background: url('/@/assets/images/vent/pump1.png') no-repeat;
-        background-size: cover;
-        background-origin: content-box;
-        margin-top: 2px;
-
-        .num {
-            color: aqua;
-        }
-
-        .center {
-            padding-right: 5px;
-        }
-    }
-}
-
-.player-box {
-    position: absolute;
-    //   height: 100%;
-    //   width: 100%;
-    //   padding: 0 20px 0 20px;
-    z-index: 9999;
-    display: flex;
-    align-items: end;
-    //   bottom: 80px;
-    top: 30px;
-    left: 380px;
-
-    :deep(#LivePlayerBox) {
-        display: flex;
-        justify-content: end;
-    }
-}
-
-.control-group {
-    display: flex;
-    // justify-content: space-around;
-    flex-wrap: wrap;
-    margin: 4px 0;
-
-    .control-item {
-        display: flex;
-        flex-direction: column;
-        justify-content: center;
-        align-items: center;
-        padding: 1px 10px;
-
-        .control-item-title {
-            color: #a6dce9;
-            position: relative;
-        }
-
-        .control-item-state {
-            width: 86px;
-            height: 31px;
-            background: url('/@/assets/images/vent/control-switch-bg1.png');
-            display: flex;
-            justify-content: center;
-            align-items: center;
-            color: #fff;
-        }
-
-        .button-box {
-            position: relative;
-            padding: 5px;
-            border: 1px transparent solid;
-            background-clip: border-box;
-            border-radius: 5px;
-            margin-left: 8px;
-        }
-
-        .a-button {
-            pointer-events: auto;
-        }
-
-        &::v-deep .a-button--mini {
-            padding: 6px 10px;
-        }
-
-        &::v-deep .a-button--mini.is-round {
-            padding: 6px 10px;
-        }
-    }
-}
-
-.input-box {
-    width: calc(100%);
-    display: flex;
-    flex-direction: row !important;
-    flex-wrap: wrap !important;
-
-    .input-item {
-        width: calc(50% - 8px);
-        padding: 0 2px;
-
-        &:nth-child(2n) {
-            margin-left: 4px;
-        }
-    }
-}
-
-.btn-group {
-    display: flex;
-    justify-content: space-around;
-
-    .btn-item {
-        width: 82px;
-        text-align: center;
-    }
-}
-
-.top-btn {
-    .btn-group {
-        margin-bottom: 8px;
-
-        .btn-item {
-            width: calc(50% - 16px);
-            margin: 0 4px;
-        }
-    }
-
-    .control-item {
-        margin-left: 10px;
-        margin-bottom: 8px;
-        display: flex;
-
-        .control-title {
-            width: 150px;
-            color: #73e8fe;
-        }
-    }
-}
-
-.state-header {
-    display: flex;
-    color: #73e8fe;
-
-    .header-item {
-        width: 25%;
-        text-align: center;
-    }
-}
-
-.device-row {
-    display: flex;
-    margin-top: 10px;
-
-    .state {
-        width: 25%;
-        text-align: center;
-        font-size: 13px;
-    }
-}
-
-:deep(.@{ventSpace}-tabs-tabpane-active) {
-    overflow: auto;
-}
-</style>

+ 53 - 343
src/views/vent/monitorManager/gasPumpMonitor/gasPump.data.ts

@@ -1,345 +1,6 @@
-import { reactive } from 'vue';
-
-//lxh
-export const pumpMonitorDataNew=[
-  {
-    title: '电机电流',
-    code0: 'CentrifugalPump1_VFD_Current',
-    code1:'CentrifugalPump2_VFD_Current',
-    type: '',
-  },
-  {
-    title: '电机频率',
-    code0: 'CentrifugalPump1_VFD_Frequency',
-    code1:'CentrifugalPump2_VFD_Frequency',
-    type: '',
-  },
-  {
-    title: '输入电压',
-    code0: 'CentrifugalPump1_VFD_DCBusVoltage',
-    code1: 'CentrifugalPump2_VFD_DCBusVoltage',
-    type: '',
-  },
-  {
-    title: '状态',
-    code0: 'CentrifugalPump1_VFD_Status',
-    code1: 'CentrifugalPump2_VFD_Status',
-    type: '',
-  },
-  {
-    title: '除尘控制',
-    code0: 'CentrifugalPump1_VFD_CtrlMode',
-    code1: 'CentrifugalPump2_VFD_CtrlMode',
-    type: '',
-  },
-  {
-    title: '除尘流量',
-    code0: 'CentrifugalPump1_FlowSensor3_InputFlux',
-    code1: 'CentrifugalPump2_FlowSensor3_InputFlux',
-    type: '',
-  },
-  {
-    title: '控制模式',
-    code0: 'CentrifugalPump1_PU_CtrlMode',
-    code1: 'CentrifugalPump2_PU_CtrlMode',
-    type: '',
-  },
- 
-];
-//lxh
-export const waterPumpDataNew = [
-  {
-    title: '进气阀开度',
-    code0: 'CentrifugalPump1_GVL1_OpenDegree',
-    code1: 'CentrifugalPump2_GVL1_OpenDegree',
-    type: '',
-  },
-  {
-    title: '排气阀开度',
-    code0: 'CentrifugalPump1_GVL2_OpenDegree',
-    code1: 'CentrifugalPump2_GVL2_OpenDegree',
-    type: '',
-  },
-  {
-    title: '进水阀状态',
-    code0: 'CentrifugalPump1_GVL4_Status',
-    code1:'CentrifugalPump2_GVL4_Status',
-    type: '',
-  },
-  {
-    title: '排水阀状态',
-    code0: 'CentrifugalPump1_GVL3_Status',
-    code1: 'CentrifugalPump2_GVL3_Status',
-    type: '',
-  },
-  {
-    title: '水泵1电压',
-    code0: 'SubmarinePump1_MOT1_Uab',
-    code1: 'SubmarinePump2_MOT1_Uab',
-    type: '',
-  },
-  {
-    title: '水泵1电流',
-    code0: 'SubmarinePump1_MOT1_Ia',
-    code1: 'SubmarinePump2_MOT1_Ia',
-    type: '',
-  },
-  {
-    title: '水泵2电压',
-    code0: 'SubmarinePump1_MOT2_Uab',
-    code1: 'SubmarinePump2_MOT2_Uab',
-    type: '',
-  },
-  {
-    title: '水泵2电流',
-    code0: 'SubmarinePump1_MOT2_Ia',
-    code1: 'SubmarinePump2_MOT2_Ia',
-    type: '',
-  },
-  {
-    title: '水泵1状态',
-    code0: 'SubmarinePump1_PU1_Status1',
-    code1: 'SubmarinePump2_PU1_Status1',
-    type: '',
-  },
-  {
-    title: '水泵2状态',
-    code0: 'SubmarinePump1_PU2_Status1',
-    code1: 'SubmarinePump2_PU2_Status1',
-    type: '',
-  },
-  {
-    title: '高压泵电流',
-    code0: 'SubmarinePump1_MOT3_Ia',
-    code1: 'SubmarinePump2_MOT3_Ia',
-    type: '',
-  },
-  {
-    title: '高压泵电压',
-    code0: 'SubmarinePump1_MOT3_Uab',
-    code1: 'SubmarinePump2_MOT3_Uab',
-    type: '',
-  },
-  {
-    title: '加药泵电流',
-    code0: 'SubmarinePump1_MOT4_Ia',
-    code1: 'SubmarinePump2_MOT4_Ia',
-    type: '',
-  },
-  {
-    title: '加药泵电压',
-    code0: 'SubmarinePump1_MOT4_Uab',
-    code1: 'SubmarinePump2_MOT4_Uab',
-    type: '',
-  },
-];
-//lxh
-export const dewateringPumpDataNew=[
-  {
-    title: '流量1',
-    code0: 'CentrifugalPump1_FlowSensor1_InputFlux',
-    code1: 'CentrifugalPump2_FlowSensor1_InputFlux',
-    type: '',
-  },
-  {
-    title: '流量2',
-    code0: 'CentrifugalPump1_FlowSensor2_InputFlux',
-    code1: 'CentrifugalPump2_FlowSensor2_InputFlux',
-    type: '',
-  },
-  {
-    title: '泵轴温',
-    code0: 'CentrifugalPump1_PU_Temp',
-    code1: 'CentrifugalPump2_PU_Temp',
-    type: '',
-  },
-  {
-    title: '减速机轴温',
-    code0: 'CentrifugalPump1_GEA_Temp',
-    code1: 'CentrifugalPump2_GEA_Temp',
-    type: '',
-  },
-  {
-    title: '水封液位1',
-    code0: 'CentrifugalPump1_LiquidLevelSensor1_Level',
-    code1: 'CentrifugalPump2_LiquidLevelSensor1_Level',
-    type: '',
-  },
-  {
-    title: '水封液位2',
-    code0: 'CentrifugalPump1_LiquidLevelSensor2_Level',
-    code1: 'CentrifugalPump2_LiquidLevelSensor2_Level',
-    type: '',
-  },
-  {
-    title: '水封液位3',
-    code0: 'CentrifugalPump1_LiquidLevelSensor3_Level',
-    code1: 'CentrifugalPump2_LiquidLevelSensor3_Level',
-    type: '',
-  },
-  {
-    title: '电机轴温',
-    code0: 'CentrifugalPump1_MOT_FrontAxleTemp',
-    code1: 'CentrifugalPump2_MOT_FrontAxleTemp',
-    type: '',
-  },
-  {
-    title: '电机电压',
-    code0: 'CentrifugalPump1_MOT1_AvgVoltage',
-    code1: 'CentrifugalPump2_MOT1_AvgVoltage',
-    type: '',
-  },
-]
-//lxh
-export const otherPumpDataNew=[
-  {
-    title: '控制状态',
-    code0: 'FeedSG101_ControlState',
-    code1: 'FeedSG102_ControlState',
-    type: 'sign',
-  },
-  {
-    title: '健康状态',
-    code0: 'FeedSG101_Healthy',
-    code1: 'FeedSG102_Healthy',
-    type: 'sign',
-  },
-  {
-    title: '联动准备好',
-    code0: 'CentrifugalPump1_PU_InterlockReady',
-    code1: 'CentrifugalPump2_PU_InterlockReady',
-    type: 'sign',
-  },
-  {
-    title: '联动启动失败',
-    code0: 'CentrifugalPump1_PU_InterlockStartFail',
-    code1: 'CentrifugalPump2_PU_InterlockStartFail',
-    type: 'sign',
-  },
-  {
-    title: '联动启动中',
-    code0: 'CentrifugalPump1_PU_InterlockStarting',
-    code1: 'CentrifugalPump2_PU_InterlockStarting',
-    type: 'sign',
-  },
-  {
-    title: '联动停止中',
-    code0: 'CentrifugalPump1_PU_InterlockStoping',
-    code1: 'CentrifugalPump2_PU_InterlockStoping',
-    type: 'sign',
-  },
-  {
-    title: '后轴超温报警',
-    code0: 'CentrifugalPump1_MOT_BackAxleOverTempAlarm',
-    code1: 'CentrifugalPump2_MOT_BackAxleOverTempAlarm',
-    type: 'sign',
-  },
-  {
-    title: 'PLC通讯状态',
-    code0: 'Starter1_PLCState',
-    code1: 'Starter2_PLCState',
-    type: 'sign',
-  },
-  {
-    title: '低压电压',
-    code0: 'T101_LowVoltSwith_SysVoltage',
-    code1: 'T102_LowVoltSwith_SysVoltage',
-    type: '',
-  },
-  {
-    title: '低压电流',
-    code0: 'T101_LowVoltSwith_Current',
-    code1: 'T102_LowVoltSwith_Current',
-    type: '',
-  },
-  {
-    title: '高压电压',
-    code0: 'T101_HighVoltSwitch_SysVoltage',
-    code1: 'T102_HighVoltSwitch_SysVoltage',
-    type: '',
-  },
-  {
-    title: '高压电流',
-    code0: 'T101_HighVoltSwitch_Current',
-    code1: 'T102_HighVoltSwitch_Current',
-    type: '',
-  },
-  {
-    title: '高压温度',
-    code0: 'T101_HighVoltSwitch_Temp',
-    code1: 'T102_HighVoltSwitch_Temp',
-    type: '',
-  },
- 
-  {
-    title: 'Uca',
-    code0: 'FeedSG101_Uca',
-    code1: 'FeedSG102_Uca',
-    type: '',
-  },
-  {
-    title: 'C相绕组温度',
-    code0: 'CentrifugalPump1_MOT_PhaseCTemp',
-    code1: 'CentrifugalPump2_MOT_PhaseCTemp',
-    type: '',
-  },
-  {
-    title: 'B相超温报警',
-    code0: 'CentrifugalPump1_MOT_PhaseBTempAlarm',
-    code1: 'CentrifugalPump2_MOT_PhaseBTempAlarm',
-    type: 'sign',
-  },
-  {
-    title: 'B相绕组温度',
-    code0: 'CentrifugalPump1_MOT_PhaseBTemp',
-    code1: 'CentrifugalPump2_MOT_PhaseBTemp',
-    type: '',
-  },
-  {
-    title: 'A相超温报警',
-    code0: 'CentrifugalPump1_MOT_PhaseATempAlarm',
-    code1: 'CentrifugalPump2_MOT_PhaseATempAlarm',
-    type: '',
-  },
-  {
-    title: 'A相绕组温度',
-    code0: 'CentrifugalPump1_MOT_PhaseATemp',
-    code1: 'CentrifugalPump2_MOT_PhaseATemp',
-    type: '',
-  },
-  {
-    title: '前轴温度',
-    code0: 'CentrifugalPump1_MOT_FrontAxleTemp',
-    code1: 'CentrifugalPump2_MOT_FrontAxleTemp',
-    type: '',
-  },
-  {
-    title: '前轴超温报警',
-    code0: 'CentrifugalPump1_MOT_FrontAxleOverTempAlarm',
-    code1: 'CentrifugalPump2_MOT_FrontAxleOverTempAlarm',
-    type: '',
-  },
-  {
-    title: '后轴温度',
-    code0: 'CentrifugalPump1_MOT_BackAxleTemp',
-    code1: 'CentrifugalPump2_MOT_BackAxleTemp',
-    type: '',
-  },
-  
-  {
-    title: '计时器开',
-    code0: 'Starter1_RunTimerOpen',
-    code1: 'Starter2_RunTimerOpen',
-    type: '',
-  },
-  {
-    title: '计时器关',
-    code0: 'Starter1_RunTimerClose',
-    code1: 'Starter2_RunTimerClose',
-    type: '',
-  },
-]
-
+import { reactive, defineAsyncComponent } from 'vue';
+import { useGlobSetting } from '/@/hooks/setting';
+import { Interface } from 'readline';
 
 export const warningConfig = reactive({
   header: ['设备名称', '预警信息', '时间'],
@@ -626,9 +287,58 @@ export const modelMonitor = [
     title: '泵站内温度(℃)',
     code: 'temp',
   },
-
   {
     title: '泵站输入管道内温度(℃)',
     code: 'pipeTemp',
   },
 ];
+
+export function getComponent() {
+  const { sysOrgCode } = useGlobSetting();
+  let gasPumpHome;
+  switch (sysOrgCode) {
+    case 'sdmtjtbetmk': // 布尔台
+      gasPumpHome = defineAsyncComponent(() => import('./components/gasPumpHome.vue'));
+      return gasPumpHome;
+    default:
+      gasPumpHome = defineAsyncComponent(() => import('./components/gasPumpHomeCC.vue'));
+      return gasPumpHome;
+  }
+}
+
+export async function getMonitorData(deviceType) {
+  const globSetting = useGlobSetting();
+  switch (globSetting.sysOrgCode) {
+    case 'sdmtjtcctmk':
+      return await import('./gasPump.dataCc');
+    case 'sdmtjtcctrk':
+      if (deviceType == 'pump_under') {
+        return await import('./gasPump.dataCc2_1');
+      } else if (deviceType == 'pump_under_31') {
+        return await import('./gasPump.dataCc2_2');
+      }
+    default: //默认
+      if (deviceType == 'pump_over') {
+        return await import('./gasPump.dataCc2_1');
+      } else if (deviceType == 'pump_under') {
+        return await import('./gasPump.dataCc2_2');
+      }
+  }
+}
+interface deviceChildType {
+  title: string;
+  key: string[];
+  childTitle: string[];
+}
+interface propertyListType {
+  title: string;
+  type: string;
+  code: string;
+}
+export interface devicePropertyType {
+  type: string;
+  title: string;
+  stateHeader: [];
+  children: deviceChildType[];
+  list: propertyListType[];
+}

+ 352 - 0
src/views/vent/monitorManager/gasPumpMonitor/gasPump.dataCc.ts

@@ -0,0 +1,352 @@
+export const leftMonitor = [
+  {
+    type: 'list',
+    title: '瓦斯泵',
+    stateHeader: [],
+    children: [
+      {
+        title: '',
+        childTitle: ['1#瓦斯泵磁力启动器', '2#瓦斯泵磁力启动器'],
+        key: ['PD13_Starter201', 'PD13_Starter202'],
+        list: [
+          {
+            title: 'AB电压(V)',
+            code: '_SysVoltage',
+            type: '',
+          },
+          {
+            title: '额定电流(A)',
+            code: '_RatedCurrent',
+            type: '',
+          },
+          {
+            title: 'A相电流(A)',
+            code: '_Ia',
+            type: '',
+          },
+          {
+            title: 'B相电流(A)',
+            code: '_Ib',
+            type: '',
+          },
+          {
+            title: 'C相电流(A)',
+            code: '_Ic',
+            type: '',
+          },
+          {
+            title: '漏电电阻(Ω)',
+            code: '_LeakageResistance',
+            type: '',
+          },
+        ],
+      },
+    ],
+  },
+  {
+    type: 'list',
+    title: '排水泵',
+    stateHeader: [],
+    children: [
+      {
+        title: '',
+        childTitle: [],
+        key: ['PD13_Starter208'],
+        list: [
+          {
+            title: '额定电压(V)',
+            code: '_RatedVoltage',
+            type: '',
+          },
+          {
+            title: '额定电流(A)',
+            code: '_RatedCurrent',
+            type: '',
+          },
+          {
+            title: '有功功率(KW)',
+            code: '_Power',
+            type: '',
+          },
+          {
+            title: '电流过载倍数',
+            code: '_OverCurrentMul',
+            type: '',
+          },
+          {
+            title: 'A相电流(A)',
+            code: '_Ia',
+            type: '',
+          },
+          {
+            title: 'B相电流(A)',
+            code: '_Ib',
+            type: '',
+          },
+          {
+            title: 'C相电流(A)',
+            code: '_Ic',
+            type: '',
+          },
+        ],
+      },
+    ],
+  },
+  {
+    type: 'list',
+    title: '循环水泵',
+    stateHeader: [],
+    children: [
+      {
+        title: '',
+        childTitle: ['1#循环水泵', '2#循环水泵'],
+        key: ['PD13_Starter203', 'PD13_Starter204'],
+        list: [
+          {
+            title: '额定电压(V)',
+            code: '_RatedVoltage',
+            type: '',
+          },
+          {
+            title: '额定电流(A)',
+            code: '_RatedCurrent',
+            type: '',
+          },
+          {
+            title: '有功功率(KW)',
+            code: '_Power',
+            type: '',
+          },
+          {
+            title: '电流过载倍数',
+            code: '_OverCurrentMul',
+            type: '',
+          },
+          {
+            title: 'A相电流(A)',
+            code: '_Ia',
+            type: '',
+          },
+          {
+            title: 'B相电流(A)',
+            code: '_Ib',
+            type: '',
+          },
+          {
+            title: 'C相电流(A)',
+            code: '_Ic',
+            type: '',
+          },
+        ],
+      },
+    ],
+  },
+];
+
+export const rightMonitor = [
+  {
+    type: 'table',
+    title: '阀门运行状态',
+    stateHeader: ['设备名称', '开启', '停止', '健康', '模式'],
+    children: [
+      {
+        title: '注水阀',
+        key: ['PD13_SG1', 'PD13_SG2'],
+        childTitle: ['1#注水阀', '2#注水阀'],
+      },
+      {
+        title: '抽气阀',
+        key: ['PD13_SG4', 'PD13_SG6'],
+        childTitle: ['1#抽气阀', '2#抽气阀'],
+      },
+      {
+        title: '排气阀',
+        key: ['PD13_SG3', 'PD13_SG5'],
+        childTitle: ['1#排气阀', '2#排气阀'],
+      },
+    ],
+    list: [
+      {
+        title: '开启',
+        type: '',
+        code: '_HMIOpen',
+      },
+      {
+        title: '停止',
+        type: '',
+        code: '_HMIStop',
+      },
+      {
+        title: '健康',
+        type: '',
+        code: '_Healthy',
+      },
+      {
+        title: '模式',
+        type: '',
+        code: '_CtrlMode',
+        dict: { '1': '控制', '0': '就地' },
+      },
+    ],
+  },
+  {
+    type: 'list',
+    title: '瓦斯泵回路监测',
+    stateHeader: [],
+    children: [
+      {
+        title: '',
+        childTitle: ['1回路', '2回路', '3回路', '4回路'],
+        key: ['PD13_SG1_Loop1', 'PD13_SG1_Loop2', 'PD13_SG1_Loop3', 'PD13_SG1_Loop4'],
+        list: [
+          {
+            title: '运行状态',
+            code: '_Status',
+            type: 'sign',
+          },
+          {
+            title: '回路电压(V)',
+            code: '_SysVoltage',
+            type: '',
+          },
+          {
+            title: '额定电流(A)',
+            code: '_RatedCurrent',
+            type: '',
+          },
+          {
+            title: 'A相电流(A)',
+            code: '_Ia',
+            type: '',
+          },
+          {
+            title: 'B相电流(A)',
+            code: '_Ib',
+            type: '',
+          },
+          {
+            title: 'C相电流(A)',
+            code: '_Ic',
+            type: '',
+          },
+        ],
+      },
+    ],
+  },
+];
+
+export const detailCtrl = [
+  {
+    title: '回路控制',
+    type: [
+      {
+        title: '1回路',
+        childTitle: ['1回路'],
+        key: ['PD13_SG1_Loop1'],
+      },
+      {
+        title: '2回路',
+        childTitle: ['2回路'],
+        key: ['PD13_SG1_Loop2'],
+      },
+      {
+        title: '3回路',
+        childTitle: ['3回路'],
+        key: ['PD13_SG1_Loop3'],
+      },
+      {
+        title: '4回路',
+        childTitle: ['4回路'],
+        key: ['PD13_SG1_Loop4'],
+      },
+    ],
+    items: [
+      {
+        title: '分闸运行',
+        code: '_HMISwitchOff',
+      },
+      {
+        title: '合闸运行',
+        code: '_HMISwitchOn',
+      },
+      {
+        title: '远程短路试验',
+        code: '_HMIShortTest',
+      },
+      {
+        title: '远程漏电试验',
+        code: '_HMILeakageTest',
+      },
+    ],
+  },
+  {
+    title: '泵站控制',
+    type: [
+      {
+        title: '瓦斯泵',
+        childTitle: ['1#瓦斯泵', '2#瓦斯泵'],
+        key: ['PD13_Starter201', 'PD13_Starter202'],
+      },
+      {
+        title: '排水泵',
+        childTitle: ['1#排水泵', '2#排水泵'],
+        key: ['PD13_Starter208'],
+      },
+      {
+        title: '注水泵',
+        childTitle: ['1#排水泵', '2#排水泵'],
+        key: ['PD13_Starter203', 'PD13_Starter204'],
+      },
+    ],
+    items: [
+      {
+        title: '远程短路试验',
+        code: '_HMIShortTest',
+      },
+      {
+        title: '远程漏电试验',
+        code: '_HMILeakageTest',
+      },
+      {
+        title: '通信合闸安全校验',
+        code: '_SafetyVerify',
+      },
+    ],
+  },
+  {
+    title: '阀门控制',
+    type: [
+      {
+        title: '注水阀',
+        childTitle: ['1#注水阀', '2#注水阀'],
+        key: ['PD13_SG1', 'PD13_SG2'],
+      },
+      {
+        title: '抽气阀',
+        childTitle: ['1#抽气阀', '2#抽气阀'],
+        key: ['PD13_SG4', 'PD13_SG6'],
+      },
+      {
+        title: '排气阀',
+        childTitle: ['1#排气阀', '2#排气阀'],
+        key: ['PD13_SG3', 'PD13_SG5'],
+      },
+    ],
+    items: [
+      {
+        title: '开启',
+        code: '_HMIOpen',
+      },
+      {
+        title: '关闭',
+        code: '_HMIClose',
+      },
+      {
+        title: '停止',
+        code: '_HMIStop',
+      },
+    ],
+  },
+];
+
+export const modelMonitor = [];

+ 418 - 0
src/views/vent/monitorManager/gasPumpMonitor/gasPump.dataCc2_1.ts

@@ -0,0 +1,418 @@
+export const leftMonitor = [
+  {
+    type: 'list',
+    title: '瓦斯泵',
+    stateHeader: [],
+    children: [
+      {
+        title: '',
+        childTitle: ['1#瓦斯泵', '2#瓦斯泵'],
+        key: ['CentrifugalPump1_MOT_', 'CentrifugalPump2_MOT_'],
+        list: [
+          {
+            title: '上位启动',
+            code: 'HMIStart',
+            type: 'sign',
+          },
+          {
+            title: '联动启动',
+            code: 'InterlockStart',
+            type: 'warning',
+          },
+          {
+            title: '联动停止',
+            code: 'InterlockStop',
+            type: 'sign',
+          },
+          {
+            title: '健康信号',
+            code: 'Healthy',
+            type: 'sign',
+          },
+          {
+            title: '平均电压(V)',
+            code: 'AvgVoltage',
+            type: '',
+          },
+          {
+            title: 'A相电流(A)',
+            code: 'Ia',
+            type: '',
+          },
+          {
+            title: 'B相电流(A)',
+            code: 'Ib',
+            type: '',
+          },
+          {
+            title: 'C相电流(A)',
+            code: 'Ic',
+            type: '',
+          },
+          {
+            title: '前轴温度(℃)',
+            code: 'FrontAxleTemp',
+            type: '',
+          },
+          {
+            title: '后轴温度(℃)',
+            code: 'BackAxleTemp',
+            type: '',
+          },
+        ],
+      },
+    ],
+  },
+  {
+    type: 'list',
+    title: '冷却泵',
+    stateHeader: [],
+    children: [
+      {
+        title: '',
+        childTitle: ['1#冷却泵', '2#冷却泵'],
+        key: ['SubmarinePump_MOT_', 'SubmarinePump2_MOT_'],
+        list: [
+          {
+            title: '健康信号',
+            code: 'Healthy',
+            type: 'sign',
+          },
+          {
+            title: '有功功率(KW)',
+            code: 'Power',
+            type: '',
+          },
+          {
+            title: '平均电压(V)',
+            code: 'AvgVoltage',
+            type: '',
+          },
+          {
+            title: 'A相电流(A)',
+            code: 'Ia',
+            type: '',
+          },
+          {
+            title: 'B相电流(A)',
+            code: 'Ib',
+            type: '',
+          },
+          {
+            title: 'C相电流(A)',
+            code: 'Ic',
+            type: '',
+          },
+        ],
+      },
+    ],
+  },
+];
+
+export const rightMonitor = [
+  {
+    type: 'table',
+    title: '磁力启动器运行状态',
+    stateHeader: ['设备名称', '断路器', '合闸输出', '分闸输出', '状态'],
+    children: [
+      {
+        title: '启动器1',
+        key: ['Starter1_'],
+        childTitle: ['启动器1'],
+      },
+      {
+        title: '启动器2',
+        key: ['Starter2_'],
+        childTitle: ['启动器2'],
+      },
+      {
+        title: '启动器3',
+        key: ['Starter3_'],
+        childTitle: ['启动器3'],
+      },
+      {
+        title: '启动器4',
+        key: ['Starter4_'],
+        childTitle: ['启动器4'],
+      },
+      {
+        title: '启动器5',
+        key: ['Starter5_'],
+        childTitle: ['启动器5'],
+      },
+    ],
+    list: [
+      {
+        title: '断路器',
+        type: '',
+        code: 'CBStatus',
+        dict: { '1': '合闸', '0': '分闸' },
+      },
+      {
+        title: '合闸输出',
+        type: '',
+        code: 'SwitchOnOutput',
+      },
+      {
+        title: '分闸输出',
+        type: '',
+        code: 'SwitchOffOutput',
+      },
+
+      {
+        title: '状态',
+        type: '',
+        code: 'PLCState',
+        dict: { '1': '连接', '0': '断开' },
+      },
+    ],
+  },
+  {
+    type: 'table',
+    title: '阀门运行状态',
+    stateHeader: ['设备名称', '开启', '停止', '健康', '模式'],
+    children: [
+      {
+        title: '抽气阀',
+        key: ['CentrifugalPump1_GVL1_', 'CentrifugalPump1_GVL2_'],
+        childTitle: ['1#注水阀', '2#注水阀'],
+      },
+      {
+        title: '排气阀',
+        key: ['CentrifugalPump2_GVL1_', 'CentrifugalPump2_GVL2_'],
+        childTitle: ['1#排气阀', '2#排气阀'],
+      },
+    ],
+    list: [
+      {
+        title: '开启',
+        type: '',
+        code: 'OpenLimit',
+      },
+      {
+        title: '停止',
+        type: '',
+        code: 'CloseLimit',
+      },
+      {
+        title: '健康',
+        type: '',
+        code: 'Healthy',
+      },
+      {
+        title: '模式',
+        type: '',
+        code: 'CtrlMode',
+        dict: { '1': '控制', '0': '就地' },
+      },
+    ],
+  },
+  {
+    type: 'list',
+    title: '瓦斯泵预警监测',
+    stateHeader: [],
+    children: [
+      {
+        title: '',
+        childTitle: ['1#瓦斯泵', '2#瓦斯泵'],
+        key: ['CentrifugalPump1_MOT_', 'CentrifugalPump2_MOT_'],
+        list: [
+          {
+            title: 'A相超温报警',
+            code: 'PhaseATempAlarm',
+            type: 'warning',
+          },
+          {
+            title: 'B相超温报警',
+            code: 'PhaseBTempAlarm',
+            type: 'warning',
+          },
+          {
+            title: 'C相超温报警',
+            code: 'PhaseCTempAlarm',
+            type: 'warning',
+          },
+          {
+            title: '前轴超温报警',
+            code: 'FrontAxleOverTempAlarm',
+            type: 'warning',
+          },
+          {
+            title: '后轴超温报警',
+            code: 'BackAxleOverTempAlarm',
+            type: 'warning',
+          },
+        ],
+      },
+    ],
+  },
+];
+
+export const detailCtrl = [
+  {
+    title: '回路控制',
+    type: [
+      {
+        title: '1回路',
+        childTitle: ['1回路'],
+        key: ['PD13_SG1_Loop1'],
+      },
+      {
+        title: '2回路',
+        childTitle: ['2回路'],
+        key: ['PD13_SG1_Loop2'],
+      },
+      {
+        title: '3回路',
+        childTitle: ['3回路'],
+        key: ['PD13_SG1_Loop3'],
+      },
+      {
+        title: '4回路',
+        childTitle: ['4回路'],
+        key: ['PD13_SG1_Loop4'],
+      },
+    ],
+    items: [
+      {
+        title: '分闸运行',
+        code: '_HMISwitchOff',
+      },
+      {
+        title: '合闸运行',
+        code: '_HMISwitchOn',
+      },
+      {
+        title: '远程短路试验',
+        code: '_HMIShortTest',
+      },
+      {
+        title: '远程漏电试验',
+        code: '_HMILeakageTest',
+      },
+    ],
+  },
+  {
+    title: '泵站控制',
+    type: [
+      {
+        title: '瓦斯泵',
+        childTitle: ['1#瓦斯泵', '2#瓦斯泵'],
+        key: ['PD13_Starter201', 'PD13_Starter202'],
+      },
+      {
+        title: '排水泵',
+        childTitle: ['1#排水泵', '2#排水泵'],
+        key: ['PD13_Starter208'],
+      },
+      {
+        title: '注水泵',
+        childTitle: ['1#排水泵', '2#排水泵'],
+        key: ['PD13_Starter203', 'PD13_Starter204'],
+      },
+    ],
+    items: [
+      {
+        title: '远程短路试验',
+        code: '_HMIShortTest',
+      },
+      {
+        title: '远程漏电试验',
+        code: '_HMILeakageTest',
+      },
+      {
+        title: '通信合闸安全校验',
+        code: '_SafetyVerify',
+      },
+    ],
+  },
+  {
+    title: '阀门控制',
+    type: [
+      {
+        title: '注水阀',
+        childTitle: ['1#注水阀', '2#注水阀'],
+        key: ['PD13_SG1', 'PD13_SG2'],
+      },
+      {
+        title: '抽气阀',
+        childTitle: ['1#抽气阀', '2#抽气阀'],
+        key: ['PD13_SG4', 'PD13_SG6'],
+      },
+      {
+        title: '排气阀',
+        childTitle: ['1#排气阀', '2#排气阀'],
+        key: ['PD13_SG3', 'PD13_SG5'],
+      },
+    ],
+    items: [
+      {
+        title: '开启',
+        code: '_HMIOpen',
+      },
+      {
+        title: '关闭',
+        code: '_HMIClose',
+      },
+      {
+        title: '停止',
+        code: '_HMIStop',
+      },
+    ],
+  },
+];
+
+export const modelMonitor = [
+  {
+    title: '泵站内温度(℃)',
+    code: 'TemperatureSensor_Temp',
+  },
+  {
+    title: '水仓液位(m)',
+    code: 'LiquidLevelSensor_Level',
+  },
+  {
+    title: '泵站温度低报警',
+    code: 'TemperatureSensor_TemperatureLowAlarm',
+    type: 'warning',
+  },
+  {
+    title: '泵站温度高报警',
+    code: 'TemperatureSensor_TemperatureHighAlarm',
+    type: 'warning',
+  },
+  {
+    title: '水仓液位低报警',
+    code: 'LiquidLevelSensor_LowWaterAlarm',
+    type: 'warning',
+  },
+  {
+    title: '水仓液位高报警',
+    code: 'LiquidLevelSensor_HighWaterAlarm',
+    type: 'warning',
+  },
+  {
+    title: '1#瓦斯泵A相绕组温度(℃)',
+    code: 'CentrifugalPump1_MOT_PhaseATemp',
+  },
+  {
+    title: '2#瓦斯泵A相绕组温度(℃)',
+    code: 'CentrifugalPump2_MOT_PhaseATemp',
+  },
+  {
+    title: '1#瓦斯泵B相绕组温度(℃)',
+    code: 'CentrifugalPump1_MOT_PhaseBTemp',
+  },
+  {
+    title: '2#瓦斯泵B相绕组温度(℃)',
+    code: 'CentrifugalPump2_MOT_PhaseBTemp',
+  },
+  {
+    title: '1#瓦斯泵C相绕组温度(℃)',
+    code: 'CentrifugalPump1_MOT_PhaseCTemp',
+  },
+  {
+    title: '2#瓦斯泵C相绕组温度(℃)',
+    code: 'CentrifugalPump2_MOT_PhaseCTemp',
+  },
+];

+ 322 - 0
src/views/vent/monitorManager/gasPumpMonitor/gasPump.dataCc2_2.ts

@@ -0,0 +1,322 @@
+export const leftMonitor = [
+  {
+    type: 'list',
+    title: '罗茨泵',
+    stateHeader: [],
+    children: [
+      {
+        title: '',
+        childTitle: ['1#罗茨泵', '2#罗茨泵'],
+        key: ['CentrifugalPump1_', 'CentrifugalPump2_'],
+        list: [
+          {
+            title: '淡水流量(mg/㎡)',
+            code: 'FlowSensor1_InputFlux',
+            type: '',
+          },
+          {
+            title: '浓水流量2(mg/㎡)',
+            code: 'FlowSensor2_InputFlux',
+            type: '',
+          },
+          {
+            title: '除尘喷雾流量(mg/㎡)',
+            code: 'FlowSensor3_InputFlux',
+            type: '',
+          },
+          {
+            title: '水封液位1(h)',
+            code: 'LiquidLevelSensor1_Level',
+            type: '',
+          },
+          {
+            title: '水封液位2(h)',
+            code: 'LiquidLevelSensor2_Level',
+            type: '',
+          },
+          {
+            title: '水封液位3(h)',
+            code: 'LiquidLevelSensor3_Level',
+            type: '',
+          },
+          {
+            title: '变频器状态',
+            code: 'VFD_Status',
+            type: '',
+            dict: { '1': '开启', '0': '停止' },
+          },
+          {
+            title: '泵轴温(℃)',
+            code: 'PU_Temp',
+            type: '',
+          },
+          {
+            title: '减速机轴温(℃)',
+            code: 'GEA_Temp',
+            type: '',
+          },
+          {
+            title: '进气阀开度(°)',
+            code: 'GVL1_OpenDegree',
+            type: '',
+          },
+          {
+            title: '排气阀开度(°)',
+            code: 'GVL2_OpenDegree',
+            type: '',
+          },
+          {
+            title: '进水阀开度(°)',
+            code: 'GVL4_Status',
+            type: '',
+          },
+          {
+            title: '排水阀开度(°)',
+            code: 'GVL3_Status',
+            type: '',
+          },
+        ],
+      },
+    ],
+  },
+];
+
+export const rightMonitor = [
+  {
+    type: 'list',
+    title: '水泵',
+    stateHeader: [],
+    children: [
+      {
+        title: '',
+        childTitle: ['进水泵', '排水泵'],
+        key: ['SubmarinePump1_', 'SubmarinePump2_'],
+        list: [
+          {
+            title: '启停状态',
+            code: 'PU1_Status1',
+            type: 'sign',
+          },
+          {
+            title: '水泵电压(V)',
+            code: 'MOT1_Uab',
+            type: '',
+          },
+          {
+            title: '水泵电流(A)',
+            code: 'MOT1_Ia',
+            type: '',
+          },
+        ],
+      },
+    ],
+  },
+  {
+    type: 'list',
+    title: '软化水监测',
+    stateHeader: [],
+    children: [
+      {
+        title: '',
+        childTitle: ['1#软化水', '2#软化水'],
+        key: ['SubmarinePump1_', 'SubmarinePump2_'],
+        list: [
+          {
+            title: '产水液位(h)',
+            code: 'LiquidLevelSensor1_Level',
+            type: '',
+          },
+          {
+            title: '浓水出口压力(Pa)',
+            code: 'PressureSensor1_OutPressure',
+            type: '',
+          },
+          {
+            title: '膜前入口压力(Pa)',
+            code: 'PressureSensor1_InletPressure',
+            type: '',
+          },
+          {
+            title: '淡水流量(mg/㎡)',
+            code: 'FlowSensor1_InputFlux',
+            type: '',
+          },
+          {
+            title: '浓水流量(mg/㎡)',
+            code: 'FlowSensor2_InputFlux',
+            type: '',
+          },
+        ],
+      },
+    ],
+  },
+];
+
+export const detailCtrl = [
+  {
+    title: '回路控制',
+    type: [
+      {
+        title: '1回路',
+        childTitle: ['1回路'],
+        key: ['PD13_SG1_Loop1'],
+      },
+      {
+        title: '2回路',
+        childTitle: ['2回路'],
+        key: ['PD13_SG1_Loop2'],
+      },
+      {
+        title: '3回路',
+        childTitle: ['3回路'],
+        key: ['PD13_SG1_Loop3'],
+      },
+      {
+        title: '4回路',
+        childTitle: ['4回路'],
+        key: ['PD13_SG1_Loop4'],
+      },
+    ],
+    items: [
+      {
+        title: '分闸运行',
+        code: '_HMISwitchOff',
+      },
+      {
+        title: '合闸运行',
+        code: '_HMISwitchOn',
+      },
+      {
+        title: '远程短路试验',
+        code: '_HMIShortTest',
+      },
+      {
+        title: '远程漏电试验',
+        code: '_HMILeakageTest',
+      },
+    ],
+  },
+  {
+    title: '泵站控制',
+    type: [
+      {
+        title: '瓦斯泵',
+        childTitle: ['1#瓦斯泵', '2#瓦斯泵'],
+        key: ['PD13_Starter201', 'PD13_Starter202'],
+      },
+      {
+        title: '排水泵',
+        childTitle: ['1#排水泵', '2#排水泵'],
+        key: ['PD13_Starter208'],
+      },
+      {
+        title: '注水泵',
+        childTitle: ['1#排水泵', '2#排水泵'],
+        key: ['PD13_Starter203', 'PD13_Starter204'],
+      },
+    ],
+    items: [
+      {
+        title: '远程短路试验',
+        code: '_HMIShortTest',
+      },
+      {
+        title: '远程漏电试验',
+        code: '_HMILeakageTest',
+      },
+      {
+        title: '通信合闸安全校验',
+        code: '_SafetyVerify',
+      },
+    ],
+  },
+  {
+    title: '阀门控制',
+    type: [
+      {
+        title: '注水阀',
+        childTitle: ['1#注水阀', '2#注水阀'],
+        key: ['PD13_SG1', 'PD13_SG2'],
+      },
+      {
+        title: '抽气阀',
+        childTitle: ['1#抽气阀', '2#抽气阀'],
+        key: ['PD13_SG4', 'PD13_SG6'],
+      },
+      {
+        title: '排气阀',
+        childTitle: ['1#排气阀', '2#排气阀'],
+        key: ['PD13_SG3', 'PD13_SG5'],
+      },
+    ],
+    items: [
+      {
+        title: '开启',
+        code: '_HMIOpen',
+      },
+      {
+        title: '关闭',
+        code: '_HMIClose',
+      },
+      {
+        title: '停止',
+        code: '_HMIStop',
+      },
+    ],
+  },
+];
+
+export const modelMonitor = [
+  {
+    title: '泵站内温度(℃)',
+    code: 'TemperatureSensor_Temp',
+  },
+  {
+    title: '水仓液位(m)',
+    code: 'LiquidLevelSensor_Level',
+  },
+  {
+    title: '泵站温度低报警',
+    code: 'TemperatureSensor_TemperatureLowAlarm',
+    type: 'warning',
+  },
+  {
+    title: '泵站温度高报警',
+    code: 'TemperatureSensor_TemperatureHighAlarm',
+    type: 'warning',
+  },
+  {
+    title: '水仓液位低报警',
+    code: 'LiquidLevelSensor_LowWaterAlarm',
+    type: 'warning',
+  },
+  {
+    title: '水仓液位高报警',
+    code: 'LiquidLevelSensor_HighWaterAlarm',
+    type: 'warning',
+  },
+  {
+    title: '1#瓦斯泵A相绕组温度(℃)',
+    code: 'CentrifugalPump1_MOT_PhaseATemp',
+  },
+  {
+    title: '2#瓦斯泵A相绕组温度(℃)',
+    code: 'CentrifugalPump2_MOT_PhaseATemp',
+  },
+  {
+    title: '1#瓦斯泵B相绕组温度(℃)',
+    code: 'CentrifugalPump1_MOT_PhaseBTemp',
+  },
+  {
+    title: '2#瓦斯泵B相绕组温度(℃)',
+    code: 'CentrifugalPump2_MOT_PhaseBTemp',
+  },
+  {
+    title: '1#瓦斯泵C相绕组温度(℃)',
+    code: 'CentrifugalPump1_MOT_PhaseCTemp',
+  },
+  {
+    title: '2#瓦斯泵C相绕组温度(℃)',
+    code: 'CentrifugalPump2_MOT_PhaseCTemp',
+  },
+];

+ 2 - 4
src/views/vent/monitorManager/gasPumpMonitor/index.vue

@@ -30,17 +30,15 @@ import customHeader from '/@/components/vent/customHeader.vue';
 import { onBeforeMount, ref, onMounted, onUnmounted, reactive, toRaw } from 'vue';
 import { list } from './gasPump.api';
 import BottomMenu from '/@/views/vent/comment/components/bottomMenu.vue';
-// import gasPumpHome from './components/gasPumpHome.vue';
-import gasPumpHome from './components/gasPumpHomeNew.vue';
+import {getComponent} from './gasPump.data'
 import gasPumpHistory from './components/gasPumpHistory.vue';
 import gasPumpHandleHistoryVue from './components/gasPumpHandleHistory.vue';
 import gasPumpAlarmHistory from './components/gasPumpAlarmHistory.vue';
 import { mountedThree, destroy, setModelType } from './gasPump.threejs';
 import { useRouter } from 'vue-router';
-import { nextTick } from 'vue';
 
 type DeviceType = { deviceType: string, deviceName: string, datalist: any[] };
-
+const gasPumpHome = getComponent()
 const { currentRoute } = useRouter();
 const activeKey = ref('monitor');
 const loading = ref(false);

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

@@ -284,15 +284,16 @@ export const initCameraCanvas = async (playerVal1) => {
 };
 
 export const mountedThree = (playerDom) => {
-  let { sysOrgCode } = useGlobSetting();
+  const { sysOrgCode } = useGlobSetting();
   return new Promise(async (resolve) => {
     model = new UseThree('#damper3D', '', '#deviceDetail');
     model.setEnvMap('test1');
-    sysOrgCode = 'yjmdjhmk';
     model.renderer.toneMappingExposure = 1.0;
     model.camera.position.set(100, 0, 1000);
     switch (sysOrgCode) {
-      case 'yjmdjhmk': //姚街金河矿
+      case 'yjmdsankuang': //窑街三矿
+      case 'yjmdhswmk': //窑街海石湾
+      case 'yjmdjhmk': //窑街金河矿
         const FmYj = await import('./gate.threejs.yj');
         if (FmYj) fm3 = new FmYj.default(model);
         if (fm3) fm3.mountedThree(playerDom);

+ 17 - 4
src/views/vent/monitorManager/gateMonitor/index.vue

@@ -36,9 +36,11 @@
         <div class="control-type row">
           <div class="control-title">控制模式:</div>
           <a-radio-group v-model:value="selectData.autoRoManual" @change="playAnimation(7)">
-            <a-radio :value="`0`">就地</a-radio>
-            <a-radio :value="`1`">远程</a-radio>
+            <template v-for="(item, index) in modelList" :key="index">
+              <a-radio :value="item.value" :disabled="hasPermission('btn:remote')">{{ item.text }}</a-radio>
+            </template>
           </a-radio-group>
+          <div v-if="hasPermission('btn:remote')" class="button-box" @click="playAnimation(7)">切换模式</div>
         </div>
         <!-- <div class="run-type row">
           <div class="control-title">运行状态:</div>
@@ -208,6 +210,8 @@
   import { useModal } from '/@/components/Modal';
   import { useCamera } from '/@/hooks/system/useCamera';
   import { usePermission } from '/@/hooks/web/usePermission';
+  import { getDictItems } from '/@/api/common/api';
+
   const { hasPermission } = usePermission();
 
   const globalConfig = inject('globalConfig');
@@ -223,7 +227,7 @@
   const scroll = reactive({
     y: 230,
   });
-
+  const modelList = ref<{ text: string; value: string }[]>([]);
   const frontDoorIsOpen = ref(false); //前门是否开启
   const backDoorIsOpen = ref(false); //后门是否开启
   const midDoorIsOpen = ref(false); //中间门是否开启
@@ -451,7 +455,7 @@
         }
         break;
 
-      case 7: // 关闭前后门
+      case 7: // 控制模式切换
         modalTitle.value = '控制模式切换';
         modalType.value = '7';
         modalIsShow.value = true;
@@ -569,6 +573,7 @@
       case '7': // 远程与就地
         data.paramcode = 'autoRoManualControl';
         data.value = selectData.autoRoManual;
+        selectData.autoRoManual = null;
     }
 
     if (data.paramcode) {
@@ -704,6 +709,7 @@
     modalIsShow.value = false;
     modalTitle.value = '';
     modalType.value = '';
+    selectData.autoRoManual = null;
   }
 
   // // 远程、就地切换
@@ -724,6 +730,7 @@
   // }
 
   onMounted(async () => {
+    modelList.value = await getDictItems('gateModel');
     loading.value = true;
     const playerDom = document.getElementById('fm-player1')?.getElementsByClassName('vjs-tech')[0];
     mountedThree(playerDom).then(async () => {
@@ -779,4 +786,10 @@
     -webkit-box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.2);
     background: #4288a444;
   }
+  :deep(.zxm-radio-disabled + span) {
+    color: #fff !important;
+  }
+  :deep(.zxm-radio-disabled .zxm-radio-inner::after) {
+    background-color: #127cb5 !important;
+  }
 </style>

+ 13 - 14
src/views/vent/monitorManager/mainFanMonitor/index.vue

@@ -190,16 +190,17 @@
                         <div
                           class="signal-round"
                           :class="{
-                            'signal-round-run': selectData[state.dataIndex.replace('Fan', 'Fan1')],
+                            'signal-round-run': selectData[state.dataIndex.replace('Fan', 'Fan1')] == '0',
                             'signal-round-warning':
-                              selectData[state.dataIndex.replace('Fan', 'Fan1')] !== undefined && !selectData[state.dataIndex.replace('Fan', 'Fan1')],
+                              selectData[state.dataIndex.replace('Fan', 'Fan1')] !== undefined &&
+                              selectData[state.dataIndex.replace('Fan', 'Fan1')] == '1',
                             'signal-round-gry': selectData[state.dataIndex.replace('Fan', 'Fan1')] === undefined,
                           }"
                         ></div>
                         <div class="vent-margin-l-8">{{
                           selectData[state.dataIndex.replace('Fan', 'Fan1')] === undefined
                             ? '无状态'
-                            : selectData[state.dataIndex.replace('Fan', 'Fan1')]
+                            : selectData[state.dataIndex.replace('Fan', 'Fan1')] == '0'
                             ? '正常'
                             : '异常'
                         }}</div>
@@ -214,17 +215,17 @@
                         <div
                           class="signal-round"
                           :class="{
-                            'signal-round-run': selectData[state.dataIndex.replace('Fan', 'Fan2')] == '1',
+                            'signal-round-run': selectData[state.dataIndex.replace('Fan', 'Fan2')] == '0',
                             'signal-round-warning':
                               selectData[state.dataIndex.replace('Fan', 'Fan2')] != undefined &&
-                              selectData[state.dataIndex.replace('Fan', 'Fan2')] == '0',
+                              selectData[state.dataIndex.replace('Fan', 'Fan2')] == '1',
                             'signal-round-gry': selectData[state.dataIndex.replace('Fan', 'Fan2')] == undefined,
                           }"
                         ></div>
                         <div class="vent-margin-l-8">{{
                           selectData[state.dataIndex.replace('Fan', 'Fan2')] == undefined
                             ? '无状态'
-                            : selectData[state.dataIndex.replace('Fan', 'Fan2')] == '1'
+                            : selectData[state.dataIndex.replace('Fan', 'Fan2')] == '0'
                             ? '正常'
                             : '异常'
                         }}</div>
@@ -286,17 +287,11 @@
           </a-tab-pane>
           <a-tab-pane key="4" tab="报警历史">
             <div class="tab-item" v-if="activeKey === '4'">
-              <AlarmHistoryTable
-                columns-type="alarm"
-                device-type="fanmain"
-                :device-list-api="baseList"
-                designScope="alarm-history"
-                :scroll="scroll"
-              />
+              <AlarmHistoryTable columns-type="alarm" device-type="fanmain" designScope="alarm-history" :scroll="scroll" />
             </div>
           </a-tab-pane>
           <a-tab-pane key="5" tab="操作历史">
-            <div class="tab-item" v-if="activeKey === '5'">
+            <div v-if="hasPermission('show:handlerHistory') && activeKey == '5'" class="tab-item">
               <HandlerHistoryTable
                 columns-type="operator_history"
                 device-type="fanmain"
@@ -428,6 +423,9 @@
   import type { BasicColumn } from '/@/components/Table/src/types/table';
   import { useCamera } from '/@/hooks/system/useCamera';
   import DeviceBaseInfo from '../comment/components/DeviceBaseInfo.vue';
+  import { usePermission } from '/@/hooks/web/usePermission';
+  const { hasPermission } = usePermission();
+
   const globalConfig = inject('globalConfig');
 
   const [registerModal, { openModal, closeModal }] = useModal();
@@ -554,6 +552,7 @@
             }
           }
           Object.assign(selectData, deviceBaseList.value, dataSource.value[selectRowIndex.value]);
+
           if (selectData['Fan1StartStatus'] == 1 && selectData['Fan2StartStatus'] == 0) {
             frontMonitorIsShow.value = true;
             backMonitorIsShow.value = false;

+ 10 - 5
src/views/vent/monitorManager/nitrogen/components/nitrogenAlarmHistory.vue

@@ -1,18 +1,23 @@
 <template>
   <div class="alarm-history">
-     <AlarmHistoryTable columns-type="alarm" device-type="pressurefan" :device-list-api="getTableList.bind(null, { devicekind: 'pressurefan' })" designScope="alarm-history" :scroll="{ y: 650 }"/>
+    <AlarmHistoryTable
+      columns-type="alarm"
+      device-type="pressurefan"
+      :device-list-api="getTableList.bind(null, { devicekind: 'pressurefan' })"
+      designScope="alarm-history"
+      :scroll="{ y: 650 }"
+    />
   </div>
 </template>
 <script setup lang="ts">
   import AlarmHistoryTable from '../../comment/AlarmHistoryTable.vue';
-  import { getTableList } from '../nitrogen.api'
-
+  import { getTableList } from '../nitrogen.api';
 </script>
 <style lang="less" scoped>
-  .alarm-history{
+  .alarm-history {
     width: 100%;
     position: fixed;
     top: 80px;
     margin-top: 20px;
   }
-</style>
+</style>

+ 161 - 96
src/views/vent/monitorManager/nitrogen/components/nitrogenHome.vue

@@ -8,7 +8,7 @@
     >
     </div>
   </template>
-  <div v-for="(sysItem, sysIndex) in monitorDataGroupArr" :key="sysIndex">
+  <div v-for="(sysItem, sysIndex) in monitorDataGroupArr" :key="sysIndex" style="position: absolute; z-index: -1">
     <div v-show="monitorDataGroupFlag == sysIndex + 1" :id="`nitrogenMonitorBox${sysIndex}`">
       <div v-for="(groupNum, index) in sysItem" :key="index" class="modal-monitor">
         <fourBorderBg :class="`kyj${groupNum}`" :id="`nitrogenMonitor${groupNum}`">
@@ -41,7 +41,7 @@
             </div>
           </template>
         </fourBorderBg>
-        <fourBorderBg :class="`cqg${groupNum}`" :id="`cqgMonitor${groupNum}`">
+        <fourBorderBg :class="`cqg${groupNum}`" :id="`cqgMonitor${groupNum}`" v-if="cqgMonitorList.length > 0">
           <div class="title">{{ `风包${groupNum}` }}</div>
           <template v-for="(cqgMonitor, cqgMonitorIndex) in cqgMonitorList" :key="cqgMonitorIndex">
             <div class="monitor-item">
@@ -60,7 +60,6 @@
       </div>
     </div>
   </div>
-
   <div class="nitrogen-home">
     <div style="position: absolute; color: #fff; top: 30px; pointer-events: auto; display: flex" v-if="monitorDataGroupArr.length > 1">
       <div
@@ -69,7 +68,8 @@
         class="tab-button-box"
         :class="{ 'tab-button-box-active': monitorDataGroupFlag == sysIndex + 1 }"
         @click="setMonitorGroupNum(sysIndex + 1)"
-        >{{ '压风系统' + (sysIndex + 1) }} (运行: <p style="padding: 0 5px"></p
+        >{{ '压风系统' + (sysIndex + 1) }}
+        <!-- (运行: <p style="padding: 0 5px"></p
         ><span
           :class="{
             'signal-round': true,
@@ -85,8 +85,8 @@
             'signal-round-gry': sysStateList[sysIndex] && !sysStateList[sysIndex].fault,
           }"
         ></span
-        ><p style="padding: 0 5px"></p> )</div
-      >
+        ><p style="padding: 0 5px"></p> ) -->
+      </div>
     </div>
     <div class="total-data">
       <div class="vent-flex-row">
@@ -112,8 +112,10 @@
                   <template #container>
                     <div class="state-item">
                       <div class="item-col" v-for="(preFan, preFanIndex) in preFanMonitorData" :key="preFanIndex">
-                        <span class="state-title">{{ preFan.title + (preFan.unit !== 'signal' ? `(${preFan.unit})` : '') }}</span>
-                        <span v-if="preFan.unit !== 'signal'" class="state-val">{{
+                        <span class="state-title">{{
+                          preFan.title + (preFan.unit !== 'signal' && preFan.unit !== 'warning' ? `(${preFan.unit})` : '')
+                        }}</span>
+                        <span v-if="preFan.unit !== 'signal' && preFan.unit !== 'warning'" class="state-val">{{
                           monitorData[preFan.code.replace(prefix[2], prefix[2] + groupNum)] >= 0
                             ? formatNum(Number(monitorData[preFan.code.replace(prefix[2], prefix[2] + groupNum)]))
                             : '-'
@@ -122,7 +124,10 @@
                           v-else
                           :class="{
                             'signal-round': true,
-                            'signal-round-warning': monitorData[preFan.code.replace(prefix[2], `${prefix[2]}${groupNum}`)] == '1',
+                            'signal-round-run':
+                              preFan.unit == 'signal' && monitorData[preFan.code.replace(prefix[2], `${prefix[2]}${groupNum}`)] != '1',
+                            'signal-round-warning':
+                              preFan.unit == 'warning' && monitorData[preFan.code.replace(prefix[2], `${prefix[2]}${groupNum}`)] == '1',
                             'signal-round-gry': monitorData[preFan.code.replace(prefix[2], `${prefix[2]}${groupNum}`)] != '1',
                           }"
                         ></span>
@@ -134,6 +139,29 @@
             </div>
           </div>
         </div>
+        <div class="lr-box right-box">
+          <div class="right-container" v-if="(btnSet && btnSet.length > 0) || (controlSet && controlSet.length > 0)">
+            <ventBox1>
+              <template #title>
+                <div>设备控制</div>
+              </template>
+              <template #container>
+                <div class="vent-flex-row btn-box" v-if="btnSet">
+                  <div class="btn btn1 ml-16px" v-for="(btn, index) in btnSet" :key="index">{{ btn.title }}</div>
+                </div>
+                <template v-if="controlSet">
+                  <div class="input-item" v-for="(item, index) in controlSet" :key="index">
+                    <div class="title-auto">{{ item.title }}:</div>
+                    <div>
+                      <a-input class="input-value" v-model="item.value" />
+                      <span class="btn btn1 vent-margin-l-8">保存</span>
+                    </div>
+                  </div>
+                </template>
+              </template>
+            </ventBox1>
+          </div>
+        </div>
         <div ref="playerRef" class="playerBox"> </div>
       </div>
     </div>
@@ -150,7 +178,8 @@
   import { formatNum } from '/@/utils/ventutil';
   import { useCamera } from '/@/hooks/system/useCamera';
 
-  const { monitorDataGroupArr, preFanMonitorData, preMonitorList, cqgMonitorList, prefix, getSysState, totalData } = getMonitorData();
+  const { monitorDataGroupArr, preFanMonitorData, preMonitorList, cqgMonitorList, prefix, getSysState, totalData, btnSet, controlSet } =
+    await getMonitorData();
   const loading = ref(true);
   const monitorDataGroupFlag = ref(1);
   const monitorDataGroup = ref<Number[]>([]);
@@ -223,32 +252,8 @@
 </script>
 
 <style lang="less" scoped>
+  @import '../../comment/less/workFace.less';
   @ventSpace: zxm;
-
-  .nitrogen-home {
-    width: 100%;
-    height: 100%;
-    display: flex;
-    justify-content: center;
-    position: relative;
-    .total-data {
-      position: absolute;
-      color: #e4cd00;
-      z-index: 9;
-      top: 50px;
-      right: 30px;
-      // display: flex;
-      font-size: 18px;
-      .item {
-        width: 200px;
-        margin-left: 30px;
-        .val {
-          color: #00d8ff;
-        }
-      }
-    }
-  }
-
   .compressorCss3D-box {
     .modal-monitor {
       position: absolute;
@@ -361,7 +366,7 @@
 
   .nitrogen-home {
     width: 100%;
-    height: calc(100% - 100px);
+    height: calc(100%);
     position: fixed;
     z-index: 99;
     display: flex;
@@ -370,12 +375,27 @@
     align-items: center;
     pointer-events: none;
     top: 60px;
+    .total-data {
+      position: absolute;
+      color: #e4cd00;
+      z-index: 9;
+      top: 20px;
+      right: 30px;
+      // display: flex;
+      font-size: 18px;
+      .item {
+        width: 200px;
+        margin-left: 30px;
+        .val {
+          color: #00d8ff;
+        }
+      }
+    }
     .nitrogen-container {
       width: 100%;
       height: calc(100%);
       display: flex;
       justify-content: space-between;
-      margin-bottom: 100px;
       position: relative;
       .device-state {
         width: 100%;
@@ -564,20 +584,9 @@
           }
         }
 
-        .item-l {
-          width: 335px;
-
-          .monitor-box {
-            // width: 335px;
-            background-color: #ffffff05;
-            // margin-left: 2px;
-            // border-radius: 5px;
-            // backdrop-filter: blur(10px);
-          }
-        }
-
         .right-box {
           width: 330px;
+          margin-top: 60px;
           .control-group {
             display: flex;
             // justify-content: space-around;
@@ -737,6 +746,12 @@
           overflow-y: auto;
           pointer-events: auto;
           direction: rtl;
+          .item-l {
+            width: 335px;
+            .monitor-box {
+              background-color: #ffffff05;
+            }
+          }
           .left-container {
             direction: ltr;
           }
@@ -749,7 +764,7 @@
     .playerBox {
       z-index: 9999;
       position: fixed;
-      top: 100px;
+      top: 200px;
       right: 15px;
       width: 100%;
       height: 100%;
@@ -766,66 +781,116 @@
         justify-content: end;
       }
     }
+    .tab-button-box {
+      display: inline-block;
+      position: relative;
+      padding: 5px;
+      // border: 1px transparent solid;
+      border-radius: 5px;
+      margin-left: 8px;
+      margin-right: 8px;
+      width: auto;
+      // height: 40px;
+      // border: 1px solid #65dbea;
+      height: 35px !important;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      color: #fff;
+      padding: 0 15px 5px 15px;
+      cursor: pointer;
+      &:hover {
+        background: linear-gradient(#2cd1ff55, #1eb0ff55);
+      }
+      &::before {
+        width: calc(100% - 6px);
+        height: 27px;
+        content: '';
+        position: absolute;
+        top: 3px;
+        right: 0;
+        left: 3px;
+        bottom: 0;
+        z-index: -1;
+        border-radius: inherit; /*important*/
+        background: linear-gradient(#1fa6cb, #127cb5);
+      }
+      &::after {
+        width: calc(100% + 32px);
+        height: 10px;
+        content: '';
+        position: absolute;
+        top: 28px;
+        right: 0;
+        left: -16px;
+        bottom: 0;
+        z-index: -1;
+        border-radius: inherit; /*important*/
+        background: url('/@/assets/images/vent/short-light.png') no-repeat;
+        background-position: center;
+        background-size: 100%;
+        z-index: 999;
+      }
+    }
+
+    .tab-button-box-active {
+      border: 1px solid #66989e !important;
+      &:hover {
+        background: none !important;
+      }
+      &::before {
+        background: linear-gradient(#1fa6cbcc, #127cb5cc) !important;
+      }
+    }
   }
-  .tab-button-box {
-    display: inline-block;
+  .btn {
+    padding: 2px 12px;
     position: relative;
-    padding: 5px;
-    // border: 1px transparent solid;
-    border-radius: 5px;
-    margin-left: 8px;
-    margin-right: 8px;
-    width: auto;
-    // height: 40px;
-    // border: 1px solid #65dbea;
-    height: 35px !important;
-    display: flex;
-    align-items: center;
-    justify-content: center;
+    border-radius: 2px;
     color: #fff;
-    padding: 0 15px 5px 15px;
     cursor: pointer;
-    &:hover {
-      background: linear-gradient(#2cd1ff55, #1eb0ff55);
-    }
+
     &::before {
-      width: calc(100% - 6px);
-      height: 27px;
-      content: '';
       position: absolute;
-      top: 3px;
-      right: 0;
-      left: 3px;
-      bottom: 0;
-      z-index: -1;
-      border-radius: inherit; /*important*/
-      background: linear-gradient(#1fa6cb, #127cb5);
-    }
-    &::after {
-      width: calc(100% + 32px);
-      height: 10px;
+      display: block;
       content: '';
-      position: absolute;
-      top: 28px;
-      right: 0;
-      left: -16px;
-      bottom: 0;
+      width: calc(100% - 4px);
+      height: calc(100% - 4px);
+      top: 2px;
+      left: 2px;
+      border-radius: 2px;
       z-index: -1;
-      border-radius: inherit; /*important*/
-      background: url('/@/assets/images/vent/short-light.png') no-repeat;
-      background-position: center;
-      background-size: 100%;
-      z-index: 999;
     }
   }
 
-  .tab-button-box-active {
-    border: 1px solid #66989e !important;
+  .btn1 {
+    border: 1px solid #5cfaff;
+
+    &::before {
+      background-image: linear-gradient(#2effee92, #0cb1d592);
+    }
+
     &:hover {
-      background: none !important;
+      border: 1px solid #5cfaffaa;
+
+      &::before {
+        background-image: linear-gradient(#2effee72, #0cb1d572);
+      }
     }
+  }
+
+  .btn2 {
+    border: 1px solid #e91927;
+    margin-left: 10px;
+
     &::before {
-      background: linear-gradient(#1fa6cbcc, #127cb5cc) !important;
+      background-image: linear-gradient(#b02533, #a31f2e);
+    }
+
+    &:hover {
+      &::before {
+        background-image: linear-gradient(#bd2e3ccc, #a31f2ecc);
+      }
     }
   }
 </style>

+ 14 - 137
src/views/vent/monitorManager/nitrogen/nitrogen.data.1.ts

@@ -1,69 +1,7 @@
 import { ref, defineAsyncComponent } from 'vue';
 import { useGlobSetting } from '/@/hooks/setting';
-import {
-  monitorDataGroupArr as monitorDataGroupArr_Jj,
-  preFanMonitorData as preFanMonitorData_Jj,
-  preMonitorList as preMonitorList_Jj,
-  cqgMonitorList as cqgMonitorList_Jj,
-  prefix as prefix_Jj,
-  getSysState as getSysState_Jj,
-  totalData as totalData_Ji,
-} from './nitrogen.dataJj'; // 锦界
-
-import {
-  monitorDataGroupArr as monitorDataGroupArr_Bet,
-  preFanMonitorData as preFanMonitorData_Bet,
-  preMonitorList as preMonitorList_Bet,
-  cqgMonitorList as cqgMonitorList_Bet,
-  prefix as prefix_Bet,
-  getSysState as getSysState_Bet,
-  totalData as totalData_Bet,
-} from './nitrogen.dataBet'; // 布尔台
-
-import {
-  monitorDataGroupArr as monitorDataGroupArr_Dlt,
-  preFanMonitorData as preFanMonitorData_Dlt,
-  preMonitorList as preMonitorList_Dlt,
-  cqgMonitorList as cqgMonitorList_Dlt,
-  prefix as prefix_Dlt,
-  getSysState as getSysState_Dlt,
-  totalData as totalData_Dlt,
-} from './nitrogen.dataDlt'; // 大柳塔
-
-import {
-  monitorDataGroupArr as monitorDataGroupArr_Hsw,
-  preFanMonitorData as preFanMonitorData_Hsw,
-  preMonitorList as preMonitorList_Hsw,
-  cqgMonitorList as cqgMonitorList_Hsw,
-  prefix as prefix_Hsw,
-  getSysState as getSysState_Hsw,
-  totalData as totalData_Hsw,
-} from './nitrogen.dataHsw'; // 大柳塔
-
-import {
-  monitorDataGroupArr as monitorDataGroupArr_Hjt,
-  preFanMonitorData as preFanMonitorData_Hjt,
-  preMonitorList as preMonitorList_Hjt,
-  cqgMonitorList as cqgMonitorList_Hjt,
-  prefix as prefix_Hjt,
-  getSysState as getSysState_Hjt,
-  totalData as totalData_Hjt,
-} from './nitrogen.dataHjt'; // 活鸡兔
-
-import {
-  monitorDataGroupArr as monitorDataGroupArr_YJ,
-  preFanMonitorData as preFanMonitorData_YJ,
-  preMonitorList as preMonitorList_YJ,
-  cqgMonitorList as cqgMonitorList_YJ,
-  prefix as prefix_YJ,
-  getSysState as getSysState_YJ,
-  totalData as totalData_YJ,
-} from './nitrogen.dataYJ'; // 窑街
-
 export function getNitrogenHome() {
   const { sysOrgCode } = useGlobSetting();
-  debugger;
-  console.log(sysOrgCode, 'sysOrgCode----------------------');
   let nitrogenHome;
   switch (sysOrgCode) {
     case 'sdmtjtbltmk': //补连塔
@@ -113,87 +51,26 @@ export const bottomBtnList = ref([
   },
 ]);
 
-export function getMonitorData() {
+export async function getMonitorData() {
   const globSetting = useGlobSetting();
   switch (globSetting.sysOrgCode) {
     case 'yjmdsankuang': // 窑街三矿
-      return {
-        monitorDataGroupArr: monitorDataGroupArr_YJ,
-        preFanMonitorData: preFanMonitorData_YJ,
-        preMonitorList: preMonitorList_YJ,
-        cqgMonitorList: cqgMonitorList_YJ,
-        prefix: prefix_YJ,
-        totalData: totalData_YJ,
-        getSysState: getSysState_YJ,
-      };
+      return await import('./nitrogen.dataYJ');
     case 'sdmtjtdltmkhjtj': // 活鸡兔井
-      return {
-        monitorDataGroupArr: monitorDataGroupArr_Hjt,
-        preFanMonitorData: preFanMonitorData_Hjt,
-        preMonitorList: preMonitorList_Hjt,
-        cqgMonitorList: cqgMonitorList_Hjt,
-        prefix: prefix_Hjt,
-        getSysState: getSysState_Hjt,
-        totalData: totalData_Hjt,
-      };
+      return await import('./nitrogen.dataHjt');
     case 'sdmtjtdltmk': // 大柳塔井
-      return {
-        monitorDataGroupArr: monitorDataGroupArr_Dlt,
-        preFanMonitorData: preFanMonitorData_Dlt,
-        preMonitorList: preMonitorList_Dlt,
-        cqgMonitorList: cqgMonitorList_Dlt,
-        prefix: prefix_Dlt,
-        getSysState: getSysState_Dlt,
-        totalData: totalData_Dlt,
-      };
+      return await import('./nitrogen.dataDlt');
     case 'sdmtjtbetmk': // 布尔台
-      return {
-        monitorDataGroupArr: monitorDataGroupArr_Bet,
-        preFanMonitorData: preFanMonitorData_Bet,
-        preMonitorList: preMonitorList_Bet,
-        cqgMonitorList: cqgMonitorList_Bet,
-        prefix: prefix_Bet,
-        getSysState: getSysState_Bet,
-        totalData: totalData_Bet,
-      };
+      return await import('./nitrogen.dataBet');
     case 'sdmtjtjjmk': // 锦界
-      return {
-        monitorDataGroupArr: monitorDataGroupArr_Jj,
-        preFanMonitorData: preFanMonitorData_Jj,
-        preMonitorList: preMonitorList_Jj,
-        cqgMonitorList: cqgMonitorList_Jj,
-        prefix: prefix_Jj,
-        getSysState: getSysState_Jj,
-        totalData: totalData_Ji,
-      };
-    case 'yjmdhswmk': // 锦界
-      return {
-        monitorDataGroupArr: monitorDataGroupArr_Hsw,
-        preFanMonitorData: preFanMonitorData_Hsw,
-        preMonitorList: preMonitorList_Hsw,
-        cqgMonitorList: cqgMonitorList_Hsw,
-        prefix: prefix_Hsw,
-        getSysState: getSysState_Hsw,
-        totalData: totalData_Hsw,
-      };
-    default: //默认锦界
-      // return {
-      //   monitorDataGroupArr: monitorDataGroupArr_Bet,
-      //   preFanMonitorData: preFanMonitorData_Bet,
-      //   preMonitorList: preMonitorList_Bet,
-      //   cqgMonitorList: cqgMonitorList_Bet,
-      //   prefix: prefix_Bet,
-      //   getSysState: getSysState_Bet,
-      //   totalData: totalData_Bet,
-      // };
-      return {
-        monitorDataGroupArr: monitorDataGroupArr_Hsw,
-        preFanMonitorData: preFanMonitorData_Hsw,
-        preMonitorList: preMonitorList_Hsw,
-        cqgMonitorList: cqgMonitorList_Hsw,
-        prefix: prefix_Hsw,
-        getSysState: getSysState_Hsw,
-        totalData: totalData_Hsw,
-      };
+      return await import('./nitrogen.dataJj');
+    case 'yjmdhswmk': // 海石湾
+      return await import('./nitrogen.dataHsw');
+    case 'sdmtjtltmk': // 柳塔
+      return await import('./nitrogen.dataLT');
+    case 'sdmtjtcctmk': // 寸草1
+      return await import('./nitrogen.dataCc');
+    default: //默认
+      return await import('./nitrogen.dataBet');
   }
 }

+ 3 - 0
src/views/vent/monitorManager/nitrogen/nitrogen.dataBet.ts

@@ -98,3 +98,6 @@ export function getSysState(monitorData) {
   });
   return stateArr;
 }
+
+export const btnSet = [];
+export const controlSet = [];

+ 192 - 0
src/views/vent/monitorManager/nitrogen/nitrogen.dataCc.ts

@@ -0,0 +1,192 @@
+export const monitorDataGroupArr = [[1, 2, 3]];
+export const prefix = ['PRE', 'PRE', 'PRE'];
+export type State = {
+  isRun: boolean;
+  fault: boolean;
+};
+export const preMonitorList = [
+  {
+    title: '加载压力',
+    code: 'PRE_CPR_LoadPre',
+    unit: 'MPa',
+  },
+  {
+    title: '卸载压力',
+    code: 'PRE_CPR_UnLoadPre',
+    unit: 'MPa',
+    child: [],
+  },
+  {
+    title: `机头温度`,
+    code: `PRE_CPR_HeadTemp`,
+    unit: '℃',
+    child: [],
+  },
+  {
+    title: `冷却温度`,
+    code: `PRE_CPR_CoolantTemp`,
+    unit: '℃',
+    child: [],
+  },
+  {
+    title: `排气温度`,
+    code: `PRE_CPR_ExhaustTemp`,
+    unit: '℃',
+    child: [],
+  },
+  {
+    title: '加载时间',
+    code: 'PRE_CPR_LoadTime',
+    unit: 'h',
+    child: [],
+  },
+  {
+    title: '排气压力',
+    code: 'PRE_CPR_ExhaustPre',
+    unit: 'MPa',
+    child: [],
+  },
+
+  {
+    code: 'signal',
+    child: [
+      {
+        title: `加载卸载`,
+        code: `PRE_CPR_LoadorUnload`,
+        isWaring: false,
+      },
+    ],
+  },
+];
+export const cqgMonitorList = [];
+
+export const preFanMonitorData = [
+  {
+    title: `上位启动`,
+    code: `PRE_HMIStart`,
+    unit: 'signal',
+  },
+  {
+    title: `上位停止`,
+    code: `PRE2_HMIStop`,
+    unit: 'signal',
+  },
+  {
+    title: `报警信号`,
+    code: `PRE_AlamSignal`,
+    unit: 'warning',
+  },
+  {
+    title: `故障信号`,
+    code: `PRE_FaultSignal`,
+    unit: 'warning',
+  },
+  {
+    title: `主机本机`,
+    code: `PRE_HostorLoc`,
+    unit: 'signal',
+  },
+  {
+    title: '总运行时间',
+    code: 'PRE_MOT_TotalRunTime',
+    unit: 'h',
+  },
+  {
+    title: 'A相绕组温度',
+    code: 'PRE_MOT_PhaseATemp',
+    unit: '℃',
+  },
+  {
+    title: 'B相绕组温度',
+    code: 'PRE_MOT_PhaseBTemp',
+    unit: '℃',
+  },
+  {
+    title: 'C相绕组温度',
+    code: 'PRE_MOT_PhaseCTemp',
+    unit: '℃',
+  },
+  {
+    title: `A相绕组超温`,
+    code: `PRE_MOT_PhaseATempAlarm`,
+    unit: 'warning',
+  },
+  {
+    title: `B相绕组超温`,
+    code: `PRE_MOT_PhaseBTempAlarm`,
+    unit: 'warning',
+  },
+  {
+    title: `C相绕组超温`,
+    code: `PRE1_MOT_PhaseCTempAlarm`,
+    unit: 'warning',
+  },
+  {
+    title: '电机启动失败',
+    code: 'PRE_MOT_StartFail',
+    unit: 'warning',
+  },
+  {
+    title: '电机停止失败',
+    code: 'PRE_MOT_StopFail',
+    unit: 'warning',
+  },
+  {
+    title: '电机运行返回',
+    code: 'PRE_MOT_RunReturn',
+    unit: 'warning',
+  },
+];
+export const totalData = [
+  {
+    title: '总进风管流量',
+    code: 'TotalInPipeFlow',
+    unit: 'm³/h',
+  },
+  {
+    title: '总出风管压力',
+    code: 'TotalOutPipePre',
+    unit: 'bar',
+  },
+];
+export const btnSet = [
+  {
+    title: '上位启动',
+    code: 'PRE_HMIStart',
+    type: 'btn',
+  },
+  {
+    title: '上位复位',
+    code: 'PRE_HMIReset',
+    type: 'btn',
+  },
+  {
+    title: '上位停止',
+    code: 'PRE_HMIStop',
+    type: 'btn',
+  },
+];
+
+export function getSysState(monitorData) {
+  const stateArr = <State[]>[];
+  monitorDataGroupArr.forEach((group) => {
+    const stateObj = { isRun: false, fault: false };
+    group.forEach((item) => {
+      if (monitorData['PRE_CPR_LoadorUnload'.replace('PRE', 'PRE' + item)]) {
+        stateObj.isRun = monitorData['PRE_CPR_LoadorUnload'.replace('PRE', 'PRE' + item)] == '1';
+      }
+
+      if (
+        monitorData['PRE_FaultSignal'.replace('PRE', 'PRE' + item)] ||
+        monitorData['PRE_FaultSignal1'.replace('PRE', 'PRE' + item)] ||
+        monitorData['PRE_MOT_PhaseAOverTemp'.replace('PRE', 'PRE' + item)] ||
+        monitorData['PRE_MOT_PhaseBOverTemp'.replace('PRE', 'PRE' + item)] ||
+        monitorData['PRE_MOT_PhaseCOverTemp'.replace('PRE', 'PRE' + item)]
+      ) {
+        stateObj.fault = true;
+      }
+    });
+    stateArr.push(stateObj);
+  });
+  return stateArr;
+}

+ 175 - 0
src/views/vent/monitorManager/nitrogen/nitrogen.dataLT.ts

@@ -0,0 +1,175 @@
+export const monitorDataGroupArr = [[1, 2, 3]];
+export const prefix = ['PRE', 'PRE', 'PRE'];
+export type State = {
+  isRun: boolean;
+  fault: boolean;
+};
+export const preMonitorList = [
+  {
+    title: '加载压力',
+    code: 'PRE_CPR_LoadPre',
+    unit: 'MPa',
+  },
+  {
+    title: '卸载压力',
+    code: 'PRE_CPR_UnLoadPre',
+    unit: 'MPa',
+    child: [],
+  },
+  {
+    title: `机头温度`,
+    code: `PRE_CPR_HeadTemp`,
+    unit: '℃',
+    child: [],
+  },
+  {
+    title: `冷却温度`,
+    code: `PRE_CPR_CoolantTemp`,
+    unit: '℃',
+    child: [],
+  },
+  {
+    title: `排气温度`,
+    code: `PRE_CPR_ExhaustTemp`,
+    unit: '℃',
+    child: [],
+  },
+  {
+    title: '加载时间',
+    code: 'PRE_CPR_LoadTime',
+    unit: 'h',
+    child: [],
+  },
+  {
+    title: '排气压力',
+    code: 'PRE_CPR_ExhaustPre',
+    unit: 'MPa',
+    child: [],
+  },
+
+  {
+    code: 'signal',
+    child: [
+      {
+        title: `加载卸载`,
+        code: `PRE_CPR_LoadorUnload`,
+        isWaring: false,
+      },
+    ],
+  },
+];
+export const cqgMonitorList = [];
+
+export const preFanMonitorData = [
+  {
+    title: `上位启动`,
+    code: `PRE_HMIStart`,
+    unit: 'signal',
+  },
+  {
+    title: `上位停止`,
+    code: `PRE2_HMIStop`,
+    unit: 'signal',
+  },
+  {
+    title: `报警信号`,
+    code: `PRE_AlamSignal`,
+    unit: 'warning',
+  },
+  {
+    title: `故障信号`,
+    code: `PRE_FaultSignal`,
+    unit: 'warning',
+  },
+  {
+    title: `主机本机`,
+    code: `PRE_HostorLoc`,
+    unit: 'signal',
+  },
+  {
+    title: '总运行时间',
+    code: 'PRE_MOT_TotalRunTime',
+    unit: 'h',
+  },
+  {
+    title: 'A相绕组温度',
+    code: 'PRE_MOT_PhaseATemp',
+    unit: '℃',
+  },
+  {
+    title: 'B相绕组温度',
+    code: 'PRE_MOT_PhaseBTemp',
+    unit: '℃',
+  },
+  {
+    title: 'C相绕组温度',
+    code: 'PRE_MOT_PhaseCTemp',
+    unit: '℃',
+  },
+  {
+    title: `A相绕组超温`,
+    code: `PRE_MOT_PhaseATempAlarm`,
+    unit: 'warning',
+  },
+  {
+    title: `B相绕组超温`,
+    code: `PRE_MOT_PhaseBTempAlarm`,
+    unit: 'warning',
+  },
+  {
+    title: `C相绕组超温`,
+    code: `PRE1_MOT_PhaseCTempAlarm`,
+    unit: 'warning',
+  },
+  {
+    title: '电机启动失败',
+    code: 'PRE_MOT_StartFail',
+    unit: 'warning',
+  },
+  {
+    title: '电机停止失败',
+    code: 'PRE_MOT_StopFail',
+    unit: 'warning',
+  },
+  {
+    title: '电机运行返回',
+    code: 'PRE_MOT_RunReturn',
+    unit: 'warning',
+  },
+];
+export const totalData = [
+  {
+    title: '总进风管流量',
+    code: 'TotalInPipeFlow',
+    unit: 'm³/h',
+  },
+  {
+    title: '总出风管压力',
+    code: 'TotalOutPipePre',
+    unit: 'bar',
+  },
+];
+
+export function getSysState(monitorData) {
+  const stateArr = <State[]>[];
+  monitorDataGroupArr.forEach((group) => {
+    const stateObj = { isRun: false, fault: false };
+    group.forEach((item) => {
+      if (monitorData['PRE_CPR_LoadorUnload'.replace('PRE', 'PRE' + item)]) {
+        stateObj.isRun = monitorData['PRE_CPR_LoadorUnload'.replace('PRE', 'PRE' + item)] == '1';
+      }
+
+      if (
+        monitorData['PRE_FaultSignal'.replace('PRE', 'PRE' + item)] ||
+        monitorData['PRE_FaultSignal1'.replace('PRE', 'PRE' + item)] ||
+        monitorData['PRE_MOT_PhaseAOverTemp'.replace('PRE', 'PRE' + item)] ||
+        monitorData['PRE_MOT_PhaseBOverTemp'.replace('PRE', 'PRE' + item)] ||
+        monitorData['PRE_MOT_PhaseCOverTemp'.replace('PRE', 'PRE' + item)]
+      ) {
+        stateObj.fault = true;
+      }
+    });
+    stateArr.push(stateObj);
+  });
+  return stateArr;
+}

+ 9 - 3
src/views/vent/monitorManager/sensorMonitor/index.vue

@@ -51,8 +51,14 @@
           </div>
         </a-tab-pane>
         <a-tab-pane key="2" tab="历史数据">
-          <div class="tab-item table-box box-bg padding-0">
-            <HistoryTable :columns-type="deviceKind" :device-type="deviceKind" @change="historyDataSourceChange" designScope="modelsensor-history" />
+          <div class="tab-item table-box box-bg padding-0" v-if="activeKey == '2'">
+            <HistoryTable
+              :columns-type="deviceKind"
+              :device-type="deviceKind"
+              :device-list-api="baseList"
+              @change="historyDataSourceChange"
+              designScope="modelsensor-history"
+            />
             <div class="charts-box" v-if="chartsColumns.length > 0">
               <BarAndLine
                 :chartsColumnsType="selectData.deviceType"
@@ -68,7 +74,7 @@
           </div>
         </a-tab-pane>
         <a-tab-pane key="3" tab="报警历史">
-          <div class="tab-item box-bg">
+          <div class="tab-item box-bg" v-if="activeKey == '3'">
             <AlarmHistoryTable columns-type="alarm" device-type="modelsensor" :device-list-api="baseList" designScope="alarm-history" />
           </div>
         </a-tab-pane>

+ 58 - 12
src/views/vent/monitorManager/windowMonitor/dandaoFcXk.threejs.ts

@@ -13,15 +13,15 @@ class singleWindowXk {
   windowsActionArr = {
     frontWindow: [],
   };
+
   constructor(model) {
     this.model = model;
     this.group.name = 'xkFcGroup';
   }
   addLight = () => {
     if (!this.group || !this.group) return;
-
-    const directionalLight = new THREE.DirectionalLight(0xffffff, 2);
-    directionalLight.position.set(-437, 61, 559);
+    const directionalLight = new THREE.DirectionalLight(0xffffff, 1.5);
+    directionalLight.position.set(800.0, 120.0, 80.0);
     this.group.add(directionalLight);
   };
   // 设置模型位置
@@ -129,15 +129,27 @@ class singleWindowXk {
         const planeGeometry = new THREE.PlaneGeometry(526, 346); // 平面3维几何体PlaneGeometry
         const planeMesh = new THREE.Mesh(planeGeometry, textMaterial);
         planeMesh.name = 'monitorText';
-        planeMesh.scale.set(0.0038, 0.004, 0.0038);
-        planeMesh.position.set(4.44, -0.165, -0.46);
+        planeMesh.scale.set(0.0095, 0.01, 0.01);
+        planeMesh.position.set(6.97, -0.395, -0.63);
         this.group?.add(planeMesh);
       }
     });
   }
 
   /* 提取风门序列帧,初始化前后门动画 */
-  initAnimation() {}
+  initAnimation() {
+    const meshArr01: THREE.Object3D[] = [];
+    const fmGroup = this.group?.getObjectByName('Fc-Xk');
+    if (fmGroup) {
+      fmGroup.children.forEach((obj) => {
+        if (obj.type === 'Mesh' && obj.name && obj.name.startsWith('Blades')) {
+          obj.rotateOnAxis(new THREE.Vector3(0, 0, -1), 0);
+          meshArr01.push(obj);
+        }
+      });
+    }
+    this.windowsActionArr.frontWindow = meshArr01;
+  }
 
   play(rotationParam, flag) {
     if (!this.windowsActionArr.frontWindow) {
@@ -147,15 +159,15 @@ class singleWindowXk {
       // 前风窗动画
       this.windowsActionArr.frontWindow.forEach((mesh: THREE.Mesh) => {
         gsap.to(mesh.rotation, {
-          y: THREE.MathUtils.degToRad(rotationParam.frontDeg1),
-          duration: (1 / 9) * Math.abs(rotationParam.frontDeg1 - mesh.rotation.y),
+          x: THREE.MathUtils.degToRad(rotationParam.frontDeg1),
+          duration: Math.abs(rotationParam.frontDeg1 - mesh.rotation.x) / 10,
           overwrite: true,
         });
       });
     } else if (flag === 0) {
       ([...this.windowsActionArr.frontWindow] as THREE.Mesh[]).forEach((mesh) => {
         gsap.to(mesh.rotation, {
-          y: 0,
+          x: 0,
           overwrite: true,
         });
       });
@@ -169,6 +181,7 @@ class singleWindowXk {
       clearTimeout(this.animationTimer);
       this.animationTimer = null;
     }
+    console.log('摄像头控制信息', this.model.orbitControls, this.model.camera);
   }
 
   mouseUpModel() {
@@ -196,14 +209,47 @@ class singleWindowXk {
     }
   }
 
+  resetMaterial() {
+    const fcModal = this.group.getObjectByName('Fc-Xk');
+    if (fcModal) {
+      const stainlseeSteel_grey = (fcModal.getObjectByName('Box771') as THREE.Mesh)?.material; // 圈;
+      const stainlessSteel_light = (fcModal.getObjectByName('Line12241') as THREE.Mesh)?.material; // 框;
+      const fluorescent_green = (fcModal.getObjectByName('对象276') as THREE.Mesh)?.material; // fluorescent_green;
+      const fluorescent_green1 = (fcModal.getObjectByName('Box770') as THREE.Mesh)?.material; // 23 - Default;
+      const wire = (fcModal.getObjectByName('对象281') as THREE.Mesh)?.material; // wire_028149177;
+      const net = (fcModal.getObjectByName('Plane9230') as THREE.Mesh)?.material; // wire_028149177;
+      const stainlesssteel_blue = (fcModal.getObjectByName('Blades08') as THREE.Mesh)?.material; // wire_028149177;
+
+      (stainlseeSteel_grey as THREE.MeshStandardMaterial).color.set(0xb3b3b3);
+      (stainlseeSteel_grey as THREE.MeshStandardMaterial).roughness = 0.26;
+
+      (stainlessSteel_light as THREE.MeshStandardMaterial).color.set(0x9e9e9e);
+      (stainlessSteel_light as THREE.MeshStandardMaterial).roughness = 0.26;
+      (stainlessSteel_light as THREE.MeshStandardMaterial).envMapIntensity = 0.92;
+
+      (fluorescent_green as THREE.MeshStandardMaterial).color.set(0x00fff2);
+      (fluorescent_green as THREE.MeshStandardMaterial).envMapIntensity = 1.5;
+      //
+      (fluorescent_green1 as THREE.MeshStandardMaterial).color.set(0x00fff2);
+      (fluorescent_green1 as THREE.MeshStandardMaterial).envMapIntensity = 1.5;
+
+      (wire as THREE.MeshStandardMaterial).color.set(0x38e4ff);
+      (wire as THREE.MeshStandardMaterial).envMapIntensity = 2;
+
+      (net as THREE.MeshStandardMaterial).color.set(0xcfcfcf);
+      (stainlesssteel_blue as THREE.MeshStandardMaterial).color.set(0xababab);
+      (stainlesssteel_blue as THREE.MeshStandardMaterial).roughness = 0.45;
+    }
+  }
+
   mountedThree() {
     return new Promise((resolve) => {
-      this.model.setGLTFModel(['Fc-Xk'], this.group).then(() => {
-        debugger;
+      this.model.setGLTFModel(['Fc-Xk'], this.group).then(async () => {
+        resolve(null);
+        this.resetMaterial();
         this.setModalPosition();
         this.initAnimation();
         this.addLight();
-        resolve(null);
       });
     });
   }

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

@@ -151,7 +151,7 @@
   import HandlerHistoryTable from '../comment/HandlerHistoryTable.vue';
   import HandleModal from './modal.vue';
   import DeviceBaseInfo from '../comment/components/DeviceBaseInfo.vue';
-  import { mountedThree, destroy, addMonitorText, play, setModelType, initCameraCanvas } from './window.threejs';
+  import { mountedThree, destroy, addMonitorText, computePlay, setModelType, initCameraCanvas } from './window.threejs';
   import { list, getTableList, cameraList, cameraAddrList } from './window.api';
   import { list as baseList } from '../../deviceManager/windWindowTabel/ventanalyWindow.api';
   import { chartsColumns } from './window.data';
@@ -186,12 +186,12 @@
   const loading = ref(false);
   const windowAngle = ref(0);
 
-  const rotationParam = {
-    frontDeg0: 0, // 前门初始
-    frontDeg1: windowAngle.value, // 前门目标
-    backDeg0: 0, // 后门初始
-    backDeg1: windowAngle.value, // 后门目标
-  };
+  // const rotationParam = {
+  //   frontDeg0: 0, // 前门初始
+  //   frontDeg1: windowAngle.value, // 前门目标
+  //   backDeg0: 0, // 后门初始
+  //   backDeg1: windowAngle.value, // 后门目标
+  // };
 
   // 默认初始是第一行
   const selectRowIndex = ref(-1);
@@ -301,48 +301,8 @@
   };
 
   // 判断前后窗的面积是否发生改变,如果改变则开启动画
-  const playAnimation = (data, maxarea = 90, isFirst = false) => {
-    rotationParam.frontDeg0 = (90 / maxarea) * Number(isFirst ? 0 : selectData.forntArea);
-    rotationParam.backDeg0 = (90 / maxarea) * Number(isFirst ? 0 : selectData.rearArea);
-    rotationParam.frontDeg1 = (90 / maxarea) * Number(data.forntArea) || 0;
-    rotationParam.backDeg1 = (90 / maxarea) * Number(data.rearArea) || 0;
-    if (isFirst) {
-      console.log(
-        '最大面积---->',
-        maxarea,
-        '前窗实际面积---->',
-        selectData.forntArea,
-        '后窗实际面积---->',
-        selectData.rearArea,
-        '计算的值---->',
-        rotationParam
-      );
-    }
-    console.log(
-      '最大面积---->',
-      maxarea,
-      '前窗实际面积---->',
-      selectData.forntArea,
-      '后窗实际面积---->',
-      selectData.rearArea,
-      '计算的值---->',
-      rotationParam
-    );
-    if (!rotationParam.frontDeg1 && !rotationParam.backDeg1) {
-      // 当返回值有误时默认关闭
-      play(rotationParam, 0);
-    } else {
-      if (data.nwindownum == 1 || data.nwindownum == 2) {
-        setTimeout(() => {
-          play(rotationParam, 1);
-        }, 0);
-      }
-      if (data.nwindownum == 2) {
-        setTimeout(() => {
-          play(rotationParam, 2);
-        }, 0);
-      }
-    }
+  const playAnimation = (data, maxarea, isFirst = false) => {
+    computePlay(data, maxarea, isFirst);
   };
 
   // 设置风窗面积
@@ -359,10 +319,6 @@
 
   const handleOK = (passWord, handlerState, windowAngleNum) => {
     windowAngle.value = windowAngleNum;
-    // if (passWord !== '123456') {
-    //   message.warning('密码不正确,请重新输入');
-    //   return;
-    // }
     const data = {
       deviceid: selectData.deviceID,
       devicetype: selectData.deviceType,

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

@@ -19,6 +19,13 @@ let model: UseThree,
   group: THREE.Object3D,
   windowType = 'singleWindow';
 
+const rotationParam = {
+  frontDeg0: 0, // 前门初始
+  frontDeg1: 0, // 前门目标
+  backDeg0: 0, // 后门初始
+  backDeg1: 0, // 后门目标
+};
+
 const { mouseDownFn } = useEvent();
 // 打灯光
 const addLight = () => {
@@ -87,6 +94,48 @@ export const addMonitorText = (selectData) => {
   }
 };
 
+export function computePlay(data, maxarea, isFirst = false) {
+  if (windowType === 'doubleWindow' || windowType === 'singleWindow') {
+    if (!maxarea) maxarea = 90;
+    rotationParam.frontDeg0 = (90 / maxarea) * Number(isFirst ? 0 : data.forntArea);
+    rotationParam.backDeg0 = (90 / maxarea) * Number(isFirst ? 0 : data.rearArea);
+    rotationParam.frontDeg1 = (90 / maxarea) * Number(data.forntArea) || 0;
+    rotationParam.backDeg1 = (90 / maxarea) * Number(data.rearArea) || 0;
+    if (!rotationParam.frontDeg1 && !rotationParam.backDeg1) {
+      // 当返回值有误时默认关闭
+      play(rotationParam, 0);
+    } else {
+      if (data.nwindownum == 1 || data.nwindownum == 2) {
+        setTimeout(() => {
+          play(rotationParam, 1);
+        }, 0);
+      }
+      if (data.nwindownum == 2) {
+        setTimeout(() => {
+          play(rotationParam, 2);
+        }, 0);
+      }
+    }
+  } else if (windowType === 'singleXkWindow') {
+    const acosToAngle = (cosValue) => {
+      cosValue = Math.max(Math.min(cosValue, 1), -1);
+      // 计算角度
+      return Math.asin(cosValue) * (180 / Math.PI);
+    };
+    const sina = Math.sqrt((Math.sin((78 * Math.PI) / 180) ** 2 * parseFloat(data.forntArea)) / parseFloat(maxarea));
+    const angleInRadians = acosToAngle(sina);
+    rotationParam.frontDeg1 = angleInRadians;
+    if (!rotationParam.frontDeg1 && !rotationParam.backDeg1) {
+      // 当返回值有误时默认关闭
+      play(rotationParam, 0);
+    } else {
+      setTimeout(() => {
+        play(rotationParam, 1);
+      }, 0);
+    }
+  }
+}
+
 export const play = (rotationParam, flag) => {
   if (windowType === 'doubleWindow' && doubleWindowObj) {
     return doubleWindowObj.play.call(doubleWindowObj, rotationParam, flag);
@@ -108,34 +157,40 @@ export const setModelType = (type) => {
       model.startAnimation = doubleWindowObj.render.bind(doubleWindowObj);
       model.scene?.remove(group);
       group = doubleWindowObj.group;
-      const oldCameraPosition = { x: 100, y: 0, z: 500 };
+      const oldCameraPosition = { x: 100, y: 0, z: 10 };
       model.scene?.add(doubleWindowObj.group);
       setTimeout(async () => {
         resolve(null);
         await animateCamera(oldCameraPosition, { x: 0, y: 0, z: 0 }, { x: 66.257, y: 57.539, z: 94.313 }, { x: 0, y: 0, z: 0 }, model);
-      }, 300);
+      }, 1000);
     } else if (windowType === 'singleWindow') {
       // 显示单道风窗
       model.startAnimation = singleWindowObj.render.bind(singleWindowObj);
       model.scene?.remove(group);
       group = singleWindowObj.group;
-      const oldCameraPosition = { x: 100, y: 0, z: 500 };
+      const oldCameraPosition = { x: 100, y: 0, z: 10 };
       model.scene?.add(singleWindowObj.group);
       setTimeout(async () => {
         resolve(null);
         await animateCamera(oldCameraPosition, { x: 0, y: 0, z: 0 }, { x: 66.257, y: 57.539, z: 94.313 }, { x: 0, y: 0, z: 0 }, model);
-      }, 300);
+      }, 1000);
     } else if (windowType === 'singleXkWindow') {
       // 显示单道风窗
       model.startAnimation = singleWindowXkObj.render.bind(singleWindowXkObj);
       model.scene?.remove(group);
       group = singleWindowXkObj.group;
-      const oldCameraPosition = { x: 100, y: 0, z: 500 };
+      const oldCameraPosition = { x: 100, y: 0, z: 10 };
       model.scene?.add(singleWindowXkObj.group);
       setTimeout(async () => {
         resolve(null);
-        await animateCamera(oldCameraPosition, { x: 0, y: 0, z: 0 }, { x: 66.257, y: 57.539, z: 94.313 }, { x: 0, y: 0, z: 0 }, model);
-      }, 300);
+        await animateCamera(
+          oldCameraPosition,
+          { x: 0, y: 0, z: 0 },
+          { x: 116.08531358656566, y: 81.45510733175816, z: 193.00752046594465 },
+          { x: 23.446366480086372, y: -12.335134633777185, z: -5.63294282643405 },
+          model
+        );
+      }, 1000);
     }
   });
 };
@@ -146,7 +201,7 @@ export const mountedThree = (playerDom) => {
     model = new UseThree('#window3D');
     if (!model || !model.renderer || !model.camera) return;
     model.setEnvMap('test1');
-    resolve(null);
+
     model.camera.position.set(100, 0, 1000);
     doubleWindowObj = new doubleWindow(model);
     singleWindowXkObj = new singleWindowXk(model);
@@ -162,6 +217,7 @@ export const mountedThree = (playerDom) => {
     model.animate();
     addLight();
     startAnimation();
+    resolve(null);
   });
 };
 

+ 151 - 148
src/views/vent/monitorManager/workFaceMonitor/components/workFaceVentHome.vue

@@ -56,14 +56,13 @@
                   <span class="btn btn1" @click="saveVentData(item.value)">保存</span>
                 </template>
                 <template v-if="item.type == 'radio'">
-                  <a-radio-group v-model:value="item.value" name="radioGroup" style="width: 300px"
-                    @change="changeType($event, item)">
+                  <a-radio-group v-model:value="item.value" name="radioGroup" style="width: 300px" @change="changeType($event, item)">
                     <a-radio value="1">人工决策</a-radio>
                     <a-radio value="2">智能决策</a-radio>
                   </a-radio-group>
                 </template>
               </div>
-            </div>              
+            </div>
           </template>
         </ventBox1>
         <ventBox1 class="vent-margin-t-10">
@@ -71,12 +70,18 @@
             <div>风门监测与控制</div>
           </template>
           <template #container>
-            <a-table :columns="gateColumns" :data-source="gateDataSource" :pagination="false" size="small"
-              maxWidth="340" :scroll="{ x: 'max-content', y: 140 }">
+            <a-table
+              :columns="gateColumns"
+              :data-source="gateDataSource"
+              :pagination="false"
+              size="small"
+              maxWidth="340"
+              :scroll="{ x: 'max-content', y: 140 }"
+            >
               <template #bodyCell="{ column, record }">
                 <template v-if="column.dataIndex === 'warnFlag'">
-                  <span v-if="record['warnFlag'] == '0'" style="color: #00ff00;">正常</span>
-                  <span v-else style="color: #ff0000;"> {{ record.warnDes }}</span>
+                  <span v-if="record['warnFlag'] == '0'" style="color: #00ff00">正常</span>
+                  <span v-else style="color: #ff0000"> {{ record.warnDes }}</span>
                 </template>
                 <template v-if="column.dataIndex === 'action'">
                   <a class="action-link" @click="toDetail">详情</a>
@@ -90,18 +95,23 @@
             <div>风窗监测与控制</div>
           </template>
           <template #container>
-            <a-table :columns="windowColumns" :data-source="windowDataSource" :pagination="false" size="small"
-              maxWidth="340" :scroll="{ x: 'max-content', y: 140 }">
+            <a-table
+              :columns="windowColumns"
+              :data-source="windowDataSource"
+              :pagination="false"
+              size="small"
+              maxWidth="340"
+              :scroll="{ x: 'max-content', y: 140 }"
+            >
               <template #bodyCell="{ column, record }">
                 <template v-if="column.dataIndex === 'warnFlag'">
-                  <span v-if="record['warnFlag'] == '0'" style="color: #00ff00;">正常</span>
-                  <span v-else style="color: #ff0000;"> {{ record.warnDes }}</span>
+                  <span v-if="record['warnFlag'] == '0'" style="color: #00ff00">正常</span>
+                  <span v-else style="color: #ff0000"> {{ record.warnDes }}</span>
                 </template>
                 <template v-if="column.dataIndex === 'action'">
                   <a class="action-link" @click="toDetail">详情</a>
                 </template>
               </template>
-
             </a-table>
           </template>
         </ventBox1>
@@ -114,18 +124,12 @@
             </template>
             <template #container>
               <div v-for="(item, index) in disasterParam" class="input-item vent-flex-row control" :key="index">
-                <div class="title" style="width: 200px;">{{ item.title }}:</div>
+                <div class="title" style="width: 200px">{{ item.title }}:</div>
                 <template v-if="item.type == 'input'">
                   <a-input-number class="input-value" v-model="item.value" placeholder="" />
                 </template>
                 <template v-if="item.type == 'select'">
-                  <a-select
-                    class="input-value"
-                    v-model:value="item.value"
-                    style="width: 100%"
-                    :options="item.options"
-                    @change="handleChange"
-                  ></a-select>
+                  <a-select class="input-value" v-model:value="item.value" style="width: 100%" :options="item.options" @change="handleChange" />
                 </template>
               </div>
               <div class="btn-box vent-right vent-margin-t-10 vent-margin-b-10">
@@ -166,18 +170,24 @@
               </template>
             </template>
           </ventBox1>
-          
+
           <ventBox1 class="vent-margin-t-10">
             <template #title>
               <div>测风装置监测与控制</div>
             </template>
             <template #container>
-              <a-table :columns="windColumns" :data-source="windDataSource" :pagination="false" size="small"
-                maxWidth="340" :scroll="{ x: 'max-content', y: 180 }">
+              <a-table
+                :columns="windColumns"
+                :data-source="windDataSource"
+                :pagination="false"
+                size="small"
+                maxWidth="340"
+                :scroll="{ x: 'max-content', y: 180 }"
+              >
                 <template #bodyCell="{ column, record }">
                   <template v-if="column.dataIndex === 'warnFlag'">
-                    <span v-if="record['warnFlag'] == '0'" style="color: #00ff00;">正常</span>
-                    <span v-else style="color: #ff0000;"> {{ record.warnDes }}</span>
+                    <span v-if="record['warnFlag'] == '0'" style="color: #00ff00">正常</span>
+                    <span v-else style="color: #ff0000"> {{ record.warnDes }}</span>
                   </template>
                   <template v-if="column.dataIndex === 'action'">
                     <a class="action-link" @click="toDetail">详情</a>
@@ -196,146 +206,139 @@
 </template>
 
 <script setup lang="ts">
+  import { onBeforeMount, ref, onMounted, onUnmounted, reactive, defineProps } from 'vue';
+  import { list } from '../workFace.api';
+  import ventBox1 from '/@/components/vent/ventBox1.vue';
+  import { gateColumns, windowColumns, windColumns, ventParam, disasterParam, compressorParam, compressorDeviceParam } from '../workFace.data';
 
-import { onBeforeMount, ref, onMounted, onUnmounted, reactive, defineProps } from 'vue';
-import { list } from '../workFace.api';
-import ventBox1 from '/@/components/vent/ventBox1.vue'
-import { gateColumns, windowColumns, windColumns, ventParam, disasterParam, compressorParam, compressorDeviceParam } from '../workFace.data'
-
-const props = defineProps({
-  deviceId: {
-    type: String,
-    require: true
-  }
-})
-
-const loading = ref(false)
-const compressorMode = ref(1)
+  const props = defineProps({
+    deviceId: {
+      type: String,
+      require: true,
+    },
+  });
 
-// 默认初始是第一行
-const openDust = ref(false)
-const workFaceSource = ref({});
-const workFaceHistorySource = ref([])
-const gateDataSource = ref([]);
-const windowDataSource = ref([]);
-const windDataSource = ref([]);
-const temperatureDataSource = ref([]);
-const fireDataSource = ref([]);
+  const loading = ref(false);
+  const compressorMode = ref(1);
 
-// 监测数据
-const selectData = reactive({});
+  // 默认初始是第一行
+  const openDust = ref(false);
+  const workFaceSource = ref({});
+  const workFaceHistorySource = ref([]);
+  const gateDataSource = ref([]);
+  const windowDataSource = ref([]);
+  const windDataSource = ref([]);
+  const temperatureDataSource = ref([]);
+  const fireDataSource = ref([]);
 
-function saveVentData(data) {
-  console.log('保存的数据----------->', data)
-}
+  // 监测数据
+  const selectData = reactive({});
 
-// https获取监测数据
-let timer: null | NodeJS.Timeout = null;
-function getMonitor(flag?) {
-  if (Object.prototype.toString.call(timer) === '[object Null]') {
-    timer = setTimeout(async () => {
-      if (props.deviceId) {
-        const data = await getDataSource(props.deviceId)
-        Object.assign(selectData, data);
-      }
-      if (timer) {
-        timer = null;
-      }
-      await getMonitor();
-      loading.value = false
-    }, flag? 0 : 1000);
+  function saveVentData(data) {
+    console.log('保存的数据----------->', data);
   }
-};
 
-async function getDataSource(systemID) {
-  const res = await list({ devicetype: 'sys', systemID, type: 'ventS' });
-  const result = res.deviceInfo;
-  for (const key in result) {
-    const item = result[key]
-    // ''.startsWith
-    if (item.type.startsWith('gate')) {
-      // 风门
-      gateDataSource.value = item['datalist'].filter((data: any) => {
-        const readData = data.readData;
-        return Object.assign(data, readData);
-      })
-
-    }
-    if (item.type.startsWith('window')) {
-      // 风窗
-      windowDataSource.value = item['datalist'].filter((data: any) => {
-        const readData = data.readData;
-        return Object.assign(data, readData);
-      })
-    }
-    if (item.type.startsWith('windrect')) {
-      // 测风
-      windDataSource.value = item['datalist'].filter((data: any) => {
-        const readData = data.readData;
-        return Object.assign(data, readData);
-      })
-    }
-    if (item.type === 'modelsensor_temperature') {
-      // 温度
-      temperatureDataSource.value = item['datalist'].filter((data: any) => {
-        const readData = data.readData;
-        return Object.assign(data, readData);
-      })
+  // https获取监测数据
+  let timer: null | NodeJS.Timeout = null;
+  function getMonitor(flag?) {
+    if (Object.prototype.toString.call(timer) === '[object Null]') {
+      timer = setTimeout(
+        async () => {
+          if (props.deviceId) {
+            const data = await getDataSource(props.deviceId);
+            Object.assign(selectData, data);
+          }
+          if (timer) {
+            timer = null;
+          }
+          await getMonitor();
+          loading.value = false;
+        },
+        flag ? 0 : 1000
+      );
     }
-    if (item.type === 'modelsensor_fire') {
-      // 火焰
-      fireDataSource.value = item['datalist'].filter((data: any) => {
-        const readData = data.readData;
-        return Object.assign(data, readData);
-      })
-    }
-
-    workFaceSource.value = Object.assign(res['sysInfo'], res['sysInfo']['readData']);
-    workFaceHistorySource.value = res['sysInfo']['history']
-    loading.value = false;
   }
 
-}
-
-function toDetail() {
-
-}
+  async function getDataSource(systemID) {
+    const res = await list({ devicetype: 'sys', systemID, type: 'ventS' });
+    const result = res.deviceInfo;
+    for (const key in result) {
+      const item = result[key];
+      // ''.startsWith
+      if (item.type.startsWith('gate')) {
+        // 风门
+        gateDataSource.value = item['datalist'].filter((data: any) => {
+          const readData = data.readData;
+          return Object.assign(data, readData);
+        });
+      }
+      if (item.type.startsWith('window')) {
+        // 风窗
+        windowDataSource.value = item['datalist'].filter((data: any) => {
+          const readData = data.readData;
+          return Object.assign(data, readData);
+        });
+      }
+      if (item.type.startsWith('windrect')) {
+        // 测风
+        windDataSource.value = item['datalist'].filter((data: any) => {
+          const readData = data.readData;
+          return Object.assign(data, readData);
+        });
+      }
+      if (item.type === 'modelsensor_temperature') {
+        // 温度
+        temperatureDataSource.value = item['datalist'].filter((data: any) => {
+          const readData = data.readData;
+          return Object.assign(data, readData);
+        });
+      }
+      if (item.type === 'modelsensor_fire') {
+        // 火焰
+        fireDataSource.value = item['datalist'].filter((data: any) => {
+          const readData = data.readData;
+          return Object.assign(data, readData);
+        });
+      }
 
-function handleChange(value) {
-  const disasterParamVal = disasterParam.value.filter(item => {
-    if (item.title === '烟雾报警持续时间(s)') {
-      item.value = value
+      workFaceSource.value = Object.assign(res['sysInfo'], res['sysInfo']['readData']);
+      workFaceHistorySource.value = res['sysInfo']['history'];
+      loading.value = false;
     }
-    return item
-  })
-  disasterParam.value = disasterParamVal
-}
+  }
 
-function changeType(e: Event, item) {
-  item.value = e.target?.value
-}
+  function toDetail() {}
 
+  function handleChange(value) {
+    const disasterParamVal = disasterParam.value.filter((item) => {
+      if (item.title === '烟雾报警持续时间(s)') {
+        item.value = value;
+      }
+      return item;
+    });
+    disasterParam.value = disasterParamVal;
+  }
 
-onBeforeMount(() => {
+  function changeType(e: Event, item) {
+    item.value = e.target?.value;
+  }
 
-});
+  onBeforeMount(() => {});
 
-onMounted(async () => {
-  loading.value = true;
-  timer = null
-  await getMonitor(true)
-});
-onUnmounted(() => {
-  if (timer) {
-    clearTimeout(timer);
-    timer = undefined;
-  }
-});
+  onMounted(async () => {
+    loading.value = true;
+    timer = null;
+    await getMonitor(true);
+  });
+  onUnmounted(() => {
+    if (timer) {
+      clearTimeout(timer);
+      timer = undefined;
+    }
+  });
 </script>
 <style lang="less" scoped>
-@ventSpace: zxm;
-@import '/@/design/vent/modal.less';
-@import '../../comment/less/workFace.less';
-
-
+  @ventSpace: zxm;
+  @import '/@/design/vent/modal.less';
+  @import '../../comment/less/workFace.less';
 </style>

+ 3 - 1
src/views/vent/performance/comment/CADModal.vue

@@ -23,6 +23,8 @@
   import { CADViewer, useCADViewer } from '/@/components/CADViewer';
   import { useGlobSetting } from '/@/hooks/setting';
   import Iframe from '/@/views/sys/iframe/index.vue';
+  const globSetting = useGlobSetting();
+  const baseApiUrl = globSetting.domainUrl;
 
   let props = defineProps({
     fileType: {
@@ -59,7 +61,7 @@
       });
     } else {
       // CAD 预览器的 DEMO 01 @link https://kkfileview.keking.cn/zh-cn/docs/usage.html
-      const baseUrl = import.meta.env.PROD ? window.location.origin : import.meta.env.VITE_GLOB_DOMAIN_URL;
+      const baseUrl = import.meta.env.PROD ? baseApiUrl : import.meta.env.VITE_GLOB_DOMAIN_URL;
       const url = `${baseUrl}/ventanaly-sharefile/fileServer/downloadById?id=${record.id}&fullfilename=preview${record.fileSuffix}`;
       iframerc.value = 'http://182.92.126.35:8012/onlinePreview?url=' + encodeURIComponent(window.btoa(url));
     }

+ 18 - 13
src/views/vent/reportManager/comment/DeviceModal.vue

@@ -28,10 +28,16 @@
       </a-form>
     </div>
     <!--历史记录 -->
-    <div v-else-if="addOredit=='hisRecord'">
-      <NormalHisTable  :columns="columnsHis" :reportIds="reportId"
-                 :downLoad="hisdownload" :list="hisList" designScope="device-tabel" title="报表历史记录管理"
-                :showTab="false"/>
+    <div v-else-if="addOredit == 'hisRecord'">
+      <NormalHisTable
+        :columns="columnsHis"
+        :reportIds="reportId"
+        :downLoad="hisdownload"
+        :list="hisList"
+        designScope="device-tabel"
+        title="报表历史记录管理"
+        :showTab="false"
+      />
     </div>
     <!-- 报表编辑 -->
     <div v-else>
@@ -61,15 +67,14 @@
       type: String,
       default: '',
     },
-    reportLogHis:{
-      type:String,
-      default:''
+    reportLogHis: {
+      type: String,
+      default: '',
+    },
+    reportId: {
+      type: String,
+      default: '',
     },
-    reportId:{
-      
-      type:String,
-      default:''
-    }
   });
   const remoteUrl = import.meta.env.DEV ? 'http://182.92.126.35' : 'http://' + window.location.hostname;
   const userStore = useUserStore(); //获取用户信息
@@ -179,7 +184,7 @@
     margin-left: 5px;
     color: #fff;
   }
-  ::v-deep .zxm-form{
+  ::v-deep .zxm-form {
     padding-top: 40px;
   }