Bläddra i källkod

告警管理完成

fanghuisheng 1 år sedan
förälder
incheckning
f8df51d7e1

+ 38 - 0
src/api/business/fireIot/alarmManage.js

@@ -0,0 +1,38 @@
+import { request } from "@/utils/request";
+
+// 产品信息
+export function dmpProductInfo(param) {
+    return request({
+        url: "/service-iot/dmpProductInfo/page",
+        method: "POST",
+        data: param,
+    });
+}
+
+
+// 告警类型列表
+export function baseAlarmTypeList(param) {
+    return request({
+        url: "/service-iot/baseAlarm/statistic",
+        method: "POST",
+        data: param,
+    });
+}
+
+// 告警列表
+export function baseAlarmList(param) {
+    return request({
+        url: "/service-iot/baseAlarm/page",
+        method: "POST",
+        data: param,
+    });
+}
+
+// 告警列表-修改
+export function baseAlarm(param) {
+    return request({
+        url: "/service-iot/baseAlarm",
+        method: "PUT",
+        data: param,
+    });
+}

+ 21 - 0
src/pages.json

@@ -535,6 +535,27 @@
             "navigationBarTitleText": "设施详情",
             "enablePullDownRefresh": false
           }
+        },
+        {
+          "path": "alarmManage/index",
+          "style": {
+            "navigationBarTitleText": "告警管理",
+            "enablePullDownRefresh": false
+          }
+        },
+        {
+          "path": "alarmManage/alarmDetailsList/index",
+          "style": {
+            "navigationBarTitleText": "",
+            "enablePullDownRefresh": false
+          }
+        },
+        {
+          "path": "alarmManage/alarmDetails/index",
+          "style": {
+            "navigationBarTitleText": "告警处理",
+            "enablePullDownRefresh": false
+          }
         }
       ]
     }

+ 207 - 0
src/pages/business/fireIot/alarmManage/alarmDetails/index.vue

@@ -0,0 +1,207 @@
+<template>
+  <scroll-view class="scroll-height" :scroll-y="true" :data-theme="'theme-' + proxy.$settingStore.themeColor.name">
+    <view class="alarmDetails-container">
+      <view class="flex bg-white padding-15 margin-b-15">
+        <image style="width: 40px; height: 40px; margin: auto 15px auto 0" :src="dataArray.typeImg ? dataArray.typeImg : '/static/images/404.png'" mode="aspectFill"></image>
+
+        <view style="margin: auto auto auto 0">
+          <view style="font-size: 15px"> {{ dataArray.deviceName }} </view>
+        </view>
+
+        <view style="margin: auto 0 auto 0">
+          <view style="font-size: 15px" :style="`color:${dataArray.handleStatus == 1 ? '#16bf00' : 'red'}`">
+            {{ dataArray.handleStatus == 1 ? "已处理" : dataArray.handleStatus == 0 ? "未处理" : "" }}
+          </view>
+        </view>
+      </view>
+
+      <view class="bg-white padding-15 margin-b-15">
+        <uni-section class="block margin-b-10" title="基本信息" type="line"></uni-section>
+
+        <view class="tableType3 padding-0">
+          <u-row v-for="da in dataList" :key="da">
+            <u-col span="4">
+              <view style="text-align: right; padding: 0px 5px 0px 5px">{{ da.title }}</view>
+            </u-col>
+            <u-col span="8">
+              <view style="text-align: left; padding: 0px 5px 0px 5px">{{ da.value }}</view>
+            </u-col>
+          </u-row>
+        </view>
+      </view>
+
+      <view class="bg-white padding-15 margin-b-15">
+        <uni-section class="block margin-b-10" title="处理内容" type="line"></uni-section>
+
+        <view>
+          <u-radio-group v-model="handleRange" placement="row" v-if="dataArray.handleStatus != 1">
+            <u-radio
+              v-for="han in handleRangeList"
+              :key="han"
+              :activeColor="proxy.$settingStore.themeColor.color"
+              :label="han.label"
+              :name="han.value"
+              style="margin: 0 15px 15px 0"
+              :labelSize="13"
+              :iconSize="10"
+            ></u-radio>
+          </u-radio-group>
+
+          <u--textarea v-model="handleContent" placeholder="备注信息,最多可输入50个字" :count="true" maxlength="50" style="margin: 0 0 15px 0" :disabled="dataArray.handleStatus == 1"></u--textarea>
+        </view>
+
+        <view class="flex" v-if="dataArray.handleStatus != 1">
+          <u-button
+            type="primary"
+            text="误报"
+            shape="circle"
+            :customStyle="{
+              width: '80px',
+              height: '30px',
+              marginRight: '15px',
+            }"
+            @click="handleSubmit(1)"
+          ></u-button>
+          <u-button
+            type="primary"
+            text="非误报"
+            shape="circle"
+            :customStyle="{
+              width: '80px',
+              height: '30px',
+              marginLeft: '15px',
+            }"
+            @click="handleSubmit(0)"
+          ></u-button>
+        </view>
+      </view>
+    </view>
+  </scroll-view>
+</template>
+
+<script setup>
+import { onLoad, onShow, onReady, onHide, onLaunch, onNavigationBarButtonTap, onPageScroll } from "@dcloudio/uni-app";
+import { ref, reactive, computed, getCurrentInstance, toRefs, inject } from "vue";
+import { publicStores, useStores } from "@/store/modules/index";
+
+import { baseAlarmList, baseAlarm } from "@/api/business/fireIot/alarmManage.js";
+
+const { proxy } = getCurrentInstance();
+
+const dataArray = ref({});
+const dataList = ref([
+  {
+    title: "设备名称",
+    value: "",
+  },
+  {
+    title: "设备地址",
+    value: "",
+  },
+  {
+    title: "告警等级",
+    value: "",
+  },
+  {
+    title: "告警信息",
+    value: "",
+  },
+  {
+    title: "告警时间",
+    value: "",
+  },
+]);
+
+const deviceName = ref("");
+const alarmTime = ref("");
+const pageSize = ref(20);
+const current = ref(1);
+const total = ref(0);
+
+const handleContent = ref("");
+const handleRange = ref(1);
+const handleRangeList = ref([
+  {
+    label: "单个处理",
+    value: 1,
+  },
+  {
+    label: "批量处理",
+    value: 0,
+  },
+]);
+
+/**
+ * @页面初始化
+ */
+function init() {
+  selectListApi();
+}
+
+/**
+ * @列表查询
+ * @api接口查询
+ */
+function selectListApi() {
+  baseAlarmList({
+    deviceName: deviceName.value,
+    startTime: alarmTime.value,
+    endTime: alarmTime.value,
+    current: current.value,
+    size: pageSize.value,
+  }).then((requset) => {
+    if (requset.status === "SUCCESS") {
+      dataArray.value = requset.data.records[0];
+      dataList.value[0].value = requset.data.records[0].deviceName;
+      dataList.value[1].value = requset.data.records[0].alarmAddress;
+      dataList.value[2].value = requset.data.records[0].alarmGrade + "级";
+      dataList.value[3].value = requset.data.records[0].alarmContent;
+      dataList.value[4].value = requset.data.records[0].alarmTime;
+      total.value = requset.data.total;
+    }
+  });
+}
+
+/**
+ * @提交
+ */
+function handleSubmit(alarmFalse) {
+  baseAlarm({
+    id: dataArray.value.id,
+    deviceId: dataArray.value.deviceId,
+    alarmType: dataArray.value.alarmType,
+    handleContent: handleContent.value,
+    alarmFalse: alarmFalse,
+    handleRange: handleRange.value,
+  }).then((requset) => {
+    if (requset.status === "SUCCESS") {
+      proxy.$tab.redirectTo("/pages/common/success/index");
+    }
+  });
+}
+
+onReady(() => {});
+
+onShow(() => {
+  //调用系统主题颜色
+  proxy.$settingStore.systemThemeColor([1]);
+});
+
+onLoad((options) => {
+  if ("deviceName" in options) {
+    deviceName.value = options.deviceName;
+  }
+
+  if ("alarmTime" in options) {
+    alarmTime.value = options.alarmTime;
+  }
+
+  init();
+});
+</script>
+
+<style lang="scss" scoped>
+:deep(.u-textarea__field) {
+  font-size: 13px;
+}
+</style>

+ 154 - 0
src/pages/business/fireIot/alarmManage/alarmDetailsList/index.vue

@@ -0,0 +1,154 @@
+<template>
+  <u-sticky class="shadow-default" bgColor="#fff" style="top: 0">
+    <u-tabs :list="tabsList" :current="tabsCurrent" @click="tabsClick" lineColor="#333" :activeStyle="{ color: '#333' }" :inactiveStyle="{ color: '#909399' }" :scrollable="false"></u-tabs>
+  </u-sticky>
+
+  <oa-scroll
+    class="scroll-height"
+    :pageSize="pageSize"
+    :total="total"
+    :refresherLoad="true"
+    :refresherEnabled="true"
+    :refresherDefaultStyle="'none'"
+    :refresherThreshold="44"
+    :refresherBackground="'#f5f6f7'"
+    @load="load"
+    @refresh="refresh"
+    :data-theme="'theme-' + proxy.$settingStore.themeColor.name"
+  >
+    <template #default>
+      <view class="alarmDetailsList-container">
+        <view class="menu-list margin-0">
+          <view class="list-cell list-cell-arrow" v-for="(base, index) in dataList" :key="index" @click="handleToDetails(base)">
+            <view class="menu-item-box" style="font-size: 13px; flex-flow: row wrap">
+              <view style="min-width: 80%; margin-bottom: 5px; color: #909399"> {{ base.alarmTime }}</view>
+              <view style="min-width: 20%; margin-bottom: 5px; color: #909399; text-align: right; padding-right: 15px"> {{ base.alarmGrade }}级</view>
+              <view style="min-width: 80%; margin-bottom: 5px; color: #909399">{{ base.deviceName }}</view>
+              <view style="min-width: 20%; margin-bottom: 5px; text-align: right; padding-right: 15px" :style="`color:${base.handleStatus == 1 ? '#16bf00' : 'red'}`">
+                {{ base.handleStatus == 1 ? "已处理" : "未处理" }}
+              </view>
+              <view style="min-width: 50%; padding-right: 15px">{{ base.alarmContent }}</view>
+            </view>
+          </view>
+        </view>
+      </view>
+    </template>
+  </oa-scroll>
+</template>
+
+<script setup>
+import { onLoad, onShow, onReady, onHide, onLaunch, onNavigationBarButtonTap, onPageScroll } from "@dcloudio/uni-app";
+import { ref, reactive, computed, getCurrentInstance, toRefs, inject } from "vue";
+import { publicStores, useStores } from "@/store/modules/index";
+
+import { baseAlarmList } from "@/api/business/fireIot/alarmManage.js";
+
+const { proxy } = getCurrentInstance();
+const publicStore = publicStores();
+
+const tabsList = ref([
+  {
+    name: "全部",
+    value: "",
+  },
+  {
+    name: "已处理",
+    value: 1,
+  },
+  {
+    name: "未处理",
+    value: 0,
+  },
+]);
+const tabsCurrent = ref(0);
+
+const dataList = ref([]);
+const productCode = ref("");
+const productName = ref("");
+const pageSize = ref(20);
+const current = ref(1);
+const total = ref(0);
+
+/**
+ * @页面初始化
+ */
+function init() {
+  selectListApi();
+}
+
+/**
+ * @列表查询
+ * @api接口查询
+ */
+function selectListApi() {
+  baseAlarmList({
+    productCode: productCode.value,
+    handleStatus: tabsList.value[tabsCurrent.value].value,
+    current: current.value,
+    size: pageSize.value,
+  }).then((requset) => {
+    if (requset.status === "SUCCESS") {
+      dataList.value = requset.data.records;
+      total.value = requset.data.total;
+
+      uni.setNavigationBarTitle({
+        title: `${productName.value}(${total.value})`,
+      });
+    }
+  });
+}
+
+/**
+ * @跳转详情事件
+ */
+function handleToDetails(e) {
+  proxy.$tab.navigateTo(`/pages/business/fireIot/alarmManage/alarmDetails/index?deviceName=${e.deviceName}&alarmTime=${e.alarmTime}`);
+}
+
+/**
+ * @scrollView加载数据
+ */
+function load() {
+  pageSize.value += 10;
+  init();
+}
+
+/**
+ * @scrollView刷新数据
+ */
+function refresh() {
+  pageSize.value = 20;
+  total.value = 0;
+  init();
+}
+
+/**
+ * @tabs点击事件
+ */
+function tabsClick(e) {
+  tabsCurrent.value = e.index;
+  init();
+}
+
+onReady(() => {});
+
+onShow(() => {
+  //调用系统主题颜色
+  proxy.$settingStore.systemThemeColor([1]);
+});
+
+onLoad((options) => {
+  if ("productName" in options) {
+    productName.value = options.productName;
+  }
+  if ("productCode" in options) {
+    productCode.value = options.productCode;
+    init();
+  }
+});
+</script>
+
+<style lang="scss" scoped>
+.alarmDetailsList-container {
+}
+</style>

+ 99 - 0
src/pages/business/fireIot/alarmManage/index.vue

@@ -0,0 +1,99 @@
+<template>
+  <oa-scroll
+    class="bg-white scroll-height"
+    :pageSize="pageSize"
+    :total="total"
+    :refresherLoad="true"
+    :refresherLoadTitle="false"
+    :refresherEnabled="true"
+    :refresherDefaultStyle="'none'"
+    :refresherThreshold="44"
+    :refresherBackground="'#f5f6f7'"
+    @load="load"
+    @refresh="refresh"
+    :data-theme="'theme-' + proxy.$settingStore.themeColor.type"
+  >
+    <template #default>
+      <view class="deviceSelect">
+        <u-grid :border="true">
+          <u-grid-item v-for="(base, index) in dataList" :key="index" @click="handleToDetails(base.productCode, base.productName)">
+            <u-badge type="primary" max="9999" :value="base.total" :showZero="true" :absolute="true" :offset="[10, 10, 0, 0]"></u-badge>
+            <image class="margin-b-15" style="width: 40px; height: 40px; margin-top: 35px" :src="base.typeImg" mode="aspectFill"></image>
+            <text class="margin-b-15 grid-text text-ellipsis">{{ base.productName }}</text>
+          </u-grid-item>
+        </u-grid>
+      </view>
+    </template>
+  </oa-scroll>
+</template>
+
+<script setup>
+import { onReady, onLoad, onShow, onNavigationBarButtonTap, onPullDownRefresh, onReachBottom } from "@dcloudio/uni-app";
+import { ref, onMounted, inject, shallowRef, reactive, getCurrentInstance } from "vue";
+import { useStores, publicStores } from "@/store/modules/index";
+
+import { dmpProductInfo, baseAlarmTypeList } from "@/api/business/fireIot/alarmManage.js";
+
+const { proxy } = getCurrentInstance();
+
+const dataList = ref([]);
+const pageSize = ref(20);
+const current = ref(1);
+const total = ref(0);
+
+/**
+ * @页面初始化
+ */
+function init() {
+  baseAlarmTypeList({ productName: "", current: current.value, size: pageSize.value }).then((requset) => {
+    if (requset.status === "SUCCESS") {
+      dmpProductInfo({ current: current.value, size: 200000 }).then((requset1) => {
+        if (requset1.status === "SUCCESS") {
+          requset.data.records.forEach((e) => {
+            requset1.data.records.forEach((el) => {
+              if (e.productCode === el.productCode) {
+                e.typeImg = el.typeImg;
+              }
+
+              if (!e.typeImg) {
+                e.typeImg = "/static/images/404.png";
+              }
+            });
+          });
+
+          dataList.value = requset.data.records;
+          total.value = requset.data.total;
+        }
+      });
+    }
+  });
+}
+
+function handleToDetails(productCode, productName) {
+  proxy.$tab.navigateTo(`/pages/business/fireIot/alarmManage/alarmDetailsList/index?productCode=${productCode}&productName=${productName}`);
+}
+
+/**
+ * @scrollView加载数据
+ */
+function load() {
+  pageSize.value += 10;
+  init();
+}
+
+/**
+ * @scrollView刷新数据
+ */
+function refresh() {
+  pageSize.value = 20;
+  total.value = 0;
+  init();
+}
+
+onShow(() => {
+  //调用系统主题颜色
+  proxy.$settingStore.systemThemeColor([1]);
+
+  init();
+});
+</script>