import React, { forwardRef, useImperativeHandle, useState, useEffect } from "react"; import { Button, Drawer, Form, Input, Select, Radio, Upload, message, TreeSelect } from "antd"; import { CloseOutlined, UploadOutlined, CheckCircleOutlined, LoadingOutlined, CloseCircleOutlined } from "@ant-design/icons"; import { uploadTypeList, AccessType } from "./prop"; import styles from "../../css/Drawer.module.css"; import { getOrganizations, uploadVoiceFile, getSkillList, uploadSensors } from "../../api/index"; import { AxiosResponse } from "axios"; import { validateFn, validateFileLength, validateFileSize, validateFileType } from "../../util/index" const { TextArea } = Input; const { Option } = Select; // 定义 ref 的类型 export interface DrawerExampleRef { showDrawer: (title: string, type?: string | undefined, item?: any) => void; } interface UploadResponse { fileUUID: string; code: number; msg: string; } interface TreeNode { deptName: React.ReactNode; // 节点的显示文本 deptID: string | number; // 节点的值 childNodes?: TreeNode[]; // 子节点 [key: string]: any; // 其他自定义属性 } const DrawerExample: React.FC = forwardRef((props, ref) => { const { refreshFn } = props as any; const [open, setOpen] = useState(false); const [title, setTitle] = useState(""); const [departmentData, setDepartmentData] = useState([]); const [skillData, setSkillData] = useState([]); const [uploadState, setUploadState] = useState(false); const [loading, setLoading] = useState(false); const [initialValues, setInitialValues] = useState({}); const [disable, setDisable] = useState(false); const [onlyDisable, setOnlyDisable] = useState(false); const [form] = Form.useForm(); const [pageStatus, setPageStatus] = useState(""); useImperativeHandle(ref, () => ({ showDrawer: (title: string, type: string | undefined, item: any) => { setTitle(title); if (type === 'edit') { setPageStatus(type); setInitialValues({ streamUrl: item.streamUrl, soundSensorName: item.name, soundSensorType: item.videoType, soundSensorUrl: item.srcUrl, soundFileUUid: item.fileUuid, deptUuid: item.deptUuid, department: '', description: item.description, skillUuid: item.skillUuid, responsiblePerson: item.responsiblePerson, ip: item.ip, soundSensorUuid: item.uuid }) setDisable(true) setOnlyDisable(false) } else if (type === 'show') { setPageStatus(type); setInitialValues({ streamUrl: item.streamUrl, soundSensorName: item.name, soundSensorType: item.videoType, soundSensorUrl: item.srcUrl, soundFileUUid: item.fileUuid, deptUuid: item.deptUuid, department: '', description: item.description, skillUuid: item.skillUuid, responsiblePerson: item.responsiblePerson, ip: item.ip, soundSensorUuid: item.uuid }) setDisable(true) setOnlyDisable(true) } else { setInitialValues({ streamUrl: '', soundSensorName: '', soundSensorType: AccessType.FileUpload, soundSensorUrl: '', soundFileUUid: '', deptUuid: departmentData.length ? departmentData[0].deptID : '', department: departmentData.length ? departmentData[0].deptName : '', description: '', skillUuid: '', responsiblePerson: departmentData.length ? departmentData[0].deptName : '', ip: '', soundSensorUuid: '', }) setPageStatus(''); setDisable(false) setOnlyDisable(false) } // 确保 initialValues 更新完成后再打开 Drawer setTimeout(() => { setOpen(true); }, 0); } })); const customRequest = (options: any) => { const { file, onSuccess, onError, onProgress } = options; setUploadState(true); if (!validateFn(file)) { message.error({ content: '文件格式不正确' }) onError({ message: "文件格式不正确" }); return; } if (file.size > Number(import.meta.env.VITE_APP_FILE_SIZE) * 1024 * 1024) { message.error({ content: '文件大小超过50MB限制' }) onError({ message: "文件大小超过50MB限制" }); return; } const formData = new FormData(); // 添加文件到 FormData(字段名需与后端约定,通常为 "file") formData.append('file', file); const fn = (percent: number) => onProgress({ percent: percent }); uploadVoiceFile(formData, fn).then((res: AxiosResponse) => { const { code, msg, fileUUID } = res as any; if (code !== 200) { onError({ message: msg }); return; } form.setFieldValue("soundFileUUid", fileUUID) onSuccess({ message: "文件上传成功" }) message.success({ content: '文件上传成功', duration: 2, }) }).catch(error => { onError({ message: "文件上传失败" }); }); }; const onClose = () => { form.resetFields(); setUploadState(false); setOpen(false); }; const Footer = () => { return (
); }; const onFinish = (values: any) => { if (!values) { return; } if (pageStatus === 'show') { onClose(); return; } if (!values.soundFileUUid) { message.error({ content: '请确认文件是否上传完成' }) return; } setLoading(true); uploadSensors(values).then((res: any) => { if (res.code === 200) { message.success("操作成功"); refreshFn(); } }).finally(() => { onClose(); setLoading(false); }); }; const onSelect = (_: String, node: TreeNode) => { form.setFieldValue("responsiblePerson", node.deptName); form.setFieldValue("department", node.deptName); }; const iconRender = (file: any) => { switch (file.status) { case 'uploading': return ; case 'done': return ; case 'error': return ; default: return ; } }; const onRemove = () => { form.setFieldValue("files", []); setUploadState(false); } useEffect(() => { // 模拟数据获取 getOrganizations().then((res) => { setDepartmentData(res.data ?? []); if (res.data.length > 0) { setInitialValues({ soundSensorName: '', soundSensorUuid: '', skillUuid: '', soundSensorType: AccessType.FileUpload, soundFileUUid: '', deptUuid: res.data[0].deptID, department: res.data[0].deptName, responsiblePerson: res.data[0].deptName }) } }); getSkillList().then((res) => { setSkillData(res.data ?? []); }); }, []); useEffect(() => { if (open) { form.setFieldsValue(initialValues); // 动态更新表单值 form.setFields([{ name: 'skillUuid', disabled: onlyDisable }] as any); // 动态更新字段禁用状态 } }, [initialValues, open, form, onlyDisable]); return ( <> } >
仅支持数字、中文、大小写英文字母、特殊字符-\/#.} > prevValues.soundSensorType !== currentValues.soundSensorType}> {({ getFieldValue }) => { return ( getFieldValue("soundSensorType") === AccessType.Audio ? ( ) : null) }} prevValues.soundSensorType !== currentValues.soundSensorType}> {({ getFieldValue }) => { return getFieldValue("soundSensorType") === AccessType.FileUpload && getFieldValue("soundSensorUuid") === "" && ( { if (Array.isArray(e)) { return e; } return e && e.fileList; }} rules={[{ required: true }, { validator: (_, value) => validateFileLength(value) }, { validator: (_, value) => validateFileSize(value) }, { validator: (_, value) => validateFileType(value) }]} label="音频上传" > ( ({(size / 1024 / 1024).toFixed(2)}MB) ), showRemoveIcon: true, removeIcon: , }}>

文件大小仅支持 50M 以内,支持mp4格式,仅允许上传 1 个文件

) }}
prevValues.soundSensorUuid !== currentValues.soundSensorUuid}> {({ getFieldValue }) => getFieldValue("soundSensorUuid") !== "" ? ( ) : null } prevValues.soundSensorType !== currentValues.soundSensorType}> {({ getFieldValue }) => getFieldValue("soundSensorType") === AccessType.Audio ? ( ) : null }