Browse Source

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

huang, kai (Contractor) 3 days ago
parent
commit
5ab74b6644

+ 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
+    });
+
 }
 

+ 5 - 3
admin.ui.plus-master/src/api/admin/AlarmService/alarmRulesDto.ts

@@ -72,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,
+    });
+  };
+}
 
 
 

+ 1 - 0
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
   }
   
   /**

+ 65 - 10
admin.ui.plus-master/src/views/admin/statement/alarmManagement/index.vue

@@ -23,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">
@@ -86,6 +90,12 @@
                     {{ 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] }}
@@ -158,7 +168,7 @@ const Data = reactive({
   } as alarmFilterModel_SearchFilter,
   tableModel: [] as Array<alarmFilterModel>,
   dynamicColumns: [
-    { prop: 'gasStation', label: '加油站名称' },
+    { prop: 'gasStation', label: '加油站名称',width: 300 },
     { prop: 'name', label: '油机号' },
     { prop: 'serialNumber', label: '序列号' },
     { prop: 'alarmSource', label: '报警来源' },
@@ -177,20 +187,47 @@ const Data = reactive({
   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()
-})
+  await onQuery();
+  init();
+  
+  // 处理加油站名称截断
+  Data.tableModel.forEach(row => {
+    const name = row.gasStation || '';
+    row.gasStation = name.length > 6 ? `${name.slice(-6)}...` : name;
+  });
+});
 
 /**
  * 监听时间变换
@@ -332,4 +369,22 @@ const handlePushRules = async () => {
   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>

+ 39 - 35
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>
@@ -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>({
@@ -357,40 +364,35 @@ const Data = reactive({
 
 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,
@@ -828,4 +830,6 @@ defineExpose({
   border-radius: 4px;
   background-color: #fafafa;
 }
+
+
 </style>