| | |
| | | <div class="detail-title">绘制区域列表</div> |
| | | <div class="command-table-container"> |
| | | <div class="command-table-content"> |
| | | <el-table class="command-table" :data="shapeList" row-key="id"> |
| | | <el-table class="command-table" :data="shapeList" row-key="id" height="240"> |
| | | <el-table-column prop="areaType" label="区域类型"> |
| | | <template v-slot="{ row }"> |
| | | {{ resolveShapeAreaTypeLabel(row) }} |
| | |
| | | <div class="command-table-container"> |
| | | <div class="command-table-content"> |
| | | <el-table class="command-table" ref="deviceTableRef" :data="deviceOptions" row-key="id" |
| | | @row-click="handleDeviceRowClick"> |
| | | @row-click="handleDeviceRowClick" height="240"> |
| | | <el-table-column prop="deviceName" label="设备名称" /> |
| | | <el-table-column prop="deviceType" label="类型"> |
| | | <template v-slot="{ row }"> |
| | |
| | | |
| | | <div class="shape-table-container"> |
| | | <div class="shape-table-title">绘制区域列表</div> |
| | | <el-table class="command-table" :data="shapeList" row-key="id" height="auto"> |
| | | <el-table class="command-table" :data="shapeList" row-key="id" height="240"> |
| | | <el-table-column prop="areaType" label="区域类型"> |
| | | <template v-slot="{ row }"> |
| | | {{ resolveShapeAreaTypeLabel(row) }} |
| | |
| | | <el-form-item prop="deviceIds" label-width="0"> |
| | | <el-table class="command-table" ref="deviceTableRef" |
| | | :data="deviceOptions.filter(item => item.deviceName.includes(searchName))" row-key="id" |
| | | @selection-change="handleDeviceSelectionChange" @row-click="handleDeviceRowClick"> |
| | | @selection-change="handleDeviceSelectionChange" @row-click="handleDeviceRowClick" height="240"> |
| | | <el-table-column type="selection" width="55" :reserve-selection="true" /> |
| | | <el-table-column prop="deviceName" label="设备名称" /> |
| | | <el-table-column prop="deviceType" label="类型"> |
| | |
| | | let deviceRangeRenderToken = 0 |
| | | let deviceListTimer = null |
| | | let deviceListRequestToken = 0 |
| | | let deviceMapRequestToken = 0 |
| | | |
| | | const rules = { |
| | | areaName: fieldRules(true, 50), |
| | |
| | | deviceOptions.value = [] |
| | | selectedDeviceRows.value = [] |
| | | formData.value.deviceIds = '' |
| | | clearDeviceRangePrimitives() |
| | | clearDeviceIconEntities() |
| | | if (deviceTableRef.value) { |
| | | deviceTableRef.value.clearSelection() |
| | | } |
| | |
| | | if (wkt) polygons.push(wkt) |
| | | }) |
| | | return polygons |
| | | } |
| | | |
| | | async function renderDeviceRangeSingle (device) { |
| | | if (!viewer) return |
| | | clearDeviceRangePrimitives() |
| | | clearDeviceIconEntities() |
| | | const position = getDeviceLngLat(device) |
| | | if (!position) return |
| | | addDeviceIconEntity(device, position) |
| | | const rangeMeters = normalizeDeviceRange(device.effectiveRangeKm) |
| | | const primitive = await createDeviceRangePrimitive(viewer, position, rangeMeters) |
| | | if (!primitive) return |
| | | deviceRangePrimitiveMap.set(String(device?.id ?? Date.now()), primitive) |
| | | viewer.scene.primitives.add(primitive) |
| | | } |
| | | |
| | | async function renderDeviceRanges (rows) { |
| | |
| | | suppressDeviceFly.value = true |
| | | syncDeviceSelection() |
| | | suppressDeviceFly.value = prevSuppressDeviceFly |
| | | if (!readonly.value) { |
| | | renderDeviceRanges(selectedDeviceRows.value) |
| | | if (readonly.value) { |
| | | await renderDeviceRanges(deviceOptions.value) |
| | | } |
| | | } |
| | | |
| | | // 设备上图(新增/编辑用) |
| | | async function getDeviceListForMapDisplay () { |
| | | if (!visible.value || !viewer) return |
| | | deviceMapRequestToken += 1 |
| | | const requestToken = deviceMapRequestToken |
| | | const res = await fwDeviceListByPolygonsApi({ |
| | | areaId: dialogMode.value === 'add' ? '' : formData.value.id, |
| | | isAreaSelect: 1, |
| | | isTrack: 1, |
| | | }) |
| | | if (requestToken !== deviceMapRequestToken) return |
| | | const list = res?.data?.data ?? [] |
| | | if (!list.length) { |
| | | clearDeviceRangePrimitives() |
| | | clearDeviceIconEntities() |
| | | return |
| | | } |
| | | await renderDeviceRanges(list) |
| | | } |
| | | |
| | | // 关联设备变更 |
| | |
| | | selectedDeviceRows.value = rows |
| | | const ids = rows.map(item => item.id) |
| | | formData.value.deviceIds = ids.join(',') |
| | | renderDeviceRanges(rows) |
| | | if (suppressDeviceFly.value) { |
| | | lastSelectedDeviceIds = [...ids] |
| | | return |
| | |
| | | |
| | | function handleDeviceRowClick (row) { |
| | | if (readonly.value) { |
| | | renderDeviceRangeSingle(row) |
| | | void flyToDevice(row) |
| | | return |
| | | } |
| | | renderDeviceRanges(selectedDeviceRows.value) |
| | | void flyToDevice(row) |
| | | const isSelected = selectedDeviceRows.value.some(item => String(item?.id) === String(row?.id)) |
| | | if (isSelected) { |
| | | void flyToDevice(row) |
| | | } |
| | | } |
| | | |
| | | // 同步选择状态 |
| | |
| | | }) |
| | | selectedDeviceRows.value = rows |
| | | formData.value.deviceIds = rows.map(item => item.id).join(',') |
| | | if (readonly.value) { |
| | | renderDeviceRanges(selectedDeviceRows.value) |
| | | return |
| | | } |
| | | if (!deviceTableRef.value) return |
| | | deviceTableRef.value.clearSelection() |
| | | rows.forEach(row => { |
| | |
| | | lastSelectedDeviceIds = selectedDeviceRows.value.map(row => row.id) |
| | | await nextTick() |
| | | suppressDeviceFly.value = false |
| | | if (!readonly.value) { |
| | | renderDeviceRanges(selectedDeviceRows.value) |
| | | } |
| | | isDialogInitializing.value = false |
| | | queueDeviceListRefresh() |
| | | if (dialogMode.value === 'add' || dialogMode.value === 'edit') { |
| | | void getDeviceListForMapDisplay() |
| | | } |
| | | void getPoliceStationList() |
| | | } |
| | | |