Browse Source

Merge branch 'dev_lsk_feature_objtrack' of www/taais-web into develop

Sk18834839360 8 months ago
parent
commit
4e4d0df471

+ 161 - 0
src/api/interface/demo/traceMerge.ts

@@ -0,0 +1,161 @@
+import { PageQuery, BaseEntity } from '@/api/interface/index'
+export interface TraceMergeVO extends BaseEntity {
+  /**
+   * 主键ID
+   */
+  id: string | number
+
+  /**
+   * 任务名称
+   */
+  name: string
+
+  /**
+   * 任务状态
+   */
+  status: string
+
+  /**
+   * 调用算法时所用的参数
+   */
+  parameters: string
+
+  /**
+   * 预处理数据路径
+   */
+  preprocessPath: string
+
+  /**
+   * 结果数据路径
+   */
+  resultPath: string
+
+  /**
+   * 开始时间
+   */
+  startTime: string
+
+  /**
+   * 结束时间
+   */
+  endTime: string
+
+  /**
+   * 耗时
+   */
+  costSecond: number
+
+  /**
+   * 备注
+   */
+  remarks: string
+}
+
+export interface TraceMergeForm {
+  /**
+   * 主键ID
+   */
+  id?: string | number
+
+  /**
+   * 任务名称
+   */
+  name?: string
+
+  /**
+   * 任务状态
+   */
+  status?: string
+
+  /**
+   * 调用算法时所用的参数
+   */
+  parameters?: string
+
+  /**
+   * 预处理数据路径
+   */
+  preprocessPath?: string
+
+  /**
+   * 结果数据路径
+   */
+  resultPath?: string
+
+  /**
+   * 开始时间
+   */
+  startTime?: string
+
+  /**
+   * 结束时间
+   */
+  endTime?: string
+
+  /**
+   * 耗时
+   */
+  costSecond?: number
+
+  /**
+   * 备注
+   */
+  remarks?: string
+
+  /**
+   * 乐观锁
+   */
+  version?: number
+}
+
+export interface TraceMergeQuery extends PageQuery {
+  /**
+   * 任务名称
+   */
+  name?: string
+
+  /**
+   * 任务状态
+   */
+  status?: string
+
+  /**
+   * 调用算法时所用的参数
+   */
+  parameters?: string
+
+  /**
+   * 预处理数据路径
+   */
+  preprocessPath?: string
+
+  /**
+   * 结果数据路径
+   */
+  resultPath?: string
+
+  /**
+   * 开始时间
+   */
+  startTime?: string
+
+  /**
+   * 结束时间
+   */
+  endTime?: string
+
+  /**
+   * 耗时
+   */
+  costSecond?: number
+
+  /**
+   * 备注
+   */
+  remarks?: string
+
+  /**
+   * 日期范围参数
+   */
+  params?: any
+}

+ 78 - 0
src/api/modules/demo/traceMerge.ts

@@ -0,0 +1,78 @@
+import http from '@/api'
+import { TraceMergeVO, TraceMergeForm, TraceMergeQuery } from '@/api/interface/demo/traceMerge'
+/**
+ * @name 查询多物体融合轨迹识别列表
+ * @param query 参数
+ * @returns 返回列表
+ */
+export const listTraceMergeApi = (query: TraceMergeQuery) => {
+  return http.get<TraceMergeVO[]>('/demo/traceMerge/list', query, { loading: true })
+}
+
+/**
+ * @name 查询多物体融合轨迹识别详细
+ * @param id id
+ * @returns returns
+ */
+export const getTraceMergeApi = (id: string | number) => {
+  return http.get<TraceMergeVO>(`/demo/traceMerge/${id}`)
+}
+
+/**
+ * @name 新增多物体融合轨迹识别
+ * @param data data
+ * @returns returns
+ */
+export const addTraceMergeApi = (data: TraceMergeForm) => {
+  return http.post<any>('/demo/traceMerge', data, { loading: false })
+}
+
+export const executeApi = data => {
+  return http.post<any>('/demo/traceMerge/execute', data, { loading: false })
+}
+
+export const getResApi = data => {
+  return http.get<any>('/demo/traceMerge/result', data, { loading: false })
+}
+
+/**
+ * @name 修改多物体融合轨迹识别
+ * @param data data
+ * @returns returns
+ */
+export const updateTraceMergeApi = (data: TraceMergeForm) => {
+  return http.put<any>('/demo/traceMerge', data, { loading: false })
+}
+
+/**
+ * @name 删除多物体融合轨迹识别
+ * @param id id
+ * @returns returns
+ */
+export const delTraceMergeApi = (id: string | number | Array<string | number>) => {
+  return http.delete<any>(`/demo/traceMerge/${id}`)
+}
+
+/**
+ * @name 下载模板
+ * @returns returns
+ */
+export const importTemplateApi = () => {
+  return http.downloadPost('/demo/traceMerge/importTemplate', {})
+}
+
+/**
+ * @name 导入数据
+ * @returns returns
+ */
+export const importTraceMergeDataApi = (data: any) => {
+  return http.post('/demo/traceMerge/importData', data)
+}
+
+/**
+ * @name 导出数据
+ * @returns returns
+ */
+export const exportTraceMergeApi = (data: any) => {
+  return http.downloadPost('/demo/traceMerge/export', data)
+}

+ 9 - 0
src/views/ag/model/index.vue

@@ -25,6 +25,7 @@
         <el-button type="primary" link icon="EditPen" v-auth="['ag:model:edit']" @click="openDialog(2, '算法模型配置编辑', scope.row)">
           编辑
         </el-button>
+        <el-button type="primary" link icon="EditPen" @click="downloadPtFile(scope.row)"> 下载 </el-button>
         <el-button type="primary" link icon="Delete" v-auth="['ag:model:remove']" @click="deleteModel(scope.row)"> 删除 </el-button>
       </template>
     </ProTable>
@@ -54,6 +55,14 @@ import {
 } from '@/api/modules/ag/model'
 import { getAlgorithmOptionApi } from '@/api/modules/task/task'
 import { listTaskConfigurationApi } from '@/api/modules/task/taskConfiguration'
+import http from '@/api'
+
+const downloadPtFile = function (row) {
+  console.log(row)
+  if (row.modelAddress && row.modelAddress.length > 0) {
+    window.open('/api' + row.modelAddress, '_blank')
+  }
+}
 
 // ProTable 实例
 const proTable = ref<ProTableInstance>()

+ 401 - 0
src/views/demo/traceMerge/index.vue

@@ -0,0 +1,401 @@
+<template>
+  <div class="table-box">
+    <ProTable ref="proTable" :columns="columns" row-key="id" :request-api="listTraceMergeApi">
+      <!-- 表格 header 按钮 -->
+      <template #tableHeader="scope">
+        <el-button type="primary" v-auth="['demo:traceMerge:add']" icon="CirclePlus" @click="createTask"> 新增 </el-button>
+        <el-button type="primary" v-auth="['demo:traceMerge:import']" icon="Upload" plain @click="batchAdd"> 导入 </el-button>
+        <el-button type="primary" v-auth="['demo:traceMerge:export']" icon="Download" plain @click="downloadFile"> 导出 </el-button>
+        <el-button
+          type="danger"
+          v-auth="['demo:traceMerge:remove']"
+          icon="Delete"
+          plain
+          :disabled="!scope.isSelected"
+          @click="batchDelete(scope.selectedListIds)"
+        >
+          批量删除
+        </el-button>
+      </template>
+      <!-- 表格操作 -->
+      <template #operation="scope">
+        <el-button type="primary" link icon="View" v-auth="['demo:traceMerge:query']" @click="openDialog(3, '多物体融合轨迹识别查看', scope.row)">
+          查看
+        </el-button>
+        <!--        <el-button type="primary" link icon="EditPen" v-auth="['demo:traceMerge:edit']" @click="openDialog(2, '多物体融合轨迹识别编辑', scope.row)">-->
+        <!--          编辑-->
+        <!--        </el-button>-->
+        <!--        <el-button type="primary" link icon="Delete" v-auth="['demo:traceMerge:remove']" @click="deleteTraceMerge(scope.row)"> 删除 </el-button>-->
+        <el-button type="primary" link icon="View" @click="execute(scope.row)"> 执行任务 </el-button>
+        <el-button type="primary" link icon="View" @click="display(scope.row)"> 展示结果 </el-button>
+        <el-button type="primary" link icon="View" @click="showLog(scope.row)"> 查看日志 </el-button>
+      </template>
+    </ProTable>
+    <FormDialog ref="formDialogRef" />
+    <ImportExcel ref="dialogRef" />
+
+    <el-dialog v-model="createTaskDialogVisible" title="新增任务">
+      <el-container style="display: flex; flex-direction: column; justify-content: center">
+        <el-container>
+          <span style="min-width: 80px">任务名称</span>
+          <el-input v-model="params.name" placeholder="请输入任务名称"></el-input>
+        </el-container>
+        <el-container style="margin-top: 20px">
+          <span style="min-width: 80px">任务文件</span>
+          <file @update:model-value="updateFiles" :file-size="20" :file-type="['mat']"></file>
+        </el-container>
+      </el-container>
+      <span class="dialog-footer">
+        <el-button type="primary" @click="submitCreateTask">确 定</el-button>
+        <el-button @click="createTaskDialogVisible = false">取 消</el-button>
+      </span>
+    </el-dialog>
+
+    <el-dialog v-model="displayDialogVisible" title="执行结果">
+      <el-container direction="vertical">
+        <el-container v-for="(item, index) in resultData" :key="index" direction="horizontal" style="place-items: center center">
+          <span> {{ item.split('/')[item.split('/').length - 1] }} </span>
+          <el-image :src="'/api/profile' + item" style="max-width: 600px; max-height: 300px"></el-image>
+        </el-container>
+      </el-container>
+    </el-dialog>
+
+    <el-dialog v-model="logDialogVisible" title="查看日志">
+      <el-container direction="vertical">
+        <el-container v-for="(item, index) in logData" :key="index">
+          {{ item }}
+        </el-container>
+      </el-container>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup lang="tsx" name="TraceMerge">
+import { reactive, ref } from 'vue'
+import { useHandleData } from '@/hooks/useHandleData'
+import { useDownload } from '@/hooks/useDownload'
+import { ElMessage, ElMessageBox } from 'element-plus'
+import ProTable from '@/components/ProTable/index.vue'
+import ImportExcel from '@/components/ImportExcel/index.vue'
+import FormDialog from '@/components/FormDialog/index.vue'
+import { ColumnProps, ProTableInstance } from '@/components/ProTable/interface'
+import {
+  addTraceMergeApi,
+  delTraceMergeApi,
+  executeApi,
+  exportTraceMergeApi,
+  getResApi,
+  getTraceMergeApi,
+  importTemplateApi,
+  importTraceMergeDataApi,
+  listTraceMergeApi,
+  updateTraceMergeApi
+} from '@/api/modules/demo/traceMerge'
+import File from '@/components/Upload/File.vue'
+import { getDictsApi } from '@/api/modules/system/dictData'
+import http from '@/api'
+
+const logDialogVisible = ref(false)
+const logData = ref([])
+const showLog = async function (row) {
+  let path = row.resultPath.split('ObjectDetection_Web')
+  path = path[path.length - 1]
+  let res = await http.get('/profile' + path + '/fusion.log')
+  // let res = 'hello \r\n world!'
+  logData.value = res.split('\n')
+  logDialogVisible.value = true
+}
+const createTaskDialogVisible = ref(false)
+const params = ref({
+  preprocessPath: null,
+  name: ''
+})
+
+const resultData = ref([])
+const displayDialogVisible = ref(false)
+const display = function (row) {
+  // console.log(row)
+  getResApi({ taskId: row.id }).then(res => {
+    if (res.code !== 200) {
+      ElMessage.error(res.msg)
+      return
+    }
+    let arr = row.resultPath.split('ObjectDetection_Web')
+    let pathPrefix = arr[arr.length - 1]
+    resultData.value = []
+    for (let i = 1; i < res.data[0]; i++) {
+      resultData.value.push(pathPrefix + '/number' + i + '.png')
+    }
+    console.log('resultData', resultData.value)
+    displayDialogVisible.value = true
+  })
+}
+
+const execute = function (row) {
+  executeApi({ taskId: row.id }).then(res => {
+    console.log(res)
+    if (res.code == 200) {
+      ElMessage.success('开始执行!')
+    } else {
+      ElMessage.error('执行失败: ' + res.msg)
+    }
+  })
+}
+
+const createTask = function () {
+  createTaskDialogVisible.value = true
+}
+
+const submitCreateTask = function () {
+  if (params.value.preprocessPath == null || params.value.preprocessPath === '') {
+    ElMessage.error('请上传mat文件!')
+    return
+  } else if (params.value.name == null || params.value.name === '') {
+    ElMessage.error('请输入任务名称!')
+    return
+  }
+  addTraceMergeApi(params.value)
+    .then(res => {
+      console.log(res)
+      if (res.code === 200) {
+        ElMessage.success('创建成功!')
+        createTaskDialogVisible.value = false
+      } else {
+        ElMessage.error(res.msg)
+      }
+    })
+    .catch(err => {
+      console.log(err)
+      ElMessage.error('创建错误!')
+    })
+}
+
+const updateFiles = function (filePath) {
+  console.log('filepath', filePath)
+  params.value.preprocessPath = filePath
+}
+
+// ProTable 实例
+const proTable = ref<ProTableInstance>()
+
+// 删除多物体融合轨迹识别信息
+const deleteTraceMerge = async (params: any) => {
+  await useHandleData(delTraceMergeApi, params.id, '删除【' + params.id + '】多物体融合轨迹识别')
+  proTable.value?.getTableList()
+}
+
+// 批量删除多物体融合轨迹识别信息
+const batchDelete = async (ids: string[]) => {
+  await useHandleData(delTraceMergeApi, ids, '删除所选多物体融合轨迹识别信息')
+  proTable.value?.clearSelection()
+  proTable.value?.getTableList()
+}
+
+// 导出多物体融合轨迹识别列表
+const downloadFile = async () => {
+  ElMessageBox.confirm('确认导出多物体融合轨迹识别数据?', '温馨提示', { type: 'warning' }).then(() =>
+    useDownload(exportTraceMergeApi, '多物体融合轨迹识别列表', proTable.value?.searchParam)
+  )
+}
+
+// 批量添加多物体融合轨迹识别
+const dialogRef = ref<InstanceType<typeof ImportExcel> | null>(null)
+const batchAdd = () => {
+  const params = {
+    title: '多物体融合轨迹识别',
+    tempApi: importTemplateApi,
+    importApi: importTraceMergeDataApi,
+    getTableList: proTable.value?.getTableList
+  }
+  dialogRef.value?.acceptParams(params)
+}
+
+const formDialogRef = ref<InstanceType<typeof FormDialog> | null>(null)
+// 打开弹框的功能
+const openDialog = async (type: number, title: string, row?: any) => {
+  let res = { data: {} }
+  if (row?.id) {
+    res = await getTraceMergeApi(row?.id || null)
+  }
+  // 重置表单
+  setItemsOptions()
+  const params = {
+    title,
+    width: 580,
+    isEdit: type !== 3,
+    itemsOptions: itemsOptions,
+    model: type == 1 ? {} : res.data,
+    api: type == 1 ? addTraceMergeApi : updateTraceMergeApi,
+    getTableList: proTable.value?.getTableList
+  }
+  formDialogRef.value?.openDialog(params)
+}
+
+// 表格配置项
+const columns = reactive<ColumnProps<any>[]>([
+  { type: 'selection', fixed: 'left', width: 70 },
+  { prop: 'id', label: '主键ID' },
+  {
+    prop: 'name',
+    label: '任务名称',
+    search: {
+      el: 'input'
+    },
+    width: 120
+  },
+  {
+    prop: 'status',
+    label: '任务状态',
+    search: {
+      el: 'input'
+    },
+    width: 120,
+    tag: true,
+    enum: () => getDictsApi('biz_task_status'),
+    fieldNames: { label: 'dictLabel', value: 'dictValue' }
+  },
+  {
+    prop: 'parameters',
+    label: '调用算法时所用的参数',
+    search: {
+      el: 'input'
+    },
+    width: 120
+  },
+  {
+    prop: 'preprocessPath',
+    label: '预处理数据路径',
+    search: {
+      el: 'input'
+    },
+    width: 120
+  },
+  {
+    prop: 'resultPath',
+    label: '结果数据路径',
+    search: {
+      el: 'input'
+    },
+    width: 120
+  },
+  {
+    prop: 'startTime',
+    label: '开始时间',
+    search: {
+      el: 'date-picker',
+      props: { type: 'datetimerange', valueFormat: 'YYYY-MM-DD HH:mm:ss' }
+    },
+    width: 120
+  },
+  {
+    prop: 'endTime',
+    label: '结束时间',
+    search: {
+      el: 'date-picker',
+      props: { type: 'datetimerange', valueFormat: 'YYYY-MM-DD HH:mm:ss' }
+    },
+    width: 120
+  },
+  {
+    prop: 'costSecond',
+    label: '耗时',
+    search: {
+      el: 'input'
+    },
+    width: 120
+  },
+  {
+    prop: 'remarks',
+    label: '备注',
+    search: {
+      el: 'input'
+    },
+    width: 120
+  },
+  { prop: 'operation', label: '操作', width: 230, fixed: 'right' }
+])
+// 表单配置项
+let itemsOptions: ProForm.ItemsOptions[] = []
+const setItemsOptions = () => {
+  itemsOptions = [
+    {
+      label: '任务名称',
+      prop: 'name',
+      rules: [{ required: true, message: '任务名称不能为空', trigger: 'blur' }],
+      compOptions: {
+        placeholder: '请输入任务名称'
+      }
+    },
+    {
+      label: '任务状态',
+      prop: 'status',
+      rules: [{ required: true, message: '任务状态不能为空', trigger: 'blur' }],
+      compOptions: {
+        placeholder: '请输入任务状态'
+      }
+    },
+    {
+      label: '调用算法时所用的参数',
+      prop: 'parameters',
+      rules: [{ required: true, message: '调用算法时所用的参数不能为空', trigger: 'blur' }],
+      compOptions: {
+        type: 'textarea',
+        clearable: true,
+        placeholder: '请输入内容'
+      }
+    },
+    {
+      label: '预处理数据路径',
+      prop: 'preprocessPath',
+      rules: [{ required: true, message: '预处理数据路径不能为空', trigger: 'blur' }],
+      compOptions: {
+        placeholder: '请输入预处理数据路径'
+      }
+    },
+    {
+      label: '结果数据路径',
+      prop: 'resultPath',
+      rules: [{ required: true, message: '结果数据路径不能为空', trigger: 'blur' }],
+      compOptions: {
+        placeholder: '请输入结果数据路径'
+      }
+    },
+    {
+      label: '开始时间',
+      prop: 'startTime',
+      rules: [{ required: true, message: '开始时间不能为空', trigger: 'change' }],
+      compOptions: {
+        elTagName: 'date-picker',
+        type: 'date',
+        placeholder: '请选择开始时间'
+      }
+    },
+    {
+      label: '结束时间',
+      prop: 'endTime',
+      rules: [{ required: true, message: '结束时间不能为空', trigger: 'change' }],
+      compOptions: {
+        elTagName: 'date-picker',
+        type: 'date',
+        placeholder: '请选择结束时间'
+      }
+    },
+    {
+      label: '耗时',
+      prop: 'costSecond',
+      rules: [{ required: true, message: '耗时不能为空', trigger: 'blur' }],
+      compOptions: {
+        placeholder: '请输入耗时'
+      }
+    },
+    {
+      label: '备注',
+      prop: 'remarks',
+      rules: [{ required: true, message: '备注不能为空', trigger: 'blur' }],
+      compOptions: {
+        placeholder: '请输入备注'
+      }
+    }
+  ]
+}
+</script>

+ 30 - 29
src/views/task/bizProcess/index.vue

@@ -3,48 +3,52 @@
     <ProTable ref="proTable" :columns="columns" row-key="id" :data="bizProcessList">
       <!-- 表格 header 按钮 -->
       <template #tableHeader="scope">
+        <!--        #tableHeader="scope"-->
         <!-- <el-button type="primary" v-auth="['identification:identificationSubtaskDetails:add']" icon="CirclePlus" @click="openDialog(1, '算法业务处理新增')"> 新增 </el-button>
         <el-button type="primary" v-auth="['identification:identificationSubtaskDetails:import']" icon="Upload" plain @click="batchAdd"> 导入 </el-button> -->
-        <el-button type="primary" v-auth="['identification:identificationSubtaskDetails:export']" icon="Download" plain @click="downloadFile">
-          导出
-        </el-button>
-        <el-button
-          type="danger"
-          v-auth="['identification:identificationSubtaskDetails:remove']"
-          icon="Delete"
-          plain
-          :disabled="!scope.isSelected"
-          @click="batchDelete(scope.selectedListIds)"
-        >
-          批量删除
-        </el-button>
+        <!--        <el-button type="primary" v-auth="['identification:identificationSubtaskDetails:export']" icon="Download" plain @click="downloadFile">-->
+        <!--          导出-->
+        <!--        </el-button>-->
+        <!--        <el-button-->
+        <!--          type="danger"-->
+        <!--          v-auth="['identification:identificationSubtaskDetails:remove']"-->
+        <!--          icon="Delete"-->
+        <!--          plain-->
+        <!--          :disabled="!scope.isSelected"-->
+        <!--          @click="batchDelete(scope.selectedListIds)"-->
+        <!--        >-->
+        <!--          批量删除-->
+        <!--        </el-button>-->
         <el-button type="primary" icon="View" @click="showCompareResult"> 验证指标对比 </el-button>
         <!--        <el-button type="primary" icon="View" @click="showValResult(true)"> 验证结果 </el-button>-->
-        <el-button type="primary" icon="View" @click="showValResult(false)"> 测试结果 </el-button>
+        <el-button type="primary" icon="View" @click="showValResult(false && scope.row)"> 测试结果 </el-button>
         <el-button type="primary" icon="View" @click="showValResult(true)"> 验证结果 </el-button>
       </template>
       <!-- 表格操作 -->
       <template #operation="scope">
-        <el-button
-          type="primary"
-          link
-          icon="View"
-          v-auth="['identification:identificationSubtaskDetails:query']"
-          @click="openDialog(3, '算法业务处理查看', scope.row)"
-        >
-          查看详情
+        <!--        <el-button-->
+        <!--          type="primary"-->
+        <!--          link-->
+        <!--          icon="View"-->
+        <!--          v-auth="['identification:identificationSubtaskDetails:query']"-->
+        <!--          @click="openDialog(3, '算法业务处理查看', scope.row)"-->
+        <!--        >-->
+        <!--          查看详情-->
+        <!--        </el-button>-->
+        <el-button v-if="scope.row.name.indexOf('训练') === -1" type="primary" link icon="Refresh" @click="reRunTask(scope.row)">
+          执行训练
         </el-button>
+        <el-button v-else type="primary" link icon="Refresh" @click="startTask(scope.row)"> 开始训练 </el-button>
 
-        <el-button type="primary" link icon="finished" @click="showResult(scope.row)"> 执行结果 </el-button>
+        <el-button type="primary" link icon="finished" @click="showResult(scope.row)"> 结果 </el-button>
 
         <el-button v-show="scope.row.name.indexOf('训练') === -1" type="primary" link icon="search" @click="showExecutedTime(scope.row)">
           执行时间
         </el-button>
 
-        <el-button v-if="scope.row.name.indexOf('训练') === -1" type="primary" link icon="Refresh" @click="reRunTask(scope.row)">
-          执行训练
+        <el-button type="primary" link icon="document" v-auth="['identification:identificationSubtaskDetails:query']" @click="viewLog(scope.row)">
+          查看日志
         </el-button>
-        <el-button v-else type="primary" link icon="Refresh" @click="startTask(scope.row)"> 开始训练 </el-button>
 
         <el-button type="primary" link icon="Refresh" @click="exportData(scope.row)"> 导出结果 </el-button>
 
@@ -52,9 +56,6 @@
         <!--          编辑-->
         <!--        </el-button>-->
         <!--        <el-button type="primary" link icon="Delete" v-auth="['identification:identificationSubtaskDetails:remove']" @click="deleteBizProcess(scope.row)"> 删除 </el-button>-->
-        <el-button type="primary" link icon="document" v-auth="['identification:identificationSubtaskDetails:query']" @click="viewLog(scope.row)">
-          查看日志
-        </el-button>
       </template>
     </ProTable>
     <FormDialog ref="formDialogRef" />

+ 14 - 14
src/views/task/subtask/index.vue

@@ -2,21 +2,21 @@
   <div class="table-box">
     <ProTable ref="proTable" :is-show-search="false" :columns="columns" row-key="id" :data="subTaskList">
       <!-- 表格 header 按钮 -->
-      <template #tableHeader="scope">
-        <!-- <el-button type="primary" v-auth="['identification:identificationTask:add']" icon="CirclePlus" @click="openDialog(1, '算法子任务新增')"> 新增 </el-button>
+      <!--      <template #tableHeader="scope">-->
+      <!-- <el-button type="primary" v-auth="['identification:identificationTask:add']" icon="CirclePlus" @click="openDialog(1, '算法子任务新增')"> 新增 </el-button>
         <el-button type="primary" v-auth="['identification:identificationTask:import']" icon="Upload" plain @click="batchAdd"> 导入 </el-button> -->
-        <el-button type="primary" v-auth="['identification:identificationTask:export']" icon="Download" plain @click="downloadFile"> 导出 </el-button>
-        <el-button
-          type="danger"
-          v-auth="['identification:identificationTask:remove']"
-          icon="Delete"
-          plain
-          :disabled="!scope.isSelected"
-          @click="batchDelete(scope.selectedListIds)"
-        >
-          批量删除
-        </el-button>
-      </template>
+      <!--        <el-button type="primary" v-auth="['identification:identificationTask:export']" icon="Download" plain @click="downloadFile"> 导出 </el-button>-->
+      <!--        <el-button-->
+      <!--          type="danger"-->
+      <!--          v-auth="['identification:identificationTask:remove']"-->
+      <!--          icon="Delete"-->
+      <!--          plain-->
+      <!--          :disabled="!scope.isSelected"-->
+      <!--          @click="batchDelete(scope.selectedListIds)"-->
+      <!--        >-->
+      <!--          批量删除-->
+      <!--        </el-button>-->
+      <!--      </template>-->
       <!-- 表格操作 -->
       <template #operation="scope">
         <el-button type="primary" link icon="View" v-auth="['identification:identificationTask:query']" @click="viewDetails(scope.row)">