ソースを参照

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

lxh 4 週間 前
コミット
f2d4ebbc7a
38 ファイル変更1735 行追加826 行削除
  1. BIN
      public/video/gate1.mp4
  2. BIN
      public/video/wind1.mp4
  3. BIN
      public/video/window1.mp4
  4. BIN
      src/assets/images/vent/gas/gasZkBorder.png
  5. BIN
      src/assets/images/vent/gas/zgStatus.png
  6. BIN
      src/assets/images/vent/gas/zkcount.png
  7. BIN
      src/assets/video/fanLocal.mp4
  8. BIN
      src/assets/video/gate.mp4
  9. BIN
      src/assets/video/mainFan.mp4
  10. BIN
      src/assets/video/output_video.mp4
  11. 3 3
      src/components/Table/src/hooks/useCustomSelection.tsx
  12. 5 2
      src/design/ant/index.less
  13. 3 14
      src/design/themify/dark.less
  14. 1 1
      src/utils/threejs/useThree.ts
  15. 1 1
      src/views/system/checkRule/check.rule.data.ts
  16. 44 10
      src/views/vent/comment/history/HistoryTable.vue
  17. 1 35
      src/views/vent/comment/history/history.data.ts
  18. 56 38
      src/views/vent/gas/gasInspect/gasInspect.api.ts
  19. 386 157
      src/views/vent/gas/gasInspect/gasInspect.data.ts
  20. 284 0
      src/views/vent/gas/gasInspect/index2.vue
  21. 77 0
      src/views/vent/gas/gasInspectNonfc/components/addressAdd2.vue
  22. 117 0
      src/views/vent/gas/gasInspectNonfc/components/inspectEdit2.vue
  23. 27 27
      src/views/vent/gas/gasInspectNonfc/gasInspectNonfc.api.ts
  24. 62 50
      src/views/vent/gas/gasInspectNonfc/gasInspectNonfc.data.ts
  25. 17 38
      src/views/vent/gas/gasInspectNonfc/index2.vue
  26. 12 0
      src/views/vent/gas/gasZk/gasZk.api.ts
  27. 201 0
      src/views/vent/gas/gasZk/index.vue
  28. 14 16
      src/views/vent/monitorManager/alarmMonitor/common.data.ts
  29. 1 1
      src/views/vent/monitorManager/balancePressMonitor/balancePress.data.ts
  30. 45 38
      src/views/vent/monitorManager/balancePressMonitor/components/balancePressHome.vue
  31. 48 50
      src/views/vent/monitorManager/comment/stationTable.vue
  32. 19 49
      src/views/vent/monitorManager/deviceCameraMonitor/index.vue
  33. 0 3
      src/views/vent/monitorManager/deviceMonitor/components/device/index.vue
  34. 2 3
      src/views/vent/monitorManager/deviceMonitor/components/device/modal/fiber.modal.hlg.vue
  35. 296 281
      src/views/vent/monitorManager/deviceMonitor/components/device/modal/gaspatrol.modal.vue
  36. 0 2
      src/views/vent/monitorManager/nitrogen/nitrogen.data.1.ts
  37. 3 3
      src/views/vent/monitorManager/nitrogen/nitrogen.dataTest.ts
  38. 10 4
      src/views/vent/monitorManager/safetyMonitor/index.vue

BIN
public/video/gate1.mp4


BIN
public/video/wind1.mp4


BIN
public/video/window1.mp4


BIN
src/assets/images/vent/gas/gasZkBorder.png


BIN
src/assets/images/vent/gas/zgStatus.png


BIN
src/assets/images/vent/gas/zkcount.png


BIN
src/assets/video/fanLocal.mp4


BIN
src/assets/video/gate.mp4


BIN
src/assets/video/mainFan.mp4


BIN
src/assets/video/output_video.mp4


+ 3 - 3
src/components/Table/src/hooks/useCustomSelection.tsx

@@ -152,7 +152,7 @@ export function useCustomSelection(
     if (bodyEl.value) {
       // 监听div高度变化
       bodyResizeObserver = new ResizeObserver((entries) => {
-        for (let entry of entries) {
+        for (const entry of entries) {
           if (entry.target === bodyEl.value && entry.contentRect) {
             const { height } = entry.contentRect;
             bodyHeight.value = Math.ceil(height);
@@ -204,7 +204,7 @@ export function useCustomSelection(
       }
       let showCount = 0;
       // 最小选中数量
-      let minSelect = 100;
+      const minSelect = 100;
       const hidden: Recordable[] = [];
       flattedData.value.forEach((item, index, array) => {
         if (array.length > 120) {
@@ -254,7 +254,7 @@ export function useCustomSelection(
             setTimeout(() => {
               emitChange();
               // update-begin--author:liaozhiyang---date:20230811---for:【QQYUN-5687】批量选择,提示成功后,又来一个提示
-              setTimeout(() =>resolve(), 0);
+              setTimeout(() => resolve(), 0);
               // update-end--author:liaozhiyang---date:20230811---for:【QQYUN-5687】批量选择,提示成功后,又来一个提示
             }, 500);
           }

+ 5 - 2
src/design/ant/index.less

@@ -14,11 +14,11 @@
     display: unset;
   }
 }
-//update-begin---author:scott ---date:2023-08-28  for����QQYUN-6374��UnoCSS���windicss����Ӧ����ʽ����--
+//update-begin---author:scott ---date:2023-08-28  for锟斤拷锟斤拷QQYUN-6374锟斤拷UnoCSS锟斤拷锟絯indicss锟斤拷锟斤拷应锟斤拷锟斤拷式锟斤拷锟斤拷--
 /*span.anticon:not(.app-iconify) {
   vertical-align: 0.125em !important;
 }*/
-//update-end---author:scott ---date::2023-08-28  for����QQYUN-6374��UnoCSS���windicss����Ӧ����ʽ����--
+//update-end---author:scott ---date::2023-08-28  for锟斤拷锟斤拷QQYUN-6374锟斤拷UnoCSS锟斤拷锟絯indicss锟斤拷锟斤拷应锟斤拷锟斤拷式锟斤拷锟斤拷--
 
 .@{ventSpace}-back-top {
   right: 20px;
@@ -65,6 +65,9 @@
   border-top: 0 !important;
   border-left: 0 !important;
 }
+.@{ventSpace}-checkbox-wrapper-disabled .@{ventSpace}-checkbox-disabled .@{ventSpace}-checkbox-inner {
+  background-color: #afafaf;
+}
 
 @{ventSpace}-input {
   background-color: transparent !important;

+ 3 - 14
src/design/themify/dark.less

@@ -1,40 +1,32 @@
 html[data-theme='dark2'] {
   --vent-primary-color: #1580cc;
-
   --vent-header-bg-color: linear-gradient(#005177, #0a344c);
-
   --vent-btn-primary-hover-color: #389bd9;
   --vent-btn-primary-focus-color: #1c638a99;
   --vent-btn-primary-color: #1c638a;
   --vent-btn-primary-border-color: #56b3c96b;
-
   --vent-table-thead: #3d9dd45d;
   --vent-table-thead-border: #91e9fe;
   --vent-table-hover: #0dc3ff22;
   --vent-table-no-hover: #00bfff10;
   --vent-table-action-link: #00e7ff;
-
   --vent-modal-title: #39e9fe;
   --vent-modal-border: #04bdaa;
   --vent-modal-bg: #0042ab22;
   --vent-modal-box-shadow: #2b87ff;
   --vent-modal-bg2: linear-gradient(#2cd1ff55, #1eb0ff55);
-
   --vent-tabs-bg: linear-gradient(#0091aa33, #2081ff11);
   --vent-tabs-table-thead: #3d9dd433;
   --vent-tabs-action-link: #28f3f3;
-
   --vent-form-item-border: #3ad8ff77;
-
   --vent-text-base: #ddd;
   --vent-base-color: #09172c;
   --vent-base-border: #5cfaff;
   --vent-base-light-bg: #60f4ff;
   --vent-base-light-bg-opcity: #60f4ff55;
-  --vent-transparent: #ffffff00;
-  --vent-font-color: #ffffff;
+  --vent-transparent: #fff0;
+  --vent-font-color: #fff;
   --vent-font-action-link: #7af5ff;
-
   --vent-configurable-bg: #09316a;
   --vent-configurable-module-bg: #3df6ff11;
   --vent-configurable-original-module-bg: #3df6ff15;
@@ -43,7 +35,6 @@ html[data-theme='dark2'] {
   --vent-configurable-home-bg-img: linear-gradient(to top, #39a3ff00, #0091ff99);
   --vent-configurable-home-timeline: linear-gradient(to top, #39a3ff00, #0091ff99, #39a3ff00);
   --vent-configurable-home-light-border: #3df6ff;
-
   --vent-gas-list-item-bg-img: linear-gradient(to right, #39a3ff55, #3977e500);
   --vent-gas-tab-bg: #10427a;
   --vent-gas-tab-bg-avtived: #166ab5;
@@ -51,12 +42,10 @@ html[data-theme='dark2'] {
   --vent-gas-primary-text: #00c8d9;
   --vent-gas-primary-bg: #1673bf;
   --vent-gas-primary-trasparent-bg: #0091ff12;
-
   --vent-device-manager-box-border: #44d3ff70;
-  --vent-device-manager-box-bg: #ffffff11;
+  --vent-device-manager-box-bg: #fff1;
   --vent-device-manager-control-btn: linear-gradient(#1fa6cb, #127cb5);
   --vent-device-manager-control-btn-hover: linear-gradient(#2cd1ff55, #1eb0ff55);
-
   --vent-warn-tab-bg: #0f376ccc;
   --vent-warn-tab-border: #166ab5;
   --vent-warn-tab-bg-actived: #209dfc;

+ 1 - 1
src/utils/threejs/useThree.ts

@@ -13,10 +13,10 @@ import Stats from 'three/examples/jsm/libs/stats.module.js';
 import { useModelStore } from '/@/store/modules/threejs';
 import TWEEN from 'three/examples/jsm/libs/tween.module.js';
 import { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js';
-import { useGlobSetting } from '/@/hooks/setting';
 import { getList } from '@/views/vent/sys/resources/file.api';
 import { saveModel } from '/@/utils/threejs/util';
 
+import { useGlobSetting } from '/@/hooks/setting';
 const globSetting = useGlobSetting();
 const baseApiUrl = globSetting.domainUrl;
 

+ 1 - 1
src/views/system/checkRule/check.rule.data.ts

@@ -74,7 +74,7 @@ export const formSchema: FormSchema[] = [
               if (!value) {
                 return reject('请输入规则编码!');
               }
-              let params = {
+              const params = {
                 tableName: 'sys_check_rule',
                 fieldName: 'rule_code',
                 fieldVal: value,

+ 44 - 10
src/views/vent/comment/history/HistoryTable.vue

@@ -51,10 +51,10 @@
   //      温度        安装位置
   // 取forcFan1Temp    取name
   // 当设备字段不含数据字典关键词(forcFan)时不做处理,当设备字段包含关键词但已指定编号(即字段包含数字)时不做处理
-  import { onMounted, ref, shallowRef } from 'vue';
+  import { computed, onMounted, ref, shallowRef } from 'vue';
   import { BasicColumn, PaginationProps, BasicTable } from '/@/components/Table';
   import { getTableHeaderColumns } from '/@/hooks/web/useWebColumns';
-  import { defaultFormProps, defaultPaginationProps, getDefaultSchemas, defaultTableProps } from './history.data';
+  import { getDefaultSchemas } from './history.data';
   import { adaptFormData, getDeviceList, getExportUrl, list } from './history.api';
   import { useListPage } from '/@/hooks/system/useListPage';
   import { initDictOptions } from '/@/utils/dict';
@@ -85,19 +85,57 @@
     {
       deviceCode: '',
       dictCode: '',
+      pagination: (): PaginationProps => ({
+        current: 1,
+        pageSize: 10,
+        pageSizeOptions: ['10', '30', '50', '100'],
+        showQuickJumper: false,
+      }),
     }
   );
 
   // 创建表格,此表格目前不具备常用功能,需要初始化后使用(props指定表格配置时除外)
   let originColumns: BasicColumn[] = [];
+  const scroll = computed(() => {
+    return { ...props.scroll, y: props.scroll.y - 100 };
+  });
   const { tableContext, onExportXls, onExportXlsPost } = useListPage({
-    tableProps: defaultTableProps,
+    tableProps: {
+      columns: [
+        {
+          align: 'center',
+          dataIndex: 'strinstallpos',
+          defaultHidden: false,
+          title: '安装位置',
+          width: 80,
+        },
+      ],
+      formConfig: {
+        labelAlign: 'left',
+        labelWidth: 80,
+        showAdvancedButton: false,
+        showSubmitButton: false,
+        showResetButton: false,
+        actionColOptions: {
+          xxl: 4,
+        },
+      },
+      canResize: true,
+      showTableSetting: false,
+      showActionColumn: false,
+      bordered: false,
+      size: 'small',
+      showIndexColumn: true,
+      tableLayout: 'auto',
+      scroll: scroll,
+      pagination: props.pagination,
+    },
     exportConfig: {
       name: '设备历史列表',
       url: () => getExportUrl(deviceInfo.value),
     },
   });
-  const [register, { getForm, setLoading, getPaginationRef, setPagination, setProps, setColumns }] = tableContext;
+  const [register, { getForm, setLoading, getPaginationRef, setPagination, setColumns }] = tableContext;
 
   /**
    * 初始化表格,该方法将根据参数设定新的表头、表单,如果提供了自定义的表头、表单配置则不作操作。
@@ -116,12 +154,8 @@
         break;
       }
     }
-    setProps({
-      formConfig: {
-        ...defaultFormProps,
-        schemas: defaultSchemas,
-      },
-      pagination: props.pagination || defaultPaginationProps,
+    getForm().setProps({
+      schemas: defaultSchemas,
     });
   }
 

+ 1 - 35
src/views/vent/comment/history/history.data.ts

@@ -1,5 +1,5 @@
 import dayjs from 'dayjs';
-import { BasicTableProps, PaginationProps, FormProps, FormSchema } from '/@/components/Table';
+import { FormSchema } from '/@/components/Table';
 import { getAutoScrollContainer } from '/@/utils/common/compUtils';
 import { get } from 'lodash-es';
 
@@ -145,37 +145,3 @@ export const getDefaultSchemas: (dictOptions: any[], deviceOptions: any[], onDev
     },
   ];
 };
-
-/** 默认的表格props,参考 BasicTable 组件 */
-export const defaultTableProps: BasicTableProps = {
-  columns: [
-    {
-      align: 'center',
-      dataIndex: 'strinstallpos',
-      defaultHidden: false,
-      title: '安装位置',
-      width: 80,
-    },
-  ],
-  bordered: false,
-  size: 'small',
-  showIndexColumn: true,
-  showActionColumn: false,
-};
-
-/** 默认的查询表单props,参考 BasicForm 组件 */
-export const defaultFormProps: FormProps = {
-  labelAlign: 'left',
-  labelWidth: 80,
-  showAdvancedButton: false,
-  showSubmitButton: false,
-  showResetButton: false,
-};
-
-/** 默认的表格分页props,参考 BasicTable 组件 */
-export const defaultPaginationProps: PaginationProps = {
-  current: 1,
-  pageSize: 10,
-  pageSizeOptions: ['10', '30', '50', '100'],
-  showQuickJumper: false,
-};

+ 56 - 38
src/views/vent/gas/gasInspect/gasInspect.api.ts

@@ -1,69 +1,71 @@
 import { defHttp } from '/@/utils/http/axios';
 
-
 enum Api {
-    list = '/safety/gasInsCard/list',//通过id(巡检卡id)查询
-    importByExcel='/safety/gasDayReport/importGasInsCard',//导入瓦斯巡检地址
-    exportGasByExcel='/safety/gasDayReport/exportGasByExcel',//导出瓦斯巡检地址
-    queryAllDisTeam='/safety/disTeamInfo/queryAllDisTeam',//查询所有区队
-    moveOrderNum='/safety/gasInsCard/moveOrderNum',//上下移接口
-    edit='/safety/gasInsCard/edit',//瓦斯巡检地点编辑
-    deleteCard='/safety/gasInsCard/delete',//瓦斯巡检卡删除
-    taskSubmit='/safety/disTeamInfo/edit',//任务管理下发
-    clearCardInfo='/safety/gasInsCard/clearCard',//瓦斯巡检卡信息删除
-    getAllUserInfo='/safety/gasInsCard/getAllUserInfo',//获取早中晚班巡检员列表
-    getAllGasIns='/safety/gasIns/getAllGasIns',//获取所有巡检地址
-    teamList='/safety/disTeamInfo/list',//区队分页列表查询
-    teamAdd='/safety/disTeamInfo/add',//区队添加
-    teamEdit='/safety/disTeamInfo/edit',//区队编辑
-    deleteTeam='/safety/disTeamInfo/delete',//区队删除
-    addGasReportAddress= '/safety/gasDayReport/addGasReportAddress'//新增瓦斯巡检地址
-
+  list = '/safety/gasInsCard/list', //通过id(巡检卡id)查询
+  importByExcel = '/safety/gasDayReport/importGasInsCard', //导入瓦斯巡检地址
+  exportGasByExcel = '/safety/gasDayReport/exportGasByExcel', //导出瓦斯巡检地址
+  queryAllDisTeam = '/safety/disTeamInfo/queryAllDisTeam', //查询所有区队
+  moveOrderNum = '/safety/gasInsCard/moveOrderNum', //上下移接口
+  edit = '/safety/gasInsCard/edit', //瓦斯巡检地点编辑
+  deleteCard = '/safety/gasInsCard/delete', //瓦斯巡检卡删除
+  taskSubmit = '/safety/disTeamInfo/edit', //任务管理下发
+  clearCardInfo = '/safety/gasInsCard/clearCard', //瓦斯巡检卡信息删除
+  getAllUserInfo = '/safety/gasInsCard/getAllUserInfo', //获取早中晚班巡检员列表
+  getAllGasIns = '/safety/gasIns/getAllGasIns', //获取所有巡检地址
+  teamList = '/safety/disTeamInfo/list', //区队分页列表查询
+  teamAdd = '/safety/disTeamInfo/add', //区队添加
+  //   teamEdit = '/safety/disTeamInfo/edit', //区队编辑
+  deleteTeam = '/safety/disTeamInfo/delete', //区队删除
+  addGasReportAddress = '/safety/gasDayReport/addGasReportAddress', //新增瓦斯巡检地址
+  taskDetailsList = '/safety/gasDayReport/taskDetailsList', // 瓦斯巡检任务明细列表分页查询
+  zipdownload = '/ventanaly-sharefile/fileServer/zipdownload',
+  operateGasCheckTaskDetail = '/safety/gasDayReport/operateGasCheckTaskDetail',
+  getManageTasklist = '/safety/gasDayReport/getManageTasklist',
 }
 
 /**
  * 新增瓦斯巡检地址
- * @param params 
+ * @param params
  */
-export const addGasReportAddress = (params) => defHttp.post({ url: Api.addGasReportAddress,params });
+export const addGasReportAddress = (params) => defHttp.post({ url: Api.addGasReportAddress, params });
 /**
  * 下载文件目录
  * @param params
  */
-export const zipdownload = (params) => defHttp.post({ url: Api.zipdownload, params, responseType: 'blob' },{ joinParamsToUrl: true });
+export const zipdownload = (params) => defHttp.post({ url: Api.zipdownload, params, responseType: 'blob' }, { joinParamsToUrl: true });
 /**
  * 通过id(巡检卡id)查询
  * @param params
  */
-export const list = (params) => defHttp.get({ url: Api.list,params },);
+export const list = (params) => defHttp.get({ url: Api.list, params });
 
 /**
  * 导入瓦斯巡检地址
- * @param params 
+ * @param params
  */
 export const importByExcel = (params) => defHttp.post({ headers: { 'Content-Type': 'multipart/form-data' }, url: Api.importByExcel, params });
 
 /**
  * 导出瓦斯巡检地址
- * @param params 
+ * @param params
  */
 export const exportGasByExcel = (params) => defHttp.get({ url: Api.exportGasByExcel, params, responseType: 'blob' });
 
 /**
  * 查询所有区队
- * @param params 
+ * @param params
  */
-export const queryAllDisTeam = () => defHttp.get({ url: Api.queryAllDisTeam, });
+export const queryAllDisTeam = () => defHttp.get({ url: Api.queryAllDisTeam });
 /**
  * 上下移接口
- * @param params 
+ * @param params
  */
-export const moveOrderNum = (params) => defHttp.post({ url: Api.moveOrderNum,params });
+export const moveOrderNum = (params) => defHttp.post({ url: Api.moveOrderNum, params });
 /**
  * 瓦斯巡检地点编辑
- * @param params 
+ * @param params
  */
-export const edit = (params) => defHttp.post({ url: Api.edit,params });
+export const edit = (params) => defHttp.post({ url: Api.edit, params });
 
 /**
  * 瓦斯巡检卡-删除
@@ -76,29 +78,45 @@ export const clearCardInfo = (params) => defHttp.get({ url: Api.clearCardInfo, p
 /**
  * 获取早中晚班巡检员列表
  */
-export const getAllUserInfo = () => defHttp.get({ url: Api.getAllUserInfo, });
+export const getAllUserInfo = () => defHttp.get({ url: Api.getAllUserInfo });
 /**
  * 任务管理下发
- * @param params 
+ * @param params
  */
-export const taskSubmit = (params) => defHttp.post({ url: Api.taskSubmit,params });
+export const taskSubmit = (params) => defHttp.post({ url: Api.taskSubmit, params });
 /**
  * 获取所有巡检地址
  */
-export const getAllGasIns = () => defHttp.get({ url: Api.getAllGasIns, });
+export const getAllGasIns = () => defHttp.get({ url: Api.getAllGasIns });
 /**
  * 区队分页列表查询
  */
-export const teamList = (params) => defHttp.get({ url: Api.teamList, params}, { joinParamsToUrl: true });
+export const teamList = (params) => defHttp.get({ url: Api.teamList, params }, { joinParamsToUrl: true });
 /**
  * 区队添加
  */
-export const teamAdd = (params) => defHttp.post({ url: Api.teamAdd, params});
+export const teamAdd = (params) => defHttp.post({ url: Api.teamAdd, params });
 /**
  * 区队编辑
  */
-export const teamEdit = (params) => defHttp.put({ url: Api.teamEdit, params});
+export const teamEdit = (params) => defHttp.put({ url: Api.taskSubmit, params });
 /**
  * 区队删除
  */
-export const deleteTeam = (params) => defHttp.delete({ url: Api.deleteTeam, params }, { joinParamsToUrl: true });
+export const deleteTeam = (params) => defHttp.delete({ url: Api.deleteTeam, params }, { joinParamsToUrl: true });
+
+/**
+ * 瓦斯巡检任务明细列表分页查询
+ * @param params
+ */
+export const taskDetailsList = (params) => defHttp.get({ url: Api.taskDetailsList, params });
+/**
+ * 瓦斯巡检任务明细列表
+ * @param params
+ */
+export const operateGasCheckTaskDetail = (params) => defHttp.post({ url: Api.operateGasCheckTaskDetail, params });
+/**
+ * 瓦斯巡检任务明细管理列表
+ * @param params
+ */
+export const getManageTasklist = (params) => defHttp.post({ url: Api.getManageTasklist, params });

+ 386 - 157
src/views/vent/gas/gasInspect/gasInspect.data.ts

@@ -1,175 +1,404 @@
-import { BasicColumn } from '/@/components/Table';
+import { getAllUserInfo } from './gasInspect.api';
+import { BasicColumn, FormSchema } from '/@/components/Table';
+
 export const columns: BasicColumn[] = [
-    {
-        title: '序号',
-        width: 60,
-        align: 'center',
-        customRender: ({ index }: { index: number }) => `${index + 1}`
-    },
-    {
-        title: '巡检卡ID',
-        dataIndex: 'id',
-        key: 'id',
+  {
+    title: '序号',
+    width: 60,
+    align: 'center',
+    customRender: ({ index }: { index: number }) => `${index + 1}`,
+  },
+  {
+    title: '巡检卡ID',
+    dataIndex: 'id',
+    key: 'id',
+    align: 'center',
+  },
+  {
+    title: '地点',
+    dataIndex: 'strInstallPos',
+    key: 'strInstallPos',
+    align: 'center',
+  },
+  {
+    title: '巡检人',
+    children: [
+      {
+        title: '早班',
+        dataIndex: 'nameEarly',
+        key: 'nameEarly',
         align: 'center',
-    },
-    {
-        title: '地点',
-        dataIndex: 'strInstallPos',
-        key: 'strInstallPos',
-        align: 'center',
-    },
-    {
-        title: '巡检人',
-        children: [
-            {
-                title: '早班',
-                dataIndex: 'nameEarly',
-                key: 'nameEarly',
-                align: 'center',
-
-            },
-
-            {
-                title: '中班',
-                dataIndex: 'nameNoon',
-                key: 'nameNoon',
-                align: 'center',
-
-            },
-            {
-                title: '晚班',
-                dataIndex: 'nameNight',
-                key: 'nameNight',
-                align: 'center',
-
-            },
-        ],
-    },
-    {
-        title: '是否巡检',
-        children: [
-            {
-                title: '',
-                dataIndex: 'insType',
-                key: 'insType',
-                align: 'center',
-
-            },
-            {
-                title: '早班',
-                dataIndex: 'morning',
-                key: 'morning',
-                align: 'center',
+      },
 
-            },
-
-            {
-                title: '中班',
-                dataIndex: 'afterNoon',
-                key: 'afterNoon',
-                align: 'center',
-
-            },
-            {
-                title: '晚班',
-                dataIndex: 'evening',
-                key: 'eevening',
-                align: 'center',
-
-            },
-        ],
-    },
-    {
-        title: '操作',
-        dataIndex: 'action',
-        width: 250,
+      {
+        title: '中班',
+        dataIndex: 'nameNoon',
+        key: 'nameNoon',
         align: 'center',
-        slots: { customRender: 'action' },
-    },
-];
-export const columnsTask: BasicColumn[] = ([
-    {
-        title: '序号',
-        width: 60,
+      },
+      {
+        title: '晚班',
+        dataIndex: 'nameNight',
+        key: 'nameNight',
         align: 'center',
-        customRender: ({ index }: { index: number }) => `${index + 1}`
-    },
-    {
-        title: '所属队别',
-        dataIndex: 'name',
-        key: 'name',
+      },
+    ],
+  },
+  {
+    title: '是否巡检',
+    children: [
+      {
+        title: '',
+        dataIndex: 'insType',
+        key: 'insType',
         align: 'center',
-    },
-    {
-        title: '早班巡检',
-        dataIndex: 'accountEarly',
-        key: 'accountEarly',
+      },
+      {
+        title: '早班',
+        dataIndex: 'morning',
+        key: 'morning',
         align: 'center',
-    },
-    {
-        title: '中班巡检',
-        dataIndex: 'accountNoon',
-        key: 'accountNoon',
-        align: 'center',
-    },
-    {
-        title: '晚班巡检',
-        dataIndex: 'accountNight',
-        key: 'accountNight',
+      },
+
+      {
+        title: '中班',
+        dataIndex: 'afterNoon',
+        key: 'afterNoon',
         align: 'center',
-    },
-    {
-        title: '操作',
-        dataIndex: 'action',
-        width: 120,
+      },
+      {
+        title: '晚班',
+        dataIndex: 'evening',
+        key: 'eevening',
         align: 'center',
-        slots: { customRender: 'action' },
-    },
-])
+      },
+    ],
+  },
+  {
+    title: '操作',
+    dataIndex: 'action',
+    width: 250,
+    align: 'center',
+    slots: { customRender: 'action' },
+  },
+];
+export const columnsTask: BasicColumn[] = [
+  {
+    title: '序号',
+    width: 60,
+    align: 'center',
+    customRender: ({ index }: { index: number }) => `${index + 1}`,
+  },
+  {
+    title: '所属队别',
+    dataIndex: 'name',
+    key: 'name',
+    align: 'center',
+  },
+  {
+    title: '早班巡检',
+    dataIndex: 'accountEarly',
+    key: 'accountEarly',
+    align: 'center',
+  },
+  {
+    title: '中班巡检',
+    dataIndex: 'accountNoon',
+    key: 'accountNoon',
+    align: 'center',
+  },
+  {
+    title: '晚班巡检',
+    dataIndex: 'accountNight',
+    key: 'accountNight',
+    align: 'center',
+  },
+  {
+    title: '操作',
+    dataIndex: 'action',
+    width: 120,
+    align: 'center',
+    slots: { customRender: 'action' },
+  },
+];
 //区队管理列表列
 export const columnsTeam: BasicColumn[] = [
-    {
-        title: '序号',
-        width: 60,
-        align: 'center',
-        customRender: ({ index }: { index: number }) => `${index + 1}`
-    },
-    {
-        title: 'ID',
-        dataIndex: 'id',
-        key: 'id',
-        align: 'center',
-    },
-    {
-        title: '区队',
-        dataIndex: 'name',
-        key: 'name',
-        align: 'center',
-    },
-   
-    {
-        title: '操作',
-        dataIndex: 'action',
-        width: 180,
-        align: 'center',
-        slots: { customRender: 'action' },
-    },
+  {
+    title: '序号',
+    width: 60,
+    align: 'center',
+    customRender: ({ index }: { index: number }) => `${index + 1}`,
+  },
+  {
+    title: 'ID',
+    dataIndex: 'id',
+    key: 'id',
+    align: 'center',
+  },
+  {
+    title: '区队',
+    dataIndex: 'name',
+    key: 'name',
+    align: 'center',
+  },
+
+  {
+    title: '操作',
+    dataIndex: 'action',
+    width: 180,
+    align: 'center',
+    slots: { customRender: 'action' },
+  },
 ];
 //分页参数
 export const pagination = {
-    current: 1, // 当前页码
-    pageSize: 10, // 每页显示条数
-    total: 0, // 总条目数,后端返回
-    // showTotal: (total, range) => `${range[0]}-${range[1]} 条,总共 ${total} 条`, // 分页右下角显示信息
-    showSizeChanger: true, // 是否可改变每页显示条数
-    pageSizeOptions: ['10', '20', '50'], // 可选的每页显示条数
+  current: 1, // 当前页码
+  pageSize: 10, // 每页显示条数
+  total: 0, // 总条目数,后端返回
+  // showTotal: (total, range) => `${range[0]}-${range[1]} 条,总共 ${total} 条`, // 分页右下角显示信息
+  showSizeChanger: true, // 是否可改变每页显示条数
+  pageSizeOptions: ['10', '20', '50'], // 可选的每页显示条数
 };
 //区队管理分页参数
 export const paginationTeam = {
-    current: 1, // 当前页码
-    pageSize: 5, // 每页显示条数
-    total: 0, // 总条目数,后端返回
-    // showTotal: (total, range) => `${range[0]}-${range[1]} 条,总共 ${total} 条`, // 分页右下角显示信息
-    showSizeChanger: true, // 是否可改变每页显示条数
-    pageSizeOptions: ['5','10', '20', '50'], // 可选的每页显示条数
+  current: 1, // 当前页码
+  pageSize: 5, // 每页显示条数
+  total: 0, // 总条目数,后端返回
+  // showTotal: (total, range) => `${range[0]}-${range[1]} 条,总共 ${total} 条`, // 分页右下角显示信息
+  showSizeChanger: true, // 是否可改变每页显示条数
+  pageSizeOptions: ['5', '10', '20', '50'], // 可选的每页显示条数
 };
+
+// 任务表格
+export const taskColumns: BasicColumn[] = [
+  {
+    title: '序号',
+    width: 60,
+    align: 'center',
+    customRender: ({ index }: { index: number }) => `${index + 1}`,
+  },
+  // {
+  //   title: 'ID',
+  //   dataIndex: 'id',
+  //   key: 'id',
+  //   align: 'center',
+  // },
+  {
+    title: '任务名称',
+    dataIndex: 'name',
+    key: 'name',
+    align: 'center',
+  },
+  // {
+  //   title: '早班巡检人账号',
+  //   dataIndex: 'accountEarly',
+  //   key: 'accountEarly',
+  //   align: 'center',
+  //   edit: true,
+  //   editComponent: 'ApiSelect',
+  //   editComponentProps: {
+  //     api: getAllUserInfo,
+  //     labelField: 'realname',
+  //     valueField: 'id',
+  //   },
+  // },
+  // {
+  //   title: '午班巡检人账号',
+  //   dataIndex: 'accountNoon',
+  //   key: 'accountNoon',
+  //   align: 'center',
+  //   edit: true,
+  //   editComponent: 'ApiSelect',
+  //   editComponentProps: {
+  //     api: getAllUserInfo,
+  //     labelField: 'realname',
+  //     valueField: 'id',
+  //   },
+  // },
+  // {
+  //   title: '晚班巡检人账号',
+  //   dataIndex: 'accountNight',
+  //   key: 'accountNight',
+  //   align: 'center',
+  //   edit: true,
+  //   editComponent: 'ApiSelect',
+  //   editComponentProps: {
+  //     api: getAllUserInfo,
+  //     labelField: 'realname',
+  //     valueField: 'id',
+  //   },
+  // },
+  {
+    title: '任务班次',
+    dataIndex: 'classType_dictText',
+    key: 'classType_dictText',
+    align: 'center',
+  },
+  {
+    title: '总巡检数',
+    dataIndex: 'totalCheckNum',
+    key: 'totalCheckNum',
+    align: 'center',
+  },
+  {
+    title: '未巡检数',
+    dataIndex: 'missCheckNum',
+    key: 'missCheckNum',
+    align: 'center',
+  },
+  {
+    title: '创建人',
+    dataIndex: 'createBy',
+    key: 'createBy',
+    align: 'center',
+  },
+  {
+    title: '创建日期',
+    dataIndex: 'createTime',
+    key: 'createTime',
+    align: 'center',
+  },
+];
+
+export const taskschemas: FormSchema[] = [
+  {
+    label: 'ID',
+    field: 'id',
+    component: 'Input',
+    show: false,
+  },
+  {
+    label: '任务名称',
+    field: 'name',
+    component: 'Input',
+    labelWidth: 100,
+  },
+  // {
+  //   label: '早班巡检人账号',
+  //   field: 'accountEarly',
+  //   component: 'ApiSelect',
+  //   componentProps: {
+  //     api: getAllUserInfo,
+  //     labelField: 'realname',
+  //     valueField: 'id',
+  //   },
+  // },
+  // {
+  //   label: '午班巡检人账号',
+  //   field: 'accountNoon',
+  //   component: 'ApiSelect',
+  //   componentProps: {
+  //     api: getAllUserInfo,
+  //     labelField: 'realname',
+  //     valueField: 'id',
+  //   },
+  // },
+  // {
+  //   label: '晚班巡检人账号',
+  //   field: 'accountNight',
+  //   component: 'ApiSelect',
+  //   componentProps: {
+  //     api: getAllUserInfo,
+  //     labelField: 'realname',
+  //     valueField: 'id',
+  //   },
+  // },
+  {
+    label: '任务班次',
+    field: 'classType',
+    component: 'JDictSelectTag',
+    componentProps: {
+      dictCode: 'classType',
+      placeholder: '请选择任务班次',
+    },
+    labelWidth: 100,
+  },
+];
+
+// 任务详细表格
+export const taskManageColumns: BasicColumn[] = [
+  {
+    title: '序号',
+    width: 60,
+    align: 'center',
+    customRender: ({ index }: { index: number }) => `${index + 1}`,
+  },
+  {
+    title: '巡检地址',
+    dataIndex: 'deviceName',
+    key: 'deviceName',
+    align: 'center',
+    width: 300,
+  },
+  {
+    title: '巡检次数',
+    dataIndex: 'checkNum',
+    key: 'checkNum',
+    align: 'center',
+  },
+  {
+    title: '任务名称',
+    dataIndex: 'taskName',
+    key: 'taskName',
+    align: 'center',
+  },
+  {
+    title: '任务班次',
+    dataIndex: 'classType',
+    key: 'classType',
+    align: 'center',
+  },
+  {
+    title: '已关联当前任务',
+    dataIndex: 'isSelect',
+    key: 'isSelect',
+    align: 'center',
+  },
+  {
+    title: '已关联其它任务',
+    dataIndex: 'isOtherSelect',
+    key: 'isOtherSelect',
+    align: 'center',
+  },
+];
+
+// 任务详细表格
+export const taskDetailsColumns: BasicColumn[] = [
+  {
+    title: '序号',
+    width: 60,
+    align: 'center',
+    customRender: ({ index }: { index: number }) => `${index + 1}`,
+  },
+  {
+    title: '巡检地址',
+    dataIndex: 'deviceName',
+    key: 'deviceName',
+    align: 'center',
+    width: 300,
+  },
+  {
+    title: '巡检次数',
+    dataIndex: 'checkNum',
+    key: 'checkNum',
+    align: 'center',
+  },
+  {
+    title: '任务名称',
+    dataIndex: 'taskName',
+    key: 'taskName',
+    align: 'center',
+  },
+  {
+    title: '任务班次',
+    dataIndex: 'classType_dictText',
+    key: 'classType_dictText',
+    align: 'center',
+  },
+  {
+    title: '巡检状态',
+    dataIndex: 'checkState',
+    key: 'checkState',
+    align: 'center',
+  },
+];

+ 284 - 0
src/views/vent/gas/gasInspect/index2.vue

@@ -0,0 +1,284 @@
+<!-- eslint-disable vue/multi-word-component-names -->
+<template>
+  <div class="gasReport">
+    <customHeader>瓦斯巡检任务管理</customHeader>
+    <div class="report-container">
+      <a-space class="search-area">
+        <a-button type="primary" preIcon="ant-design:plus-outlined" @click="handleEdit">新增任务</a-button>
+      </a-space>
+      <BasicTable @register="registerTable1">
+        <template #action="{ record }">
+          <a class="table-action-link" @click="handleManage(record)">管理</a>
+          <a class="table-action-link" @click="handleDetail(record)">详情</a>
+          <a class="table-action-link" @click="handleEdit(record)">编辑</a>
+          <a-popconfirm title="删除内容无法恢复,是否删除" ok-text="确定" cancel-text="取消" @confirm="handleDelete(record)">
+            <a class="table-action-link">删除</a>
+          </a-popconfirm>
+        </template>
+      </BasicTable>
+      <BasicModal :destroy-on-close="true" title="任务表单" @register="registerModal1" @ok="handleSubmit">
+        <BasicForm @register="registerForm" />
+      </BasicModal>
+      <BasicModal :destroy-on-close="true" title="任务详情列表" :show-ok-btn="false" :width="1200" @register="registerModal2">
+        <a-space class="search-area mb-10px">
+          <div class="item-text">巡检地址:</div>
+          <a-input style="width: 240px" v-model:value="searchParams2.deviceName" placeholder="请输入巡检地址" />
+          <a-button type="primary" preIcon="ant-design:search-outlined" class="ml-10px" @click="tableContext2.reload()">查询</a-button>
+        </a-space>
+        <BasicTable @register="registerTable2">
+          <!-- <template #action="{ record }"> </template> -->
+          <template #bodyCell="{ column, text }">
+            <template v-if="column.dataIndex == 'checkState'">
+              <div v-if="text == true">
+                <div class="table-text color-green">已检</div>
+              </div>
+              <div v-else>
+                <div class="table-text color-red">未检</div>
+              </div>
+            </template>
+          </template>
+        </BasicTable>
+      </BasicModal>
+      <BasicModal :destroy-on-close="true" title="任务管理列表" :width="1200" :show-ok-btn="false" @register="registerModal3">
+        <a-space class="search-area mb-10px">
+          <div class="item-text">巡检地址:</div>
+          <a-input style="width: 240px" v-model:value="searchParams3.deviceName" placeholder="请输入巡检地址" />
+          <a-button type="primary" preIcon="ant-design:search-outlined" class="ml-10px" @click="tableContext3.reload()">查询</a-button>
+          <a-popconfirm title="确认操作" ok-text="确定" cancel-text="取消" @confirm="handlePatch('add')">
+            <a-button type="primary" preIcon="ant-design:plus-outlined">添加</a-button>
+          </a-popconfirm>
+          <a-popconfirm title="删除内容无法取消,是否删除" ok-text="确定" cancel-text="取消" @confirm="handlePatch('del')">
+            <a-button type="primary" preIcon="ant-design:close-outlined">删除</a-button>
+          </a-popconfirm>
+        </a-space>
+        <BasicTable :rowSelection="rowSelection" @register="registerTable3">
+          <!-- <template #action="{ record }"> </template> -->
+          <template #bodyCell="{ column, text }">
+            <template v-if="column.dataIndex == 'isSelect'">
+              <div v-if="text == true">
+                <div class="table-text color-green">是</div>
+              </div>
+              <div v-else>
+                <div class="table-text">否</div>
+              </div>
+            </template>
+            <template v-if="column.dataIndex == 'isOtherSelect'">
+              <div v-if="text == true">
+                <div class="table-text color-green">是</div>
+              </div>
+              <div v-else>
+                <div class="table-text">否</div>
+              </div>
+            </template>
+          </template>
+        </BasicTable>
+      </BasicModal>
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+  import { ref, onMounted, nextTick } from 'vue';
+  import customHeader from '/@/components/vent/customHeader.vue';
+  import { taskColumns, pagination, taskschemas, taskDetailsColumns, taskManageColumns } from './gasInspect.data';
+  import { deleteTeam, getManageTasklist, operateGasCheckTaskDetail, taskDetailsList, teamAdd, teamEdit, teamList } from './gasInspect.api';
+  import { BasicTable } from '/@/components/Table';
+  import { useListPage } from '/@/hooks/system/useListPage';
+  import { message } from 'ant-design-vue';
+  import { BasicModal, useModal } from '/@/components/Modal';
+  import { BasicForm, useForm } from '/@/components/Form';
+
+  // 任务列表
+  const { tableContext: tx1 } = useListPage({
+    tableProps: {
+      api: teamList,
+      columns: taskColumns,
+      pagination,
+      actionColumn: {
+        title: '操作',
+        dataIndex: 'action',
+        width: 250,
+        align: 'center',
+        slots: { customRender: 'action' },
+      },
+      showTableSetting: false,
+      useSearchForm: false,
+    },
+    pagination: true,
+  });
+  // 任务详情列表
+  const searchParams2 = ref<any>({ deviceName: '' });
+  const { tableContext: tx2 } = useListPage({
+    tableProps: {
+      api: taskDetailsList,
+      beforeFetch: (params) => {
+        Object.assign(params, {
+          ...searchParams2.value,
+          taskId: selectedRow.value.id,
+        });
+      },
+      columns: taskDetailsColumns,
+      pagination,
+      showActionColumn: false,
+      showTableSetting: false,
+      useSearchForm: false,
+    },
+    pagination: true,
+  });
+  // 任务管理列表
+  const searchParams3 = ref<any>({ deviceName: '' });
+  const { tableContext: tx3 } = useListPage({
+    tableProps: {
+      api: getManageTasklist,
+      beforeFetch: (params) => {
+        Object.assign(params, {
+          ...searchParams3.value,
+          taskId: selectedRow.value.id,
+        });
+      },
+      afterFetch(resultItems) {
+        resultItems.forEach((item, i) => {
+          item.id = i;
+        });
+        return resultItems;
+      },
+      rowSelection: {
+        type: 'checkbox',
+        getCheckboxProps: (record) => {
+          return {
+            disabled: record.isOtherSelect,
+          };
+        },
+      },
+      canResize: false,
+      columns: taskManageColumns,
+      showActionColumn: false,
+      showTableSetting: false,
+      useSearchForm: false,
+    },
+    // pagination: false,
+  });
+  const [registerTable1, tableContext1] = tx1;
+  const [registerTable2, tableContext2] = tx2;
+  const [registerTable3, tableContext3, { rowSelection, selectedRows }] = tx3;
+  const [registerModal1, modalContext1] = useModal();
+  const [registerModal2, modalContext2] = useModal();
+  const [registerModal3, modalContext3] = useModal();
+  const [registerForm, formContext1] = useForm({
+    showActionButtonGroup: false,
+    schemas: taskschemas,
+    labelWidth: 170,
+  });
+
+  const selectedRow = ref<any>({});
+
+  // 任务编辑/新增
+  function handleEdit(record) {
+    modalContext1.openModal();
+    nextTick(async () => {
+      await formContext1.resetFields();
+      await formContext1.setFieldsValue(record);
+    });
+  }
+
+  // 任务删除
+  function handleDelete({ id }) {
+    deleteTeam({ id }).then(() => {
+      message.success('删除成功');
+    });
+  }
+
+  // 任务管理
+  function handleManage(record) {
+    selectedRow.value = record;
+    modalContext3.openModal();
+    nextTick(() => {
+      tableContext3.clearSelectedRowKeys();
+    });
+  }
+
+  // 详情管理
+  function handleDetail(record) {
+    selectedRow.value = record;
+    modalContext2.openModal();
+  }
+
+  // 关联明细
+  function handlePatch(mode) {
+    operateGasCheckTaskDetail({
+      taskId: selectedRow.value.id,
+      operateList: selectedRows.value.map((e) => {
+        return {
+          deviceId: e.deviceId, //设备id(巡检地址id)
+          checkNum: e.checkNum, //巡检次数
+          operateType: mode, //操作类型,新增:add,删除:del
+        };
+      }),
+    }).then(() => {
+      message.success('操作成功');
+      tableContext3.clearSelectedRowKeys();
+      tableContext3.reload();
+      tableContext1.reload();
+    });
+  }
+
+  function handleSubmit() {
+    formContext1.validate().then((formData) => {
+      if (formData.id) {
+        teamEdit(formData).then(() => {
+          modalContext1.closeModal();
+          tableContext1.reload();
+        });
+      } else {
+        teamAdd(formData).then(() => {
+          modalContext1.closeModal();
+          tableContext1.reload();
+        });
+      }
+    });
+  }
+
+  onMounted(() => {});
+</script>
+
+<style lang="less" scoped>
+  .gasReport {
+    width: 100%;
+    height: 100%;
+    padding: 80px 10px 15px 10px;
+    box-sizing: border-box;
+    position: relative;
+
+    .search-area {
+      margin: 20px 0px;
+
+      .area-item {
+        display: flex;
+        align-items: center;
+
+        .item-text {
+          color: #fff;
+        }
+      }
+    }
+
+    .table-text {
+      margin-bottom: 5px;
+    }
+
+    .text-y {
+      color: #0be716;
+    }
+
+    .text-n {
+      color: #ff0000;
+    }
+
+    .zxm-picker,
+    .zxm-input {
+      border: 1px solid #3ad8ff77 !important;
+      background-color: #ffffff00 !important;
+      color: #fff !important;
+    }
+  }
+</style>

+ 77 - 0
src/views/vent/gas/gasInspectNonfc/components/addressAdd2.vue

@@ -0,0 +1,77 @@
+<template>
+  <div class="inspectEdit">
+    <a-form :model="formAddress" name="basic" :label-col="{ span: 8 }" :wrapper-col="{ span: 12 }" autocomplete="off">
+      <a-form-item label="巡检类型:">
+        <JDictSelectTag v-model:value="formAddress.insType" placeholder="请选择巡检类型" dictCode="ins_type" style="width: 220px" />
+      </a-form-item>
+      <a-form-item label="巡检区域:">
+        <a-input v-model:value="formAddress.strremark" style="width: 220px" />
+      </a-form-item>
+      <a-form-item label="巡检地址:">
+        <a-input v-model:value="formAddress.strinstallpos" style="width: 220px" />
+      </a-form-item>
+      <a-form-item label="是否有传感器:">
+        <a-checkbox v-model:checked="formAddress.isSensor" style="width: 220px" />
+      </a-form-item>
+    </a-form>
+    <div class="edit-btn">
+      <a-button @click="cancelAddress">取消</a-button>
+      <a-button type="primary" @click="confirmAddress">确定</a-button>
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+  import { ref, onMounted } from 'vue';
+  import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue';
+
+  let formAddress = ref<any>({
+    insType: '',
+    strremark: '',
+    strinstallpos: '',
+    isSensor: false,
+  });
+  let $emit = defineEmits(['confirmAddress', 'cancelAddress']);
+
+  //确定
+  let confirmAddress = () => {
+    $emit('confirmAddress', {
+      ...formAddress.value,
+      isSensor: formAddress.value.isSensor ? '1' : '0',
+    });
+  };
+  //取消
+  let cancelAddress = () => {
+    formAddress.value = {
+      insType: '',
+      strremark: '',
+      strinstallpos: '',
+      isSensor: false,
+    };
+    $emit('cancelAddress');
+  };
+
+  onMounted(() => {});
+</script>
+
+<style lang="less" scoped>
+  .inspectEdit {
+    padding: 10px;
+    box-sizing: border-box;
+
+    .edit-btn {
+      display: flex;
+      justify-content: flex-end;
+
+      .zxm-btn {
+        margin: 0px 10px;
+      }
+    }
+  }
+
+  :deep(.zxm-input) {
+    color: #fff;
+    border: 1px solid #3ad8ff77 !important;
+    background-color: #ffffff00 !important;
+  }
+</style>

+ 117 - 0
src/views/vent/gas/gasInspectNonfc/components/inspectEdit2.vue

@@ -0,0 +1,117 @@
+<template>
+  <div class="inspectEdit">
+    <a-form :model="formStateEdit" name="basic" :label-col="{ span: 8 }" :wrapper-col="{ span: 12 }" autocomplete="off">
+      <a-form-item v-show="false" label="瓦斯巡检卡ID:">
+        <a-input v-model:value="formStateEdit.id" disabled />
+      </a-form-item>
+      <a-form-item label="瓦斯巡检地点:">
+        <a-input v-model:value="formStateEdit.strinstallpos" placeholder="请输入瓦斯巡检地点" clearable />
+      </a-form-item>
+      <a-form-item label="巡检区域:">
+        <a-input v-model:value="formStateEdit.strremark" style="width: 220px" />
+      </a-form-item>
+      <a-form-item label="巡检类型:">
+        <JDictSelectTag v-model:value="formStateEdit.insType" placeholder="请选择巡检类型" dictCode="ins_type" style="width: 240px" />
+      </a-form-item>
+      <a-form-item label="是否有传感器:">
+        <a-checkbox v-model:checked="formStateEdit.isSensor" style="width: 220px" />
+      </a-form-item>
+    </a-form>
+    <div class="edit-btn">
+      <a-button @click="cancelEdit">取消</a-button>
+      <a-button type="primary" @click="confirmEdit">提交</a-button>
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+  import { ref, onMounted, watch } from 'vue';
+  import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue';
+  import { queryAllDisTeam } from '../gasInspectNonfc.api';
+
+  let props = defineProps({
+    inspectEditData: {
+      type: Object,
+      default: () => {
+        return {};
+      },
+    },
+  });
+
+  let formStateEdit = ref<any>({
+    id: '',
+    strinstallpos: '',
+    isSensor: false,
+    disTeamId: '',
+    insType: '',
+  });
+
+  let qdList = ref<any[]>([]); //区队下拉选项列表
+  let $emit = defineEmits(['confirmEdit', 'cancelEdit']);
+
+  //查询所有区队
+  async function queryAllDisTeamList() {
+    let res = await queryAllDisTeam();
+    if (res.length != 0) {
+      qdList.value = res.map((m) => {
+        return {
+          label: m.name,
+          value: m.id,
+        };
+      });
+    }
+  }
+  //编辑提交
+  let confirmEdit = () => {
+    $emit('confirmEdit', {
+      ...formStateEdit.value,
+      isSensor: formStateEdit.value.isSensor ? '1' : '0',
+    });
+  };
+  //编辑取消
+  let cancelEdit = () => {
+    formStateEdit.value = {
+      id: '',
+      strinstallpos: '',
+      isSensor: false,
+      disTeamId: '',
+      insType: '',
+    };
+    $emit('cancelEdit');
+  };
+  watch(
+    () => props.inspectEditData,
+    (newV) => {
+      formStateEdit.value = {
+        ...newV,
+        isSensor: newV.isSensor == '1',
+      };
+    },
+    { immediate: true }
+  );
+  onMounted(() => {
+    queryAllDisTeamList();
+  });
+</script>
+
+<style lang="less" scoped>
+  .inspectEdit {
+    padding: 10px;
+    box-sizing: border-box;
+
+    .edit-btn {
+      display: flex;
+      justify-content: flex-end;
+
+      .zxm-btn {
+        margin: 0px 10px;
+      }
+    }
+  }
+
+  :deep(.zxm-input) {
+    color: #fff;
+    border: 1px solid #3ad8ff77 !important;
+    background-color: #ffffff00 !important;
+  }
+</style>

+ 27 - 27
src/views/vent/gas/gasInspectNonfc/gasInspectNonfc.api.ts

@@ -1,63 +1,63 @@
 import { defHttp } from '/@/utils/http/axios';
 
-
 enum Api {
-    list = '/safety/gasIns/list',//通过id(巡检卡id)查询
-    importByExcel='/safety/gasDayReport/importGasIns',//导入瓦斯巡检地址
-    exportGasByExcel='/safety/gasDayReport/exportGasIns',//导出瓦斯巡检地址
-    queryAllDisTeam='/safety/disTeamInfo/queryAllDisTeam',//查询所有区队
-    moveOrderNum='/safety/gasIns/moveOrderNum',//上下移接口
-    edit='/safety/gasIns/edit',//瓦斯巡检地点编辑
-    deleteCard='/safety/gasInsCard/delete',//瓦斯巡检卡删除
-    taskSubmit='/safety/disTeamInfo/edit',//任务管理下发
-    clearCardInfo='/safety/gasIns/delete',//瓦斯巡检卡信息删除
-    getAllUserInfo='/safety/gasInsCard/getAllUserInfo',//获取早中晚班巡检员列表
-    addGasReportAddress= '/safety/gasDayReport/addGasReportAddress'//新增瓦斯巡检地址
+  list = '/safety/gasIns/list', //通过id(巡检卡id)查询
+  importByExcel = '/safety/gasDayReport/importGasIns', //导入瓦斯巡检地址
+  exportGasByExcel = '/safety/gasDayReport/exportGasIns', //导出瓦斯巡检地址
+  queryAllDisTeam = '/safety/disTeamInfo/queryAllDisTeam', //查询所有区队
+  moveOrderNum = '/safety/gasIns/moveOrderNum', //上下移接口
+  edit = '/safety/gasIns/edit', //瓦斯巡检地点编辑
+  deleteCard = '/safety/gasInsCard/delete', //瓦斯巡检卡删除
+  taskSubmit = '/safety/disTeamInfo/edit', //任务管理下发
+  clearCardInfo = '/safety/gasIns/delete', //瓦斯巡检卡信息删除
+  getAllUserInfo = '/safety/gasInsCard/getAllUserInfo', //获取早中晚班巡检员列表
+  addGasReportAddress = '/safety/gasDayReport/addGasReportAddress', //新增瓦斯巡检地址
+  zipdownload = '/ventanaly-sharefile/fileServer/zipdownload',
 }
 
 /**
  * 新增瓦斯巡检地址
- * @param params 
+ * @param params
  */
-export const addGasReportAddress = (params) => defHttp.post({ url: Api.addGasReportAddress,params });
+export const addGasReportAddress = (params) => defHttp.post({ url: Api.addGasReportAddress, params });
 /**
  * 下载文件目录
  * @param params
  */
-export const zipdownload = (params) => defHttp.post({ url: Api.zipdownload, params, responseType: 'blob' },{ joinParamsToUrl: true });
+export const zipdownload = (params) => defHttp.post({ url: Api.zipdownload, params, responseType: 'blob' }, { joinParamsToUrl: true });
 /**
  * 通过id(巡检卡id)查询
  * @param params
  */
-export const list = (params) => defHttp.get({ url: Api.list,params },);
+export const list = (params) => defHttp.get({ url: Api.list, params });
 
 /**
  * 导入瓦斯巡检地址
- * @param params 
+ * @param params
  */
 export const importByExcel = (params) => defHttp.post({ headers: { 'Content-Type': 'multipart/form-data' }, url: Api.importByExcel, params });
 
 /**
  * 导出瓦斯巡检地址
- * @param params 
+ * @param params
  */
 export const exportGasByExcel = (params) => defHttp.get({ url: Api.exportGasByExcel, params, responseType: 'blob' });
 
 /**
  * 查询所有区队
- * @param params 
+ * @param params
  */
-export const queryAllDisTeam = () => defHttp.get({ url: Api.queryAllDisTeam, });
+export const queryAllDisTeam = () => defHttp.get({ url: Api.queryAllDisTeam });
 /**
  * 上下移接口
- * @param params 
+ * @param params
  */
-export const moveOrderNum = (params) => defHttp.post({ url: Api.moveOrderNum,params });
+export const moveOrderNum = (params) => defHttp.post({ url: Api.moveOrderNum, params });
 /**
  * 瓦斯巡检地点编辑
- * @param params 
+ * @param params
  */
-export const edit = (params) => defHttp.post({ url: Api.edit,params });
+export const edit = (params) => defHttp.post({ url: Api.edit, params });
 
 /**
  * 瓦斯巡检卡-删除
@@ -70,9 +70,9 @@ export const clearCardInfo = (params) => defHttp.delete({ url: Api.clearCardInfo
 /**
  * 获取早中晚班巡检员列表
  */
-export const getAllUserInfo = () => defHttp.get({ url: Api.getAllUserInfo, });
+export const getAllUserInfo = () => defHttp.get({ url: Api.getAllUserInfo });
 /**
  * 任务管理下发
- * @param params 
+ * @param params
  */
-export const taskSubmit = (params) => defHttp.post({ url: Api.taskSubmit,params });
+export const taskSubmit = (params) => defHttp.post({ url: Api.taskSubmit, params });

+ 62 - 50
src/views/vent/gas/gasInspectNonfc/gasInspectNonfc.data.ts

@@ -142,72 +142,84 @@ export const columns2: BasicColumn[] = [
     align: 'center',
     customRender: ({ index }: { index: number }) => `${index + 1}`,
   },
-  {
-    title: 'ID',
-    dataIndex: 'id',
-    key: 'id',
-    align: 'center',
-  },
-  {
-    title: '任务名称',
-    dataIndex: 'taskName',
-    key: 'taskName',
-    align: 'center',
-  },
+  // {
+  //   title: 'ID',
+  //   dataIndex: 'id',
+  //   key: 'id',
+  //   align: 'center',
+  // },
+  // {
+  //   title: '任务名称',
+  //   dataIndex: 'taskName',
+  //   key: 'taskName',
+  //   align: 'center',
+  // },
   {
     title: '巡检地址',
-    dataIndex: 'deviceName',
-    key: 'deviceName',
-    align: 'center',
-  },
-  {
-    title: '巡检次数',
-    dataIndex: 'checkNum',
-    key: 'checkNum',
+    dataIndex: 'strinstallpos',
+    key: 'strinstallpos',
     align: 'center',
   },
   {
-    title: '班类型',
-    dataIndex: 'classType',
-    key: 'classType',
+    title: '巡检区域',
+    dataIndex: 'strremark',
+    key: 'strremark',
     align: 'center',
   },
   {
-    title: '巡检状态',
-    dataIndex: 'checkState',
-    key: 'checkState',
+    title: '巡检类型',
+    dataIndex: 'insType',
+    key: 'insType',
     align: 'center',
   },
+  // {
+  //   title: '巡检次数',
+  //   dataIndex: 'checkNum',
+  //   key: 'checkNum',
+  //   align: 'center',
+  // },
+  // {
+  //   title: '班类型',
+  //   dataIndex: 'classType',
+  //   key: 'classType',
+  //   align: 'center',
+  // },
+  // {
+  //   title: '巡检状态',
+  //   dataIndex: 'checkState',
+  //   key: 'checkState',
+  //   align: 'center',
+  // },
   {
     title: '是否有传感器',
     dataIndex: 'isSensor',
     key: 'isSensor',
     align: 'center',
   },
-  {
-    title: '创建人',
-    dataIndex: 'createBy',
-    key: 'createBy',
-    align: 'center',
-  },
-  {
-    title: '创建日期',
-    dataIndex: 'createTime',
-    key: 'createTime',
-    align: 'center',
-  },
-  {
-    title: '更新人',
-    dataIndex: 'updateBy',
-    key: 'updateBy',
-    align: 'center',
-  },
-  {
-    title: '更新日期',
-    dataIndex: 'updateTime',
-    key: 'updateTime',
-    align: 'center',
-  },
+  // {
+  //   title: '创建人',
+  //   dataIndex: 'createBy',
+  //   key: 'createBy',
+  //   align: 'center',
+  // },
+  // {
+  //   title: '创建日期',
+  //   dataIndex: 'createTime',
+  //   key: 'createTime',
+  //   align: 'center',
+  // },
+  // {
+  //   title: '更新人',
+  //   dataIndex: 'updateBy',
+  //   key: 'updateBy',
+  //   align: 'center',
+  // },
+  // {
+  //   title: '更新日期',
+  //   dataIndex: 'updateTime',
+  //   key: 'updateTime',
+  //   align: 'center',
+  // },
   {
     title: '操作',
     dataIndex: 'action',

+ 17 - 38
src/views/vent/gas/gasInspectNonfc/index2.vue

@@ -7,35 +7,16 @@
         <a-row>
           <a-col :span="4">
             <div class="area-item">
-              <div class="item-text">巡检卡ID:</div>
-              <a-input style="width: 240px" v-model:value="searchId" placeholder="请输入巡检卡ID" />
+              <div class="item-text">地点:</div>
+              <a-input style="width: 240px" v-model:value="searchParams" placeholder="请输入地点" />
             </div>
           </a-col>
           <a-col :span="20">
-            <a-button type="primary" preIcon="ant-design:search-outlined" style="margin-left: 10px" @click="getSearchCardId">查询</a-button>
-            <a-button preIcon="ant-design:sync-outlined" style="margin: 0px 15px" @click="getReset">重置</a-button>
-            <a-button type="primary" preIcon="ant-design:import-outlined" @click="getupload">导入</a-button>
-            <a-button type="primary" preIcon="ant-design:download-outlined" style="margin: 0px 15px" @click="getdownload">导出</a-button>
-            <a-dropdown>
-              <template #overlay>
-                <a-menu @click="handlerFilter">
-                  <a-menu-item key="1">
-                    <UserOutlined />
-                    一次
-                  </a-menu-item>
-                  <a-menu-divider />
-                  <a-menu-item key="2">
-                    <UserOutlined />
-                    两次
-                  </a-menu-item>
-                </a-menu>
-              </template>
-              <a-button type="primary">
-                巡检次数筛选
-                <DownOutlined />
-              </a-button>
-            </a-dropdown>
-            <a-button type="primary" preIcon="ant-design:plus-outlined" style="margin-left: 15px" @click="getTjAddress">新增瓦斯巡检地址</a-button>
+            <a-button type="primary" preIcon="ant-design:search-outlined" class="" @click="getSearchCardId">查询</a-button>
+            <a-button preIcon="ant-design:sync-outlined" class="ml-10px" @click="getReset">重置</a-button>
+            <a-button type="primary" preIcon="ant-design:import-outlined" class="ml-10px" @click="getupload">导入</a-button>
+            <a-button type="primary" preIcon="ant-design:download-outlined" class="ml-10px" @click="getdownload">导出</a-button>
+            <a-button type="primary" preIcon="ant-design:plus-outlined" class="ml-10px" @click="getTjAddress">新增瓦斯巡检地址</a-button>
           </a-col>
         </a-row>
       </div>
@@ -54,24 +35,22 @@
           <a-popconfirm title="删除内容无法恢复,是否删除" ok-text="确定" cancel-text="取消" @confirm="handleDelCardInfo(record)">
             <a class="table-action-link">删除</a>
           </a-popconfirm>
-          <a class="table-action-link" @click="moveUp(record)">上移</a>
-          <a class="table-action-link" @click="moveDown(record)">下移</a>
         </template>
         <template #bodyCell="{ column, text }">
           <template v-if="column.dataIndex == 'isSensor'">
             <div v-if="text == '1'">
-              <div class="table-text text-y">是</div>
+              <div class="table-text">是</div>
             </div>
             <div v-else>
-              <div class="table-text text-n">否</div>
+              <div class="table-text">否</div>
             </div>
           </template>
           <template v-if="column.dataIndex == 'checkState'">
             <div v-if="text == '1'">
-              <div class="table-text text-y">已检</div>
+              <div class="table-text">已检</div>
             </div>
             <div v-else>
-              <div class="table-text text-n">未检</div>
+              <div class="table-text">未检</div>
             </div>
           </template>
         </template>
@@ -101,15 +80,15 @@
   import { ref, onMounted, reactive } from 'vue';
   import customHeader from '/@/components/vent/customHeader.vue';
   import inspectTask from './components/inspectTask.vue';
-  import inspectEdit from './components/inspectEdit.vue';
+  import inspectEdit from './components/inspectEdit2.vue';
   import uploadOrdown from './components/uploadOrdown.vue';
-  import addressAdd from './components/addressAdd.vue';
+  import addressAdd from './components/addressAdd2.vue';
   import { message } from 'ant-design-vue';
   import { columns2, pagination } from './gasInspectNonfc.data';
   import { list, importByExcel, exportGasByExcel, moveOrderNum, edit, taskSubmit, clearCardInfo, addGasReportAddress } from './gasInspectNonfc.api';
 
   let keyActive = ref(0);
-  let searchId = ref('');
+  let searchParams = ref('');
   let tableData = ref<any[]>([]); //巡检列表
   let visibleTask = ref(false); //控制任务管理弹窗的显示与隐藏
   let titleTask = ref('');
@@ -166,9 +145,9 @@
     }
   }
 
-  //通过id(巡检卡id)查询
+  //通过地点查询
   async function queryByIdList() {
-    let res = await list({ id: searchId.value, pageNo: pagination.current, pageSize: pagination.pageSize });
+    let res = await list({ strinstallpos: searchParams.value, pageNo: pagination.current, pageSize: pagination.pageSize });
     keyActive.value = new Date().getTime();
     tableData.value = res.records.map((el: any) => {
       return {
@@ -188,7 +167,7 @@
   //重置
   let getReset = () => {
     pagination.current = 1;
-    searchId.value = '';
+    searchParams.value = '';
     queryByIdList();
   };
   //分页切换

+ 12 - 0
src/views/vent/gas/gasZk/gasZk.api.ts

@@ -0,0 +1,12 @@
+import { defHttp } from '/@/utils/http/axios';
+
+enum Api {
+  getPlayTime = '/ventanaly-device/drill/get/play-time',
+  getZkStatus = '/ventanaly-device/drill/get/status',
+}
+/**
+ * 获取粉尘监测结果报表
+ * @param params
+ */
+export const getVideoPlayTime = () => defHttp.get({ url: Api.getPlayTime });
+export const getGasZkStatus = (params) => defHttp.get({ url: Api.getZkStatus, params });

+ 201 - 0
src/views/vent/gas/gasZk/index.vue

@@ -0,0 +1,201 @@
+<template>
+  <div class="gasMonitor">
+    <customHeader>瓦斯钻孔实时监测</customHeader>
+    <div class="content">
+      <div class="left-box">
+        <div class="video">
+          <video controls autoplay muted loop fluent style="height: 100%; width: 100%; padding: 30px 20px">
+            <source :src="`${baseApiUrl}/sys/common/static/gif/output_video.mp4`" type="video/mp4" />
+          </video>
+        </div>
+      </div>
+      <div class="right-box">
+        <div class="count">
+          <div class="icon"></div>
+          <div class="count-content">
+            <span class="conten">{{ usedCount }}</span>
+            <span>钻孔计数</span>
+          </div>
+        </div>
+        <div class="status">
+          <div class="icon"></div>
+          <div class="status-content">
+            <span class="conten">{{ curStatus }}</span>
+            <span>钻杆状态</span>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+  import { ref, onMounted, onUnmounted } from 'vue';
+  import { getVideoPlayTime, getGasZkStatus } from './gasZk.api';
+  import customHeader from '/@/components/vent/customHeader.vue';
+  import { useGlobSetting } from '/@/hooks/setting';
+  const globSetting = useGlobSetting();
+  const baseApiUrl = globSetting.domainUrl;
+  const videoPlayTime = ref(0); //视频开始播放时间
+  const curStatus = ref(''); //当前状态
+  const usedCount = ref(''); //钻孔计数
+  const videoUrl = ref('');
+  let timer: IntervalHandle; //定时器
+  //时间轮询
+  const startPolling = () => {
+    // 清除定时器
+    stopPolling();
+    // 设置新定时器
+    timer = setInterval(async () => {
+      try {
+        const res = await getGasZkStatus({
+          playTime: videoPlayTime.value,
+        });
+        // 更新数据
+        usedCount.value = res.usedCount;
+        curStatus.value = res.curStatus;
+        startPolling();
+      } catch (error) {
+        console.error('请求失败,停止轮询', error);
+        stopPolling();
+      }
+    }, 1000);
+  };
+
+  // 停止轮询 清除定时器
+  const stopPolling = () => {
+    if (timer !== null) {
+      clearInterval(timer);
+      timer = null;
+    }
+  };
+
+  onMounted(async () => {
+    try {
+      videoPlayTime.value = await getVideoPlayTime();
+      // 第一次请求
+      const res = await getGasZkStatus({
+        playTime: videoPlayTime.value,
+      });
+      usedCount.value = res.usedCount;
+      curStatus.value = res.curStatus;
+      // 启动轮询
+      startPolling();
+    } catch (error) {
+      console.error('初始化失败', error);
+    }
+  });
+
+  // 组件卸载时清理
+  onUnmounted(() => {
+    stopPolling();
+  });
+</script>
+
+<style lang="less" scoped>
+  @import '/@/design/theme.less';
+
+  @{theme-deepblue} {
+    .gasMonitor {
+      --image-border: url('/@/assets/images/themify/deepblue/fire/border.png');
+    }
+  }
+
+  .gasMonitor {
+    --image-border: url('/@/assets/images/fire/border.png');
+    position: relative;
+    width: calc(100% - 20px);
+    height: calc(100% - 90px);
+    position: relative;
+    margin: 30px 10px 10px 10px;
+
+    .content {
+      position: relative;
+      width: 100%;
+      height: 100%;
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      margin-top: 80px;
+      .left-box {
+        flex: 3;
+        height: 100%;
+        padding: 10px;
+        background: var(--image-border) no-repeat center;
+        background-size: 100% 100%;
+        .video {
+          height: 100%;
+        }
+      }
+      .right-box {
+        flex: 1;
+        margin-left: 30px;
+        height: 100%;
+        background: var(--image-border) no-repeat center;
+        background-size: 100% 100%;
+        .count {
+          margin: 30px;
+          height: 200px;
+          padding: 0 20px;
+          display: flex;
+          flex-direction: row;
+          align-items: center;
+          background-image: url('/@/assets/images/vent/gas/gasZkBorder.png');
+          background-size: 100% 100%;
+          .icon {
+            margin-bottom: 20px;
+            width: 35%;
+            height: 65%;
+            background-image: url('/@/assets/images/vent/gas/zkcount.png');
+            background-size: 100% 100%;
+            margin-left: 10px;
+          }
+          .count-content {
+            display: flex;
+            flex-direction: column;
+            font-size: 20px;
+            color: #fff;
+            margin-left: 25px;
+            .conten {
+              font-weight: bold;
+              margin-bottom: 20px;
+              color: #27fded;
+              font-style: italic;
+            }
+          }
+        }
+        .status {
+          margin: 30px;
+          padding: 0 20px;
+          height: 200px;
+          display: flex;
+          flex-direction: row;
+          align-items: center;
+          background-image: url('/@/assets/images/vent/gas/gasZkBorder.png');
+          background-size: 100% 100%;
+          .icon {
+            margin-bottom: 20px;
+            width: 35%;
+            height: 65%;
+            background-image: url('/@/assets/images/vent/gas/zgStatus.png');
+            background-size: 100% 100%;
+            margin-left: 10px;
+          }
+          .status-content {
+            display: flex;
+            flex-direction: column;
+            font-size: 20px;
+            color: #fff;
+            margin-left: 25px;
+            .conten {
+              margin-bottom: 20px;
+              font-weight: bold;
+              color: #27fded;
+              font-style: italic;
+            }
+          }
+        }
+      }
+    }
+  }
+</style>

+ 14 - 16
src/views/vent/monitorManager/alarmMonitor/common.data.ts

@@ -2,29 +2,27 @@ import { reactive, markRaw, defineAsyncComponent } from 'vue';
 import { getAssetURL } from '/@/utils/ui';
 import { useGlobSetting } from '/@/hooks/setting';
 
-
 export const getMaxY = function (param) {
-  console.log(param, '999999')
-  let maxval = 0
+  console.log(param, '999999');
+  let maxval = 0;
   if (param.length == 1) {
     maxval = Math.max(...param[0]);
   } else if (param.length == 2) {
     const max1 = Math.max(...param[0]);
     const max2 = Math.max(...param[1]);
-    maxval = Math.max(max1, max2)
+    maxval = Math.max(max1, max2);
   } else if (param.length == 3) {
     const max1 = Math.max(...param[0]);
     const max2 = Math.max(...param[1]);
     const max3 = Math.max(...param[2]);
-    maxval = Math.max(max1, max2, max3)
+    maxval = Math.max(max1, max2, max3);
   }
-  let yMax = (maxval * 1.6).toFixed(0);
+  const yMax = (maxval * 1.6).toFixed(0);
   // const digitCount = yMax.toFixed(0).length;
   // console.log(digitCount,'digitCount')
   // let digFirst=yMax.toString().substring(0,1)
   // console.log(digFirst,'digFirst')
 
-
   // const digitCount = maxval.toFixed(0).length;
   // console.log(digitCount,'digitCount')
   // let yMax = 0;
@@ -67,24 +65,24 @@ export const getMaxY = function (param) {
   //     yMax = (n + 1) * 10000 + 5000;
   //   }
   // }
-  return yMax
-}
+  return yMax;
+};
 
 export const getMinY = function (param) {
-  let minval = 0
+  let minval = 0;
   if (param.length == 1) {
     minval = Math.min(...param[0]);
   } else if (param.length == 2) {
     const min1 = Math.min(...param[0]);
     const min2 = Math.min(...param[1]);
-    minval = Math.min(min1, min2)
+    minval = Math.min(min1, min2);
   } else if (param.length == 3) {
     const min1 = Math.min(...param[0]);
     const min2 = Math.min(...param[1]);
     const min3 = Math.min(...param[2]);
-    minval = Math.min(min1, min2, min3)
+    minval = Math.min(min1, min2, min3);
   }
-  let yMin = (minval * 0.7).toFixed(0);
+  const yMin = (minval * 0.7).toFixed(0);
   // const minDigitCount = minval.toFixed(0).length;
   // let yMin = 0;
   // if (minDigitCount < 2) {
@@ -126,9 +124,8 @@ export const getMinY = function (param) {
   //     yMin = 10000;
   //   }
   // }
-  return yMin
-}
-
+  return yMin;
+};
 
 //中间区域数据-通风
 export const centerAreaListT1 = [
@@ -159,6 +156,7 @@ export const typeMenuListTf = [{ name: '通风监测' }, { name: '巷道阻力
 //瓦斯监测菜单列表
 export function getMonitorComponent() {
   const { sysOrgCode } = useGlobSetting();
+  // const sysOrgCode = 'sdmtjtbdmk';
   let typeMenuListGas;
   switch (sysOrgCode) {
     case 'sdmtjtbetmk': //布尔台

+ 1 - 1
src/views/vent/monitorManager/balancePressMonitor/balancePress.data.ts

@@ -73,7 +73,7 @@ export const localFanParam = [
   },
   {
     title: '供风量',
-    code: 'm3_merge',
+    code: 'readData.m3_merge',
     unit: 'm³/min',
   },
   {

+ 45 - 38
src/views/vent/monitorManager/balancePressMonitor/components/balancePressHome.vue

@@ -49,18 +49,20 @@
               <div>CO与O2监测</div>
             </template>
             <template #container>
-              <template v-for="monitor in safetyMonitorData" :key="monitor.deviceId">
-                <div class="parameter-title group-parameter-title"
-                  ><SvgIcon class="icon" size="14" name="fiber-title" />
-                  <span>{{ monitor.strinstallpos }}</span>
-                </div>
-                <div class="input-box">
-                  <div v-for="(item, index) in monitorParam" class="input-item" :key="index">
-                    <div class="title">{{ item.title }}</div>
-                    <div class="value" style="width: 50%">{{ get(monitor, item.code, '-') }}</div>
+              <div class="overflow-y-auto max-h-300px">
+                <template v-for="monitor in safetyMonitorData" :key="monitor.deviceId">
+                  <div class="parameter-title group-parameter-title"
+                    ><SvgIcon class="icon" size="14" name="fiber-title" />
+                    <span>{{ monitor.strinstallpos }}</span>
                   </div>
-                </div>
-              </template>
+                  <div class="input-box">
+                    <div v-for="(item, index) in monitorParam" class="input-item" :key="index">
+                      <div class="title">{{ item.title }}</div>
+                      <div class="value" style="width: 50%">{{ get(monitor, item.code, '-') }}</div>
+                    </div>
+                  </div>
+                </template>
+              </div>
             </template>
           </ventBox1>
           <ventBox1 class="vent-margin-t-10">
@@ -68,32 +70,34 @@
               <div>设备监测详情</div>
             </template>
             <template #container>
-              <template v-for="monitor in windowMonitorData" :key="monitor.deviceId">
-                <div class="parameter-title group-parameter-title"
-                  ><SvgIcon class="icon" size="14" name="fiber-title" />
-                  <span>风窗:{{ monitor.strinstallpos }}</span>
-                </div>
-                <div class="input-box">
-                  <div v-for="(item, index) in windowParam" class="input-item" :key="index">
-                    <div class="title">{{ item.title }}</div>
-                    <div class="value">{{ get(monitor, item.code, '-') }}</div>
-                    <div class="unit">{{ item.unit }}</div>
+              <div class="overflow-y-auto max-h-500px">
+                <template v-for="monitor in windowMonitorData" :key="monitor.deviceId">
+                  <div class="parameter-title group-parameter-title"
+                    ><SvgIcon class="icon" size="14" name="fiber-title" />
+                    <span>风窗:{{ monitor.strinstallpos }}</span>
                   </div>
-                </div>
-              </template>
-              <template v-for="monitor in fanlocalMonitorData" :key="monitor.deviceId">
-                <div class="parameter-title group-parameter-title"
-                  ><SvgIcon class="icon" size="14" name="fiber-title" />
-                  <span>局扇:{{ monitor.strinstallpos }}</span>
-                </div>
-                <div class="input-box">
-                  <div v-for="(item, index) in localFanParam" class="input-item" :key="index">
-                    <div class="title">{{ item.title }}</div>
-                    <div class="value">{{ get(monitor, item.code, '-') }}</div>
-                    <div class="unit">{{ item.unit }}</div>
+                  <div class="input-box">
+                    <div v-for="(item, index) in windowParam" class="input-item" :key="index">
+                      <div class="title">{{ item.title }}</div>
+                      <div class="value">{{ get(monitor, item.code, '-') }}</div>
+                      <div class="unit">{{ item.unit }}</div>
+                    </div>
                   </div>
-                </div>
-              </template>
+                </template>
+                <template v-for="monitor in fanlocalMonitorData" :key="monitor.deviceId">
+                  <div class="parameter-title group-parameter-title"
+                    ><SvgIcon class="icon" size="14" name="fiber-title" />
+                    <span>局扇:{{ monitor.strinstallpos }}</span>
+                  </div>
+                  <div class="input-box">
+                    <div v-for="(item, index) in localFanParam" class="input-item" :key="index">
+                      <div class="title">{{ item.title }}</div>
+                      <div class="value">{{ get(monitor, item.code, '-') }}</div>
+                      <div class="unit">{{ item.unit }}</div>
+                    </div>
+                  </div>
+                </template>
+              </div>
             </template>
           </ventBox1>
         </div>
@@ -164,9 +168,12 @@
   async function getDataSource(systemID) {
     const res = await list({ devicetype: 'sys', systemID });
     const result = res.msgTxt;
+    safetyMonitorData.value = [];
+    fanlocalMonitorData.value = [];
+    windowMonitorData.value = [];
     result.forEach((item) => {
       if (item.type.startsWith('safetymonitor')) {
-        safetyMonitorData.value = item.datalist;
+        safetyMonitorData.value.push(...item.datalist);
       }
       if (item.type.startsWith('fanlocal')) {
         item.datalist.forEach((e) => {
@@ -174,10 +181,10 @@
           e.FanfHz = f1Run ? e.readData.Fan1_Frequency : e.readData.Fan2_Frequency;
           e.FanRun = f1Run ? '1#风机' : '2#风机';
         });
-        fanlocalMonitorData.value = item.datalist;
+        fanlocalMonitorData.value.push(...item.datalist);
       }
       if (item.type.startsWith('window')) {
-        windowMonitorData.value = item.datalist;
+        windowMonitorData.value.push(...item.datalist);
       }
     });
   }

+ 48 - 50
src/views/vent/monitorManager/comment/stationTable.vue

@@ -1,82 +1,80 @@
 <template>
-    <div class="stationTable">
-        <div class="content-area">
-            <a-table :columns="stationColumns" size="small" :data-source="stationTableData" class="tableW"
-                :pagination="false" :scroll="{ y: 620 }">
-                <template #action="{ record }">
-                    <a class="table-action-link" @click="handlerDetail(record)">详情</a>
-                    <a class="table-action-link" @click="handlerLocation(record)">定位</a>
-                </template>
-            </a-table>
-        </div>
+  <div class="stationTable">
+    <div class="content-area">
+      <a-table :columns="stationColumns" size="small" :data-source="stationTableData" class="tableW" :pagination="false" :scroll="{ y: 620 }">
+        <template #action="{ record }">
+          <a class="table-action-link" @click="handlerDetail(record)">详情</a>
+          <a class="table-action-link" @click="handlerLocation(record)">定位</a>
+        </template>
+      </a-table>
     </div>
+  </div>
 </template>
 
 <script setup lang="ts">
-import { ref, reactive, onMounted, watch,defineExpose } from 'vue';
-import { stationColumns } from './comment.data';
-import {getListAll,} from '../deviceMonitor/components/device/device.api';
+  import { ref, reactive, onMounted, watch, defineExpose } from 'vue';
+  import { stationColumns } from './comment.data';
+  import { getListAll } from '../deviceMonitor/components/device/device.api';
 
-let stationTableData = ref<any[]>([]);
-let $emit = defineEmits(['locate','stationDetail']);
-//定位
-function handlerLocation(record) {
+  let stationTableData = ref<any[]>([]);
+  let $emit = defineEmits(['locate', 'stationDetail']);
+  //定位
+  function handlerLocation(record) {
     $emit('locate', record);
-}
-//查看详情
-function handlerDetail(record){
+  }
+  //查看详情
+  function handlerDetail(record) {
     $emit('stationDetail', record);
-}
-//查询分站列表
-async function getStationList() {
+  }
+  //查询分站列表
+  async function getStationList() {
     let res = await getListAll();
     res.forEach((el) => {
-        el.key = el.id;
-        el.linkstatusC = el.linkstatus ? '连接' : '断开';
-        el.gdmsC = el.gdms == '1' ? '直流供电' : el.gdms == '0' ? '交流供电' : '';
+      el.key = el.id;
+      el.linkstatusC = el.linkstatus ? '连接' : '断开';
+      el.gdmsC = el.gdms == '1' ? '直流供电' : el.gdms == '0' ? '交流供电' : '';
     });
     stationTableData.value = res;
-}
-defineExpose({ getStationList })
-onMounted(() => { });
+  }
+  defineExpose({ getStationList });
+  onMounted(() => {});
 </script>
 
 <style lang="less" scoped>
-@ventSpace: zxm;
-
-.stationTable {
+  @ventSpace: zxm;
 
+  .stationTable {
     .zxm-picker,
     .zxm-input {
-        border: 1px solid #3ad8ff77;
-        background-color: #ffffff00;
-        color: #fff;
+      border: 1px solid #3ad8ff77;
+      background-color: #ffffff00;
+      color: #fff;
     }
-}
+  }
 
-:deep(.@{ventSpace}-table-body) {
+  :deep(.@{ventSpace}-table-body) {
     height: auto !important;
 
-    tr>td {
-        background: #ffffff00 !important;
+    tr > td {
+      background: #ffffff00 !important;
     }
 
     tr.@{ventSpace}-table-row-selected {
-        td {
-            background: #007cc415 !important;
-        }
+      td {
+        background: #007cc415 !important;
+      }
     }
-}
+  }
 
-:deep(.jeecg-basic-table .@{ventSpace}-table-wrapper .@{ventSpace}-table-title) {
+  :deep(.jeecg-basic-table .@{ventSpace}-table-wrapper .@{ventSpace}-table-title) {
     min-height: 0;
-}
+  }
 
-:deep(.@{ventSpace}-pagination) {
+  :deep(.@{ventSpace}-pagination) {
     margin-right: 20px !important;
-}
+  }
 
-:deep(.zxm-table-thead > tr > th:last-child) {
+  :deep(.zxm-table-thead > tr > th:last-child) {
     border-right: 1px solid #91e9fe55 !important;
-}
-</style>
+  }
+</style>

+ 19 - 49
src/views/vent/monitorManager/deviceCameraMonitor/index.vue

@@ -220,41 +220,28 @@
 
 <script setup lang="ts">
 import { ref, onMounted, onUnmounted, ComponentOptions, shallowRef, reactive, defineProps, watch, nextTick,unref } from 'vue';
-import { SendOutlined, FullscreenExitOutlined, FullscreenOutlined } from '@ant-design/icons-vue';
-import { list, getDeviceList, getDeviceTypeList, devPosition, getDepartmentInfo, getExportUrl } from './device.api';
+import { list, getDeviceList, getDepartmentInfo } from './device.api';
 import AlarmHistoryTable from '../comment/AlarmHistoryTable.vue';
 import HistoryTable from '../comment/HistoryTable.vue';
 import HistoryTableNew from '/@/views/vent/comment/history/HistoryTable.vue';
 import HandlerHistoryTable from '../comment/HandlerHistoryTable.vue';
 import MonitorTable from '../comment/MonitorTable.vue';
 import GroupMonitorTable from '../comment/GroupMonitorTable.vue';
-import gaspatrolTable from '../comment/gaspatrolTable.vue';
-import gasReport from '../comment/gasReport.vue';
-import gasReportCount from '../comment/gasReportCount.vue';
-import gasInspectDialog from '../comment/gasInspectDialog.vue';
-import { TreeProps, message, Progress, Input, Select } from 'ant-design-vue';
-import { TableAction } from '/@/components/Table';
-import { SvgIcon } from '/@/components/Icon';
+import { message, Progress, } from 'ant-design-vue';
 import { getActions } from '/@/qiankun/state';
 import { useRouter } from 'vue-router';
 import { setDivHeight } from '/@/utils/event';
 import { render } from '/@/utils/common/renderUtils';
 import HandleModal from './modal.vue';
 import {
-  majorColumns,
-  haveSysDetailArr,
-  haveDetailArr,
   haveHandlerArr,
   noWarningArr,
   surfaceChartsColumns,
   noHistoryArr,
-  vehicleFormConfig,
   noLocationArr,
 } from './device.data';
-import { formConfig } from '../safetyMonitor/safety.data';
 import { getDictItemsByCode } from '/@/utils/dict';
 import BarAndLine from '/@/components/chart/BarAndLine.vue';
-import MTreeSelect from '/@/components/Form/src/jeecg/components/MTreeSelect.vue';
 import { useMethods } from '/@/hooks/system/useMethods';
 import { useGo } from '/@/hooks/web/usePage';
 import { useGlobSetting } from '/@/hooks/setting';
@@ -289,13 +276,10 @@ const { hasPermission } = usePermission();
 const { getCamera, removeCamera, getPlayer } = useCamera();
 const playerRef = ref()
 const router = useRouter();
-const actions = getActions();
-const noLocationList = noLocationArr();
 const monitorTable = ref();
 const historyTable = ref();
 const alarmHistoryTable = ref();
 const handlerHistoryTable = ref();
-const isRefresh = ref(true);
 // 模态框
 const currentModal = shallowRef<Nullable<ComponentOptions>>(null); //模态框
 const modalVisible = ref<Boolean>(false); // 模态框是否可见
@@ -304,7 +288,6 @@ const tableShow = ref(true); //是否显示树形菜单
 const modalIsShow = ref<boolean>(false); // 是否显示模态框
 const modalTitle = ref(''); // 模态框标题显示内容,根据设备操作类型决定
 const modalType = ref(''); // 模态框内容显示类型,设备操作类型
-const locationList = ref([]); //巷道定位图标显示列表
 const deviceList = ref<DeviceType[]>([]); //关联设备列表
 const deviceActive = ref('');
 const activeKey = ref('1'); // tab key
@@ -315,24 +298,12 @@ const surfaceEchartsData = ref<any[]>(); // 工作面历史记录,echarts数
 const activeID = ref(''); // 打开详情modal时监测的设备id
 const deviceType = ref(''); // 监测设备类型
 const selectRowIndex = ref(-1)
-const systemType = ref('');
 const systemID = ref(''); // 系统监测时,系统id
 const cameraAddrs = ref([])
 const scroll = reactive({
   y: 180,
 });
 let departmentInfo: Null | Object = null;
-let startMonitorTimer = 0;
-let gaspatrol = ref(null);
-let gasreport = ref(null);
-let gasreportcount = ref(null);
-let station = ref(null);
-let gasSearch = reactive({
-  address: '',
-  userName: '',
-  insType: '2',
-  class: 'night',
-});
 function tabChange(activeKeyVal) {
   activeKey.value = activeKeyVal;
 }
@@ -346,20 +317,7 @@ function getMonitor(flag?) {
     if (Object.prototype.toString.call(timer) === '[object Null]') {
       timer = setTimeout(
         async () => {
-          if (deviceType.value.startsWith('gasDay_normal') && gaspatrol.value) {
-            gaspatrol.value.queryNowGasInsInfoList(); //人工瓦斯巡检
-          } else if (deviceType.value.startsWith('gasDayReport')) {
-            if (glob.sysOrgCode == 'sdmtjtbetmk') {
-              gasreportcount.value.getSearchReport();
-            } else {
-              gasreport.value.getSearchReport(); //瓦斯日报
-            }
-          } else if (deviceType.value.startsWith('substation') && station.value) {
-            //分站
-            station.value.getStationList();
-          } else {
-            await getDataSource();
-          }
+          await getDataSource();
           if (timer) {
             getMonitor();
           }
@@ -569,14 +527,26 @@ async function getSelectRow(selectRow, index) {
   selectData.value = selectRow;
   cameraAddrs.value = await getCamera(selectRow.deviceID, playerRef.value, null, true);
   if(cameraAddrs.value && cameraAddrs.value.length > 0){
-    nextTick(() => {
+    nextTick(async() => {
       for(let i=0; i<cameraAddrs.value.length; i++){
         const item = cameraAddrs.value[i]
         const fileExtension = item.addr.split('.').pop();
-        if (item.addr.includes('0.0.0.0')) {
-          item.addr = item.addr.replace('0.0.0.0', window.location.hostname);
+        if (item['addr'] && item['addr'].includes('0.0.0.0')) {
+          item['addr'] = item['addr'].replace('0.0.0.0', window.location.hostname);
+        }
+        if(item['addr'].startsWith('rtsp://')) {
+          const videoDom = document.getElementById('video' + i);
+          if(videoDom){
+            const server = new window['WebRtcStreamer'](
+              videoDom,
+              VUE_APP_URL.webRtcUrl.startsWith('/') ? location.protocol + VUE_APP_URL.webRtcUrl : VUE_APP_URL.webRtcUrl
+            );
+            await server.connect(item['addr']);
+            videoDom.play();
+          }
+        }else{
+          getPlayer(fileExtension, 'player' + i,item['devicekind'], item['addr'], item['cameraRate'], {width: 755, height: 490})
         }
-        const player = getPlayer(fileExtension, 'player' + i,item.devicekind, item.addr, item.cameraRate, {width: 755, height: 490})
       }
     })
   }

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

@@ -472,9 +472,6 @@
               <template v-else-if="deviceType.startsWith('fanlocal')">
                 <HistoryTableNew class="w-100% hM-100%" :device-code="`${deviceType}`" :scroll="scroll" dict-code="fanlocal_dict" />
               </template>
-              <template v-else-if="deviceType.startsWith('majorpath')">
-                <HistoryTableMajorPath class="w-100% h-100%" :sysId="`${systemID}`" :scroll="scroll" columnsType="sys_majorpath" type="table" />
-              </template>
               <template v-else>
                 <HistoryTable ref="historyTable" :sysId="systemID" :columns-type="`${deviceType}`"
                   :device-type="deviceType" designScope="device-history" :scroll="scroll" />

+ 2 - 3
src/views/vent/monitorManager/deviceMonitor/components/device/modal/fiber.modal.hlg.vue

@@ -677,10 +677,9 @@
         //     deviceId: 1754025882387599364,
         //   },
         // ];
+
         deviceList.value = newDataSource as any[];
-         if (newActiveID != oldActiveID) {
-          activeDeviceID.value = newActiveID as string;
-        }
+        activeDeviceID.value = newActiveID as string;
         // activeDeviceID.value = activeDeviceID.value ? activeDeviceID.value : newActiveID;
         maxTemp.value = 0;
         newDataSource?.forEach((item: any, index) => {

+ 296 - 281
src/views/vent/monitorManager/deviceMonitor/components/device/modal/gaspatrol.modal.vue

@@ -1,10 +1,21 @@
 <template>
-  <BasicModal v-bind="$attrs" @register="register" :title="`瓦斯巡检监测详情  ${currentTime}`" width="1200px" @ok="handleOk"
-    @cancel="handleCancel" wrapClassName="bundle-modal">
+  <BasicModal
+    v-bind="$attrs"
+    @register="register"
+    :title="`瓦斯巡检监测详情  ${currentTime}`"
+    width="1200px"
+    @ok="handleOk"
+    @cancel="handleCancel"
+    wrapClassName="bundle-modal"
+  >
     <div class="fiber-modal">
       <div class="modal-left">
-        <div v-for="device in deviceList" class="link-item"
-          :class="{ 'active-device-title': device.deviceID === activeDeviceID }" :key="device.deviceID">
+        <div
+          v-for="device in deviceList"
+          class="link-item"
+          :class="{ 'active-device-title': device.deviceID === activeDeviceID }"
+          :key="device.deviceID"
+        >
           <span class="" @click="selectDevice(device.deviceID)">{{ device.strinstallpos }}</span>
         </div>
       </div>
@@ -17,8 +28,7 @@
             </div>
             <div class="item-container">
               <div class="title">氧气</div>
-              <div class="value">{{ posMonitor.o2 !== undefined && posMonitor.o2 !== null ? posMonitor.o2 : '-' }}
-                <span>%</span></div>
+              <div class="value">{{ posMonitor.o2 !== undefined && posMonitor.o2 !== null ? posMonitor.o2 : '-' }} <span>%</span></div>
             </div>
           </div>
           <div class="top-item">
@@ -27,8 +37,7 @@
             </div>
             <div class="item-container">
               <div class="title">一氧化碳</div>
-              <div class="value">{{ posMonitor.co !== undefined && posMonitor.co !== null ? posMonitor.co : '-' }}
-                <span>ppm</span> </div>
+              <div class="value">{{ posMonitor.co !== undefined && posMonitor.co !== null ? posMonitor.co : '-' }} <span>ppm</span> </div>
             </div>
           </div>
           <div class="top-item">
@@ -37,8 +46,7 @@
             </div>
             <div class="item-container">
               <div class="title">二氧化碳</div>
-              <div class="value">{{ posMonitor.co2 !== undefined && posMonitor.co2 !== null ? posMonitor.co2 : '-' }}
-                <span>%</span></div>
+              <div class="value">{{ posMonitor.co2 !== undefined && posMonitor.co2 !== null ? posMonitor.co2 : '-' }} <span>%</span></div>
             </div>
           </div>
           <div class="top-item">
@@ -47,8 +55,7 @@
             </div>
             <div class="item-container">
               <div class="title">甲烷</div>
-              <div class="value">{{ posMonitor.ch4 !== undefined && posMonitor.ch4 !== null ? posMonitor.ch4 : '-' }}
-                <span>%</span></div>
+              <div class="value">{{ posMonitor.ch4 !== undefined && posMonitor.ch4 !== null ? posMonitor.ch4 : '-' }} <span>%</span></div>
             </div>
           </div>
           <div class="top-item">
@@ -57,8 +64,9 @@
             </div>
             <div class="item-container">
               <div class="title">温度</div>
-              <div class="value">{{ posMonitor.temperature !== undefined && posMonitor.temperature !== null ?
-                posMonitor.temperature : '-' }} <span>℃</span></div>
+              <div class="value"
+                >{{ posMonitor.temperature !== undefined && posMonitor.temperature !== null ? posMonitor.temperature : '-' }} <span>℃</span></div
+              >
             </div>
           </div>
           <div class="top-item">
@@ -67,8 +75,9 @@
             </div>
             <div class="item-container">
               <div class="title">湿度</div>
-              <div class="value">{{ posMonitor.humidity !== undefined && posMonitor.humidity !== null ?
-                posMonitor.humidity : '-' }} <span>%</span></div>
+              <div class="value"
+                >{{ posMonitor.humidity !== undefined && posMonitor.humidity !== null ? posMonitor.humidity : '-' }} <span>%</span></div
+              >
             </div>
           </div>
 
@@ -78,7 +87,7 @@
             </div>
             <div class="item-container">
               <div class="title">传感器通讯</div>
-              <div class="warning-value">{{ posMonitor['deviceConnect'] == 1 ? '连接' : '未连接' }}</div>
+              <div class="warning-value">{{ posMonitor['deviceConnect'] == 1 ? '连接' : '-' }}</div>
             </div>
           </div>
           <div class="top-item warning-box">
@@ -94,8 +103,14 @@
         <div class="right-bottom">
           <span class="base-title">设备监测曲线</span>
           <div class="echarts-box">
-            <BarAndLine class="echarts-line" xAxisPropType="time" :dataSource="historyList" height="100%"
-              :chartsColumns="chartsColumns" :option="echatsOption" />
+            <BarAndLine
+              class="echarts-line"
+              xAxisPropType="time"
+              :dataSource="historyList"
+              height="100%"
+              :chartsColumns="chartsColumns"
+              :option="echatsOption"
+            />
           </div>
         </div>
       </div>
@@ -103,331 +118,331 @@
   </BasicModal>
 </template>
 <script lang="ts">
-import { defineComponent, ref, watch, shallowRef } from 'vue';
-import { BasicModal, useModalInner } from '/@/components/Modal';
-import BarAndLine from '/@/components/chart/BarAndLine.vue';
-import { SvgIcon } from '/@/components/Icon';
-import { Decoration7 as DvDecoration7, ScrollBoard as DvScrollBoard } from '@kjgl77/datav-vue3';
-import dayjs from 'dayjs';
-import { getTableHeaderColumns } from '/@/hooks/web/useWebColumns';
-import { chartsColumnList } from '../device.data';
-
-export default defineComponent({
-  components: { BasicModal, BarAndLine, SvgIcon, DvScrollBoard, DvDecoration7 },
-  props: {
-    dataSource: { type: Array },
-    activeID: { type: String },
-  },
-  setup(props) {
-    const currentTime = ref(dayjs().format('YYYY-MM-DD HH:mm:ss'));
-    const modelRef = ref({});
-    const loading = ref(true);
-    const activeDeviceID = ref('');
-    const deviceList = ref<any[]>([]);
-    const historyList = ref<any[]>([]);
-    const posList = ref<any[]>([]);
-    const posMonitor = shallowRef({});
-
-    const echatsOption = {
-      grid: {
-        top: '25%',
-        left: '10',
-        right: '45',
-        bottom: '3%',
-        containLabel: true,
-      },
-      toolbox: {
-        feature: {},
-      },
-    };
-    const chartsColumnArr = getTableHeaderColumns('gaspatrol_chart');
-    const chartsColumns = chartsColumnArr.length > 0 ? chartsColumnArr : chartsColumnList;
-
-    const [register, { setModalProps, closeModal }] = useModalInner();
-
-    function handleVisibleChange(visible) {
-      if (visible) {
+  import { defineComponent, ref, watch, shallowRef } from 'vue';
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import BarAndLine from '/@/components/chart/BarAndLine.vue';
+  import { SvgIcon } from '/@/components/Icon';
+  import { Decoration7 as DvDecoration7, ScrollBoard as DvScrollBoard } from '@kjgl77/datav-vue3';
+  import dayjs from 'dayjs';
+  import { getTableHeaderColumns } from '/@/hooks/web/useWebColumns';
+  import { chartsColumnList } from '../device.data';
+
+  export default defineComponent({
+    components: { BasicModal, BarAndLine, SvgIcon, DvScrollBoard, DvDecoration7 },
+    props: {
+      dataSource: { type: Array },
+      activeID: { type: String },
+    },
+    setup(props) {
+      const currentTime = ref(dayjs().format('YYYY-MM-DD HH:mm:ss'));
+      const modelRef = ref({});
+      const loading = ref(true);
+      const activeDeviceID = ref('');
+      const deviceList = ref<any[]>([]);
+      const historyList = ref<any[]>([]);
+      const posList = ref<any[]>([]);
+      const posMonitor = shallowRef({});
+
+      const echatsOption = {
+        grid: {
+          top: '25%',
+          left: '10',
+          right: '45',
+          bottom: '3%',
+          containLabel: true,
+        },
+        toolbox: {
+          feature: {},
+        },
+      };
+      const chartsColumnArr = getTableHeaderColumns('gaspatrol_chart');
+      const chartsColumns = chartsColumnArr.length > 0 ? chartsColumnArr : chartsColumnList;
+
+      const [register, { setModalProps, closeModal }] = useModalInner();
+
+      function handleVisibleChange(visible) {
+        if (visible) {
+          loading.value = true;
+          setModalProps({ loading: true, confirmLoading: true });
+
+          setTimeout(() => {
+            loading.value = false;
+            setModalProps({ loading: false, confirmLoading: false });
+          }, 1000);
+        }
+      }
+
+      // 选择监测
+      function selectDevice(id) {
         loading.value = true;
         setModalProps({ loading: true, confirmLoading: true });
-
         setTimeout(() => {
           loading.value = false;
+          activeDeviceID.value = id;
           setModalProps({ loading: false, confirmLoading: false });
-        }, 1000);
+        }, 300);
       }
-    }
-
-    // 选择监测
-    function selectDevice(id) {
-      loading.value = true;
-      setModalProps({ loading: true, confirmLoading: true });
-      setTimeout(() => {
-        loading.value = false;
-        activeDeviceID.value = id;
-        setModalProps({ loading: false, confirmLoading: false });
-      }, 300);
-    }
 
-    function handleOk(e) {
-      e.preventDefault();
-      closeModal();
-    }
-
-    function handleCancel(e) {
-      e.preventDefault();
-      closeModal();
-    }
+      function handleOk(e) {
+        e.preventDefault();
+        closeModal();
+      }
 
-    watch([() => props.dataSource, () => props.activeID], ([newDataSource, newActiveID], [oldDataSource, oldActiveID]) => {
-      if (newActiveID != oldActiveID) {
-        activeDeviceID.value = newActiveID as string;
+      function handleCancel(e) {
+        e.preventDefault();
+        closeModal();
       }
-      // activeDeviceID.value = activeDeviceID.value ? activeDeviceID.value : newActiveID;
-      deviceList.value = newDataSource?.filter((item: any, index) => {
-        if ((!activeDeviceID.value && index == 0) || item.deviceID === activeDeviceID.value) {
-          // activeDeviceID.value = item.deviceID;
-          posMonitor.value = Object.assign(item, item.readData);
-          historyList.value = item['history'];
+
+      watch([() => props.dataSource, () => props.activeID], ([newDataSource, newActiveID], [oldDataSource, oldActiveID]) => {
+        if (newActiveID != oldActiveID) {
+          activeDeviceID.value = newActiveID as string;
         }
-        item.readTime = item.readTime?.substring(11);
-        return item;
+        // activeDeviceID.value = activeDeviceID.value ? activeDeviceID.value : newActiveID;
+        deviceList.value = newDataSource?.filter((item: any, index) => {
+          if ((!activeDeviceID.value && index == 0) || item.deviceID === activeDeviceID.value) {
+            // activeDeviceID.value = item.deviceID;
+            posMonitor.value = Object.assign(item, item.readData);
+            historyList.value = item['history'];
+          }
+          item.readTime = item.readTime?.substring(11);
+          return item;
+        });
       });
-    });
-
-    return {
-      register,
-      model: modelRef,
-      currentTime,
-      handleVisibleChange,
-      selectDevice,
-      handleOk,
-      handleCancel,
-      deviceList,
-      historyList,
-      activeDeviceID,
-      posMonitor,
-      echatsOption,
-      posList,
-      chartsColumns,
-    };
-  },
-});
+
+      return {
+        register,
+        model: modelRef,
+        currentTime,
+        handleVisibleChange,
+        selectDevice,
+        handleOk,
+        handleCancel,
+        deviceList,
+        historyList,
+        activeDeviceID,
+        posMonitor,
+        echatsOption,
+        posList,
+        chartsColumns,
+      };
+    },
+  });
 </script>
 <style lang="less">
-.bundle-modal {
-  .zxm-modal {
-    top: 30px !important;
+  .bundle-modal {
+    .zxm-modal {
+      top: 30px !important;
+    }
   }
-}
 </style>
 
 <style lang="less" scoped>
-.fiber-modal {
-  width: 100%;
-  height: 650px;
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-
-  .modal-left {
-    width: 200px;
-    height: 100%;
-    overflow-y: auto;
-    background: #ffffff11;
-    padding: 5px;
-    border-radius: 5px;
-
-    .active-device-title {
-      color: aqua;
-    }
+  .fiber-modal {
+    width: 100%;
+    height: 650px;
+    display: flex;
+    flex-direction: row;
+    justify-content: space-between;
+
+    .modal-left {
+      width: 200px;
+      height: 100%;
+      overflow-y: auto;
+      background: #ffffff11;
+      padding: 5px;
+      border-radius: 5px;
+
+      .active-device-title {
+        color: aqua;
+      }
 
-    .link-item {
-      position: relative;
-      cursor: pointer;
-      line-height: 30px;
-      padding-left: 30px;
+      .link-item {
+        position: relative;
+        cursor: pointer;
+        line-height: 30px;
+        padding-left: 30px;
 
-      span:hover {
-        color: #89ffff;
-      }
+        span:hover {
+          color: #89ffff;
+        }
 
-      &::after {
-        content: '';
-        position: absolute;
-        display: block;
-        width: 8px;
-        height: 8px;
-        top: 12px;
-        left: 10px;
-        transform: rotateZ(45deg) skew(10deg, 10deg);
-        background: #45d3fd;
+        &::after {
+          content: '';
+          position: absolute;
+          display: block;
+          width: 8px;
+          height: 8px;
+          top: 12px;
+          left: 10px;
+          transform: rotateZ(45deg) skew(10deg, 10deg);
+          background: #45d3fd;
+        }
       }
     }
-  }
 
-  .modal-right {
-    width: calc(100% - 220px);
-    overflow-y: auto;
-
-    .base-title {
-      line-height: 32px;
-      position: relative;
-      padding-left: 20px;
-
-      &::after {
-        content: '';
-        position: absolute;
-        display: block;
-        width: 4px;
-        height: 12px;
-        top: 4px;
-        left: 10px;
-        background: #45d3fd;
-        border-radius: 4px;
-      }
-    }
+    .modal-right {
+      width: calc(100% - 220px);
+      overflow-y: auto;
+
+      .base-title {
+        line-height: 32px;
+        position: relative;
+        padding-left: 20px;
 
-    .right-top {
-      display: flex;
-      flex-direction: row;
-      justify-content: space-between;
-      flex-wrap: wrap;
-      margin-bottom: 10px;
+        &::after {
+          content: '';
+          position: absolute;
+          display: block;
+          width: 4px;
+          height: 12px;
+          top: 4px;
+          left: 10px;
+          background: #45d3fd;
+          border-radius: 4px;
+        }
+      }
 
-      .top-item {
-        width: 220px;
-        height: 100px;
+      .right-top {
         display: flex;
         flex-direction: row;
-        justify-content: center;
-        border: 1px solid rgba(25, 237, 255, 0.4);
-        box-shadow: inset 0 0 10px rgba(0, 197, 255, 0.6);
-        background: rgba(0, 0, 0, 0.06666666666666667);
-        padding-top: 20px;
-        margin: 10px 0;
-
-        .icon {
-          margin-right: 10px;
-          margin-top: 5px;
-          color: #fdb146;
-        }
+        justify-content: space-between;
+        flex-wrap: wrap;
+        margin-bottom: 10px;
 
-        .item-container {
-          width: 110px;
+        .top-item {
+          width: 220px;
+          height: 100px;
           display: flex;
-          flex-direction: column;
+          flex-direction: row;
           justify-content: center;
-
-          div {
-            text-align: center;
+          border: 1px solid rgba(25, 237, 255, 0.4);
+          box-shadow: inset 0 0 10px rgba(0, 197, 255, 0.6);
+          background: rgba(0, 0, 0, 0.06666666666666667);
+          padding-top: 20px;
+          margin: 10px 0;
+
+          .icon {
+            margin-right: 10px;
+            margin-top: 5px;
+            color: #fdb146;
           }
 
-          .title {
-            font-size: 18px;
-          }
+          .item-container {
+            width: 110px;
+            display: flex;
+            flex-direction: column;
+            justify-content: center;
+
+            div {
+              text-align: center;
+            }
 
-          .value {
-            text-shadow: 0 0 25px #00fbfe;
-            background: linear-gradient(0deg, #45d3fd, #45d3fd, #61ddb1, #61ddb1);
-            font-style: normal;
-            background-size: cover;
-            font-family: electronicFont;
-            font-size: 30px;
-            -webkit-background-clip: text;
-            background-clip: text;
-            -webkit-text-fill-color: transparent;
-            position: relative;
-            top: -8px;
-
-            span {
-              font-family: Arial, Helvetica, sans-serif;
+            .title {
               font-size: 18px;
-              color: aliceblue;
+            }
+
+            .value {
+              text-shadow: 0 0 25px #00fbfe;
+              background: linear-gradient(0deg, #45d3fd, #45d3fd, #61ddb1, #61ddb1);
+              font-style: normal;
+              background-size: cover;
+              font-family: electronicFont;
+              font-size: 30px;
+              -webkit-background-clip: text;
+              background-clip: text;
+              -webkit-text-fill-color: transparent;
+              position: relative;
+              top: -8px;
+
+              span {
+                font-family: Arial, Helvetica, sans-serif;
+                font-size: 18px;
+                color: aliceblue;
+              }
             }
           }
         }
-      }
 
-      .warning-box {
-        padding-top: 0px;
+        .warning-box {
+          padding-top: 0px;
 
-        .icon {
-          margin-top: 20px;
+          .icon {
+            margin-top: 20px;
 
-          :deep(.icon-style) {
-            width: auto;
-            color: #fdb146;
+            :deep(.icon-style) {
+              width: auto;
+              color: #fdb146;
+            }
           }
-        }
 
-        .warning-value {
-          font-size: 18px;
-          color: #61ddb1;
+          .warning-value {
+            font-size: 18px;
+            color: #61ddb1;
+          }
         }
       }
-    }
 
-    .right-center {
-      margin-top: 20px;
-      display: flex;
-      flex-direction: row;
-      justify-content: space-between;
+      .right-center {
+        margin-top: 20px;
+        display: flex;
+        flex-direction: row;
+        justify-content: space-between;
 
-      .table-box {
-        position: relative;
-        width: 500px;
-        height: 250px;
-      }
+        .table-box {
+          position: relative;
+          width: 500px;
+          height: 250px;
+        }
 
-      .warning-box {
-        width: calc(100% - 520px);
+        .warning-box {
+          width: calc(100% - 520px);
 
-        .warning-container {
-          width: 100%;
-          height: convert;
-          background: #009acd00;
+          .warning-container {
+            width: 100%;
+            height: convert;
+            background: #009acd00;
 
-          :deep(.dv-scroll-board) {
-            .row-item {
-              height: 40px !important;
-              line-height: 40px !important;
-            }
+            :deep(.dv-scroll-board) {
+              .row-item {
+                height: 40px !important;
+                line-height: 40px !important;
+              }
 
-            .header-item {
-              border-top: 1px solid #91e9fe !important;
-              border-bottom: 1px solid #91e9fe !important;
+              .header-item {
+                border-top: 1px solid #91e9fe !important;
+                border-bottom: 1px solid #91e9fe !important;
+              }
             }
           }
         }
       }
-    }
 
-    .right-bottom {
-      margin-top: 20px;
+      .right-bottom {
+        margin-top: 20px;
 
-      .echarts-box {
-        width: 100%;
-        height: 320px;
-        position: relative;
+        .echarts-box {
+          width: 100%;
+          height: 320px;
+          position: relative;
 
-        .echarts-line {
-          width: calc(100% + 80px);
-          position: absolute;
+          .echarts-line {
+            width: calc(100% + 80px);
+            position: absolute;
+          }
         }
       }
     }
   }
-}
 
-:deep(.zxm-table-body) {
-  border: 1px solid rgba(57, 232, 255, 0.2) !important;
+  :deep(.zxm-table-body) {
+    border: 1px solid rgba(57, 232, 255, 0.2) !important;
 
-  .zxm-table-tbody>tr>td {
-    border: none !important;
+    .zxm-table-tbody > tr > td {
+      border: none !important;
+    }
   }
-}
 
-:deep(.zxm-table-cell) {
-  border-right: none !important;
-}
+  :deep(.zxm-table-cell) {
+    border-right: none !important;
+  }
 </style>

+ 0 - 2
src/views/vent/monitorManager/nitrogen/nitrogen.data.1.ts

@@ -97,8 +97,6 @@ export async function getMonitorData() {
     case 'hnqymdktymk': //核桃峪
       return await import('./nitrogen.data.hty');
     default: //默认
-      // return await import('./nitrogen.dataCc_2');
-      // return await import('./nitrogen.data.hty');
       return await import('./nitrogen.dataTest');
   }
 }

+ 3 - 3
src/views/vent/monitorManager/nitrogen/nitrogen.dataTest.ts

@@ -10,13 +10,13 @@ export const preMonitorList = [
   {
     title: '加载压力',
     code: 'PRE_CPR_LoadPre',
-    unit: 'MPa',
+    unit: 'bar',
     value: '76.76',
   },
   {
     title: '卸载压力',
     code: 'PRE_CPR_UnLoadPre',
-    unit: 'MPa',
+    unit: 'bar',
     child: [],
     value: '46.87',
   },
@@ -50,7 +50,7 @@ export const preMonitorList = [
   {
     title: '排气压力',
     code: 'PRE_CPR_ExhaustPre',
-    unit: 'MPa',
+    unit: 'bar',
     child: [],
     value: '19.54',
   },

+ 10 - 4
src/views/vent/monitorManager/safetyMonitor/index.vue

@@ -32,8 +32,11 @@
                 <a-tag v-if="column.dataIndex === 'exceptionType_str'" :color="record.exceptionType_str == '正常' ? 'green' : '#f00'">
                   {{ record.exceptionType_str == '正常' ? '正常' : '异常' }}</a-tag
                 >
-                <a-tag v-if="column.dataIndex === 'netStatus_str'" :color="record.netStatus_str == '正常' ? 'green' : '#f00'">{{
-                  record.netStatus_str == '正常' ? '正常' : '异常'
+                <a-tag v-if="column.dataIndex === 'netStatus'" :color="record.netStatus == '1' ? 'green' : '#f00'">{{
+                  record.netStatus == '1' ? '正常' : '异常'
+                }}</a-tag>
+                <a-tag v-if="column.dataIndex === 'warnFlag'" :color="record.warnFlag == '0' ? 'green' : '#f00'">{{
+                  record.warnFlag == '0' ? '正常' : '异常'
                 }}</a-tag>
               </template>
             </MonitorTable>
@@ -65,8 +68,11 @@
                 <a-tag v-if="column.dataIndex === 'exceptionType_str'" :color="record.exceptionType_str == '正常' ? 'green' : '#f00'">
                   {{ record.exceptionType_str == '正常' ? '正常' : '异常' }}</a-tag
                 >
-                <a-tag v-if="column.dataIndex === 'netStatus_str'" :color="record.netStatus_str == '正常' ? 'green' : '#f00'">{{
-                  record.netStatus_str == '正常' ? '正常' : '异常'
+                <a-tag v-if="column.dataIndex === 'netStatus'" :color="record.netStatus == '1' ? 'green' : '#f00'">{{
+                  record.netStatus == '1' ? '正常' : '异常'
+                }}</a-tag>
+                <a-tag v-if="column.dataIndex === 'warnFlag'" :color="record.warnFlag == '0' ? 'green' : '#f00'">{{
+                  record.warnFlag == '0' ? '正常' : '异常'
                 }}</a-tag>
               </template>
             </MonitorTable>