吉安感知网项目-前端
罗广辉
2026-01-26 ae2ba65b0294fa9bdb07ce898e451d3034a9cdd5
feat: 航线
2 files modified
83 ■■■■ changed files
applications/task-work-order/src/api/zkxt/index.js 8 ●●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/ViewDiaLog.vue 75 ●●●● patch | view | raw | blame | history
applications/task-work-order/src/api/zkxt/index.js
@@ -37,4 +37,12 @@
    })
}
// 获取航线详情
export const queryAirById = (id) => {
    return request({
        url: `/webservice/webservice/airline/queryById/${id}`,
        method: 'get',
    })
}
applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/ViewDiaLog.vue
@@ -66,9 +66,11 @@
                        </el-col>
                    </el-row>
                    <template v-if="['6', '7', '8'].includes(taskStatus)">
                        <div class="detail-title" :style="{ marginTop: pxToRem(10) }">任务成功({{ list.length || 0 }}条)</div>
                        <div class="detail-title" :style="{ marginTop: pxToRem(10) }">
                            任务成功({{ taskResultList.length || 0 }}条)
                        </div>
                        <div class="imgBox">
                            <div v-for="item in list">
                            <div v-for="item in taskResultList">
                                <el-image
                                    v-if="item.resultUrl"
                                    :src="item.resultUrl"
@@ -190,14 +192,13 @@
                    :layer-mode="4"
                    :boundary="false"
                    :zoomToBoundary="false"
                    @ready="() => mapRef.flyBoundary()"
                    @ready="readyMap"
                />
            </div>
        </div>
        <template #footer>
            <template v-if="requester">
                <el-button v-if="['1', '4'].includes(taskStatus)" @click="viewDescription" color="#F2F3F5">
                    {{ gdStatusObj[taskStatus].reason }}
                </el-button>
@@ -237,7 +238,7 @@
<script setup>
import { computed, ref, onMounted } from 'vue'
import { ElMessage } from 'element-plus'
import { fieldRules, getDictLabel } from '@ztzf/utils'
import { fieldRules, flyVisual, getDictLabel } from '@ztzf/utils'
import { gdPatrolTaskRepublish, gdFlyerPageApi, gdPatrolTaskAuditApi } from './inspectionRequestApi'
import { gdWorkOrderFlowListApi, gdWorkOrderPageApi } from '../orderManage/orderManageApi'
import { gdManageDeviceListApi } from '../orderManage/gdManageDeviceApi'
@@ -247,6 +248,8 @@
import RefuseOrderDialog from '@/views/orderView/orderManage/orderManage/RefuseOrderDialog.vue'
import RefuseOrderDialog1 from '@/views/orderView/orderManage/inspectionRequest/RefuseOrderDialog1.vue'
import { Check } from '@element-plus/icons-vue'
import { queryAirById } from '@/api/zkxt'
import * as Cesium from 'cesium'
// 初始化表单数据
const initForm = () => ({
@@ -388,7 +391,7 @@
const processList = ref([])
// 加载时间线list
function loadList() {
    gdWorkOrderFlowListApi({ workOrderId: formData.value.id,type: '1' }).then(res => {
    gdWorkOrderFlowListApi({ workOrderId: formData.value.id, type: '1' }).then(res => {
        processList.value = res.data.data
    })
}
@@ -408,25 +411,74 @@
    }
}
let list = ref([])
let taskResultList = ref([])
// 获取成果列表
async function getList() {
async function getTaskResultList() {
    if (!formData.value?.id) return
    try {
        const res = await gdTaskResultListApi({ patrolTaskId: formData.value.id })
        list.value = res?.data?.data ?? []
        taskResultList.value = res?.data?.data ?? []
    } finally {
    }
}
// 获取航线详情
function getAirDetails() {
    queryAirById(formData.value.patrolRouteUrl).then(res => {
        const list = res.data.data.airlineWaypoints
        if (!list.length) return mapRef.value?.flyBoundary()
        const result = list.map(item => [Number(item.longitude), Number(item.latitude)]).flat()
        viewer.entities.add({
            polyline: {
                positions: Cesium.Cartesian3.fromDegreesArray(result),
                clampToGround: true,
                width: 3,
                material: Cesium.Color.RED,
            },
        })
        // 渲染起点(蓝色)
        const startPoint = list[0]
        viewer.entities.add({
            position: Cesium.Cartesian3.fromDegrees(Number(startPoint.longitude), Number(startPoint.latitude), startPoint.height || 0),
            point: {
                pixelSize: 12,
                color: Cesium.Color.BLUE,
                outlineColor: Cesium.Color.WHITE,
                outlineWidth: 2,
                heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
            },
        })
        // 渲染终点(红色)
        const endPoint = list[list.length - 1]
        viewer.entities.add({
            position: Cesium.Cartesian3.fromDegrees(Number(endPoint.longitude), Number(endPoint.latitude), endPoint.height || 0),
            point: {
                pixelSize: 12,
                color: Cesium.Color.RED,
                outlineColor: Cesium.Color.WHITE,
                outlineWidth: 2,
                heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
            },
        })
        flyVisual({
            positionsData: list.map(i => [Number(i.longitude), Number(i.latitude), i.height || 0]),
            viewer,
        })
    })
}
// 打开弹框
async function open({ mode = 'view', row } = {}) {
    dialogMode.value = mode
    formData.value = { ...initForm(), ...row }
    console.log(row)
    ;['6', '7', '8'].includes(row.taskStatus) && getList()
    ;['6', '7', '8'].includes(row.taskStatus) && getTaskResultList()
    loadList()
    initMap()
}
const readyMap = () => {
    // mapRef.value?.flyBoundary()
    getAirDetails()
}
// 初始化地图实例
@@ -456,7 +508,6 @@
            width: 100%;
            height: 423px;
        }
    }
    .processBox {
        width: 312px;