Browse Source

Merge branch 'master' of http://182.92.126.35:3000/hrx/vent-forewarn-micro

lxh 1 year ago
parent
commit
5f6677e530

+ 44 - 20
src/api/sys/model/monitorModel.ts

@@ -1,32 +1,33 @@
 /** 基本的返回结构 */
-export interface AlgoResponse<T> {
-  code: number;
-  msg: string;
-  requestId: string;
-  data: T;
+export interface Response<T> {
+  success: true;
+  message: '操作成功!';
+  code: 200;
+  result: T;
+  timestamp: number;
 }
 
 /** 测点树的节点 */
 export interface MonitorSiteTreeNode {
   id: string;
-  parentId: string | null;
+  parentId: string;
   label: string;
-  disasterType: any;
-  disasterName: any;
-  sensorType: any;
-  sensorTypeName: any;
+  disasterType: string | null;
+  disasterName: string | null;
+  sensorType: string | null;
+  sensorTypeName: string | null;
   sequence: number;
   leafNode: number;
   display: number;
+  systemSource: string;
+  x?: number;
+  y?: number;
+  z?: number;
   parentNode?: {
     id: string;
     label: string;
   };
-  x?: number;
-  y?: number;
-  z?: number;
-  sensorStatus?: number;
-  children: MonitorSiteTreeNode[];
+  children?: MonitorSiteTreeNode[];
 }
 
 /** 测点树请求参数 */
@@ -53,13 +54,36 @@ export interface MonitorSite {
   }[];
 }
 
+/** 保存测点请求参数 */
+export interface SaveMonitorSiteParams {
+  id: string;
+  parentId: string;
+  label: string;
+  disasterType: string;
+  disasterName: string;
+  sensorType: string;
+  sensorTypeName: string;
+  systemSource: string;
+  x: number;
+  y: number;
+  z: number;
+}
+
+/** 删除测点请求参数 */
+export interface DeleteMonitorSiteParams {
+  id: string;
+  systemSource: string;
+}
+
 /** 测点详情请求参数 */
 export interface MonitorSiteParams {
-  disasterType: number;
-  mineCode: string;
-  sensorCode: string;
-  sensorType: string;
-  parentNodeId: string;
+  // disasterType: number;
+  // mineCode: string;
+  // sensorCode: string;
+  // sensorType: string;
+  // parentNodeId: string;
+  id: string;
+  systemSource: string;
 }
 
 /** 测点操作相应 */

+ 40 - 5
src/api/sys/monitor.ts

@@ -9,12 +9,15 @@ import {
   MonitorSiteParams,
   MonitorSiteTreeNode,
   MonitorSiteTreeParams,
-  AlgoResponse,
+  Response,
+  SaveMonitorSiteParams,
+  DeleteMonitorSiteParams,
 } from './model/monitorModel';
 
 enum Api {
-  getMonitorSiteTree = '/algoapi/gis2d/getDisasterTpTree',
-  getMonitorSite = 'algoapi/water/monitor/sensortips/details',
+  getMonitorSiteTree = '/prevention/gis/data/gisBaseTree ',
+  getMonitorSite = '/prevention/gis/data/getDataByIdAndSystemCode',
+  saveMonitorSite = '/prevention/gis/data/save',
 }
 
 /**
@@ -24,7 +27,7 @@ export function getMonitorSiteTree(
   params: MonitorSiteTreeParams,
   mode: ErrorMessageMode = 'message',
 ) {
-  return defHttp.post<AlgoResponse<MonitorSiteTreeNode>>(
+  return defHttp.get<Response<MonitorSiteTreeNode>>(
     {
       url: Api.getMonitorSiteTree,
       params,
@@ -36,10 +39,42 @@ export function getMonitorSiteTree(
 }
 
 /**
+ * 保存测点数据
+ */
+export function saveMonitorSite(params: SaveMonitorSiteParams, mode: ErrorMessageMode = 'message') {
+  return defHttp.post<Response<MonitorSite>>(
+    {
+      url: Api.saveMonitorSite,
+      params,
+    },
+    {
+      errorMessageMode: mode,
+    },
+  );
+}
+
+/**
+ * 删除测点数据
+ */
+export function deleteMonitorSite(
+  params: DeleteMonitorSiteParams,
+  mode: ErrorMessageMode = 'message',
+) {
+  return defHttp.delete<Response<MonitorSite>>(
+    {
+      url: Api.saveMonitorSite,
+      params,
+    },
+    {
+      errorMessageMode: mode,
+    },
+  );
+}
+/**
  * 获取测点详情数据
  */
 export function getMonitorSite(params: MonitorSiteParams, mode: ErrorMessageMode = 'message') {
-  return defHttp.post<AlgoResponse<MonitorSite>>(
+  return defHttp.post<Response<MonitorSite>>(
     {
       url: Api.getMonitorSite,
       params,

+ 1 - 1
src/views/vent/monitor/site/components/siteFilter.vue

@@ -25,7 +25,7 @@
 <script setup lang="ts">
   import { MonitorSiteTreeParams } from '@/api/sys/model/monitorModel';
   import { Form, FormItem, Input, CheckableTag } from 'ant-design-vue';
-  import { defineExpose, ref, defineEmits } from 'vue';
+  import { ref, defineEmits } from 'vue';
 
   // props & emits
   const emit = defineEmits<{ submit: [value: MonitorSiteTreeParams] }>();

+ 97 - 43
src/views/vent/monitor/site/components/siteForm.vue

@@ -1,33 +1,50 @@
 <template>
   <!-- 测点操作表单 -->
-  <BasicForm
-    :model="site"
-    :schemas="schemas"
-    :label-col="{ span: 8 }"
-    :wrapper-col="{ span: 16 }"
-    label-align="right"
-    :showActionButtonGroup="false"
-  >
-    <template #create-btn="{ model }">
-      <Button type="primary" :rounded="true" @click="createSite(model)">新建测点</Button>
-    </template>
-    <template #copy-btn="{ model }">
-      <Button type="primary" :rounded="true" @click="copySite(model)">复制测点</Button>
-    </template>
-    <template #edit-btn="{ model }">
-      <Button type="primary" :rounded="true" @click="editSite(model)">编辑测点</Button>
-    </template>
-  </BasicForm>
+  <div>
+    <BasicForm
+      :model="site"
+      :schemas="schemas"
+      :label-col="{ span: 8 }"
+      :wrapper-col="{ span: 16 }"
+      label-align="right"
+      :showActionButtonGroup="false"
+      @register="register"
+    >
+      <template #create-btn>
+        <Button type="primary" :rounded="true" @click="createSite">新建测点</Button>
+      </template>
+      <template #copy-btn>
+        <Button type="primary" :rounded="true" @click="copySite">复制测点</Button>
+      </template>
+      <template #edit-btn>
+        <Button type="primary" :rounded="true" @click="editSite">编辑测点</Button>
+      </template>
+    </BasicForm>
+    <Button type="primary" shape="circle" @click="targetSite">
+      <template #icon>
+        <Icon icon="mdi:target" />
+      </template>
+    </Button>
+  </div>
 </template>
 <script setup lang="ts">
-  import { MonitorSiteTreeNode, MonitorSiteOperationParams } from '@/api/sys/model/monitorModel';
+  import {
+    MonitorSiteTreeNode,
+    MonitorSiteOperationParams,
+    SaveMonitorSiteParams,
+  } from '@/api/sys/model/monitorModel';
   import { defineProps } from 'vue';
-  import { BasicForm, FormSchema } from '@/components/Form/index';
+  import { BasicForm, FormSchema, useForm } from '@/components/Form/index';
   import { Button } from 'ant-design-vue';
+  import { SensorDict, SystemSourceDict } from '../const';
+  import Icon from '@/components/Icon/Icon.vue';
 
   // props & emits
   defineProps<{ site?: MonitorSiteTreeNode }>();
-  const emit = defineEmits<{ submit: [value: MonitorSiteOperationParams] }>();
+  const emit = defineEmits<{
+    save: [value: SaveMonitorSiteParams];
+    message: [value: MonitorSiteOperationParams];
+  }>();
 
   // 生成输入类表单项的帮助函数
   function generateInputSchema({
@@ -72,16 +89,51 @@
     };
   }
 
+  // 生成选择框类表单项的帮助函数
+  function generateSelectSchema({
+    field,
+    label,
+    span = 5,
+    placeholder,
+    required = true,
+    dict,
+  }: {
+    field: string;
+    label: string;
+    span?: number;
+    placeholder?: string;
+    required?: boolean;
+    dict: Record<string, unknown>;
+  }): FormSchema {
+    return {
+      component: 'Select',
+      field,
+      label,
+      rules: [{ required }],
+      colProps: {
+        span,
+      },
+      componentProps: {
+        placeholder: placeholder || `请输入${label}`,
+        options: Object.keys(dict).reduce<{ value: string; label: unknown }[]>((result, key) => {
+          result.push({ value: key, label: dict[key] });
+
+          return result;
+        }, []),
+      },
+    };
+  }
+
   // 表单配置项
   const schemas: FormSchema[] = [
     generateButtonSchema({ slot: 'create-btn' }),
     generateInputSchema({ field: 'id', label: '测点编号', required: true }),
-    generateInputSchema({ field: 'sensorType', label: '测点类型', required: true }),
+    generateSelectSchema({ field: 'sensorType', label: '测点类型', dict: SensorDict }),
     generateInputSchema({ field: 'sensorStatus', label: '测点使用状态', required: true }),
     generateInputSchema({ field: 'pos', label: '所属位置', required: true }),
     generateInputSchema({ field: 'x', label: 'X', required: true, span: 3 }),
     generateButtonSchema({ slot: 'copy-btn' }),
-    generateInputSchema({ field: 'srouce', label: '系统来源', required: true }),
+    generateSelectSchema({ field: 'srouce', label: '系统来源', dict: SystemSourceDict }),
     generateInputSchema({ field: 'data_type', label: '数据类型', required: true }),
     generateInputSchema({ field: 'nuit', label: '单位', required: true }),
     generateInputSchema({ field: 'distance', label: '巷道距离' }),
@@ -94,38 +146,40 @@
     generateInputSchema({ field: 'z', label: 'Z', span: 3 }),
   ];
 
+  // 后续操作表单必要的函数
+  const [register, { validate }] = useForm();
+
   // 提交创建测点所需的数据
-  function createSite(model: MonitorSiteOperationParams) {
-    emit('submit', {
-      clickType: 'newPoin', // 点击类型  新建测点
-      sensorType: model.sensorType, // 水 0502、瓦斯0001、顶板1401等 多级菜单
-      sensorStatus: model.sensorStatus, // 状态
-      id: model.id, // 测点ID
-      from: 'tank',
+  function createSite() {
+    validate().then((v) => {
+      emit('save', v as SaveMonitorSiteParams);
     });
   }
+
   // 提交复制测点所需的数据
-  function copySite(model: MonitorSiteOperationParams) {
-    emit('submit', {
-      clickType: 'copyPoint', // 点击类型  新建测点
-      sensorType: model.sensorType, // 水 0502、瓦斯0001、顶板1401等 多级菜单
-      sensorStatus: model.sensorStatus, // 状态
-      id: model.id, // 测点ID
-      from: 'tank',
+  function copySite() {
+    validate().then((v) => {
+      emit('save', v as SaveMonitorSiteParams);
     });
   }
+
   // 提交编辑测点所需的数据
-  function editSite(model: MonitorSiteOperationParams) {
-    emit('submit', {
-      clickType: 'modifyPoint', // 点击类型  新建测点
-      sensorType: model.sensorType, // 水 0502、瓦斯0001、顶板1401等 多级菜单
-      sensorStatus: model.sensorStatus, // 状态
-      id: model.id, // 测点ID
+  function editSite() {
+    validate().then((v) => {
+      emit('save', v as SaveMonitorSiteParams);
+    });
+  }
+
+  // 定位测点
+  function targetSite() {
+    emit('message', {
+      clickType: 'pickPiont', // 拾取坐标
       from: 'tank',
     });
   }
 
   defineExpose({
     schemas,
+    register,
   });
 </script>

+ 23 - 18
src/views/vent/monitor/site/components/siteTree.vue

@@ -1,31 +1,34 @@
 <template>
-  <Tree
-    :tree-data="processedTreeData"
-    :expanded-keys="expandedKeys"
-    :default-expand-all="true"
-    :auto-expand-parent="true"
-    :virtual="false"
-    @select="selectHandler"
-  />
+  <div>
+    <Tree
+      v-if="processedTreeData.length"
+      :tree-data="processedTreeData"
+      :default-expand-all="true"
+      :virtual="false"
+      :show-icon="true"
+      @select="selectHandler"
+    >
+      <template #icon="scope">
+        <Icon v-if="scope.selected" icon="material-symbols:circle" color="green" />
+        <Icon v-else-if="scope.selectable" icon="material-symbols:circle" />
+      </template>
+    </Tree>
+
+    <p v-else>暂无数据</p>
+  </div>
 </template>
 <script setup lang="ts">
   import { ref, watch } from 'vue';
   import { Tree } from 'ant-design-vue';
   import { MonitorSiteTreeNode } from '@/api/sys/model/monitorModel';
   import { TreeNode } from '../types/siteTree';
+  import Icon from '@/components/Icon/Icon.vue';
 
   // props & emits
   const props = defineProps<{ treeData?: MonitorSiteTreeNode }>();
   const emit = defineEmits<{ select: [value: MonitorSiteTreeNode] }>();
 
-  const processedTreeData = ref<TreeNode[]>([
-    {
-      title: '暂无数据',
-      key: '0',
-      disabled: true,
-      children: [],
-    },
-  ]);
+  const processedTreeData = ref<TreeNode[]>([]);
   const expandedKeys = ref<string[]>([]);
 
   // 递归处理树节点并格式化为需要的格式,将父节点记录到指定数组中
@@ -34,7 +37,7 @@
     const res: TreeNode = {
       title: node.label,
       key: node.id,
-      disabled: !!node.display,
+      selectable: !!node.x,
       raw: node,
       children: [],
     };
@@ -51,7 +54,9 @@
   }
 
   function selectHandler(_, { selectedNodes }) {
-    emit('select', selectedNodes.raw);
+    if (selectedNodes.length) {
+      emit('select', selectedNodes[0]?.raw);
+    }
   }
 
   // 更新逻辑在这里

+ 52 - 0
src/views/vent/monitor/site/const.ts

@@ -0,0 +1,52 @@
+// 系统来源字典
+export const SystemSourceDict = {
+  FireSgjc: '束管',
+  FireGxcw: '光纤测温',
+  FireMb: '密闭监测',
+  FirePq: '喷气',
+  FireYw: '烟雾',
+  FireHy: '火焰',
+  FireZhuD: '注氮',
+  FireZhuJ: '注浆',
+  DustFc: '粉尘',
+  DustPw: '无线喷雾',
+  FirePL: '喷淋',
+  AQJK: '安全监控',
+};
+
+// 灾害类型字典
+export const DisaterTypeDict = {
+  4: '防火',
+  5: '防尘',
+};
+
+// 传感器字典
+export const SensorDict = {
+  M0101: '甲烷',
+  M0102: '氧气',
+  M0103: '二氧化碳',
+  M0104: '一氧化碳',
+  M0105: '氧化氮(换算成二氧化氮)',
+  M0106: '二氧化硫',
+  M0107: '硫化氢',
+  M0108: '氨',
+  M0109: '氢气',
+  M0110: '氮气',
+  M0111: '负压',
+  M0201: '温度',
+  M0202: '相对湿度',
+  M0301: '风压',
+  M0302: '风速',
+  M0303: '风量',
+  M0701: '粉尘浓度',
+  K0001: '电源状态',
+  K0002: '局部通风机状态',
+  K0003: '主通风机状态',
+  K0004: '馈电传感器',
+  K0005: '风门开关传感器',
+  K0006: '风筒开关传感器',
+  K0007: '烟雾传感器',
+  K0008: '断电控制器',
+  K0009: '声光报警器',
+  K0010: '风电闭锁',
+};

+ 15 - 3
src/views/vent/monitor/site/index.vue

@@ -25,7 +25,8 @@
       <SiteForm
         class="absolute w-full bg-#0960bd44 p-10px top-0"
         :site="selectedSite"
-        @submit="handleSubmit"
+        @message="handleSubmit"
+        @save="handleSave"
       />
     </div>
   </div>
@@ -39,22 +40,26 @@
     MonitorSiteTreeParams,
     MonitorSiteTreeNode,
     MonitorSiteOperationParams,
+    SaveMonitorSiteParams,
   } from '@/api/sys/model/monitorModel';
   import {
     getMonitorSiteTree,
     postMonitorOperation,
     monitorSiteOperationUrl,
     handleMonitorOperation,
+    saveMonitorSite,
   } from '@/api/sys/monitor';
   import IFrame from '@/views/sys/iframe/index.vue';
+  import { useMessage } from '@/hooks/web/useMessage';
 
   const iframeRef = ref();
+  const { notification } = useMessage();
 
   // 测点树相关,包含了刷新、请求的内容
   const treeData = ref<MonitorSiteTreeNode>();
   function refreshTree(params: MonitorSiteTreeParams) {
     getMonitorSiteTree(params).then((r) => {
-      if (r.code === 200) treeData.value = r.data;
+      if (r.code === 200) treeData.value = r.result[0];
     });
   }
 
@@ -80,11 +85,18 @@
     });
   }
 
-  // 提交操作请求
+  // 提交一些与iframe操作请求
   function handleSubmit(formData: MonitorSiteOperationParams) {
     postMonitorOperation(iframeRef.value!, formData);
   }
 
+  // 提交一些保存相关的请求
+  function handleSave(formData: SaveMonitorSiteParams) {
+    saveMonitorSite(formData).then(() => {
+      notification.success({ message: '保存成功' });
+    });
+  }
+
   onMounted(() => {
     refreshTree({});
   });

+ 1 - 1
src/views/vent/monitor/site/types/siteTree.ts

@@ -2,6 +2,6 @@ export interface TreeNode {
   title: string;
   key: string;
   children: TreeNode[];
-  disabled: boolean;
+  selectable: boolean;
   [k: string]: unknown;
 }