吉安感知网项目-前端
shuishen
2026-01-31 f3e09a76a7f5147072374b80285901ff69ee2cfe
Merge branch 'master' of http://139.196.74.78:10010/r/jagzwxm/ja_web
14 files modified
1 files renamed
14 files deleted
6177 ■■■■■ changed files
applications/drone-command/src/utils/cesium/DrawPolygon.js 817 ●●●●● patch | view | raw | blame | history
applications/drone-command/src/views/areaManage/defenseZone/FormDiaLog.vue 4 ●●●● patch | view | raw | blame | history
applications/drone-command/src/views/areaManage/partition/FormDiaLog copy.vue 4 ●●●● patch | view | raw | blame | history
applications/drone-command/src/views/layerManagement/components/folderFile.vue 316 ●●●●● patch | view | raw | blame | history
applications/drone-command/src/views/layerManagement/components/leftList.vue 588 ●●●●● patch | view | raw | blame | history
applications/drone-command/src/views/layerManagement/components/nationalSpatialPlanning.vue 49 ●●●●● patch | view | raw | blame | history
applications/drone-command/src/views/layerManagement/components/rightEdit.vue 471 ●●●●● patch | view | raw | blame | history
applications/drone-command/src/views/layerManagement/components/utils.js 619 ●●●●● patch | view | raw | blame | history
applications/drone-command/src/views/layerManagement/index.vue 604 ●●●●● patch | view | raw | blame | history
applications/task-work-order/env/.env 2 ●●●●● patch | view | raw | blame | history
applications/task-work-order/env/.env.development 2 ●●●●● patch | view | raw | blame | history
applications/task-work-order/src/components/PlaybackVideo/PlaybackVideo.vue 141 ●●●●● patch | view | raw | blame | history
applications/task-work-order/src/components/PlaybackVideo/components/MapContainer.vue 227 ●●●●● patch | view | raw | blame | history
applications/task-work-order/src/components/PlaybackVideo/components/PhotoList.vue 187 ●●●●● patch | view | raw | blame | history
applications/task-work-order/src/components/PlaybackVideo/components/VideoPlayer.vue 170 ●●●●● patch | view | raw | blame | history
applications/task-work-order/src/components/map-container/mapContainer.vue 172 ●●●●● patch | view | raw | blame | history
applications/task-work-order/src/main.js 2 ●●●●● patch | view | raw | blame | history
applications/task-work-order/src/router/views/index.js 25 ●●●●● patch | view | raw | blame | history
applications/task-work-order/src/utils/cesium/publicCesium.js 80 ●●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderDataManage/dataObjection/FormDiaLog.vue 7 ●●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderDataManage/dataObjection/dataObjectionApi.js 9 ●●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderDataManage/dataObjection/index.vue 6 ●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/orderManage/FormDiaLog.vue 18 ●●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/resource/components/spotDetails.vue 955 ●●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/resource/patchManagement.vue 569 ●●●●● patch | view | raw | blame | history
packages/utils/map/DrawPolygon.js 43 ●●●●● patch | view | raw | blame | history
packages/utils/map/index.js 45 ●●●●● patch | view | raw | blame | history
packages/utils/package.json 36 ●●●●● patch | view | raw | blame | history
pnpm-lock.yaml 9 ●●●●● patch | view | raw | blame | history
applications/drone-command/src/utils/cesium/DrawPolygon.js
File was deleted
applications/drone-command/src/views/areaManage/defenseZone/FormDiaLog.vue
@@ -16,7 +16,7 @@
            <div class="right-container">
                <div class="header">
                    <span>{{ titleEnum[dialogMode] }}</span>
                    <el-icon class="close-btn" @click.stop="visible = false"><Close /></el-icon>
                </div>
@@ -105,7 +105,7 @@
import { fwDefenseSceneListApi } from '@/views/areaManage/sceneConfig/sceneConfigApi'
import { fieldRules, geomAnalysis, getDictLabel } from '@ztzf/utils'
import CommonCesiumMap from '@/components/map-container/common-cesium-map.vue'
import { DrawPolygon } from '@/utils/cesium/DrawPolygon'
import { DrawPolygon } from '@ztzf/utils'
import { cartesian3Convert } from '@/utils/cesium/mapUtil'
import * as turf from '@turf/turf'
import * as Cesium from 'cesium'
applications/drone-command/src/views/areaManage/partition/FormDiaLog copy.vue
@@ -17,7 +17,7 @@
            <div class="right-container">
                <div class="header">
                    <span>{{ titleEnum[dialogMode] }}</span>
                    <el-icon class="close-btn" @click.stop="visible = false"><Close /></el-icon>
                </div>
@@ -180,7 +180,7 @@
import { useRoute } from 'vue-router'
import { fieldRules, geomAnalysis, getDictLabel } from '@ztzf/utils'
import CommonCesiumMap from '@/components/map-container/common-cesium-map.vue'
import { DrawPolygon } from '@/utils/cesium/DrawPolygon'
import { DrawPolygon } from '@ztzf/utils'
import { cartesian3Convert } from '@/utils/cesium/mapUtil'
import * as turf from '@turf/turf'
import * as Cesium from 'cesium'
applications/drone-command/src/views/layerManagement/components/folderFile.vue
File was deleted
applications/drone-command/src/views/layerManagement/components/leftList.vue
File was deleted
applications/drone-command/src/views/layerManagement/components/nationalSpatialPlanning.vue
File was deleted
applications/drone-command/src/views/layerManagement/components/rightEdit.vue
File was deleted
applications/drone-command/src/views/layerManagement/components/utils.js
File was deleted
applications/drone-command/src/views/layerManagement/index.vue
File was deleted
applications/task-work-order/env/.env
@@ -21,3 +21,5 @@
# 预览地址 previewURL
VITE_APP_PREVIEW_URL=http://192.168.1.204:8012
VITE_APP_TERRAIN_URL=https://wrj.shuixiongit.com/aiskyminio/cloud-bucket/ztzf_c_uas/
applications/task-work-order/env/.env.development
@@ -31,8 +31,6 @@
# 航线文件地址
VITE_APP_AIRLINE_URL = https://wrj.shuixiongit.com/minio/cloud-bucket
# 图片存放地址
VITE_APP_TERRAIN_URL = https://wrj.shuixiongit.com/aiskyminio/cloud-bucket/ztzf_terrain/
# 行政区划存放地址
VITE_APP_REGION_URL = https://wrj.shuixiongit.com/aiskyminio/cloud-bucket/ztzf_region
# 算法仓库图片地址
applications/task-work-order/src/components/PlaybackVideo/PlaybackVideo.vue
File was deleted
applications/task-work-order/src/components/PlaybackVideo/components/MapContainer.vue
File was deleted
applications/task-work-order/src/components/PlaybackVideo/components/PhotoList.vue
File was deleted
applications/task-work-order/src/components/PlaybackVideo/components/VideoPlayer.vue
File was deleted
applications/task-work-order/src/components/map-container/mapContainer.vue
File was deleted
applications/task-work-order/src/main.js
@@ -50,7 +50,6 @@
// 业务组件
import tenantPackage from './views/system/tenantpackage.vue'
// 地图依赖
import mapContainer from './components/map-container/mapContainer.vue'
import * as DC from '@dvgis/dc-sdk'
import '@dvgis/dc-sdk/dist/dc.min.css'
@@ -102,7 +101,6 @@
app.component('thirdRegister', thirdRegister)
app.component('flowDesign', flowDesign)
app.component('tenantPackage', tenantPackage)
app.component('mapContainer', mapContainer)
app.config.globalProperties.$dayjs = dayjs
app.config.globalProperties.website = website
applications/task-work-order/src/router/views/index.js
@@ -134,29 +134,4 @@
      },
    ],
  },
  {
    path: '/resource',
    component: Layout,
    redirect: '/resource/patchManagement',
    children: [
      {
        path: 'patchManagement',
        name: '图斑管理',
        meta: {
          i18n: 'info',
        },
        component: () => import(/* webpackChunkName: "views" */ '@/views/resource/patchManagement.vue'),
      },
      {
        path: 'patchTypeManagement',
        name: '图斑类型管理',
        meta: {
          i18n: 'info',
        },
        component: () => import(/* webpackChunkName: "views" */ '@/views/resource/patchTypeManagement.vue'),
      },
    ],
  },
]
applications/task-work-order/src/utils/cesium/publicCesium.js
@@ -146,52 +146,7 @@
        this.viewer?.cesiumWidget.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK) // 禁用双击
        if (terrain) {
            try {
                const noTerrainMechanism = ['1962779164650135554']
                if (noTerrainMechanism.includes(store.state.user.userInfo?.deptId)) {
                    // 使用Cesium World Terrain
                    Cesium.createWorldTerrainAsync({
                        requestWaterMask: false,    // 请求水域效果
                        requestVertexNormals: true // 请求光照和地形法线
                    }).then(terrainProvider => {
                        this.viewer.terrainProvider = terrainProvider
                        terrainLoadCallback?.()
                    })
                } else {
                    /*// 正则:第一位非0,第二位任意数字,后10位都是0
                    const re = /^[1-9]\d0{10}$/
                    let result = null
                    // 1️⃣先判断 areaCode
                    if (re.test(store.state.user.userInfo.detail.areaCode)) {
                        result = store.state.user.userInfo.detail.areaCode.slice(0, 6)
                    } else {
                        // 2️⃣如果不满足,从 ancestors 里找
                        const matchedItems = store.state.user.userInfo.detail.ancestors
                            .split(',')
                            .filter(item => re.test(item)) // 过滤出符合条件的
                        // 取第一个符合条件的前6位(可以改成 last one 看需求)
                        if (matchedItems.length > 0) {
                            result = matchedItems[0].slice(0, 6)
                        }
                    }
                    // 使用公司地形
                    Cesium.CesiumTerrainProvider.fromUrl(`${import.meta.env.VITE_APP_TERRAIN_URL}${result}`, {
                        requestVertexNormals: true, // 启用地形法线增强立体感
                        requestWaterMask: true, // 启用水体遮罩效果
                    }).then(terrainProvider => {
                        this.viewer.terrainProvider = terrainProvider
                        terrainLoadCallback?.()
                    })*/
                }
            } catch (error) {
                console.error('地形加载失败:', error)
            }
        }
        this.setTerrainVisible(terrain, terrainLoadCallback)
        this.viewer.scene.screenSpaceCameraController.maximumZoomDistance = 4500000
        this.switchLayers(layerMode)
@@ -205,6 +160,39 @@
            this.viewer.resolutionScale = dpr // 设置分辨率缩放比例
        }
    }
    async ensureTerrainProvider () {
        if (this.terrainProvider) return this.terrainProvider
        if (this.terrainLoading) return this.terrainLoading
        this.terrainLoading = Cesium.CesiumTerrainProvider.fromUrl(
            `${import.meta.env.VITE_APP_TERRAIN_URL}ja_terrain`,
            {
                requestVertexNormals: true, // 启用地形法线增强立体感
                requestWaterMask: true, // 启用水体遮罩效果
            }
        ).then(provider => {
            this.terrainProvider = provider
            return provider
        })
        return this.terrainLoading
    }
    async setTerrainVisible (visible, terrainLoadCallback) {
        if (!this.viewer) return
        if (!visible) {
            this.viewer.terrainProvider = new Cesium.EllipsoidTerrainProvider()
            this.terrainEnabled = false
            return
        }
        try {
            const provider = await this.ensureTerrainProvider()
            if (!this.viewer) return
            this.viewer.terrainProvider = provider
            this.terrainEnabled = true
            terrainLoadCallback?.()
        } catch (error) {
            this.terrainEnabled = false
        }
    }
    getViewer () {
        return this.viewer
applications/task-work-order/src/views/orderView/orderDataManage/dataObjection/FormDiaLog.vue
@@ -50,7 +50,7 @@
                    <div class="val">{{ formData.reviewOpinion  }}</div>
                </el-col>
            </el-row>
            <div v-if=" detailObjectionStatus === '1' && !requesterProvider">
            <div v-if=" detailObjectionStatus === '1' && permission.orderData_feedback">
                <div class="detail-title" :style="{ marginTop:pxToRem(20)}">异议反馈</div>
                <el-form ref="feedbackFormRef" class="gd-dialog-form" :model="feedbackFormData"
                                 :rules="feedbackRules" label-width="140px">
@@ -188,7 +188,7 @@
    </el-button>
    <el-button class="" color="#4C34FF" :loading="submitting || uploading" :disabled="submitting || uploading" @click="handleApply">申请</el-button>
            </template>
            <template v-if="dialogReadonly && detailObjectionStatus === '1' && !requesterProvider">
            <template v-if="dialogReadonly && detailObjectionStatus === '1' && permission.orderData_feedback">
                <el-button color="#F2F3F5" :loading="submitting" :disabled="submitting" @click="visible = false">取消</el-button>
                <el-button
@@ -270,7 +270,8 @@
import { pxToRem } from '@/utils/rem'
import { useStore } from 'vuex'
const store = useStore()
const requesterProvider = computed(() => store.state.user.userInfo?.role_id === '2014158512610869250')
const permission = computed(() => store.state.user.permission);
// const requesterProvider = computed(() => store.state.user.userInfo?.role_id === '2014158512610869250')
// 初始化表单数据
const initForm = () => ({
    id:'',
applications/task-work-order/src/views/orderView/orderDataManage/dataObjection/dataObjectionApi.js
@@ -45,3 +45,12 @@
    })
}
export const getDeptTreeListApi = tenantId => {
    return request({
        url: '/blade-system/dept/tree',
        method: 'get',
        params: {
            tenantId,
        },
    });
};
applications/task-work-order/src/views/orderView/orderDataManage/dataObjection/index.vue
@@ -98,7 +98,7 @@
import { Search, RefreshRight, Plus, Delete } from '@element-plus/icons-vue'
import { onMounted, ref, provide, nextTick } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { getDeptTree } from '@/api/system/dept'
import { getDeptTreeListApi } from './dataObjectionApi'
import { getDictLabel } from '@ztzf/utils'
import FormDiaLog from './FormDiaLog.vue'
import {
@@ -125,7 +125,7 @@
const deptTree = ref([]) // 部门树
const dictObj = ref({}) // 字典对象
const treeProps = {
    label: 'name',
    label: 'title',
    children: 'children',
}
const detailObjectionStatus = ref('')
@@ -183,7 +183,7 @@
// 获取部门树
function getDeptTreeFun() {
    getDeptTree().then(res => {
    getDeptTreeListApi().then(res => {
        deptTree.value = res.data.data
    })
}
applications/task-work-order/src/views/orderView/orderManage/orderManage/FormDiaLog.vue
@@ -11,8 +11,8 @@
        <div class="content" style="display: flex">
            <div class="processBox" v-if="dialogMode !== 'add' && processList.length">
                <div class="detail-title">工单记录</div>
                <div class="process" >
                    <OrderStepBar :processList="processList"/>
                <div class="process">
                    <OrderStepBar :processList="processList" />
                </div>
            </div>
            <div class="leftBox">
@@ -269,7 +269,7 @@
import { gdManageDeviceListApi } from './gdManageDeviceApi'
import { cartesian3Convert } from '@/utils/cesium/mapUtil'
import * as Cesium from 'cesium'
import { DrawPolygon } from '@/utils/cesium/DrawPolygon'
import { DrawPolygon } from '@ztzf/utils'
import { pxToRem } from '@/utils/rem'
import dayjs from 'dayjs'
import RefuseOrderDialog from '@/views/orderView/orderManage/orderManage/RefuseOrderDialog.vue'
@@ -514,11 +514,17 @@
    viewPlane = viewer.entities?.add({
        customType: 'control_group',
        position: Cesium.Cartesian3.fromDegrees(result[0], result[1]),
        polygon: {
            hierarchy: Cesium.Cartesian3.fromDegreesArray(result),
            material: Cesium.Color.fromBytes(45, 140, 240, 99),
            outline: false,
            heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
        },
        polyline: {
            positions: Cesium.Cartesian3.fromDegreesArray(result),
            clampToGround: true,
            width: 3,
            material: Cesium.Color.RED,
            width: 2,
            material: Cesium.Color.fromBytes(45, 140, 240, 255),
        },
    })
    flyVisual({
@@ -679,7 +685,7 @@
        display: flex;
        flex-direction: column;
        .process{
        .process {
            height: 100%;
            padding: 12px 16px 24px 16px;
            width: 312px;
applications/task-work-order/src/views/resource/components/spotDetails.vue
File was deleted
applications/task-work-order/src/views/resource/patchManagement.vue
File was deleted
packages/utils/map/DrawPolygon.js
File was renamed from applications/task-work-order/src/utils/cesium/DrawPolygon.js
@@ -1,9 +1,8 @@
import * as Cesium from 'cesium'
import * as turf from '@turf/turf'
import { boxTransformScale } from '@/utils/turfFunc'
import { ElMessage } from 'element-plus'
import { getPointPositionsHeight } from '@/utils/cesium/mapUtil'
import { flyVisual } from '@ztzf/utils'
import { flyVisual, getPointPositionsHeight } from './index'
import { MapTooltip } from './MapTooltip'
/**
 * 多边形绘制与编辑工具类
@@ -65,6 +64,8 @@
        this.delPoint = this.delPoint.bind(this)
        // 外部订阅者
        this.listeners = []
        // 绘制提示 tooltip
        this.drawingTooltip = null
    }
    // 实体命名常量
@@ -433,6 +434,11 @@
        const cartesian = this.viewer.scene.pickPosition(movement.endPosition)
        if (!cartesian) return
        // 更新绘制提示 tooltip 位置
        if (this.drawingMode && this.drawingTooltip) {
            this.drawingTooltip.move(movement.endPosition)
        }
        // 编辑模式下,拖拽点实时更新
        if (this.editingMode && this.draggedEntity?.customData) {
            this.draggedEntity.position = cartesian
@@ -581,6 +587,11 @@
    finishDrawing() {
        this.curPolygon.positions.pop()
        // 隐藏绘制提示
        if (this.drawingTooltip) {
            this.drawingTooltip.hide()
        }
        if (this.curPolygon.positions.length >= 3) {
            this.drawingMode = false
            this.editingMode = true
@@ -609,6 +620,11 @@
        this.removeMenuPopup()
        this.notify('getPolygonPositions', [])
        this.startDrawing()
        // 重新显示绘制提示
        if (this.drawingTooltip) {
            this.drawingTooltip.show('左键点击绘制,双击结束绘制')
        }
    }
    // 删除图斑
    delSpot() {
@@ -727,6 +743,15 @@
            this.addPosition(item, false)
        })
        const boxTransformScale = (data, multiple = 3) => {
            const line = turf.lineString(data)
            const bbox = turf.bbox(line)
            const bboxPolygon = turf.bboxPolygon(bbox)
            const scaledPolygon = turf.transformScale(bboxPolygon, multiple)
            return turf.bbox(scaledPolygon)
        }
        // 视角飞入区域
        const newBox = boxTransformScale(
            positions.map(item => [item.lng, item.lat]),
@@ -752,6 +777,12 @@
    initHandler(viewer) {
        this.viewer = viewer
        this.startDrawing()
        // 初始化绘制提示 tooltip
        if (!this.drawingTooltip) {
            this.drawingTooltip = new MapTooltip(viewer)
            this.drawingTooltip.show('左键点击绘制,双击结束绘制')
        }
        if (!this.handler) {
            this.handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas)
@@ -800,5 +831,11 @@
        this.removeEntities()
        this.removeHandler()
        this.enableMapControl()
        // 销毁绘制提示 tooltip
        if (this.drawingTooltip) {
            this.drawingTooltip.destroy()
            this.drawingTooltip = null
        }
    }
}
packages/utils/map/index.js
@@ -1,5 +1,6 @@
import * as Cesium from 'cesium'
import { MapTooltip } from './MapTooltip'
import { DrawPolygon } from './DrawPolygon'
/**
 * 飞到中心点并且所有点在可视范围
 *  @param positionsData 二维数组,每项为 [lon, lat] 或 三维数组 [lon, lat, height]
@@ -61,4 +62,46 @@
    })
}
export { MapTooltip, flyVisual }
// 批量获取点数组经纬度对应高度信息
const getPointPositionsHeight = (data, viewer, droneHeight = null) => {
    return new Promise((resolve, reject) => {
        if (!data || !data.length) {
            resolve([])
            return
        }
        // 假设 viewer 已经初始化并且 terrainProvider 是有效的
        const terrainProvider = viewer?.terrainProvider
        // 创建 Cartographic 对象
        const cartographics = data.map(item => {
            const { lng, lat } = item
            return Cesium.Cartographic.fromDegrees(Number(lng), Number(lat))
        })
        // 获取地形数据的Promise
        const promise = Cesium.sampleTerrainMostDetailed(terrainProvider, cartographics)
        // 使用 Cesium.when 处理 Promise
        promise
            .then(function (updatedPositions) {
                //  是一个数组,包含更新后的 Cartographic 对象
                const newPosition = updatedPositions.map((item, index) => {
                    const longitude = Cesium.Math.toDegrees(item.longitude)
                    const latitude = Cesium.Math.toDegrees(item.latitude)
                    let pointData = {
                        ...data[index],
                        longitude,
                        latitude,
                        ASL: Number(item.height),
                        customHeight: Number(item.height),
                    }
                    if (droneHeight) pointData.TH = Number(item.height) + Number(droneHeight)
                    return pointData
                })
                resolve(newPosition)
            })
            .catch(function (error) {
                console.log('获取高程时发生错误:', error)
                resolve(data.map(item => ({ ...item, ASL: 0, customHeight: 0, longitude: item.lng, latitude: item.lat })))
            })
    })
}
export { MapTooltip, flyVisual, getPointPositionsHeight, DrawPolygon }
packages/utils/package.json
@@ -1,18 +1,22 @@
{
  "name": "@ztzf/utils",
  "version": "1.0.0",
  "private": true,
  "description": "工具类",
  "main": "index.js",
  "license": "ISC",
  "peerDependencies": {
    "cesium": "catalog:",
    "dayjs": "catalog:",
    "decimal.js": "catalog:"
  },
  "devDependencies": {
    "cesium": "catalog:",
    "dayjs": "catalog:",
    "decimal.js": "catalog:"
  }
    "name": "@ztzf/utils",
    "version": "1.0.0",
    "private": true,
    "description": "工具类",
    "main": "index.js",
    "license": "ISC",
    "peerDependencies": {
        "@turf/turf": "catalog:",
        "cesium": "catalog:",
        "dayjs": "catalog:",
        "decimal.js": "catalog:",
        "element-plus": "catalog:"
    },
    "devDependencies": {
        "@turf/turf": "catalog:",
        "cesium": "catalog:",
        "dayjs": "catalog:",
        "decimal.js": "catalog:",
        "element-plus": "catalog:"
    }
}
pnpm-lock.yaml
@@ -878,6 +878,12 @@
  packages/utils:
    devDependencies:
      '@turf/turf':
        specifier: 'catalog:'
        version: 6.5.0
      '@ztzf/utils':
        specifier: workspace:*
        version: 'link:'
      cesium:
        specifier: 'catalog:'
        version: 1.126.0
@@ -887,6 +893,9 @@
      decimal.js:
        specifier: 'catalog:'
        version: 10.6.0
      element-plus:
        specifier: 'catalog:'
        version: 2.9.11(vue@3.5.27(typescript@5.9.3))
  uniapps/work-app:
    dependencies: