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 5.4 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. import editExperimentIcon from '@/assets/img/edit-experiment.png';
  2. import KFModal from '@/components/KFModal';
  3. import { type ResourceData } from '@/pages/Dataset/config';
  4. import {
  5. addModelsVersionDetail,
  6. exportModelReq,
  7. getModelList,
  8. getModelVersionsById,
  9. } from '@/services/dataset';
  10. import { to } from '@/utils/promise';
  11. import { InfoCircleOutlined } from '@ant-design/icons';
  12. import { Form, Input, ModalProps, Select } from 'antd';
  13. import { useEffect, useState } from 'react';
  14. import styles from './index.less';
  15. type FormData = {
  16. models_id: string;
  17. version: string;
  18. description: string;
  19. };
  20. type ExportModelResponce = {
  21. fileName: string;
  22. fileSize: string;
  23. url: string;
  24. };
  25. type CreateModelVersionParams = FormData & {
  26. file_name: string;
  27. file_size: string;
  28. url: string;
  29. // name: string;
  30. };
  31. interface ExportModelModalProps extends Omit<ModalProps, 'onOk'> {
  32. path: string;
  33. onOk: () => void;
  34. }
  35. function ExportModelModal({ path, onOk, ...rest }: ExportModelModalProps) {
  36. const [form] = Form.useForm();
  37. const [models, setModels] = useState<ResourceData[]>([]);
  38. const [versions, setVersions] = useState<string[]>([]);
  39. const [uuid] = useState(Date.now());
  40. const layout = {
  41. labelCol: { span: 24 },
  42. wrapperCol: { span: 24 },
  43. };
  44. useEffect(() => {
  45. requestModelList();
  46. }, []);
  47. // 模型版本tooltip
  48. const getTooltip = () => {
  49. const id = form.getFieldValue('models_id');
  50. const name = models.find((item) => item.id === id)?.name ?? '';
  51. const tooltip =
  52. versions.length > 0 ? `${name}有以下版本:\n${versions.join('、')}\n注意不能重复` : undefined;
  53. return tooltip;
  54. };
  55. // 处理模型名称变化
  56. const handleModelChange = (id: number | undefined) => {
  57. if (id) {
  58. getModelVersions(id);
  59. } else {
  60. setVersions([]);
  61. }
  62. };
  63. // 获取模型列表
  64. const requestModelList = async () => {
  65. const params = {
  66. page: 0,
  67. size: 1000,
  68. available_range: 0, // 个人
  69. };
  70. const [res] = await to(getModelList(params));
  71. if (res && res.data) {
  72. setModels(res.data.content || []);
  73. }
  74. };
  75. // 获取模型版本列表
  76. const getModelVersions = async (id: number) => {
  77. const [res] = await to(getModelVersionsById(id));
  78. if (res && res.data) {
  79. setVersions(res.data);
  80. }
  81. };
  82. // 提交
  83. const hanldeFinish = (formData: FormData) => {
  84. exportToModel(formData);
  85. };
  86. // 导出到模型
  87. const exportToModel = async (formData: FormData) => {
  88. const params = {
  89. uuid: String(uuid),
  90. path,
  91. };
  92. const [res] = await to(exportModelReq(params));
  93. if (res && res.data) {
  94. const files = res.data as ExportModelResponce[];
  95. const params: CreateModelVersionParams[] = files.map((item) => ({
  96. ...formData,
  97. file_name: item.fileName,
  98. file_size: item.fileSize,
  99. url: item.url,
  100. }));
  101. createModelVersion(params);
  102. }
  103. };
  104. // 创建模型版本
  105. const createModelVersion = async (params: CreateModelVersionParams[]) => {
  106. const [res] = await to(addModelsVersionDetail(params));
  107. if (res) {
  108. onOk();
  109. }
  110. };
  111. return (
  112. <KFModal
  113. {...rest}
  114. title="导出到模型库"
  115. image={editExperimentIcon}
  116. okButtonProps={{
  117. htmlType: 'submit',
  118. form: 'form',
  119. }}
  120. width={825}
  121. className={styles['export-model-modal']}
  122. >
  123. <Form
  124. name="form"
  125. layout="horizontal"
  126. onFinish={hanldeFinish}
  127. autoComplete="off"
  128. form={form}
  129. {...layout}
  130. labelAlign="left"
  131. labelWrap
  132. >
  133. <Form.Item
  134. label="模型名称"
  135. name="models_id"
  136. rules={[{ required: true, message: '请选择模型' }]}
  137. >
  138. <Select
  139. placeholder="请选择模型"
  140. onChange={handleModelChange}
  141. options={models}
  142. fieldNames={{ label: 'name', value: 'id' }}
  143. allowClear
  144. ></Select>
  145. </Form.Item>
  146. <Form.Item
  147. label="模型版本"
  148. name="version"
  149. tooltip={
  150. getTooltip()
  151. ? {
  152. overlayClassName: styles['export-model-modal__tooltip'],
  153. title: getTooltip(),
  154. icon: <InfoCircleOutlined />,
  155. }
  156. : undefined
  157. }
  158. rules={[
  159. { required: true, message: '请输入模型版本' },
  160. {
  161. validator: (_, value) => {
  162. if (value && versions.includes(value)) {
  163. return Promise.reject('模型版本已存在');
  164. } else {
  165. return Promise.resolve();
  166. }
  167. },
  168. },
  169. ]}
  170. >
  171. <Input placeholder="请输入模型版本" maxLength={64} showCount allowClear />
  172. </Form.Item>
  173. <Form.Item
  174. label="版本描述"
  175. name="description"
  176. rules={[{ required: true, message: '请输入版本描述' }]}
  177. >
  178. <Input.TextArea
  179. placeholder="请输入版本描述"
  180. maxLength={128}
  181. autoSize={{ minRows: 2, maxRows: 5 }}
  182. showCount
  183. allowClear
  184. />
  185. </Form.Item>
  186. </Form>
  187. </KFModal>
  188. );
  189. }
  190. export default ExportModelModal;