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) {