From 86c2d61ba9d33f1886cfc904dcaf17f033e4c80a Mon Sep 17 00:00:00 2001
From: shuishen <1109946754@qq.com>
Date: Sat, 17 Jan 2026 13:52:53 +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 |  383 ++++++++++++++++++++++++------------------------------
 1 files changed, 173 insertions(+), 210 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..a266041 100644
--- a/applications/drone-command/src/views/dataCockpit/components/DeviceHistoryDialog.vue
+++ b/applications/drone-command/src/views/dataCockpit/components/DeviceHistoryDialog.vue
@@ -1,67 +1,80 @@
 <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-data-cockpit-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-data-cockpit-search-input" v-model="searchParams.keyword" placeholder="名称/序列号"
+					clearable @clear="handleSearch" />
+			</el-form-item>
+
+			<el-form-item prop="dateRange">
+				<el-date-picker class="command-data-cockpit-date-picker"
+					popper-class="command-data-cockpit-tree-select-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-data-cockpit-select" popper-class="command-data-cockpit-tree-select-popper"
+					v-model="searchParams.area" :data="areaTree" :props="areaTreeProps" node-key="value" check-strictly
+					clearable placeholder="请选择" @change="handleSearch" />
+			</el-form-item>
+
+			<el-form-item label="无人机类型" prop="droneType">
+				<el-select class="command-data-cockpit-select" popper-class="command-data-cockpit-select-popper"
+					v-model="searchParams.droneType" placeholder="请选择" clearable @change="handleSearch">
+					<el-option v-for="item in droneTypeOptions" :key="item.value" :label="item.label"
+						:value="item.value" />
+				</el-select>
+			</el-form-item>
+
+			<el-form-item class="history-search-actions">
+				<el-button :icon="RefreshRight" @click="resetForm"></el-button>
+				<el-button :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-data-cockpit-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" label="区域" min-width="90" />
+					<el-table-column prop="deviceName" 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-data-cockpit-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 { alarmLogApi } from '@/api/dataCockpit'
 
 const props = defineProps({
 	modelValue: {
@@ -85,161 +98,111 @@
 	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 areaTree = ref([
+	{
+		label: '古村区',
+		value: '古村区'
+	},
+	{
+		label: '新区',
+		value: '新区'
+	},
+	{
+		label: '产业园',
+		value: '产业园'
+	}
+])
+const areaTreeProps = {
+	label: 'label',
+	children: 'children'
+}
+
+const droneTypeOptions = [
+	{ label: '微型机', value: '1' },
+	{ label: '植保机', value: '2' }
+]
+
+const getList = async () => {
+	if (!props.device?.id) {
+		list.value = []
+		total.value = 0
+		return
+	}
+	const [startTime, endTime] = 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) => {
+	if (value === 1 || value === '1') return '微型机'
+	if (value === 2 || value === '2') return '植保机'
+	return value || '-'
+}
+
+watch(
+	() => visibleModel.value,
+	(visible) => {
+		if (visible) {
+			searchParams.value.current = 1
+			getList()
+		}
+	}
+)
+
 </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