From d28341cd24330742dec73966c63b95edba707bba Mon Sep 17 00:00:00 2001 From: lijin Date: Mon, 15 Sep 2025 14:59:34 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=97=A0=E6=B3=95=E5=88=87=E6=8D=A2?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E7=9A=84bug=E4=BF=AE=E5=A4=8D=EF=BC=8C?= =?UTF-8?q?=E6=9D=90=E6=96=99=E4=B8=80=E6=A0=8F=E9=87=8D=E5=8F=A0bug?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.js | 2 +- components/DataEditor.js | 86 ++++++++++++++++++++++++++----------- components/DrawingViewer.js | 43 ++++++++++++------- 3 files changed, 91 insertions(+), 40 deletions(-) diff --git a/app.js b/app.js index e444766..2b926f0 100644 --- a/app.js +++ b/app.js @@ -221,7 +221,7 @@ function App() { if (currentDrawingId !== targetDrawingId) { setCurrentDrawingId(targetDrawingId); } - }, [selectedItemId, currentDrawingId]); + }, [selectedItemId]); const handleItemRename = (oldId, newId) => { if (oldId === '__ROOT__') { diff --git a/components/DataEditor.js b/components/DataEditor.js index 4dedb08..093391e 100644 --- a/components/DataEditor.js +++ b/components/DataEditor.js @@ -6,30 +6,6 @@ function DataEditor({ item, items, setItems }) { ); } - const isRoot = item.id === '__ROOT__'; - - if (isRoot) { - return React.createElement('div', { className: 'workspace-panel p-4 h-full' }, - React.createElement('h2', { className: 'text-lg font-semibold mb-4' }, '编辑总装图'), - React.createElement('div', { className: 'space-y-4' }, - React.createElement('div', {}, - React.createElement('label', { className: 'block text-sm font-medium text-gray-700 mb-1' }, '总装图名称'), - React.createElement('input', { - type: 'text', - name: 'name', - value: item.name, - onChange: (e) => setItems(prev => ({ - ...prev, - ['__ROOT__']: { ...prev['__ROOT__'], name: e.target.value } - })), - className: 'form-input' - }) - ), - React.createElement('p', { className: 'text-xs text-gray-500 mt-1' }, '这是项目的根节点,只可修改名称。') - ) - ); - } - const handleInputChange = (e) => { const { name, value } = e.target; const isNumber = ['quantity', 'weight'].includes(name); @@ -49,6 +25,68 @@ function DataEditor({ item, items, setItems }) { })); }; + const isRoot = item.id === '__ROOT__'; + + if (isRoot) { + return React.createElement('div', { className: 'workspace-panel p-4 h-full' }, + React.createElement('h2', { className: 'text-lg font-semibold mb-1' }, '编辑总装图'), + React.createElement('div', { className: 'space-y-4' }, + React.createElement('div', {}, + React.createElement('label', { className: 'block text-sm font-medium text-gray-700 mb-1' }, '总装图名称'), + React.createElement('input', { + type: 'text', name: 'name', value: item.name || '', onChange: handleInputChange, className: 'form-input' + }) + ), + React.createElement('div', { className: 'grid grid-cols-2 gap-3' }, + React.createElement('div', {}, + React.createElement('label', { className: 'block text-sm font-medium text-gray-700 mb-1' }, '中文名称'), + React.createElement('input', { + type: 'text', name: 'chinese_name', value: item.chinese_name || '', onChange: handleInputChange, className: 'form-input', placeholder: '中文名称' + }) + ), + React.createElement('div', {}, + React.createElement('label', { className: 'block text-sm font-medium text-gray-700 mb-1' }, '英文名称'), + React.createElement('input', { + type: 'text', name: 'english_name', value: item.english_name || '', onChange: handleInputChange, className: 'form-input', placeholder: 'English Name' + }) + ) + ), + React.createElement('div', {}, + React.createElement('label', { className: 'block text-sm font-medium text-gray-700 mb-1' }, '规格描述'), + React.createElement('input', { + type: 'text', name: 'specification', value: item.specification || '', onChange: handleInputChange, className: 'form-input', placeholder: '规格与技术要求' + }) + ), + React.createElement('div', { className: 'grid grid-cols-2 gap-3' }, + React.createElement('div', {}, + React.createElement('label', { className: 'block text-sm font-medium text-gray-700 mb-1' }, '材料'), + React.createElement('input', { + type: 'text', name: 'material', value: item.material || '', onChange: handleInputChange, className: 'form-input', placeholder: '如: Q235' + }) + ), + React.createElement('div', {}, + React.createElement('label', { className: 'block text-sm font-medium text-gray-700 mb-1' }, '比例'), + React.createElement('input', { + type: 'text', name: 'scale', value: item.scale || '1:1', onChange: handleInputChange, className: 'form-input' + }) + ) + ), + React.createElement('div', {}, + React.createElement('label', { className: 'block text-sm font-medium text-gray-700 mb-1' }, '质量 (kg)'), + React.createElement('input', { + type: 'number', name: 'weight', value: item.weight || 0, onChange: handleInputChange, className: 'form-input bg-gray-100', readOnly: true, title: '由子项自动汇总' + }) + ), + React.createElement('div', {}, + React.createElement('label', { className: 'block text-sm font-medium text-gray-700 mb-1' }, '备注'), + React.createElement('textarea', { + name: 'remark', value: item.remark || '', onChange: handleInputChange, className: 'form-input resize-none', rows: 2, placeholder: '其他说明信息' + }) + ) + ) + ); + } + const hasChildren = Array.isArray(item.children) && item.children.length > 0; const isLeafPart = !isRoot && !hasChildren; const isAssemblyPart = !isRoot && hasChildren; diff --git a/components/DrawingViewer.js b/components/DrawingViewer.js index 20df7d4..6989445 100644 --- a/components/DrawingViewer.js +++ b/components/DrawingViewer.js @@ -94,22 +94,35 @@ function GraphicalTable({ template, items, allItems, drawings }) { '装配图号': item.assyDwgNo || (allItems[item.parentId] ? (drawings[allItems[item.parentId]?.drawingId]?.drawingNumber || '') : '') }; const dataItem = cell[normName]; - return colDef.text_definitions.map(textDef => { - let content = ''; - if (normName === '名称' && typeof dataItem === 'object' && dataItem !== null) { - content = dataItem[textDef.data_key] || ''; - } else { - content = dataItem; - } - if (content === null || content === undefined) return null; - return React.createElement(SvgText, { - key: `${item.id}-${normName}-${textDef.data_key || 'main'}`, - content, - x: colDef.relative_x_start + textDef.relative_pos[0], - y: textDef.relative_pos[1], - height: textDef.height, - alignment: textDef.alignment, + const isObject = typeof dataItem === 'object' && dataItem !== null; + + // 名称列:按定义分别渲染中文/英文/规格 + if (normName === '名称' && isObject) { + return colDef.text_definitions.map(textDef => { + const content = dataItem[textDef.data_key] || ''; + if (content === null || content === undefined || content === '') return null; + return React.createElement(SvgText, { + key: `${item.id}-${normName}-${textDef.data_key || 'main'}`, + content, + x: colDef.relative_x_start + textDef.relative_pos[0], + y: textDef.relative_pos[1], + height: textDef.height, + alignment: textDef.alignment, + }); }); + } + + // 非对象数据:仅渲染一个主文本,避免重复(例如材料为字符串) + const primaryDef = colDef.text_definitions.find(td => td.data_key === 'main') || colDef.text_definitions[0]; + const content = dataItem; + if (content === null || content === undefined) return null; + return React.createElement(SvgText, { + key: `${item.id}-${normName}-main` , + content, + x: colDef.relative_x_start + primaryDef.relative_pos[0], + y: primaryDef.relative_pos[1], + height: primaryDef.height, + alignment: primaryDef.alignment, }); }) );