Merge branch 'feature/v6.0/6.0.4' of http://139.196.74.78:10010/r/drone/drone-web-manage into feature/v6.0/6.0.4
9 files modified
1 files renamed
1 files added
| | |
| | | </template> |
| | | |
| | | |
| | | |
| | | <script setup> |
| | | import { useDownloadWs } from '@/page/index/useDownloadWs'; |
| | | useDownloadWs() |
| | | </script> |
| | | |
| | | <style> |
| | |
| | | }); |
| | | }; |
| | | |
| | | |
| | | export const newGetWorkspacesPage = params => { |
| | | return request({ |
| | | url: `/drone-device-core/wayline/api/v1/wayline-groups/page`, |
| | | method: 'get', |
| | | params, |
| | | }) |
| | | } |
| | | |
| | | export const getWaylineFileListByArea = (areaCode) => { |
| | | return request({ |
| | |
| | | import { ArrowLineMaterialProperty } from '@/utils/cesium/Material' |
| | | import { flyVisual } from '@/utils/cesium/mapUtil' |
| | | |
| | | import { useStore } from 'vuex' |
| | | |
| | | let arrowLineMaterialProperty = new ArrowLineMaterialProperty({ |
| | | color: new Cesium.Color(128 / 255, 215 / 255, 255 / 255, 1), |
| | | directionColor: new Cesium.Color(1, 1, 1, 1), |
| | |
| | | }) |
| | | |
| | | export function useRouteLine () { |
| | | const store = useStore() |
| | | let viewer = null |
| | | let previewDataSource = null |
| | | |
| | |
| | | }, |
| | | }) |
| | | |
| | | // 落点线 |
| | | ; (pointList || [])?.forEach((item, index) => { |
| | | const topPosition = Cesium.Cartesian3.fromDegrees(Number(item.longitude), Number(item.latitude), Number(item.height)) |
| | | let setting = { |
| | | position: topPosition, |
| | | polyline: getPolyLine(viewer, { value: pointList }, index), |
| | | } |
| | | previewDataSource.entities.add(setting) |
| | | }) |
| | | // 落点线 |
| | | ; (pointList || [])?.forEach((item, index) => { |
| | | const topPosition = Cesium.Cartesian3.fromDegrees(Number(item.longitude), Number(item.latitude), Number(item.height)) |
| | | let setting = { |
| | | position: topPosition, |
| | | polyline: getPolyLine(viewer, { value: pointList }, index), |
| | | } |
| | | previewDataSource.entities.add(setting) |
| | | }) |
| | | |
| | | // 终点 |
| | | previewDataSource.entities.add({ |
| | |
| | | height: 50, |
| | | }, |
| | | }) |
| | | // 获取最后一点高度 |
| | | store.commit('setLastHeight', Number(pointList[pointList.length - 1].height)) |
| | | flyVisual({ |
| | | positionsData:pointList.map(i => [Number(i.longitude), Number(i.latitude), Number(i.height)]), |
| | | viewer, |
| New file |
| | |
| | | <template> |
| | | |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { useGlobalWS } from '@/page/index/useGlobalWS'; |
| | | useGlobalWS() |
| | | </script> |
| | | <style scoped lang="scss"> |
| | | |
| | | </style> |
| | |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <GlobalWS /> |
| | | <!-- <wechat></wechat> --> |
| | | </div> |
| | | </template> |
| | | <script> |
| | | import index from '@/mixins/index' |
| | | import wechat from './wechat.vue' |
| | | import index from '@/mixins/index'; |
| | | import wechat from './wechat.vue'; |
| | | //import { validatenull } from 'utils/validate'; |
| | | import { mapGetters } from 'vuex' |
| | | import tags from './tags.vue' |
| | | import search from './search.vue' |
| | | import logo from './logo.vue' |
| | | import top from './top/index.vue' |
| | | import sidebar from './sidebar/index.vue' |
| | | import { mapGetters } from 'vuex'; |
| | | import tags from './tags.vue'; |
| | | import search from './search.vue'; |
| | | import logo from './logo.vue'; |
| | | import top from './top/index.vue'; |
| | | import sidebar from './sidebar/index.vue'; |
| | | import GlobalWS from '@/page/index/GlobalWS.vue'; |
| | | |
| | | export default { |
| | | mixins: [index], |
| | | components: { |
| | | GlobalWS, |
| | | top, |
| | | logo, |
| | | tags, |
| | |
| | | wechat, |
| | | }, |
| | | name: 'index', |
| | | provide () { |
| | | provide() { |
| | | return { |
| | | index: this, |
| | | } |
| | | }; |
| | | }, |
| | | computed: { |
| | | ...mapGetters([ |
| | |
| | | 'menu', |
| | | 'setting', |
| | | ]), |
| | | validSidebar () { |
| | | validSidebar() { |
| | | return !( |
| | | (this.$route.meta || {}).menu === false || (this.$route.query || {}).menu === 'false' |
| | | ) |
| | | ); |
| | | }, |
| | | }, |
| | | props: [], |
| | | methods: { |
| | | //打开菜单 |
| | | openMenu (item = {}) { |
| | | openMenu(item = {}) { |
| | | this.$store.dispatch('GetMenu', item.id).then(data => { |
| | | if (data.length !== 0) { |
| | | this.$router.$avueRouter.formatRoutes(data, true) |
| | | this.$router.$avueRouter.formatRoutes(data, true); |
| | | |
| | | // 获取url里面的redirect |
| | | const redirect = decodeURIComponent(this.$route.query.redirect || '') |
| | | const redirect = decodeURIComponent(this.$route.query.redirect || ''); |
| | | if (redirect) { |
| | | console.log('redirect', redirect) |
| | | const [path, queryString] = redirect.split('?') |
| | | const query = queryString ? Object.fromEntries(new URLSearchParams(queryString)) : {} |
| | | this.$router.push({ path, query }) |
| | | console.log('redirect', redirect); |
| | | const [path, queryString] = redirect.split('?'); |
| | | const query = queryString ? Object.fromEntries(new URLSearchParams(queryString)) : {}; |
| | | this.$router.push({ path, query }); |
| | | } |
| | | } |
| | | //当点击顶部菜单后默认打开第一个菜单 |
| | |
| | | }, itemActive.meta) |
| | | }); |
| | | }*/ |
| | | }) |
| | | }); |
| | | }, |
| | | }, |
| | | } |
| | | }; |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | |
| | | background: transparent; |
| | | padding: 0 10px; |
| | | --el-color-primary: rgba(20, 65, 255, 1); |
| | | height: pxToVh(55); |
| | | height: pxToVh(55); |
| | | } |
| | | </style> |
| File was renamed from src/page/index/useDownloadWs.js |
| | |
| | | import { computed, onBeforeUnmount, onMounted } from 'vue'; |
| | | import { getWebsocketUrl } from '@/utils/websocket/config' |
| | | import { useConnectWebSocket } from '@/utils/websocket/connect-websocket' |
| | | import { useStore } from 'vuex' |
| | | import dayjs from 'dayjs' |
| | | import { aLinkDownloadUtil } from '@/utils/util' |
| | | import EventBus from '@/utils/eventBus' |
| | | import { computed, onBeforeUnmount, onMounted } from 'vue'; |
| | | import { setStore,getStore } from '@/utils/store'; |
| | | import { getDownloadStatusApi } from '@/api/dataCenter/dataCenter'; |
| | | import { getStore, setStore } from '@/utils/store' |
| | | |
| | | export const useDownloadWs = () => { |
| | | export const useGlobalWS = () => { |
| | | const store = useStore() |
| | | const loginUserInfo = computed(() => store.state.user.userInfo) |
| | | const downloadProgress = computed(() => store.state.common.downloadProgress) |
| | | let currentWebSocket = null |
| | | function messageHandler(payload) { |
| | | const {type,status,progress,download_url} = payload |
| | | |
| | | // 下载进度处理 |
| | | function downloadProcessing(payload) { |
| | | const {type,status,progress,download_url} = payload?.data || {} |
| | | let setProgress = 0 |
| | | if (status === 'PENDING'){ |
| | | setProgress = 1 |
| | |
| | | ...downloadProgress.value, |
| | | [type]: setProgress, |
| | | }) |
| | | if (status === 'COMPLETED' && ['htsjzx','htlsrwxq'].includes(type)) { |
| | | if (status === 'COMPLETED' && ['dpsjzx','dplsrwxq'].includes(type)) { |
| | | const name = `数据中心-${dayjs().format('YYYYMMDDHHmmss')}.zip` |
| | | const currentUrl = getStore({name: 'downloadUrl'}) |
| | | if (currentUrl === download_url && download_url!== undefined) return |
| | |
| | | } |
| | | } |
| | | |
| | | const logOut = () => { |
| | | store.commit('SET_THEME_NAME', '') |
| | | store.dispatch('LogOut').then(() => { |
| | | router.push({ path: '/login' }) |
| | | setTimeout(() => location.reload()) |
| | | }) |
| | | } |
| | | function messageHandler(payload) { |
| | | switch (payload.biz_code) { |
| | | case 'JOB_ISREFRESH': |
| | | store.commit('jobUpdateKeyAdd') |
| | | break |
| | | case 'DEVICE_ISREFRESH': |
| | | store.commit('deviceUpdateKeyAdd') |
| | | break |
| | | case 'DOWNLOAD_PROGRESS': |
| | | downloadProcessing(payload) |
| | | break |
| | | case 'LOGOUT_USER': |
| | | logOut() |
| | | break |
| | | } |
| | | } |
| | | |
| | | onMounted(() => { |
| | | let webSocketUrl = getWebsocketUrl() + `&model_type=3&workspace-id=${loginUserInfo.value.user_id}` |
| | | currentWebSocket = useConnectWebSocket((result)=>{ |
| | | const payload = JSON.parse(result) |
| | | messageHandler(payload.data) |
| | | messageHandler(payload) |
| | | }, webSocketUrl) |
| | | EventBus.on('useDownloadWs-messageHandler',messageHandler) |
| | | EventBus.on('useGlobalWS-messageHandler',messageHandler) |
| | | }) |
| | | |
| | | onBeforeUnmount(() => { |
| | | currentWebSocket?.close() |
| | | EventBus.off('useDownloadWs-messageHandler',messageHandler) |
| | | EventBus.off('useGlobalWS-messageHandler',messageHandler) |
| | | }) |
| | | return {} |
| | | } |
| | |
| | | lockPasswd: getStore({ name: 'lockPasswd' }) || '', |
| | | website: website, |
| | | setting: website.setting, |
| | | deviceUpdateKey: 0, //设备刷新key |
| | | jobUpdateKey: 0, //任务刷新key |
| | | downloadProgress:{ |
| | | htsjzx: 100, //数据中心 |
| | | htlsrwxq: 100, //历史任务详情 |
| | | } |
| | | }, |
| | | lastHeight: 0, // 获取最后一点高度 |
| | | }, |
| | | mutations: { |
| | | setLastHeight(state, data) { |
| | | state.lastHeight = data |
| | | }, |
| | | setDownloadProgress(state, data) { |
| | | state.downloadProgress = data |
| | | }, |
| | | deviceUpdateKeyAdd(state, data) { |
| | | state.deviceUpdateKey = state.deviceUpdateKey + 1 |
| | | }, |
| | | jobUpdateKeyAdd(state, data) { |
| | | state.jobUpdateKey = state.jobUpdateKey + 1 |
| | | }, |
| | | SET_LANGUAGE: (state, language) => { |
| | | state.language = language; |
| | | setStore({ |
| | |
| | | <el-form :model="searchForm" inline> |
| | | <div class="search-first"> |
| | | <el-form-item label="行政区划:" > |
| | | <el-tree-select |
| | | <el-tree-select |
| | | :disabled="viewDetailsDisabled" |
| | | popper-class="custom-tree-select" |
| | | v-model="searchForm.areaCode" |
| | |
| | | </el-form-item> |
| | | <el-form-item label="文件类别:"> |
| | | <el-select |
| | | |
| | | |
| | | :disabled="disabled || foldersDisabled || viewDetailsDisabled" |
| | | :teleported="false" |
| | | v-model="searchForm.photoType" |
| | |
| | | machineData.value = ''; |
| | | const droneList = await getDeviceRegion({ areaCode: data.id }); |
| | | machineData.value = droneList?.data?.data; |
| | | |
| | | |
| | | // 默认选中值 |
| | | if (signDevice_sn.value) { |
| | | searchForm.deviceSn = signDevice_sn.value; |
| | |
| | | deptData.value = []; |
| | | getDeptsByAreaCode(); |
| | | handleSearch(); |
| | | |
| | | |
| | | }; |
| | | // 所属部门信息 |
| | | const getDeptsByAreaCode = () => { |
| | |
| | | } |
| | | // 切换文件夹 |
| | | const handleswitchFolders =()=>{ |
| | | emit('handleswitchFolders'); |
| | | emit('handleswitchFolders'); |
| | | } |
| | | // 返回按钮 |
| | | const handleBack = ()=>{ |
| | | emit('handleBack'); |
| | | emit('handleBack'); |
| | | } |
| | | onMounted(() => { |
| | | requestDockInfo(); |
| | | getDownloadStatusApi({type: 'htsjzx'}).then(res =>{ |
| | | if (!['CANCELLED','COMPLETED'].includes(res.data.data?.status || 'COMPLETED')){ |
| | | EventBus.emit('useDownloadWs-messageHandler',res.data.data) |
| | | EventBus.emit('useGlobalWS-messageHandler',res.data.data) |
| | | } |
| | | }) |
| | | }); |
| | |
| | | |
| | | |
| | | const changeKey = inject('changeKey') |
| | | // 轮询查询是否刷新 |
| | | const polling = setInterval(async () => { |
| | | const res = await statusChangedApi() |
| | | if (res.data.data.DEVICE_REFRESH || res.data.data.JOB_REFRESH) { |
| | | getJobList() |
| | | changeKey.value++ |
| | | } |
| | | }, 4000) |
| | | const jobUpdateKey = computed(() => store.state.common.jobUpdateKey) |
| | | const deviceUpdateKey = computed(() => store.state.common.deviceUpdateKey) |
| | | |
| | | watch([jobUpdateKey,deviceUpdateKey],()=>{ |
| | | getJobList() |
| | | changeKey.value++ |
| | | }) |
| | | |
| | | onBeforeUnmount(() => { |
| | | clearInterval(polling) |
| | |
| | | <div class="ztzf-search-mange"> |
| | | <el-form :model="params" inline> |
| | | <div class="search-contain"> |
| | | <div> |
| | | <el-form-item label="任务名称:"> |
| | | <el-input v-model="params.jobName" placeholder="请输入任务名称" clearable /> |
| | | </el-form-item> |
| | | <el-form-item label="任务编号:"> |
| | | <el-input v-model="params.jobInfoNum" placeholder="请输入任务编号" clearable /> |
| | | </el-form-item> |
| | | <el-form-item label="日期:"> |
| | | <el-date-picker |
| | | v-model="rangTime" |
| | | type="daterange" |
| | | range-separator="至" |
| | | start-placeholder="开始日期" |
| | | end-placeholder="结束日期" |
| | | clearable |
| | | @change="changeselect" |
| | | /> |
| | | </el-form-item> |
| | | </div> |
| | | <div class="btns"> |
| | | <el-button type="primary" @click="getList" :icon="Search">搜索</el-button> |
| | | <el-button @click="cancelSearch" :icon="Delete">清空</el-button> |
| | | </div> |
| | | <!-- <div>--> |
| | | <el-form-item label="任务名称:"> |
| | | <el-input v-model="params.jobName" placeholder="请输入任务名称" clearable /> |
| | | </el-form-item> |
| | | <el-form-item label="任务编号:"> |
| | | <el-input v-model="params.jobInfoNum" placeholder="请输入任务编号" clearable /> |
| | | </el-form-item> |
| | | <el-form-item label="日期:"> |
| | | <el-date-picker |
| | | v-model="rangTime" |
| | | type="daterange" |
| | | range-separator="至" |
| | | start-placeholder="开始日期" |
| | | end-placeholder="结束日期" |
| | | clearable |
| | | @change="changeselect" |
| | | /> |
| | | </el-form-item> |
| | | <!-- </div>--> |
| | | <!-- <div class="btns">--> |
| | | <el-button type="primary" @click="getList" :icon="Search">搜索</el-button> |
| | | <el-button @click="cancelSearch" :icon="Delete">清空</el-button> |
| | | <!-- </div>--> |
| | | </div> |
| | | </el-form> |
| | | </div> |
| | | <div class="mange-table"> |
| | | <!-- <el-tabs v-model="tabType" class="demo-tabs" @tab-click="handleTabClick">--> |
| | | <!-- <el-tab-pane label="全部" name="全部"></el-tab-pane>--> |
| | | <!-- <el-tab-pane label="我的收藏" name="收藏"></el-tab-pane>--> |
| | | <!-- --> |
| | | <!-- </el-tabs>--> |
| | | <!-- <el-tabs v-model="tabType" class="demo-tabs" @tab-click="handleTabClick">--> |
| | | <!-- <el-tab-pane label="全部" name="全部"></el-tab-pane>--> |
| | | <!-- <el-tab-pane label="我的收藏" name="收藏"></el-tab-pane>--> |
| | | <!-- --> |
| | | <!-- </el-tabs>--> |
| | | <el-table border :data="tableList" class="custom-header"> |
| | | <el-table-column label="序号" type="index" width="60"></el-table-column> |
| | | <el-table-column prop="job_name" label="任务名称" align="center" show-overflow-tooltip></el-table-column> |
| | |
| | | {{ timeFormatConvert(scope.row.end_time) }} |
| | | </template> |
| | | </el-table-column> |
| | | <!-- <el-table-column prop="end_time" label="标签" align="center">--> |
| | | <!-- <template #default="scope">--> |
| | | <!-- <el-select v-model="scope.row.label_id" @change="handleUpdateLabel(scope.row)" clearable>--> |
| | | <!-- <el-option--> |
| | | <!-- v-for="item in tagList"--> |
| | | <!-- :key="item.id"--> |
| | | <!-- :label="item.label_name"--> |
| | | <!-- :value="item.id"--> |
| | | <!-- ></el-option>--> |
| | | <!-- </el-select>--> |
| | | <!-- </template>--> |
| | | <!-- </el-table-column>--> |
| | | <!-- <el-table-column prop="end_time" label="标签" align="center">--> |
| | | <!-- <template #default="scope">--> |
| | | <!-- <el-select v-model="scope.row.label_id" @change="handleUpdateLabel(scope.row)" clearable>--> |
| | | <!-- <el-option--> |
| | | <!-- v-for="item in tagList"--> |
| | | <!-- :key="item.id"--> |
| | | <!-- :label="item.label_name"--> |
| | | <!-- :value="item.id"--> |
| | | <!-- ></el-option>--> |
| | | <!-- </el-select>--> |
| | | <!-- </template>--> |
| | | <!-- </el-table-column>--> |
| | | <el-table-column label="操作" width="300" align="center"> |
| | | <template #default="scope"> |
| | | <el-button icon="el-icon-view" type="text" @click="handleDetail(scope.row)">查看</el-button> |
| | | <el-button icon="el-icon-view" type="text" @click="handleLineTrajectory(scope.row)">轨迹</el-button> |
| | | <el-button icon="el-icon-delete" type="text" @click="handleDelete(scope.row)">删除</el-button> |
| | | <!-- <el-button type="text" @click="handleStar(scope.row)">--> |
| | | <!-- <el-icon><Star /></el-icon>--> |
| | | <!-- {{ scope.row.is_favorite ? '取消收藏':'收藏' }}</el-button>--> |
| | | <!-- <el-button type="text" @click="handleStar(scope.row)">--> |
| | | <!-- <el-icon><Star /></el-icon>--> |
| | | <!-- {{ scope.row.is_favorite ? '取消收藏':'收藏' }}</el-button>--> |
| | | <el-button type="text" @click="handleExport(scope.row)"><el-icon><Download /></el-icon>导出</el-button> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | <el-table-column prop="elevation" label="实时真高" align="center"></el-table-column> |
| | | </el-table> |
| | | <template #footer> |
| | | <div class="pagination dialog-footer" style="display: flex;justify-content: end;margin-top: 10px;"> |
| | | <el-pagination class="ztzf-pagination" popper-class="custom-pagination-dropdown" background |
| | | :page-sizes="[10, 20, 30, 40, 50, 100]" :size="size" v-model:current-page="detailParams.current" |
| | | v-model:page-size="detailParams.size" layout="total, sizes, prev, pager, next, jumper" :total="detailTotal" |
| | | @size-change="handleSizeChangeDetails" @current-change="handleCurrentChangeDetails" /> |
| | | </div> |
| | | <div class="pagination dialog-footer" style="display: flex;justify-content: end;margin-top: 10px;"> |
| | | <el-pagination class="ztzf-pagination" popper-class="custom-pagination-dropdown" background |
| | | :page-sizes="[10, 20, 30, 40, 50, 100]" :size="size" v-model:current-page="detailParams.current" |
| | | v-model:page-size="detailParams.size" layout="total, sizes, prev, pager, next, jumper" :total="detailTotal" |
| | | @size-change="handleSizeChangeDetails" @current-change="handleCurrentChangeDetails" /> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | <el-dialog class="ztzf-dialog-mange" append-to-body v-model="isShowFlyMapView" title="查看" :width="pxToRem(1000)" :close-on-click-modal="false" :destroy-on-close="true"> |
| | |
| | | Number(i.height) |
| | | ]), |
| | | viewer, |
| | | multiple: 10 |
| | | multiple: 4.6, |
| | | pitch: -60 |
| | | }); |
| | | } else { |
| | | console.warn('No valid positions data'); |
| | |
| | | |
| | | <div class="search-bar-box-item search-btn"> |
| | | <el-button type="primary" icon="el-icon-search" @click="handleSearch" |
| | | >搜索</el-button |
| | | >搜索</el-button |
| | | > |
| | | <el-button icon="el-icon-refresh" @click="handleReset">清空</el-button> |
| | | </div> |
| | |
| | | type="primary" |
| | | icon="el-icon-plus" |
| | | @click="handleAdd" |
| | | >新建工单</el-button |
| | | >新建工单</el-button |
| | | > |
| | | <el-button type="success" plain icon="el-icon-download" @click="exportData" |
| | | >导出</el-button |
| | | >导出</el-button |
| | | > |
| | | </template> |
| | | |
| | |
| | | type="text" |
| | | icon="el-icon-view" |
| | | @click="handleCheckDetail(row)" |
| | | >审核</el-button |
| | | >审核</el-button |
| | | > |
| | | </template> |
| | | <!-- v-if=" |
| | |
| | | icon="el-icon-warning" |
| | | v-if="hasRecallPaddingBtnPermission()" |
| | | @click="orderLogRecall(row.id)" |
| | | >撤回</el-button |
| | | >撤回</el-button |
| | | > |
| | | <!-- <el-button type="text" icon="el-icon-view" @click="handleViewDetail(row)">详情</el-button> --> |
| | | </template> |
| | | <!--已驳回--> |
| | | <template v-if="row.status == 2"> |
| | | <el-button type="text" icon="el-icon-warning" @click="rejectDetail(row.id)" |
| | | >驳回原因</el-button |
| | | >驳回原因</el-button |
| | | > |
| | | <el-button |
| | | v-if="userInfo.user_id == row.create_user" |
| | | type="text" |
| | | icon="el-icon-view" |
| | | @click="handleViewDetail(row)" |
| | | >编辑</el-button |
| | | >编辑</el-button |
| | | > |
| | | <el-button v-else type="text" icon="el-icon-view" @click="handleViewDetail(row)" |
| | | >详情</el-button |
| | | >详情</el-button |
| | | > |
| | | </template> |
| | | <!-- 已通过 --> |
| | | <template v-if="row.status == 3"> |
| | | <el-button type="text" icon="el-icon-view" @click="handleViewDetail(row)" |
| | | >详情</el-button |
| | | >详情</el-button |
| | | > |
| | | </template> |
| | | <!--草稿--> |
| | | <template v-if="row.status == 0"> |
| | | <el-button type="text" icon="el-icon-edit" @click="handleViewDetail(row)" |
| | | >编辑</el-button |
| | | >编辑</el-button |
| | | > |
| | | <el-button type="text" icon="el-icon-position" @click="userPublishPush(row.id)" |
| | | >发布</el-button |
| | | >发布</el-button |
| | | > |
| | | <el-button type="text" icon="el-icon-delete" @click="deleteOrderLog(row.id)" |
| | | >删除</el-button |
| | | >删除</el-button |
| | | > |
| | | </template> |
| | | </div> |
| | |
| | | ></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-col :span="6"> |
| | | <el-form-item label="关联航线" prop="file_id"> |
| | | <el-select |
| | | v-model="form.file_id" |
| | |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <!-- <el-col :span="6">--> |
| | | <!-- <el-form-item label="安全返航真高" prop="rth_altitude">--> |
| | | <!-- <el-input-number--> |
| | | <!-- v-model="form.rth_altitude"--> |
| | | <!-- :min="30"--> |
| | | <!-- :max="300"--> |
| | | <!-- ></el-input-number>--> |
| | | <!-- </el-form-item>--> |
| | | <!-- </el-col>--> |
| | | <el-col :span="6"> |
| | | <el-form-item label="安全返航真高" prop="rth_altitude"> |
| | | <el-input-number |
| | | v-model="form.rth_altitude" |
| | | :min="50" |
| | | :max="300" |
| | | ></el-input-number> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <!-- <el-row>--> |
| | | <!-- <div class="add-box-btns">--> |
| | | <!-- <el-button type="danger" @click="submitForm(1)">发起</el-button>--> |
| | | <!-- <el-button type="primary" @click="submitForm(0)">存草稿</el-button>--> |
| | | <!-- <el-button @click="dialogVisible = false">取消</el-button>--> |
| | | <!-- </div>--> |
| | | <!-- </el-row>--> |
| | | <!-- <el-row>--> |
| | | <!-- <div class="add-box-btns">--> |
| | | <!-- <el-button type="danger" @click="submitForm(1)">发起</el-button>--> |
| | | <!-- <el-button type="primary" @click="submitForm(0)">存草稿</el-button>--> |
| | | <!-- <el-button @click="dialogVisible = false">取消</el-button>--> |
| | | <!-- </div>--> |
| | | <!-- </el-row>--> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | |
| | | >驳回</el-button |
| | | > |
| | | </div> |
| | | </template> |
| | | </template> |
| | | </el-dialog> |
| | | |
| | | <!-- 工单详情 --> |
| | |
| | | |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button |
| | | type="danger" |
| | | v-if="form.status == 0 || (form.status == 2 && userInfo.user_id == form.create_user)" |
| | | @click="submitForm(1)" |
| | | icon="el-icon-position" |
| | | >发布</el-button |
| | | > |
| | | <!-- <el-button type="primary" v-if="form.status == 0 || userInfo.user_id == form.create_user" |
| | | @click="submitForm(0)">保存</el-button> --> |
| | | <div class="dialog-footer"> |
| | | <el-button |
| | | type="danger" |
| | | v-if="form.status == 0 || (form.status == 2 && userInfo.user_id == form.create_user)" |
| | | @click="submitForm(1)" |
| | | icon="el-icon-position" |
| | | >发布</el-button |
| | | > |
| | | <!-- <el-button type="primary" v-if="form.status == 0 || userInfo.user_id == form.create_user" |
| | | @click="submitForm(0)">保存</el-button> --> |
| | | |
| | | <el-button |
| | | type="primary" |
| | | v-if="form.status == 1 && hasPaddingBtnPermission()" |
| | | @click="orderLogPass(form.id)" |
| | | icon="el-icon-check" |
| | | >通过</el-button |
| | | > |
| | | <el-button |
| | | type="danger" |
| | | v-if="form.status == 1 && hasRejectionBtnPermission()" |
| | | @click="orderLogReject(form.id)" |
| | | icon="el-icon-close" |
| | | >驳回</el-button |
| | | > |
| | | <el-button @click="detailVisibleCopy = false" icon="el-icon-circle-close">取消</el-button> |
| | | </div> |
| | | </template> |
| | | <el-button |
| | | type="primary" |
| | | v-if="form.status == 1 && hasPaddingBtnPermission()" |
| | | @click="orderLogPass(form.id)" |
| | | icon="el-icon-check" |
| | | >通过</el-button |
| | | > |
| | | <el-button |
| | | type="danger" |
| | | v-if="form.status == 1 && hasRejectionBtnPermission()" |
| | | @click="orderLogReject(form.id)" |
| | | icon="el-icon-close" |
| | | >驳回</el-button |
| | | > |
| | | <el-button @click="detailVisibleCopy = false" icon="el-icon-circle-close">取消</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </basic-container> |
| | | </template> |
| | |
| | | } from '@/api/tickets/orderLog'; |
| | | import { getTicketInfo } from '@/api/tickets/ticket'; |
| | | import { getDictionaryByCode } from '@/api/system/dictbiz'; |
| | | import { getWaylineFileListByArea } from '@/api/resource/wayline'; |
| | | import { getWaylineFileListByArea, newGetWorkspacesPage } from '@/api/resource/wayline'; |
| | | import { export_json_to_excel } from '@/utils/exportExcel'; |
| | | import { getFlyingNestBy } from '@/api/device/device'; |
| | | import { mapGetters } from 'vuex'; |
| | |
| | | import weekday from 'dayjs/plugin/weekday'; |
| | | import elTooltipCopy from '@/components/ElTooltipCopy.vue'; |
| | | import { CircleClose, Promotion, Select } from '@element-plus/icons-vue'; |
| | | |
| | | import { useStore } from 'vuex'; |
| | | import _ from 'lodash' |
| | | // const store = useStore() |
| | | dayjs.extend(weekday); |
| | | dayjs.locale('zh-cn'); |
| | | |
| | | // const lastHeight = computed(() => store.state.common.lastHeight) |
| | | |
| | | export default { |
| | | components: { elTooltipCopy }, |
| | |
| | | data() { |
| | | return { |
| | | activeTab: 'all', |
| | | |
| | | getlastHeight: 0, |
| | | tabs: [ |
| | | { label: '全部工单', name: 'all', value: null, count: 0 }, |
| | | { label: '待审核', name: 'WAIT_AUDIT', value: 1, count: 0 }, |
| | |
| | | indexLabel: '序号', |
| | | indexFixed: true, |
| | | |
| | | align: 'center', |
| | | align: 'left', |
| | | border: true, |
| | | stripe: false, |
| | | searchShow: true, |
| | |
| | | return CircleClose |
| | | }, |
| | | ...mapGetters(['userInfo', 'permission']), |
| | | lastHeight() { |
| | | const height = this.$store.state.common.lastHeight; |
| | | return Number(height) || 0; // 确保是数字类型 |
| | | }, |
| | | filteredTabs() { |
| | | // rejection_and_draft 权限控制“已驳回”和“草稿”tab |
| | | // console.log(this.permission, '权限信息') |
| | |
| | | return this.$message.warning('任务时间不能小于当前时间'); |
| | | } |
| | | } |
| | | const maxItem = this.device_sns.reduce((max, item) => { |
| | | return item.drone_height > max.drone_height ? item : max; |
| | | }); |
| | | console.log(maxItem, '高度') |
| | | let result = _.round((maxItem.drone_height + this.form.rth_altitude), 2) |
| | | |
| | | const submitData = { |
| | | ...this.form, |
| | | status: status, |
| | | ai_types: this.form.ai_types?.length ? this.form.ai_types : [], |
| | | }; |
| | | // 判断该值this.form.date_range[0] 周几 和rep_fre_type 是不是相等 |
| | | // if (this.form.deal_time) { |
| | | // const weekday = dayjs(this.form.date_range[0]).format('dddd'); |
| | | // console.log('444', weekday) |
| | | // // form.rep_fre_type |
| | | // const now = new Date() |
| | | // const today = now.toDateString() |
| | | // const selectedDate = new Date(this.form.date_range[0]).toDateString() |
| | | if (this.lastHeight > result) { |
| | | this.$confirm(`安全返航真高${result}米低于航线返航点高度${this.lastHeight}米,为确保返航路径安全,建议您进行调整后再发布`, '提示', { |
| | | confirmButtonText: '确定', |
| | | cancelButtonText: '取消', |
| | | type: 'warning' |
| | | }).then(async () => { |
| | | const submitData = { |
| | | ...this.form, |
| | | status: status, |
| | | ai_types: this.form.ai_types?.length ? this.form.ai_types : [], |
| | | }; |
| | | await saveUpdateOrderLog(submitData); |
| | | let id = this.form.id; |
| | | if (id) { |
| | | this.$message.success('工单发布成功'); |
| | | } else { |
| | | this.$message.success('工单创建成功'); |
| | | } |
| | | this.dialogVisible = false; |
| | | this.detailVisible = false; |
| | | (this.device_sns = []), (this.wayLineList = []), this.fetchTableData(); |
| | | }).catch(() => { |
| | | |
| | | // if (today === selectedDate) { |
| | | // const [hours, minutes] = this.form.deal_time.split(':') |
| | | // const selectedTime = new Date() |
| | | // selectedTime.setHours(parseInt(hours), parseInt(minutes)) |
| | | |
| | | // if (selectedTime < now) { |
| | | // return this.$message.warning('任务时间不能小于当前时间') |
| | | |
| | | // } |
| | | // } |
| | | // } |
| | | |
| | | await saveUpdateOrderLog(submitData); |
| | | let id = this.form.id; |
| | | if (id) { |
| | | this.$message.success('工单发布成功'); |
| | | }); |
| | | } else { |
| | | this.$message.success('工单创建成功'); |
| | | const submitData = { |
| | | ...this.form, |
| | | status: status, |
| | | ai_types: this.form.ai_types?.length ? this.form.ai_types : [], |
| | | }; |
| | | await saveUpdateOrderLog(submitData); |
| | | let id = this.form.id; |
| | | if (id) { |
| | | this.$message.success('工单发布成功'); |
| | | } else { |
| | | this.$message.success('工单创建成功'); |
| | | } |
| | | this.dialogVisible = false; |
| | | this.detailVisible = false; |
| | | (this.device_sns = []), (this.wayLineList = []), this.fetchTableData(); |
| | | } |
| | | this.dialogVisible = false; |
| | | this.detailVisible = false; |
| | | (this.device_sns = []), (this.wayLineList = []), this.fetchTableData(); |
| | | } |
| | | }); |
| | | }, |
| | |
| | | |
| | | handleAdd() { |
| | | this.form = {}; |
| | | this.form.rth_altitude = 120; |
| | | this.dialogVisible = true; |
| | | |
| | | this.$nextTick(() => { |
| | |
| | | }, |
| | | //获取航线列表 |
| | | async asyncgetWaylineFileListByArea(name) { |
| | | var wayLineListResponse = await getWaylineFileListByArea(this.userInfo.detail.areaCode); |
| | | this.wayLineList = wayLineListResponse.data.data; |
| | | const formData = { |
| | | name: '', |
| | | waylineType: undefined, |
| | | current: 1, |
| | | size: 99999999, |
| | | descs: 'update_time', |
| | | } |
| | | var wayLineListResponse = await newGetWorkspacesPage(formData); |
| | | this.wayLineList = wayLineListResponse.data.data.records |
| | | |
| | | this.initMapLine(); |
| | | }, |
| | |
| | | |
| | | this.initMapLine({}, async polygon => { |
| | | const currentLine = that.wayLineList.find(item => item.wayline_id === waylineId); |
| | | |
| | | //按照航线来 |
| | | const params = { |
| | | type: [2, 4, 5].includes(currentLine.wayline_type) ? 2 : 0, |
| | | type: ['2', '4', '5'].includes(currentLine.wayline_type) ? 2 : 0, |
| | | wayline_id: waylineId, |
| | | polygon, |
| | | }; |
| | |
| | | }); |
| | | }, |
| | | }, |
| | | |
| | | watch: { |
| | | // lastHeight(newVal, oldVal) { |
| | | // console.log('lastHeight', newVal, oldVal); |
| | | // this.getlastHeight = newVal; |
| | | // }, |
| | | tableData: { |
| | | handler() { |
| | | // this.updateTabCounts() |