Ver Fonte

Merge branch 'feature/报警规则、报警发送、报警列表优化配置' into develop

huang, kai (Contractor) há 6 dias atrás
pai
commit
9aa2ffca58

+ 1 - 1
admin.ui.plus-master/src/api/admin/AlarmService/alarmQueryDto.ts

@@ -23,7 +23,7 @@
    /** 推送时间 */
         pushTime?: string
    /** 报警ID */
-        alarmhistoryID?: integer
+        alarmhistoryID?: string
    /** 优先级 */
         taskPriority?: integer
 

+ 2 - 1
admin.ui.plus-master/src/api/admin/AlarmService/alarmRulesDto.ts

@@ -38,7 +38,6 @@ export interface alarmRluesFilterModel {
   condition?:string | null;
   condition2?:string | null;
   cacheFilter?: Partial<alarmRluesFilterModel>;
-  
 }
 
 /**
@@ -50,6 +49,8 @@ export interface alarmRluesFilterModel_SearchFilter {
   Status?: string | null,
   upload?: string | null,
   isActive?:boolean | null
+  pushMethod?: string | null;
+
 }
 
 

+ 1 - 1
admin.ui.plus-master/src/api/admin/reportManagement/alarm/alarmDto.ts

@@ -77,7 +77,7 @@ export  interface alarmFilterModel_SearchFilter{
         /**创建时间 */
         createdDate?: string | null ,
         /**报警历史ID */
-        alarmHistoryID?: string | null ,
+        alarmHistoryID?: string ,
   }
 
 /** 分页信息输出*/

+ 46 - 27
admin.ui.plus-master/src/views/admin/authorize/fuelingFTP/index.vue

@@ -18,7 +18,7 @@
               </el-form-item>
             </el-form>
           </div>
-          <div v-if="state.pwdDisplay" style="width: 100%;display: flex;justify-content: center;align-items: center;">
+          <div v-if="state.pwdDisplay" style="width: 100%;display: flex;justify-content: left;align-items: center; margin-top: 20px;">
             <el-form @submit.stop.prevent style="width: 60%;">
               <el-form-item label="FTP密码" style="width: 82%;">
                 <el-input disabled v-model="state.pwd" style="width: 100%;" placeholder="FTP密码"
@@ -29,7 +29,7 @@
               </el-form-item>
             </el-form>
           </div>
-          <div v-if="state.timeDisplay" style="width: 100%;display: flex;justify-content: center;align-items: center;">
+          <div v-if="state.timeDisplay" style="width: 100%;display: flex;justify-content: left;align-items: center;">
             <el-form @submit.stop.prevent style="width: 60%;">
               <el-form-item label="过期时间" style="width: 100%;">
                 {{ state.filter.expirationTime }}
@@ -64,8 +64,8 @@
               :label="column.label" />
           </el-table>
           <div class="my-flex my-flex-end" style="margin-top: 20px">
-            <el-pagination v-model:currentPage="pageState.pageInput.currentPage"
-              v-model:page-size="pageState.pageInput.pageSize" :total="state.total" :page-sizes="[10, 15, 20, 50, 100]" small
+            <el-pagination v-model:currentPage="state.pageInput.CurrentPage"
+              v-model:page-size="state.pageInput.PageSize" :total="state.total" :page-sizes="[10, 15, 20, 50, 100]" small
               background @size-change="onSizeChange" @current-change="onCurrentChange"
               layout="total, sizes, prev, pager, next, jumper" />
           </div>
@@ -110,7 +110,7 @@ const state = reactive({
   /**分页标识 */
   pageInput: {
     CurrentPage: 1,
-    PageSize: 10,
+    PageSize: 15,
   } as pageInput,
   /**分页总数 */
   total: 0,
@@ -132,27 +132,39 @@ const state = reactive({
 })
 
 /**初始化 */
-const init = async () => {
-  state.filter.info = ''
-  state.filter.name = ''
-  state.filter.applyDate = ''
-  state.filter.expirationTime = ''
-  state.pwd = ''
-  state.btnDisplay = true
-  state.msgDisplay = false
-  state.pwdDisplay = false
-  state.timeDisplay = false
-  const res: any = await new FuelingFtpAPI().getFtpDate({ ...state.pageInput, filter: state.filter }).catch(() => {
-    state.loading = false
-  })
-  //console.log(res.data.list)
-  state.total = res.data.total
-  state.tableModel = res.data.list
-}
+const init = async (showLoading: boolean = true) => {
+  if (showLoading) {
+    state.loading = true;
+  }
+
+  state.filter.info = '';
+  state.filter.name = '';
+  state.filter.applyDate = '';
+  state.filter.expirationTime = '';
+  state.pwd = '';
+  state.btnDisplay = true;
+  state.msgDisplay = false;
+  state.pwdDisplay = false;
+  state.timeDisplay = false;
+
+  try {
+    const res: any = await new FuelingFtpAPI().getFtpDate({
+      ...state.pageInput,
+      filter: state.filter
+    });
+
+    state.total = res.data.total;
+    state.tableModel = res.data.list;
+  } catch (error) {
+    console.error('请求失败:', error);
+    ElMessage.error('数据加载失败');
+  } finally {
+    state.loading = false;
+  }
+};
 
 onMounted(() => {
   // 初始化分页大小
-state.pageInput.pageSize = pageState.pageInput.pageSize;
   init()
   eventBus.off('refreshView')
   eventBus.on('refreshView', async () => {
@@ -231,15 +243,22 @@ const flattenObject = (obj, parentKey = '') => {
 
   return result;
 }
+
 /**页条数变化*/
-const onSizeChange = () => {
-  init()
+const onSizeChange = (val: number) => {
+  pageState.pageInput.pageSize = val
+  state.pageInput.PageSize = val
+  state.pageInput.CurrentPage = 1 // 通常切换size会回到第一页
+  init(true)
 }
 
 /**页数变化*/
-const onCurrentChange = () => {
-  init()
+const onCurrentChange = (val: number) => {
+  pageState.pageInput.currentPage = val
+  state.pageInput.CurrentPage = val
+  init(true)
 }
+
 const padZero = (num: any) => {
   return num < 10 ? '0' + num : num
 }

+ 44 - 28
admin.ui.plus-master/src/views/admin/authorize/fuelingFTPofDate/index.vue

@@ -121,7 +121,7 @@ const state = reactive({
   /**分页标识 */
   pageInput: {
     CurrentPage: 1,
-    PageSize: 10,
+    PageSize: 15,
   } as pageInput,
   /**分页总数 */
   total: 0,
@@ -144,28 +144,40 @@ const state = reactive({
 })
 
 /**初始化 */
-const init = async () => {
-  state.filter.info = ''
-  state.filter.name = ''
-  state.filter.applyDate = ''
-  state.filter.expirationTime = ''
-  state.filter.useDate = ''
-  state.pwd = ''
-  state.btnDisplay = true
-  state.msgDisplay = false
-  state.pwdDisplay = false
-  state.timeDisplay = false
-  const res: any = await new FuelingFtpAPI().getFtpDate({ ...state.pageInput, filter: state.filter }).catch(() => {
-    state.loading = false
-  })
-  //console.log(res.data.list)
-  state.total = res.data.total
-  state.tableModel = res.data.list
-}
+const init = async (showLoading: boolean = true) => {
+  if (showLoading) {
+    state.loading = true;
+  }
+
+  state.filter.info = '';
+  state.filter.name = '';
+  state.filter.applyDate = '';
+  state.filter.expirationTime = '';
+  state.pwd = '';
+  state.btnDisplay = true;
+  state.msgDisplay = false;
+  state.pwdDisplay = false;
+  state.timeDisplay = false;
+
+  try {
+    const res: any = await new FuelingFtpAPI().getFtpDate({
+      ...state.pageInput,
+      filter: state.filter
+    });
+
+    state.total = res.data.total;
+    state.tableModel = res.data.list;
+  } catch (error) {
+    console.error('请求失败:', error);
+    ElMessage.error('数据加载失败');
+  } finally {
+    state.loading = false;
+  }
+};
 
 onMounted(() => {
   // 初始化分页大小
-state.pageInput.PageSize = pageState.pageInput.pageSize;
+// state.pageInput.PageSize = pageState.pageInput.pageSize;
   init()
   eventBus.off('refreshView')
   eventBus.on('refreshView', async () => {
@@ -248,15 +260,19 @@ const flattenObject = (obj, parentKey = '') => {
 
   return result;
 }
-/**页条数变化*/
-const onSizeChange = () => {
-  init()
-}
+const onSizeChange = (val: number) => {
+  pageState.pageInput.pageSize = val;
+  state.pageInput.PageSize = val;
+  state.pageInput.CurrentPage = 1;
+  init(true); // 显示 loading
+};
+
+const onCurrentChange = (val: number) => {
+  pageState.pageInput.currentPage = val;
+  state.pageInput.CurrentPage = val;
+  init(true); // 显示 loading
+};
 
-/**页数变化*/
-const onCurrentChange = () => {
-  init()
-}
 const padZero = (num: any) => {
   return num < 10 ? '0' + num : num
 }

+ 59 - 54
admin.ui.plus-master/src/views/admin/statement/alarmManagement/index.vue

@@ -6,11 +6,6 @@
         <el-card class="mt8" shadow="hover">
           <el-form :model="Data.Filter" @submit.stop.prevent style="margin-bottom:-20px;">
             <el-form-item prop="name" style="width: 100%">
-              <!-- <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
-                <el-form-item label="油机ID">
-                  <el-input v-model="Data.Filter.fuelld" placeholder="请输入油机ID" clearable></el-input>
-                </el-form-item>
-              </el-col> -->
               <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
                 <el-form-item label="加油站">
                   <el-input v-model="Data.Filter.gasStation" placeholder="请输入加油站" clearable></el-input>
@@ -56,7 +51,6 @@
             <el-row>
               <el-button type="primary" icon="ele-Search" @click="onQuery"> 查询 </el-button>
               <el-button type="primary" icon="ele-RefreshRight" @click="onReset"> 重置 </el-button>
-               <!-- 在现有模板中修改按钮的点击事件 -->
                <el-button 
                  v-auth="'api:admin:file:upload-file'" 
                  type="primary" 
@@ -65,32 +59,52 @@
                >
                  执行推送规则
                </el-button>              
+            </el-row>
           </el-row>
-        </el-row>
-
         </el-card>
       </el-col>
       <!--表格-->
       <el-col :xs="24">
         <el-card class="my-fill mt8" shadow="hover">
-          <!-- 修改表格引用,添加ref -->
           <el-table ref="tableRef" v-loading="Data.loading" stripe :data="Data.tableModel"
             style="width: 100%;overflow: hidden;">
-            <!-- 多选框 -->
             <el-table-column type="selection" width="55" fixed="left"></el-table-column>
-            <el-table-column v-for="column in Data.dynamicColumns" :key="column.prop" :prop="column.prop"
-              :label="column.label" />
-                <el-table-column label="操作" fixed="right" header-align="center" align="center" class="right-operation"
+            <el-table-column 
+            v-for="column in Data.dynamicColumns" 
+            :key="column.prop" 
+            :prop="column.prop"
+            :label="column.label" >
+              <template #default="{ row }">
+                <template v-if="column.prop === 'alarmDescription'">
+                <el-tooltip 
+                  placement="top" 
+                  effect="light" 
+                  :content="row.alarmDescription" 
+                  :manual="false"
+                >
+                  <span class="ellipsis-2line">
+                    {{ row.alarmDescription }}
+                  </span>
+                </el-tooltip>
+              </template>
+                <template v-else>
+                  {{ row[column.prop] }}
+              </template>
+              </template>
+            </el-table-column>
+            
+            <el-table-column label="操作" fixed="right" header-align="center" align="center" class="right-operation"
                 width="150">
                 <template #default="{ row }">
-    <el-link class="my-el-link mr12 ml12" :href="row.linkUrl" type="primary" icon="ele-Download" size="small"
-      :underline="false" target="_blank" @click="toList">报警推送记录</el-link>
-      <el-link class="my-el-link mr12 ml12" :href="row.linkUrl" type="primary" icon="ele-Edit" size="small"
-      :underline="false" target="_blank" @click="toPage(row)">油机详情</el-link>
-      <el-link class="my-el-link mr12 ml12" :href="row.linkUrl" type="primary" icon="ele-InfoFilled" size="small"
-      :underline="false" target="_blank">诊断说明</el-link>
+                  <el-link class="my-el-link mr12 ml12" :href="row.linkUrl" type="primary" icon="ele-Download" size="small"
+                    :underline="false" target="_blank" @click="row.alarmHistoryID && toList(row.alarmHistoryID)">报警推送记录</el-link>
+                  <el-link class="my-el-link mr12 ml12" :href="row.linkUrl" type="primary" icon="ele-Edit" size="small"
+                    :underline="false" target="_blank" @click="toPage(row)">油机详情</el-link>
+                  <el-link class="my-el-link mr12 ml12" :href="row.linkUrl" type="primary" icon="ele-InfoFilled" size="small"
+                    :underline="false" target="_blank">诊断说明</el-link>
                 </template>
               </el-table-column>
+
           </el-table>
           <div class="my-flex my-flex-end" style="margin-top: 20px">
             <el-pagination 
@@ -107,9 +121,7 @@
         </el-card>
       </el-col>
     </el-row>
-
   </div>
-
 </template>
 
 <script setup lang="ts" name="authorize/fuelingsdk">
@@ -123,46 +135,29 @@ import { PushRulesApi } from "/@/api/admin/reportManagement/alarm/alarmApi";
 import { ResultOutputBoolean } from "/@/api/admin/reportManagement/alarm/alarmDto";
 
 const pushRulesApi = new PushRulesApi();
-const tableRef = ref<InstanceType<typeof ElTable>>(); // 添加表格引用
+const tableRef = ref<InstanceType<typeof ElTable>>();
 
-// 使用组合式函数获取分页状态
 const pageState = useDynamicPageSize(10, 15);
 
 /**页面对象 */
 const Data = reactive({
   time: '',
-  /**加载显示 */
   loading: false,
-  /**条件查询模块 */
   Filter: {
-    /**油机id */
     fuelld: "",
-    /**加油站 */
     gasStation: "",
-    /**油机号*/
     name: "",
-    /**序列号*/
     serialNumber: "",
-    /**报警来源 */
     alarmSource: "",
-    /**报警类型 */
     alarmType: "",
-    /**报警描述 */
     alarmDescription: "",
-    /**报警设备	 */
     alarmDevice: "",
-    /** 油枪*/
     nozzleControlName: "",
-    /**创建开始的时间 */
     CreateBeginTime: "",
-    /**创建结束的时间 */
     CreateEndTime: "",
   } as alarmFilterModel_SearchFilter,
-  /**表格信息 */
   tableModel: [] as Array<alarmFilterModel>,
-  /**动态表头 */
   dynamicColumns: [
-    // { prop: 'fuelld', label: '油机id' },
     { prop: 'gasStation', label: '加油站名称' },
     { prop: 'name', label: '油机号' },
     { prop: 'serialNumber', label: '序列号' },
@@ -170,19 +165,15 @@ const Data = reactive({
     { prop: 'alarmType', label: '报警类型' },
     { prop: 'alarmDescription', label: '报警描述' },
     { prop: 'alarmDevice', label: '报警设备' },
-    { prop: 'nozzleControlName', label: '油枪' },
+    // { prop: 'nozzleControlName', label: '油枪' },
     { prop: 'createdDate', label: '报警时间' },
     { prop: '', label: '诊断说明' },
     { prop: '', label: '是否推送' },
-
-    // { prop: 'alarmHistoryID', label: '报警历史ID' },
   ],
-  /**分页标识 */
   pageInput: {
     currentPage: 1,
     pageSize: 15,
   } as PageInputAlarmFilterModel,
-  /**分页总数 */
   total: 0,
 })
 
@@ -196,13 +187,11 @@ const init = async () => {
 }
 
 onMounted(async () => {
-     // 初始化分页大小
-     Data.pageInput.pageSize = pageState.pageInput.pageSize;
+  Data.pageInput.pageSize = pageState.pageInput.pageSize;
   await onQuery()
   init()
 })
 
-
 /**
  * 监听时间变换
  */
@@ -259,14 +248,20 @@ const onCurrentChange = (val: number) => {
   init()
 }
 
-const toPage = (row: {fuelId: any; 
-}) => {
+const toPage = (row: {fuelId: any; }) => {
   router.push({ path: `/statement/${row.fuelId}` })
 }
 
-const toList = () =>{
-  router.push({ path:`/authorize/statement/alarmQuery`})
-}
+const toList = (alarmHistoryID?: string) => {
+  if (alarmHistoryID) {
+    router.push({
+      path: `/authorize/statement/alarmQuery`,
+      query: { alarmHistoryID } 
+    });
+  } else {
+    router.push({ path: `/authorize/statement/alarmQuery` });
+  }
+};
 
 /**
  * 执行推送规则
@@ -307,7 +302,6 @@ const handlePushRules = async () => {
     ElMessage.error('报警推送过程中发生异常');
   }
 };
-
 </script>
 
 <style scoped lang="scss">
@@ -318,7 +312,6 @@ const handlePushRules = async () => {
 
 /* 输入框标签固定四个字符宽度 */
 ::v-deep .el-form-item__label {
-  // 字体大小14,4个字符,12px右间距
   width: 14*4px+12px;
   justify-content: start;
 }
@@ -327,4 +320,16 @@ const handlePushRules = async () => {
 ::v-deep .el-table th.el-table__cell {
   background-color: #F6F6F6;
 }
+
+/* 报警描述文本截断样式 */
+.ellipsis-2line {
+  display: -webkit-box;
+  -webkit-box-orient: vertical;
+  -webkit-line-clamp: 2;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: normal;
+  line-height: 1.5;
+  min-height: 3em;
+}
 </style>

+ 12 - 2
admin.ui.plus-master/src/views/admin/statement/alarmQuery/index.vue

@@ -87,6 +87,11 @@ import { PageInputAlarmFilterModel } from "/@/api/admin/reportManagement/alarm/a
 import { useDynamicPageSize } from "/@/composables/useDynamicPageSize";
 import { ElMessage } from "element-plus";
 import { all } from "axios";
+import { useRoute } from 'vue-router';
+
+const route = useRoute();
+const alarmHistoryID = ref<string | undefined>(route.query.alarmHistoryID as string);
+
 
 // 使用组合式函数获取分页状态
 // const pageState = useDynamicPageSize(10, 15);
@@ -104,7 +109,8 @@ import { all } from "axios";
         pushed: "",
 /**推送时间 */
         pushTime: "",
-        ispushed:undefined
+        ispushed:undefined,
+         alarmHistoryID: ""
       },
   /**表格信息 */
 tableModel: [] as PushDto[],
@@ -135,6 +141,9 @@ enum FuelDispenserEnum {
 }
 
   onMounted(async () => {
+      if (alarmHistoryID.value) {
+    state.filter.alarmHistoryID = alarmHistoryID.value; // 将参数赋值给筛选条件
+      }
   await onQuery()
     init()
     eventBus.off('refreshView')
@@ -220,7 +229,8 @@ const init = async () => {
     pushUser: "",
     pushed: "",
     pushTime: "",
-    ispushed:undefined
+    ispushed:undefined,
+    alarmHistoryID:""
   };
 
   // 重新加载数据

+ 5 - 7
admin.ui.plus-master/src/views/admin/yujing/alarmRules/components/add-alarmRules.vue

@@ -79,7 +79,7 @@
       </div>
       <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
         <el-form :inline="true" @submit.stop.prevent>
-          <el-form-item label="正则匹配:" style="width: 100%;">
+          <el-form-item label="关键字匹配:" style="width: 100%;">
             <el-input type="textarea" rows="5" v-model="Data.Filter.regular" style="width: 100%;" placeholder="请输入" />
           </el-form-item>
         </el-form>
@@ -350,7 +350,7 @@ const Data = reactive({
   }],
   alarmEquipment: ["安全装置","编码器","计控主板","监控微处理器","智能型控制阀","油气回收控制板","显示屏","计量器","加油机","油枪"],
   alarmType: ["加油机离线","通信异常","非法部件","厂商不符","绑定错误","监控微处理器报警","安全装置报警","加油机报警","检定"],
-  alarmSource: ['云平台', '安全监督装置'],
+  alarmSource: ['云平台', '安全装置'],
   alarmproType: ["油机维修","装置维修"],
   alarmproStatus: ["正在维修","结束维修"]
 })
@@ -572,10 +572,6 @@ const submitForm = async () => {
     ElMessage.warning('请选择推送用户')
     return
   }
-  if (!Data.Filter.pushMethod) {
-    ElMessage.warning('请选择至少一种推送方式')
-    return
-  }
   if (Data.radioValue1 && !Data.mode1) {
     ElMessage.warning('请选择微信模板')
     return
@@ -658,7 +654,7 @@ const openDialog = (row: alarmRluesFilterModel) => {
   console.log(row)
   if(row){
     console.log(Data.Filter)
-    const { triggerMethod, maintenanceTriggerMethod, ruleName, roleMappingId, labelId,pushUserid,condition,condition2,isExclusive,isExclusiveMaintenance, ...rest } = Data.Filter;
+    const { triggerMethod, maintenanceTriggerMethod, ruleName, roleMappingId, labelId,pushUserid,condition,condition2,isExclusive,isExclusiveMaintenance,regular,...rest } = Data.Filter;
     Data.Filter = { ...rest, ...row };
     Data.Filter.triggerMethod = triggerMethod || Data.Filter.triggerMethod;
     Data.Filter.maintenanceTriggerMethod = maintenanceTriggerMethod || Data.Filter.maintenanceTriggerMethod;
@@ -668,6 +664,8 @@ const openDialog = (row: alarmRluesFilterModel) => {
     Data.Filter.labelId = labelId || Data.Filter.labelId;
     Data.Filter.ruleName = ruleName || Data.Filter.ruleName;
     Data.Filter.pushUserid = pushUserid || Data.Filter.pushUserid;
+    Data.Filter.regular = regular || Data.Filter.regular;
+
 
 
     Data.Filter.isExclusive = Boolean(row.isExclusive);

+ 6 - 6
admin.ui.plus-master/src/views/admin/yujing/alarmRules/index.vue

@@ -21,10 +21,9 @@
                            </el-col>
                            <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
                               <el-form-item label="推送方式">
-                                  <el-select  placeholder="请选择推送方式">
+                                  <el-select v-model="Data.Filter.pushMethod" placeholder="请选择推送方式">
                                    <el-option label="所有" :value="''"></el-option>
-                                   <el-option label="电子邮箱" :value="''"></el-option>
-                                   <el-option label="微信" :value="''"></el-option>
+                    <el-option v-for="(value, key) in upload" :key="key" :label="value" :value="key" />
                                  </el-select>
                              </el-form-item>
                            </el-col>
@@ -111,6 +110,7 @@ const Data = reactive({
     ruleName: "",
     Status:"",
     upload:"",
+    pushMethod:"",
     isActive:undefined
   } as alarmRluesFilterModel_SearchFilter,
   /**表格信息 */
@@ -121,7 +121,7 @@ const Data = reactive({
     // { prop: 'userName', label: '用户' },
     { prop: 'pushMethod', label: '推送方式' },
     // { prop: 'triggerMethod', label: '触发方式' },
-    { prop: 'regular', label: '正则匹配' },
+    { prop: 'regular', label: '关键字匹配' },
     { prop: 'taskPriority', label: '优先级' },
     // { prop: 'isExclusive', label: '是否互斥' },
     // { prop: 'stationName', label: '推送方式' },
@@ -146,8 +146,8 @@ const StatusOptions = [
 ];
 
 enum upload {
-  email="电子邮箱",
-  vx="微信"
+  "电子邮箱"="电子邮箱",
+  "微信"="微信"
 }
 
 /**引入组件*/