amplify.vue 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296
  1. <template>
  2. <div class="createTask-bigBox">
  3. <dv-border-box1 ref="borderRef" style="width: 80%; height: calc(100% - 20px); margin: 0 auto">
  4. <div class="createTask-container">
  5. <h3 class="title" style="margin-top: 0">{{ title }}</h3>
  6. <!-- <h4 class="title2" v-if="pageIndex === 4">训练算法</h4> -->
  7. <div v-for="(item, index) in formItems" :key="index" class="createTask-main">
  8. <ProForm ref="proFormRef" :items-options="item.items" :form-options="_options" :model="item.model" class="proform">
  9. <template #selectTask>
  10. <el-tree
  11. style="max-width: 600px"
  12. ref="selectTaskTreeRef"
  13. :default-checked-keys="formItem.selectTask"
  14. :default-expanded-keys="formItem.selectTask"
  15. :props="defaultProps"
  16. :check-on-click-node="true"
  17. :data="data1"
  18. node-key="id"
  19. show-checkbox
  20. @check="
  21. (click, checked) => {
  22. changeTree(click, checked)
  23. }
  24. "
  25. />
  26. </template>
  27. <template #proTable="{}">
  28. <el-tabs
  29. tab-position="left"
  30. v-model="activeName"
  31. style="min-height: 450px"
  32. class="demo-tabs"
  33. :before-leave="beforeTabLeave"
  34. @tab-click="handleClick"
  35. >
  36. <el-tab-pane label="数据" name="one">
  37. <div class="table-box">
  38. <ProTable
  39. ref="proTable"
  40. row-key="id"
  41. :columns="dataColumns"
  42. :request-api="listDataApi"
  43. :tool-button="false"
  44. :init-param="initParam1"
  45. height="45vh"
  46. >
  47. </ProTable>
  48. </div>
  49. </el-tab-pane>
  50. </el-tabs>
  51. </template>
  52. <template #operation="{}">
  53. <div class="footBtn">
  54. <el-button class="btn back" v-if="pageIndex === 1" @click="onReturn()"> 返回 </el-button>
  55. <el-button class="btn back" v-else @click="onBack()"> 上一步 </el-button>
  56. <el-button
  57. class="btn add"
  58. type="primary"
  59. v-if="(pageIndex === 2 || pageIndex === 6 || pageIndex === 10) && model.taskType === '1'"
  60. style="margin-left: -15px"
  61. @click="addNewData()"
  62. >
  63. 增加新一组数据
  64. </el-button>
  65. <el-button
  66. class="btn add"
  67. style="margin-left: -15px"
  68. v-if="(pageIndex === 5 || pageIndex === 9 || pageIndex === 13) && model.taskType === '2'"
  69. @click="onAdd(pageIndex)"
  70. >
  71. 增加算法
  72. </el-button>
  73. <el-button class="btn next" type="success" @click="nextBtnText === '提交' ? onSubmit() : onNext()">
  74. {{ nextBtnText }}
  75. </el-button>
  76. </div>
  77. </template>
  78. </ProForm>
  79. </div>
  80. </div>
  81. </dv-border-box1>
  82. </div>
  83. </template>
  84. <script setup lang="tsx" name="createTask">
  85. import { ref, ComputedRef, computed, watch, reactive } from 'vue'
  86. import ProForm from '@/components/ProForm/index.vue'
  87. import { useRouter } from 'vue-router'
  88. import { getModelApi, getAlgorithmApi, createTaskApi } from '@/api/modules/taais/task'
  89. import ProTable from '@/components/ProTable/index.vue'
  90. import { ColumnProps, ProTableInstance } from '@/components/ProTable/interface'
  91. import { listDataApi } from '@/api/modules/demo/data'
  92. import { ElMessage, ElTree } from 'element-plus'
  93. import type { TabsPaneContext } from 'element-plus'
  94. const activeName = ref('one')
  95. let tabTwo = ref(true)
  96. let tabThree = ref(true)
  97. let tabFour = ref(true)
  98. let initParam1 = reactive({ type: 1 })
  99. let initParam2 = reactive({ type: 2 })
  100. let initParam3 = reactive({ type: 3 })
  101. let initParam4 = reactive({ type: 4 })
  102. const proTable = ref<ProTableInstance>()
  103. let model = ref({
  104. taskType: '2'
  105. })
  106. let formItem = reactive({
  107. taskName: '',
  108. selectTask: [2, 5] as any,
  109. trainDataSelect: [] as any[],
  110. trainDataEnhancement: {
  111. algorithmId: null,
  112. params: []
  113. },
  114. trainDataExpansion: {
  115. algorithmId: null,
  116. modelId: null,
  117. params: []
  118. },
  119. train: [{}],
  120. testDataSelect: [] as any[],
  121. testDataEnhancement: {
  122. algorithmId: null,
  123. modelId: null,
  124. params: []
  125. },
  126. testDataExpansion: {
  127. algorithmId: null,
  128. modelId: null,
  129. params: []
  130. },
  131. test: [{}],
  132. reasoningDataSelect: [] as any[],
  133. reasoningDataEnhancement: {
  134. algorithmId: null,
  135. modelId: null,
  136. params: []
  137. },
  138. reasoningDataExpansion: {
  139. algorithmId: null,
  140. modelId: null,
  141. params: []
  142. },
  143. reasoning: [{}]
  144. })
  145. let prevTreeData = ref([3])
  146. const router = useRouter()
  147. let subSystem, selectTrainAgloId, selectTestAgloId, selectReasoningAgloId
  148. const trainActiveTab = ref()
  149. const testActiveTab = ref()
  150. const reasoningActiveTab = ref()
  151. let pageIndex = ref<number>(1)
  152. const selectTaskTreeRef = ref<InstanceType<typeof ElTree>>()
  153. let title = ref('数据扩增任务')
  154. let nextBtnText = ref('下一步')
  155. const data1 = [
  156. {
  157. id: 98,
  158. label: '训练',
  159. disabled: true,
  160. children: [
  161. {
  162. id: 2,
  163. label: '训练数据选择',
  164. children: []
  165. },
  166. {
  167. id: 3,
  168. label: '训练数据增广',
  169. children: []
  170. },
  171. {
  172. id: 5,
  173. label: '训练',
  174. children: []
  175. }
  176. ]
  177. },
  178. {
  179. id: 99,
  180. label: '验证',
  181. disabled: true,
  182. children: [
  183. {
  184. id: 6,
  185. label: '验证数据选择',
  186. children: []
  187. },
  188. {
  189. id: 9,
  190. label: '验证',
  191. children: []
  192. }
  193. ]
  194. },
  195. {
  196. id: 100,
  197. label: '测试',
  198. disabled: true,
  199. children: [
  200. {
  201. id: 10,
  202. label: '测试数据选择',
  203. children: []
  204. },
  205. {
  206. id: 13,
  207. label: '测试',
  208. children: []
  209. }
  210. ]
  211. }
  212. ]
  213. const dataColumns = reactive<ColumnProps<any>[]>([
  214. { type: 'selection', fixed: 'left', width: 70 },
  215. {
  216. prop: 'name',
  217. label: '名称',
  218. width: 120
  219. },
  220. {
  221. prop: 'dataType',
  222. label: '数据类型',
  223. width: 120
  224. },
  225. {
  226. prop: 'fileType',
  227. label: '文件类型',
  228. width: 120
  229. },
  230. {
  231. prop: 'batchNum',
  232. label: '批次号',
  233. search: {
  234. el: 'input',
  235. defaultValue: ''
  236. },
  237. width: 120
  238. },
  239. {
  240. prop: 'objectType',
  241. label: '目标类型',
  242. search: {
  243. el: 'input',
  244. defaultValue: ''
  245. },
  246. width: 120
  247. },
  248. {
  249. prop: 'objectSubtype',
  250. label: '目标子类型',
  251. search: {
  252. el: 'input',
  253. defaultValue: ''
  254. },
  255. width: 120
  256. },
  257. {
  258. prop: 'scene',
  259. label: '场景',
  260. width: 120
  261. },
  262. {
  263. prop: 'dataSource',
  264. label: '数据源',
  265. width: 120
  266. },
  267. {
  268. prop: 'gatherTime',
  269. label: '采集时间',
  270. width: 120
  271. },
  272. {
  273. prop: 'gatherSpot',
  274. label: '采集地点',
  275. width: 120
  276. },
  277. {
  278. prop: 'increment',
  279. label: '扩增方式',
  280. width: 120
  281. }
  282. ])
  283. const defaultProps = {
  284. children: 'children',
  285. label: 'label'
  286. }
  287. const _options: ComputedRef<ProForm.FormOptions> = computed(() => {
  288. const form = {
  289. labelWidth: 120,
  290. hasFooter: true,
  291. disabled: false,
  292. showSubmitButton: false
  293. }
  294. return Object.assign(form)
  295. })
  296. let items = reactive<ProForm.ItemsOptions[]>([
  297. // 1
  298. {
  299. label: '任务名称',
  300. prop: 'taskName',
  301. span: 12,
  302. rules: [{ required: true, message: '请输入任务名称' }],
  303. show: () => {
  304. return pageIndex.value === 1 ? true : false
  305. },
  306. compOptions: {
  307. elTagName: 'input',
  308. clearable: true,
  309. placeholder: '请输入任务名称',
  310. onChange: val => {
  311. formItem.taskName = val
  312. }
  313. }
  314. },
  315. // 2 6 10
  316. {
  317. label: '',
  318. hideLabelSuffix: true,
  319. labelWidth: '0px',
  320. prop: 'proTable',
  321. show: () => {
  322. return pageIndex.value === 2 || pageIndex.value === 6 || pageIndex.value === 10 ? true : false
  323. },
  324. compOptions: {
  325. elTagName: 'slot'
  326. }
  327. },
  328. // 3
  329. {
  330. label: '选择增广算法',
  331. prop: 'trainEnhanceAlgo',
  332. span: 14,
  333. rules: [{ required: true, message: '选择增广算法' }],
  334. show: () => {
  335. return pageIndex.value === 3 ? true : false
  336. },
  337. compOptions: {
  338. elTagName: 'select',
  339. labelKey: 'algorithmName',
  340. valueKey: 'id',
  341. enum: null,
  342. onChange: val => {
  343. formItem.trainDataEnhancement.algorithmId = val
  344. // agloChange('trainEnhanceModel', val)
  345. // getAgloParams(4, 'trainDataEnhancement', 3, val)
  346. getAlgorithmApi(4, subSystem).then(res => {
  347. res.data.forEach(item => {
  348. if (item.id === val) {
  349. const params = eval('(' + item.parameterConfig + ')')
  350. formItem['trainDataEnhancement'].params = params
  351. addForm(params, 3, 'trainDataEnhancement')
  352. }
  353. })
  354. })
  355. }
  356. }
  357. },
  358. // {
  359. // label: '选择增广模型',
  360. // prop: 'trainEnhanceModel',
  361. // span: 14,
  362. // rules: [{ required: true, message: '选择增广模型' }],
  363. // show: () => {
  364. // return pageIndex.value === 3 ? true : false
  365. // },
  366. // compOptions: {
  367. // elTagName: 'select',
  368. // labelKey: 'modelName',
  369. // valueKey: 'id',
  370. // enum: null,
  371. // onChange: val => {
  372. // getAgloParams(4, 'trainDataEnhancement', 3, val)
  373. // }
  374. // }
  375. // },
  376. // 4
  377. {
  378. label: '选择扩充算法',
  379. prop: 'trainExpansionAlgo',
  380. span: 14,
  381. rules: [{ required: true, message: '选择扩充算法' }],
  382. show: () => {
  383. return pageIndex.value === 4 ? true : false
  384. },
  385. compOptions: {
  386. elTagName: 'select',
  387. labelKey: 'algorithmName',
  388. valueKey: 'id',
  389. enum: null,
  390. onChange: val => {
  391. formItem.trainDataExpansion.algorithmId = val
  392. agloChange('trainExpansionModel', val, false)
  393. }
  394. }
  395. },
  396. {
  397. label: '选择扩充模型',
  398. prop: 'trainExpansionModel',
  399. span: 14,
  400. rules: [{ required: true, message: '选择扩充模型' }],
  401. show: () => {
  402. return pageIndex.value === 4 ? true : false
  403. },
  404. compOptions: {
  405. elTagName: 'select',
  406. labelKey: 'modelName',
  407. valueKey: 'id',
  408. enum: null,
  409. onChange: val => {
  410. getAgloParams(5, 'trainDataExpansion', 4, val)
  411. }
  412. }
  413. },
  414. // 5
  415. {
  416. label: '选择训练算法',
  417. prop: 'trainAlgo',
  418. span: 14,
  419. rules: [{ required: true, message: '请选择训练算法' }],
  420. show: () => {
  421. return pageIndex.value === 5 ? true : false
  422. },
  423. compOptions: {
  424. elTagName: 'select',
  425. labelKey: 'algorithmName',
  426. valueKey: 'id',
  427. enum: null,
  428. onChange: val => {
  429. selectTrainAgloId = val
  430. formItem.train[0]['algorithmId'] = val
  431. agloChange('trainModel', val, false)
  432. }
  433. }
  434. },
  435. {
  436. label: '选择训练模型',
  437. prop: 'trainModel',
  438. span: 14,
  439. rules: [{ required: true, message: '请选择训练模型' }],
  440. show: () => {
  441. return pageIndex.value === 5 ? true : false
  442. },
  443. compOptions: {
  444. elTagName: 'select',
  445. labelKey: 'modelName',
  446. valueKey: 'id',
  447. // enum: () => getModelApi(1),
  448. enum: null,
  449. onChange: val => {
  450. getAlgorithmApi(1, subSystem).then(res => {
  451. res.data.forEach(item => {
  452. if (item.id === selectTrainAgloId) {
  453. const params = eval('(' + item.parameterConfig + ')')
  454. formItem.train[0]['modelId'] = val
  455. formItem.train[0]['params'] = params
  456. // (参数信息,第几页,数组名称)
  457. addForm(params, 5, 'train[0]')
  458. }
  459. })
  460. })
  461. }
  462. }
  463. },
  464. // 7
  465. {
  466. label: '选择增强算法',
  467. prop: 'testEnhanceAlgo',
  468. span: 14,
  469. rules: [{ required: true, message: '选择增强算法' }],
  470. show: () => {
  471. return pageIndex.value === 7 ? true : false
  472. },
  473. compOptions: {
  474. elTagName: 'select',
  475. labelKey: 'algorithmName',
  476. valueKey: 'id',
  477. enum: null,
  478. onChange: val => {
  479. formItem.testDataEnhancement['algorithmId'] = val
  480. agloChange('testEnhanceModel', val, false)
  481. }
  482. }
  483. },
  484. {
  485. label: '选择增强模型',
  486. prop: 'testEnhanceModel',
  487. span: 14,
  488. rules: [{ required: true, message: '选择增强模型' }],
  489. show: () => {
  490. return pageIndex.value === 7 ? true : false
  491. },
  492. compOptions: {
  493. elTagName: 'select',
  494. labelKey: 'modelName',
  495. valueKey: 'id',
  496. enum: null,
  497. onChange: val => {
  498. if (val === 1) {
  499. return
  500. } else {
  501. getAgloParams(4, 'testDataEnhancement', 7, val)
  502. }
  503. }
  504. }
  505. },
  506. // 8
  507. {
  508. label: '选择扩充算法',
  509. prop: 'testExpansionAlgo',
  510. span: 14,
  511. rules: [{ required: true, message: '选择扩充算法' }],
  512. show: () => {
  513. return pageIndex.value === 8 ? true : false
  514. },
  515. compOptions: {
  516. elTagName: 'select',
  517. labelKey: 'algorithmName',
  518. valueKey: 'id',
  519. enum: null,
  520. onChange: val => {
  521. formItem.testDataExpansion['algorithmId'] = val
  522. agloChange('testExpansionModel', val, false)
  523. }
  524. }
  525. },
  526. {
  527. label: '选择扩充模型',
  528. prop: 'testExpansionModel',
  529. span: 14,
  530. rules: [{ required: true, message: '选择扩充模型' }],
  531. show: () => {
  532. return pageIndex.value === 8 ? true : false
  533. },
  534. compOptions: {
  535. elTagName: 'select',
  536. labelKey: 'modelName',
  537. valueKey: 'id',
  538. enum: null,
  539. onChange: val => {
  540. if (val === 1) {
  541. return
  542. } else {
  543. getAgloParams(5, 'testDataExpansion', 8, val)
  544. }
  545. }
  546. }
  547. },
  548. // 9
  549. {
  550. label: '选择验证算法',
  551. prop: 'testAlgo',
  552. span: 14,
  553. rules: [{ required: true, message: '请选择验证算法' }],
  554. show: () => {
  555. return pageIndex.value === 9 ? true : false
  556. },
  557. compOptions: {
  558. elTagName: 'select',
  559. labelKey: 'algorithmName',
  560. valueKey: 'id',
  561. enum: null,
  562. onChange: val => {
  563. selectTestAgloId = val
  564. formItem.test[0]['algorithmId'] = val
  565. agloChange('testModel', val, true)
  566. }
  567. }
  568. },
  569. {
  570. label: '选择验证模型',
  571. prop: 'testModel',
  572. span: 14,
  573. rules: [{ required: true, message: '请选择验证模型' }],
  574. show: () => {
  575. return pageIndex.value === 9 ? true : false
  576. },
  577. compOptions: {
  578. elTagName: 'select',
  579. labelKey: 'modelName',
  580. valueKey: 'id',
  581. enum: null,
  582. onChange: val => {
  583. // getAgloParams(1, 'test[0]', 9, val, 0)
  584. getAlgorithmApi(2, subSystem).then(res => {
  585. res.data.forEach(item => {
  586. if (item.id === selectTestAgloId) {
  587. const params = eval('(' + item.parameterConfig + ')')
  588. formItem.test[0]['modelId'] = val
  589. formItem.test[0]['params'] = params
  590. // (参数信息,第几页,数组名称)
  591. addForm(params, 9, 'test[0]')
  592. }
  593. })
  594. })
  595. }
  596. }
  597. },
  598. // 11
  599. {
  600. label: '选择增强算法',
  601. prop: 'reasoningEnhanceAlgo',
  602. span: 14,
  603. rules: [{ required: true, message: '选择增强算法' }],
  604. show: () => {
  605. return pageIndex.value === 11 ? true : false
  606. },
  607. compOptions: {
  608. elTagName: 'select',
  609. labelKey: 'algorithmName',
  610. valueKey: 'id',
  611. enum: null,
  612. onChange: val => {
  613. formItem.reasoningDataEnhancement['algorithmId'] = val
  614. agloChange('reasoningEnhanceModel', val, false)
  615. }
  616. }
  617. },
  618. {
  619. label: '选择增强模型',
  620. prop: 'reasoningEnhanceModel',
  621. span: 14,
  622. rules: [{ required: true, message: '选择增强模型' }],
  623. show: () => {
  624. return pageIndex.value === 11 ? true : false
  625. },
  626. compOptions: {
  627. elTagName: 'select',
  628. labelKey: 'modelName',
  629. valueKey: 'id',
  630. enum: null,
  631. onChange: val => {
  632. if (val === 1) {
  633. return
  634. } else {
  635. getAgloParams(4, 'reasoningDataEnhancement', 11, val)
  636. }
  637. }
  638. }
  639. },
  640. // 12
  641. {
  642. label: '选择扩充算法',
  643. prop: 'reasoningExpansionAlgo',
  644. span: 14,
  645. rules: [{ required: true, message: '选择扩充算法' }],
  646. show: () => {
  647. return pageIndex.value === 12 ? true : false
  648. },
  649. compOptions: {
  650. elTagName: 'select',
  651. labelKey: 'algorithmName',
  652. valueKey: 'id',
  653. enum: null,
  654. onChange: val => {
  655. formItem.reasoningDataExpansion['algorithmId'] = val
  656. agloChange('reasoningExpansionModel', val, false)
  657. }
  658. }
  659. },
  660. {
  661. label: '选择扩充模型',
  662. prop: 'reasoningExpansionModel',
  663. rules: [{ required: true, message: '选择扩充模型' }],
  664. span: 14,
  665. show: () => {
  666. return pageIndex.value === 12 ? true : false
  667. },
  668. compOptions: {
  669. elTagName: 'select',
  670. labelKey: 'modelName',
  671. valueKey: 'id',
  672. enum: null,
  673. onChange: val => {
  674. if (val === 1) {
  675. return
  676. } else {
  677. getAgloParams(5, 'reasoningDataExpansion', 12, val)
  678. }
  679. }
  680. }
  681. },
  682. // 13
  683. {
  684. label: '选择测试算法',
  685. prop: 'reasoningAlgo',
  686. span: 14,
  687. rules: [{ required: true, message: '请选择测试算法' }],
  688. show: () => {
  689. return pageIndex.value === 13 ? true : false
  690. },
  691. compOptions: {
  692. elTagName: 'select',
  693. labelKey: 'algorithmName',
  694. valueKey: 'id',
  695. enum: null,
  696. onChange: val => {
  697. selectReasoningAgloId = val
  698. formItem.reasoning[0]['algorithmId'] = val
  699. agloChange('reasoningModel', val, true)
  700. }
  701. }
  702. },
  703. {
  704. label: '选择测试模型',
  705. prop: 'reasoningModel',
  706. span: 14,
  707. rules: [{ required: true, message: '请选择测试模型' }],
  708. show: () => {
  709. return pageIndex.value === 13 ? true : false
  710. },
  711. compOptions: {
  712. elTagName: 'select',
  713. labelKey: 'modelName',
  714. valueKey: 'id',
  715. enum: null,
  716. onChange: val => {
  717. getAlgorithmApi(3, subSystem).then(res => {
  718. res.data.forEach(item => {
  719. if (item.id === selectReasoningAgloId) {
  720. const params = eval('(' + item.parameterConfig + ')')
  721. formItem.reasoning[0]['modelId'] = val
  722. formItem.reasoning[0]['params'] = params
  723. // (参数信息,第几页,数组名称)
  724. addForm(params, 13, 'reasoning[0]')
  725. }
  726. })
  727. })
  728. }
  729. }
  730. }
  731. ])
  732. // let formItemsTemp2 = ref([
  733. // {
  734. // items,
  735. // model: model.value
  736. // }
  737. // ])
  738. // let formItemsTemp7 = ref([
  739. // {
  740. // items,
  741. // model: model.value
  742. // }
  743. // ])
  744. let formItems = ref([
  745. {
  746. items,
  747. model: model.value
  748. }
  749. ])
  750. let addTrainAgloIndex = 1
  751. let addTestAgloIndex = 1
  752. let addReasoningAgloIndex = 1
  753. const proFormRef = ref<InstanceType<typeof ProForm> | null>(null)
  754. // 增加训练算法
  755. const onAdd = pageNum => {
  756. let arrayName, agloIndex, type, name
  757. switch (pageNum) {
  758. case 5:
  759. arrayName = 'train'
  760. agloIndex = addTrainAgloIndex
  761. type = 1
  762. name = '训练'
  763. break
  764. case 9:
  765. arrayName = 'test'
  766. agloIndex = addTestAgloIndex
  767. type = 2
  768. name = '验证'
  769. break
  770. case 13:
  771. arrayName = 'reasoning'
  772. agloIndex = addReasoningAgloIndex
  773. type = 3
  774. name = '测试'
  775. break
  776. default:
  777. break
  778. }
  779. const formEl = proFormRef.value![0].proFormRef
  780. if (!formEl) return
  781. formEl.validate(valid => {
  782. if (valid) {
  783. if (agloIndex >= 4) {
  784. ElMessage.warning('最多选择四种算法,已选择了四种')
  785. return
  786. }
  787. getAlgorithmApi(type, subSystem).then(res1 => {
  788. formItems.value[0].items.push({
  789. label: `选择${name}算法`,
  790. prop: `${arrayName}Aglo${agloIndex}`,
  791. span: 14,
  792. rules: [{ required: true, message: `请选择${name}算法` }],
  793. show: () => {
  794. return pageIndex.value === pageNum ? true : false
  795. },
  796. compOptions: {
  797. elTagName: 'select',
  798. labelKey: 'algorithmName',
  799. valueKey: 'id',
  800. enum: res1.data,
  801. onChange: agloId => {
  802. formItem[`${arrayName}`].push({})
  803. if (!formItem[`${arrayName}`][`${agloIndex}`]['algorithmId']) {
  804. formItem[`${arrayName}`][`${agloIndex}`]['algorithmId'] = agloId
  805. getModelApi(agloId).then(res2 => {
  806. if (type === 2 || type === 3) {
  807. res2.data.unshift({
  808. algorithmId: null,
  809. id: 1,
  810. modelAddress: null,
  811. modelName: '基于训练生成的模型'
  812. })
  813. }
  814. formItems.value[0].items.push({
  815. label: `选择${name}模型`,
  816. prop: `${arrayName}Model${agloIndex}`,
  817. span: 14,
  818. rules: [{ required: true, message: `请选择${name}模型` }],
  819. show: () => {
  820. return pageIndex.value === pageNum ? true : false
  821. },
  822. compOptions: {
  823. elTagName: 'select',
  824. labelKey: 'modelName',
  825. valueKey: 'id',
  826. enum: res2.data,
  827. onChange: modelId => {
  828. res1.data.forEach(agloItem => {
  829. if (agloItem.id === agloId) {
  830. const params = eval('(' + agloItem.parameterConfig + ')')
  831. formItem[`${arrayName}`][`${agloIndex}`]['modelId'] = modelId
  832. formItem[`${arrayName}`][`${agloIndex}`]['params'] = params
  833. addForm(params, pageNum, `${arrayName}[${agloIndex}]`)
  834. }
  835. })
  836. }
  837. }
  838. })
  839. })
  840. } else {
  841. formItem[`${arrayName}`].splice(-1, 1)
  842. formItem[`${arrayName}`][`${agloIndex}`]['algorithmId'] = agloId
  843. const column = formItems.value[0].items.find(column => column.prop === `${arrayName}Model${agloIndex}`)
  844. if (column) {
  845. getModelApi(agloId).then(newRes => {
  846. column.compOptions.enum = newRes.data
  847. })
  848. }
  849. }
  850. }
  851. }
  852. })
  853. })
  854. if (pageNum === 5) addTrainAgloIndex++
  855. if (pageNum === 9) addTestAgloIndex++
  856. if (pageNum === 13) addReasoningAgloIndex++
  857. }
  858. })
  859. }
  860. // 增加新数据
  861. const addNewData = () => {
  862. switch (activeName.value) {
  863. case 'one':
  864. const table0Ref = proTable.value![0]
  865. if (table0Ref.tableData.length === 0) {
  866. ElMessage.warning('请正确选择该组数据')
  867. } else {
  868. tabTwo.value = false
  869. activeName.value = 'two'
  870. }
  871. break
  872. case 'two':
  873. const table1Ref = proTable.value![1]
  874. if (table1Ref.tableData.length === 0) {
  875. ElMessage.warning('请正确选择该组数据')
  876. } else {
  877. tabThree.value = false
  878. activeName.value = 'three'
  879. }
  880. break
  881. case 'three':
  882. const table2Ref = proTable.value![2]
  883. if (table2Ref.tableData.length === 0) {
  884. ElMessage.warning('请正确选择该组数据')
  885. } else {
  886. tabFour.value = false
  887. activeName.value = 'four'
  888. }
  889. break
  890. default:
  891. break
  892. }
  893. }
  894. // 增加表单事件
  895. const addForm = (params, index, arrayName) => {
  896. params.forEach(item => {
  897. let i = formItems.value[0].items.length
  898. formItems.value[0].items.push({
  899. label: item.name,
  900. prop: `task${i}`,
  901. span: 12,
  902. rules: [
  903. { required: item.required, message: `${item.name}不能为空` },
  904. { pattern: new RegExp(`${item.validate}`), message: item.prompt }
  905. ],
  906. show: () => {
  907. return pageIndex.value === index ? true : false
  908. },
  909. compOptions: {
  910. elTagName: 'input',
  911. clearable: true,
  912. placeholder: item.prompt,
  913. onChange: val1 => {
  914. let label = item.name
  915. if (arrayName.includes(']')) {
  916. // 截取数组和下标
  917. let array = arrayName.slice(0, -3)
  918. let index = arrayName.slice(-2, -1)
  919. const item = formItem[`${array}`][`${index}`]['params'].find(item => item.name === label)
  920. if (item) {
  921. item.value = val1
  922. }
  923. } else {
  924. const item1 = formItem[`${arrayName}`]['params'].find(item => item.name === label)
  925. if (item1) {
  926. item1.value = val1
  927. }
  928. }
  929. }
  930. }
  931. })
  932. formItems.value[0].model[`task${i}`] = item.defaultValue
  933. })
  934. }
  935. const agloChange = (propName, agloId, flag) => {
  936. const Column = formItems.value[0].items.find(column => column.prop === propName)
  937. if (Column) {
  938. getModelApi(agloId).then(res => {
  939. Column.compOptions.enum = res.data as any[]
  940. if (flag) {
  941. Column.compOptions.enum.unshift({
  942. algorithmId: null,
  943. id: 1,
  944. modelAddress: null,
  945. modelName: '基于训练生成的模型'
  946. })
  947. }
  948. })
  949. }
  950. }
  951. const getAlgo = (propName, type) => {
  952. const column = formItems.value[0].items.find(column => column.prop === propName)
  953. if (column) {
  954. getAlgorithmApi(type, subSystem).then(res => {
  955. column.compOptions.enum = res.data as any[]
  956. })
  957. }
  958. }
  959. // 算法类型:1-5、算法类型名称:如训练数据增强、页码、模型Id、模型的参数下标
  960. const getAgloParams = (agloType, agloTypeName, page, modelId) => {
  961. const algoId = formItem[agloTypeName].algorithmId
  962. getAlgorithmApi(agloType, subSystem).then(res => {
  963. res.data.forEach(item => {
  964. if (item.id === algoId) {
  965. const params = eval('(' + item.parameterConfig + ')')
  966. formItem[agloTypeName].modelId = modelId
  967. formItem[agloTypeName].params = params
  968. // (参数信息,第几页,数组名称)
  969. addForm(params, page, agloTypeName)
  970. }
  971. })
  972. })
  973. }
  974. // 返回按钮
  975. const onReturn = () => {
  976. router.push(`/index`)
  977. }
  978. let flag = ref<number>(0) //跳转到日志页面的flag,0为训练日志、1为推理日志
  979. // 下一步
  980. const onNext = () => {
  981. const formEl = proFormRef.value![0].proFormRef
  982. if (!formEl) return
  983. formEl.validate(valid => {
  984. if (valid) {
  985. if (formItem.selectTask.length === 0 && pageIndex.value === 1) {
  986. ElMessage.warning('请选择任务')
  987. return
  988. }
  989. if (pageIndex.value === 2 || pageIndex.value === 6 || pageIndex.value === 10) {
  990. let dataName, flag
  991. if (pageIndex.value === 2) dataName = 'trainDataSelect'
  992. else if (pageIndex.value === 6) dataName = 'testDataSelect'
  993. else if (pageIndex.value === 10) dataName = 'reasoningDataSelect'
  994. switch (activeName.value) {
  995. case 'one':
  996. flag = 0
  997. break
  998. case 'two':
  999. flag = 1
  1000. break
  1001. case 'three':
  1002. flag = 2
  1003. break
  1004. case 'false':
  1005. flag = 3
  1006. break
  1007. default:
  1008. break
  1009. }
  1010. formItem[dataName] = []
  1011. for (let i = 0; i <= flag; i++) {
  1012. if (proTable.value![i].tableData.length === 0) {
  1013. ElMessage.warning('数据存在空集,请正确选择数据')
  1014. return
  1015. }
  1016. let obj = proTable.value![i].searchParam
  1017. for (let key in obj) {
  1018. if (obj.hasOwnProperty(key) && obj[key] === '') {
  1019. delete obj[key]
  1020. }
  1021. }
  1022. formItem[dataName].push({
  1023. conditionSelected: true,
  1024. condition: proTable.value![i].searchParam
  1025. })
  1026. }
  1027. activeName.value = 'one'
  1028. tabTwo.value = true
  1029. tabThree.value = true
  1030. tabFour.value = true
  1031. }
  1032. if (pageIndex.value === formItem.selectTask[formItem.selectTask.length - 2]) {
  1033. nextBtnText.value = '提交'
  1034. }
  1035. if (pageIndex.value === formItem.selectTask[formItem.selectTask.length - 1]) {
  1036. console.log('flag.value', flag.value)
  1037. return
  1038. // router.push({ path: `/logPage/${flag.value}`, query: { type: 1 } })
  1039. }
  1040. pageIndex.value = formItem.selectTask[formItem.selectTask.findIndex(page => page === pageIndex.value) + 1]
  1041. }
  1042. })
  1043. }
  1044. // 上一步
  1045. const onBack = () => {
  1046. nextBtnText.value = '下一步'
  1047. if (pageIndex.value === formItem.selectTask[0]) {
  1048. pageIndex.value = 1
  1049. return
  1050. }
  1051. pageIndex.value = formItem.selectTask[formItem.selectTask.findIndex(page => page === pageIndex.value) - 1]
  1052. }
  1053. const changeTree = (newVal, allVal) => {
  1054. const newId = newVal.id
  1055. const dependencyMap = new Map([
  1056. [
  1057. [3, 4, 2, 5],
  1058. [2, 5]
  1059. ], // 如果包含3或4,则添加2和5
  1060. [
  1061. [7, 8, 6, 9],
  1062. [6, 9]
  1063. ],
  1064. [
  1065. [11, 12, 10, 13],
  1066. [10, 13]
  1067. ]
  1068. ])
  1069. const updateCheckedKeys = keysSet => {
  1070. prevTreeData.value = Array.from(keysSet)
  1071. selectTaskTreeRef.value![0].setCheckedKeys(Array.from(keysSet), false)
  1072. }
  1073. if (!allVal.checkedKeys.includes(newId)) {
  1074. if (newId === 2 || newId === 5) {
  1075. const data = delNumber(2, 5, allVal.checkedKeys)
  1076. updateCheckedKeys(new Set(data))
  1077. } else if (newId === 6 || newId === 9) {
  1078. const data = delNumber(6, 9, allVal.checkedKeys)
  1079. updateCheckedKeys(new Set(data))
  1080. } else if (newId === 10 || newId === 13) {
  1081. const data = delNumber(10, 13, allVal.checkedKeys)
  1082. updateCheckedKeys(new Set(data))
  1083. }
  1084. } else {
  1085. for (const [keysToCheck, keysToAdd] of dependencyMap.entries()) {
  1086. if (keysToCheck.includes(newId)) {
  1087. const keysSet = new Set([...allVal.checkedKeys, ...keysToAdd])
  1088. updateCheckedKeys(keysSet)
  1089. break
  1090. }
  1091. }
  1092. }
  1093. formItem.selectTask = selectTaskTreeRef.value![0].getCheckedKeys().filter(item => item < 90)
  1094. }
  1095. // 树组件去除节点函数
  1096. const delNumber = (start, end, dataList) => {
  1097. return dataList.filter(number => !(number >= start && number <= end)).sort((a, b) => a - b)
  1098. }
  1099. const onSubmit = () => {
  1100. findParams(formItem)
  1101. createTaskApi(formItem).then(res => {
  1102. console.log('createTask', res)
  1103. // const taskId=res
  1104. router.push({ path: `/task/subtask/`, query: { id: res.data } })
  1105. })
  1106. }
  1107. const findParams = obj => {
  1108. for (const key in obj) {
  1109. if (obj[key] !== null && typeof obj[key] === 'object') {
  1110. // 如果值是数组,则遍历数组中的每个元素
  1111. if (Array.isArray(obj[key])) {
  1112. obj[key].forEach(item => {
  1113. if (item.params) {
  1114. item.params.forEach(paramItem => {
  1115. if (!paramItem.value) {
  1116. paramItem.value = paramItem.defaultValue
  1117. }
  1118. })
  1119. item.params = JSON.stringify(item.params)
  1120. }
  1121. if (item.condition) {
  1122. item.condition = JSON.stringify(item.condition)
  1123. }
  1124. })
  1125. } else {
  1126. // 如果值是对象
  1127. if (obj[key]['params']) {
  1128. obj[key]['params'].forEach(paramItem => {
  1129. if (!paramItem.value) {
  1130. paramItem.value = paramItem.defaultValue
  1131. }
  1132. })
  1133. obj[key]['params'] = JSON.stringify(obj[key]['params'])
  1134. }
  1135. if (obj[key]['condition']) {
  1136. obj[key]['condition'] = JSON.stringify(obj[key]['condition'])
  1137. }
  1138. }
  1139. }
  1140. }
  1141. }
  1142. const beforeTabLeave = (activeName, oldActiveName) => {
  1143. let dataSelect1
  1144. if (pageIndex.value === 2) {
  1145. dataSelect1 = 'trainDataSelect'
  1146. } else if (pageIndex.value === 6) {
  1147. dataSelect1 = 'testDataSelect'
  1148. } else if (pageIndex.value === 10) {
  1149. dataSelect1 = 'reasoningDataSelect'
  1150. }
  1151. switch (oldActiveName) {
  1152. case 'one':
  1153. Object.assign(initParam1, formItem[dataSelect1]?.[0]?.condition)
  1154. break
  1155. case 'two':
  1156. Object.assign(initParam2, formItem[dataSelect1]?.[1]?.condition)
  1157. break
  1158. case 'three':
  1159. Object.assign(initParam3, formItem[dataSelect1]?.[2]?.condition)
  1160. break
  1161. case 'four':
  1162. Object.assign(initParam4, formItem[dataSelect1]?.[3]?.condition)
  1163. break
  1164. default:
  1165. break
  1166. }
  1167. }
  1168. const handleClick = (tab: TabsPaneContext) => {
  1169. let dataSelect
  1170. if (pageIndex.value === 2) {
  1171. dataSelect = 'trainDataSelect'
  1172. trainActiveTab.value = tab
  1173. } else if (pageIndex.value === 6) {
  1174. dataSelect = 'testDataSelect'
  1175. testActiveTab.value = tab
  1176. } else if (pageIndex.value === 10) {
  1177. dataSelect = 'reasoningDataSelect'
  1178. reasoningActiveTab.value = tab
  1179. }
  1180. const tabName = tab.paneName
  1181. switch (tabName) {
  1182. case 'one':
  1183. const data1 = formItem[dataSelect]?.[0]?.condition
  1184. console.log('data1', data1)
  1185. updateDefaultValue(data1?.objectType, data1?.objectSubtype, data1?.batchNum)
  1186. break
  1187. case 'two':
  1188. const data2 = formItem[dataSelect]?.[1]?.condition
  1189. console.log('data2', data2)
  1190. updateDefaultValue(data2?.objectType, data2?.objectSubtype, data2?.batchNum)
  1191. break
  1192. case 'three':
  1193. const data3 = formItem[dataSelect]?.[2]?.condition
  1194. console.log('data3', data3)
  1195. updateDefaultValue(data3?.objectType, data3?.objectSubtype, data3?.batchNum)
  1196. break
  1197. case 'four':
  1198. const data4 = formItem[dataSelect]?.[3]?.condition
  1199. updateDefaultValue(data4?.objectType, data4?.objectSubtype, data4?.batchNum)
  1200. break
  1201. default:
  1202. break
  1203. }
  1204. }
  1205. const updateDefaultValue = (objectType, objectSubtype, batchNum) => {
  1206. dataColumns.map(column => {
  1207. if (column.prop === 'objectType') {
  1208. column.search!.defaultValue = objectType
  1209. } else if (column.prop === 'objectSubtype') {
  1210. column.search!.defaultValue = objectSubtype
  1211. } else if (column.prop === 'batchNum') {
  1212. column.search!.defaultValue = batchNum
  1213. }
  1214. })
  1215. }
  1216. watch(
  1217. () => pageIndex.value,
  1218. value => {
  1219. switch (value) {
  1220. case 1:
  1221. title.value = '数据扩增:添加任务名称'
  1222. nextBtnText.value = '下一步'
  1223. break
  1224. case 2:
  1225. title.value = '训练数据选择'
  1226. if (trainActiveTab.value) {
  1227. handleClick(trainActiveTab.value)
  1228. }
  1229. break
  1230. case 3:
  1231. title.value = '训练数据增广'
  1232. getAlgo('trainEnhanceAlgo', 4)
  1233. break
  1234. case 4:
  1235. title.value = '训练数据扩充'
  1236. getAlgo('trainExpansionAlgo', 5)
  1237. break
  1238. case 5:
  1239. title.value = '训练算法选择'
  1240. getAlgo('trainAlgo', 1)
  1241. break
  1242. case 6:
  1243. title.value = '验证数据选择'
  1244. if (testActiveTab.value) {
  1245. handleClick(testActiveTab.value)
  1246. }
  1247. break
  1248. case 7:
  1249. title.value = '测试数据增强'
  1250. getAlgo('testEnhanceAlgo', 4)
  1251. break
  1252. case 8:
  1253. title.value = '测试数据扩充'
  1254. getAlgo('testExpansionAlgo', 5)
  1255. break
  1256. case 9:
  1257. title.value = '验证算法选择'
  1258. getAlgo('testAlgo', 2)
  1259. break
  1260. case 10:
  1261. title.value = '测试数据选择'
  1262. if (reasoningActiveTab.value) {
  1263. handleClick(reasoningActiveTab.value)
  1264. }
  1265. break
  1266. case 11:
  1267. title.value = '推理数据增强'
  1268. getAlgo('reasoningEnhanceAlgo', 4)
  1269. break
  1270. case 12:
  1271. title.value = '推理数据扩充'
  1272. getAlgo('reasoningExpansionAlgo', 5)
  1273. nextBtnText.value = '下一步'
  1274. break
  1275. case 13:
  1276. title.value = '测试算法选择'
  1277. getAlgo('reasoningAlgo', 3)
  1278. break
  1279. default:
  1280. break
  1281. }
  1282. }
  1283. )
  1284. </script>
  1285. <style scoped lang="scss">
  1286. @import './index.scss';
  1287. </style>