|
@@ -1,11 +1,176 @@
|
|
|
-<script setup lang="ts">
|
|
|
|
|
-
|
|
|
|
|
-</script>
|
|
|
|
|
-
|
|
|
|
|
<template>
|
|
<template>
|
|
|
|
|
+ <div class="alarm-container">
|
|
|
|
|
+ <el-card class="query-card">
|
|
|
|
|
+ <template #header>
|
|
|
|
|
+ <span>查询条件</span>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <el-form :inline="true" :model="queryForm" class="demo-form-inline">
|
|
|
|
|
+ <el-form-item label="时间范围">
|
|
|
|
|
+ <el-date-picker
|
|
|
|
|
+ v-model="queryForm.dateRange"
|
|
|
|
|
+ type="datetimerange"
|
|
|
|
|
+ range-separator="至"
|
|
|
|
|
+ start-placeholder="开始日期"
|
|
|
|
|
+ end-placeholder="结束日期"
|
|
|
|
|
+ format="YYYY-MM-DD HH:mm:ss"
|
|
|
|
|
+ value-format="YYYY-MM-DD HH:mm:ss"
|
|
|
|
|
+ />
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ <el-form-item label="组织">
|
|
|
|
|
+ <el-select v-model="queryForm.organization" placeholder="请选择组织">
|
|
|
|
|
+ <el-option label="园区A" value="parkA"></el-option>
|
|
|
|
|
+ <el-option label="园区B" value="parkB"></el-option>
|
|
|
|
|
+ <!-- 根据实际需求添加更多选项 -->
|
|
|
|
|
+ </el-select>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ <el-form-item label="报警状态">
|
|
|
|
|
+ <el-select v-model="queryForm.alarmStatus" placeholder="请选择报警状态">
|
|
|
|
|
+ <el-option label="已处理" value="handled"></el-option>
|
|
|
|
|
+ <el-option label="未处理" value="unhandled"></el-option>
|
|
|
|
|
+ <!-- 根据实际需求添加更多选项 -->
|
|
|
|
|
+ </el-select>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ <el-form-item label="报警等级">
|
|
|
|
|
+ <el-select v-model="queryForm.alarmLevel" placeholder="请选择报警等级">
|
|
|
|
|
+ <el-option label="低" value="low"></el-option>
|
|
|
|
|
+ <el-option label="中" value="medium"></el-option>
|
|
|
|
|
+ <el-option label="高" value="high"></el-option>
|
|
|
|
|
+ <!-- 根据实际需求添加更多选项 -->
|
|
|
|
|
+ </el-select>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ <el-form-item>
|
|
|
|
|
+ <el-button type="primary" @click="fetchData">查询</el-button>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-form>
|
|
|
|
|
+ </el-card>
|
|
|
|
|
|
|
|
|
|
+ <!-- 报警记录表格 -->
|
|
|
|
|
+ <el-card class="records-card">
|
|
|
|
|
+ <template #header>
|
|
|
|
|
+ <span>报警记录</span>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <el-table :data="alarms" style="width: 100%">
|
|
|
|
|
+ <el-table-column prop="timestamp" label="时间"></el-table-column>
|
|
|
|
|
+ <el-table-column prop="organization" label="组织"></el-table-column>
|
|
|
|
|
+ <el-table-column prop="status" label="报警状态"></el-table-column>
|
|
|
|
|
+ <el-table-column prop="level" label="报警等级"></el-table-column>
|
|
|
|
|
+ <el-table-column prop="description" label="描述"></el-table-column>
|
|
|
|
|
+ </el-table>
|
|
|
|
|
+ </el-card>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 统计结果展示区 -->
|
|
|
|
|
+ <el-card class="statistics-card">
|
|
|
|
|
+ <template #header>
|
|
|
|
|
+ <span>统计结果</span>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <div id="chart" style="width: 100%; height: 400px;"></div>
|
|
|
|
|
+ </el-card>
|
|
|
|
|
+ </div>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
|
|
+<script setup>
|
|
|
|
|
+import { ref, onMounted } from 'vue'
|
|
|
|
|
+import axios from 'axios'
|
|
|
|
|
+import * as echarts from 'echarts'
|
|
|
|
|
+
|
|
|
|
|
+// 查询表单的数据模型
|
|
|
|
|
+const queryForm = ref({
|
|
|
|
|
+ dateRange: [],
|
|
|
|
|
+ organization: '',
|
|
|
|
|
+ alarmStatus: '',
|
|
|
|
|
+ alarmLevel: ''
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
|
|
+// 报警记录列表
|
|
|
|
|
+const alarms = ref([])
|
|
|
|
|
+
|
|
|
|
|
+// 图表实例
|
|
|
|
|
+let chartInstance = null
|
|
|
|
|
+
|
|
|
|
|
+// 初始化图表
|
|
|
|
|
+const initChart = () => {
|
|
|
|
|
+ const dom = document.getElementById('chart')
|
|
|
|
|
+
|
|
|
|
|
+ chartInstance = echarts.init(dom)
|
|
|
|
|
+ const option = {
|
|
|
|
|
+ title: {
|
|
|
|
|
+ text: '动环报警数据统计'
|
|
|
|
|
+ },
|
|
|
|
|
+ tooltip: {
|
|
|
|
|
+ trigger: 'axis'
|
|
|
|
|
+ },
|
|
|
|
|
+ legend: {
|
|
|
|
|
+ data: ['报警次数']
|
|
|
|
|
+ },
|
|
|
|
|
+ xAxis: {
|
|
|
|
|
+ type: 'category',
|
|
|
|
|
+ boundaryGap: false,
|
|
|
|
|
+ data: []
|
|
|
|
|
+ },
|
|
|
|
|
+ yAxis: {
|
|
|
|
|
+ type: 'value'
|
|
|
|
|
+ },
|
|
|
|
|
+ series: [
|
|
|
|
|
+ {
|
|
|
|
|
+ name: '报警次数',
|
|
|
|
|
+ type: 'line',
|
|
|
|
|
+ data: []
|
|
|
|
|
+ }
|
|
|
|
|
+ ]
|
|
|
|
|
+ }
|
|
|
|
|
+ chartInstance.setOption(option)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// 模拟获取数据的函数
|
|
|
|
|
+const fetchData = async () => {
|
|
|
|
|
+ try {
|
|
|
|
|
+ // 构建查询参数
|
|
|
|
|
+ const params = {
|
|
|
|
|
+ startTime: queryForm.value.dateRange[0],
|
|
|
|
|
+ endTime: queryForm.value.dateRange[1],
|
|
|
|
|
+ organization: queryForm.value.organization,
|
|
|
|
|
+ status: queryForm.value.alarmStatus,
|
|
|
|
|
+ level: queryForm.value.alarmLevel
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ const response = await axios.get('https://api.example.com/alarm-data', { params }) // 替换为实际API地址
|
|
|
|
|
+ const data = response.data
|
|
|
|
|
+
|
|
|
|
|
+ // 更新报警记录列表
|
|
|
|
|
+ alarms.value = data.records
|
|
|
|
|
+
|
|
|
|
|
+ // 更新图表数据
|
|
|
|
|
+ updateChartData(data.statistics)
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.error('Error fetching data:', error)
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// 更新图表数据
|
|
|
|
|
+const updateChartData = (statistics) => {
|
|
|
|
|
+ if (!chartInstance) return
|
|
|
|
|
+
|
|
|
|
|
+ // 假设返回的数据结构是 { timestamps: ["2023-01-01", "2023-01-02"], counts: [5, 3] }
|
|
|
|
|
+ const timestamps = statistics.timestamps
|
|
|
|
|
+ const countData = statistics.counts
|
|
|
|
|
+
|
|
|
|
|
+ chartInstance.setOption({
|
|
|
|
|
+ xAxis: { data: timestamps },
|
|
|
|
|
+ series: [{ data: countData }]
|
|
|
|
|
+ })
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+onMounted(() => {
|
|
|
|
|
+ initChart()
|
|
|
|
|
+})
|
|
|
|
|
+</script>
|
|
|
|
|
+
|
|
|
<style scoped>
|
|
<style scoped>
|
|
|
|
|
+.alarm-container {
|
|
|
|
|
+ padding: 20px;
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
|
|
+.query-card, .records-card, .statistics-card {
|
|
|
|
|
+ margin-bottom: 20px;
|
|
|
|
|
+}
|
|
|
</style>
|
|
</style>
|