| | |
| | | <h3>多设备测试编排</h3> |
| | | <p v-if="group">当前设备组:{{ group.groupName }}({{ group.deviceCount || '-' }} 台设备)</p> |
| | | <p v-else class="warning">请先在左侧选择一个设备组</p> |
| | | <p v-if="group && loadDeviceName" class="sub-info">上大车设备:{{ loadDeviceName }}</p> |
| | | </div> |
| | | <el-button type="primary" :disabled="!group" :loading="loading" @click="handleSubmit"> |
| | | <el-icon><Promotion /></el-icon> |
| | | 启动测试 |
| | | </el-button> |
| | | <div class="action-buttons"> |
| | | <el-button |
| | | type="danger" |
| | | plain |
| | | :disabled="!group || !loadDeviceId || loadDeviceLoading" |
| | | :loading="clearLoading" |
| | | @click="handleClearPlc" |
| | | > |
| | | <el-icon><Delete /></el-icon> |
| | | 清空PLC |
| | | </el-button> |
| | | <el-button type="primary" :disabled="!group" :loading="loading" @click="handleSubmit"> |
| | | <el-icon><Promotion /></el-icon> |
| | | 启动测试 |
| | | </el-button> |
| | | </div> |
| | | </div> |
| | | |
| | | <el-form :model="form" label-width="120px"> |
| | |
| | | <script setup> |
| | | import { computed, reactive, ref, watch } from 'vue' |
| | | import { ElMessage } from 'element-plus' |
| | | import { Promotion } from '@element-plus/icons-vue' |
| | | import { Delete, Promotion } from '@element-plus/icons-vue' |
| | | import { multiDeviceTaskApi } from '@/api/device/multiDeviceTask' |
| | | import { deviceGroupApi, deviceInteractionApi } from '@/api/device/deviceManagement' |
| | | |
| | | const props = defineProps({ |
| | | group: { |
| | |
| | | |
| | | const glassIdsInput = ref('') |
| | | const loading = ref(false) |
| | | const clearLoading = ref(false) |
| | | const loadDeviceId = ref(null) |
| | | const loadDeviceName = ref('') |
| | | const loadDeviceLoading = ref(false) |
| | | |
| | | watch( |
| | | () => props.group, |
| | | () => { |
| | | glassIdsInput.value = '' |
| | | fetchLoadDevice() |
| | | } |
| | | ) |
| | | |
| | |
| | | .map((item) => item.trim()) |
| | | .filter((item) => item.length > 0) |
| | | }) |
| | | |
| | | const fetchLoadDevice = async () => { |
| | | loadDeviceId.value = null |
| | | loadDeviceName.value = '' |
| | | if (!props.group) { |
| | | return |
| | | } |
| | | const groupId = props.group.id || props.group.groupId |
| | | if (!groupId) { |
| | | return |
| | | } |
| | | loadDeviceLoading.value = true |
| | | try { |
| | | const response = await deviceGroupApi.getGroupDevices(groupId) |
| | | const rawList = response?.data |
| | | const deviceList = Array.isArray(rawList) |
| | | ? rawList |
| | | : Array.isArray(rawList?.records) |
| | | ? rawList.records |
| | | : Array.isArray(rawList?.data) |
| | | ? rawList.data |
| | | : [] |
| | | const targetDevice = |
| | | deviceList.find((item) => (item.deviceType || '').toUpperCase() === 'LOAD_VEHICLE') || |
| | | deviceList[0] |
| | | if (targetDevice && targetDevice.id) { |
| | | loadDeviceId.value = targetDevice.id |
| | | loadDeviceName.value = targetDevice.deviceName || targetDevice.deviceCode || `ID: ${targetDevice.id}` |
| | | } |
| | | } catch (error) { |
| | | console.error('加载设备信息失败:', error) |
| | | ElMessage.error(error?.message || '获取设备信息失败') |
| | | } finally { |
| | | loadDeviceLoading.value = false |
| | | } |
| | | } |
| | | |
| | | const handleSubmit = async () => { |
| | | if (!props.group) { |
| | |
| | | ElMessage.error(error?.message || '任务启动失败') |
| | | } finally { |
| | | loading.value = false |
| | | } |
| | | } |
| | | |
| | | const handleClearPlc = async () => { |
| | | if (!props.group) { |
| | | ElMessage.warning('请先选择设备组') |
| | | return |
| | | } |
| | | if (!loadDeviceId.value) { |
| | | ElMessage.warning('未找到上大车设备,无法清空PLC') |
| | | return |
| | | } |
| | | try { |
| | | clearLoading.value = true |
| | | const response = await deviceInteractionApi.executeOperation({ |
| | | deviceId: loadDeviceId.value, |
| | | operation: 'clearGlass', |
| | | params: { |
| | | positionCode: form.positionCode || null |
| | | } |
| | | }) |
| | | if (response?.code !== 200) { |
| | | throw new Error(response?.message || 'PLC清空失败') |
| | | } |
| | | const result = response?.data |
| | | if (result?.success) { |
| | | ElMessage.success(result?.message || 'PLC已清空') |
| | | glassIdsInput.value = '' |
| | | } else { |
| | | throw new Error(result?.message || 'PLC清空失败') |
| | | } |
| | | } catch (error) { |
| | | console.error('清空PLC失败:', error) |
| | | ElMessage.error(error?.message || 'PLC清空失败') |
| | | } finally { |
| | | clearLoading.value = false |
| | | } |
| | | } |
| | | </script> |
| | |
| | | .panel-header .warning { |
| | | color: #f56c6c; |
| | | } |
| | | |
| | | .panel-header .sub-info { |
| | | margin-top: 4px; |
| | | color: #606266; |
| | | font-size: 12px; |
| | | } |
| | | |
| | | .action-buttons { |
| | | display: flex; |
| | | gap: 12px; |
| | | align-items: center; |
| | | } |
| | | </style> |
| | | |