/** * 站点信息配置页面 * 用于配置和管理 DICOM 站点基本信息 */ import React, { useEffect, useState } from 'react'; import { Form, Input, InputNumber, Button, Typography, Space, message, Spin, Modal, } from 'antd'; import { CopyOutlined } from '@ant-design/icons'; import { SPACING } from '../../constants'; import { RootState, useAppSelector } from '@/states/store'; const { Title } = Typography; const { TextArea } = Input; // 站点信息数据类型 interface SiteInfoData { siteName: string; aeTitle: string; port: number; institutionName?: string; siteCode?: string; description?: string; } /** * 站点信息组件 * * 布局结构: * - Layout Type: Vertical Stack Layout * - Form Layout: Horizontal * - Label Width: 120px */ const SiteInfo: React.FC = () => { const [form] = Form.useForm(); const [loading, setLoading] = useState(false); const [saving, setSaving] = useState(false); const [initialValues, setInitialValues] = useState(null); const sn = useAppSelector((state: RootState) => state.product.sn); const { Search } = Input; // 模拟加载数据 useEffect(() => { loadSiteInfo(); }, []); // 加载站点信息 const loadSiteInfo = async () => { setLoading(true); try { // TODO: 替换为实际的 API 调用 // const data = await getSiteInfo(); // 模拟数据 const mockData: SiteInfoData = { siteName: 'Medical Imaging Center', aeTitle: 'PACS_SERVER', port: 104, institutionName: 'General Hospital', siteCode: 'SITE001', description: 'Main PACS server for medical imaging', }; setInitialValues(mockData); form.setFieldsValue(mockData); } catch (error) { message.error('加载站点信息失败'); console.error('Failed to load site info:', error); } finally { setLoading(false); } }; // 保存站点信息 const handleSave = async () => { try { // 触发表单验证 const values = await form.validateFields(); setSaving(true); // TODO: 替换为实际的 API 调用 // await updateSiteInfo(values); // 模拟保存延迟 await new Promise((resolve) => setTimeout(resolve, 1000)); message.success('保存成功'); setInitialValues(values); // 提示用户可能需要重启服务 Modal.info({ title: '提示', content: '站点配置已保存,部分更改可能需要重启服务后生效。', }); } catch (error) { if (error instanceof Error) { message.error(`保存失败: ${error.message}`); } else { message.error('表单验证失败,请检查输入'); } console.error('Failed to save site info:', error); } finally { setSaving(false); } }; // 重置表单 const handleReset = (): void => { if (initialValues) { // 检查是否有未保存的更改 const currentValues = form.getFieldsValue(); const hasChanges = JSON.stringify(currentValues) !== JSON.stringify(initialValues); if (hasChanges) { Modal.confirm({ title: '确认重置', content: '您有未保存的更改,确定要重置表单吗?', onOk: () => { form.setFieldsValue(initialValues); message.info('表单已重置'); }, }); } else { form.setFieldsValue(initialValues); message.info('表单已重置'); } } }; // AE Title 输入转大写 const handleAETitleChange = ( e: React.ChangeEvent ): void => { const value = e.target.value.toUpperCase().replace(/[^A-Z0-9_]/g, ''); form.setFieldsValue({ aeTitle: value }); }; // 复制SN号码 const handleCopySN = async (): Promise => { if (sn) { try { await navigator.clipboard.writeText(sn); message.success('SN码已复制到剪贴板'); } catch (error) { message.error('复制失败,请手动复制'); console.error('Failed to copy SN:', error); } } else { message.warning('SN码为空'); } }; if (loading) { return (
); } return (
站点信息
{/* SN码 */}