import React, { useState, useEffect } from 'react'; interface BasicInfoProps { onChange?: (data: Record) => void; initialData?: FormDataType; evaluationPointGroups?: Array<{id: number, pid: number, code: string, name: string, is_enabled: boolean}>; } // 定义表单数据类型 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; evaluation_point_groups_pid: number | null; type: string; id?: number; } export function BasicInfo({ onChange, initialData, evaluationPointGroups = [] }: BasicInfoProps) { const [formData, setFormData] = useState({ name: '', code: '', risk: 'medium', is_enabled: true, description: '', references_laws: { name: '', articles: [], content: '' }, evaluation_point_groups_id: null, evaluation_point_groups_pid: null, type: '' }); const [isDescExpanded, setIsDescExpanded] = useState(false); const [lawArticlesInput, setLawArticlesInput] = useState(''); const [filteredRuleGroups, setFilteredRuleGroups] = 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, evaluation_point_groups_pid: initialData.evaluation_point_groups_pid || 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]); // 当评查点类型或评查点组数据变化时,过滤规则组列表 useEffect(() => { if (evaluationPointGroups && evaluationPointGroups.length > 0) { console.log("评查点组数据更新,当前类型:", formData.type); console.log("评查点组数据:", evaluationPointGroups); if (formData.type) { // 获取所选评查点类型的组ID const typeGroup = evaluationPointGroups.find(group => group.pid === 0 && group.code === formData.type ); console.log("找到的类型组:", typeGroup); if (typeGroup) { // 更新评查点类型组ID if (formData.evaluation_point_groups_pid !== typeGroup.id) { const newData = { ...formData, evaluation_point_groups_pid: typeGroup.id }; setFormData(newData); if (onChange) onChange(newData); } // 过滤出属于该类型的规则组(pid等于类型组ID的项) const groups = evaluationPointGroups.filter(group => group.pid === typeGroup.id && group.is_enabled ); console.log("过滤后的规则组:", groups); setFilteredRuleGroups(groups); // 如果当前选择的规则组不在过滤结果中,重置选择 if (formData.evaluation_point_groups_id && !groups.some(group => group.id === formData.evaluation_point_groups_id)) { console.log("当前选择的规则组不在过滤结果中,重置选择"); const newData = { ...formData, evaluation_point_groups_id: null }; setFormData(newData); if (onChange) onChange(newData); } } else { console.log("未找到对应的类型组"); setFilteredRuleGroups([]); // 重置评查点类型组ID if (formData.evaluation_point_groups_pid !== null) { const newData = { ...formData, evaluation_point_groups_pid: null }; setFormData(newData); if (onChange) onChange(newData); } } } else { console.log("未选择评查点类型"); setFilteredRuleGroups([]); // 重置评查点类型组ID if (formData.evaluation_point_groups_pid !== null) { const newData = { ...formData, evaluation_point_groups_pid: null }; setFormData(newData); if (onChange) onChange(newData); } } } }, [formData.type, evaluationPointGroups, formData.evaluation_point_groups_id, formData.evaluation_point_groups_pid, onChange]); // 获取评查点类型选项(pid=0的数据) const getCheckpointTypeOptions = () => { if (!evaluationPointGroups || evaluationPointGroups.length === 0) { console.log("无评查点组数据,使用默认类型选项"); return ( <> ); } const typeGroups = evaluationPointGroups.filter(group => group.pid === 0 && group.is_enabled); console.log("可用的评查点类型:", typeGroups); return ( <> {typeGroups.map(group => ( ))} ); }; 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; // 重置规则组选择 newData.evaluation_point_groups_id = null; // 设置评查点类型组ID if (value) { const typeGroup = evaluationPointGroups.find(group => group.pid === 0 && group.code === value ); newData.evaluation_point_groups_pid = typeGroup ? typeGroup.id : null; } else { newData.evaluation_point_groups_pid = null; } 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个字符
用于系统标识的唯一编码
请定义评查点的风险等级
评查点类型用于分类管理,便于规则统一调用
{!formData.type ? "请先选择评查点类型" : filteredRuleGroups.length === 0 ? "该类型下暂无可用规则组" : "选择评查点所属的规则组"}
创建后是否立即启用此评查点
{ 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 || '当事人应当按照约定全面履行自己的义务。'}
); }