From bb775b2847a7727cbe85f0df8adf6a669c957e12 Mon Sep 17 00:00:00 2001 From: ysCha Date: Tue, 31 Mar 2026 16:27:26 +0900 Subject: [PATCH 1/2] =?UTF-8?q?errSave=20api=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/common/useMasterController.js | 5 +++++ src/hooks/module/useTrestle.js | 13 +++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/hooks/common/useMasterController.js b/src/hooks/common/useMasterController.js index 8eb302d1..36f5bd61 100644 --- a/src/hooks/common/useMasterController.js +++ b/src/hooks/common/useMasterController.js @@ -359,6 +359,10 @@ export function useMasterController() { }) } + const quotationErrSave = async (params) => { + return await post({ url: '/api/v1/master/quotationErrSave', data: params }) + } + return { getRoofMaterialList, getModuleTypeItemList, @@ -374,5 +378,6 @@ export function useMasterController() { updateObjectDate, getQuotationItem, getPcsConnOptionItemList, + quotationErrSave, } } diff --git a/src/hooks/module/useTrestle.js b/src/hooks/module/useTrestle.js index 173a5cd2..19da5b4e 100644 --- a/src/hooks/module/useTrestle.js +++ b/src/hooks/module/useTrestle.js @@ -1,5 +1,5 @@ import { useRecoilValue } from 'recoil' -import { canvasState, currentAngleTypeSelector } from '@/store/canvasAtom' +import { canvasState, currentAngleTypeSelector, currentCanvasPlanState } from '@/store/canvasAtom' import { POLYGON_TYPE, TRESTLE_MATERIAL } from '@/common/common' import { moduleSelectionDataState } from '@/store/selectedModuleOptions' import { getDegreeByChon } from '@/util/canvas-util' @@ -11,6 +11,7 @@ import { useContext } from 'react' import { QcastContext } from '@/app/QcastProvider' import { useCircuitTrestle } from '@/hooks/useCirCuitTrestle' import { useMessage } from '@/hooks/useMessage' +import { loginUserStore } from '@/store/commonAtom' // 모듈간 같은 행, 열의 마진이 10 이하인 경우는 같은 행, 열로 간주 const MODULE_MARGIN = 10 @@ -18,7 +19,9 @@ const MODULE_MARGIN = 10 export const useTrestle = () => { const canvas = useRecoilValue(canvasState) const moduleSelectionData = useRecoilValue(moduleSelectionDataState) //다음으로 넘어가는 최종 데이터 - const { getQuotationItem } = useMasterController() + const { getQuotationItem, quotationErrSave } = useMasterController() + const currentCanvasPlan = useRecoilValue(currentCanvasPlanState) + const loginUserState = useRecoilValue(loginUserStore) const currentAngleType = useRecoilValue(currentAngleTypeSelector) const roofSizeSet = useRecoilValue(basicSettingState).roofSizeSet const isTrestleDisplay = useRecoilValue(trestleDisplaySelector) @@ -757,6 +760,12 @@ export const useTrestle = () => { text: result.resultMsg || getMessage('common.message.noData'), icon: 'error' }) + quotationErrSave({ + objectNo: currentCanvasPlan.objectNo, + planNo: currentCanvasPlan.planNo, + rejectRsn: result.resultMsg, + regId: loginUserState.userId, + }) clear() setViewCircuitNumberTexts(true) setIsGlobalLoading(false) From 984401881d17f65504daeb5a7abbcf53b79053e8 Mon Sep 17 00:00:00 2001 From: ysCha Date: Tue, 31 Mar 2026 16:34:54 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=ED=99=95=EB=8C=80=EC=B6=95=EC=86=8C100%?= =?UTF-8?q?=EA=B0=80=EC=9A=B4=EB=8D=B0=EC=A0=95=EB=A0=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/useCanvasEvent.js | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/hooks/useCanvasEvent.js b/src/hooks/useCanvasEvent.js index 0c566020..0a1de7c4 100644 --- a/src/hooks/useCanvasEvent.js +++ b/src/hooks/useCanvasEvent.js @@ -489,6 +489,34 @@ export function useCanvasEvent() { viewportTransform[5] += deltaY canvas.setViewportTransform(viewportTransform) + + // 브라우저 스크롤을 중앙으로 조정하여 전체 canvas를 모니터 중앙에 위치 + const canvasElement = canvas.getElement() + const canvasRect = canvasElement.getBoundingClientRect() + + // 현재 스크롤 위치 + const currentScrollTop = window.pageYOffset || document.documentElement.scrollTop + const currentScrollLeft = window.pageXOffset || document.documentElement.scrollLeft + + // canvas의 현재 화면 위치 + const canvasScreenTop = canvasRect.top + currentScrollTop + const canvasScreenLeft = canvasRect.left + currentScrollLeft + + // 모니터 중앙 + const monitorCenterX = window.innerWidth / 2 + const monitorCenterY = window.innerHeight / 2 + + // canvas가 모니터 중앙에 오도록 스크롤 위치 계산 + const targetScrollLeft = canvasScreenLeft + (canvasRect.width / 2) - monitorCenterX + const targetScrollTop = canvasScreenTop + (canvasRect.height / 2) - monitorCenterY + menuHeightOffset + + // 스크롤을 중앙으로 이동 + window.scrollTo({ + top: targetScrollTop, + left: targetScrollLeft, + behavior: 'smooth' // 부드러운 스크롤 + }) + canvas.renderAll() }