Browse Source

feat:新增报警规则列表

xianna.liang 7 months ago
parent
commit
d2c9d5cbbe

+ 42 - 21
admin.ui.plus-master/src/api/admin/AlarmService/alarmRulesApi.ts

@@ -1,29 +1,50 @@
 import { AxiosResponse } from 'axios'
 import { AxiosResponse } from 'axios'
-import {ContentType, HttpClient, RequestParams} from "/@/api/admin/http-client";
-import {alarmRluesFilterModel} from "/@/api/admin/AlarmService/alarmRulesDto";
+import { ContentType, HttpClient, RequestParams } from "/@/api/admin/http-client";
+import { alarmRluesFilterModel,PageInputAlarmRluesFilterModel } from "/@/api/admin/AlarmService/alarmRulesDto";
 
 
 export class alarmRulesApi<SecurityDataType = unknown> extends HttpClient<SecurityDataType> {
 export class alarmRulesApi<SecurityDataType = unknown> extends HttpClient<SecurityDataType> {
 
 
-  /**
-   * No description
-   *
-   * @tags
-   * @name updateForm
-   * @summary 新建规则
-   * @request POST:
-   * @secure
-   */
-  addForm = (data: alarmRluesFilterModel, params: RequestParams = {}) =>
-      this.request<AxiosResponse, any>({
-          path: '/api/app/push/upload-push-rule',
-          method: 'POST',
-          body: data,
-          secure: true,
-          type: ContentType.Json,
-          format: 'json',
-          ...params
-      })
+    /**
+     * No description
+     *
+     * @tags
+     * @name updateForm
+     * @summary 新建规则
+     * @request POST:
+     * @secure
+     */
+    addForm = (data: alarmRluesFilterModel, params: RequestParams = {}) =>
+        this.request<AxiosResponse, any>({
+            path: '/api/app/push/upload-push-rule',
+            method: 'POST',
+            body: data,
+            secure: true,
+            type: ContentType.Json,
+            format: 'json',
+            ...params
+        })
 
 
 
 
+
+    /**
+ * No description
+ *
+ * @tags
+ * @name getData
+ * @summary 查询规则
+ * @request POST:
+ * @secure
+ */
+    getData = (data: PageInputAlarmRluesFilterModel, params: RequestParams = {}) =>
+        this.request<alarmRluesFilterModel, any>({
+            path: '/api/app/push/get-push-rule',
+            method: 'POST',
+            body: data,
+            secure: true,
+            type: ContentType.Json,
+            format: 'json',
+            ...params
+        })
+
 }
 }
 
 

+ 46 - 24
admin.ui.plus-master/src/api/admin/AlarmService/alarmRulesDto.ts

@@ -6,31 +6,53 @@
 /**
 /**
  * 数据信息
  * 数据信息
  */
  */
-export  interface alarmRluesFilterModel{
-    /**规则名称*/
-    ruleName?: string,
-    /**角色 */
-    roleMappingId?:Array<number>, 
-    /**备注*/
-    remark?: string,
-    /**推送方式 */
-    pushMethod?:string,
-    /**模板 */
-    pushTemplateMappingID?:Array<number>, 
-    /**正则表达式 */
-    regular?:string,
-    /**是否互斥 */
-    isExclusive?:boolean,
-    /**优先级 */
-    taskPriority?:number, 
-    /**触发方式 */
-   triggerMethod?:string,
-    /**规则条件 */
-    conditionsJson?:string,
-    /**推送用户中间表id */
-    pushUserid?:Array<number>
-  }
+export interface alarmRluesFilterModel {
+  /**规则名称*/
+  ruleName?: string,
+  /**角色 */
+  roleMappingId?: Array<number>,
+  /**备注*/
+  remark?: string,
+  /**推送方式 */
+  pushMethod?: string,
+  /**模板 */
+  pushTemplateMappingID?: Array<number>,
+  /**正则表达式 */
+  regular?: string,
+  /**是否互斥 */
+  isExclusive?: boolean,
+  /**优先级 */
+  taskPriority?: number,
+  /**触发方式 */
+  triggerMethod?: string,
+  /**规则条件 */
+  conditionsJson?: string,
+  /**推送用户中间表id */
+  pushUserid?: Array<number>
+}
 
 
+/**
+ * 列表查询信息
+ */
+export interface alarmRluesFilterModel_SearchFilter {
+  /**规则名称*/
+  ruleName?: string,
+}
 
 
 
 
+/** 分页信息输入 */
+export interface PageInputAlarmRluesFilterModel {
+  /**
+   * 当前页标
+   * @format int32
+   */
+  currentPage?: number
+  /**
+   * 每页大小
+   * @format int32
+   */
+  pageSize?: number
+  dynamicFilter?: DynamicFilterInfo
+  filter?: alarmRluesFilterModel_SearchFilter
+}
 
 

+ 27 - 0
admin.ui.plus-master/src/api/admin/AlarmService/sendMessageApi.ts

@@ -0,0 +1,27 @@
+import { AxiosResponse } from 'axios'
+import { ContentType, HttpClient, RequestParams } from "/@/api/admin/http-client";
+import { sendMessageFilterModel, PageInputSendMessageFilterModel } from "/@/api/admin/AlarmService/sendMessageDto";
+
+export class sendMessageApi<SecurityDataType = unknown> extends HttpClient<SecurityDataType> {
+    /**
+   * No description
+   *
+   * @tags
+   * @name getData
+   * @summary 查询规则
+   * @request POST:
+   * @secure
+   */
+    getData = (data: PageInputSendMessageFilterModel, params: RequestParams = {}) =>
+        this.request<sendMessageFilterModel, any>({
+            path: '/api/app/push/get-push-list',
+            method: 'POST',
+            body: data,
+            secure: true,
+            type: ContentType.Json,
+            format: 'json',
+            ...params
+        })
+
+}
+

+ 50 - 0
admin.ui.plus-master/src/api/admin/AlarmService/sendMessageDto.ts

@@ -0,0 +1,50 @@
+/**
+ *  发送记录列表
+ *  数据对象的Dto
+ * */
+
+/**
+ * 数据信息
+ */
+export interface sendMessageFilterModel {
+    /**推送用户id*/
+    pushUserid?: number,
+    /**推送用户 */
+    pushUser?: number,
+    /**推送内容*/
+    content?: string,
+    /**是否推送 */
+    isPushed?: boolean,
+    /**推送时间 */
+    pushTime?: string,
+    /**报警ID */
+    alarmhistoryID?: number,
+    /**优先级 */
+    taskPriority?: number
+  }
+  
+  /**
+   * 列表查询信息
+   */
+  export interface sendMessageFilterModel_SearchFilter {
+    
+  }
+  
+  
+  /** 分页信息输入 */
+  export interface PageInputSendMessageFilterModel {
+    /**
+     * 当前页标
+     * @format int32
+     */
+    currentPage?: number
+    /**
+     * 每页大小
+     * @format int32
+     */
+    pageSize?: number
+    dynamicFilter?: DynamicFilterInfo
+    filter?: sendMessageFilterModel_SearchFilter
+  }
+  
+  

+ 397 - 0
admin.ui.plus-master/src/views/admin/statement/alarmRules/components/add-alarmRules.vue

@@ -0,0 +1,397 @@
+<!-- 报警规则添加列表 -->
+<template>
+  <div class="layout-pd">
+    <el-dialog v-model="Data.isShowDialog" style="width: 60%;">
+        <!--操作-->
+            <div style="width: 100%;display: flex;justify-content: left;align-items: center;">
+              <h1 style="margin-bottom: 10px;font-size: 30px;">报警推送规则</h1>
+            </div>
+            <div style="margin-bottom: 10px ;">
+              <hr />
+            </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-input v-model="Data.Filter.ruleName" style="width: 100%;" placeholder="请输入" />
+                </el-form-item>
+              </el-form>
+            </div>
+            <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
+              <el-form :inline="true" @submit.stop.prevent>
+                <el-form-item label="角&#8195;&#8195;色:" style="width: 100%;">
+                  <el-select v-model="Data.Filter.roleMappingId" multiple placeholder="请选择角色">
+                    <el-option v-for="item in Data.roleList" :key="item.id" :label="item.name" :value="item.id" />
+                  </el-select>
+                </el-form-item>
+              </el-form>
+            </div>
+            <!-- 能不能通过调节距离的方式进行高度调节??? -->
+            <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
+              <el-form :inline="true" @submit.stop.prevent>
+                <el-form-item style="width: 100%;">
+                </el-form-item>
+              </el-form>
+            </div>
+
+            <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
+              <el-form :inline="true" @submit.stop.prevent>
+                <el-form-item label="备&#8195;&#8195;注:" style="width: 100%;">
+                  <el-input type="textarea" rows="5" v-model="Data.Filter.remark" style="width: 100%;"
+                    placeholder="请输入" />
+                </el-form-item>
+              </el-form>
+            </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-row style="width: 40%;">
+                    微信公众号<el-switch v-model="Data.radioValue1" style="margin-left: 3%;" @change="radioChange" />
+                  </el-row>
+                  <el-row style="width: 40%;">
+                    邮箱<el-switch v-model="Data.radioValue2" style="margin-left: 3%;" @change="radioChange" />
+                  </el-row>
+                </el-form-item>
+              </el-form>
+            </div>
+            <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
+              <el-form :inline="true" @submit.stop.prevent>
+                <el-form-item label="模&#8195;&#8195;板:" style="width: 40%;" prop="mode1">
+                  <el-select v-model="Data.mode1" class="m-2" placeholder="Select" v-if="Data.radioValue1"
+                    @change="modeChange">
+                    <el-option v-for="item in templateData.wxList" :key="item.id" :label="item.templateName"
+                      :value="item.id" />
+                  </el-select>
+                </el-form-item>
+                <el-form-item style="width: 30%;">
+                  <el-select v-model="Data.mode2" class="m-2" placeholder="Select" v-if="Data.radioValue2"
+                    @change="modeChange">
+                    <el-option v-for="item in templateData.emailList" :key="item.id" :label="item.name"
+                      :value="item.id" />
+                  </el-select>
+                </el-form-item>
+              </el-form>
+            </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-input type="textarea" rows="5" v-model="Data.Filter.regular" style="width: 100%;"
+                    placeholder="请输入" />
+                </el-form-item>
+              </el-form>
+            </div>
+            <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
+              <el-form :inline="true" @submit.stop.prevent>
+                <el-form-item label="互&#8195;&#8195;斥:" style="width: 100%;">
+                  <el-switch v-model="Data.Filter.isExclusive" />
+                </el-form-item>
+              </el-form>
+            </div>
+            <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
+              <el-form :inline="true" @submit.stop.prevent>
+                <el-form-item label="优先&#8195;级:" style="width: 100%;">
+                  <el-input-number v-model="Data.Filter.taskPriority" :controls="false" :min=1 :max=9 />
+                </el-form-item>
+              </el-form>
+            </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-radio-group v-model="Data.Filter.triggerMethod">
+                    <el-radio :label="0">其中之一条件满足即触发</el-radio>
+                    <el-radio :label="1">全部满足时触发</el-radio>
+                  </el-radio-group>
+                </el-form-item>
+              </el-form>
+            </div>
+            <div v-for="(index) in Data.num" :key="index"
+              style="width: 100%;display: flex;justify-content: center;align-items: center;">
+              <el-form :inline="true" @submit.stop.prevent>
+                <el-form-item label="条&#8195;&#8195;件:" style="width: 100%;">
+                  <el-select v-model="Data.selectValue1[index]" class="m-2" placeholder="Select" style="width: 20%;">
+                    <el-option v-for="item in Data.condition" :key="item" :label="item" :value="item"
+                      @click="selectChange(Data.selectValue1[index])" />
+                  </el-select>
+                  <!-- 符号 -->
+                  <el-select class="sign" style="width: 7%;" suffix-icon="" v-model="Data.seDefault">
+                    <el-option v-for="(item, index) in Data.selectList" :key="index" :value="item" selectd />
+                  </el-select>
+                  <el-select v-model="Data.selectValue2[index]" class="m-2" placeholder="Select" style="width: 20%;">
+                    <el-option v-for="item in Data.selectCondition" :key="item" :label="item" :value="item" />
+                  </el-select>
+                  <label style="margin-left: 5%;">报警等级</label>
+                  <!-- 符号 -->
+                  <el-select class="sign" style="width: 7%;" suffix-icon="" v-model="Data.seDefault">
+                    <el-option v-for="(item, index) in Data.selectList" :key="index" :value="item" selectd />
+                  </el-select>
+                  <el-select v-model="Data.selectValue3[index]" class="m-2" placeholder="Select" style="width: 20%;">
+                    <el-option v-for="item in Data.alarmLevel" :key="item" :label="item" :value="item" />
+                  </el-select>
+                </el-form-item>
+              </el-form>
+            </div>
+            <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
+              <el-button :icon="CirclePlusFilled" style="font-size: large" @click="add" />
+            </div>
+            <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
+              <el-form :inline="true" @submit.stop.prevent style="width: 60%;">
+                <el-row justify="end" style="margin-top: 30px;">
+                  <el-button type="primary" @click="toSave">保存</el-button>
+                </el-row>
+              </el-form>
+            </div>
+
+    </el-dialog>
+  </div>
+
+</template>
+
+<script setup lang="ts" name="">
+import { onMounted, reactive, ref, watch } from 'vue';
+import { CirclePlusFilled } from '@element-plus/icons-vue'
+import { alarmRluesFilterModel } from "/@/api/admin/AlarmService/alarmRulesDto";
+import { alarmRulesApi } from "/@/api/admin/AlarmService/alarmRulesApi";
+import { RoleApi } from '/@/api/admin/Role'
+import { pushTemplateApi } from "/@/api/admin/AlarmService/pushTemplateApi";
+import { TemplateFilterDto } from "/@/api/admin/AlarmService/pushTemplateDto";
+
+
+const Data = reactive({
+  isShowDialog: false,
+  Filter: {
+    /**规则名称*/
+    ruleName: '',
+    /**角色 */
+    roleMappingId: [],
+    /**备注*/
+    remark: '',
+    /**推送方式 */
+    pushMethod: '',
+    /**模板 */
+    pushTemplateMappingID: [],
+    /**正则表达式 */
+    regular: '',
+    /**是否互斥 */
+    isExclusive: false,
+    /**优先级 */
+    taskPriority: 1,
+    /**触发方式 */
+    triggerMethod: '',
+    /**规则条件 */
+    conditionsJson: '' as any,
+    pushUserid: []
+  } as alarmRluesFilterModel,
+  selectList: [">", "<", "="],
+  /** 角色列表 */
+  roleList: [] as any,
+  /** 推送方式绑定数据 */
+  radioValue1: false,
+  radioValue2: false,
+  num: 0,
+  seDefault: '=',
+  /** 条件列表 */
+  selectValue1: [],
+  selectValue2: [],
+  selectValue3: [],
+  /** 模板绑定数据 */
+  mode1: '',
+  mode2: '',
+  /** 条件选择 */
+  selectCondition: [] as Array<string>,
+  condition: ['报警设备', '报警类型', '报警来源'],
+  alarmEquipment: ['加油枪', '编码器', '加密显示屏', '监控微处理器'],
+  alarmType: ['绑定错误'],
+  alarmSource: ['云平台', '安全监督装置'],
+  alarmLevel: [1, 2],
+
+})
+
+const templateData = reactive({
+  Filter: {
+    currentPage: 0,
+    pageSize: 0,
+    filter: {
+      templateName: "",
+      templateType: "",
+      templateContent: "",
+      id: 0
+    }
+  } as TemplateFilterDto,
+  wxList: [] as any,
+  emailList: [] as any
+})
+
+// 数量增加 - 实现dom节点的增加
+const add = (() => {
+  Data.num += 1
+
+})
+
+const radioChange = (() => {
+  if (Data.radioValue1 == true) {
+    Data.Filter.pushMethod = 'wx'
+    if (Data.radioValue2 == true) {
+      Data.Filter.pushMethod += ',email'
+    }
+  } else {
+    if (Data.radioValue2 == true) {
+      Data.Filter.pushMethod = 'email'
+    }
+  }
+})
+
+const selectChange = ((key: any) => {
+  if (key == '报警设备') {
+    Data.selectCondition = Data.alarmEquipment
+  } else if (key == '报警类型') {
+    Data.selectCondition = Data.alarmType
+  } else if (key == '报警来源') {
+    Data.selectCondition = Data.alarmSource
+  }
+})
+
+// 获取角色列表
+const getRole = async () => {
+  const res = await new RoleApi().getList()
+  Data.roleList = res.data?.map(item => {
+    return { 'id': item.id, 'name': item.name }
+  })
+}
+
+// 查询模板信息
+const funSelect = async () => {
+  const res = await new pushTemplateApi().getData(templateData.Filter)
+  const data = res?.data
+  templateData.wxList = (data as any)?.filter((item: any) => {
+    if (item.templateType == "wx") {
+      return { 'id': item.id, 'name': item.templateName }
+    }
+  })
+  templateData.emailList = (data as any)?.filter((item: any) => {
+    if (item.templateType == "email") {
+      return { 'id': item.id, 'name': item.templateName }
+    }
+  })
+}
+
+// 获取模板元素id
+const modeChange = (() => {
+  Data.Filter.pushTemplateMappingID = []
+  if (Data.Filter.pushTemplateMappingID.includes(Number(Data.mode1)) == false && Data.mode1 != '') {
+    Data.Filter.pushTemplateMappingID?.push(Number(Data.mode1))
+  }
+  if (Data.Filter.pushTemplateMappingID.includes(Number(Data.mode2)) == false && Data.mode2 != '') {
+    Data.Filter.pushTemplateMappingID?.push(Number(Data.mode2))
+  }
+})
+
+// 钩子函数 -- 挂载后
+onMounted(() => {
+  getRole()
+  funSelect()
+})
+
+// 条件数据,事件监听 -- num改变,json数据添加
+watch([() => [...Data.selectValue1], () => [...Data.selectValue2], () => [...Data.selectValue3]], (newVal) => {
+  const second = {} as any
+  for (var i = 1; i < Data.num + 1; i++) {
+    const first = [Data.selectValue1[i], Data.selectValue2[i], Data.selectValue3[i]]
+    second[i] = first
+  }
+  Data.Filter.conditionsJson = JSON.stringify(second)
+})
+
+
+
+// 保存提交内容
+const toSave = async () => {
+  const res = await new alarmRulesApi().addForm(Data.Filter)
+  console.log(Data.Filter)
+  console.log(res)
+  reset()
+}
+
+// 重置
+const reset = (() => {
+  /**规则名称*/
+  Data.Filter.ruleName = '',
+    /**角色 */
+    Data.Filter.roleMappingId = [],
+    /**备注*/
+    Data.Filter.remark = '',
+    /**推送方式 */
+    Data.Filter.pushMethod = '',
+    Data.radioValue1 = false,
+    Data.radioValue2 = false,
+    /**模板 */
+    Data.Filter.pushTemplateMappingID = [],
+    Data.mode1 = '',
+    Data.mode2 = '',
+    /**正则表达式 */
+    Data.Filter.regular = '',
+    /**是否互斥 */
+    Data.Filter.isExclusive = false,
+    /**优先级 */
+    Data.Filter.taskPriority = 1,
+    /**触发方式 */
+    Data.Filter.triggerMethod = '',
+    /**规则条件 */
+    Data.Filter.conditionsJson = '',
+    Data.num = 0
+})
+
+/**
+ * 根据参数 打开表单
+ * @param val
+ */
+const openDialog = () => {
+  Data.isShowDialog = true
+}
+
+defineExpose({
+  openDialog,
+})
+
+
+</script>
+
+<style scoped lang="scss">
+.my-el-link {
+  font-size: 12px;
+}
+
+.el-form {
+  width: 60%;
+}
+
+.el-form .el-col.mb20 {
+  margin: 0 !important;
+}
+
+/* 输入框标签固定四个字符宽度 */
+::v-deep .el-form-item__label {
+    // 字体大小14,4个字符,12px右间距
+    width: 100px;
+    justify-content: start;
+}
+
+.el-input {
+  width: 240px;
+}
+
+.el-select .el-input {
+  width: 500px;
+}
+
+.sign {
+  border: 0;
+}
+
+:deep(.sign .el-input__wrapper) {
+  // 去除选择框边框
+  box-shadow: none !important;
+}
+
+.el-select-dropdown__item {
+  text-align: center;
+}
+</style>

+ 153 - 337
admin.ui.plus-master/src/views/admin/statement/alarmRules/index.vue

@@ -1,378 +1,194 @@
+<!-- 规则列表 -- 表格 -->
 <template>
 <template>
   <div class="layout-pd">
   <div class="layout-pd">
     <el-row>
     <el-row>
       <!--操作-->
       <!--操作-->
       <el-col :xs="24">
       <el-col :xs="24">
-        <el-card class="mt8" shadow="never" :body-style="{ paddingBottom: '0' }" style="padding-bottom: 20px;">
-          <div style="width: 100%;display: flex;justify-content: left;align-items: center;">
-            <h1 style="margin-bottom: 10px;font-size: 30px;">报警推送规则</h1>
-          </div>
-          <div style="margin-bottom: 10px ;">
-            <hr />
-          </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-input v-model="Data.Filter.ruleName" style="width: 100%;" placeholder="请输入" />
-              </el-form-item>
-            </el-form>
-          </div>
-          <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
-            <el-form :inline="true" @submit.stop.prevent>
-              <el-form-item label="角&#8195;&#8195;色:" style="width: 100%;">
-                <el-select v-model="Data.Filter.roleMappingId" multiple placeholder="请选择角色">
-                  <el-option v-for="item in Data.roleList" :key="item.id" :label="item.name" :value="item.id" />
-                </el-select>
-              </el-form-item>
-            </el-form>
-          </div>
-          <!-- 能不能通过调节距离的方式进行高度调节??? -->
-          <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
-            <el-form :inline="true" @submit.stop.prevent>
-              <el-form-item style="width: 100%;">
-              </el-form-item>
-            </el-form>
-          </div>
-
-          <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
-            <el-form :inline="true" @submit.stop.prevent>
-              <el-form-item label="备&#8195;&#8195;注:" style="width: 100%;">
-                <el-input type="textarea" rows="5" v-model="Data.Filter.remark" style="width: 100%;"
-                  placeholder="请输入" />
-              </el-form-item>
-            </el-form>
-          </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-row style="width: 40%;">
-                  微信公众号<el-switch v-model="Data.radioValue1" style="margin-left: 3%;" @change="radioChange" />
-                </el-row>
-                <el-row style="width: 40%;">
-                  邮箱<el-switch v-model="Data.radioValue2" style="margin-left: 3%;" @change="radioChange" />
-                </el-row>
-              </el-form-item>
-            </el-form>
-          </div>
-          <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
-            <el-form :inline="true" @submit.stop.prevent>
-              <el-form-item label="模&#8195;&#8195;板:" style="width: 40%;" prop="mode1">
-                <el-select v-model="Data.mode1" class="m-2" placeholder="Select" v-if="Data.radioValue1"
-                  @change="modeChange">
-                  <el-option v-for="item in templateData.wxList" :key="item.id" :label="item.templateName"
-                    :value="item.id" />
-                </el-select>
-              </el-form-item>
-              <el-form-item style="width: 30%;">
-                <el-select v-model="Data.mode2" class="m-2" placeholder="Select" v-if="Data.radioValue2"
-                  @change="modeChange">
-                  <el-option v-for="item in templateData.emailList" :key="item.id" :label="item.name"
-                    :value="item.id" />
-                </el-select>
-              </el-form-item>
-            </el-form>
-          </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-input type="textarea" rows="5" v-model="Data.Filter.regular" style="width: 100%;"
-                  placeholder="请输入" />
-              </el-form-item>
-            </el-form>
-          </div>
-          <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
-            <el-form :inline="true" @submit.stop.prevent>
-              <el-form-item label="互&#8195;&#8195;斥:" style="width: 100%;">
-                <el-switch v-model="Data.Filter.isExclusive" />
-              </el-form-item>
-            </el-form>
-          </div>
-          <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
-            <el-form :inline="true" @submit.stop.prevent>
-              <el-form-item label="优先&#8195;级:" style="width: 100%;">
-                <el-input-number v-model="Data.Filter.taskPriority" :controls="false" :min=1 :max=9 />
-              </el-form-item>
-            </el-form>
-          </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-radio-group v-model="Data.Filter.triggerMethod">
-                  <el-radio :label="0">其中之一条件满足即触</el-radio>
-                  <el-radio :label="1">全部满足时触</el-radio>
-                </el-radio-group>
-              </el-form-item>
-            </el-form>
-          </div>
-          <div v-for="(index) in Data.num" :key="index"
-            style="width: 100%;display: flex;justify-content: center;align-items: center;">
-            <el-form :inline="true" @submit.stop.prevent>
-              <el-form-item label="条&#8195;&#8195;件:" style="width: 100%;">
-                <el-select v-model="Data.selectValue1[index]" class="m-2" placeholder="Select" style="width: 20%;">
-                  <el-option v-for="item in Data.condition" :key="item" :label="item" :value="item"
-                    @click="selectChange(Data.selectValue1[index])" />
-                </el-select>
-                <!-- 符号 -->
-                <el-select class="sign" style="width: 7%;" suffix-icon="" v-model="Data.seDefault">
-                  <el-option v-for="(item, index) in Data.selectList" :key="index" :value="item" selectd />
-                </el-select>
-                <el-select v-model="Data.selectValue2[index]" class="m-2" placeholder="Select" style="width: 20%;">
-                  <el-option v-for="item in Data.selectCondition" :key="item" :label="item" :value="item" />
-                </el-select>
-                <label style="margin-left: 5%;">报警等级</label>
-                <!-- 符号 -->
-                <el-select class="sign" style="width: 7%;" suffix-icon="" v-model="Data.seDefault">
-                  <el-option v-for="(item, index) in Data.selectList" :key="index" :value="item" selectd />
-                </el-select>
-                <el-select v-model="Data.selectValue3[index]" class="m-2" placeholder="Select" style="width: 20%;">
-                  <el-option v-for="item in Data.alarmLevel" :key="item" :label="item" :value="item" />
-                </el-select>
-              </el-form-item>
-            </el-form>
-          </div>
-          <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
-            <el-button :icon="CirclePlusFilled" style="font-size: large" @click="add" />
-          </div>
-          <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
-            <el-form :inline="true" @submit.stop.prevent style="width: 60%;">
-              <el-row justify="end" style="margin-top: 30px;">
-                <el-button type="primary" @click="toSave">保存</el-button>
-              </el-row>
-            </el-form>
+        <el-card class="mt8" shadow="hover">
+          <el-form :model="Data.Filter"  @submit.stop.prevent>
+            <el-form-item prop="name" style="width: 100%" >
+              <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="4" class="mb20">
+                <el-form-item label="规则名称">
+                  <el-input v-model="Data.time1" placeholder="请输入规则名称" clearable></el-input>
+                </el-form-item>
+              </el-col>
+            </el-form-item>
+          </el-form> 
+
+          <hr>
+
+          <!-- 按钮 -->
+          <el-row justify="space-between" class="submit-button">
+            <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-row>
+            <el-row>
+              <el-button type="primary" icon="ele-RefreshRight" @click="addAlarmRules"> 添加 </el-button>
+            </el-row>
+          </el-row>
+        </el-card>
+      </el-col>
+      <!--表格-->
+      <el-col :xs="24">
+        <el-card style="height: 70vh" class="my-fill mt8" shadow="hover">
+          <el-table ref="multipleTableRef" v-loading="Data.loading" stripe :data="Data.tableModel" row-key="id"
+            style="width: 100%">
+            <el-table-column v-for="column in Data.dynamicColumns" :key="column.prop" :prop="column.prop"
+              :label="column.label" />
+          </el-table>
+          <div class="my-flex my-flex-end" style="margin-top: 20px">
+            <el-pagination v-model:currentPage="Data.pageInput.currentPage" v-model:page-size="Data.pageInput.pageSize"
+              :total="Data.total" :page-sizes="[5, 10, 20, 50, 100]" small background @size-change="onSizeChange"
+              @current-change="onCurrentChange" layout="total, sizes, prev, pager, next, jumper" />
           </div>
           </div>
         </el-card>
         </el-card>
       </el-col>
       </el-col>
     </el-row>
     </el-row>
+    <EditDialog ref="editDialogRef" />
+
   </div>
   </div>
 
 
 </template>
 </template>
 
 
-<script setup lang="ts" name="">
-import { onMounted, reactive, ref, watch } from 'vue';
-import { CirclePlusFilled } from '@element-plus/icons-vue'
-import { alarmRluesFilterModel } from "/@/api/admin/AlarmService/alarmRulesDto";
+<script setup lang="ts" name="partsManagement/oilGun">
+import { defineAsyncComponent, onMounted, reactive, ref, watch } from "vue";
+import { alarmRluesFilterModel_SearchFilter,alarmRluesFilterModel,PageInputAlarmRluesFilterModel } from "/@/api/admin/AlarmService/alarmRulesDto";
 import { alarmRulesApi } from "/@/api/admin/AlarmService/alarmRulesApi";
 import { alarmRulesApi } from "/@/api/admin/AlarmService/alarmRulesApi";
-import { RoleApi } from '/@/api/admin/Role'
-import { pushTemplateApi } from "/@/api/admin/AlarmService/pushTemplateApi";
-import { TemplateFilterDto } from "/@/api/admin/AlarmService/pushTemplateDto";
-
 
 
+/**页面对象 */
 const Data = reactive({
 const Data = reactive({
+  time1: '',
+  /** 选择框列表 */
+  statusList: [] as any,
+  supplierList: [] as any,
+  /**加载显示 */
+  loading: false,
+  /**条件查询模块 */
   Filter: {
   Filter: {
-    /**规则名称*/
-    ruleName: '',
-    /**角色 */
-    roleMappingId: [],
-    /**备注*/
-    remark: '',
-    /**推送方式 */
-    pushMethod: '',
-    /**模板 */
-    pushTemplateMappingID: [],
-    /**正则表达式 */
-    regular: '',
-    /**是否互斥 */
-    isExclusive: false,
-    /**优先级 */
-    taskPriority: 1,
-    /**触发方式 */
-    triggerMethod: '',
-    /**规则条件 */
-    conditionsJson: '' as any,
-    pushUserid: []
-  } as alarmRluesFilterModel,
-  selectList: [">", "<", "="],
-  /** 角色列表 */
-  roleList: [] as any,
-  /** 推送方式绑定数据 */
-  radioValue1: false,
-  radioValue2: false,
-  num: 0,
-  seDefault: '=',
-  /** 条件列表 */
-  selectValue1: [],
-  selectValue2: [],
-  selectValue3: [],
-  /** 模板绑定数据 */
-  mode1: '',
-  mode2: '',
-  /** 条件选择 */
-  selectCondition: [] as Array<string>,
-  condition: ['报警设备', '报警类型', '报警来源'],
-  alarmEquipment: ['加油枪', '编码器', '加密显示屏', '监控微处理器'],
-  alarmType: ['绑定错误'],
-  alarmSource: ['云平台', '安全监督装置'],
-  alarmLevel: [1, 2],
-
+    /** 规则名称 */
+    ruleName: ""
+  } as alarmRluesFilterModel_SearchFilter,
+  /**表格信息 */
+  tableModel: [] as alarmRluesFilterModel,
+  /**动态表头 */
+  dynamicColumns: [
+    { prop: 'ruleName', label: '规则名称' },
+    { prop: 'companyName', label: '角色' },
+    { prop: 'pushMethod', label: '推送方式' },
+    { prop: 'triggerMethod', label: '触发方式' },
+    { prop: 'regular', label: '正则匹配' },
+    { prop: 'taskPriority', label: '优先级' },
+    { prop: 'isExclusive', label: '是否互斥' },
+    { prop: 'stationName', label: '推送方式' },
+    { prop: 'pushTemplateMappingID', label: '模板' },
+    { prop: 'remark', label: '备注' },
+
+  ],
+  /**分页总数 */
+  total: 0,
+  /**分页标识 */
+  pageInput: {
+    currentPage: 1,
+    pageSize: 10,
+  } as PageInputAlarmRluesFilterModel,
 })
 })
 
 
-const templateData = reactive({
-  Filter: {
-    currentPage: 0,
-    pageSize: 0,
-    filter: {
-      templateName: "",
-      templateType: "",
-      templateContent: "",
-      id: 0
-    }
-  } as TemplateFilterDto,
-  wxList: [] as any,
-  emailList: [] as any
-})
-
-// 数量增加 - 实现dom节点的增加
-const add = (() => {
-  Data.num += 1
+/**引入组件*/
+const EditDialog = defineAsyncComponent(() => import('./components/add-alarmRules.vue'))
+const editDialogRef = ref()
 
 
+onMounted(() => {
+  init()
 })
 })
 
 
-const radioChange = (() => {
-  if (Data.radioValue1 == true) {
-    Data.Filter.pushMethod = 'wx'
-    if (Data.radioValue2 == true) {
-      Data.Filter.pushMethod += ',email'
-    }
-  } else {
-    if (Data.radioValue2 == true) {
-      Data.Filter.pushMethod = 'email'
-    }
+// // 条件查询
+const init = async () => {
+  Data.loading = true
+  const res: any = await new alarmRulesApi().getData({ ...Data.pageInput, filter: Data.Filter })
+  console.log(res)
+  Data.tableModel = res?.data ?? []
+  // Data.total = res?.data?.length ?? 0   // 接口中没有总的数据量
+  Data.loading = false
+  pushMethodChange()
+}
+
+  const onQuery = () => {
+    init()
+    console.log("查询")
   }
   }
-})
 
 
-const selectChange = ((key: any) => {
-  if (key == '报警设备') {
-    Data.selectCondition = Data.alarmEquipment
-  } else if (key == '报警类型') {
-    Data.selectCondition = Data.alarmType
-  } else if (key == '报警来源') {
-    Data.selectCondition = Data.alarmSource
+  /**重置查询条件 */
+  const resetQuery = () => {
+    Data.Filter.ruleName = ''
   }
   }
+  /**重置 */
+  const onReset = () => {
+    resetQuery()
+    init()
+  }
+
+/** 
+ * 添加规则
+*/
+const addAlarmRules = (() => {
+  editDialogRef.value.openDialog()
+  init()
 })
 })
 
 
-// 获取角色列表
-const getRole = async () => {
-  const res = await new RoleApi().getList()
-  Data.roleList = res.data?.map(item => {
-    return { 'id': item.id, 'name': item.name }
-  })
+/**
+* 页条变化
+* @param val
+*/
+const onSizeChange = (val: number) => {
+  Data.pageInput.pageSize = val
+  init()
 }
 }
 
 
-// 查询模板信息
-const funSelect = async () => {
-  const res = await new pushTemplateApi().getData(templateData.Filter)
-  const data = res?.data
-  templateData.wxList = (data as any)?.filter((item: any) => {
-    if (item.templateType == "wx") {
-      return { 'id': item.id, 'name': item.templateName }
-    }
-  })
-  templateData.emailList = (data as any)?.filter((item: any) => {
-    if (item.templateType == "email") {
-      return { 'id': item.id, 'name': item.templateName }
-    }
-  })
+/**
+ * 页数 变化
+ * @param val
+ */
+const onCurrentChange = (val: number) => {
+  Data.pageInput.currentPage = val
+  init()
 }
 }
 
 
-// 获取模板元素id
-const modeChange = (() => {
-  Data.Filter.pushTemplateMappingID = []
-  if (Data.Filter.pushTemplateMappingID.includes(Number(Data.mode1)) == false && Data.mode1 != '') {
-    Data.Filter.pushTemplateMappingID?.push(Number(Data.mode1))
-  }
-  if (Data.Filter.pushTemplateMappingID.includes(Number(Data.mode2)) == false && Data.mode2 != '') {
-    Data.Filter.pushTemplateMappingID?.push(Number(Data.mode2))
-  }
-})
+/** 数据转换 */
+const pushMethodChange = (() => {
+  // 推送方式
+  Data.tableModel.forEach((item) => {
+    const pushList = item['pushMethod'].split(',')
+    for (var i = 0; i < pushList.length; i++) {
+      if (pushList[i] == 'wx') {
+        pushList[i] = "微信"
+      } else if (pushList[i] == 'email') {
+        pushList[i] = "电子邮箱"
+      }
+    }
+    item['pushMethod'] = pushList.toString()
 
 
-// 钩子函数 -- 挂载后
-onMounted(() => {
-  getRole()
-  funSelect()
-})
+    // 是否互斥
+    if (item['isExclusive'] == true) {
+      item['isExclusive'] = "是"
+    } else {
+      item['isExclusive'] = "否"
+    }
 
 
-// 条件数据,事件监听 -- num改变,json数据添加
-watch([() => [...Data.selectValue1], () => [...Data.selectValue2], () => [...Data.selectValue3]], (newVal) => {
-  const second = {} as any
-  for (var i = 1; i < Data.num + 1; i++) {
-    const first = [Data.selectValue1[i], Data.selectValue2[i], Data.selectValue3[i]]
-    second[i] = first
-  }
-  Data.Filter.conditionsJson = JSON.stringify(second)
+    // 触发方式
+    if(item['triggerMethod'] == '0'){
+      item['triggerMethod'] = '其中之一条件满足即触发'
+    }else if(item['triggerMethod'] == '1'){
+      item['triggerMethod'] = '全部满足时触发'
+    }
+  })
 })
 })
 
 
 
 
 
 
-// 保存提交内容
-const toSave = async () => {
-  const res = await new alarmRulesApi().addForm(Data.Filter)
-  console.log(Data.Filter)
-  console.log(res)
-  reset()
-}
-
-// 重置
-const reset = (() => {
-  /**规则名称*/
-  Data.Filter.ruleName = '',
-    /**角色 */
-    Data.Filter.roleMappingId = [],
-    /**备注*/
-    Data.Filter.remark = '',
-    /**推送方式 */
-    Data.Filter.pushMethod = '',
-    Data.radioValue1 = false,
-    Data.radioValue2 = false,
-    /**模板 */
-    Data.Filter.pushTemplateMappingID = [],
-    Data.mode1 = '',
-    Data.mode2 = '',
-    /**正则表达式 */
-    Data.Filter.regular = '',
-    /**是否互斥 */
-    Data.Filter.isExclusive = false,
-    /**优先级 */
-    Data.Filter.taskPriority = 1,
-    /**触发方式 */
-    Data.Filter.triggerMethod = '',
-    /**规则条件 */
-    Data.Filter.conditionsJson = '',
-    Data.num = 0
-})
 
 
 </script>
 </script>
 
 
 <style scoped lang="scss">
 <style scoped lang="scss">
-.my-el-link {
-  font-size: 12px;
-}
-
-.el-form {
-  width: 60%;
-}
-
-.el-form .el-col.mb20 {
-  margin: 0 !important;
-}
-
-.el-input {
-  width: 240px;
-}
-
-.el-select .el-input {
-  width: 500px;
-}
-
-.sign {
-  border: 0;
-}
-
-:deep(.sign .el-input__wrapper) {
-  // 去除选择框边框
-  box-shadow: none !important;
-}
-
-.el-select-dropdown__item {
-  text-align: center;
-}
-</style>
+@import '/@/theme/tableStyle.scss';
+</style>

+ 27 - 8
admin.ui.plus-master/src/views/admin/statement/sendMessage/index.vue

@@ -40,6 +40,9 @@
   <script setup lang="ts" name="partsManagement/oilGun">
   <script setup lang="ts" name="partsManagement/oilGun">
   import {onMounted, reactive, watch} from "vue";
   import {onMounted, reactive, watch} from "vue";
 
 
+  import { sendMessageApi } from "/@/api/admin/AlarmService/sendMessageApi";
+import { Filter } from "@element-plus/icons";
+
   
   
   /**页面对象 */
   /**页面对象 */
   const Data = reactive({
   const Data = reactive({
@@ -49,19 +52,21 @@
     /**加载显示 */
     /**加载显示 */
     loading: false,
     loading: false,
     /**条件查询模块 */
     /**条件查询模块 */
+    Filter:{
+
+    },
     
     
     /**表格信息 */
     /**表格信息 */
     tableModel: [],
     tableModel: [],
     /**动态表头 */
     /**动态表头 */
     dynamicColumns: [
     dynamicColumns: [
-      { prop: '', label: '发送ID' },
-      { prop: '', label: '渠道' },
-      { prop: '', label: '手机号' },
-      { prop: '', label: '微信id' },
-      { prop: '', label: '发送时间' },
-      { prop: '', label: '发送内容' },
-      { prop: '', label: '规则id' },
-      { prop: '', label: '备注' },
+      { prop: 'pushUserid', label: '推送用户id' },
+      { prop: 'pushUser', label: '推送用户' },
+      { prop: 'content', label: '推送内容' },
+      { prop: 'isPushed', label: '是否推送' },
+      { prop: 'pushTime', label: '推送时间' },
+      { prop: 'alarmhistoryID', label: '报警id' },
+      { prop: 'taskPriority', label: '优先级' },
     ],
     ],
     /**分页总数 */
     /**分页总数 */
     total: 0,
     total: 0,
@@ -73,6 +78,20 @@
     })
     })
 
 
 
 
+    onMounted(() => {
+  init()
+})
+
+// 条件查询
+const init = async () => {
+  // Data.loading = true
+  const res: any = await new sendMessageApi().getData({ ...Data.pageInput, filter: Data.Filter })
+  console.log(res)
+  // Data.tableModel = res?.data ?? []
+  // Data.total = res?.data?.length ?? 0
+  // Data.loading = false
+}
+
 
 
   /**
   /**
  * 页条变化
  * 页条变化