|
@@ -3,19 +3,19 @@
|
|
|
<!-- 搜索区 -->
|
|
<!-- 搜索区 -->
|
|
|
<div class="filter-panel">
|
|
<div class="filter-panel">
|
|
|
<div class="filter-form">
|
|
<div class="filter-form">
|
|
|
- <el-select v-model="filters.eventStatus" placeholder="事件状态" clearable style="width:140px">
|
|
|
|
|
|
|
+ <el-select v-model="searchForm.eventStatus" placeholder="事件状态" clearable style="width:140px">
|
|
|
<el-option label="处理中" value="处理中" />
|
|
<el-option label="处理中" value="处理中" />
|
|
|
<el-option label="已解除" value="已解除" />
|
|
<el-option label="已解除" value="已解除" />
|
|
|
<el-option label="已关闭" value="已关闭" />
|
|
<el-option label="已关闭" value="已关闭" />
|
|
|
</el-select>
|
|
</el-select>
|
|
|
- <el-select v-model="filters.category" placeholder="事件类别" clearable style="width:140px">
|
|
|
|
|
|
|
+ <el-select v-model="searchForm.category" placeholder="事件类别" clearable style="width:140px">
|
|
|
<el-option label="管道泄漏" value="管道泄漏" />
|
|
<el-option label="管道泄漏" value="管道泄漏" />
|
|
|
<el-option label="塌陷" value="塌陷" />
|
|
<el-option label="塌陷" value="塌陷" />
|
|
|
<el-option label="积水" value="积水" />
|
|
<el-option label="积水" value="积水" />
|
|
|
<el-option label="设备故障" value="设备故障" />
|
|
<el-option label="设备故障" value="设备故障" />
|
|
|
</el-select>
|
|
</el-select>
|
|
|
<el-date-picker
|
|
<el-date-picker
|
|
|
- v-model="filters.dateRange"
|
|
|
|
|
|
|
+ v-model="searchForm.dateRange"
|
|
|
type="daterange"
|
|
type="daterange"
|
|
|
range-separator="至"
|
|
range-separator="至"
|
|
|
start-placeholder="开始日期"
|
|
start-placeholder="开始日期"
|
|
@@ -30,7 +30,7 @@
|
|
|
|
|
|
|
|
<!-- 数据表格 -->
|
|
<!-- 数据表格 -->
|
|
|
<div class="table-panel">
|
|
<div class="table-panel">
|
|
|
- <el-table :data="pagedList" border stripe style="width:100%">
|
|
|
|
|
|
|
+ <el-table :data="tableData" border stripe style="width:100%" v-loading="loading">
|
|
|
<el-table-column prop="eventNo" label="事件编号" width="140" />
|
|
<el-table-column prop="eventNo" label="事件编号" width="140" />
|
|
|
<el-table-column prop="category" label="事件类别" width="110" />
|
|
<el-table-column prop="category" label="事件类别" width="110" />
|
|
|
<el-table-column prop="level" label="事件等级" width="100">
|
|
<el-table-column prop="level" label="事件等级" width="100">
|
|
@@ -43,15 +43,16 @@
|
|
|
<el-tag :type="statusTagType(row.status)" size="small">{{ row.status }}</el-tag>
|
|
<el-tag :type="statusTagType(row.status)" size="small">{{ row.status }}</el-tag>
|
|
|
</template>
|
|
</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
- <el-table-column prop="lastVisitTime" label="最近回访时间" width="150" />
|
|
|
|
|
- <el-table-column prop="nextVisitTime" label="下次回访时间" width="150" />
|
|
|
|
|
- <el-table-column prop="handler" label="负责人" width="100" />
|
|
|
|
|
- <el-table-column label="操作" width="220" fixed="right">
|
|
|
|
|
|
|
+ <el-table-column prop="lastVisitTime" label="最近回访时间" min-width="150" />
|
|
|
|
|
+ <el-table-column prop="nextVisitTime" label="下次回访时间" min-width="150" />
|
|
|
|
|
+ <el-table-column prop="handler" label="负责人" min-width="100" />
|
|
|
|
|
+ <el-table-column label="操作" width="260" fixed="right">
|
|
|
<template #default="{ row }">
|
|
<template #default="{ row }">
|
|
|
<el-button v-if="row.status === '处理中'" type="primary" link size="small" @click="handleTrack(row)">跟踪</el-button>
|
|
<el-button v-if="row.status === '处理中'" type="primary" link size="small" @click="handleTrack(row)">跟踪</el-button>
|
|
|
<el-button v-if="row.status === '处理中'" type="primary" link size="small" @click="handleClose(row)">解除</el-button>
|
|
<el-button v-if="row.status === '处理中'" type="primary" link size="small" @click="handleClose(row)">解除</el-button>
|
|
|
<el-button v-if="row.status === '已解除'" type="primary" link size="small" @click="handleClose(row)">关闭</el-button>
|
|
<el-button v-if="row.status === '已解除'" type="primary" link size="small" @click="handleClose(row)">关闭</el-button>
|
|
|
<el-button type="primary" link size="small" @click="handleDetail(row)">详情</el-button>
|
|
<el-button type="primary" link size="small" @click="handleDetail(row)">详情</el-button>
|
|
|
|
|
+ <el-button type="danger" link size="small" @click="handleDelete(row)">删除</el-button>
|
|
|
</template>
|
|
</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
</el-table>
|
|
</el-table>
|
|
@@ -61,7 +62,7 @@
|
|
|
v-model:page-size="pagination.pageSize"
|
|
v-model:page-size="pagination.pageSize"
|
|
|
:page-sizes="[10, 20, 50]"
|
|
:page-sizes="[10, 20, 50]"
|
|
|
layout="total, sizes, prev, pager, next, jumper"
|
|
layout="total, sizes, prev, pager, next, jumper"
|
|
|
- :total="filteredList.length"
|
|
|
|
|
|
|
+ :total="total"
|
|
|
@size-change="handleSizeChange"
|
|
@size-change="handleSizeChange"
|
|
|
@current-change="handleCurrentChange"
|
|
@current-change="handleCurrentChange"
|
|
|
/>
|
|
/>
|
|
@@ -140,42 +141,42 @@
|
|
|
<div v-if="currentRow" class="detail-content">
|
|
<div v-if="currentRow" class="detail-content">
|
|
|
<el-form label-width="100px" size="default">
|
|
<el-form label-width="100px" size="default">
|
|
|
<el-row :gutter="20">
|
|
<el-row :gutter="20">
|
|
|
- <el-col :span="12">
|
|
|
|
|
|
|
+ <el-col :span="8">
|
|
|
<el-form-item label="事件编号">{{ currentRow.eventNo }}</el-form-item>
|
|
<el-form-item label="事件编号">{{ currentRow.eventNo }}</el-form-item>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
- <el-col :span="12">
|
|
|
|
|
|
|
+ <el-col :span="8">
|
|
|
<el-form-item label="事件类别">{{ currentRow.category }}</el-form-item>
|
|
<el-form-item label="事件类别">{{ currentRow.category }}</el-form-item>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
|
|
+ <el-col :span="8">
|
|
|
|
|
+ <el-form-item label="事件等级">
|
|
|
|
|
+ <el-tag v-if="currentRow.level" :type="levelTagType(currentRow.level)" size="small">{{ currentRow.level }}</el-tag>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
</el-row>
|
|
</el-row>
|
|
|
<el-row :gutter="20">
|
|
<el-row :gutter="20">
|
|
|
- <el-col :span="12">
|
|
|
|
|
- <el-form-item label="事件等级">{{ currentRow.level }}</el-form-item>
|
|
|
|
|
- </el-col>
|
|
|
|
|
- <el-col :span="12">
|
|
|
|
|
|
|
+ <el-col :span="8">
|
|
|
<el-form-item label="当前状态">
|
|
<el-form-item label="当前状态">
|
|
|
<el-tag :type="statusTagType(currentRow.status)" size="small">{{ currentRow.status }}</el-tag>
|
|
<el-tag :type="statusTagType(currentRow.status)" size="small">{{ currentRow.status }}</el-tag>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
- </el-row>
|
|
|
|
|
- <el-row :gutter="20">
|
|
|
|
|
- <el-col :span="12">
|
|
|
|
|
- <el-form-item label="负责人">{{ currentRow.handler }}</el-form-item>
|
|
|
|
|
|
|
+ <el-col :span="8">
|
|
|
|
|
+ <el-form-item label="负责人">{{ currentRow.handler || '-' }}</el-form-item>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
- <el-col :span="12">
|
|
|
|
|
- <el-form-item label="发生地点">{{ currentRow.location }}</el-form-item>
|
|
|
|
|
|
|
+ <el-col :span="8">
|
|
|
|
|
+ <el-form-item label="发生地点">{{ currentRow.location || '-' }}</el-form-item>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
</el-row>
|
|
</el-row>
|
|
|
- <el-form-item label="事件描述">
|
|
|
|
|
- <div class="desc-text">{{ currentRow.description }}</div>
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
<el-row :gutter="20">
|
|
<el-row :gutter="20">
|
|
|
- <el-col :span="12">
|
|
|
|
|
|
|
+ <el-col :span="8">
|
|
|
<el-form-item label="最近回访">{{ currentRow.lastVisitTime || '-' }}</el-form-item>
|
|
<el-form-item label="最近回访">{{ currentRow.lastVisitTime || '-' }}</el-form-item>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
- <el-col :span="12">
|
|
|
|
|
|
|
+ <el-col :span="8">
|
|
|
<el-form-item label="下次回访">{{ currentRow.nextVisitTime || '-' }}</el-form-item>
|
|
<el-form-item label="下次回访">{{ currentRow.nextVisitTime || '-' }}</el-form-item>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
</el-row>
|
|
</el-row>
|
|
|
|
|
+ <el-form-item label="事件描述">
|
|
|
|
|
+ <div class="desc-text">{{ currentRow.description || '-' }}</div>
|
|
|
|
|
+ </el-form-item>
|
|
|
<div class="section-title">处置时间线</div>
|
|
<div class="section-title">处置时间线</div>
|
|
|
<el-timeline>
|
|
<el-timeline>
|
|
|
<el-timeline-item
|
|
<el-timeline-item
|
|
@@ -198,115 +199,64 @@
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script setup name="Gzjc">
|
|
<script setup name="Gzjc">
|
|
|
-import { ref, computed } from 'vue'
|
|
|
|
|
-
|
|
|
|
|
-// ==================== mock 数据 ====================
|
|
|
|
|
-const eventList = ref([
|
|
|
|
|
- { eventNo: 'EVT20250613003', category: '积水', level: '一般', status: '处理中', lastVisitTime: '2025-06-13 10:00:00', nextVisitTime: '2025-06-13 16:00:00', handler: '张三', location: '科技大道中段', description: '路面积水严重,影响通行', timeline: [
|
|
|
|
|
- { time: '2025-06-13 07:55', title: '事件接报', content: '视频监控发现积水', type: 'primary' },
|
|
|
|
|
- { time: '2025-06-13 08:10', title: '事件核实', content: '核实积水深度约10cm', type: 'success' },
|
|
|
|
|
- { time: '2025-06-13 08:30', title: '事件转接', content: '转接至排水管理部', type: 'warning' },
|
|
|
|
|
- { time: '2025-06-13 10:00', title: '跟踪记录', content: '已安排疏通车前往,预计2小时完成', type: 'primary' }
|
|
|
|
|
- ] },
|
|
|
|
|
- { eventNo: 'EVT20250613004', category: '管道泄漏', level: '重大', status: '处理中', lastVisitTime: '2025-06-13 08:00:00', nextVisitTime: '2025-06-13 12:00:00', handler: '李四', location: '和平路步行街', description: '燃气管道疑似泄漏', timeline: [
|
|
|
|
|
- { time: '2025-06-12 16:30', title: '事件接报', content: '市应急办转发', type: 'primary' },
|
|
|
|
|
- { time: '2025-06-12 17:00', title: '事件核实', content: '已现场确认微泄漏', type: 'success' },
|
|
|
|
|
- { time: '2025-06-12 17:30', title: '事件转接', content: '转接至市政部门', type: 'warning' },
|
|
|
|
|
- { time: '2025-06-13 08:00', title: '跟踪记录', content: '已关闭阀门,正在抢修', type: 'primary' }
|
|
|
|
|
- ] },
|
|
|
|
|
- { eventNo: 'EVT20250613007', category: '积水', level: '一般', status: '已解除', lastVisitTime: '2025-06-13 09:30:00', nextVisitTime: '-', handler: '王五', location: '太湖路与松江路交叉口', description: '路口积水深度约15cm', timeline: [
|
|
|
|
|
- { time: '2025-06-13 06:45', title: '事件接报', content: '交警监控共享平台发现', type: 'primary' },
|
|
|
|
|
- { time: '2025-06-13 07:00', title: '事件核实', content: '积水属实,排水口堵塞', type: 'success' },
|
|
|
|
|
- { time: '2025-06-13 07:30', title: '事件转接', content: '转接至排水管理部', type: 'warning' },
|
|
|
|
|
- { time: '2025-06-13 09:00', title: '跟踪记录', content: '排水口已疏通,积水消退', type: 'primary' },
|
|
|
|
|
- { time: '2025-06-13 09:30', title: '事件解除', content: '解除原因:处置完成', type: 'success' }
|
|
|
|
|
- ] },
|
|
|
|
|
- { eventNo: 'EVT20250613010', category: '设备故障', level: '一般', status: '处理中', lastVisitTime: '2025-06-13 15:30:00', nextVisitTime: '2025-06-14 09:00:00', handler: '赵六', location: '新华路88号大厦', description: '地下室排水泵故障', timeline: [
|
|
|
|
|
- { time: '2025-06-13 14:35', title: '事件接报', content: '物业反映排水泵故障', type: 'primary' },
|
|
|
|
|
- { time: '2025-06-13 15:00', title: '事件核实', content: '排水泵电机烧毁', type: 'success' },
|
|
|
|
|
- { time: '2025-06-13 15:30', title: '跟踪记录', content: '已联系供应商备货更换', type: 'primary' }
|
|
|
|
|
- ] },
|
|
|
|
|
- { eventNo: 'EVT20250613011', category: '塌陷', level: '较大', status: '处理中', lastVisitTime: '2025-06-13 11:00:00', nextVisitTime: '2025-06-13 17:00:00', handler: '孙七', location: '人民路与建设路交叉口', description: '路面塌陷面积约2平方米', timeline: [
|
|
|
|
|
- { time: '2025-06-13 08:35', title: '事件接报', content: '巡查上报', type: 'primary' },
|
|
|
|
|
- { time: '2025-06-13 08:50', title: '事件核实', content: '塌陷属实,已设围挡', type: 'success' },
|
|
|
|
|
- { time: '2025-06-13 09:00', title: '事件转接', content: '转接至管网维护部', type: 'warning' },
|
|
|
|
|
- { time: '2025-06-13 11:00', title: '跟踪记录', content: '已安排施工队,预计3天修复', type: 'primary' }
|
|
|
|
|
- ] },
|
|
|
|
|
- { eventNo: 'EVT20250613012', category: '设备故障', level: '较大', status: '处理中', lastVisitTime: '-', nextVisitTime: '2025-06-13 22:00:00', handler: '周八', location: '珠江路工业园A区', description: '消防设施压力异常', timeline: [
|
|
|
|
|
- { time: '2025-06-12 20:30', title: '事件接报', content: '省厅转发', type: 'primary' },
|
|
|
|
|
- { time: '2025-06-12 21:00', title: '事件核实', content: '压力传感器故障', type: 'success' }
|
|
|
|
|
- ] },
|
|
|
|
|
- { eventNo: 'EVT20250613013', category: '积水', level: '较大', status: '已关闭', lastVisitTime: '2025-06-13 14:00:00', nextVisitTime: '-', handler: '吴九', location: '黄河路56号小区', description: '小区内污水外溢', timeline: [
|
|
|
|
|
- { time: '2025-06-13 11:25', title: '事件接报', content: '市民热线反映', type: 'primary' },
|
|
|
|
|
- { time: '2025-06-13 11:45', title: '事件核实', content: '污水外溢属实', type: 'success' },
|
|
|
|
|
- { time: '2025-06-13 12:00', title: '事件转接', content: '转接至排水管理部', type: 'warning' },
|
|
|
|
|
- { time: '2025-06-13 14:00', title: '跟踪记录', content: '化粪池已清掏,外溢停止', type: 'primary' },
|
|
|
|
|
- { time: '2025-06-13 14:30', title: '事件解除', content: '解除原因:处置完成', type: 'success' },
|
|
|
|
|
- { time: '2025-06-13 15:00', title: '事件关闭', content: '事件已归档', type: 'info' }
|
|
|
|
|
- ] },
|
|
|
|
|
- { eventNo: 'EVT20250613014', category: '塌陷', level: '一般', status: '处理中', lastVisitTime: '-', nextVisitTime: '2025-06-13 18:00:00', handler: '郑十', location: '中山路与解放路交叉口', description: '路灯杆倾斜', timeline: [
|
|
|
|
|
- { time: '2025-06-13 13:05', title: '事件接报', content: '巡查上报', type: 'primary' },
|
|
|
|
|
- { time: '2025-06-13 13:20', title: '事件核实', content: '灯杆倾斜约15度', type: 'success' }
|
|
|
|
|
- ] },
|
|
|
|
|
- { eventNo: 'EVT20250613015', category: '管道泄漏', level: '较大', status: '已解除', lastVisitTime: '2025-06-13 13:00:00', nextVisitTime: '-', handler: '刘一', location: '长江路北侧辅道', description: '供水管道破裂', timeline: [
|
|
|
|
|
- { time: '2025-06-13 10:05', title: '事件接报', content: '巡查上报', type: 'primary' },
|
|
|
|
|
- { time: '2025-06-13 10:20', title: '事件核实', content: 'DN300管道破裂', type: 'success' },
|
|
|
|
|
- { time: '2025-06-13 10:30', title: '事件转接', content: '转接至市政部门', type: 'warning' },
|
|
|
|
|
- { time: '2025-06-13 12:00', title: '跟踪记录', content: '管道已修复,恢复供水', type: 'primary' },
|
|
|
|
|
- { time: '2025-06-13 13:00', title: '事件解除', content: '解除原因:处置完成', type: 'success' }
|
|
|
|
|
- ] },
|
|
|
|
|
- { eventNo: 'EVT20250613016', category: '设备故障', level: '重大', status: '处理中', lastVisitTime: '2025-06-13 10:00:00', nextVisitTime: '2025-06-13 16:00:00', handler: '陈二', location: '幸福路123号门前', description: '排水井盖缺失', timeline: [
|
|
|
|
|
- { time: '2025-06-13 09:15', title: '事件接报', content: '市民热线反映', type: 'primary' },
|
|
|
|
|
- { time: '2025-06-13 09:30', title: '事件核实', content: '井盖缺失,已设警示', type: 'success' },
|
|
|
|
|
- { time: '2025-06-13 10:00', title: '跟踪记录', content: '已联系仓库调配备用井盖', type: 'primary' }
|
|
|
|
|
- ] }
|
|
|
|
|
-])
|
|
|
|
|
-
|
|
|
|
|
-// ==================== 搜索筛选 ====================
|
|
|
|
|
-const filters = ref({ eventStatus: '', category: '', dateRange: null })
|
|
|
|
|
|
|
+import { ref, onMounted } from 'vue'
|
|
|
|
|
+import { ElMessage, ElMessageBox } from 'element-plus'
|
|
|
|
|
+import { getEventTrackPage, deleteEventTrack, addTrackLog, releaseEvent, closeEvent, getTrackLogs } from '@/api/dispatch'
|
|
|
|
|
+
|
|
|
|
|
+// ==================== 数据状态 ====================
|
|
|
|
|
+const tableData = ref([])
|
|
|
|
|
+const total = ref(0)
|
|
|
|
|
+const loading = ref(false)
|
|
|
|
|
+const searchForm = ref({ eventStatus: '', category: '', dateRange: null })
|
|
|
|
|
+const pagination = ref({ page: 1, pageSize: 10 })
|
|
|
|
|
|
|
|
-const filteredList = computed(() => {
|
|
|
|
|
- let list = eventList.value
|
|
|
|
|
- if (filters.value.eventStatus) {
|
|
|
|
|
- list = list.filter(o => o.status === filters.value.eventStatus)
|
|
|
|
|
- }
|
|
|
|
|
- if (filters.value.category) {
|
|
|
|
|
- list = list.filter(o => o.category === filters.value.category)
|
|
|
|
|
- }
|
|
|
|
|
- if (filters.value.dateRange && filters.value.dateRange.length === 2) {
|
|
|
|
|
- const [start, end] = filters.value.dateRange
|
|
|
|
|
- list = list.filter(o => {
|
|
|
|
|
- const t = o.timeline[0] && o.timeline[0].time ? o.timeline[0].time : ''
|
|
|
|
|
- return t >= start && t <= end + ' 23:59:59'
|
|
|
|
|
- })
|
|
|
|
|
|
|
+// ==================== 加载数据 ====================
|
|
|
|
|
+async function loadData() {
|
|
|
|
|
+ loading.value = true
|
|
|
|
|
+ try {
|
|
|
|
|
+ const params = {}
|
|
|
|
|
+ if (searchForm.value.eventStatus) params.status = searchForm.value.eventStatus
|
|
|
|
|
+ if (searchForm.value.category) params.category = searchForm.value.category
|
|
|
|
|
+ if (searchForm.value.dateRange && searchForm.value.dateRange.length === 2) {
|
|
|
|
|
+ params.startDate = searchForm.value.dateRange[0]
|
|
|
|
|
+ params.endDate = searchForm.value.dateRange[1]
|
|
|
|
|
+ }
|
|
|
|
|
+ const res = await getEventTrackPage(pagination.value.page, pagination.value.pageSize, params)
|
|
|
|
|
+ tableData.value = res.data?.rows || res.data?.records || res.data || []
|
|
|
|
|
+ total.value = res.data?.total || 0
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ ElMessage.error('加载数据失败:' + (error.message || '未知错误'))
|
|
|
|
|
+ } finally {
|
|
|
|
|
+ loading.value = false
|
|
|
}
|
|
}
|
|
|
- return list
|
|
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+onMounted(() => {
|
|
|
|
|
+ loadData()
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
|
|
+// ==================== 搜索筛选 ====================
|
|
|
function handleSearch() {
|
|
function handleSearch() {
|
|
|
pagination.value.page = 1
|
|
pagination.value.page = 1
|
|
|
|
|
+ loadData()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
function handleReset() {
|
|
function handleReset() {
|
|
|
- filters.value = { eventStatus: '', category: '', dateRange: null }
|
|
|
|
|
|
|
+ searchForm.value = { eventStatus: '', category: '', dateRange: null }
|
|
|
pagination.value.page = 1
|
|
pagination.value.page = 1
|
|
|
|
|
+ loadData()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// ==================== 分页 ====================
|
|
// ==================== 分页 ====================
|
|
|
-const pagination = ref({ page: 1, pageSize: 10 })
|
|
|
|
|
-
|
|
|
|
|
-const pagedList = computed(() => {
|
|
|
|
|
- const start = (pagination.value.page - 1) * pagination.value.pageSize
|
|
|
|
|
- return filteredList.value.slice(start, start + pagination.value.pageSize)
|
|
|
|
|
-})
|
|
|
|
|
-
|
|
|
|
|
function handleSizeChange(val) {
|
|
function handleSizeChange(val) {
|
|
|
pagination.value.pageSize = val
|
|
pagination.value.pageSize = val
|
|
|
pagination.value.page = 1
|
|
pagination.value.page = 1
|
|
|
|
|
+ loadData()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
function handleCurrentChange(val) {
|
|
function handleCurrentChange(val) {
|
|
|
pagination.value.page = val
|
|
pagination.value.page = val
|
|
|
|
|
+ loadData()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// ==================== 标签样式 ====================
|
|
// ==================== 标签样式 ====================
|
|
@@ -327,6 +277,7 @@ function levelTagType(level) {
|
|
|
// ==================== 跟踪 ====================
|
|
// ==================== 跟踪 ====================
|
|
|
const trackVisible = ref(false)
|
|
const trackVisible = ref(false)
|
|
|
const trackFormRef = ref(null)
|
|
const trackFormRef = ref(null)
|
|
|
|
|
+const currentTrackId = ref(null)
|
|
|
const trackForm = ref({ eventNo: '', content: '', assessment: '趋于平稳', needUpgrade: '否', nextVisitTime: '' })
|
|
const trackForm = ref({ eventNo: '', content: '', assessment: '趋于平稳', needUpgrade: '否', nextVisitTime: '' })
|
|
|
const trackRules = {
|
|
const trackRules = {
|
|
|
content: [{ required: true, message: '请输入跟踪内容', trigger: 'blur' }],
|
|
content: [{ required: true, message: '请输入跟踪内容', trigger: 'blur' }],
|
|
@@ -337,31 +288,51 @@ const trackRules = {
|
|
|
|
|
|
|
|
function handleTrack(row) {
|
|
function handleTrack(row) {
|
|
|
currentRow.value = row
|
|
currentRow.value = row
|
|
|
|
|
+ currentTrackId.value = row.id
|
|
|
trackForm.value = { eventNo: row.eventNo, content: '', assessment: '趋于平稳', needUpgrade: '否', nextVisitTime: '' }
|
|
trackForm.value = { eventNo: row.eventNo, content: '', assessment: '趋于平稳', needUpgrade: '否', nextVisitTime: '' }
|
|
|
|
|
+ // 尝试加载跟踪日志
|
|
|
|
|
+ loadTrackLogs(row.id)
|
|
|
trackVisible.value = true
|
|
trackVisible.value = true
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-function confirmTrack() {
|
|
|
|
|
- trackFormRef.value.validate(valid => {
|
|
|
|
|
- if (!valid) return
|
|
|
|
|
- const idx = eventList.value.findIndex(o => o.eventNo === trackForm.value.eventNo)
|
|
|
|
|
- if (idx > -1) {
|
|
|
|
|
- eventList.value[idx].timeline.push({
|
|
|
|
|
- time: new Date().toLocaleString(),
|
|
|
|
|
- title: '跟踪记录',
|
|
|
|
|
- content: trackForm.value.content + '(态势:' + trackForm.value.assessment + ',升级:' + trackForm.value.needUpgrade + ')',
|
|
|
|
|
- type: 'primary'
|
|
|
|
|
- })
|
|
|
|
|
- eventList.value[idx].lastVisitTime = new Date().toLocaleString()
|
|
|
|
|
- eventList.value[idx].nextVisitTime = trackForm.value.nextVisitTime
|
|
|
|
|
|
|
+async function loadTrackLogs(trackId) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ const res = await getTrackLogs(trackId)
|
|
|
|
|
+ if (res.data && currentRow.value) {
|
|
|
|
|
+ currentRow.value = { ...currentRow.value, timeline: res.data || [] }
|
|
|
}
|
|
}
|
|
|
|
|
+ } catch {
|
|
|
|
|
+ // 使用行内已有数据
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+async function confirmTrack() {
|
|
|
|
|
+ try {
|
|
|
|
|
+ await trackFormRef.value.validate()
|
|
|
|
|
+ } catch {
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ try {
|
|
|
|
|
+ await addTrackLog({
|
|
|
|
|
+ trackId: currentTrackId.value,
|
|
|
|
|
+ title: '跟踪记录',
|
|
|
|
|
+ content: trackForm.value.content,
|
|
|
|
|
+ assessment: trackForm.value.assessment,
|
|
|
|
|
+ needUpgrade: trackForm.value.needUpgrade,
|
|
|
|
|
+ type: 'primary'
|
|
|
|
|
+ })
|
|
|
|
|
+ ElMessage.success('跟踪记录保存成功')
|
|
|
trackVisible.value = false
|
|
trackVisible.value = false
|
|
|
- })
|
|
|
|
|
|
|
+ loadData()
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ ElMessage.error('保存失败:' + (error.message || '未知错误'))
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// ==================== 解除/关闭 ====================
|
|
// ==================== 解除/关闭 ====================
|
|
|
const closeVisible = ref(false)
|
|
const closeVisible = ref(false)
|
|
|
const closeFormRef = ref(null)
|
|
const closeFormRef = ref(null)
|
|
|
|
|
+const currentCloseRow = ref(null)
|
|
|
const closeForm = ref({ eventNo: '', summary: '', reason: '', remark: '' })
|
|
const closeForm = ref({ eventNo: '', summary: '', reason: '', remark: '' })
|
|
|
const closeRules = {
|
|
const closeRules = {
|
|
|
reason: [{ required: true, message: '请选择解除原因', trigger: 'change' }],
|
|
reason: [{ required: true, message: '请选择解除原因', trigger: 'change' }],
|
|
@@ -370,47 +341,63 @@ const closeRules = {
|
|
|
const closeTitle = ref('事件解除')
|
|
const closeTitle = ref('事件解除')
|
|
|
|
|
|
|
|
function handleClose(row) {
|
|
function handleClose(row) {
|
|
|
- currentRow.value = row
|
|
|
|
|
|
|
+ currentCloseRow.value = row
|
|
|
closeTitle.value = row.status === '处理中' ? '事件解除' : '事件关闭'
|
|
closeTitle.value = row.status === '处理中' ? '事件解除' : '事件关闭'
|
|
|
- closeForm.value = { eventNo: row.eventNo, summary: row.description, reason: '', remark: '' }
|
|
|
|
|
|
|
+ closeForm.value = { eventNo: row.eventNo, summary: row.description || '', reason: '', remark: '' }
|
|
|
closeVisible.value = true
|
|
closeVisible.value = true
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-function confirmClose() {
|
|
|
|
|
- closeFormRef.value.validate(valid => {
|
|
|
|
|
- if (!valid) return
|
|
|
|
|
- const idx = eventList.value.findIndex(o => o.eventNo === closeForm.value.eventNo)
|
|
|
|
|
- if (idx > -1) {
|
|
|
|
|
- if (eventList.value[idx].status === '处理中') {
|
|
|
|
|
- eventList.value[idx].status = '已解除'
|
|
|
|
|
- eventList.value[idx].timeline.push({
|
|
|
|
|
- time: new Date().toLocaleString(),
|
|
|
|
|
- title: '事件解除',
|
|
|
|
|
- content: '解除原因:' + closeForm.value.reason + ';' + closeForm.value.remark,
|
|
|
|
|
- type: 'success'
|
|
|
|
|
- })
|
|
|
|
|
- eventList.value[idx].nextVisitTime = '-'
|
|
|
|
|
- } else if (eventList.value[idx].status === '已解除') {
|
|
|
|
|
- eventList.value[idx].status = '已关闭'
|
|
|
|
|
- eventList.value[idx].timeline.push({
|
|
|
|
|
- time: new Date().toLocaleString(),
|
|
|
|
|
- title: '事件关闭',
|
|
|
|
|
- content: '事件已归档:' + closeForm.value.remark,
|
|
|
|
|
- type: 'info'
|
|
|
|
|
- })
|
|
|
|
|
- }
|
|
|
|
|
|
|
+async function confirmClose() {
|
|
|
|
|
+ try {
|
|
|
|
|
+ await closeFormRef.value.validate()
|
|
|
|
|
+ } catch {
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ try {
|
|
|
|
|
+ if (currentCloseRow.value.status === '处理中') {
|
|
|
|
|
+ await releaseEvent(currentCloseRow.value.id)
|
|
|
|
|
+ ElMessage.success('事件已解除')
|
|
|
|
|
+ } else if (currentCloseRow.value.status === '已解除') {
|
|
|
|
|
+ await closeEvent(currentCloseRow.value.id)
|
|
|
|
|
+ ElMessage.success('事件已关闭')
|
|
|
}
|
|
}
|
|
|
closeVisible.value = false
|
|
closeVisible.value = false
|
|
|
- })
|
|
|
|
|
|
|
+ loadData()
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ ElMessage.error('操作失败:' + (error.message || '未知错误'))
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// ==================== 删除 ====================
|
|
|
|
|
+async function handleDelete(row) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ await ElMessageBox.confirm('确定要删除该跟踪记录吗?', '删除确认', { type: 'warning' })
|
|
|
|
|
+ await deleteEventTrack(row.id)
|
|
|
|
|
+ ElMessage.success('删除成功')
|
|
|
|
|
+ loadData()
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ if (error !== 'cancel' && error !== 'close') {
|
|
|
|
|
+ ElMessage.error('删除失败:' + (error.message || '未知错误'))
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// ==================== 详情 ====================
|
|
// ==================== 详情 ====================
|
|
|
const detailVisible = ref(false)
|
|
const detailVisible = ref(false)
|
|
|
const currentRow = ref(null)
|
|
const currentRow = ref(null)
|
|
|
|
|
|
|
|
-function handleDetail(row) {
|
|
|
|
|
|
|
+async function handleDetail(row) {
|
|
|
currentRow.value = row
|
|
currentRow.value = row
|
|
|
detailVisible.value = true
|
|
detailVisible.value = true
|
|
|
|
|
+ // 尝试加载最新的跟踪日志
|
|
|
|
|
+ try {
|
|
|
|
|
+ const res = await getTrackLogs(row.id)
|
|
|
|
|
+ if (res.data && res.data.length) {
|
|
|
|
|
+ currentRow.value = { ...row, timeline: res.data }
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch {
|
|
|
|
|
+ // 使用行内已有数据
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|