import React, { useState, useEffect } from 'react'; interface BasicInfoProps { onChange?: (data: Record) => void; initialData?: Record; } // 定义表单数据类型 interface FormDataType { name: string; code: string; risk: string; is_enabled: boolean; description: string; references_laws: { name: string; articles: string[]; content: string; }; evaluation_point_groups_id: number | null; type: string; } export function BasicInfo({ onChange, initialData }: BasicInfoProps) { const [formData, setFormData] = useState({ name: '', code: '', risk: 'medium', is_enabled: true, description: '', references_laws: { name: '', articles: [], content: '' }, evaluation_point_groups_id: null, type: '' }); const [isDescExpanded, setIsDescExpanded] = useState(false); const [lawArticlesInput, setLawArticlesInput] = useState(''); // 当initialData变化时更新表单数据 useEffect(() => { if (initialData) { const newFormData = { name: initialData.name || '', code: initialData.code || '', risk: initialData.risk || 'medium', is_enabled: initialData.is_enabled !== undefined ? initialData.is_enabled : true, description: initialData.description || '', references_laws: initialData.references_laws || { name: '', articles: [], content: '' }, evaluation_point_groups_id: initialData.evaluation_point_groups_id || null, type: initialData.type || '' }; setFormData(newFormData); // 更新法律条款输入框 if (initialData.references_laws && Array.isArray(initialData.references_laws.articles)) { setLawArticlesInput(initialData.references_laws.articles.join(',')); } // 如果有描述或法律依据,默认展开详细信息 if (initialData.description || (initialData.references_laws && (initialData.references_laws.name || initialData.references_laws.content || (initialData.references_laws.articles && initialData.references_laws.articles.length > 0)))) { setIsDescExpanded(true); } } }, [initialData]); const handleToggleDescription = () => { setIsDescExpanded(!isDescExpanded); }; const handleInputChange = (e: React.ChangeEvent) => { const { id, value } = e.target; const newData = { ...formData }; // 映射id到表单字段名 switch(id) { case 'rule-name': newData.name = value; break; case 'rule-code': newData.code = value; break; case 'risk-level': newData.risk = value; break; case 'is-enabled': newData.is_enabled = value === 'true'; break; case 'rule-description': newData.description = value; break; case 'law-name': newData.references_laws.name = value; break; case 'law-content': newData.references_laws.content = value; break; case 'law-articles': setLawArticlesInput(value); break; case 'evaluation-point-group': newData.evaluation_point_groups_id = value ? parseInt(value) : null; break; case 'checkpoint-type': newData.type = value; break; } setFormData(newData); if (onChange) { onChange(newData); } }; const handleLawArticlesChange = (value: string) => { setLawArticlesInput(value); const articles = value.split(',') .map(article => article.trim()) .filter(article => article !== ''); const newData = { ...formData, references_laws: { ...formData.references_laws, articles } }; setFormData(newData); if (onChange) { onChange(newData); } }; return (

基本信息

请使用简洁明了的名称,不超过30个字符
用于系统标识的唯一编码
请定义评查点的风险等级
评查点类型用于分类管理,便于规则统一调用
创建后是否立即启用此评查点
{ if (e.key === 'Enter' || e.key === ' ') { handleToggleDescription(); } }} tabIndex={0} role="button" >
详细描述有助于其他用户了解该评查点的用途
{/* 引用法典输入区域 */}
handleLawArticlesChange(e.target.value)} />
多个条款用逗号分隔,将自动转换为数组格式
引用的法律条文将在评查结果中显示,帮助用户理解评查规则的法律依据
{/* 预览区域 */}
预览效果
{formData.references_laws.name || '《中华人民共和国民法典》'}
{formData.references_laws.articles.length > 0 ? formData.references_laws.articles.map((article, index) => ( {article} )) : ( <> 第五百八十五条 第五百八十六条 )}
{formData.references_laws.content || '当事人应当按照约定全面履行自己的义务。'}
); }