import { ProForm, ProFormInstance, ProFormList, ProFormSelect, ProFormText, ProFormTextArea, ProFormUploadDragger, StepsForm, } from '@ant-design/pro-components'; import { FormListActionType } from '@ant-design/pro-form/lib'; import { getBaseBusinessModelList } from '@/services/testApi/businessModel'; import { getDeviceGroupTree } from '@/services/testApi/deviceGroup'; import { FormattedMessage, useIntl } from '@umijs/max'; import { Modal, Transfer, Tree, UploadFile, message } from 'antd'; import yaml from 'js-yaml'; import React, { useEffect, useRef, useState } from 'react'; import { proFormMaxItemStyleProps, proFormMaxModelWidth, proFormStepsFormProps, } from '../../../../../config/defaultForm'; // import {beforeUploadFile} from "@/utils/common"; // @ts-ignore import cookie from 'react-cookies'; export type FormValueType = { target?: string; template?: string; type?: string; time?: string; frequency?: string; } & Partial; export type CreateFormProps = { createModalOpen: boolean; handleModal: () => void; values: Partial; reload: any; currentDefaultFieldsData?: Record; }; const waitTime = (time: number = 100) => { return new Promise((resolve) => { setTimeout(() => { resolve(true); }, time); }); }; // interface ProjectConfig { // params: Array; // } const CreateForm: React.FC = (props) => { const actionFormListRef = useRef< FormListActionType<{ name: string; }> >(); const intl = useIntl(); const [isHasModelFkId, setIsHasModelFkId] = useState(false); const [dataFormList] = useState([]); const dataFormListRef = useRef(dataFormList); const [fileList, setFileList] = useState[]>([]); // 关联模型state const [modalData, setModalData] = useState([]); const [targetKeys, setTargetKeys] = useState([]); // 关联节点state const [treeData, setTreeData] = React.useState([]); const [selectKeys, setSelectKeys] = useState([]); // const [form] = Form.useForm(); const [current, setCurrent] = useState(0); const formRef = useRef(); const [filePath, setFilePath] = useState(''); const handleFileChange = ({ file }: { file: UploadFile }) => { let curFile: any; switch (file.status) { case 'uploading': case 'done': curFile = [file]; break; case 'removed': default: curFile = []; break; } setFileList([...curFile]); }; // todo disabled: !v?.defaultVersionFkId,设置 暂时设置为false 创建成功后报error const getModelData = () => { getBaseBusinessModelList({ keyword: '', page: 1, pageSize: 100 }).then((res) => { console.log(66666, res.data); let result = (res.data?.results || []).map((v: any) => { console.log(v); return { key: v.id, title: v.name, chosen: false, disabled: false, }; }); setModalData(result); }); // setMockData(tempMockData); // setTargetKeys(tempTargetKeys); }; const handleChange = (newTargetKeys: string[]) => { setTargetKeys(newTargetKeys); }; useEffect(() => { setTargetKeys([]); console.log('selectKeys', selectKeys); if (props.createModalOpen) { getModelData(); getDeviceGroupTree() .then((resp: API.Response) => { setTreeData(resp.data.tree); }) .catch(() => {}); } else { formRef.current?.resetFields(); } }, [props.createModalOpen]); useEffect(() => { if (props.currentDefaultFieldsData) { // 如果是在模型详情新增版本,ModelFkId不可编辑 console.log(props.values, isHasModelFkId, 'currentDefaultFieldsData'); setIsHasModelFkId(true); } else { setIsHasModelFkId(false); } }, []); return (
stepsProps={proFormStepsFormProps.stepsProps} current={current} onCurrentChange={setCurrent} formProps={{ validateMessages: { required: `${intl.formatMessage({ id: 'common.form.required', defaultMessage: '此项为必填项', })}`, }, }} stepsFormRender={(dom, submitter) => { return ( } width={proFormMaxModelWidth} onCancel={() => { setCurrent(0); formRef.current?.resetFields(); setFileList([]); props.handleModal(); }} open={props.createModalOpen} footer={submitter} destroyOnClose > {dom} ); }} > {/* 基本信息 数据创建 */} className="gn_form" name="base" formRef={formRef} title={} stepProps={{ description: ( ), }} onFinish={async () => { // setFormData(formRef.current?.getFieldsValue()); await waitTime(500); return true; }} > {/* //TODO 默认填充模型 无需选择 */} } placeholder={`${intl.formatMessage({ id: 'common.please_select', defaultMessage: '$$$', })}${intl.formatMessage({ id: 'business_model.form.modelFkId', defaultMessage: '$$$', })}`} required={true} // initialValue={props.values.modelFkId} showSearch debounceTime={1000} disabled={true} // request={async (keyWord) => { // const resp = await getBaseBusinessModelList({ // keyword: keyWord?.keyWords || '', // }); // return resp.data.list.map((v: any) => { // return { // label: v.name, // value: v.id, // }; // }); // }} /> } placeholder={`${intl.formatMessage({ id: 'common.please_input', defaultMessage: '$$$', })}${intl.formatMessage({ id: 'business_model.form.remark', defaultMessage: '$$$', })}`} required={false} disabled={false} /> {/* 关联算法模型 */} name="baseModel" title={ } stepProps={{ description: ( ), }} onFinish={async () => { return true; }} > {/* //TODO 与UI确定调整尺寸布局 */} item.title} /> {/* 业务代码 */} className="gn_form" name="project_file" title={ } style={{ width: proFormMaxItemStyleProps.width }} stepProps={{ description: ( ), }} onFinish={async (values: any) => { if ('projectFilePath' in values && values['projectFilePath'].length > 0) { let projectFilePath = values['projectFilePath'][0]?.response?.data?.path || ''; setFilePath(projectFilePath); } return true; }} > 上传业务代码} name="projectFilePath" action="/api/v1/file/uploadFile" max={1} fieldProps={{ name: 'file', // beforeUpload: beforeUploadFile, data: { path: `models/${Date.now()}` }, headers: { 'X-CSRFToken': cookie.load('csrftoken'), Authorization: `Bearer ${localStorage.getItem('access') || ''}`, }, }} />
请上传格式为zip.tar.gz的业务代码文件
{/* 参数配置 */} className="gn_form" name="config" title={} stepProps={{ description: ( ), }} onFinish={async (values: any) => { setFileList([]); let formData = formRef.current?.getFieldsValue(); if (formData?.modelFkId) { await waitTime(500); formData.modelConfig = { params: values?.params || [] }; if (filePath) { formData.path = filePath; } // postModelVersionCreateModelVersion(formData) // .then(() => { // message.success( // intl.formatMessage({ id: 'common.success', defaultMessage: '$$$' }), // ); // props.handleModal(); // props.reload(); // }) // .catch(() => { // message.error(intl.formatMessage({ id: 'common.failure', defaultMessage: '$$$' })); // return false; // }); } return true; }} > 上传配置文件} value={fileList} name="dragger" fieldProps={{ onChange: handleFileChange, onRemove: () => { let index_ids = actionFormListRef.current?.getList()?.map((v, i) => { return i; }); actionFormListRef.current?.remove(index_ids || []); }, beforeUpload: (file) => { if ( !file.name.endsWith('.yaml') && !file.name.endsWith('.yml') && !file.name.endsWith('.json') ) { message.error('请上传yaml或json文件').then(() => {}); return false; } else { let parsedData = {}; file .text() .then((text) => { if (file.name.endsWith('.yaml') || file.name.endsWith('.yml')) { parsedData = yaml.load(text) as Record; } if (file.name.endsWith('.json')) { parsedData = JSON.parse(text) as Record; } if (Object.keys(parsedData).length > 0) { dataFormListRef.current = Object.entries(parsedData).map( ([key, value]) => ({ name: key, default: value, }), ); dataFormListRef.current.forEach((v: any, i: number) => { actionFormListRef.current?.add(v, i); }); } return true; }) .catch(() => { return false; }); } }, }} /> {/* // TODO label字重与上面统一, 操作按钮需要与输入框对齐 */} 模型参数

暂未上传模型配置文件,可根据业务需求手动添加参数字段~

} actionRef={actionFormListRef} itemContainerRender={(doms) => { return {doms}; }} alwaysShowItemLabel > {() => { return ( <> ); }} {/* 关联节点 */} name="group" title={} stepProps={{ description: ( ), }} onFinish={async () => { return true; }} style={{ width: proFormMaxItemStyleProps.width }} >
{'节点信息'}
{ // form.setFieldsValue({menuIds: checkedKeys}) setSelectKeys(checkedKeys); // formRef3.current?.setFieldValue('groupIds', checkedKeys) }} treeData={treeData} // loadData={({treeNode}) => { // return treeData // }} /> ); }; export default CreateForm;