Merge remote-tracking branch 'origin/master'
9 files modified
11 files renamed
| File was renamed from src/views/TaskManage/TaskIntermediateContent/CurrentTaskDetails/ControlComPass/ControlComPass.vue |
| | |
| | | <div class="left-img" :data-text="`${attitude_pitch}°`"> |
| | | <div class="scaleImg"> |
| | | <p class="scale" :style="{ top: 45 + ScaleTop + 'px' }"></p> |
| | | <img src="@/assets/images/rightmapidentification.png" /> |
| | | <img src="../../../assets/images/rightmapidentification.png" /> |
| | | </div> |
| | | </div> |
| | | <div class="instrument-center"> |
| | |
| | | </div> |
| | | </div> |
| | | <div class="center-show"> |
| | | <img src="@/assets/images/mapidentification.png" /> |
| | | <img src="../../../assets/images/mapidentification.png" /> |
| | | </div> |
| | | <div class="rotat-btn"></div> |
| | | </div> |
| | | <div class="right-img" :data-text="`${height}m`"> |
| | | <div class="ident-arrow"> |
| | | <img src="@/assets/images/leftmapidentification.png" /> |
| | | <img src="../../../assets/images/leftmapidentification.png" /> |
| | | <div class="arrow-box" :style="{ bottom: realHeight }"> |
| | | <div class="arrow"></div> |
| | | </div> |
| File was renamed from src/views/TaskManage/TaskIntermediateContent/CurrentTaskDetails/ControlPanel/ControlPanel.vue |
| | |
| | | } from '@element-plus/icons-vue' |
| | | |
| | | import controlCenterImg from '@/assets/images/taskManagement/taskIntermediateContent/controlCenter.png' |
| | | import BaseControl from '@/views/TaskManage/TaskIntermediateContent/CurrentTaskDetails/ControlPanel/BaseControl.vue' |
| | | import BaseControl from '@/components/CurrentTaskDetails/ControlPanel/BaseControl.vue' |
| | | import EventBus from '@/event-bus' |
| | | import dayjs from 'dayjs' |
| | | |
| File was renamed from src/views/TaskManage/TaskIntermediateContent/CurrentTaskDetails/CurrentTaskDetails.vue |
| | |
| | | import { liveStart } from '@/api/home/machineNest' |
| | | import { getJobDetails } from '@/api/home/task' |
| | | |
| | | import RealTimeMap from '@/views/TaskManage/TaskIntermediateContent/CurrentTaskDetails/RealTimeMap.vue' |
| | | import RealTimeMap from '@/components/CurrentTaskDetails/RealTimeMap.vue' |
| | | import { getWebsocketUrl } from '@/websocket/util/config' |
| | | import { useConnectWebSocket } from '@/utils/websocket/connect-websocket' |
| | | import { EBizCode } from '@/utils/staticData/enums' |
| | | import ControlPanel from '@/views/TaskManage/TaskIntermediateContent/CurrentTaskDetails/ControlPanel/ControlPanel.vue' |
| | | import TaskDetailsHead from '@/views/TaskManage/TaskIntermediateContent/CurrentTaskDetails/TaskDetailsHead.vue' |
| | | import TaskDetailsLeft from '@/views/TaskManage/TaskIntermediateContent/CurrentTaskDetails/TaskDetailsLeft.vue' |
| | | import TaskDetailsRight from '@/views/TaskManage/TaskIntermediateContent/CurrentTaskDetails/TaskDetailsRight.vue' |
| | | import ControlPanel from '@/components/CurrentTaskDetails/ControlPanel/ControlPanel.vue' |
| | | import TaskDetailsHead from '@/components/CurrentTaskDetails/TaskDetailsHead.vue' |
| | | import TaskDetailsLeft from '@/components/CurrentTaskDetails/TaskDetailsLeft.vue' |
| | | import TaskDetailsRight from '@/components/CurrentTaskDetails/TaskDetailsRight.vue' |
| | | import { ElMessage } from 'element-plus' |
| | | import EventBus from '@/event-bus' |
| | | |
| | |
| | | provide('lineQuality', lineQuality) |
| | | |
| | | const isShow = defineModel('show') |
| | | const props = defineProps({ |
| | | rowData: { |
| | | // 任务列表row数据 |
| | | type: Object, |
| | | default: () => ({}), |
| | | }, |
| | | }) |
| | | const props = defineProps(['id']) |
| | | const currentLiveUrl = ref('') |
| | | const machineNestUrl = ref('') |
| | | const droneLiveUrl = ref('') |
| | |
| | | |
| | | // 获取任务详情获取航线文件 |
| | | const getTaskDetails = () => { |
| | | getJobDetails({ wayLineJobInfoId: props.rowData.id }).then(async res => { |
| | | if (!props.id) ElMessage.warning('请检查是否传入id') |
| | | getJobDetails({ wayLineJobInfoId: props.id }).then(async res => { |
| | | taskDetails.value = res.data.data |
| | | currentLiveUrl.value = await getDeviceLiveUrl() |
| | | taskDetails.value.workspace_id = taskDetails.value.way_lines[0]?.workspace_id |
| | |
| | | .el-dialog { |
| | | border-radius: 40px; |
| | | position: relative; |
| | | margin-top: 38px; |
| | | margin-top: 25px; |
| | | width: 1782px; |
| | | height: 1002px; |
| | | padding: 0; |
| | |
| | | |
| | | .el-dialog__headerbtn { |
| | | position: absolute; |
| | | right: -40px; |
| | | top: -40px; |
| | | right: -30px; |
| | | top: -30px; |
| | | |
| | | .el-dialog__close { |
| | | font-size: 30px; |
| File was renamed from src/views/TaskManage/TaskIntermediateContent/CurrentTaskDetails/TaskDetailsRight.vue |
| | |
| | | </template> |
| | | <script setup> |
| | | import droneImg from '@/assets/images/taskManagement/taskIntermediateContent/droneImg.png' |
| | | import BaseControl from '@/views/TaskManage/TaskIntermediateContent/CurrentTaskDetails/ControlPanel/BaseControl.vue' |
| | | import BaseControl from '@/components/CurrentTaskDetails/ControlPanel/BaseControl.vue' |
| | | |
| | | const taskDetails = inject('taskDetails') |
| | | |
| File was renamed from src/views/SignMachineNest/MachineRight/MachineStatus/MachineTableDetails/DeviceJob/DeviceJobDetails/DeviceJobDetails.vue |
| | |
| | | <div class="itemValue">{{ flystatus ? flystatus :'' }}</div> |
| | | </div> |
| | | </div> |
| | | <JobRelatedEvents v-if="isShow" /> |
| | | <JobRelatedEvents v-if="props.wayLineJodInfoId" /> |
| | | <div class="devicetitle" v-if="isShow"> |
| | | <p> |
| | | 任务成果 |
| | |
| | | const mediaType = ref('') |
| | | const total = ref(0) |
| | | const achievementList = ref([]) |
| | | const wayLineJodInfoId = inject('wayLineJodInfoId') |
| | | |
| | | const props = defineProps(['wayLineJodInfoId']) |
| | | const wayLineJodInfoId = computed(()=> props.wayLineJodInfoId) |
| | | provide('wayLineJodInfoId',wayLineJodInfoId) |
| | | |
| | | |
| | | const getAchievement = () => { |
| | | getJobInfoFiles({ jobInfoId: wayLineJodInfoId.value }).then(res => { |
| | | for (let i = 0; i < res.data.data.length; i++) { |
| | |
| | | }) |
| | | } |
| | | |
| | | watch(isShow, (newValue, oldValue) => { |
| | | if (newValue) { |
| | | getDetails() |
| | | getAchievement() |
| | | } |
| | | onMounted(() => { |
| | | getDetails() |
| | | getAchievement() |
| | | }) |
| | | </script> |
| | | |
| File was renamed from src/views/SignMachineNest/MachineRight/MachineStatus/MachineTableDetails/DeviceJob/DeviceJobDetails/JobRelatedEvents.vue |
| | |
| | | <div class="processing" v-if="scope.row.status === 3">处理中</div> |
| | | <div class="done" v-if="scope.row.status === 4">已完成</div> |
| | | <div class="ended" v-if="scope.row.status === 5">已完结</div> |
| | | |
| | | |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="操作" width="80"> |
| | |
| | | } |
| | | const wayLineJodInfoId = inject('wayLineJodInfoId') |
| | | |
| | | |
| | | const getList = () => { |
| | | params.value.wayLineJodInfoId = wayLineJodInfoId.value |
| | | getDeviceEventList(params.value, sizeParams.value).then(res => { |
| | | const resData = res?.data?.data || {} |
| | | list.value = resData.records |
| | | total.value = resData.total |
| | | |
| | | |
| | | }) |
| | | } |
| | | |
| | |
| | | actions: {}, |
| | | mutations: { |
| | | setTaskSearchParams: (state, data) => { |
| | | console.log(data) |
| | | // setStore({ name: 'taskSearchParams', content: data }) |
| | | state.taskSearchParams = data; |
| | | }, |
| | | }, |
| | |
| | | <el-pagination |
| | | class="ztzf-pagination" |
| | | background |
| | | |
| | | |
| | | v-model:current-page="sizeParams.current" |
| | | v-model:page-size="sizeParams.size" |
| | | layout=" prev, pager, next, jumper" |
| | |
| | | /> |
| | | </div> |
| | | |
| | | <DeviceJobDetails v-model:show="deviceJobDetailsShow" /> |
| | | <DeviceJobDetails |
| | | v-if="deviceJobDetailsShow" |
| | | v-model:show="deviceJobDetailsShow" |
| | | :wayLineJodInfoId="wayLineJodInfoId" |
| | | /> |
| | | </template> |
| | | <script setup> |
| | | import { useStore } from 'vuex' |
| | | import DeviceJobDetails from './DeviceJobDetails/DeviceJobDetails.vue' |
| | | import DeviceJobDetails from '@/components/DeviceJobDetails/DeviceJobDetails.vue' |
| | | import { getDeviceJobList } from '@/api/home/task' |
| | | |
| | | const list = ref([]) |
| | |
| | | const total = ref(0) |
| | | const deviceJobDetailsShow = ref(false) |
| | | const wayLineJodInfoId = ref(null) |
| | | provide('wayLineJodInfoId', wayLineJodInfoId) |
| | | const viewJob = row => { |
| | | wayLineJodInfoId.value = row.id |
| | | deviceJobDetailsShow.value = true |
| | |
| | | </div> |
| | | </el-form-item> |
| | | <el-form-item label="任务算法:" v-if="isExpand"> |
| | | <TaskAlgorithmBusiness :setWidth="200" :showAlgorithm="true" @algorithmChange="algorithmChange"/> |
| | | <TaskAlgorithmBusiness :setWidth="186" :showAlgorithm="true" @algorithmChange="algorithmChange"/> |
| | | </el-form-item> |
| | | <el-form-item label="所属部门:" v-if="isExpand"> |
| | | <el-select class="ztzf-select" v-model="searchForm.create_dept" placeholder="请选择部门" clearable> |
| | |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="任务类型:" v-if="isExpand"> |
| | | <TaskAlgorithmBusiness :setWidth="200" :showBusiness="true" @businessChange="businessChange"/> |
| | | <TaskAlgorithmBusiness :setWidth="186" :showBusiness="true" @businessChange="businessChange"/> |
| | | </el-form-item> |
| | | <div class="more" v-if="isExpand" @click="toggleExpand">收起</div> |
| | | <div class="more" v-else @click="toggleExpand">更多</div> |
| | |
| | | ai_types: [], // 算法类型 |
| | | area_code: '', // 区域code |
| | | create_dept: '', // 创建部门 |
| | | date_enum: '', // 日期枚举,可用值:TODAY,CURRENT_WEEK,CURRENT_MONTH,CURRENT_YEAR |
| | | date_enum: 'TODAY', // 日期枚举,可用值:TODAY,CURRENT_WEEK,CURRENT_MONTH,CURRENT_YEAR |
| | | device_sn: '', // 设备编号 |
| | | end_date: null, // 结束时间 |
| | | industry_type: '', // 行业key |
| | |
| | | ]; |
| | | |
| | | const emit = defineEmits(['search','addTask']); |
| | | |
| | | const handleSearch = () => { |
| | | // 提交至store |
| | | let params = { |
| | | ...searchForm, |
| | | start_date: dateRange.value.length ? `${dateRange.value[0]} 00:00:00` : null, |
| | | end_date: dateRange.value.length ? `${dateRange.value[1]} 23:59:59` : null |
| | | } |
| | | store.commit('setTaskSearchParams', params); |
| | | emit('search', params); |
| | | }; |
| | | |
| | | const handleReset = () => { |
| | | dateRange.value = null; |
| | | Object.keys(searchForm).forEach(key => { |
| | | searchForm[key] = ''; |
| | | }); |
| | | handleSearch(); |
| | | }; |
| | | |
| | | // 新增任务 |
| | | const addTask = () => { |
| | | emit('addTask'); |
| | | }; |
| | | |
| | | const algorithmChange = (val) => { |
| | | searchForm.ai_types = val; |
| | |
| | | }; |
| | | const deptChange = (value) => { |
| | | // 处理机巢数据 |
| | | searchForm.device_sn = ''; |
| | | machineData.value = ''; |
| | | machineData.value = deptTreeData.value.find(item => item.area_code === value)?.devices || []; |
| | | // 所属部门重新请求值 |
| | |
| | | // model.value = dateRanges[item]; |
| | | // emit('change', dateRanges[item],timeListEnum[index]); |
| | | searchForm.date_enum = timeListEnum[index]; |
| | | handleSearch(); |
| | | }; |
| | | // 搜索 |
| | | const handleSearch = () => { |
| | | if (!dateRange.value) { dateRange.value = []; } |
| | | // 提交至store |
| | | let params = { |
| | | ...searchForm, |
| | | start_date: dateRange.value.length ? `${dateRange?.value[0]} 00:00:00` : null, |
| | | end_date: dateRange.value.length ? `${dateRange?.value[1]} 23:59:59` : null |
| | | } |
| | | store.commit('setTaskSearchParams', params); |
| | | emit('search', params); |
| | | }; |
| | | // 重置 |
| | | const handleReset = () => { |
| | | dateRange.value = []; |
| | | Object.keys(searchForm).forEach(key => { |
| | | searchForm[key] = ''; |
| | | }); |
| | | searchForm.ai_types = []; |
| | | searchForm.date_enum = 'TODAY'; |
| | | checked.value = 'today'; |
| | | handleSearch(); |
| | | }; |
| | | |
| | | // 新增任务 |
| | | const addTask = () => { |
| | | emit('addTask'); |
| | | }; |
| | | |
| | | onMounted(() => { |
| | | // requestDictionary(); |
| | | getDeptsByAreaCode(); |
| | | requestDockInfo(); |
| | | // 查询一次 |
| | | handleSearch(); |
| | | }); |
| | | </script> |
| | | |
| | |
| | | :width="pxToRem(1500)" |
| | | :close-on-click-modal="false" |
| | | :destroy-on-close="true" |
| | | @close="cancel" |
| | | > |
| | | <!-- <el-divider content-position="left">新建任务</el-divider> --> |
| | | <div class="task-contain"> |
| | |
| | | <!-- 添加任务 --> |
| | | <AddTask v-model:show="isShowAddTask" @refresh="searchClick"/> |
| | | <!-- 当前任务详情 --> |
| | | <CurrentTaskDetails v-if="isShowCurrentTaskDetails" v-model:show="isShowCurrentTaskDetails" :rowData="rowData"/> |
| | | <CurrentTaskDetails v-if="isShowCurrentTaskDetails" v-model:show="isShowCurrentTaskDetails" :id="rowData.id"/> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import SearchBox from '../SearchBox.vue'; |
| | | import AddTask from './AddTask.vue'; |
| | | import CurrentTaskDetails from './CurrentTaskDetails/CurrentTaskDetails.vue'; |
| | | import CurrentTaskDetails from '@/components/CurrentTaskDetails/CurrentTaskDetails.vue'; |
| | | import { jobList } from '@/api/home/task'; |
| | | import { ElMessage } from 'element-plus' |
| | | |
| | |
| | | if (row.status === 2 || row.status === 1){ |
| | | rowData.value = row? row : {}; |
| | | isShowCurrentTaskDetails.value = true; |
| | | }else{ |
| | | } else{ |
| | | ElMessage.warning('todo 跳历史任务详情') |
| | | } |
| | | }else{ |
| | |
| | | |
| | | // 添加监听 |
| | | watch(() => store.state.task.taskSearchParams, (newVal) => { |
| | | console.log(newVal, '1111'); |
| | | if (newVal) { |
| | | getJobEventBar(newVal); |
| | | } |
| | |
| | | <!-- 任务算法统计 --> |
| | | <template> |
| | | <div class="task-industry"> |
| | | <div class="title">任务算法统计</div> |
| | | <div class="title">任务算法类型</div> |
| | | <div class="chart" ref="chartRef"></div> |
| | | </div> |
| | | </template> |
| | |
| | | roseType: 'radius', |
| | | radius: ['20%', '70%'], |
| | | center: ['50%', '45%'], |
| | | data: [ |
| | | { name: '国土类', value: 0, itemStyle: { color: '#3D7FFF' } }, |
| | | { name: '城管类', value: 0, itemStyle: { color: '#8277E9' } }, |
| | | { name: '消防类', value: 0, itemStyle: { color: '#FFB77E' } }, |
| | | { name: '林业类', value: 0, itemStyle: { color: '#44D7B6' } }, |
| | | { name: '公安类', value: 0, itemStyle: { color: '#62F4FF' } } |
| | | ], |
| | | data: [], |
| | | // [ |
| | | // { name: '国土类', value: 0, itemStyle: { color: '#3D7FFF' } }, |
| | | // { name: '城管类', value: 0, itemStyle: { color: '#8277E9' } }, |
| | | // { name: '消防类', value: 0, itemStyle: { color: '#FFB77E' } }, |
| | | // { name: '林业类', value: 0, itemStyle: { color: '#44D7B6' } }, |
| | | // { name: '公安类', value: 0, itemStyle: { color: '#62F4FF' } } |
| | | // ], |
| | | label: { |
| | | show: true, |
| | | position: 'outside', |
| | |
| | | const getIndustryJobNumPieChart = (value) => { |
| | | industryJobNumPieChart(value).then(res => { |
| | | if (res.data.code !== 0) return; |
| | | option.series[0].data.forEach(item => { |
| | | const matchData = res.data.data.find(d => d.name === item.name); |
| | | if (matchData) { |
| | | item.value = matchData.value; |
| | | } |
| | | }); |
| | | option.series[0].data = res.data.data; |
| | | // forEach(item => { |
| | | // const matchData = res.data.data.find(d => d.name === item.name); |
| | | // if (matchData) { |
| | | // item.value = matchData.value; |
| | | // } |
| | | // }); |
| | | chart.value.setOption(option); |
| | | }); |
| | | }; |
| | | |
| | | |
| | | // 获取行业统计数据 |
| | | // const getIndustryJobNumPieChart = () => { |
| | | // industryJobNumPieChart().then(res => { |
| | | // if (res.data.code !== 0) return; |
| | | // const data = res.data.data.map(item => ({ |
| | | // name: item.name, |
| | | // value: item.value, |
| | | // itemStyle: { |
| | | // color: getRandomColor() |
| | | // } |
| | | // })); |
| | | // option.series[0].data = data; |
| | | // chart.value.setOption(option); |
| | | // }); |
| | | // }; |
| | | |
| | | // 添加监听 |
| | | watch(() => store.state.task.taskSearchParams, (newVal) => { |
| | | console.log(newVal, '2222'); |
| | | if (newVal) { |
| | | getIndustryJobNumPieChart(newVal); |
| | | } |
| | |
| | | <!-- 关联算法和综合业务 --> |
| | | <template> |
| | | <div class="task-algorithm" v-if="showAlgorithm"> |
| | | <el-select class="ztzf-select" :style="{ width:setWidth +'px' }" v-model="ai_types" multiple collapse-tags collapse-tags-tooltip placeholder="请选择算法" clearable @change="handleAlgorithmChange"> |
| | | <el-select class="ztzf-select" :style="{ width: pxToRem(setWidth) }" v-model="ai_types" multiple collapse-tags collapse-tags-tooltip placeholder="请选择算法" clearable @change="handleAlgorithmChange"> |
| | | <el-option v-for="item in taskAlgorithm" :key="item.id" :label="item.dictValue" :value="item.dictKey" /> |
| | | </el-select> |
| | | </div> |
| | | <div class="task-business" v-if="showBusiness"> |
| | | <el-select class="ztzf-select" :style="{ width:setWidth +'px' }" v-model="industry_type" placeholder="请选择类型" clearable @change="handleBusinessChange"> |
| | | <el-select class="ztzf-select" :style="{ width: pxToRem(setWidth) }" v-model="industry_type" placeholder="请选择类型" clearable @change="handleBusinessChange"> |
| | | <el-option v-for="item in taskBusiness" :key="item.id" :label="item.dictValue" :value="item.dictKey" /> |
| | | </el-select> |
| | | </div> |
| | |
| | | |
| | | <script setup> |
| | | |
| | | import { getMultipleDictionary } from '@/api/system/dictbiz' |
| | | import { getMultipleDictionary } from '@/api/system/dictbiz'; |
| | | import { pxToRem } from '@/utils/rem' |
| | | |
| | | // 接收父组件传参 |
| | | const props = defineProps({ |
| | |
| | | default: false |
| | | }, |
| | | setWidth: { |
| | | type: String, |
| | | type: Number, |
| | | default: '100%' |
| | | } |
| | | }); |