From 6e88705bd5b443a259b24c17c8a299765d059d96 Mon Sep 17 00:00:00 2001
From: shuishen <1109946754@qq.com>
Date: Thu, 23 Jul 2026 16:50:41 +0800
Subject: [PATCH] Merge branch 'master' of http://139.196.74.78:10010/r/jagzwxm/ja_web

---
 applications/drone-command/src/views/dataCockpit/components/DeviceHistoryDialog.vue |  401 +++++++++++++++++++++++++++------------------------------
 1 files changed, 190 insertions(+), 211 deletions(-)

diff --git a/applications/drone-command/src/views/dataCockpit/components/DeviceHistoryDialog.vue b/applications/drone-command/src/views/dataCockpit/components/DeviceHistoryDialog.vue
index 828427c..b7190b3 100644
--- a/applications/drone-command/src/views/dataCockpit/components/DeviceHistoryDialog.vue
+++ b/applications/drone-command/src/views/dataCockpit/components/DeviceHistoryDialog.vue
@@ -1,67 +1,82 @@
 <template>
-	<el-dialog
-		class="ztzf-dialog-mange data-cockpit-history-dialog"
-		append-to-body
-		v-model="visibleModel"
-		:title="dialogTitle"
-		width="1100px"
-		:close-on-click-modal="false"
-		:destroy-on-close="true"
-	>
-		<div class="dialog-body">
-			<div class="device-summary">
-				<div class="item">
-					<span class="label">设备名称</span>
-					<span class="value">{{ device?.name || '反制设备名称' }}</span>
-				</div>
-				<div class="item">
-					<span class="label">类型</span>
-					<span class="value">{{ device?.type || '-' }}</span>
-				</div>
-				<div class="item">
-					<span class="label">厂商</span>
-					<span class="value">{{ device?.vendor || '-' }}</span>
-				</div>
-				<div class="item">
-					<span class="label">状态</span>
-					<span class="value">{{ device?.statusText || '-' }}</span>
-				</div>
+	<el-dialog class="command-dialog" append-to-body v-model="visibleModel" :title="dialogTitle"
+		:close-on-click-modal="false" :destroy-on-close="true">
+		<el-form ref="queryParamsRef" :model="searchParams" class="command-dialog-history-search">
+			<el-form-item label="关键字" prop="keyword">
+				<el-input class="command-input" v-model="searchParams.keyword" placeholder="名称/序列号" clearable
+					@clear="handleSearch" />
+			</el-form-item>
+
+			<el-form-item prop="dateRange">
+				<el-date-picker class="command-date-picker" popper-class="command-date-picker-popper"
+					v-model="searchParams.dateRange" type="daterange" range-separator="至" start-placeholder="开始日期"
+					end-placeholder="结束日期" value-format="YYYY/MM/DD" @change="handleSearch" />
+			</el-form-item>
+
+			<el-form-item label="区域" prop="area">
+				<el-tree-select class="command-select" popper-class="command-tree-select-popper"
+					v-model="searchParams.area" :data="areaTree" :props="areaTreeProps" node-key="value" check-strictly
+					filterable :filter-node-method="filterAreaNode" clearable placeholder="请选择"
+					@change="handleSearch" />
+			</el-form-item>
+
+			<el-form-item label="无人机类型" prop="droneType">
+				<el-select class="command-select" popper-class="command-select-popper" v-model="searchParams.droneType"
+					placeholder="请选择" clearable @change="handleSearch">
+					<el-option v-for="item in dictObj.droneType" :key="item.dictKey" :label="item.dictValue"
+						:value="item.dictKey" />
+				</el-select>
+			</el-form-item>
+
+			<el-form-item class="history-search-actions">
+				<el-button :icon="RefreshRight" @click="resetForm"></el-button>
+				<el-button class="search-btn" :icon="Search" @click="handleSearch"></el-button>
+			</el-form-item>
+		</el-form>
+
+		<div class="command-table-container" v-loading="loading" element-loading-background="rgba(5, 5, 15, 0.6)">
+			<div class="command-table-content">
+				<el-table class="command-table" :data="list">
+					<el-table-column type="index" width="60" label="序号" />
+					<el-table-column prop="droneName" label="无人机名称" min-width="120" />
+					<el-table-column prop="droneSerialNo" label="无人机序列号" min-width="140" />
+					<el-table-column label="无人机类型" min-width="110">
+						<template #default="{ row }">
+							{{ getDroneTypeText(row.droneType) }}
+						</template>
+					</el-table-column>
+					<el-table-column prop="areaName" show-overflow-tooltip label="区域" min-width="90" />
+					<el-table-column prop="deviceName" show-overflow-tooltip label="数据来源" min-width="110" />
+					<el-table-column label="信号频段" min-width="100">
+						<template #default="{ row }">
+							{{ formatFrequency(row.signalFreqMhz) }}
+						</template>
+					</el-table-column>
+					<el-table-column prop="alarmTime" label="发现时间" min-width="150" />
+					<el-table-column prop="stayDuration" label="停留时间" min-width="110" />
+					<el-table-column label="反制方式" min-width="110">
+						<template #default="{ row }">
+							{{ getCounterWayText(row.counterWay) }}
+						</template>
+					</el-table-column>
+				</el-table>
 			</div>
 
-			<div class="table">
-				<div class="thead">
-					<div class="cell index">序号</div>
-					<div class="cell">无人机名称</div>
-					<div class="cell">无人机序列号</div>
-					<div class="cell">无人机类型</div>
-					<div class="cell">区域</div>
-					<div class="cell">数据来源</div>
-					<div class="cell">信号频段</div>
-					<div class="cell">发现时间</div>
-					<div class="cell">停留时间</div>
-					<div class="cell">反制方式</div>
-				</div>
-				<div class="tbody">
-					<div class="tr" v-for="(row, index) in historyList" :key="row.id">
-						<div class="cell index">{{ index + 1 }}</div>
-						<div class="cell">{{ row.droneName }}</div>
-						<div class="cell">{{ row.serialNumber }}</div>
-						<div class="cell">{{ row.droneType }}</div>
-						<div class="cell">{{ row.area }}</div>
-						<div class="cell">{{ row.dataSource }}</div>
-						<div class="cell">{{ row.frequency }}</div>
-						<div class="cell">{{ row.discoveredAt }}</div>
-						<div class="cell">{{ row.stayTime }}</div>
-						<div class="cell">{{ row.counterMethod }}</div>
-					</div>
-				</div>
+			<div class="command-table-pagination">
+				<el-pagination popper-class="command-select-popper" v-model:current-page="searchParams.current"
+					v-model:page-size="searchParams.size" layout="total, prev, pager, next, sizes" :total="total"
+					@change="getList" />
 			</div>
 		</div>
 	</el-dialog>
 </template>
 
 <script setup>
-import { computed } from 'vue'
+import { Search, RefreshRight } from '@element-plus/icons-vue'
+import { computed, ref, watch } from 'vue'
+import { getDictionaryByCode } from '@/api/system/dictbiz'
+import { alarmLogApi, areaDivideListApi } from '@/api/dataCockpit'
+import { getDictLabel,dateRangeFormat } from '@ztzf/utils'
 
 const props = defineProps({
 	modelValue: {
@@ -82,164 +97,128 @@
 })
 
 const dialogTitle = computed(() => {
-	return `反制设备名称 ${props.device?.name || ''}`.trim()
+	return `${props.device?.name || ''}`.trim()
 })
 
-const historyList = computed(() => {
-	const dataSource = props.device?.name || '侦测反制设备名称'
-	return [
-		{
-			id: 'his_001',
-			droneName: '无人机名称',
-			serialNumber: 'XLH789456',
-			droneType: '微型机',
-			area: '古村区',
-			dataSource,
-			frequency: '5800MHZ',
-			discoveredAt: '2025/12/26 12:15:26',
-			stayTime: '00:10:50',
-			counterMethod: '信号干扰'
-		},
-		{
-			id: 'his_002',
-			droneName: '无人机名称',
-			serialNumber: 'XLH789456',
-			droneType: '微型机',
-			area: '古村区',
-			dataSource,
-			frequency: '5800MHZ',
-			discoveredAt: '2025/12/26 12:18:06',
-			stayTime: '00:08:12',
-			counterMethod: '信号干扰'
-		},
-		{
-			id: 'his_003',
-			droneName: '无人机名称',
-			serialNumber: 'XLH789456',
-			droneType: '微型机',
-			area: '古村区',
-			dataSource,
-			frequency: '2400MHZ',
-			discoveredAt: '2025/12/26 12:22:31',
-			stayTime: '00:06:09',
-			counterMethod: '诱导驱离'
-		},
-		{
-			id: 'his_004',
-			droneName: '无人机名称',
-			serialNumber: 'XLH789456',
-			droneType: '微型机',
-			area: '古村区',
-			dataSource,
-			frequency: '2400MHZ',
-			discoveredAt: '2025/12/26 12:28:44',
-			stayTime: '00:12:03',
-			counterMethod: '诱导驱离'
-		},
-		{
-			id: 'his_005',
-			droneName: '无人机名称',
-			serialNumber: 'XLH789456',
-			droneType: '微型机',
-			area: '古村区',
-			dataSource,
-			frequency: '5800MHZ',
-			discoveredAt: '2025/12/26 12:32:10',
-			stayTime: '00:04:39',
-			counterMethod: '信号干扰'
-		},
-		{
-			id: 'his_006',
-			droneName: '无人机名称',
-			serialNumber: 'XLH789456',
-			droneType: '微型机',
-			area: '古村区',
-			dataSource,
-			frequency: '5800MHZ',
-			discoveredAt: '2025/12/26 12:36:42',
-			stayTime: '00:07:21',
-			counterMethod: '信号干扰'
-		}
-	]
+const initSearchParams = () => ({
+	keyword: '',
+	dateRange: [],
+	area: '',
+	droneType: '',
+	current: 1,
+	size: 10
 })
+const searchParams = ref(initSearchParams())
+const queryParamsRef = ref(null)
+const loading = ref(true)
+const list = ref([])
+const total = ref(0)
+const dictObj = ref({
+	droneType: []
+})
+const areaTree = ref([])
+const areaTreeProps = {
+	label: 'label',
+	children: 'children'
+}
+
+
+const fetchDictList = async () => {
+	const res = await getDictionaryByCode('droneType')
+	dictObj.value = res?.data?.data ?? { droneType: [] }
+}
+
+
+const filterAreaNode = (value, data) => {
+	if (!value) return true
+	return (data?.label || '').includes(value)
+}
+
+const fetchAreaTree = async () => {
+	try {
+		const res = await areaDivideListApi()
+		const list = res?.data?.data ?? []
+		areaTree.value = list
+			.filter((item) => item?.areaName)
+			.map((item) => ({
+				label: item.areaName,
+				value: item.areaName
+			}))
+	} catch (error) {
+		areaTree.value = []
+	}
+}
+
+const getList = async () => {
+	if (!props.device?.id) {
+		list.value = []
+		total.value = 0
+		return
+	}
+	const [startTime, endTime] = dateRangeFormat(searchParams.value.dateRange) || []
+	const keyword = (searchParams.value.keyword || '').trim()
+	const params = {
+		alarmType: '2',
+		deviceId: props.device.id,
+		current: searchParams.value.current,
+		size: searchParams.value.size,
+		startTime,
+		endTime,
+		areaName: searchParams.value.area || undefined,
+		droneType: searchParams.value.droneType || undefined,
+		droneName: keyword || undefined,
+	}
+	loading.value = true
+	try {
+		const res = await alarmLogApi(params)
+		list.value = res?.data?.data?.records ?? []
+		total.value = res?.data?.data?.total ?? 0
+	} finally {
+		loading.value = false
+	}
+}
+
+function handleSearch () {
+	searchParams.value.current = 1
+	getList()
+}
+
+function resetForm () {
+	searchParams.value = initSearchParams()
+
+	getList()
+}
+
+const formatFrequency = (value) => {
+	if (value == null || value === '') return '-'
+	return `${value}MHZ`
+}
+
+const getCounterWayText = (value) => {
+	if (value === 1 || value === '1') return '信号干扰'
+	if (value === 2 || value === '2') return '诱导驱离'
+	if (value === 3 || value === '3') return '无'
+	return value || '-'
+}
+
+const getDroneTypeText = (value) => {
+	return getDictLabel(value, dictObj.value.droneType) || value || '-'
+}
+
+watch(
+	() => visibleModel.value,
+	(visible) => {
+		if (visible) {
+			searchParams.value.current = 1
+			fetchDictList()
+			fetchAreaTree()
+			getList()
+		} else {
+			searchParams.value = initSearchParams()
+		}
+	}
+)
+
 </script>
 
-<style lang="scss" scoped>
-.dialog-body {
-	display: flex;
-	flex-direction: column;
-	gap: 16px;
-	color: #C3C3DD;
-}
-
-.device-summary {
-	display: flex;
-	flex-wrap: wrap;
-	gap: 16px 24px;
-
-	.item {
-		display: flex;
-		align-items: center;
-		gap: 8px;
-		font-size: 14px;
-
-		.label {
-			color: #8B8BA7;
-		}
-
-		.value {
-			color: #FFFFFF;
-		}
-	}
-}
-
-.table {
-	border: 1px solid rgba(255, 255, 255, 0.1);
-	border-radius: 6px;
-	overflow: hidden;
-}
-
-.thead,
-.tr {
-	display: grid;
-	grid-template-columns: 60px 1.1fr 1.1fr 0.9fr 0.8fr 1.2fr 0.9fr 1.3fr 0.9fr 0.9fr;
-	align-items: center;
-}
-
-.thead {
-	background: rgba(20, 24, 48, 0.9);
-	color: #FFFFFF;
-	font-size: 13px;
-	height: 42px;
-	border-bottom: 1px solid rgba(255, 255, 255, 0.08);
-}
-
-.tbody {
-	max-height: 360px;
-	overflow-y: auto;
-	background: rgba(10, 14, 34, 0.6);
-}
-
-.tr {
-	font-size: 12px;
-	color: #C3C3DD;
-	height: 40px;
-	border-bottom: 1px solid rgba(255, 255, 255, 0.05);
-
-	&:nth-child(2n) {
-		background: rgba(255, 255, 255, 0.02);
-	}
-}
-
-.cell {
-	padding: 0 10px;
-	white-space: nowrap;
-	overflow: hidden;
-	text-overflow: ellipsis;
-
-	&.index {
-		text-align: center;
-		color: #86909C;
-	}
-}
-</style>
+<style lang="scss" scoped></style>

--
Gitblit v1.9.3