From c93280840975503d2ce3fb33fa4681d4dbd94f58 Mon Sep 17 00:00:00 2001 From: changkyu choi Date: Thu, 20 Feb 2025 16:07:48 +0900 Subject: [PATCH] =?UTF-8?q?=ED=94=8C=EB=9E=9C=20=EB=B3=B5=EC=82=AC=20?= =?UTF-8?q?=EC=8B=9C=20=EB=B0=B0=EC=B9=98=EB=A9=B4=EC=B4=88=EA=B8=B0?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EC=A0=95=EB=B3=B4=20=EB=B3=B5=EC=82=AC(ba?= =?UTF-8?q?sicSettingCopySave)=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/option/useCanvasSetting.js | 62 +++++++++++++++++++ src/hooks/usePlan.js | 93 ++++++++++++++++------------ 2 files changed, 117 insertions(+), 38 deletions(-) diff --git a/src/hooks/option/useCanvasSetting.js b/src/hooks/option/useCanvasSetting.js index 179b2221..a013ba38 100644 --- a/src/hooks/option/useCanvasSetting.js +++ b/src/hooks/option/useCanvasSetting.js @@ -501,6 +501,67 @@ export function useCanvasSetting() { } } + /** + * 기본설정(PlacementShapeSetting) 복사 저장 + */ + const basicSettingCopySave = async (params) => { + try { + const patternData = { + objectNo: correntObjectNo, + planNo: Number(params.planNo), + roofSizeSet: Number(params.roofSizeSet), + roofAngleSet: params.roofAngleSet, + roofMaterialsAddList: params.roofsData.map((item) => ({ + planNo: Number(item.planNo), + roofApply: item.roofApply, + roofSeq: item.roofSeq, + roofMatlCd: item.roofMatlCd, + roofWidth: item.roofWidth, + roofHeight: item.roofHeight, + roofHajebichi: item.roofHajebichi, + roofGap: item.roofGap, + roofLayout: item.roofLayout, + roofPitch: item.roofPitch, + roofAngle: item.roofAngle, + })), + } + + await post({ url: `/api/canvas-management/canvas-basic-settings`, data: patternData }).then((res) => { + swalFire({ text: getMessage(res.returnMessage) }) + }) + + /* CanvasSetting Recoil 설정 - roofSizeSet을 문자열로 변환 */ + setCanvasSetting({ + ...basicSetting, + roofSizeSet: String(params.roofSizeSet), + }) + + /* 배치면초기설정 조회 */ + fetchBasicSettings(Number(params.planNo), null) + + /* 메뉴 설정 */ + if (['2', '3'].includes(params?.roofSizeSet)) { + setMenuNumber(3) + setType('surface') + setCurrentMenu(MENU.BATCH_CANVAS.BATCH_DRAWING) + } else { + setMenuNumber(2) + setType('outline') + setCurrentMenu(MENU.ROOF_COVERING.EXTERIOR_WALL_LINE) + } + + /* 모듈 선택 데이터 초기화 */ + resetModuleSelectionData() + moduleSelectedDataTrigger({ common: {}, module: {}, roofConstructions: [] }) + const isModuleExist = canvas.getObjects().some((obj) => obj.name === POLYGON_TYPE.MODULE) + if (!isModuleExist) { + resetSelectedModules() + } + } catch (error) { + swalFire({ text: error.message, icon: 'error' }) + } + } + /** * CanvasSetting 조회 및 초기화 */ @@ -915,6 +976,7 @@ export function useCanvasSetting() { setAdsorptionRange, fetchSettings, fetchBasicSettings, + basicSettingCopySave, frontSettings, globalFont, setGlobalFont, diff --git a/src/hooks/usePlan.js b/src/hooks/usePlan.js index 01579ca7..10bc7e45 100644 --- a/src/hooks/usePlan.js +++ b/src/hooks/usePlan.js @@ -5,7 +5,7 @@ import { usePathname, useRouter } from 'next/navigation' import { useRecoilState, useResetRecoilState } from 'recoil' -import { canvasState, currentCanvasPlanState, plansState } from '@/store/canvasAtom' +import { canvasState, currentCanvasPlanState, plansState, canvasSettingState } from '@/store/canvasAtom' import { useAxios } from '@/hooks/useAxios' import { useMessage } from '@/hooks/useMessage' import { useSwal } from '@/hooks/useSwal' @@ -39,7 +39,8 @@ export function usePlan(params = {}) { const resetOuterLinePoints = useResetRecoilState(outerLinePointsState) const resetPlacementShapeDrawingPoints = useResetRecoilState(placementShapeDrawingPointsState) - const { fetchBasicSettings } = useCanvasSetting() + const { fetchBasicSettings, basicSettingCopySave } = useCanvasSetting() + const [canvasSetting, setCanvasSetting] = useRecoilState(canvasSettingState) /** * 마우스 포인터의 가이드라인 제거 @@ -184,41 +185,55 @@ export function usePlan(params = {}) { objectNo: objectNo, copyFlg: '0', } - await promisePost({ url: '/api/object/add-plan', data: planData }) - .then((res) => { - let newPlan = { - id: res.data.canvasId, - objectNo: objectNo, - planNo: res.data.planNo, - userId: userId, - canvasStatus: '', - isCurrent: true, - bgImageName: null, - mapPositionAddress: null, - } + try { + const res = await promisePost({ url: '/api/object/add-plan', data: planData }) + let newPlan = { + id: res.data.canvasId, + objectNo: objectNo, + planNo: res.data.planNo, + userId: userId, + canvasStatus: '', + isCurrent: true, + bgImageName: null, + mapPositionAddress: null, + } - if (isInitPlan) { - /* 초기 플랜 생성인 경우 플랜 목록 초기화 */ - setCurrentCanvasPlan(newPlan) - setPlans([newPlan]) - } else { - if (isCopy) { - /* 복제 플랜 생성인 경우 현재 캔버스 데이터를 복제 */ - newPlan.canvasStatus = currentCanvasData() - newPlan.bgImageName = currentCanvasPlan?.bgImageName ?? null - newPlan.mapPositionAddress = currentCanvasPlan?.mapPositionAddress ?? null - } - setCurrentCanvasPlan(newPlan) - setPlans((plans) => [...plans.map((plan) => ({ ...plan, isCurrent: false })), newPlan]) - swalFire({ text: getMessage('plan.message.save') }) - } + if (isInitPlan) { + /* 초기 플랜 생성인 경우 플랜 목록 초기화 */ + setCurrentCanvasPlan(newPlan) + setPlans([newPlan]) /* 플랜 추가 시 배치면초기설정 정보 조회 */ fetchBasicSettings(newPlan.planNo, null) - }) - .catch((error) => { - swalFire({ text: error.response.data.message, icon: 'error' }) - }) + } else { + if (isCopy) { + /* 복제 플랜 생성인 경우 현재 캔버스 데이터를 복제 */ + newPlan.canvasStatus = currentCanvasData() + newPlan.bgImageName = currentCanvasPlan?.bgImageName ?? null + newPlan.mapPositionAddress = currentCanvasPlan?.mapPositionAddress ?? null + + /* 복제 시 배치면 초기설정 복사 */ + basicSettingCopySave({ + ...canvasSetting, + planNo: newPlan.planNo, + selectedRoofMaterial: { + ...canvasSetting.selectedRoofMaterial, + planNo: newPlan.planNo, + }, + roofsData: canvasSetting.roofsData.map((roof) => ({ + ...roof, + planNo: newPlan.planNo, + })), + }) + } + setCurrentCanvasPlan(newPlan) + setPlans((plans) => [...plans.map((plan) => ({ ...plan, isCurrent: false })), newPlan]) + + swalFire({ text: getMessage('plan.message.save') }) + } + } catch (error) { + swalFire({ text: error.response.data.message, icon: 'error' }) + } } /** @@ -275,7 +290,6 @@ export function usePlan(params = {}) { const objectNo = floorPlanState.objectNo //견적서 or 발전시뮬 - if (pathname !== '/floor-plan') { await promiseGet({ url: `/api/estimate/${objectNo}/${planNo}/detail` }) .then((res) => { @@ -304,9 +318,6 @@ export function usePlan(params = {}) { // 클릭한 플랜 탭으로 이동 setCurrentCanvasPlan(plans.find((plan) => plan.id === newCurrentId)) setPlans((plans) => plans.map((plan) => ({ ...plan, isCurrent: plan.id === newCurrentId }))) - - /* 플랜 이동 시 배치면초기설정 정보 조회 (견적서 메뉴 제외) */ - fetchBasicSettings(planNo, null) } else { swalFire({ text: getMessage('estimate.menu.move.valid1') }) } @@ -494,7 +505,13 @@ export function usePlan(params = {}) { * @param {string} planNo - 플랜번호 */ const deleteBasicSettings = async (objectNo, planNo) => { - await promiseDel({ url: `/api/canvas-management/canvas-basic-settings/delete-basic-settings/${objectNo}/${planNo}` }) + try { + await promiseDel({ url: `/api/canvas-management/canvas-basic-settings/delete-basic-settings/${objectNo}/${planNo}` }) + } catch (error) { + /* 오류를 무시하고 계속 진행 */ + console.log('Basic settings delete failed or not found:', error) + // swalFire({ text: error.message, icon: 'error' }) + } } return {