From 89380e6260a75d1d3b94de687ebcc2f50d50659d Mon Sep 17 00:00:00 2001
From: shuishen <1109946754@qq.com>
Date: Tue, 03 Feb 2026 15:44:33 +0800
Subject: [PATCH] feat:环境变量配置调整

---
 applications/drone-command/src/views/detectionCountermeasure/taskSchedule/FormDiaLog.vue |  254 ++++++++++++++++++++++++++++----------------------
 1 files changed, 142 insertions(+), 112 deletions(-)

diff --git a/applications/drone-command/src/views/detectionCountermeasure/taskSchedule/FormDiaLog.vue b/applications/drone-command/src/views/detectionCountermeasure/taskSchedule/FormDiaLog.vue
index 82dc2bd..a217adb 100644
--- a/applications/drone-command/src/views/detectionCountermeasure/taskSchedule/FormDiaLog.vue
+++ b/applications/drone-command/src/views/detectionCountermeasure/taskSchedule/FormDiaLog.vue
@@ -1,153 +1,156 @@
-<template>
-	<el-dialog v-model="visible" :title="titleEnum[dialogMode]">
-		<div v-if="readonly">
+<template>
+	<el-dialog class="command-page-view-dialog" v-model="visible" :title="titleEnum[dialogMode]" destroy-on-close
+		:close-on-click-modal="false" @closed="handleClosed">
+		<div v-if="readonly" class="detail-container">
 			<el-row>
 				<el-col :span="12">
-					<div>设备名称: {{ formData.deviceName }}</div>
+					<div class="label">设备名称</div>
+					<div class="val">{{ formData.deviceName }}</div>
 				</el-col>
 				<el-col :span="12">
-					<div>设备编码: {{ formData.deviceCode }}</div>
+					<div class="label">设备编码</div>
+					<div class="val">{{ formData.deviceSn }}</div>
 				</el-col>
 				<el-col :span="12">
-					<div>设备状态: {{ getDeviceStatusLabel(formData.deviceStatus) }}</div>
+					<div class="label">区域</div>
+					<div class="val">{{ formData.areaDivideName }}</div>
 				</el-col>
 				<el-col :span="12">
-					<div>场景: {{ formData.defenseSceneName }}</div>
+					<div class="label">场景</div>
+					<div class="val">{{ formData.defenseSceneName }}</div>
 				</el-col>
 				<el-col :span="12">
-					<div>区域: {{ formData.areaDivideName }}</div>
+					<div class="label">调度人员</div>
+					<div class="val">{{ formData.dispatchUser }}</div>
 				</el-col>
 				<el-col :span="12">
-					<div>调度人员: {{ formData.dispatchUser }}</div>
+					<div class="label">调度位置</div>
+					<div class="val">{{ formData.longitude }}, {{ formData.latitude }}</div>
 				</el-col>
 				<el-col :span="12">
-					<div>调度位置: {{ formData.longitude }}, {{ formData.latitude }}</div>
-				</el-col>
-				<el-col :span="12">
-					<div>调度日期: {{ formData.dispatchStartTime }} ~ {{ formData.dispatchEndTime }}</div>
+					<div class="label">调度日期</div>
+					<div class="val">{{ formData.dispatchStartTime }} ~ {{ formData.dispatchEndTime }}</div>
 				</el-col>
 				<el-col :span="24">
-					<div>调度内容: {{ formData.dispatchContent }}</div>
+					<div class="label">调度内容</div>
+					<div class="val">{{ formData.dispatchContent }}</div>
 				</el-col>
 				<el-col :span="24">
-					<div>调度结果: {{ formData.dispatchResult }}</div>
+					<div class="label">调度结果</div>
+					<div class="val">{{ formData.dispatchResult }}</div>
 				</el-col>
 				<el-col :span="24">
-					<div>处理措施: {{ formData.disposeMeasure }}</div>
+					<div class="label">处理措施</div>
+					<div class="val">{{ formData.disposeMeasure }}</div>
 				</el-col>
 			</el-row>
 		</div>
-		<el-form v-else ref="formRef" :model="formData" :rules="rules" :disabled="readonly" label-width="100px">
+		<el-form v-else ref="formRef" :model="formData" :rules="rules" :disabled="readonly" label-width="100px"
+			class="dialog-form">
 			<el-row>
 				<el-col :span="12">
-					<el-form-item label="设备名称" prop="deviceId">
-						<el-select v-model="formData.deviceId" placeholder="请选择" clearable @change="handleDeviceChange">
-							<el-option v-for="item in deviceList" :key="item.id" :label="item.deviceName" :value="item.id" />
+					<el-form-item label="设备" prop="deviceId">
+						<el-select class="command-select" popper-class="command-select-popper"
+							v-model="formData.deviceId" placeholder="请选择" clearable @change="handleDeviceChange">
+							<el-option v-for="item in deviceList" :key="item.id" :label="item.deviceName"
+								:value="item.id" />
 						</el-select>
 					</el-form-item>
 				</el-col>
 				<el-col :span="12">
-					<el-form-item label="设备编码" prop="deviceCode">
-						<el-input v-model="formData.deviceCode" disabled placeholder="选择设备后自动带出" />
+					<el-form-item label="设备编码" prop="deviceSn">
+						<el-input class="command-input" v-model="formData.deviceSn" disabled placeholder="选择设备后自动带出" />
 					</el-form-item>
 				</el-col>
 				<el-col :span="12">
-					<el-form-item label="设备状态" prop="deviceStatus">
-						<el-input v-model="formData.deviceStatusLabel" disabled placeholder="选择设备后自动带出" />
+					<el-form-item label="设备状态">
+						<el-select class="command-select" popper-class="command-select-popper"
+							v-model="deviceStatus" disabled placeholder="选择设备后自动带出">
+							<el-option v-for="item in dictObj.deviceStatus" :key="item.dictKey" :label="item.dictValue"
+								:value="item.dictKey" />
+						</el-select>
 					</el-form-item>
 				</el-col>
+
 				<el-col :span="12">
 					<el-form-item label="场景" prop="defenseSceneId">
-						<el-select v-model="formData.defenseSceneId" placeholder="请选择" clearable @change="handleSceneChange">
-							<el-option v-for="item in sceneList" :key="item.id" :label="item.sceneName" :value="item.id" />
+						<el-select class="command-select" popper-class="command-select-popper"
+							v-model="formData.defenseSceneId" placeholder="请选择" clearable
+							 @change="handleSceneChange">
+							<el-option v-for="item in sceneList" :key="item.id" :label="item.sceneName"
+								:value="item.id" />
 						</el-select>
 					</el-form-item>
 				</el-col>
+
 				<el-col :span="12">
 					<el-form-item label="区域" prop="areaDivideId">
-						<el-select
-							v-model="formData.areaDivideId"
-							placeholder="请先选择场景"
-							clearable
-							:disabled="!formData.defenseSceneId"
-						>
-							<el-option v-for="item in areaList" :key="item.id" :label="item.areaName" :value="item.id" />
+						<el-select class="command-select" popper-class="command-select-popper"
+							v-model="formData.areaDivideId" placeholder="请先选择场景" clearable
+							:disabled="!formData.defenseSceneId" @change="handleAreaChange">
+							<el-option v-for="item in areaList" :key="item.id" :label="item.areaName"
+								:value="item.id" />
 						</el-select>
 					</el-form-item>
 				</el-col>
+
 				<el-col :span="12">
-					<el-form-item label="调度人员" prop="dispatchUser">
-						<el-input v-model="formData.dispatchUser" maxlength="50" placeholder="请输入" clearable />
-					</el-form-item>
-				</el-col>
-				<el-col :span="12">
-					<el-form-item label="调度日期" prop="dispatchDateRange">
-						<el-date-picker
-							v-model="formData.dispatchDateRange"
-							type="datetimerange"
-							range-separator="至"
-							start-placeholder="开始日期"
-							end-placeholder="结束日期"
-							value-format="YYYY-MM-DD HH:mm:ss"
-						/>
-					</el-form-item>
-				</el-col>
-				<el-col :span="24">
 					<el-form-item label="调度位置" prop="longitude">
-						<el-button @click="selectLocation" style="width: 100%">
+						<!--						<el-button @click="selectLocation" style="width: 100%">-->
+						<el-button style="width: 100%">
 							{{
-								formData.longitude && formData.latitude ? `${formData.longitude}, ${formData.latitude}` : '点击选择位置'
+								formData.longitude && formData.latitude ? `${formData.longitude}, ${formData.latitude}` :
+									'选择区域后自动带出'
 							}}
 						</el-button>
 					</el-form-item>
 				</el-col>
+
+				<el-col :span="12">
+					<el-form-item label="调度人员" prop="dispatchUser">
+						<el-input class="command-input" v-model="formData.dispatchUser" maxlength="50" placeholder="请输入"
+							clearable />
+					</el-form-item>
+				</el-col>
+				<el-col :span="12">
+					<el-form-item label="调度日期" prop="dispatchDateRange">
+						<el-date-picker class="command-date-picker" popper-class="command-date-picker-popper"
+							v-model="formData.dispatchDateRange" type="daterange" range-separator="至"
+							start-placeholder="开始日期" end-placeholder="结束日期" value-format="YYYY-MM-DD HH:mm:ss" />
+					</el-form-item>
+				</el-col>
+				
 				<el-col :span="24">
 					<el-form-item label="调度内容" prop="dispatchContent">
-						<el-input
-							v-model="formData.dispatchContent"
-							type="textarea"
-							:rows="3"
-							maxlength="500"
-							placeholder="请输入"
-							clearable
-						/>
+						<el-input class="command-input" v-model="formData.dispatchContent" type="textarea" :rows="3"
+							maxlength="500" placeholder="请输入" clearable />
 					</el-form-item>
 				</el-col>
 				<el-col :span="24">
 					<el-form-item label="调度结果" prop="dispatchResult">
-						<el-input
-							v-model="formData.dispatchResult"
-							type="textarea"
-							:rows="3"
-							maxlength="500"
-							placeholder="请输入"
-							clearable
-						/>
+						<el-input class="command-input" v-model="formData.dispatchResult" type="textarea" :rows="3"
+							maxlength="500" placeholder="请输入" clearable />
 					</el-form-item>
 				</el-col>
 				<el-col :span="24">
 					<el-form-item label="处理措施" prop="disposeMeasure">
-						<el-input
-							v-model="formData.disposeMeasure"
-							type="textarea"
-							:rows="3"
-							maxlength="500"
-							placeholder="请输入"
-							clearable
-						/>
+						<el-input class="command-input" v-model="formData.disposeMeasure" type="textarea" :rows="3"
+							maxlength="500" placeholder="请输入" clearable />
 					</el-form-item>
 				</el-col>
 			</el-row>
 		</el-form>
+
 		<template #footer>
-			<el-button @click="handleCancel">{{ readonly ? '关闭' : '取消' }}</el-button>
-			<el-button v-if="!readonly" type="primary" :loading="submitting" :disabled="submitting" @click="handleSubmit">
-				确定
+			<el-button v-if="dialogMode != 'view'" color="#2B2B4C" @click="handleCancel">{{ readonly ? '关闭' : '取消' }}</el-button>
+			<el-button color="#284FE3" v-if="!readonly" type="primary" :loading="submitting" :disabled="submitting"
+				@click="handleSubmit">
+				保存
 			</el-button>
 		</template>
 
 		<el-dialog v-model="visible1" title="选择位置" destroy-on-close @closed="positionClosed">
-			<div class="ztzf-cesium" id="mapContainer"></div>
+			<div class="command-cesium" id="mapContainer"></div>
 			<template #footer>
 				<el-button @click="handleMapCancel">取消</el-button>
 				<el-button type="primary" @click="handleMapConfirm">确定</el-button>
@@ -157,18 +160,21 @@
 </template>
 
 <script setup>
-import { computed, nextTick, ref, inject } from 'vue'
+import { computed, nextTick, ref } from 'vue'
 import { ElMessage } from 'element-plus'
 import { fwTaskScheduleDetailApi, fwTaskScheduleSubmitApi } from './taskScheduleApi'
 import { fwAreaDivideListApi } from '@/views/areaManage/partition/partitionApi'
+import { fwDefenseSceneListApi } from '@/views/areaManage/sceneConfig/sceneConfigApi'
 import { fieldRules } from '@ztzf/utils'
 import { PublicCesium } from '@/utils/cesium/publicCesium'
 import * as Cesium from 'cesium'
+import { saveOperationLog } from '@ztzf/apis'
+import { useRoute } from 'vue-router'
 
 // 初始化表单
 const initForm = () => ({
 	deviceId: '', // 设备ID
-	deviceCode: '', // 设备编码
+	deviceSn: '', // 设备编码
 	deviceName: '', // 设备名称
 	deviceStatus: '', // 设备状态
 	deviceStatusLabel: '', // 设备状态标签
@@ -189,11 +195,9 @@
 })
 
 const props = defineProps({
-	sceneList: { type: Array, default: () => [] },
 	deviceList: { type: Array, default: () => [] },
 })
 
-// 注入字典数据
 const dictObj = inject('dictObj')
 
 const emit = defineEmits(['success'])
@@ -207,39 +211,44 @@
 const titleEnum = ref({ edit: '编辑', view: '查看', add: '新增' })
 const tempLocation = ref({ longitude: null, latitude: null })
 const areaList = ref([]) // 区域列表
+const sceneList = ref([]) // 场景列表
+const deviceStatus = ref('')
+const route = useRoute()
 
 const rules = {
-	deviceId: [{ required: true, message: '请选择设备', trigger: 'change' }],
-	defenseSceneId: [{ required: true, message: '请选择场景', trigger: 'change' }],
-	areaDivideId: [{ required: true, message: '请选择区域', trigger: 'change' }],
+	deviceId: fieldRules(true),
+	areaDivideId: fieldRules(true),
+	defenseSceneId: fieldRules(true),
 	dispatchUser: fieldRules(true, 50),
-}
-
-// 获取设备状态标签
-function getDeviceStatusLabel(status) {
-	const statusMap = { 0: '离线', 1: '在线' }
-	return statusMap[status] || status
+	dispatchDateRange: fieldRules(true),
 }
 
 // 设备选择变化处理
-function handleDeviceChange(deviceId) {
+function handleDeviceChange (deviceId) {
 	const device = props.deviceList.find(item => item.id === deviceId)
 	if (device) {
 		formData.value.deviceName = device.deviceName
-		formData.value.deviceCode = device.deviceCode
+		formData.value.deviceSn = device.deviceSn
 		formData.value.deviceStatus = device.deviceStatus
-		formData.value.deviceStatusLabel = getDeviceStatusLabel(device.deviceStatus)
+		deviceStatus.value = String(device.status)
 	} else {
 		formData.value.deviceName = ''
-		formData.value.deviceCode = ''
+		formData.value.deviceSn = ''
 		formData.value.deviceStatus = ''
-		formData.value.deviceStatusLabel = ''
+		deviceStatus.value = ''
 	}
 }
 
+async function handleAreaChange (areaId) {
+	const find = areaList.value.find(item => item.id === areaId)
+	formData.value.longitude = find?.longitude
+	formData.value.latitude = find?.latitude
+}
+
 // 场景选择变化处理
-async function handleSceneChange(sceneId) {
+async function handleSceneChange (sceneId) {
 	formData.value.areaDivideId = ''
+
 	if (sceneId) {
 		await loadAreaList(sceneId)
 	} else {
@@ -248,18 +257,28 @@
 }
 
 // 加载区域列表
-async function loadAreaList(sceneId) {
-	const res = await fwAreaDivideListApi({ sceneId })
+async function loadAreaList (sceneId) {
+	const res = await fwAreaDivideListApi({sceneId})
 	areaList.value = res?.data?.data ?? []
 }
 
+// 加载场景列表
+async function loadSceneList() {
+	const res = await fwDefenseSceneListApi()
+	sceneList.value = res?.data?.data ?? []
+}
+
 // 关闭弹框
-function handleCancel() {
+function handleCancel () {
 	visible.value = false
 }
 
+function handleClosed () {
+	formData.value = initForm()
+}
+
 // 提交新增/编辑
-async function handleSubmit() {
+async function handleSubmit () {
 	const isValid = await formRef.value?.validate().catch(() => false)
 	if (!isValid) return
 	submitting.value = true
@@ -270,6 +289,14 @@
 			formData.value.dispatchEndTime = formData.value.dispatchDateRange[1]
 		}
 		await fwTaskScheduleSubmitApi(formData.value)
+
+		const actionText = dialogMode.value === 'add' ? '新增' : '修改'
+		saveOperationLog({
+			requestUri: route.path,
+			title: `${route.name || '任务调度'}-${actionText}`,
+			type: 1
+		})
+
 		ElMessage.success(dialogMode.value === 'add' ? '新增成功' : '更新成功')
 		visible.value = false
 		emit('success')
@@ -279,13 +306,12 @@
 }
 
 // 加载详情
-async function loadDetail() {
+async function loadDetail () {
 	if (!formData.value.id) return
 	const res = await fwTaskScheduleDetailApi({ id: formData.value.id })
 	const data = res?.data?.data ?? {}
 	formData.value = {
 		...data,
-		deviceStatusLabel: getDeviceStatusLabel(data.deviceStatus),
 		dispatchDateRange:
 			data.dispatchStartTime && data.dispatchEndTime ? [data.dispatchStartTime, data.dispatchEndTime] : [],
 	}
@@ -296,7 +322,7 @@
 }
 
 // 左键点击事件处理
-function LeftClickEvent(click) {
+function LeftClickEvent (click) {
 	const pos = click.position
 	const cartesian3 = viewer.camera.pickEllipsoid(pos, viewer.scene.globe.ellipsoid)
 	if (!cartesian3) {
@@ -318,7 +344,7 @@
 				text: `${longitude.toFixed(6)}, ${latitude.toFixed(6)}`,
 				font: '14px',
 				fillColor: Cesium.Color.WHITE,
-				backgroundColor: Cesium.Color.BLACK.withAlpha(0.45),
+				backgroundColor: Cesium.Color.BLACK.withAlpha(0.6),
 				backgroundPadding: new Cesium.Cartesian2(5, 5),
 				pixelOffset: new Cesium.Cartesian2(0, -20),
 				showBackground: true,
@@ -337,7 +363,7 @@
 }
 
 // 地图弹框关闭处理
-function positionClosed() {
+function positionClosed () {
 	redPointEntity = null
 }
 
@@ -345,7 +371,7 @@
 let redPointEntity
 
 // 选择位置
-async function selectLocation() {
+async function selectLocation () {
 	visible1.value = true
 	await nextTick()
 	const publicCesiumInstance = new PublicCesium({
@@ -360,13 +386,13 @@
 }
 
 // 地图取消
-function handleMapCancel() {
+function handleMapCancel () {
 	tempLocation.value = { longitude: null, latitude: null }
 	visible1.value = false
 }
 
 // 地图确认
-function handleMapConfirm() {
+function handleMapConfirm () {
 	if (tempLocation.value.longitude != null && tempLocation.value.latitude != null) {
 		formData.value.longitude = _.round(tempLocation.value.longitude, 6)
 		formData.value.latitude = _.round(tempLocation.value.latitude, 6)
@@ -375,7 +401,7 @@
 }
 
 // 打开弹框
-async function open({ mode, row } = {}) {
+async function open ({ mode, row } = {}) {
 	dialogMode.value = mode || 'add'
 	formData.value = dialogMode.value === 'add' ? initForm() : { ...row }
 	if (dialogMode.value !== 'add') {
@@ -384,6 +410,10 @@
 }
 
 defineExpose({ open })
+
+onMounted(() => {
+	loadSceneList()
+})
 </script>
 <style scoped lang="scss">
 #mapContainer {

--
Gitblit v1.9.3