Merge branch 'dev' into test
| | |
| | | RUN rm -rf node_modules package-lock.json && npm install --registry=https://registry.npmmirror.com |
| | | |
| | | # 构建项目 |
| | | RUN npm run build:test |
| | | RUN npm run build:prod |
| | | |
| | | # 查看 |
| | | RUN ls /app/dist |
| | |
| | | |
| | | // 根据经纬度获取区域code |
| | | export const getAreaCodeApi = (params) => { |
| | | return axios({ |
| | | url: `https://restapi.amap.com/v3/geocode/regeo`, |
| | | method: 'post', |
| | | return request({ |
| | | url: `/drone-device-core/map/amap/searchByLatLng?`, |
| | | method: 'get', |
| | | params |
| | | }) |
| | | } |
| | |
| | | <img src="@/assets/images/home/homeLeft/tq.png" alt="" /> |
| | | <span class="tq">{{ weather }}</span> |
| | | <span class="tq">风速:{{ windVelocity }} </span> |
| | | <span v-if="flylevel >= 5" :class="[isFly === '适合飞行' ? 'qk' : isFly === '禁止飞行' ? 'redqk' : 'yellowqk']">{{ |
| | | isFly |
| | | <span v-if="flightAdvice" :class="[flightAdvice === '适合飞行' ? 'qk' : flightAdvice === '禁止飞行' ? 'redqk' : 'yellowqk']">{{ |
| | | flightAdvice |
| | | }}</span> |
| | | </div> |
| | | </div> |
| | |
| | | <script setup> |
| | | import dayjs from 'dayjs' |
| | | import { getDroneSuggest } from '@/api/home/common' |
| | | import { useStore } from 'vuex' |
| | | import { ElMessage } from 'element-plus' |
| | | |
| | | const store = useStore() |
| | | const flySuggest = computed(() => store.state.home.flySuggest) |
| | | |
| | | const time = ref('') |
| | | const updateTime = () => { |
| | |
| | | |
| | | // 天气 |
| | | const weather = ref('') |
| | | // 是否适合飞行 |
| | | const isFly = ref('') |
| | | |
| | | // 风速 |
| | | const windVelocity = ref('') |
| | | // 区县级 |
| | | const flylevel = ref('') |
| | | const flightAdvice = computed(() => flySuggest.value?.flightAdvice) |
| | | |
| | | // 获取天气建议 |
| | | const getWeatherSuggest = () => { |
| | | // ElMessage.success('wobeichonghzil') |
| | | getDroneSuggest().then(res => { |
| | | if (res.data.code !== 0) return |
| | | weather.value = res.data.data.weather |
| | | isFly.value = res.data.data.flightAdvice |
| | | windVelocity.value = res.data.data.windPower |
| | | flylevel.value = res.data.data.adcode.replace(/0+$/, "").length |
| | | }) |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | let intervalTime |
| | | onMounted(() => { |
| | |
| | | <div v-for="(item, index) in infoList" :key="index"> |
| | | <div class="itemBox"> |
| | | <div class="itemTitle">{{ item.name }}:</div> |
| | | <div class="itemValue">{{ item.value ? item.value : '' }}</div> |
| | | <div class="itemValue">{{ item.value ? item.value : '--' }}</div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | { name: '任务名称', value: '', field: 'name' }, |
| | | { name: '所属单位', value: '', field: 'dept_name' }, |
| | | { name: '任务类型', value: '', field: 'industry_type_str' }, |
| | | { name: '任务时间', value: '', field: 'begin_time' + ' - ' + 'end_time' }, |
| | | { name: '任务时间', value: '', field: 'cycle_time_value' }, |
| | | { name: '飞行事件', value: '', field: 'event_number' }, |
| | | { name: '任务频次', value: '', field: 'rep_rule_type rep_rule_val' }, |
| | | { name: '任务描述', value: '', field: 'remark' }, |
| | |
| | | const getDetails = () => { |
| | | getJobDetails({ wayLineJobInfoId: wayLineJodInfoId.value }).then(res => { |
| | | detailsData.value = res.data.data |
| | | |
| | | infoList.value.forEach(item => { |
| | | if (item.name === '任务时间') { |
| | | item.value = detailsData.value.begin_time.slice(0, 10) + '-' + detailsData.value.end_time.slice(0, 10) |
| | | } else if (item.name === '任务频次') { |
| | | // if (item.name === '任务时间') { |
| | | // item.value = detailsData.value.begin_time.slice(0, 10) + '-' + detailsData.value.end_time.slice(0, 10) |
| | | // } else |
| | | if (item.name === '任务频次') { |
| | | const { rep_rule_type = '', rep_rule_val = '' } = detailsData?.value || {} |
| | | item.value = rep_rule_type + ' -- ' + rep_rule_val |
| | | } else { |
| | | item.value = detailsData.value?.[item.field] || '' |
| | | item.value = detailsData.value?.[item.field] || '--' |
| | | } |
| | | }) |
| | | flystatus.value = res.data.data.ai_type_str |
| | |
| | | {name:'悬停',value:'hover',img:hoverImg}, |
| | | {name:'拍照',value:'takePhoto',img:takePhotoImg}, |
| | | ] |
| | | |
| | | // 地图层级 |
| | | export const MAP_LEVEL = [ |
| | | { name: '县',heightRange: [0, 48651], height: 31753}, |
| | | { name: '市',heightRange: [48651, 314863], height: 257731}, |
| | | { name: '省',heightRange: [314863, 3796280000], height: 1987280}, |
| | | ] |
| | |
| | | import * as Cesium from 'cesium' |
| | | import aggregationImg from '@/assets/images/home/useUavHome/aggregation.png' |
| | | import eventAggregationImg from '@/assets/images/home/useUavHome/eventAggregationImg.png' |
| | | import uavImg from '@/assets/images/home/useUavHome/uavImg.png' |
| | | |
| | | import _ from 'lodash' |
| | | import { getEventImage } from '@/utils/stateToImageMap/event' |
| | | import { getDroneStatusImage } from '@/utils/stateToImageMap/drone' |
| | | |
| | |
| | | |
| | | // hook |
| | | import { useMapHandlerClick } from '@/hooks/components/useMapHandlerClick' |
| | | import { MAP_LEVEL } from '@/const/drc' |
| | | |
| | | /** |
| | | * 机巢聚合功能 |
| | |
| | | } |
| | | }) |
| | | |
| | | let scalingJudgment = [ |
| | | { name: '县', splashedList: [], gJson: null, show: false, outline: {}, value: [0, 48651], height: 31753 }, |
| | | { name: '市', splashedList: [], gJson: null, show: false, outline: {}, value: [48651, 314863], height: 257731 }, |
| | | { |
| | | name: '省', |
| | | splashedList: [], |
| | | gJson: null, |
| | | show: false, |
| | | outline: {}, |
| | | value: [314863, 3796280000], |
| | | height: 1987280, |
| | | }, |
| | | ] |
| | | let scalingJudgment = _.cloneDeep(MAP_LEVEL).map(i => ({...i,gJson: null,splashedList:[], show: false, outline: {}})) |
| | | |
| | | let viewer = null |
| | | let active = null |
| | | |
| | |
| | | // 根据高度展示对应的 gJson |
| | | for (let [index, item] of scalingJudgment.entries()) { |
| | | if (!item.show) return |
| | | if (height > item.value[0] && height <= item.value[1]) { |
| | | if (height > item.heightRange[0] && height <= item.heightRange[1]) { |
| | | if (active === item.name) return |
| | | active = item.name |
| | | removeEntities() |
| | |
| | | eventTimeType: 'day', |
| | | eventTimeParams: 'CURRENT_WEEK', |
| | | eventTimeRang: '', |
| | | flySuggest:{},//飞行建议 |
| | | }, |
| | | actions: {}, |
| | | mutations: { |
| | | setFlySuggest: (state, data) => { |
| | | state.flySuggest = data; |
| | | }, |
| | | setUserAreaPosition: (state, data) => { |
| | | setStore({ name: 'userAreaPosition', content: data }) |
| | | state.userAreaPosition = data; |
| | |
| | | offset: new Cesium.HeadingPitchRange(0, 0, boundingSphere.radius * rangeMultiple), |
| | | }) |
| | | } |
| | | |
| | | // 获取视口地图中心点 |
| | | export function getMapCenterPoint(viewer) { |
| | | const centerResult = viewer.camera.pickEllipsoid( |
| | | new Cesium.Cartesian2( |
| | | viewer.canvas.clientWidth / 2, |
| | | viewer.canvas.clientHeight / 2 |
| | | ) |
| | | ); |
| | | const curPosition = Cesium.Ellipsoid.WGS84.cartesianToCartographic(centerResult); |
| | | const longitude = (curPosition.longitude * 180) / Math.PI; |
| | | const latitude = (curPosition.latitude * 180) / Math.PI; |
| | | return { longitude, latitude }; |
| | | } |
| | |
| | | import cesiumOperation from '@/utils/cesium-tsa' |
| | | import EventOverviewDetail from '@/views/Home/EventOverviewDetail/EventOverviewDetail.vue' |
| | | import AINowFly from '@/views/Home/AINowFly.vue' |
| | | import { getMapCenterPoint } from '@/utils/cesium/mapUtil' |
| | | import { getAreaCodeApi } from '@/api/home' |
| | | import { getDroneSuggest } from '@/api/home/common' |
| | | import { MAP_LEVEL } from '@/const/drc' |
| | | import _ from 'lodash' |
| | | |
| | | const store = useStore() |
| | | const { _init, viewerDestory } = cesiumOperation() |
| | |
| | | viewerDestory() |
| | | }) |
| | | |
| | | // 获取飞行建议 |
| | | function getFlySuggestion(){ |
| | | const viewer = window.$viewer |
| | | const {longitude,latitude} = getMapCenterPoint(viewer) |
| | | let height = viewer.camera.positionCartographic.height; |
| | | if (height > MAP_LEVEL[0].heightRange[1]) { |
| | | store.commit('setFlySuggest', {}) |
| | | return |
| | | } |
| | | const params = { location: longitude + ',' + latitude} |
| | | getAreaCodeApi(params).then(res => { |
| | | const { adcode:areaCode } = res.data.data.regeocode.addressComponent |
| | | if (!areaCode) return |
| | | return getDroneSuggest({areaCode}) |
| | | }).then(res => { |
| | | const setFlySuggest = _.pick(res.data.data,['windPower','flightAdvice']) || {} |
| | | store.commit('setFlySuggest', setFlySuggest) |
| | | }) |
| | | } |
| | | |
| | | onBeforeUnmount(() =>{ |
| | | window.$viewer.camera.moveEnd.removeEventListener(getFlySuggestion); |
| | | }) |
| | | |
| | | onMounted(() => { |
| | | _init('cesium') |
| | | nextTick(() => { |
| | | getFlySuggestion() |
| | | window.$viewer.camera.moveEnd.addEventListener(getFlySuggestion); |
| | | }) |
| | | }) |
| | | </script> |
| | |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column show-overflow-tooltip prop="industry_type_str" label="任务类型" /> |
| | | <el-table-column prop="begin_time" label="任务时间" width="150" /> |
| | | <el-table-column prop="cycle_time_value" label="任务时间" width="150" /> |
| | | <el-table-column prop="event_number" label="关联事件"> |
| | | <template #default="scope"> |
| | | <span>{{ scope.row.event_number ? scope.row.event_number : '/' }}</span> |
| | |
| | | if (res.data.code !== 0) return |
| | | taskDetailData.value = res.data.data.records |
| | | total.value = res.data.data.total |
| | | |
| | | }) |
| | | } |
| | | // 机巢列表数据 |
| | |
| | | getDeviceDetail(singleUavHome.value.device_sn).then(res => { |
| | | const result = res.data.data |
| | | dockDetails.value = result |
| | | const storageObj = _.pick(result, ['latitude', 'longitude']) |
| | | setSingleUavAreaCode(storageObj) |
| | | const storageObj = _.pick(result, ['latitude', 'longitude']) || {} |
| | | store.commit('setSingleUavHome',{...singleUavHome.value, ...storageObj}) |
| | | initDroneEntity({ |
| | | lng: result.longitude, |
| | | lat: result.latitude, |
| | |
| | | workspaceId.value = result.workspace_id |
| | | }) |
| | | } |
| | | |
| | | // 设置单机巢得位置信息 |
| | | const setSingleUavAreaCode = (position) =>{ |
| | | store.commit('setSingleUavHome',{...singleUavHome.value, ...position}) |
| | | const params = { |
| | | output:'json', |
| | | location: position.longitude+','+position.latitude, |
| | | key:'6c3ea75b215f0c0efcbcfdf13273991b', |
| | | radius:'0', |
| | | extensions:'base', |
| | | } |
| | | // todo 2025年4月23号 后端提供接口然后对接 |
| | | // getAreaCodeApi(params).then(res => { |
| | | // console.log(res,66666666) |
| | | // }) |
| | | } |
| | | |
| | | |
| | | // 获取机巢统计数据 提供给左右侧组件使用 |
| | | const getMachineData = () => { |