Ver código fonte

fix: 更新设备类型和告警类型配置,优化表单和列表展示逻辑

sunqijun 1 mês atrás
pai
commit
b2e52d7074

+ 5 - 70
src/hooks/useFormConfigHook.ts

@@ -12,7 +12,7 @@
  * @description 用于RuleForm的配置
  * @author Chauncey
  */
-import { ref, reactive, watch, onUnmounted } from 'vue';
+import { ref, reactive } from 'vue';
 import type { FormRules } from 'element-plus';
 import { cloneDeep, isEqual } from 'lodash-es';
 import { onBeforeRouteLeave } from 'vue-router';
@@ -26,78 +26,18 @@ export const useFormConfigHook = <T extends Record<string, any> = Record<string,
 ) => {
   const ruleFormConfig = ref<FormConfig[]>(config);
   const ruleFormData = reactive<T>(cloneDeep(data));
-  const initRuleFormData = ref<T>(cloneDeep(data));
+  const initRuleFormData = ref<T>();
   const formRules = reactive<FormRules<T>>(rules || {});
-  const routeLeaveGuardRegistered = ref(false);
-  let stopAutoSyncWatch: (() => void) | null = null;
-  let autoSyncTimer: ReturnType<typeof setTimeout> | null = null;
-  let removeInteractionListeners: (() => void) | null = null;
-
-  const stopAutoSyncBaseline = () => {
-    if (stopAutoSyncWatch) {
-      stopAutoSyncWatch();
-      stopAutoSyncWatch = null;
-    }
-    if (autoSyncTimer) {
-      clearTimeout(autoSyncTimer);
-      autoSyncTimer = null;
-    }
-    if (removeInteractionListeners) {
-      removeInteractionListeners();
-      removeInteractionListeners = null;
-    }
-  };
-
-  const startAutoSyncBaseline = () => {
-    stopAutoSyncBaseline();
-
-    stopAutoSyncWatch = watch(
-      () => ruleFormData,
-      () => {
-        initRuleFormData.value = cloneDeep(ruleFormData as T);
-      },
-      { deep: true, flush: 'post' },
-    );
-
-    const stopByUserInteraction = () => {
-      stopAutoSyncBaseline();
-    };
-
-    if (typeof window !== 'undefined') {
-      const events: Array<keyof WindowEventMap> = ['input', 'change', 'keydown', 'compositionend'];
-      events.forEach((eventName) => {
-        window.addEventListener(eventName, stopByUserInteraction, true);
-      });
-      removeInteractionListeners = () => {
-        events.forEach((eventName) => {
-          window.removeEventListener(eventName, stopByUserInteraction, true);
-        });
-      };
-    }
-
-    autoSyncTimer = setTimeout(() => {
-      stopAutoSyncBaseline();
-    }, 1500);
-  };
-
   const cloneRuleFormData = () => {
-    if (routeLeaveGuardRegistered.value) return;
     initRuleFormData.value = cloneDeep(ruleFormData as T);
   };
-
   const hasFormChanged = () => {
-    return !isEqual(initRuleFormData.value, ruleFormData);
+    return isEqual(initRuleFormData.value, ruleFormData);
   };
-
   const beforeRouteLeave = () => {
-    if (routeLeaveGuardRegistered.value) return;
-    initRuleFormData.value = cloneDeep(ruleFormData as T);
-    routeLeaveGuardRegistered.value = true;
-    startAutoSyncBaseline();
-
     onBeforeRouteLeave((to, from, next) => {
       const hasChange = hasFormChanged();
-      if (!hasChange) {
+      if (hasChange) {
         next();
         return;
       }
@@ -116,11 +56,6 @@ export const useFormConfigHook = <T extends Record<string, any> = Record<string,
       }, 200);
     });
   };
-
-  onUnmounted(() => {
-    stopAutoSyncBaseline();
-  });
-
   return {
     ruleFormConfig,
     ruleFormData,
@@ -128,4 +63,4 @@ export const useFormConfigHook = <T extends Record<string, any> = Record<string,
     cloneRuleFormData,
     beforeRouteLeave,
   };
-};
+};

+ 19 - 8
src/views/production-safety/risk-identification-and-control/equipment-high-alert/configs/form.ts

@@ -2,24 +2,35 @@
  * @Author: liuJie
  * @Date: 2026-03-05 10:11:20
  * @LastEditors: liuJie
- * @LastEditTime: 2026-03-10 14:44:38
+ * @LastEditTime: 2026-03-12 14:51:48
  * @Describe: file describe
  */
 import type { FormConfig } from '@/types/basic-form';
 
 /** 设备类别选项(设备类别名称) */
 export const DEVICE_CATEGORY_OPTIONS = [
-  { label: 'GC2', value: 1 },
-  { label: '机动工艺车辆', value: 2 },
+  { label: '报警器', value: 'siren' },
+  { label: '传感器', value: 'sensor' },
 ];
 
-/** 设备种类选项(设备种类名称) */
-export const DEVICE_TYPE_OPTIONS = [
-  { label: '压力容器', value: 1 },
-  { label: '固定式压力容器', value: 2 },
-  { label: '压力管道', value: 3 },
+export const DEVICE_TYPE = {
+    siren:'报警器',
+    sensor: '传感器'
+}
+
+
+/** 告警类型 */
+export const Alarm_TYPE_OPTIONS = [
+  { label: '安全告警', value: 'safe_alarm' },
+  { label: '通讯告警', value: 'communicate_alarm' },
+  { label: '其他告警', value: 'other_alarm' },
 ];
 
+export const ALARM_TYPE = {
+    safe_alarm:'安全告警',
+    communicate_alarm: '通讯告警',
+    other_alarm: '其他告警',
+}
 
 export const SPECIAL_EQUIPMENT_FORM_DATA = {
   deviceId: '',

+ 9 - 1
src/views/production-safety/risk-identification-and-control/equipment-high-alert/configs/tables.ts

@@ -2,7 +2,7 @@
  * @Author: liuJie
  * @Date: 2026-02-26 13:57:24
  * @LastEditors: liuJie
- * @LastEditTime: 2026-03-10 14:43:50
+ * @LastEditTime: 2026-03-12 15:16:19
  * @Describe: file describe
  */
 import type { TableColumnProps } from '@/types/basic-table';
@@ -26,10 +26,17 @@ export const SPECIAL_EQUIPMENT_TABLE_COLUMNS: TableColumnProps[] = [
     prop: 'deviceNo',
     align: 'left',
     minWidth: '160px',
+  },
+    {
+    label: '设备名称',
+    prop: 'deviceName',
+    align: 'left',
+    minWidth: '160px',
   },
   {
     label: '设备类型',
     prop: 'deviceType',
+    slot: 'deviceType',
     align: 'left',
     minWidth: '160px',
   },
@@ -60,6 +67,7 @@ export const SPECIAL_EQUIPMENT_TABLE_COLUMNS: TableColumnProps[] = [
   {
     label: '告警类型',
     prop: 'alarmType',
+    slot: 'alarmType',
     align: 'left',
     minWidth: '140px',
   },

+ 28 - 2
src/views/production-safety/risk-identification-and-control/equipment-high-alert/list.vue

@@ -42,6 +42,22 @@
                   />
                 </el-select>
               </div>
+              <div class="select-box--item">
+                <span>告警类型:</span>
+                <el-select
+                  v-model="queryParams.queryParam.alarmType"
+                  placeholder="请选择设备类型"
+                  clearable
+                  class="act-search-input"
+                >
+                  <el-option
+                    v-for="opt in Alarm_TYPE_OPTIONS"
+                    :key="opt.value"
+                    :label="opt.label"
+                    :value="opt.value"
+                  />
+                </el-select>
+              </div>
               <div class="select-box--item">
                 <span>所属部门:</span>
                 <el-cascader
@@ -87,6 +103,12 @@
             @update:pageSize="handleSizeChange"
             @update:pageNumber="handleCurrentChange"
           >
+            <template #deviceType="scope">
+                {{ DEVICE_TYPE[scope.row.deviceType]}}
+            </template>
+            <template #alarmType="scope">
+                {{ ALARM_TYPE[scope.row.alarmType]}}
+            </template>
             <template #action="scope">
               <div class="action-container--div" style="justify-content: left">
                 <ActionButton
@@ -118,7 +140,7 @@
   import useTableConfig from '@/hooks/useTableConfigHook';
   import ActionButton from '@/components/ActionButton.vue';
   import { TABLE_OPTIONS, SPECIAL_EQUIPMENT_TABLE_COLUMNS } from './configs/tables';
-  import { DEVICE_CATEGORY_OPTIONS, DEVICE_TYPE_OPTIONS } from './configs/form';
+  import { DEVICE_CATEGORY_OPTIONS, Alarm_TYPE_OPTIONS, DEVICE_TYPE, ALARM_TYPE} from './configs/form';
   import { downloadByData } from '@/utils/file/download';
 import { http } from '@/utils/http/axios';
   import dayjs from 'dayjs';
@@ -133,7 +155,9 @@ import { http } from '@/utils/http/axios';
       //设备名称
       deviceName?: string | undefined;
       // 设备类型
-      deviceType?: string | number | undefined;
+      deviceType?: string | undefined;
+      // 告警类型
+      alarmType?: string | undefined;
       // 所属部门
       deptName?: string | undefined;
       // 开始时间
@@ -176,6 +200,8 @@ const exportTableData = (params)=>{
       deviceName: undefined,
       // 设备类型
       deviceType: undefined,
+      // 告警类型
+      alarmType: undefined,
       // 所属部门
       deptName: undefined,
       // 开始时间