|  | @@ -9,10 +9,7 @@
 | 
	
		
			
				|  |  |      <ProTable ref="proTable" :columns="columns" row-key="id" :request-api="listTrackSequenceApi">
 | 
	
		
			
				|  |  |        <!-- 表格 header 按钮 -->
 | 
	
		
			
				|  |  |        <template #tableHeader="scope">
 | 
	
		
			
				|  |  | -        <el-button type="primary" v-auth="['demo:trackSequence:add']" icon="CirclePlus" @click="openDialog(1, '注视轨迹序列新增')">
 | 
	
		
			
				|  |  | -          新增(MASC)
 | 
	
		
			
				|  |  | -        </el-button>
 | 
	
		
			
				|  |  | -        <el-button type="primary" v-auth="['demo:trackSequence:add']" icon="CirclePlus" @click="addCATDialog()"> 新增(CAT) </el-button>
 | 
	
		
			
				|  |  | +        <el-button type="primary" v-auth="['demo:trackSequence:add']" icon="CirclePlus" @click="openDialog(1, '注视轨迹序列新增')"> 新增 </el-button>
 | 
	
		
			
				|  |  |          <!-- <el-button type="primary" v-auth="['demo:trackSequence:import']" icon="Upload" plain @click="batchAdd"> 导入 </el-button>
 | 
	
		
			
				|  |  |          <el-button type="primary" v-auth="['demo:trackSequence:export']" icon="Download" plain @click="downloadFile"> 导出 </el-button> -->
 | 
	
		
			
				|  |  |          <el-button
 | 
	
	
		
			
				|  | @@ -28,10 +25,11 @@
 | 
	
		
			
				|  |  |        </template>
 | 
	
		
			
				|  |  |        <!-- 表格操作 -->
 | 
	
		
			
				|  |  |        <template #operation="scope">
 | 
	
		
			
				|  |  | -        <el-button type="primary" link icon="View" v-if="scope.row.algorithmModelId != null" @click="openModelDialog(scope.row.id)">
 | 
	
		
			
				|  |  | +        <el-button type="primary" link icon="View" @click="openDialog(3, '详情', scope.row)">
 | 
	
		
			
				|  |  |            <!--@click="openStartDialog(scope.row)"  -->
 | 
	
		
			
				|  |  |            详情
 | 
	
		
			
				|  |  |          </el-button>
 | 
	
		
			
				|  |  | +        <el-button type="primary" link icon="EditPen" @click="openDialog(2, '编辑', scope.row)"> 编辑 </el-button>
 | 
	
		
			
				|  |  |          <el-button
 | 
	
		
			
				|  |  |            type="primary"
 | 
	
		
			
				|  |  |            link
 | 
	
	
		
			
				|  | @@ -116,8 +114,6 @@
 | 
	
		
			
				|  |  |          >
 | 
	
		
			
				|  |  |            模型
 | 
	
		
			
				|  |  |          </el-button>
 | 
	
		
			
				|  |  | -        <!-- <el-button type="primary" link icon="View" v-auth="['demo:toInfrared:query']" @click="openDialog(3, '查看', scope.row)"> 查看 </el-button> -->
 | 
	
		
			
				|  |  | -        <!-- <el-button type="primary" link icon="EditPen"v-auth="['demo:toInfrared:edit']" @click="openDialog(2, '编辑', scope.row)"> 编辑 </el-button> -->
 | 
	
		
			
				|  |  |          <el-button
 | 
	
		
			
				|  |  |            type="primary"
 | 
	
		
			
				|  |  |            link
 | 
	
	
		
			
				|  | @@ -154,9 +150,12 @@
 | 
	
		
			
				|  |  |                  <el-link :href="model.url" type="primary" icon="Download" :underline="false" target="_blank" style="margin-right: 20px"
 | 
	
		
			
				|  |  |                    >下载
 | 
	
		
			
				|  |  |                  </el-link>
 | 
	
		
			
				|  |  | -                <el-button type="success" link @click="addModel(model.path, model.name)"
 | 
	
		
			
				|  |  | -                  ><el-icon> <Plus /> </el-icon>添加模型</el-button
 | 
	
		
			
				|  |  | -                >
 | 
	
		
			
				|  |  | +                <el-button type="success" link @click="addModel(model.path, model.name)">
 | 
	
		
			
				|  |  | +                  <el-icon>
 | 
	
		
			
				|  |  | +                    <Plus />
 | 
	
		
			
				|  |  | +                  </el-icon>
 | 
	
		
			
				|  |  | +                  添加模型
 | 
	
		
			
				|  |  | +                </el-button>
 | 
	
		
			
				|  |  |                </el-form-item>
 | 
	
		
			
				|  |  |              </el-form>
 | 
	
		
			
				|  |  |            </el-card>
 | 
	
	
		
			
				|  | @@ -197,7 +196,7 @@ import {
 | 
	
		
			
				|  |  |  } from '@/api/modules/demo/trackSequence'
 | 
	
		
			
				|  |  |  import { enumAlgorithmModelTrackApi } from '@/api/modules/demo/AlgorithmModelTrack'
 | 
	
		
			
				|  |  |  import { getAlgorithmModelTrackApi } from '@/api/modules/demo/AlgorithmModelTrack'
 | 
	
		
			
				|  |  | -import { enumAlgorithmConfigTrackApi } from '@/api/modules/demo/AlgorithmConfigTrack'
 | 
	
		
			
				|  |  | +import { enumAlgorithmConfigTrackApi, getAlgorithmConfigTrackApi } from '@/api/modules/demo/AlgorithmConfigTrack'
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import { listDataSeqApi } from '@/api/modules/demo/DataSeq'
 | 
	
		
			
				|  |  |  import statusEnums from '@/utils/status'
 | 
	
	
		
			
				|  | @@ -209,6 +208,7 @@ import { resetHeart } from '@/utils/websocket'
 | 
	
		
			
				|  |  |  import PreviewCompareImages from '@/views/demo/components/PreviewCompareImages.vue'
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import ShowStatisticResult from '@/views/demo/components/ShowStatisticResult.vue'
 | 
	
		
			
				|  |  | +import { getTargetDetectionApi } from '@/api/modules/demo/TargetDetection'
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  const showStatisticResultRef = ref()
 | 
	
		
			
				|  |  |  const showEvaluateResultRef = ref()
 | 
	
	
		
			
				|  | @@ -557,10 +557,17 @@ 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 getTrackSequenceApi(row?.id || null)
 | 
	
		
			
				|  |  | +    res = await getTrackSequenceApi(row.id || null)
 | 
	
		
			
				|  |  | +    const params = JSON.parse(res.data['algorithmParameters'])
 | 
	
		
			
				|  |  | +    if (params.otherParams) {
 | 
	
		
			
				|  |  | +      res.data = { ...res.data, ...params.otherParams }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    // 重置表单
 | 
	
		
			
				|  |  |    setItemsOptions()
 | 
	
		
			
				|  |  | +  if (row?.id) {
 | 
	
		
			
				|  |  | +    itemsOptions = await updateItemsOptions(row.algorithmId)
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  |    const params = {
 | 
	
		
			
				|  |  |      title,
 | 
	
		
			
				|  |  |      width: 580,
 | 
	
	
		
			
				|  | @@ -619,6 +626,14 @@ const columns = reactive<ColumnProps<any>[]>([
 | 
	
		
			
				|  |  |      label: '模型名称',
 | 
	
		
			
				|  |  |      width: 200
 | 
	
		
			
				|  |  |    },
 | 
	
		
			
				|  |  | +  {
 | 
	
		
			
				|  |  | +    prop: 'algorithmParameters',
 | 
	
		
			
				|  |  | +    label: '算法参数',
 | 
	
		
			
				|  |  | +    search: {
 | 
	
		
			
				|  |  | +      el: 'input'
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    width: 150
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  |    // {
 | 
	
		
			
				|  |  |    //   prop: 'algorithmModelId',
 | 
	
		
			
				|  |  |    //   label: '模型',
 | 
	
	
		
			
				|  | @@ -663,6 +678,52 @@ const columns = reactive<ColumnProps<any>[]>([
 | 
	
		
			
				|  |  |    { prop: 'operation', label: '操作', width: 230, fixed: 'right' }
 | 
	
		
			
				|  |  |  ])
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +const remove_unnecessary_parameters = (itemsOptions: ProForm.ItemsOptions[]): ProForm.ItemsOptions[] => {
 | 
	
		
			
				|  |  | +  try {
 | 
	
		
			
				|  |  | +    const endIndex = itemsOptions.findIndex(option => option['label'] === '备注')
 | 
	
		
			
				|  |  | +    if (endIndex !== -1) {
 | 
	
		
			
				|  |  | +      itemsOptions = itemsOptions.slice(0, endIndex + 1)
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    return itemsOptions
 | 
	
		
			
				|  |  | +  } catch (error) {
 | 
	
		
			
				|  |  | +    console.error('移除不必要的参数时出错:', error)
 | 
	
		
			
				|  |  | +    // ElMessage.error('移除不必要的参数时出错,请检查!');
 | 
	
		
			
				|  |  | +    return itemsOptions // 返回原始选项,避免进一步的问题
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +const updateItemsOptions = async (algorithmId: any) => {
 | 
	
		
			
				|  |  | +  try {
 | 
	
		
			
				|  |  | +    const result = await getAlgorithmConfigTrackApi(algorithmId)
 | 
	
		
			
				|  |  | +    if (result.code === 200) {
 | 
	
		
			
				|  |  | +      // 处理结果
 | 
	
		
			
				|  |  | +      const parameters = JSON.parse(result.data['parameters'])
 | 
	
		
			
				|  |  | +      // console.log('parameters: ', parameters)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      const itemsOptions_new = remove_unnecessary_parameters(itemsOptions)
 | 
	
		
			
				|  |  | +      for (const item of parameters) {
 | 
	
		
			
				|  |  | +        // 添加新的表单项选项
 | 
	
		
			
				|  |  | +        itemsOptions_new.push({
 | 
	
		
			
				|  |  | +          label: item['name'],
 | 
	
		
			
				|  |  | +          prop: item['agName'],
 | 
	
		
			
				|  |  | +          rules: [{ required: item['required'], message: item['agName'] + '不能为空', trigger: 'blur' }],
 | 
	
		
			
				|  |  | +          tooltip: item['prompt'],
 | 
	
		
			
				|  |  | +          compOptions: {
 | 
	
		
			
				|  |  | +            elTagName: 'input',
 | 
	
		
			
				|  |  | +            placeholder: item['defaultValue']
 | 
	
		
			
				|  |  | +            // value: item['defaultValue']
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        })
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      formDialogRef.value?.updateItemOptions(itemsOptions_new)
 | 
	
		
			
				|  |  | +      return itemsOptions_new
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  } catch (err) {
 | 
	
		
			
				|  |  | +    console.log(err)
 | 
	
		
			
				|  |  | +    ElMessage.error('获取算法配置失败,请检查!')
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  // 表单配置项
 | 
	
		
			
				|  |  |  let itemsOptions: ProForm.ItemsOptions[] = []
 | 
	
		
			
				|  |  |  const setItemsOptions = () => {
 | 
	
	
		
			
				|  | @@ -697,25 +758,97 @@ const setItemsOptions = () => {
 | 
	
		
			
				|  |  |          placeholder: '请上传数据集'
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +      label: '选择算法',
 | 
	
		
			
				|  |  | +      prop: 'algorithmId',
 | 
	
		
			
				|  |  | +      rules: [{ required: true, message: '算法不能为空', trigger: 'blur' }],
 | 
	
		
			
				|  |  | +      compOptions: {
 | 
	
		
			
				|  |  | +        elTagName: 'select',
 | 
	
		
			
				|  |  | +        placeholder: '请选择算法',
 | 
	
		
			
				|  |  | +        enum: enumsAlgorithmConfigTrack,
 | 
	
		
			
				|  |  | +        clearable: true,
 | 
	
		
			
				|  |  | +        onChange: async (value: any) => {
 | 
	
		
			
				|  |  | +          if (value != undefined && value != null && value != '') {
 | 
	
		
			
				|  |  | +            await updateItemsOptions(value)
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +      label: '任务类型',
 | 
	
		
			
				|  |  | +      prop: 'type',
 | 
	
		
			
				|  |  | +      rules: [{ required: true, message: '任务类型不能为空', trigger: 'blur' }],
 | 
	
		
			
				|  |  | +      compOptions: {
 | 
	
		
			
				|  |  | +        disabled: true,
 | 
	
		
			
				|  |  | +        elTagName: 'select',
 | 
	
		
			
				|  |  | +        placeholder: '请选择模任务类型',
 | 
	
		
			
				|  |  | +        enum: enumsAlgorithmType,
 | 
	
		
			
				|  |  | +        clearable: true,
 | 
	
		
			
				|  |  | +        value: ''
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      show: params => {
 | 
	
		
			
				|  |  | +        if (params.value.algorithmId != undefined) {
 | 
	
		
			
				|  |  | +          for (let i = 0; i < enumsAlgorithmConfigTrack.value.length; i++) {
 | 
	
		
			
				|  |  | +            if (enumsAlgorithmConfigTrack.value[i]['value'] === params.value.algorithmId) {
 | 
	
		
			
				|  |  | +              params.value.type = enumsAlgorithmConfigTrack.value[i]['type']
 | 
	
		
			
				|  |  | +              return true
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return false
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |        label: '选择模型',
 | 
	
		
			
				|  |  |        prop: 'algorithmModelId',
 | 
	
		
			
				|  |  |        rules: [{ required: true, message: '模型不能为空', trigger: 'blur' }],
 | 
	
		
			
				|  |  | +      show: params => {
 | 
	
		
			
				|  |  | +        if (params.value.type == AlgorithmType2['预测/推理']) {
 | 
	
		
			
				|  |  | +          return true
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        params.value.algorithmModelId = ''
 | 
	
		
			
				|  |  | +        return false
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  |        compOptions: {
 | 
	
		
			
				|  |  |          elTagName: 'select',
 | 
	
		
			
				|  |  |          placeholder: '请选择模型',
 | 
	
		
			
				|  |  | -        enum: enumsAlgorithmModelTrack
 | 
	
		
			
				|  |  | +        enum: enumsAlgorithmModelTrack,
 | 
	
		
			
				|  |  | +        clearable: true
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  | -      label: '选择算法',
 | 
	
		
			
				|  |  | -      prop: 'algorithmId',
 | 
	
		
			
				|  |  | -      rules: [{ required: true, message: '请选择算法', trigger: 'blur' }],
 | 
	
		
			
				|  |  | +      label: '选择目标检测模型',
 | 
	
		
			
				|  |  | +      prop: 'algorithmModelTargetDetectionId',
 | 
	
		
			
				|  |  | +      rules: [{ required: false, message: '目标检测模型不能为空', trigger: 'blur' }],
 | 
	
		
			
				|  |  | +      show: params => {
 | 
	
		
			
				|  |  | +        if (params.value.type == AlgorithmType2['预测/推理']) {
 | 
	
		
			
				|  |  | +          return true
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        params.value.algorithmModelTargetDetectionId = ''
 | 
	
		
			
				|  |  | +        return false
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  |        compOptions: {
 | 
	
		
			
				|  |  | -        disabled: false,
 | 
	
		
			
				|  |  |          elTagName: 'select',
 | 
	
		
			
				|  |  | -        placeholder: '请输入算法',
 | 
	
		
			
				|  |  | -        enum: enumsAlgorithmConfigTrack
 | 
	
		
			
				|  |  | +        placeholder: '请选择目标检测模型',
 | 
	
		
			
				|  |  | +        enum: enumsAlgorithmModelTrack_TD,
 | 
	
		
			
				|  |  | +        clearable: true
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +      label: '上传标签',
 | 
	
		
			
				|  |  | +      prop: 'inputLabelOssId',
 | 
	
		
			
				|  |  | +      rules: [{ required: true, message: '标签不能为空', trigger: 'blur' }],
 | 
	
		
			
				|  |  | +      show: params => {
 | 
	
		
			
				|  |  | +        if (params.value.type == AlgorithmType2['测试']) {
 | 
	
		
			
				|  |  | +          return true
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return false
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      compOptions: {
 | 
	
		
			
				|  |  | +        elTagName: 'file-upload',
 | 
	
		
			
				|  |  | +        fileSize: 4096,
 | 
	
		
			
				|  |  | +        fileType: ['txt'],
 | 
	
		
			
				|  |  | +        placeholder: '请上传标签'
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      {
 | 
	
	
		
			
				|  | @@ -819,6 +952,7 @@ onMounted(async () => {
 | 
	
		
			
				|  |  |  })
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  const enumsAlgorithmModelTrack = ref<any>([])
 | 
	
		
			
				|  |  | +const enumsAlgorithmModelTrack_TD = ref<any>([])
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  const updateEnumsAlgorithmModelTrack = async () => {
 | 
	
		
			
				|  |  |    const result: any = await enumAlgorithmModelTrackApi()
 | 
	
	
		
			
				|  | @@ -829,11 +963,16 @@ const updateEnumsAlgorithmModelTrack = async () => {
 | 
	
		
			
				|  |  |      if (item.type !== AlgorithmType2['预测/推理']) {
 | 
	
		
			
				|  |  |        continue
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    if (SubSystem[item['subsystem']] === '注释轨迹序列' || SubSystem[item['subsystem']] === '目标检测') {
 | 
	
		
			
				|  |  | +    if (SubSystem[item['subsystem']] === '注释轨迹序列') {
 | 
	
		
			
				|  |  |        item['label'] =
 | 
	
		
			
				|  |  |          item['value'] + '_' + item['label'] + '-' + SubSystem[item['subsystem']] + '-' + AlgorithmType[item['type']] + '-' + item['algorithmName']
 | 
	
		
			
				|  |  |        enumsAlgorithmModelTrack.value.push(item)
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | +    if (SubSystem[item['subsystem']] === '目标检测') {
 | 
	
		
			
				|  |  | +      item['label'] =
 | 
	
		
			
				|  |  | +        item['value'] + '_' + item['label'] + '-' + SubSystem[item['subsystem']] + '-' + AlgorithmType[item['type']] + '-' + item['algorithmName']
 | 
	
		
			
				|  |  | +      enumsAlgorithmModelTrack_TD.value.push(item)
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 |