| | |
| | | <div class="task-intermediate-content"> |
| | | <SearchBox @search="searchClick" @addTask="handleAddTask"></SearchBox> |
| | | <div class="task-table"> |
| | | <el-table |
| | | stripe |
| | | :data="jobListData" |
| | | :row-class-name="tableRowClassName" |
| | | :row-style="{ height: '54px', fontSize: '14px', 'text-align': 'center' }" |
| | | :header-cell-style="{ 'text-align': 'center', height: '36px', fontSize: '14px' }" |
| | | > |
| | | <el-table border :data="jobListData" class="custom-header"> |
| | | <el-table-column label="序号" type="index" width="60"> |
| | | <template #default="{ $index }"> |
| | | {{ ($index + 1 + (jobListParams.current - 1) * jobListParams.size).toString().padStart(2, '0') }} |
| | | {{ ($index + 1 + (jobListParams.current - 1) * jobListParams.size).toString().padStart(2, |
| | | '0') }} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="job_info_num" label="任务编号" show-overflow-tooltip align="center" /> |
| | | <el-table-column prop="name" label="任务名称" show-overflow-tooltip align="center" /> |
| | | <el-table-column prop="dept_name" label="所属部门" width="200" align="center" /> |
| | | <el-table-column prop="device_names" label="所属机巢" /> |
| | | <el-table-column prop="job_info_num" label="任务编号" width="160"> |
| | | <template #default="scope"> |
| | | <el-tooltip-copy :content="scope.row.job_info_num" :showCopyText="true"> |
| | | {{scope.row.job_info_num}} |
| | | </el-tooltip-copy> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="name" label="任务编号" width="160"> |
| | | <template #default="scope"> |
| | | <el-tooltip-copy :content="scope.row.name" :showCopyText="true"> |
| | | {{scope.row.name}} |
| | | </el-tooltip-copy> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="device_names" label="所属机巢" show-overflow-tooltip/> |
| | | <el-table-column prop="ai_type_str" label="关联算法" show-overflow-tooltip align="center" /> |
| | | <el-table-column label="任务状态" align="center"> |
| | | <template #default="scope"> |
| | | <span |
| | | :style="{ |
| | | color: |
| | | scope.row.status === 1 |
| | | ? '#ffe17e' |
| | | : scope.row.status === 2 |
| | | ? '#ffa768' |
| | | <div class="base_f_c_c"> |
| | | <span :style="{ |
| | | color: |
| | | scope.row.status === 1 |
| | | ? '#00CDC2' |
| | | : scope.row.status === 2 |
| | | ? '#FF720F' |
| | | : scope.row.status === 3 |
| | | ? '#8effac' |
| | | : scope.row.status === 5 |
| | | ? '#FF4848' |
| | | : scope.row.status === 7 |
| | | ? '#A6A6A6' |
| | | : '', |
| | | }" |
| | | > |
| | | ? '#00AA2D' |
| | | : scope.row.status === 5 |
| | | ? '#FF4848' |
| | | : scope.row.status === 7 |
| | | ? '#A6A6A6' |
| | | : '', |
| | | }"> |
| | | {{ scope.row.status ? getStatusText(scope.row.status) : '' }} |
| | | </span> |
| | | <el-tooltip |
| | | class="item" |
| | | effect="dark" |
| | | :content="scope.row.reason" |
| | | placement="top" |
| | | popper-class="reasonNotFly ztzf-tooltip-box1" |
| | | > |
| | | <el-icon v-if="scope.row.status === 5 && scope.row.reason" color="#FF4848"><QuestionFilled /></el-icon> |
| | | </el-tooltip> |
| | | </div> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="is_circle_job" label="任务类型" align="center"> |
| | |
| | | <span>{{ scope.row.event_number ? scope.row.event_number : '/' }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="cycle_time_value" label="任务时间" /> |
| | | <el-table-column prop="creator_name" label="创建人" align="center" /> |
| | | <el-table-column prop="cycle_time_value" label="任务时间" show-overflow-tooltip /> |
| | | <el-table-column prop="dept_name" label="创建部门" width="200" align="center" /> |
| | | <el-table-column prop="creator_name" label="创建人" align="center" show-overflow-tooltip /> |
| | | <el-table-column label="操作" width="200" align="center"> |
| | | <template #default="scope"> |
| | | <div |
| | | v-if="scope.row.status === 2" |
| | | class="btnItem turnBack" |
| | | link |
| | | type="primary" |
| | | @click="turnBack(scope.row)" |
| | | > |
| | | <!-- <el-button type="text" @click="rejectDetail(row.id)">驳回原因</el-button> --> |
| | | <el-button icon="el-icon-back" v-if="scope.row.status === 2" type="text" |
| | | @click="turnBack(scope.row)"> |
| | | 返航 |
| | | </div> |
| | | <div |
| | | v-if="scope.row.status === 1" |
| | | class="btnItem cancelTask" |
| | | link |
| | | type="primary" |
| | | @click="cancelTask(scope.row)" |
| | | > |
| | | </el-button> |
| | | <el-button icon="el-icon-close" v-if="scope.row.status === 1" type="text" |
| | | @click="cancelTask(scope.row)"> |
| | | 取消任务 |
| | | </div> |
| | | <div class="btnItem" link type="primary" @click="handleDetail(scope.row)">查看</div> |
| | | </el-button> |
| | | <el-button icon="el-icon-view" type="text" @click="handleDetail(scope.row)">查看</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </div> |
| | | <div class="pagination"> |
| | | <el-pagination |
| | | class="ztzf-pagination" |
| | | popper-class="custom-pagination-dropdown" |
| | | v-model:current-page="jobListParams.current" |
| | | v-model:page-size="jobListParams.size" |
| | | :page-sizes="[10, 20, 30, 40]" |
| | | layout="prev, pager, next, sizes, jumper" |
| | | :total="total" |
| | | @size-change="handleSizeChange" |
| | | @current-change="handleCurrentChange" |
| | | /> |
| | | <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="jobListParams.current" |
| | | v-model:page-size="jobListParams.size" layout="total, sizes, prev, pager, next, jumper" :total="total" |
| | | @size-change="handleSizeChange" @current-change="handleCurrentChange" /> |
| | | </div> |
| | | </div> |
| | | <!-- 添加任务 --> |
| | |
| | | :wayLineJodInfoId="rowData.id" |
| | | /> --> |
| | | <!-- 历史任务详情 --> |
| | | <DeviceJobDetails |
| | | v-if="isShowDeviceJobDetails" |
| | | v-model:show="isShowDeviceJobDetails" |
| | | :wayLineJodInfoId="rowData.id" |
| | | :batchNo="rowData.batch_no" |
| | | /> |
| | | <CancelTaskDialog |
| | | ref="cancelTaskDialogRef" |
| | | v-model:isShowCancelTask="isShowCancelTask" |
| | | :row-data="rowData" |
| | | @refresh="getJobList" |
| | | /> |
| | | <DeviceJobDetails v-if="isShowDeviceJobDetails" v-model:show="isShowDeviceJobDetails" :wayLineJodInfoId="rowData.id" |
| | | :batchNo="rowData.batch_no" :jobId="jobId"/> |
| | | <CancelTaskDialog ref="cancelTaskDialogRef" v-model:isShowCancelTask="isShowCancelTask" :row-data="rowData" |
| | | @refresh="getJobList" /> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import SearchBox from '../SearchBox.vue' |
| | | import AddTask from './AddTask.vue' |
| | | // import CurrentTaskDetails from '@/components/CurrentTaskDetails/CurrentTaskDetails.vue' |
| | | import { jobList, cancelJobs, taskReturnLines } from '@/api/job/task' |
| | | import { jobList, cancelJobs, taskReturnLines, returnHomeCluster, statusChangedApi } from '@/api/job/task'; |
| | | import { ElMessage } from 'element-plus' |
| | | import DeviceJobDetails from '../DeviceJobDetails.vue' |
| | | import CancelTaskDialog from '../CancelTaskDialog.vue' |
| | | import { useStore } from 'vuex' |
| | | import { cloneDeep } from 'lodash' |
| | | import { inject, onBeforeUnmount } from 'vue'; |
| | | import ElTooltipCopy from '@/components/ElTooltipCopy.vue'; |
| | | const store = useStore() |
| | | const singleUavHome = computed(() => store.state.home.singleUavHome) |
| | | const jobListParams = reactive({ |
| | |
| | | |
| | | // 获取任务列表 |
| | | const getJobList = () => { |
| | | jobList(jobListParams).then(res => { |
| | | const apiParams = { |
| | | ...cloneDeep(jobListParams), |
| | | searchParams: { |
| | | ...cloneDeep(jobListParams.searchParams), |
| | | status_list: jobListParams.searchParams.status || undefined, |
| | | status: undefined, |
| | | }, |
| | | } |
| | | jobList(apiParams).then(res => { |
| | | if (res.data.code !== 0) return |
| | | jobListData.value = res.data.data.records |
| | | total.value = res.data.data.total |
| | |
| | | |
| | | // 查看当前任务详情 如果是一台机则显示详情 如果是多台机则进入集群调度(暂未开发) |
| | | let rowData = ref({}) |
| | | const jobId = ref('') |
| | | const handleDetail = row => { |
| | | if (!row.device_sns.length) return ElMessage.warning('没有device_sns') |
| | | if (row.device_sns.length !== 1) return ElMessage.success('即将跳转到集群调度') |
| | | // if (row.device_sns.length !== 1) return ElMessage.success('即将跳转到集群调度') |
| | | rowData.value = row ? row : {} |
| | | if (row.device_sns.length > 1 && (row.status === 2 || row.status === 1)) { |
| | | const adminUrl = `${import.meta.env.VITE_APP_AREA_NAME}/command-center-dashboard/#/clusterScheduling` |
| | | const targetPath = `taskNo=${encodeURIComponent(rowData.value.job_info_num)}` |
| | | window.open(`${adminUrl}?${targetPath}`, '_blank') |
| | | return |
| | | } |
| | | jobId.value = rowData.value?.job_id |
| | | if (row.status === 2 || row.status === 1) { |
| | | // isShowCurrentTaskDetails.value = true |
| | | // 跳转大屏当前任务详情 |
| | |
| | | } |
| | | // 返航 |
| | | const turnBack = row => { |
| | | taskReturnLines(row.device_sns).then(res => { |
| | | if (row.returnStatus === '待机') return |
| | | |
| | | if (row.returnStatus === '自动返航') return ElMessage.success('无人机返航中') |
| | | |
| | | if (row.returnStatus === '自动降落') return ElMessage.success('无人机降落中') |
| | | returnHomeCluster(row.device_sns).then(res => { |
| | | if (res.data.code !== 0) return |
| | | ElMessage.success('返航操作成功') |
| | | getJobList() |
| | | }) |
| | | } |
| | | |
| | | function handleCellClick(row, column) { |
| | | if (column.no === 1) { |
| | | navigator.clipboard.writeText(row.job_info_num).then(() => { |
| | | ElMessage.success('复制任务编号成功') |
| | | }) |
| | | } else if (column.no === 2) { |
| | | navigator.clipboard.writeText(row.name).then(() => { |
| | | ElMessage.success('复制任务名称成功') |
| | | }) |
| | | } |
| | | } |
| | | |
| | | |
| | | 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) |
| | | |
| | | onBeforeUnmount(() => { |
| | | clearInterval(polling) |
| | | }) |
| | | |
| | | onMounted(() => { |
| | | // getJobList() |
| | |
| | | |
| | | <style lang="scss" scoped> |
| | | .task-intermediate-content { |
| | | margin: 0 30px 16px 40px; |
| | | height: 0; |
| | | flex: 1; |
| | | margin: 0 10px 10px 10px; |
| | | background-color: #ffffff; |
| | | padding: 14px 18px; |
| | | padding: 10px 20px; |
| | | border-radius: 5px; |
| | | display: flex; |
| | | flex-direction: column; |
| | | |
| | | // 表格 |
| | | .task-table { |
| | | height: 520px; |
| | | height: 0; |
| | | flex: 1; |
| | | margin-top: 18px; |
| | | overflow: auto; |
| | | } |
| | | |
| | | .btnItem { |
| | | height: 27px; |
| | | line-height: 27px; |
| | |
| | | border: 1px solid #ffa500; |
| | | color: #ffa500; |
| | | } |
| | | |
| | | &.cancelTask { |
| | | border: 1px solid #3efe96; |
| | | color: #3efe96; |
| | | border: 1px solid #00AA2D; |
| | | color: #00AA2D; |
| | | } |
| | | } |
| | | :deep(.el-table) { |
| | | --el-table-tr-bg-color: #ffffff; |
| | | --el-table-striped-bg-color: #EFEFEF; |
| | | |
| | | .el-table__body tr.el-table__row--striped td { |
| | | background-color: var(--el-table-striped-bg-color); |
| | | } |
| | | } |
| | | |
| | | // :deep(.el-table) { |
| | | // --el-table-tr-bg-color: #ffffff; |
| | | // --el-table-striped-bg-color: #EFEFEF; |
| | | |
| | | // .el-table__body tr.el-table__row--striped td { |
| | | // background-color: var(--el-table-striped-bg-color); |
| | | // } |
| | | // } |
| | | // 分页 |
| | | :deep(.custom-header th.el-table__cell) { |
| | | color: rgba(0, 0, 0, 0.85); |
| | | } |
| | | |
| | | :deep(.el-table td.el-table__cell) { |
| | | color: #606266; |
| | | } |
| | | |
| | | :deep(.el-pagination) { |
| | | display: flex; |
| | | justify-content: center; |
| | | justify-content: right; |
| | | } |
| | | |
| | | :deep(.el-pagination button) { |
| | | background: center center no-repeat none !important; |
| | | color: #8eb8ea !important; |