| | |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <div class="label">设备需求</div> |
| | | <div class="val">{{ getDictLabel(formData.deviceLoadDemand, dictObj.deviceLoadDemand) }}</div> |
| | | <div class="val">{{ formData.deviceLoadDemand }}</div> |
| | | </el-col> |
| | | <el-col :span="24"> |
| | | <div class="label">工单备注</div> |
| | |
| | | @change="loadDemandChange" |
| | | > |
| | | <el-option |
| | | v-for="item in dictObj.deviceLoadDemand" |
| | | :key="item.dictKey" |
| | | :label="item.dictValue" |
| | | :value="item.dictKey" |
| | | v-for="item in payloadList" |
| | | :key="item.name" |
| | | :label="item.name" |
| | | :value="item.name" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | |
| | | <el-col :span="24"> |
| | | <el-form-item label="工单备注" prop="remark"> |
| | | <el-input |
| | | class="gd-input" |
| | | class="gd-input-text" |
| | | type="textarea" |
| | | :rows="3" |
| | | v-model="formData.remark" |
| | |
| | | <el-table |
| | | class="separateTable" |
| | | :empty-text=" |
| | | formData.deviceLoadDemand && pointList.length ? '暂无数据' : '请先选择设备需求并在地图上绘制工单范围' |
| | | pointList.length ? '暂无数据' : '请先在地图上绘制工单范围' |
| | | " |
| | | ref="deviceTableRef" |
| | | :data="formData.deviceLoadDemand && pointList.length ? deviceList : []" |
| | | :data="pointList.length ? deviceList : []" |
| | | row-key="id" |
| | | @selection-change="handleDeviceSelectionChange" |
| | | > |
| | |
| | | gdWorkOrderHandleStatusApi, |
| | | gdWorkOrderSaveApi, |
| | | } from './orderManageApi' |
| | | import { gdManageDeviceListApi } from './gdManageDeviceApi' |
| | | import { gdDevicePayloadListApi, gdManageDeviceListApi } from './gdManageDeviceApi' |
| | | import { cartesian3Convert } from '@/utils/cesium/mapUtil' |
| | | import * as Cesium from 'cesium' |
| | | import { DrawPolygon } from '@ztzf/utils' |
| | |
| | | const suddenlyEdit = ref(false) |
| | | const processList = ref([]) |
| | | let viewPlane |
| | | let allDeviceList = [] |
| | | const hasPatrolTaskList = computed(() => ['30', '40', '50', '60'].includes(String(formData.value.workOrderStatus))) |
| | | |
| | | const gdStatusObj = { |
| | |
| | | workOrderName: fieldRules(true, 50), |
| | | workOrderType: fieldRules(true), |
| | | executeStartTime: fieldRules(true), |
| | | deviceLoadDemand: fieldRules(true), |
| | | } |
| | | |
| | | // 操作类型:1接单,2拒接接单,3申请取消,4申请修改, 5同意取消 |
| | |
| | | |
| | | // 新增模式绘制 |
| | | function addPolygon() { |
| | | drawPolygonExample = new DrawPolygon(viewer) |
| | | drawPolygonExample = new DrawPolygon({ deviceList: allDeviceList }) |
| | | drawPolygonExample.initHandler(viewer) |
| | | drawPolygonExample.subscribe('getPolygonPositions', drawFinished) |
| | | } |
| | |
| | | if (!formData.value?.geom) return |
| | | pointList.value = geomAnalysis(formData.value.geom) |
| | | drawPolygonExample?.destroy() |
| | | drawPolygonExample = new DrawPolygon(viewer) |
| | | drawPolygonExample = new DrawPolygon({ deviceList: allDeviceList }) |
| | | let noClosedList = _.cloneDeep(pointList.value) |
| | | noClosedList.pop() |
| | | drawPolygonExample.initPolygon( |
| | |
| | | }) |
| | | } |
| | | |
| | | // 生成圆形坐标点 |
| | | function buildCirclePositions(center, radius, segments = 120) { |
| | | const cartographic = Cesium.Cartographic.fromCartesian(center) |
| | | const positions = [] |
| | | for (let i = 0; i < segments; i++) { |
| | | const angle = (i / segments) * 2 * Math.PI |
| | | const lat = cartographic.latitude + (radius / 6378137) * Math.cos(angle) |
| | | const lon = cartographic.longitude + (radius / (6378137 * Math.cos(cartographic.latitude))) * Math.sin(angle) |
| | | positions.push(Cesium.Cartesian3.fromRadians(lon, lat)) |
| | | } |
| | | return positions |
| | | } |
| | | |
| | | // 渲染 |
| | | function renderingAllDevice(list) { |
| | | list.forEach(item => { |
| | |
| | | width: 30, |
| | | height: 30, |
| | | verticalOrigin: Cesium.VerticalOrigin.CENTER, |
| | | heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, |
| | | }, |
| | | label: { |
| | | text: item.nickname, |
| | |
| | | outlineWidth: 2, |
| | | outlineColor: Cesium.Color.WHITE, |
| | | horizontalOrigin: Cesium.HorizontalOrigin.CENTER, |
| | | heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, |
| | | verticalOrigin: Cesium.VerticalOrigin.BOTTOM, |
| | | pixelOffset: new Cesium.Cartesian2(0, -20), |
| | | }, |
| | | }) |
| | | // 覆盖范围 - 5km圆形区域 |
| | | viewer.entities.add({ |
| | | position: position, |
| | | ellipse: { |
| | | semiMajorAxis: 5000, |
| | | semiMinorAxis: 5000, |
| | | material: Cesium.Color.fromBytes(45, 140, 240, 80), |
| | | outline: false, |
| | | heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, |
| | | }, |
| | | }) |
| | | // 覆盖范围描边线 - 贴地 |
| | | const circlePositions = buildCirclePositions(position, 5000) |
| | | viewer.entities.add({ |
| | | polyline: { |
| | | positions: [...circlePositions, circlePositions[0]], |
| | | clampToGround: true, |
| | | width: 2, |
| | | material: Cesium.Color.fromBytes(45, 140, 240, 255), |
| | | }, |
| | | }) |
| | | }) |
| | | } |
| | | |
| | | const payloadList = ref([]) |
| | | function getPayloadList() { |
| | | gdDevicePayloadListApi().then(res => { |
| | | payloadList.value = res.data.data |
| | | }) |
| | | } |
| | | |
| | | // 打开弹框 |
| | | async function open({ mode = 'add', row } = {}) { |
| | | dialogMode.value = mode |
| | | getPayloadList() |
| | | initMap() |
| | | const allDeviceRes = await gdManageDeviceListApi() |
| | | formData.value = dialogMode.value === 'add' ? initForm() : row |
| | | renderingAllDevice(allDeviceRes?.data?.data || []) |
| | | allDeviceList = allDeviceRes?.data?.data || [] |
| | | renderingAllDevice(allDeviceList) |
| | | if (dialogMode.value === 'add') { |
| | | addPolygon() |
| | | } else { |
| | |
| | | flex-direction: column; |
| | | |
| | | .gd-cesium { |
| | | position: relative; |
| | | overflow: hidden; |
| | | width: 100%; |
| | | min-height: 360px; |
| | | flex: 1; |
| | |
| | | width: 350px; |
| | | display: flex; |
| | | flex-direction: column; |
| | | |
| | | .title { |
| | | font-weight: 500; |
| | | font-size: 14px; |
| | | color: #272e37; |
| | | } |
| | | |
| | | ::v-deep(.el-table) { |
| | | tr th { |
| | | font-weight: normal; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .processBox { |