无人机管理后台前端(已迁走)
罗广辉
2025-10-11 02409bfbe15f22fc3b5dccadabfd860a660a49d9
src/views/job/components/TaskIntermediateContent/TaskIntermediateContent.vue
@@ -10,10 +10,21 @@
                     '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">
@@ -58,46 +69,29 @@
               </template>
            </el-table-column>
            <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"
                     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"
                     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"
            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"
         />
         <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>
   <!-- 添加任务 -->
@@ -110,7 +104,7 @@
   /> -->
   <!-- 历史任务详情 -->
   <DeviceJobDetails v-if="isShowDeviceJobDetails" v-model:show="isShowDeviceJobDetails" :wayLineJodInfoId="rowData.id"
      :batchNo="rowData.batch_no" />
      :batchNo="rowData.batch_no" :jobId="jobId"/>
   <CancelTaskDialog ref="cancelTaskDialogRef" v-model:isShowCancelTask="isShowCancelTask" :row-data="rowData"
      @refresh="getJobList" />
</template>
@@ -119,12 +113,14 @@
import SearchBox from '../SearchBox.vue'
import AddTask from './AddTask.vue'
// import CurrentTaskDetails from '@/components/CurrentTaskDetails/CurrentTaskDetails.vue'
import { jobList, cancelJobs, taskReturnLines, returnHomeCluster } 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 { 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({
@@ -141,14 +137,14 @@
// 获取任务列表
const getJobList = () => {
  const apiParams = {
    ...cloneDeep(jobListParams),
    searchParams: {
      ...cloneDeep(jobListParams.searchParams),
      status_list: jobListParams.searchParams.status || undefined,
      status: undefined,
    },
  }
   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
@@ -170,10 +166,18 @@
// 查看当前任务详情 如果是一台机则显示详情 如果是多台机则进入集群调度(暂未开发)
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
      // 跳转大屏当前任务详情
@@ -247,6 +251,33 @@
   })
}
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()
})