You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.tsx 4.7 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. /*
  2. * @Author: 赵伟
  3. * @Date: 2024-04-16 13:58:08
  4. * @Description: 创建实验
  5. */
  6. import PageTitle from '@/components/PageTitle';
  7. import { addRayReq, getRayInfoReq, updateRayReq } from '@/services/hyperParameter';
  8. import { safeInvoke } from '@/utils/functional';
  9. import { to } from '@/utils/promise';
  10. import { useLocation, useNavigate, useParams } from '@umijs/max';
  11. import { App, Button, Form } from 'antd';
  12. import { useEffect } from 'react';
  13. import BasicConfig from '../components/CreateForm/BasicConfig';
  14. import ExecuteConfig from '../components/CreateForm/ExecuteConfig';
  15. import { getReqParamName } from '../components/CreateForm/utils';
  16. import { FormData, HyperParameterData } from '../types';
  17. import styles from './index.less';
  18. function CreateHyperParameter() {
  19. const navigate = useNavigate();
  20. const [form] = Form.useForm();
  21. const { message } = App.useApp();
  22. const params = useParams();
  23. const id = safeInvoke(Number)(params.id);
  24. const { pathname } = useLocation();
  25. const isCopy = pathname.includes('copy');
  26. useEffect(() => {
  27. // 获取服务详情
  28. const getHyperParameterInfo = async (id: number) => {
  29. const [res] = await to(getRayInfoReq({ id }));
  30. if (res && res.data) {
  31. const info: HyperParameterData = res.data;
  32. const { name: name_str, parameters, points_to_evaluate, ...rest } = info;
  33. const name = isCopy ? `${name_str}-copy` : name_str;
  34. if (parameters && Array.isArray(parameters)) {
  35. parameters.forEach((item) => {
  36. const paramName = getReqParamName(item.type);
  37. item.range = item[paramName];
  38. item[paramName] = undefined;
  39. });
  40. }
  41. const formData = {
  42. ...rest,
  43. name,
  44. parameters,
  45. points_to_evaluate: points_to_evaluate ?? [],
  46. };
  47. form.setFieldsValue(formData);
  48. }
  49. };
  50. // 编辑,复制
  51. if (id && !Number.isNaN(id)) {
  52. getHyperParameterInfo(id);
  53. }
  54. }, [id, form, isCopy]);
  55. // 创建、更新、复制实验
  56. const createExperiment = async (formData: FormData) => {
  57. // 按后台接口要求,修改参数表单数据结构,将 "value" 参数改为 "bounds"/"values"/"value"
  58. const formParameters = formData['parameters'];
  59. const parameters = formParameters.map((item) => {
  60. const paramName = getReqParamName(item.type);
  61. const range = item.range;
  62. return {
  63. ...item,
  64. [paramName]: range,
  65. range: undefined,
  66. };
  67. });
  68. // 根据后台要求,修改表单数据
  69. const object = {
  70. ...formData,
  71. parameters: parameters,
  72. };
  73. const params =
  74. id && !isCopy
  75. ? {
  76. id: id,
  77. ...object,
  78. }
  79. : object;
  80. const request = id && !isCopy ? updateRayReq : addRayReq;
  81. const [res] = await to(request(params));
  82. if (res) {
  83. message.success('操作成功');
  84. navigate(-1);
  85. }
  86. };
  87. // 提交
  88. const handleSubmit = (values: FormData) => {
  89. createExperiment(values);
  90. };
  91. // 取消
  92. const cancel = () => {
  93. navigate(-1);
  94. };
  95. let buttonText = '新建';
  96. let title = '新建实验';
  97. if (id) {
  98. if (isCopy) {
  99. title = '复制实验';
  100. buttonText = '确定';
  101. } else {
  102. title = '编辑实验';
  103. buttonText = '更新';
  104. }
  105. }
  106. return (
  107. <div className={styles['create-hyper-parameter']}>
  108. <PageTitle title={title}></PageTitle>
  109. <div className={styles['create-hyper-parameter__content']}>
  110. <div>
  111. <Form
  112. name="create-hyperparameter"
  113. labelCol={{ flex: '160px' }}
  114. labelAlign="left"
  115. form={form}
  116. onFinish={handleSubmit}
  117. size="large"
  118. autoComplete="off"
  119. scrollToFirstError
  120. initialValues={{
  121. mode: 'max',
  122. parameters: [
  123. {
  124. name: '',
  125. },
  126. ],
  127. points_to_evaluate: [],
  128. }}
  129. >
  130. <BasicConfig />
  131. <ExecuteConfig />
  132. <Form.Item wrapperCol={{ offset: 0, span: 16 }} style={{ marginTop: '40px' }}>
  133. <Button type="primary" htmlType="submit">
  134. {buttonText}
  135. </Button>
  136. <Button
  137. type="default"
  138. htmlType="button"
  139. onClick={cancel}
  140. style={{ marginLeft: '20px' }}
  141. >
  142. 取消
  143. </Button>
  144. </Form.Item>
  145. </Form>
  146. </div>
  147. </div>
  148. </div>
  149. );
  150. }
  151. export default CreateHyperParameter;