From 65c85358250cd889e8bda485d4d8875a8d71465e Mon Sep 17 00:00:00 2001 From: ysCha Date: Fri, 3 Jul 2026 16:19:41 +0900 Subject: [PATCH 1/2] =?UTF-8?q?[2316]=20=EB=B0=A9=EC=9C=84=20=ED=91=9C?= =?UTF-8?q?=EC=8B=9C=20124~134=C2=B0=EB=A5=BC=20=E8=A5=BF=E5=8C=97?= =?UTF-8?q?=E8=A5=BF/=E6=9D=B1=E5=8C=97=E6=9D=B1(=EC=84=9C=EB=B6=81?= =?UTF-8?q?=EC=84=9C/=EB=8F=99=EB=B6=81=EB=8F=99)=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20=E2=80=94=20=ED=91=9C=EC=8B=9C=20=EA=B2=BD=EA=B3=84?= =?UTF-8?q?=EB=A5=BC=20=EB=B6=81=EB=A9=B4=20=ED=8C=90=EC=A0=95=20=C2=B1135?= =?UTF-8?q?=C2=B0=EC=99=80=20=EC=9D=BC=EC=B9=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4 --- src/hooks/usePolygon.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/hooks/usePolygon.js b/src/hooks/usePolygon.js index 98596529..73999863 100644 --- a/src/hooks/usePolygon.js +++ b/src/hooks/usePolygon.js @@ -416,6 +416,9 @@ export const usePolygon = () => { while (a > 180) a -= 360 while (a < -180) a += 360 const i = Math.round(a / 22.5) // -8 ~ 8 + // [方位 追加要請 2026-07-03] 124~134°는 西北西/東北東 표시(北西/北東 시작을 135°로) — 북면 판정 ±135°와 표시 경계 일치 + if (i === 6 && a <= 134) return positive[5] // 北西 → 西北西 + if (i === -6 && a >= -134) return negative[5] // 北東 → 東北東 return i >= 0 ? positive[i] : negative[-i] } -- 2.47.2 From 661da5ec8d8717e5800dcb82cc3b386e2a555572 Mon Sep 17 00:00:00 2001 From: ysCha Date: Fri, 3 Jul 2026 17:04:32 +0900 Subject: [PATCH 2/2] =?UTF-8?q?[2311]=20=EA=B2=AC=EC=A0=81=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5=20=ED=9B=84=20CONN=5FVOL=5FW(=EC=A0=91=EC=86=8D?= =?UTF-8?q?=EC=9A=A9=EB=9F=89)=20=EB=B0=B1=ED=95=84=20=E2=80=94=20backfill?= =?UTF-8?q?ConnVol=20=ED=97=AC=ED=8D=BC=20=EC=B6=94=EC=B6=9C,=20update-con?= =?UTF-8?q?n-vol=20=E2=86=92=20detail=20=EC=9E=AC=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EC=88=9C=EC=84=9C=20=EA=B3=A0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../estimate/useEstimateController.js | 38 ++++++++++++++++++- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index 3f7120d8..264b9732 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -10,6 +10,8 @@ import { useRouter, useSearchParams } from 'next/navigation' import { FloorPlanContext } from '@/app/floor-plan/FloorPlanProvider' import { QcastContext } from '@/app/QcastProvider' import { useSwal } from '@/hooks/useSwal' +import { POLYGON_TYPE } from '@/common/common' +import { logger } from '@/util/logger' // Constants const ESTIMATE_API_ENDPOINT = '/api/estimate' // API 엔드포인트 정의 @@ -33,7 +35,7 @@ export const useEstimateController = (planNo, flag) => { const { getMessage } = useMessage() - const { promiseGet, post, promisePost } = useAxios(globalLocaleState) + const { promiseGet, post, promisePost, get } = useAxios(globalLocaleState) const [isLoading, setIsLoading] = useState(false) const { estimateContextState, setEstimateContextState } = useContext(FloorPlanContext) @@ -386,6 +388,36 @@ export const useEstimateController = (planNo, flag) => { } } + // 견적 상세 저장 후 저장된 plan JSON 에서 회로 payload 를 만들어 CONN_VOL_W(접속용량) 백필을 요청한다. + const backfillConnVol = async (objectNo, planNo) => { + try { + const list = await get({ url: `/api/canvas-management/canvas-statuses/by-object/${objectNo}` }) + const target = (list || []).find((it) => String(it.planNo) === String(planNo)) || (list || [])[0] + const raw = target?.canvasStatus?.replace(/##/g, '"').replace(/∠/g, '∠').replace(/°/g, '°') + const objects = raw ? JSON.parse(raw).objects || [] : [] + + const moduleObjs = objects.filter((o) => o.name === POLYGON_TYPE.MODULE) + const moduleList = moduleObjs.map((m) => ({ circuit: m.circuitNumber, specification: m.moduleInfo?.wpOut })) + if (moduleList.length === 0) return + + // PCS 유닛 번호 = circuit 첫 숫자. distinct 개수 = 유닛 수, 오름차순 = 유닛 index + const unitNumbers = [...new Set(moduleObjs.map((m) => parseInt(String(m.circuitNumber ?? '').match(/\d+/)?.[0], 10)).filter((n) => n > 0))].sort( + (a, b) => a - b + ) + // PCS 데이터는 surfaces[0] 에만 실려 있다. + const surface0 = objects.find((o) => o.name === POLYGON_TYPE.MODULE_SETUP_SURFACE) + const pcsList = (surface0?.pcses || []).filter((pcs) => pcs?.pcsItemId) + const circuitItemList = unitNumbers.map((unit) => ({ itemId: pcsList[unit - 1]?.pcsItemId })) + + await promisePost({ + url: `${ESTIMATE_API_ENDPOINT}/update-conn-vol`, + data: { objectNo, planNo, circuitItemList, roofSurfaceList: [{ moduleList }] }, + }) + } catch (e) { + logger.log('[UPDATE-CONN-VOL] 백필 호출 실패', e?.message) + } + } + const realSave = async (fileList) => { setEstimateContextState({pricingFlag: false}) @@ -451,9 +483,11 @@ export const useEstimateController = (planNo, flag) => { //2. 상세데이터 저장 try { setIsGlobalLoading(true) - await promisePost({ url: `${ESTIMATE_API_ENDPOINT}/save-estimate`, data: estimateData }).then((res) => { + await promisePost({ url: `${ESTIMATE_API_ENDPOINT}/save-estimate`, data: estimateData }).then(async (res) => { if (res.status === 201) { estimateData.newFileList = [] + // 인증용량이 CONN_VOL_W 로 계산되므로, /detail 재조회(fetchSetting) 전에 백필을 먼저 끝낸다. + await backfillConnVol(estimateData.objectNo, estimateData.planNo) swalFire({ text: getMessage('estimate.detail.save.alertMsg'), type: 'alert' }) fetchSetting(estimateData.objectNo, estimateData.planNo) } -- 2.47.2