无人机管理后台前端(已迁走)
张含笑
2025-09-01 2ca94de8ede18ac07ccfd8dec7b6f6a707adde9b
src/views/job/components/TaskIntermediateContent/TaskIntermediateContent.vue
@@ -3,43 +3,58 @@
   <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">
@@ -53,45 +68,30 @@
                  <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>
   <!-- 添加任务 -->
@@ -103,29 +103,24 @@
      :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({
@@ -142,7 +137,15 @@
// 获取任务列表
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
@@ -163,10 +166,12 @@
// 查看当前任务详情 如果是一台机则显示详情 如果是多台机则进入集群调度(暂未开发)
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('即将跳转到集群调度')
   rowData.value = row ? row : {}
jobId.value = rowData.value?.job_id
   if (row.status === 2 || row.status === 1) {
      // isShowCurrentTaskDetails.value = true
      // 跳转大屏当前任务详情
@@ -228,12 +233,44 @@
}
// 返航
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()
@@ -242,15 +279,23 @@
<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;
@@ -269,24 +314,35 @@
         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;