Просмотр исходного кода

新增 告警处置 和告警详情弹框, 告警规则页面新增 盗情规则配置

zhulu 1 год назад
Родитель
Сommit
6f59ee7a7c

+ 16 - 0
src/api/iot/alarmRule.js

@@ -82,4 +82,20 @@ export function alarmList(query) {
   });
 }
 
+// 查询详情
+export function detail(id) {
+  return request({
+    url: `/iot/iot_alarm_data/detail/${id}`,
+    method: "get",
+  });
+}
+// 处置告警
+export function dealAlarm(data) {
+  return request({
+    url: `/iot/iot_alarm_data/`,
+    method: "put",
+    data:data,
+  });
+}
+
 

+ 3 - 3
src/views/system/dept/extend.vue

@@ -214,7 +214,7 @@
           </el-descriptions>
 
           <el-descriptions v-if="type === org_type.yewd"  class="margin-top" :column="3" size="medium" border>
-            <el-descriptions-item label="穿墙式设备" v-if="this.selfServiceBank==1" labelClassName="info_label_required" :contentStyle='contentStyle' :labelStyle='labelStyle'>
+            <el-descriptions-item label="穿墙式设备" labelClassName="info_label_required" :contentStyle='contentStyle' :labelStyle='labelStyle'>
               <el-input-number
                 v-model="wallPenetratingEquipment"
                 controls-position="right"
@@ -223,7 +223,7 @@
                 :max="999"
               ></el-input-number>
             </el-descriptions-item>
-            <el-descriptions-item label="大堂式设备"  v-if="this.selfServiceBank==1"
+            <el-descriptions-item label="大堂式设备" 
                                   labelClassName="info_label_required" :contentStyle='contentStyle' :labelStyle='labelStyle'>
               <el-input-number
                 v-model="lobbyEquipment"
@@ -1585,7 +1585,7 @@ export default {
         this.$modal.msgError("业务库类型不能为空,请选择业务库类型");
         return false;
       }
-      if ((this.type === this.org_type.jkzx || this.type === this.org_type.yewd|| this.type === this.org_type.lhzz || this.type === this.org_type.zxywk)&&this.businessLibrary===1&&this.remoteControl==null) {
+      if ((this.type === this.org_type.jkzx)&&this.businessLibrary===1&&this.remoteControl==null) {
         this.$modal.msgError("出入口远程控制与授权不能为空,请选择出入口远程控制与授权");
         return false;
       }

+ 174 - 0
src/views/warn/dialog.dealAlarm.vue

@@ -0,0 +1,174 @@
+<template>
+  <div class="rule-type">
+    <DialogCom
+      title="告警处置"
+      :visible.sync="isShow"
+      @close="onHide"
+      width="800px"
+    >
+      <div class="page-body">
+        <el-descriptions class="margin-top" :column="2" size="medium" border :label-style="labelStyle" :contentStyle="content_style">
+        <el-descriptions-item labelClassName="gx_info_label" label="机构名称">
+          {{alarmData.orgName}}
+        </el-descriptions-item>
+        <el-descriptions-item labelClassName="gx_info_label" label="告警分类" >
+          {{dataTypeText()}}
+        </el-descriptions-item>
+        <el-descriptions-item labelClassName="gx_info_label" label="告警类型" >
+          {{alarmData.sourceTypeDes}}
+        </el-descriptions-item>
+        <el-descriptions-item labelClassName="gx_info_label" label="告警开始时间" >
+          {{alarmData.time}}
+        </el-descriptions-item>          
+        <el-descriptions-item labelClassName="gx_info_label" label="告警结束时间" >
+          {{alarmData.endTime}}
+        </el-descriptions-item>
+        <el-descriptions-item labelClassName="gx_info_label" label="告警值" >
+          {{valueText()}}
+        </el-descriptions-item>
+        <el-descriptions-item labelClassName="gx_info_label" label="告警内容" >
+          {{alarmData.content}}
+        </el-descriptions-item>
+      </el-descriptions>
+        <el-form
+          :model="formData"
+          :rules="formDataRules"
+          size="small"
+          ref="form"
+          label-position="right"
+          label-width="150px"
+          label-prefix=":"
+        >
+          <!-- <el-form-item label="所属机构" prop="orgId">         
+            {{formData.orgName}} 
+          </el-form-item> -->
+          <el-form-item label="处置类型" prop="doType">
+            <el-select
+              label="处置类型"
+              v-model="formData.doType"
+              placeholder="请选择告警处置类型"
+              clearable
+              style="width: 100%;"
+            >
+            <el-option
+                    v-for="dict in dict.type.alarm_deal_type"
+                    :key="dict.value"
+                    :label="dict.label"
+                    :value="parseInt(dict.value)"
+                  ></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item prop="doContent" label="处置内容:">
+            <el-input
+              v-model="formData.doContent"
+              :maxlength="50"
+              name="doContent"
+              placeholder="请输入处置内容"
+              clearable
+            />
+          </el-form-item>
+        </el-form>
+      </div>
+
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="onSubmit">确定</el-button>
+        <el-button @click="isShow = false">取消</el-button>
+      </div>
+    </DialogCom>
+  </div>
+</template>
+
+<script>
+import { mapState, mapMutations, mapGetters } from "vuex";
+import {detail,dealAlarm} from "@/api/iot/alarmRule";
+import { listIdName } from "@/api/system/device";
+export default {
+  dicts: ["alarm_deal_type"],
+  data() {
+    return {
+      id: null,
+      isShow: false,
+      alarmData:null,
+      formData: this.reset(),
+      formDataRules: {
+        doType: [{ required: true, message: "请选择处置类型" }],
+        doContent: [{ required: true, message: "请输入处置内容" }],
+      },
+    };
+  },
+  props: {},
+  watch: {
+    // "formData.orgId":{
+    //   handler(v){
+    //     console.info("formData.orgId",v)
+    //   }
+    // }
+  },
+  computed: {
+    ...mapGetters(["orgId"]),
+  },
+  methods: {
+    ...mapMutations([]),
+    reset() {
+      return {
+        id: null,
+        doType:null,
+        doContent:null,
+      };
+    },
+    async refresh(id, other) {
+      this.alarmData = id ? (await detail(id)).data : this.reset(other);
+      this.formData.id=id;
+    },
+    async show(id, other = {}) {
+      this.id = id;
+      await this.refresh(id, other);
+      this.isShow = true;
+    },
+    valueText() {
+        if (!this.alarmData || this.alarmData.valueText == null) {
+          return ''
+        }
+        return `${this.alarmData.valueText}${this.alarmData.alarmValue ? this.alarmData.alarmValue : ''}`
+      },
+    dataTypeText() {
+      if (!this.alarmData || this.alarmData.dataType == null) {
+        return ''
+      }
+
+      if (this.alarmData.dataType == '0') {
+        return '动环类告警'
+      } else if (this.alarmData.dataType == '1') {
+        return '视频类告警'
+      } else {
+        return '未知'
+      }
+    },
+    // 事件
+    onHide() {
+      this.$refs.form.resetFields();
+      this.formData = this.reset();
+    },
+    onSubmit() {
+      this.$refs.form.validate(async (isValidate) => {
+        if (!isValidate) return;
+        await dealAlarm(this.formData);
+        this.$emit("success");
+        this.isShow = false;
+      });
+    },
+  },
+  created() {},
+  mounted() {},
+  components: { },
+};
+</script>
+
+<style lang="scss" scoped>
+.brand_info {
+  .el-form {
+    width: 600px;
+    padding-top: 40px;
+  }
+}
+</style>

+ 134 - 0
src/views/warn/dialog.info.vue

@@ -0,0 +1,134 @@
+<template>
+  <div class="alarm-info">
+    <DialogCom title="告警详情" :visible.sync="isShow" width="1200px" >
+      <div class="page-body">
+        <el-descriptions class="margin-top" :column="2" size="medium" border :label-style="labelStyle" :contentStyle="content_style">
+
+          <el-descriptions-item labelClassName="gx_info_label" label="机构名称">
+            {{formData.orgName}}
+          </el-descriptions-item>
+          <el-descriptions-item labelClassName="gx_info_label" label="告警分类" >
+            {{dataTypeText()}}
+          </el-descriptions-item>
+          <el-descriptions-item labelClassName="gx_info_label" label="告警类型" >
+            {{formData.sourceTypeDes}}
+          </el-descriptions-item>
+          <el-descriptions-item labelClassName="gx_info_label" label="告警开始时间" >
+            {{formData.time}}
+          </el-descriptions-item>          
+          <el-descriptions-item labelClassName="gx_info_label" label="告警结束时间" >
+            {{formData.endTime}}
+          </el-descriptions-item>
+          <el-descriptions-item labelClassName="gx_info_label" label="告警值" >
+            {{valueText()}}
+          </el-descriptions-item>
+          <el-descriptions-item labelClassName="gx_info_label" label="告警内容" >
+            {{formData.content}}
+          </el-descriptions-item>
+          <el-descriptions-item labelClassName="gx_info_label" label="处置时间" >
+            {{formData.doTime}}
+          </el-descriptions-item>
+          <el-descriptions-item labelClassName="gx_info_label" label="处置人" >
+            {{formData.doByUser}}
+          </el-descriptions-item>
+          <el-descriptions-item labelClassName="gx_info_label" label="处置类型" >
+            {{ getLabel(dict.type.alarm_deal_type, formData.doType, "未知")}}
+          </el-descriptions-item>
+          <el-descriptions-item span="2" labelClassName="gx_info_label" label="处置内容" >
+            {{formData.doContent}}
+          </el-descriptions-item>
+        </el-descriptions>
+      </div>
+
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="onHide">关闭</el-button>
+      </div>
+    </DialogCom>
+  </div>
+</template>
+
+<script>
+  import { mapState, mapMutations } from "vuex";  
+  import {detail} from "@/api/iot/alarmRule";
+  import { getLabel } from "@/views/commonOption.js";
+  export default {
+    components: {},   
+    dicts: ["alarm_deal_type"],
+    data() {
+      const params = this.$route.params;
+      return {
+        id: params ? params.id : null,
+        isShow: false,
+        formData: this.reset(),
+        formFileListDefualtValue: [],
+        labelStyle: {
+          'color': '#000',
+          'text-align': 'center',
+          'height': '40px',
+          'min-width': '150px',
+          'word-break': 'keep-all'
+        },
+        content_style: {
+          'text-align': 'left',
+          'min-width': '300px',
+          'word-break': 'break-all'
+        },
+      };
+    },
+    props: {},
+    watch: {},
+    computed: {
+      ...mapState(["loginUser"]),
+    },
+    methods: {
+      ...mapMutations([]),
+      getLabel,
+      reset(other = {}) {
+        return {
+          ...other,
+        };
+      },
+      async refresh(id, other) {
+        if (!id) {
+          this.reset(other);
+        } else {
+          detail(id).then(response => {
+            this.formData = response.data;
+            this.loading = false;
+          })
+        }
+      },
+      async show(id, other = {}) {
+        this.id = id;
+        await this.refresh(id, other);
+        this.isShow = true;
+      },
+      valueText() {
+        if (!this.formData || this.formData.valueText == null) {
+          return ''
+        }
+
+        return `${this.formData.valueText}${this.formData.alarmValue ? this.formData.alarmValue : ''}`
+      },
+      dataTypeText() {
+        if (!this.formData || this.formData.dataType == null) {
+          return ''
+        }
+
+        if (this.formData.dataType == '0') {
+          return '动环类告警'
+        } else if (this.formData.dataType == '1') {
+          return '视频类告警'
+        } else {
+          return '未知'
+        }
+    },
+      // 事件
+      onHide() {
+        this.isShow = false;
+      },
+    },
+    mounted() {
+    },
+  };
+</script>

+ 75 - 45
src/views/warn/index.vue

@@ -62,6 +62,22 @@
                   </el-option>
                 </el-select>
               </el-form-item>
+              <el-form-item label="是否处理" prop="isDoStr">
+                <el-select
+                  v-model="isDoStr"
+                  clearable
+                  prop="isDoStr"
+                  @change="isDoChanged"
+                >
+                  <el-option
+                    v-for="item in dict.type.sys_yes_no"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
+                  >
+                  </el-option>
+                </el-select>
+              </el-form-item>
               <el-form-item label="告警时间" prop="alarmTime">
                 <DataRangePicker
                   type="daterange"
@@ -70,7 +86,6 @@
                   start-placeholder="开始日期"
                   end-placeholder="结束日期"
                   v-model="queryParams.alarmTime"
-                  :picker-options="pickerOptions"
                 >
                 </DataRangePicker>
               </el-form-item>
@@ -82,26 +97,21 @@
                   start-placeholder="开始日期"
                   end-placeholder="结束日期"
                   v-model="queryParams.alarmEndTime"
-                  :picker-options="pickerOptions"
                 >
                 </DataRangePicker>
               </el-form-item>
-<!--              <el-form-item label="是否处理" prop="taskName">
-                <el-select
-                  v-model="queryParams.taskName"
-                  clearable
-                  prop="orgType"
-                  @change="cleanExecOrgList"
+              <el-form-item label="处置时间" prop="alarmDealTime">
+                <DataRangePicker
+                  type="daterange"
+                  value-format="yyyy-MM-dd HH:mm:ss"
+                  :default-time="['00:00:00', '23:59:59']"
+                  start-placeholder="开始日期"
+                  end-placeholder="结束日期"
+                  v-model="queryParams.alarmDealTime"
                 >
-                  <el-option
-                    v-for="item in dict.type.sys_org_type"
-                    :key="item.value"
-                    :label="item.label"
-                    :value="item.value"
-                  >
-                  </el-option>
-                </el-select>
-              </el-form-item>-->
+                </DataRangePicker>
+              </el-form-item>
+            
             </el-form>
 
             <el-row :gutter="10">
@@ -185,55 +195,60 @@
               label="设备名称"
               align="center"
               prop="deviceName"
-              width="150"
+              width="135"
               show-overflow-tooltip="true"
             />
             <el-table-column
               label="告警类型"
               align="center"
               prop="sourceTypeDes"
-              width="160"
+              width="135"
             />
             <el-table-column label="告警时间" align="center" width="180" prop="time">
             </el-table-column>
             <el-table-column label="恢复时间" align="center" width="180" prop="endTime">
             </el-table-column>
-
             <el-table-column
-              label="告警内容"
+              label="处置时间"
               align="center"
-              prop="content"
+              prop="doTime"
+              width="180"
             />
-<!--            <el-table-column
-              label="处理状态"
+            <el-table-column
+              label="告警内容"
               align="center"
-              prop="sykj"
-              width="160"
+              prop="content"
             />
-            <el-table-column
+         
+            <!--<el-table-column
               label="处理结果"
               align="center"
               prop="reslut"
               width="160"
             />-->
-            <!-- <el-table-column
+            <el-table-column
               label="操作"
               fixed="right"
-              style="width: 100px"
               align="center"
-              class-name="small-padding fixed-width"
             >
               <template slot-scope="scope">
                 <el-button
                   size="mini"
                   type="text"
+                  icon="el-icon-edit-outline"
+                  v-if="!scope.row.doTime"
+                  @click="dealAlarm(scope.row)"
+                  v-hasPermi="['core:task:query']"
+                  >处置报警</el-button>
+                  <el-button
+                  size="mini"
+                  type="text"
                   icon="el-icon-view"
-                  @click="lookView(scope.row)"
+                  @click="showDetailInfo(scope.row)"
                   v-hasPermi="['core:task:query']"
-                  >查看</el-button
-                >
+                  >详情</el-button>
               </template>
-            </el-table-column> -->
+            </el-table-column>
           </el-table>
           <pagination
             v-show="total > 0"
@@ -245,22 +260,28 @@
         </div>
       </el-col>
     </el-row>
-  </div>
+    <dialog-info ref="infoDialog"></dialog-info>
+    <dialog-deal-alarm ref="dealAlarmDialog" @success="getList()"></dialog-deal-alarm>
+  </div>  
 </template>
 
 <script>
 import OrgTree from "@/components/orgTree/orgQuerySelector.vue";
 import DataRangePicker from "@/components/dateTime/daterange.picker.vue";
 import dayjs from "dayjs";
+import DialogInfo from "./dialog.info";
+import DialogDealAlarm from "./dialog.dealAlarm.vue";
 import {mapGetters} from "vuex";
 import {alarmList} from "@/api/iot/alarmRule";
 
+
 export default {
-  components: { OrgTree, DataRangePicker },
+  components: { OrgTree,DataRangePicker,DialogInfo,DialogDealAlarm },
   name: "AlarmData",
-  dicts: ["sys_access_cycle"],
+  dicts: ["sys_access_cycle",'sys_yes_no'],
   data() {
     return {
+      isDoStr:null,
       alarmTypes:[
         {
           value: '0',
@@ -371,6 +392,8 @@ export default {
         alarmTime:null,
         alarmEndTime:null,
         planStartTime: null,
+        alarmDealTime:null,
+        isDo:null,
         status: null,
         roleId: null,
         checkSub: true,
@@ -392,7 +415,16 @@ export default {
     ...mapGetters(["orgId", "orgName"]),
   },
   methods: {
-
+    isDoChanged()
+    {
+      if(this.isDoStr)
+      {
+        this.queryParams.isDo=this.isDoStr=='Y'? 1:0;
+      }
+      else{
+        this.queryParams.isDo=null;
+      }
+    },
     /** 查询监控调阅任务列表 */
     getList() {
       alarmList(this.queryParams).then((response) => {
@@ -485,14 +517,12 @@ export default {
       this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
-    /** 新增按钮操作 */
-    handleAdd() {
-      this.reset();
-      this.open = true;
-      this.title = "添加监控调阅任务";
+    /** 处置告警按钮操作 */
+    dealAlarm(row) {
+      this.$refs["dealAlarmDialog"].show(row.id, {});
     },
-    /** 修改按钮操作 */
-    lookView(row) {
+    /** 详情操作 */
+    showDetailInfo(row) {
       this.$refs["infoDialog"].show(row.id, {});
     },