import React, { useState, useEffect, useMemo } from 'react'; import { Button, Card, Radio, Tabs, Input, Form, Row, Col } from 'antd'; import { ViewMode } from './types'; import { defaultConfig } from './config'; import { useExcelParser } from './hooks/useExcelParser'; import { useSheetConfig } from './hooks/useSheetConfig'; import FileUpload from './components/FileUpload'; import SheetConfig from './components/SheetConfig/index'; import DataViewer from './components/DataViewer/index'; import './styles.css'; import type { Template } from '@/share/exceltypes'; import type { UseMutateFunction } from '@tanstack/react-query'; // 为组件定义 Props 接口 export interface ExcelToJsonProps { initialValue?: Template | null; onSave?: UseMutateFunction, unknown>; /** 是否使用默认配置 */ useDefaultConfig?: boolean; } const ExcelToJson: React.FC = ({ initialValue, onSave, useDefaultConfig = false }) => { const [viewMode, setViewMode] = useState('table'); const [templateName, setTemplateName] = useState(initialValue?.templateName || ''); const [templateKey, setTemplateKey] = useState(initialValue?.templateKey || ''); const { jsonData, allFieldsData, parseExcelFile, generateExportData, getFieldsBySheet } = useExcelParser(); const { config, addNewSheet, removeSheet, updateSheetConfig, setActiveSheet } = useSheetConfig( initialValue?.templateConfig || (useDefaultConfig ? defaultConfig : { sheets: [], activeSheetIndex: 0 }), useDefaultConfig ); // 使用 useMemo 缓存 getFieldsBySheet 的结果,只在 allFieldsData 变化时重新计算 const fieldsBySheet = useMemo(() => { if (Object.keys(allFieldsData).length === 0) return {}; return getFieldsBySheet(allFieldsData); }, [allFieldsData]); // 添加对 initialValue 的处理 useEffect(() => { if (initialValue?.templateConfig) { // 如果有初始值,可以在这里处理 console.log('加载已有模板配置', initialValue.templateConfig); } }, [initialValue]); // 当配置或原始数据变化时,重新生成导出数据 useEffect(() => { // 只有当原始数据存在时才处理 if (Object.keys(allFieldsData).length > 0) { generateExportData(config.sheets); } }, [fieldsBySheet, config.sheets]); // 处理字段初始化 const initializeFields = (fieldsBySheet: { [key: string]: string[] }) => { const activeSheet = config.sheets[config.activeSheetIndex]; if (!activeSheet) return; // 获取当前工作表的字段 const sheetName = activeSheet.sheetName; const fields = fieldsBySheet[sheetName] || []; // 只有当exportFields为空或者长度很少时才自动添加全部字段 if (activeSheet.exportFields.length === 0 || (activeSheet.exportFields.length < 3 && fields.length > 0)) { // 创建新的字段映射,key和value保持一致 const newFieldMappings = { ...activeSheet.fieldMappings }; // 添加缺失的字段映射 fields.forEach(field => { if (!newFieldMappings[field]) { newFieldMappings[field] = field; } }); // 更新工作表配置 updateSheetConfig(config.activeSheetIndex, { exportFields: fields, fieldMappings: newFieldMappings }); console.log('自动更新字段配置', fields); } }; const downloadJson = () => { if (!jsonData || Object.keys(jsonData).length === 0) return; const dataStr = JSON.stringify(jsonData, null, 2); const blob = new Blob([dataStr], { type: 'application/json' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = '导出数据.json'; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); }; // 添加保存模板功能 const saveTemplate = () => { if (!onSave) return; const templateData: Partial