Parcourir la source

Merge branch 'develop' of http://dev.hsfuel.com:3000/adminTk/Web into feature/电子说明书优化

Zhenghanjv il y a 1 semaine
Parent
commit
b6bc7992d5

+ 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
 

+ 15 - 0
admin.ui.plus-master/src/api/admin/AlarmService/alarmRulesApi.ts

@@ -91,5 +91,20 @@ export class alarmRulesApi<SecurityDataType = unknown> extends HttpClient<Securi
   static addForm: any;
   static updateForm: any;
 
+  /**
+   * 获取绑定微信公众号的用户与角色
+   * @request POST:/api/app/push/get-wx-user-role
+   */
+  getWxUserRole = (data: any = {}, params: RequestParams = {}) =>
+    this.request<{ success: boolean; code: string; msg: string; data: any }, any>({
+      path: '/api/app/push/get-wx-user-role',
+      method: 'POST',
+      body: data,
+      secure: true,
+      type: ContentType.Json, // 使用 Json 类型
+      format: 'json',
+      ...params
+    });
+
 }
 

+ 7 - 4
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;
+
 }
 
 
@@ -71,10 +72,12 @@ export interface PageInputAlarmRluesFilterModel {
 
 // /@/api/admin/AlarmService/alarmRulesDto.ts
 export interface UserListItem {
-  userPhone: any;
-  userId: any;
   id: number; // 用户ID
-  userName: string; // 用户名
   nickname?: string; // 昵称(可选)
   phone?: string; // 手机号(可选)
+  roleName: string; // 新增字段,用于存储角色名称
+  name?:string
+  names?:string
+
 }
+

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

@@ -1,6 +1,6 @@
 import axios, { AxiosResponse } from 'axios'
 import {ContentType, HttpClient, RequestParams} from "/@/api/admin/http-client";
-import {PageInputAlarmFilterModel,alarmFilterModel,PushRulesQuery, ResultOutputBoolean} from "/@/api/admin/reportManagement/alarm/alarmDto";
+import {PageInputAlarmFilterModel,alarmFilterModel,PushRulesQuery, ResultOutputBoolean, WxUserRoleResult} from "/@/api/admin/reportManagement/alarm/alarmDto";
 import request from '/@/utils/request';
 
 export class AlarmApi<SecurityDataType = unknown> extends HttpClient<SecurityDataType>{
@@ -57,7 +57,23 @@ export class PushRulesApi<SecurityDataType = unknown> extends HttpClient<Securit
   };
 }
 
+// alarmApi.ts
 
+export class PushApi<SecurityDataType = unknown> extends HttpClient<SecurityDataType> {
+  /**
+   * 获取绑定微信公众号的用户与角色
+   */
+  getWxUserAndRole = (params: RequestParams = {}): Promise<WxUserRoleResult> => {
+    return this.request<WxUserRoleResult>({
+      path: '/api/app/push/get-wx-user-role',
+      method: 'POST',
+      secure: true,
+      type: ContentType.UrlEncoded, // 表单格式
+      format: 'json',
+      ...params,
+    });
+  };
+}
 
 
 

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

@@ -50,6 +50,7 @@ export  interface alarmFilterModel_SearchFilter{
     CreateBeginTime?: string,
     /**创建结束的时间 */
     CreateEndTime?: string,
+    truncatedGasStation?:string
   }
   
   /**
@@ -77,7 +78,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
 }

+ 124 - 64
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>
@@ -28,7 +23,11 @@
               </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.alarmType" placeholder="请输入报警类型" clearable></el-input>
+                  <!-- <el-input v-model="Data.Filter.alarmType" placeholder="请输入报警类型" clearable></el-input> -->
+                   <el-select v-model="Data.Filter.alarmType">
+                      <el-option label="所有" :value="''"></el-option>
+                    <el-option v-for="(value, key) in FuelDispenserEnum" :key="key" :label="value" :value="key" />
+                   </el-select>
                 </el-form-item>
               </el-col>
               <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
@@ -56,7 +55,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 +63,58 @@
                >
                  执行推送规则
                </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-if="column.prop === 'gasStation'">      
+                <el-tooltip placement="top" effect="light" :content="row.gasStation">
+                  <div class="truncated-name">{{ row.truncatedGasStation }}</div>
+                </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 +131,7 @@
         </el-card>
       </el-col>
     </el-row>
-
   </div>
-
 </template>
 
 <script setup lang="ts" name="authorize/fuelingsdk">
@@ -123,85 +145,89 @@ 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: 'gasStation', label: '加油站名称',width: 300 },
     { prop: 'name', label: '油机号' },
     { prop: 'serialNumber', label: '序列号' },
     { prop: 'alarmSource', label: '报警来源' },
     { 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,
 })
 
+enum FuelDispenserEnum {
+  加油机离线 = '加油机离线',
+  通信异常 = '通信异常',
+  非法部件 = '非法部件',
+  厂商不符 = '厂商不符',
+  绑定错误 = '绑定错误',
+  监控微处理器报警 = '监控微处理器报警',
+  安全装置报警 = '安全装置报警',
+  加油机报警 = '加油机报警',
+  检定 = '检定'
+}
+
 /**初始化 */
 const init = async () => {
-  Data.loading = true
-  const res: any = await new AlarmApi().getPage({ ...Data.pageInput, filter: Data.Filter })
-  Data.tableModel = res?.data?.list ?? []
-  Data.total = res?.data?.total ?? 0
-  Data.loading = false
+  Data.loading = true;
+  const res: any = await new AlarmApi().getPage({ ...Data.pageInput, filter: Data.Filter });
+  Data.tableModel = res?.data?.list ?? [];
+  
+  // 处理加油站名称:显示后六个字,不足六个字则显示全部
+  Data.tableModel.forEach(row => {
+    const name = row.gasStation || '';
+    row.truncatedGasStation = name.length > 6 
+      ? name.slice(-6) + '...' // 后六个字+省略号
+      : name;
+  });
+  
+  Data.total = res?.data?.total ?? 0;
+  Data.loading = false;
 }
 
 onMounted(async () => {
-     // 初始化分页大小
-     Data.pageInput.pageSize = pageState.pageInput.pageSize;
-  await onQuery()
-  init()
-})
-
+  Data.pageInput.pageSize = pageState.pageInput.pageSize;
+  await onQuery();
+  init();
+  
+  // 处理加油站名称截断
+  Data.tableModel.forEach(row => {
+    const name = row.gasStation || '';
+    row.gasStation = name.length > 6 ? `${name.slice(-6)}...` : name;
+  });
+});
 
 /**
  * 监听时间变换
@@ -259,14 +285,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 +339,6 @@ const handlePushRules = async () => {
     ElMessage.error('报警推送过程中发生异常');
   }
 };
-
 </script>
 
 <style scoped lang="scss">
@@ -318,7 +349,6 @@ const handlePushRules = async () => {
 
 /* 输入框标签固定四个字符宽度 */
 ::v-deep .el-form-item__label {
-  // 字体大小14,4个字符,12px右间距
   width: 14*4px+12px;
   justify-content: start;
 }
@@ -327,4 +357,34 @@ 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;
+}
+
+/* 加油站名称截断样式 */
+.truncated-name {
+  display: inline-block;
+  min-width: 200px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  
+  /* 核心逻辑:通过伪元素实现后六位显示 */
+  &::before {
+    content: attr(data-truncated);
+    position: absolute;
+    right: 0;
+  }
+  
+}
+
 </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:""
   };
 
   // 重新加载数据

+ 44 - 42
admin.ui.plus-master/src/views/admin/yujing/alarmRules/components/add-alarmRules.vue

@@ -29,17 +29,24 @@
         <el-form :inline="true" @submit.stop.prevent>
           <el-form-item label="推送用户:" style="width: 100%;" prop="pushUserid">
             <el-select
-              v-model="Data.Filter.pushUserid" 
+              v-model="Data.Filter.pushUserid"
               placeholder="请选择用户"
               multiple
               style="width: 100%;"
-            > 
-              <el-option
-                v-for="user in Data.userList"
-                :key="user.id"
-                :label="`${user.userName} - ${user.nickname || user.phone}`" 
-                :value="user.id" 
-              />
+            >
+              <el-option-group
+                v-for="(group, index) in Data.userList"
+                :key="index"
+                :label="`角色:${group.roleName}`"
+              >
+                <el-option
+                  v-for="user in group.users"
+                  :key="user.id"
+                  :label="`${user.name}`"
+                  :value="user.id"
+                >
+                </el-option>
+              </el-option-group>
             </el-select>
           </el-form-item>
         </el-form>
@@ -79,7 +86,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>
@@ -286,7 +293,7 @@ import { TemplateFilterDto } from "/@/api/admin/AlarmService/pushTemplateDto";
 import eventBus from "/@/utils/mitt";
 import { ElMessage, type FormRules } from 'element-plus'
 import { UserListItem } from "/@/api/admin/AlarmService/alarmRulesDto"; // 用户数据类型
-
+import { URLSearchParams } from 'url';
 
 // 条件验证规则
 const conditionRules = reactive<FormRules>({
@@ -350,47 +357,42 @@ const Data = reactive({
   }],
   alarmEquipment: ["安全装置","编码器","计控主板","监控微处理器","智能型控制阀","油气回收控制板","显示屏","计量器","加油机","油枪"],
   alarmType: ["加油机离线","通信异常","非法部件","厂商不符","绑定错误","监控微处理器报警","安全装置报警","加油机报警","检定"],
-  alarmSource: ['云平台', '安全监督装置'],
+  alarmSource: ['云平台', '安全装置'],
   alarmproType: ["油机维修","装置维修"],
   alarmproStatus: ["正在维修","结束维修"]
 })
 
 const getUserList = async () => {
   try {
-    const res = await new alarmRulesApi().getList({
-      currentPage: 1, 
-      pageSize: 100,
-      filter: {
-        userName: "",
-      },
-    });
-    
-    // 去重逻辑
-    const userSet = new Set<number>();
-    const uniqueUsers = res.data.list
-      .map((user: UserListItem) => ({
-        id: user.userId,
-        userName: user.userName,
-        value: user.userId,
-        nickname: user.nickname,
-        phone: user.userPhone,
-      }))
-      .filter((user: { id: number; }) => {
-        if (userSet.has(user.id)) {
-          return false;
+    const res = await new alarmRulesApi().getWxUserRole({});
+    console.log('getWxUserRole接口返回数据:', res);
+    const userDataArray = res.data || [];
+    const userMap = new Map<string, UserListItem[]>();
+    userDataArray.forEach((roleObj) => {
+      const roleName = roleObj.roleName;
+      roleObj.users.forEach((userObj) => {
+        if (!userMap.has(roleName)) {
+          userMap.set(roleName, []);
         }
-        userSet.add(user.id);
-        return true;
+        userMap.get(roleName).push({
+          id: userObj.id,
+          name: userObj.name,
+          roleName: roleName
+        });
       });
-    
-    Data.userList = uniqueUsers;
+    });
+    const groupedUsers = Array.from(userMap.entries()).map(([role, users]) => ({
+      roleName: role,
+      users: users
+    }));
+    Data.userList = groupedUsers;
+    console.log('处理后的用户列表:', Data.userList);
   } catch (error) {
     console.error("获取用户列表失败:", error);
     ElMessage.error("用户列表加载失败");
   }
 };
 
-
 const templateData = reactive({
   Filter: {
     currentPage: 0,
@@ -572,10 +574,6 @@ const submitForm = async () => {
     ElMessage.warning('请选择推送用户')
     return
   }
-  if (!Data.Filter.pushMethod) {
-    ElMessage.warning('请选择至少一种推送方式')
-    return
-  }
   if (Data.radioValue1 && !Data.mode1) {
     ElMessage.warning('请选择微信模板')
     return
@@ -658,7 +656,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 +666,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);
@@ -830,4 +830,6 @@ defineExpose({
   border-radius: 4px;
   background-color: #fafafa;
 }
+
+
 </style>

+ 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="微信"
+  "电子邮箱"="电子邮箱",
+  "微信"="微信"
 }
 
 /**引入组件*/