index.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747
  1. <!--
  2. @Date: 2024-10-29
  3. @Author: ©WANGKANG
  4. @Email: 1686617586@qq.com
  5. -->
  6. <template>
  7. <div class="table-box">
  8. <ProTable ref="proTable" :columns="columns" row-key="id" :request-api="listToInfraredApi">
  9. <!-- 表格 header 按钮 -->
  10. <template #tableHeader="scope">
  11. <el-button type="primary" v-auth="['demo:toInfrared:add']" icon="CirclePlus" @click="openDialog(1, '可见光转红外新增')"> 新增 </el-button>
  12. <!-- <el-button type="primary" v-auth="['demo:toInfrared:import']" icon="Upload" plain @click="batchAdd"> 导入 </el-button>
  13. <el-button type="primary" v-auth="['demo:toInfrared:export']" icon="Download" plain @click="downloadFile"> 导出 </el-button> -->
  14. <el-button
  15. type="danger"
  16. v-auth="['demo:toInfrared:remove']"
  17. icon="Delete"
  18. plain
  19. :disabled="!scope.isSelected"
  20. @click="batchDelete(scope.selectedListIds)"
  21. >
  22. 批量删除
  23. </el-button>
  24. </template>
  25. <!-- 表格操作 -->
  26. <template #operation="scope">
  27. <el-button type="primary" link icon="View" v-if="scope.row.algorithmModelId != null" @click="openModelDialog(scope.row)">
  28. <!--@click="openStartDialog(scope.row)" -->
  29. 详情
  30. </el-button>
  31. <el-button
  32. type="primary"
  33. link
  34. icon="View"
  35. v-auth="['demo:ToInfrared:start']"
  36. v-if="scope.row.status == '0' || scope.row.status == '3' || scope.row.status == '4'"
  37. @click="startToInfrared(scope.row)"
  38. >
  39. <!--@click="openStartDialog(scope.row)" -->
  40. 开始
  41. </el-button>
  42. <el-popconfirm title="确定终止此任务吗?" @confirm="stopToInfrared(scope.row)" v-if="scope.row.status == '1'">
  43. <template #reference>
  44. <el-button type="primary" link icon="Delete"> 终止</el-button>
  45. </template>
  46. </el-popconfirm>
  47. <el-button
  48. type="primary"
  49. link
  50. icon="View"
  51. v-auth="['demo:DataSeq:query']"
  52. v-if="scope.row.status == '2' && scope.row.type == AlgorithmType2['预测/推理']"
  53. @click="preview(scope.row)"
  54. >
  55. 预览
  56. </el-button>
  57. <el-button
  58. type="primary"
  59. link
  60. icon="View"
  61. v-auth="['demo:DataSeq:query']"
  62. v-if="scope.row.status == '2' && scope.row.type == AlgorithmType2['预测/推理']"
  63. @click="showStatisticResultRef.get_statistics_result(scope.row.id)"
  64. >
  65. 结果
  66. </el-button>
  67. <el-button
  68. type="primary"
  69. link
  70. icon="View"
  71. v-auth="['demo:ToInfrared:download']"
  72. v-if="scope.row.status == '2'"
  73. @click="dowloadToInfrared(scope.row)"
  74. >
  75. 下载
  76. </el-button>
  77. <el-button
  78. type="primary"
  79. link
  80. icon="View"
  81. v-auth="['demo:ToInfrared:download']"
  82. v-if="scope.row.status == '2' && scope.row.type == AlgorithmType2['训练']"
  83. @click="showToInfraredModel(scope.row.id)"
  84. >
  85. 模型
  86. </el-button>
  87. <el-button
  88. type="primary"
  89. link
  90. icon="View"
  91. v-auth="['demo:toInfrared:query']"
  92. @click="viewLogRef.handleOpen(scope.row.id)"
  93. v-if="scope.row.status != '0'"
  94. >
  95. 日志
  96. </el-button>
  97. <!-- <el-button type="primary" link icon="View" v-auth="['demo:toInfrared:query']" @click="openDialog(3, '查看', scope.row)"> 查看 </el-button> -->
  98. <!-- <el-button type="primary" link icon="EditPen"v-auth="['demo:toInfrared:edit']" @click="openDialog(2, '编辑', scope.row)"> 编辑 </el-button> -->
  99. <el-button
  100. type="primary"
  101. link
  102. icon="Delete"
  103. v-auth="['demo:toInfrared:remove']"
  104. @click="deleteToInfrared(scope.row)"
  105. :disabled="scope.row.status == '1'"
  106. >
  107. 删除
  108. </el-button>
  109. </template>
  110. </ProTable>
  111. <FormDialog ref="formDialogRef" />
  112. <ImportExcel ref="dialogRef" />
  113. <PreviewCompareImages ref="previewImagesRef" />
  114. <ViewLog ref="viewLogRef" :get-log-api="getLogToInfraredApi" />
  115. <ShowStatisticResult ref="showStatisticResultRef" :api="getStatisticsResultToInfraredApi" />
  116. <el-dialog v-model="showModelDialogVisible" title="模型列表" width="900">
  117. <el-scrollbar ref="scrollbarRef" id="scrollbarRef1" height="500px">
  118. <template v-for="model in model_list" :key="model">
  119. <el-card style="width: 100%; margin-bottom: 10px">
  120. <el-form label-width="130px" label-position="left">
  121. <el-form-item label="Model Name">
  122. {{ model.name }}
  123. </el-form-item>
  124. <el-form-item label="Model Path">
  125. {{ model.path }}
  126. </el-form-item>
  127. <el-form-item label="Model Size">
  128. {{ model.size }}
  129. </el-form-item>
  130. <el-form-item label="操作">
  131. <el-link :href="model.url" type="primary" icon="Download" :underline="false" target="_blank" style="margin-right: 20px"
  132. >下载
  133. </el-link>
  134. <el-button type="success" link @click="addToInfraredModel(model.path)">
  135. <el-icon>
  136. <Plus />
  137. </el-icon>
  138. 添加模型
  139. </el-button>
  140. </el-form-item>
  141. </el-form>
  142. </el-card>
  143. </template>
  144. </el-scrollbar>
  145. </el-dialog>
  146. </div>
  147. </template>
  148. <script setup lang="tsx" name="ToInfrared">
  149. import { ref, reactive, onMounted, Ref, nextTick } from 'vue'
  150. import { useHandleData } from '@/hooks/useHandleData'
  151. import { useDownload } from '@/hooks/useDownload'
  152. import { ElMessage, ElMessageBox } from 'element-plus'
  153. import ProTable from '@/components/ProTable/index.vue'
  154. import ImportExcel from '@/components/ImportExcel/index.vue'
  155. import FormDialog from '@/components/FormDialog/index.vue'
  156. import { ProTableInstance, ColumnProps } from '@/components/ProTable/interface'
  157. import {
  158. listToInfraredApi,
  159. delToInfraredApi,
  160. addToInfraredApi,
  161. updateToInfraredApi,
  162. importTemplateApi,
  163. importToInfraredDataApi,
  164. exportToInfraredApi,
  165. startToInfraredApi,
  166. stopToInfraredApi,
  167. dowloadToInfraredApi,
  168. getToInfraredApi,
  169. getLogToInfraredApi,
  170. showToInfraredModelApi,
  171. previewPredictResultToInfraredModelApi,
  172. getStatisticsResultToInfraredApi
  173. } from '@/api/modules/demo/toInfrared'
  174. import { getImagesApi, listDataSeqApi } from '@/api/modules/demo/DataSeq'
  175. import { enumAlgorithmModelTrackApi } from '@/api/modules/demo/AlgorithmModelTrack'
  176. import { getAlgorithmModelTrackApi } from '@/api/modules/demo/AlgorithmModelTrack'
  177. import { enumAlgorithmConfigTrackApi } from '@/api/modules/demo/AlgorithmConfigTrack'
  178. import statusEnums from '@/utils/status'
  179. import { AlgorithmType, SubSystem, SubSystem__, enumsAlgorithmType, enumsSubSystem, AlgorithmType2 } from '@/views/demo/utils'
  180. import PreviewCompareImages from '@/views/demo/components/PreviewCompareImages.vue'
  181. import { addAlgorithmModelTrackApi } from '@/api/modules/demo/AlgorithmModelTrack'
  182. import ViewLog from '@/views/demo/components/ViewLog.vue'
  183. import useWebSocketStore from '@/stores/modules/websocket'
  184. import { resetHeart } from '@/utils/websocket'
  185. import ShowStatisticResult from '@/views/demo/components/ShowStatisticResult.vue'
  186. const showStatisticResultRef = ref()
  187. onMounted(() => {
  188. const websocketStore = useWebSocketStore()
  189. websocketStore.websocket.onmessage = (e: any) => {
  190. if (e.data.indexOf('heartbeat') > 0) {
  191. resetHeart()
  192. }
  193. if (e.data.indexOf('ping') > 0) {
  194. return
  195. }
  196. // console.log(e)
  197. proTable.value?.getTableList(true)
  198. }
  199. })
  200. const previewImagesRef = ref()
  201. const dialogVisible = ref(false)
  202. const imageUrls = ref([])
  203. const preview = async row => {
  204. previewImagesRef.value?.handleOpen(previewPredictResultToInfraredModelApi, row.id)
  205. }
  206. const enumsAlgorithmConfigTrack = ref<any>([])
  207. onMounted(async () => {
  208. const result = await enumAlgorithmConfigTrackApi()
  209. enumsAlgorithmConfigTrack.value = []
  210. const tmp_data: any = result['data']
  211. for (const item of tmp_data) {
  212. if (item.subsystem === SubSystem__['可见光转红外'] && item.type === AlgorithmType2['预测/推理']) {
  213. item['label'] = item['label'] + '-' + SubSystem[item['subsystem']] + '-' + AlgorithmType[item['type']]
  214. enumsAlgorithmConfigTrack.value.push(item)
  215. }
  216. }
  217. })
  218. const setItemsOptions222 = () => {
  219. itemsOptions = [
  220. {
  221. label: '算法',
  222. prop: 'algorithmId',
  223. rules: [{ required: true, message: '算法不能为空', trigger: 'blur' }],
  224. compOptions: {
  225. elTagName: 'select',
  226. placeholder: '请输入算法',
  227. enum: enumsAlgorithmConfigTrack
  228. }
  229. },
  230. {
  231. label: '子系统',
  232. prop: 'subSystem',
  233. rules: [{ required: true, message: '子系统不能为空', trigger: 'blur' }],
  234. compOptions: {
  235. disabled: true,
  236. elTagName: 'select',
  237. placeholder: '请输入子系统',
  238. enum: enumsSubSystem
  239. }
  240. },
  241. {
  242. label: '模型名称',
  243. prop: 'modelName',
  244. rules: [{ required: true, message: '模型名称不能为空', trigger: 'blur' }],
  245. compOptions: {
  246. placeholder: '请输入模型名称'
  247. }
  248. },
  249. {
  250. label: '模型路径',
  251. prop: 'modelPath',
  252. rules: [{ required: false, message: '模型文件不能为空', trigger: 'blur' }],
  253. compOptions: {
  254. placeholder: '请输入模型名称',
  255. disabled: true
  256. }
  257. },
  258. {
  259. label: '备注',
  260. prop: 'remarks',
  261. rules: [{ required: false, message: '备注不能为空', trigger: 'blur' }],
  262. compOptions: {
  263. placeholder: '请输入备注'
  264. }
  265. }
  266. ]
  267. }
  268. const addToInfraredModel = async (modelPath: string) => {
  269. let res = { data: { modelPath, subSystem: SubSystem__['可见光转红外'], type: AlgorithmType2['预测/推理'] } }
  270. // 重置表单
  271. setItemsOptions222()
  272. const params = {
  273. title: '添加模型',
  274. width: 580,
  275. isEdit: true,
  276. itemsOptions: itemsOptions,
  277. model: res.data,
  278. api: addAlgorithmModelTrackApi,
  279. getTableList: proTable.value?.getTableList,
  280. closedEvent: async () => {
  281. await updateWnumsAlgorithmModelTrack()
  282. }
  283. }
  284. formDialogRef.value?.openDialog(params)
  285. }
  286. const showModelDialogVisible = ref(false)
  287. const model_list: Ref<any> = ref([
  288. // {
  289. // id: 1,
  290. // name: '1',
  291. // path: '/home/11',
  292. // size: '123123MB',
  293. // url: 'http://localhost:9090/profile/upload/2024/10/27/1_1729404909511_20241027153840A001.zip'
  294. // },
  295. // {
  296. // id: 2,
  297. // name: '1',
  298. // path: '/home/11',
  299. // size: '123123MB',
  300. // url: 'http://localhost:9090/profile/upload/2024/10/27/1_1729404909511_20241027153840A001.zip'
  301. // },
  302. // {
  303. // id: 3,
  304. // name: '1',
  305. // path: '/home/11',
  306. // size: '123123MB',
  307. // url: 'http://localhost:9090/profile/upload/2024/10/27/1_1729404909511_20241027153840A001.zip'
  308. // },
  309. // {
  310. // id: 4,
  311. // name: '1',
  312. // path: '/home/11',
  313. // size: '123123MB',
  314. // url: 'http://localhost:9090/profile/upload/2024/10/27/1_1729404909511_20241027153840A001.zip'
  315. // }
  316. ])
  317. const showToInfraredModel = async (id: any) => {
  318. const res: any = await showToInfraredModelApi(id)
  319. model_list.value = res.data
  320. showModelDialogVisible.value = true
  321. }
  322. const viewLogRef = ref()
  323. const openModelDialog = async row => {
  324. const algorithmModelId = row.algorithmModelId
  325. const result: any = await getAlgorithmModelTrackApi(algorithmModelId)
  326. // console.log(result.data)
  327. setItemsOptionsModel()
  328. const params = {
  329. title: '模型',
  330. width: 580,
  331. isEdit: false,
  332. itemsOptions: itemsOptions,
  333. model: result.data,
  334. api: updateToInfraredApi,
  335. getTableList: proTable.value?.getTableList
  336. }
  337. formDialogRef.value?.openDialog(params)
  338. }
  339. const startToInfrared = async (params: any) => {
  340. const res: any = await startToInfraredApi(params.id)
  341. if (res.code === 200) {
  342. ElMessage.success('任务已开始,请等待完成!')
  343. } else {
  344. ElMessage.error('任务开始失败,请检查!')
  345. }
  346. proTable.value?.getTableList()
  347. }
  348. const stopToInfrared = async (params: any) => {
  349. const res: any = await stopToInfraredApi(params.id)
  350. if (res.code === 200) {
  351. ElMessage.success('终止任务成功!')
  352. } else {
  353. ElMessage.error('终止任务失败,请检查!')
  354. }
  355. proTable.value?.getTableList()
  356. }
  357. const dowloadToInfrared = async (params: any) => {
  358. if (params.type == AlgorithmType2['训练']) {
  359. await useDownload(dowloadToInfraredApi, params.name, params.id, true, '.pt')
  360. } else if (params.type == AlgorithmType2['预测/推理']) {
  361. await useDownload(dowloadToInfraredApi, params.name, params.id, true, '.zip')
  362. }
  363. }
  364. const openStartDialog = async (row: any) => {
  365. let res = { data: {} }
  366. if (row?.id) {
  367. res = await getToInfraredApi(row?.id || null)
  368. }
  369. // 重置表单
  370. setItemsOptions2()
  371. const params = {
  372. title: '开始任务',
  373. width: 580,
  374. isEdit: true,
  375. itemsOptions: itemsOptions,
  376. model: res.data,
  377. api: startToInfraredApi,
  378. getTableList: proTable.value?.getTableList
  379. }
  380. formDialogRef.value?.openDialog(params)
  381. }
  382. // ProTable 实例
  383. const proTable = ref<ProTableInstance>()
  384. // 删除可见光转红外信息
  385. const deleteToInfrared = async (params: any) => {
  386. await useHandleData(delToInfraredApi, params.id, '删除【' + params.id + '】可见光转红外')
  387. proTable.value?.getTableList()
  388. }
  389. // 批量删除可见光转红外信息
  390. const batchDelete = async (ids: string[]) => {
  391. await useHandleData(delToInfraredApi, ids, '删除所选可见光转红外信息')
  392. proTable.value?.clearSelection()
  393. proTable.value?.getTableList()
  394. }
  395. // 导出可见光转红外列表
  396. const downloadFile = async () => {
  397. ElMessageBox.confirm('确认导出可见光转红外数据?', '温馨提示', { type: 'warning' }).then(() =>
  398. useDownload(exportToInfraredApi, '可见光转红外列表', proTable.value?.searchParam)
  399. )
  400. }
  401. // 批量添加可见光转红外
  402. const dialogRef = ref<InstanceType<typeof ImportExcel> | null>(null)
  403. const batchAdd = () => {
  404. const params = {
  405. title: '可见光转红外',
  406. tempApi: importTemplateApi,
  407. importApi: importToInfraredDataApi,
  408. getTableList: proTable.value?.getTableList
  409. }
  410. dialogRef.value?.acceptParams(params)
  411. }
  412. const formDialogRef = ref<InstanceType<typeof FormDialog> | null>(null)
  413. // 打开弹框的功能
  414. const openDialog = async (type: number, title: string, row?: any) => {
  415. let res = { data: {} }
  416. if (row?.id) {
  417. res = await getToInfraredApi(row?.id || null)
  418. }
  419. // 重置表单
  420. setItemsOptions()
  421. const params = {
  422. title,
  423. width: 580,
  424. isEdit: type !== 3,
  425. itemsOptions: itemsOptions,
  426. model: type == 1 ? {} : res.data,
  427. api: type == 1 ? addToInfraredApi : updateToInfraredApi,
  428. getTableList: proTable.value?.getTableList,
  429. closedEvent: () => {}
  430. }
  431. formDialogRef.value?.openDialog(params)
  432. }
  433. // 表格配置项
  434. const columns = reactive<ColumnProps<any>[]>([
  435. { type: 'selection', fixed: 'left', width: 70 },
  436. { prop: 'id', label: '主键ID', width: 180 },
  437. {
  438. prop: 'name',
  439. label: '任务名称',
  440. search: {
  441. el: 'input'
  442. },
  443. width: 150
  444. },
  445. {
  446. prop: 'status',
  447. label: '任务状态',
  448. search: {
  449. el: 'select'
  450. },
  451. tag: true,
  452. enum: statusEnums,
  453. width: 150
  454. },
  455. {
  456. prop: 'type',
  457. label: '类型',
  458. tag: true,
  459. enum: enumsAlgorithmType,
  460. width: 120
  461. },
  462. {
  463. prop: 'subsystem',
  464. label: '分系统',
  465. tag: true,
  466. enum: enumsSubSystem,
  467. width: 200
  468. },
  469. {
  470. prop: 'algorithmName',
  471. label: '算法名称',
  472. width: 200
  473. },
  474. {
  475. prop: 'modelName',
  476. label: '模型名称',
  477. width: 200
  478. },
  479. // {
  480. // prop: 'algorithmModelId',
  481. // label: '模型',
  482. // search: {
  483. // el: 'input'
  484. // },
  485. // width: 150
  486. // },
  487. {
  488. prop: 'startTime',
  489. label: '开始时间',
  490. width: 180
  491. },
  492. {
  493. prop: 'endTime',
  494. label: '结束时间',
  495. width: 180
  496. },
  497. {
  498. prop: 'costSecond',
  499. label: '耗时',
  500. width: 120
  501. },
  502. {
  503. prop: 'log',
  504. label: '日志',
  505. width: 120
  506. },
  507. {
  508. prop: 'outputPath',
  509. label: '输出路径',
  510. width: 120
  511. },
  512. {
  513. prop: 'remarks',
  514. label: '备注',
  515. search: {
  516. el: 'input'
  517. },
  518. width: 120
  519. },
  520. { prop: 'operation', label: '操作', width: 230, fixed: 'right' }
  521. ])
  522. // 表单配置项
  523. let itemsOptions: ProForm.ItemsOptions[] = []
  524. const setItemsOptions = () => {
  525. itemsOptions = [
  526. {
  527. label: '任务名称',
  528. prop: 'name',
  529. rules: [{ required: true, message: '任务名称不能为空', trigger: 'blur' }],
  530. compOptions: {
  531. placeholder: '请输入任务名称'
  532. }
  533. },
  534. {
  535. label: '选择数据集',
  536. prop: 'inputOssId',
  537. rules: [{ required: false, message: '数据集不能为空', trigger: 'blur' }],
  538. compOptions: {
  539. elTagName: 'select',
  540. placeholder: '请选择或者上传数据集',
  541. enum: getImageDataList,
  542. clearable: true
  543. }
  544. },
  545. {
  546. label: '上传数据集',
  547. prop: 'inputOssId',
  548. rules: [{ required: false, message: '数据集不能为空', trigger: 'blur' }],
  549. compOptions: {
  550. elTagName: 'file-upload',
  551. fileSize: 4096,
  552. fileType: ['zip'],
  553. placeholder: '请上传数据集'
  554. }
  555. },
  556. {
  557. label: '选择模型',
  558. prop: 'algorithmModelId',
  559. rules: [{ required: true, message: '模型不能为空', trigger: 'blur' }],
  560. compOptions: {
  561. elTagName: 'select',
  562. placeholder: '请选择模型',
  563. enum: enumsAlgorithmModelTrack
  564. }
  565. },
  566. {
  567. label: '备注',
  568. prop: 'remarks',
  569. rules: [],
  570. compOptions: {
  571. placeholder: '请输入备注'
  572. }
  573. }
  574. ]
  575. }
  576. const getImageDataList = ref<any>([])
  577. onMounted(async () => {
  578. const qyery = {
  579. subsystem: SubSystem__['可见光转红外'],
  580. pageNum: 1,
  581. pageSize: 1000
  582. }
  583. const result: any = await listDataSeqApi(qyery)
  584. const data = result['data']['list']
  585. for (const item of data) {
  586. getImageDataList.value.push({
  587. value: item['inputOssId'],
  588. label: item['name'] + '-' + '可见光转红外'
  589. })
  590. }
  591. const qyery2 = {
  592. subsystem: SubSystem__['注释轨迹序列'],
  593. pageNum: 1,
  594. pageSize: 1000
  595. }
  596. const result2: any = await listDataSeqApi(qyery2)
  597. const data2 = result2['data']['list']
  598. for (const item of data2) {
  599. getImageDataList.value.push({
  600. value: item['inputOssId'],
  601. label: item['name'] + ' - ' + '注释轨迹序列'
  602. })
  603. }
  604. })
  605. const enumsAlgorithmModelTrack = ref<any>([])
  606. const updateWnumsAlgorithmModelTrack = async () => {
  607. const result: any = await enumAlgorithmModelTrackApi()
  608. // console.log(result.data);
  609. enumsAlgorithmModelTrack.value = []
  610. for (const item of result.data) {
  611. if (SubSystem[item['subsystem']] === '可见光转红外') {
  612. item['label'] = item['label'] + '-' + SubSystem[item['subsystem']] + '-' + AlgorithmType[item['type']] + '-' + item['algorithmName']
  613. enumsAlgorithmModelTrack.value.push(item)
  614. }
  615. }
  616. }
  617. onMounted(async () => {
  618. updateWnumsAlgorithmModelTrack()
  619. })
  620. const setItemsOptions2 = () => {
  621. itemsOptions = [
  622. {
  623. label: '任务名称',
  624. prop: 'name',
  625. rules: [{ required: true, message: '任务名称不能为空', trigger: 'blur' }],
  626. compOptions: {
  627. disabled: true,
  628. placeholder: '请输入任务名称'
  629. }
  630. },
  631. {
  632. label: '选择模型',
  633. prop: 'algorithmModel',
  634. rules: [{ required: true, message: '模型不能为空', trigger: 'blur' }],
  635. compOptions: {
  636. elTagName: 'select',
  637. placeholder: '请选择模型',
  638. enum: enumsAlgorithmModelTrack
  639. }
  640. },
  641. {
  642. label: '备注',
  643. prop: 'remarks',
  644. rules: [],
  645. compOptions: {
  646. placeholder: '请输入备注'
  647. }
  648. }
  649. ]
  650. }
  651. const setItemsOptionsModel = () => {
  652. itemsOptions = [
  653. {
  654. label: '算法ID',
  655. prop: 'algorithmId',
  656. rules: [{ required: true, message: '算法不能为空', trigger: 'blur' }],
  657. compOptions: {
  658. disabled: true,
  659. placeholder: '请输入算法'
  660. }
  661. },
  662. {
  663. label: '算法类型',
  664. prop: 'algorithmType',
  665. rules: [{ required: true, message: '算法不能为空', trigger: 'blur' }],
  666. compOptions: {
  667. disabled: true,
  668. elTagName: 'select',
  669. placeholder: '请输入算法',
  670. enum: enumsAlgorithmConfigTrack
  671. }
  672. },
  673. {
  674. label: '算法参数',
  675. prop: 'parameterConfig',
  676. rules: [{ required: true, message: '模型名称不能为空', trigger: 'blur' }],
  677. compOptions: {
  678. placeholder: '请输入模型名称'
  679. }
  680. },
  681. {
  682. label: '模型ID',
  683. prop: 'id',
  684. rules: [{ required: true, message: '模型名称不能为空', trigger: 'blur' }],
  685. compOptions: {
  686. placeholder: '请输入模型名称'
  687. }
  688. },
  689. {
  690. label: '模型名称',
  691. prop: 'modelName',
  692. rules: [{ required: true, message: '模型名称不能为空', trigger: 'blur' }],
  693. compOptions: {
  694. placeholder: '请输入模型名称'
  695. }
  696. },
  697. {
  698. label: '模型保存路径',
  699. prop: 'modelAddress',
  700. rules: [{ required: true, message: '模型名称不能为空', trigger: 'blur' }],
  701. compOptions: {
  702. placeholder: '请输入模型名称'
  703. }
  704. },
  705. {
  706. label: '备注',
  707. prop: 'remarks',
  708. rules: [{ required: false, message: '备注不能为空', trigger: 'blur' }],
  709. compOptions: {
  710. placeholder: '请输入备注'
  711. }
  712. }
  713. ]
  714. }
  715. </script>