From 0217393cb80b201d27fcd020c4f58850c83a350a Mon Sep 17 00:00:00 2001 From: dohyeons Date: Mon, 20 Oct 2025 10:12:23 +0900 Subject: [PATCH] =?UTF-8?q?=EC=A0=80=EC=9E=A5=20=EC=8B=9C=20=EC=9C=84?= =?UTF-8?q?=EC=B9=98=EA=B0=80=20=EB=B0=94=EB=80=8C=EB=8A=94=20=EB=AC=B8?= =?UTF-8?q?=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/services/YardLayoutService.ts | 34 +++++++++++-------- .../dashboard/widgets/yard-3d/YardEditor.tsx | 27 +++++++++++++-- 2 files changed, 44 insertions(+), 17 deletions(-) diff --git a/backend-node/src/services/YardLayoutService.ts b/backend-node/src/services/YardLayoutService.ts index 7a814333..64572739 100644 --- a/backend-node/src/services/YardLayoutService.ts +++ b/backend-node/src/services/YardLayoutService.ts @@ -202,21 +202,25 @@ export class YardLayoutService { const pool = getPool(); const result = await pool.query(query, [ - data.material_code, - data.material_name, - data.quantity, - data.unit, - data.position_x, - data.position_y, - data.position_z, - data.size_x, - data.size_y, - data.size_z, - data.color, - data.data_source_type, - data.data_source_config ? JSON.stringify(data.data_source_config) : null, - data.data_binding ? JSON.stringify(data.data_binding) : null, - data.memo, + data.material_code !== undefined ? data.material_code : null, + data.material_name !== undefined ? data.material_name : null, + data.quantity !== undefined ? data.quantity : null, + data.unit !== undefined ? data.unit : null, + data.position_x !== undefined ? data.position_x : null, + data.position_y !== undefined ? data.position_y : null, + data.position_z !== undefined ? data.position_z : null, + data.size_x !== undefined ? data.size_x : null, + data.size_y !== undefined ? data.size_y : null, + data.size_z !== undefined ? data.size_z : null, + data.color !== undefined ? data.color : null, + data.data_source_type !== undefined ? data.data_source_type : null, + data.data_source_config !== undefined + ? JSON.stringify(data.data_source_config) + : null, + data.data_binding !== undefined + ? JSON.stringify(data.data_binding) + : null, + data.memo !== undefined ? data.memo : null, placementId, ]); diff --git a/frontend/components/admin/dashboard/widgets/yard-3d/YardEditor.tsx b/frontend/components/admin/dashboard/widgets/yard-3d/YardEditor.tsx index 2b52d113..2841c17d 100644 --- a/frontend/components/admin/dashboard/widgets/yard-3d/YardEditor.tsx +++ b/frontend/components/admin/dashboard/widgets/yard-3d/YardEditor.tsx @@ -174,8 +174,31 @@ export default function YardEditor({ layout, onBack }: YardEditorProps) { const response = await yardLayoutApi.updatePlacement(selectedPlacement.id, updatedData); if (response.success) { const updated = response.data as YardPlacement; - setPlacements((prev) => prev.map((p) => (p.id === updated.id ? updated : p))); - setSelectedPlacement(updated); + + // 현재 위치 정보를 유지하면서 업데이트 + setPlacements((prev) => + prev.map((p) => { + if (p.id === updated.id) { + // 현재 프론트엔드 상태의 위치를 유지 + return { + ...updated, + position_x: p.position_x, + position_y: p.position_y, + position_z: p.position_z, + }; + } + return p; + }), + ); + + // 선택된 요소도 동일하게 업데이트 + setSelectedPlacement({ + ...updated, + position_x: selectedPlacement.position_x, + position_y: selectedPlacement.position_y, + position_z: selectedPlacement.position_z, + }); + setShowConfigPanel(false); } } catch (error) {