无人机管理后台前端(已迁走)
罗广辉
2025-05-24 9dbd9daa2fa8e457444f392d51b257b834bd22a2
src/views/job/components/TaskIntermediateContent/TaskIntermediateContent.vue
New file
@@ -0,0 +1,295 @@
<!-- 任务统计表格 -->
<template>
   <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-column label="序号" type="index" width="60">
               <template #default="{ $index }">
                  {{ ($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="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'
                              : scope.row.status === 3
                              ? '#8effac'
                              : scope.row.status === 5
                              ? '#FF4848'
                              : scope.row.status === 7
                              ? '#A6A6A6'
                              : '',
                     }"
                  >
                     {{ scope.row.status ? getStatusText(scope.row.status) : '' }}
                  </span>
               </template>
            </el-table-column>
            <el-table-column prop="is_circle_job" label="任务类型" align="center">
               <template #default="scope">
                  <span>{{ scope.row.rep_rule_type ? '周期任务' : '临时任务' }}</span>
               </template>
            </el-table-column>
            <!-- <el-table-column prop="job_num" label="执行次数" /> -->
            <el-table-column prop="event_number" label="关联事件" align="center">
               <template #default="scope">
                  <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 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)"
                  >
                     返航
                  </div>
                  <div
                     v-if="scope.row.status === 1"
                     class="btnItem cancelTask"
                     link
                     type="primary"
                     @click="cancelTask(scope.row)"
                  >
                     取消任务
                  </div>
                  <div class="btnItem" link type="primary" @click="handleDetail(scope.row)">查看</div>
               </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"
         />
      </div>
   </div>
   <!-- 添加任务 -->
   <AddTask v-model:show="isShowAddTask" @refresh="refreshGetJobList" />
   <!-- 当前任务详情 -->
   <!-- <CurrentTaskDetails
      v-if="isShowCurrentTaskDetails"
      v-model:show="isShowCurrentTaskDetails"
      :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"
   />
</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 { ElMessage } from 'element-plus'
import DeviceJobDetails from '../DeviceJobDetails.vue'
import CancelTaskDialog from '../CancelTaskDialog.vue'
import { useStore } from 'vuex'
const store = useStore()
const singleUavHome = computed(() => store.state.home.singleUavHome)
const jobListParams = reactive({
   current: 1,
   size: 10,
   searchParams: {},
})
const jobListData = ref([])
const total = ref(0)
let isShowDeviceJobDetails = ref(false)
let isShowCurrentTaskDetails = ref(false)
let isShowCancelTask = ref(false)
const cancelTaskDialogRef = ref(null)
// 获取任务列表
const getJobList = () => {
   jobList(jobListParams).then(res => {
      if (res.data.code !== 0) return
      jobListData.value = res.data.data.records
      total.value = res.data.data.total
   })
}
// 状态文字
const getStatusText = status => {
   const statusMap = {
      1: '待执行',
      2: '执行中',
      3: '已执行',
      4: '已取消',
      5: '执行失败',
      7: '取消执行',
   }
   return statusMap[status] || '-'
}
// 查看当前任务详情 如果是一台机则显示详情 如果是多台机则进入集群调度(暂未开发)
let rowData = 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 : {}
   if (row.status === 2 || row.status === 1) {
      // isShowCurrentTaskDetails.value = true
      // 跳转大屏当前任务详情
      const adminUrl = `${import.meta.env.VITE_APP_AREA_NAME}/command-center-dashboard/#/taskManage`
      const targetPath = `id=${encodeURIComponent(rowData.value.id)}&batchNo=${encodeURIComponent(rowData.value.batch_no)}`
      window.open(`${adminUrl}?${targetPath}`, '_blank')
   } else {
      isShowDeviceJobDetails.value = true
   }
}
// 分页大小改变
const handleSizeChange = val => {
   jobListParams.size = val
   getJobList()
}
// 页码改变
const handleCurrentChange = val => {
   jobListParams.current = val
   getJobList()
}
// 传参查询条件
const searchClick = params => {
   jobListParams.current = 1
   jobListParams.size = 10
   jobListParams.searchParams = params
   getJobList()
}
const refreshGetJobList = () => {
   jobListParams.current = 1
   jobListParams.size = 10
   getJobList()
}
// 新建任务
const isShowAddTask = ref(false)
const handleAddTask = () => {
   isShowAddTask.value = true
}
const tableRowClassName = ({ row, rowIndex }) => {
   if (rowIndex % 2 === 1) {
      return 'warning-row'
   } else {
      return 'success-row'
   }
}
// 取消任务 0 取消全部 1取消单条
const cancelTask = row => {
   if (row.execute_time_arr?.length && row.execute_time_arr?.length > 0) {
      rowData.value = row
      isShowCancelTask.value = true
   } else {
      cancelTaskDialogRef.value.submitCancelTask(row, 1)
   }
}
// 返航
const turnBack = row => {
   taskReturnLines(row.device_sns).then(res => {
      if (res.data.code !== 0) return
      ElMessage.success('返航操作成功')
      getJobList()
   })
}
onMounted(() => {
   // getJobList()
})
</script>
<style lang="scss" scoped>
.task-intermediate-content {
   margin: 0 30px 16px 40px;
   background-color: #ffffff;
   padding: 14px 18px;
   // 表格
   .task-table {
      height: 520px;
      margin-top: 18px;
      overflow: auto;
   }
   .btnItem {
      height: 27px;
      line-height: 27px;
      border-radius: 0px 0px 0px 0px;
      border: 1px solid #51a8ff;
      font-family: Segoe UI, Segoe UI;
      font-weight: 400;
      font-size: 14px;
      color: #1C5CFF;
      padding: 0 10px;
      display: inline-block;
      margin-right: 10px;
      cursor: pointer;
      &.turnBack {
         border: 1px solid #ffa500;
         color: #ffa500;
      }
      &.cancelTask {
         border: 1px solid #3efe96;
         color: #3efe96;
      }
   }
   :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-pagination) {
      display: flex;
      justify-content: center;
   }
   :deep(.el-pagination button) {
      background: center center no-repeat none !important;
      color: #8eb8ea !important;
   }
}
</style>