|
|
@@ -4,7 +4,7 @@
|
|
|
<el-form :inline="true" :model="filters" class="search-form" @submit.prevent="search">
|
|
|
<el-form-item label="设备搜索"><el-input v-model="filters.keyword" clearable placeholder="请输入设备编码 / 名称" @keyup.enter="search" /></el-form-item>
|
|
|
<el-form-item label="报警等级"><el-select v-model="filters.alarmLevel" clearable placeholder="全部等级"><el-option v-for="item in alarmLevels" :key="item.value" :label="item.label" :value="Number(item.value)" /></el-select></el-form-item>
|
|
|
- <el-form-item label="审核结果"><el-select v-model="filters.auditStatus" clearable placeholder="全部结果"><el-option v-for="item in options.auditStatuses" :key="item.key" :label="item.label" :value="item.value" /></el-select></el-form-item>
|
|
|
+ <el-form-item label="核实结果"><el-select v-model="filters.auditStatus" clearable placeholder="全部结果"><el-option v-for="item in options.auditStatuses" :key="item.key" :label="item.key === 'UNREVIEWED' ? '待核实' : item.label" :value="item.value" /></el-select></el-form-item>
|
|
|
<el-form-item label="报警时间"><el-date-picker v-model="dateRange" type="daterange" value-format="YYYY-MM-DD" start-placeholder="开始日期" end-placeholder="结束日期" range-separator="至" /></el-form-item>
|
|
|
<el-form-item><el-button type="primary" :icon="Search" @click="search">查询</el-button><el-button :icon="Refresh" @click="reset">重置</el-button></el-form-item>
|
|
|
</el-form>
|
|
|
@@ -13,7 +13,7 @@
|
|
|
<section class="table-card">
|
|
|
<el-tabs :model-value="activeTab" @tab-change="changeTab">
|
|
|
<el-tab-pane name="all"><template #label>全部报警 <span class="tab-count">{{ statistics.total }}</span></template></el-tab-pane>
|
|
|
- <el-tab-pane name="pending"><template #label>待审核 <span class="tab-count">{{ statistics.pending }}</span></template></el-tab-pane>
|
|
|
+ <el-tab-pane name="pending"><template #label>待核实 <span class="tab-count">{{ statistics.pending }}</span></template></el-tab-pane>
|
|
|
</el-tabs>
|
|
|
<el-alert v-if="error" :title="error" type="error" show-icon :closable="false" class="load-error"><template #default><el-button link type="primary" @click="load">重新加载</el-button></template></el-alert>
|
|
|
<el-table v-loading="loading" :data="rows" row-key="id" border stripe style="width: 100%" :header-cell-style="{ background: '#f5f7fa', color: '#606266' }" :default-sort="{ prop: 'createTime', order: 'descending' }" @sort-change="sortChanged">
|
|
|
@@ -24,24 +24,24 @@
|
|
|
<el-table-column prop="alarmContent" label="报警描述" min-width="275"><template #default="{ row }">{{ row.alarmContent || '—' }}</template></el-table-column>
|
|
|
<el-table-column label="报警等级" width="105" align="center"><template #default="{ row }"><el-tag :type="levelTone(row.alarmLevel)" effect="light">{{ alarmLevels.find(item => Number(item.value) === Number(row.alarmLevel))?.label || row.alarmLevelName || '—' }}</el-tag></template></el-table-column>
|
|
|
<el-table-column prop="createTime" label="报警时间" width="175" sortable="custom" />
|
|
|
- <el-table-column label="审核结果" width="110" align="center"><template #default="{ row }"><el-tag :type="auditTone(row.auditStatus)" effect="light">{{ row.auditStatusName }}</el-tag></template></el-table-column>
|
|
|
- <el-table-column label="操作" width="160" align="center" fixed="right"><template #default="{ row }"><el-button v-if="isUnreviewed(row)" v-hasPermi="['alarm:review:audit']" link type="primary" @click="openReview(row)">审核</el-button><el-button link type="primary" @click="openHistory(row)">处置记录</el-button></template></el-table-column>
|
|
|
+ <el-table-column label="核实结果" width="110" align="center"><template #default="{ row }"><el-tag :type="auditTone(row.auditStatus)" effect="light">{{ alarmAuditText(row) }}</el-tag></template></el-table-column>
|
|
|
+ <el-table-column label="操作" width="160" align="center" fixed="right"><template #default="{ row }"><el-button v-if="isUnreviewed(row)" v-hasPermi="['alarm:review:audit']" link type="primary" @click="openReview(row)">核实</el-button><el-button link type="primary" @click="openHistory(row)">处置记录</el-button></template></el-table-column>
|
|
|
<template #empty><el-empty :description="error ? '数据加载失败' : '暂无匹配的未处理报警'" /></template>
|
|
|
</el-table>
|
|
|
<el-pagination class="pagination" v-model:current-page="pageNum" v-model:page-size="pageSize" :total="total" :page-sizes="[10, 20, 50, 100]" layout="total, sizes, prev, pager, next, jumper" @size-change="search" @current-change="load" />
|
|
|
</section>
|
|
|
|
|
|
- <el-dialog v-model="reviewVisible" title="报警审核" width="680px" append-to-body destroy-on-close :close-on-click-modal="false" :before-close="closeReview">
|
|
|
+ <el-dialog v-model="reviewVisible" title="报警核实" width="680px" append-to-body destroy-on-close :close-on-click-modal="false" :before-close="closeReview">
|
|
|
<div v-loading="detailLoading">
|
|
|
<AlarmSummary v-if="current" :alarm="current" :level-tone="levelTone(current.alarmLevel)" />
|
|
|
<el-form ref="formRef" :model="form" :rules="rules" label-width="90px" :disabled="submitting || detailLoading">
|
|
|
- <el-form-item label="审核结果" prop="auditStatus"><el-radio-group v-model="form.auditStatus" class="review-choices"><el-radio v-for="item in reviewChoices" :key="item.key" :label="item.value" border>{{ item.label }}</el-radio></el-radio-group></el-form-item>
|
|
|
- <el-form-item label="审核意见" prop="opinion"><el-input v-model="form.opinion" type="textarea" :rows="4" maxlength="500" show-word-limit placeholder="选填,可填写核实情况、判定依据或误报原因" /></el-form-item>
|
|
|
- <el-form-item label="图片"><div class="attachments"><el-upload v-model:file-list="files" :http-request="uploadFile" :before-upload="beforeUpload" :limit="5" :on-exceed="exceedFiles" :disabled="submitting || detailLoading" accept=".jpg,.jpeg,.png"><el-button :icon="Upload">选择图片</el-button><template #tip><div class="el-upload__tip">JPG、JPEG、PNG,最多 5 张,单张不超过 10 MB。</div></template></el-upload></div></el-form-item>
|
|
|
+ <el-form-item label="核实结果" prop="auditStatus"><el-radio-group v-model="form.auditStatus" class="review-choices"><el-radio v-for="item in reviewChoices" :key="item.key" :label="item.value" border>{{ item.label }}</el-radio></el-radio-group></el-form-item>
|
|
|
+ <el-form-item label="核实意见" prop="opinion"><el-input v-model="form.opinion" type="textarea" :rows="4" maxlength="500" show-word-limit placeholder="选填,可填写核实情况、判定依据或误报原因" /></el-form-item>
|
|
|
+ <el-form-item label="图片"><div class="attachments"><el-upload v-model:file-list="files" :http-request="uploadFile" :before-upload="beforeUpload" :limit="5" :on-exceed="exceedFiles" :disabled="submitting || detailLoading" accept=".jpg,.jpeg,.png"><el-button :icon="Upload">选择图片</el-button><template #tip><div class="el-upload__tip">支持 png / jpg / jpeg,单个文件不超过 10MB</div></template></el-upload></div></el-form-item>
|
|
|
</el-form>
|
|
|
<el-alert v-if="formError" :title="formError" type="error" :closable="false" show-icon />
|
|
|
</div>
|
|
|
- <template #footer><el-button :disabled="submitting || uploading" @click="closeReview()">取消</el-button><el-button type="primary" :loading="submitting" :disabled="detailLoading || uploading || !current" @click="submit">提交审核</el-button></template>
|
|
|
+ <template #footer><el-button :disabled="submitting || uploading" @click="closeReview()">取消</el-button><el-button type="primary" :loading="submitting" :disabled="detailLoading || uploading || !current" @click="submit">提交核实</el-button></template>
|
|
|
</el-dialog>
|
|
|
|
|
|
<el-drawer v-model="historyVisible" title="处置记录" size="640px" append-to-body destroy-on-close>
|
|
|
@@ -61,6 +61,7 @@ import { useRoute, onBeforeRouteLeave, onBeforeRouteUpdate } from 'vue-router'
|
|
|
import { ElMessage } from 'element-plus'
|
|
|
import { Refresh, Search, Upload } from '@element-plus/icons-vue'
|
|
|
import { getAlarmReviewOptions, getAlarmReviewPage, getAlarmReviewStatistics, getAlarmReviewDetail, getAlarmLogs, submitAlarmReview, uploadAlarmReviewAttachment } from '@/api/alarmReview'
|
|
|
+import { alarmAuditText } from '@/utils/alarmLabels'
|
|
|
import AlarmSummary from '../AlarmSummary.vue'
|
|
|
import AlarmHistory from '../AlarmHistory.vue'
|
|
|
import { useDict } from '@/utils/dict'
|
|
|
@@ -84,8 +85,8 @@ const reviewChoices = computed(() => options.auditStatuses.filter(item => item.k
|
|
|
const activeTab = computed(() => filters.auditStatus !== undefined && filters.auditStatus === unreviewed.value ? 'pending' : 'all')
|
|
|
const uploading = computed(() => files.value.some(file => ['ready', 'uploading'].includes(file.status)))
|
|
|
const rules = {
|
|
|
- auditStatus: [{ required: true, message: '请选择审核结果', trigger: 'change' }],
|
|
|
- opinion: [{ max: 500, message: '审核意见最多500字', trigger: 'blur' }]
|
|
|
+ auditStatus: [{ required: true, message: '请选择核实结果', trigger: 'change' }],
|
|
|
+ opinion: [{ max: 500, message: '核实意见最多500字', trigger: 'blur' }]
|
|
|
}
|
|
|
const message = e => e?.response?.data?.msg || e?.message || '请求失败,请重试'
|
|
|
const isUnreviewed = row => unreviewed.value !== undefined && row.auditStatus === unreviewed.value
|
|
|
@@ -123,7 +124,7 @@ async function openReview(row) {
|
|
|
try {
|
|
|
const response = await getAlarmReviewDetail(row.id, { ...scope.value })
|
|
|
if (request !== detailRequest) return
|
|
|
- if (!isUnreviewed(response.data)) { reviewVisible.value = false; ElMessage.warning('该报警已审核,请刷新'); return load() }
|
|
|
+ if (!isUnreviewed(response.data)) { reviewVisible.value = false; ElMessage.warning('该报警已核实,请刷新'); return load() }
|
|
|
current.value = response.data
|
|
|
} catch (e) { if (request === detailRequest) formError.value = message(e) }
|
|
|
finally { if (request === detailRequest) detailLoading.value = false }
|
|
|
@@ -142,7 +143,7 @@ async function submit() {
|
|
|
try {
|
|
|
await submitAlarmReview(current.value.id, { ...scope.value }, { auditStatus: form.auditStatus, opinion: form.opinion.trim(), attachmentTokens: files.value.map(file => file.response.token) })
|
|
|
reviewVisible.value = false; files.value = []; Object.assign(form, { auditStatus: undefined, opinion: '' })
|
|
|
- ElMessage.success('审核已提交'); await load()
|
|
|
+ ElMessage.success('核实已提交'); await load()
|
|
|
} catch (e) { formError.value = message(e) }
|
|
|
finally { submitting.value = false }
|
|
|
}
|