From 061265f6057301c758ad62d69f7a9e0a5a624b77 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Thu, 3 Sep 2026 21:01:56 +0900 Subject: [PATCH] =?UTF-8?q?fix(B06):=20=EC=95=94=20=EA=B2=BD=EA=B3=84=20?= =?UTF-8?q?=EC=84=B8=EC=85=98=20=EC=98=A4=ED=94=84=EC=85=8B=EC=9D=84=20?= =?UTF-8?q?=EC=9E=90=EB=A6=BF=EC=88=98=20=EB=95=8C=EB=AC=B8=EC=97=90=20?= =?UTF-8?q?=ED=86=B5=EC=A7=B8=EB=A1=9C=20=EB=86=93=EC=B9=98=EB=8D=98=20?= =?UTF-8?q?=EA=B2=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 세션에 저장하는 쪽(`createRockBoundaryStore`)은 키를 `toFixed(2)` 로 쓰는데 브라우저 재계산은 `toFixed(3)` 문자열로 찾아 **한 건도 못 읽었음**. 서버 경로는 키를 숫자로 바꿔 비교해 문제가 없었으므로 로컬 계산으로 옮기며 생긴 어긋남임. 키를 숫자로 되돌려 0.01m 단위로 맞춤. B06 에서 암 경계선을 올리내린 값이 이제 B05 유토곡선·횡단 면적에도 그대로 반영됨. 화면 검증(5173→5174, 같은 시점): B05 첫 진입 절토 4,774.1㎥ / 성토 16,690.7㎥, B06 도 같은 값(재계산 입력·결과 로그로 대조 — 측점 65, 샘플 65, 자연방토 25건까지 동일). B06 을 거치기 전과 후의 값 차이(성토 16,715.5 → 16,690.7)도 사라져 **첫 진입부터 일치**함. 진단용 임시 로그는 제거함. 전체 테스트 183건 통과, `tsc --noEmit` 통과. Co-Authored-By: Claude Opus 5 (1M context) --- B06_Section/B06_Section_Cross_Refresh.ts | 28 ++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/B06_Section/B06_Section_Cross_Refresh.ts b/B06_Section/B06_Section_Cross_Refresh.ts index 28dee239..8f91e139 100644 --- a/B06_Section/B06_Section_Cross_Refresh.ts +++ b/B06_Section/B06_Section_Cross_Refresh.ts @@ -99,6 +99,30 @@ export async function refreshCrossDesigns(input: CrossRefreshInput): Promise { + const raw = readRockBoundarySession(projectId, routeId) ?? {}; + const offsets = new Map(); + for (const [key, value] of Object.entries(raw)) { + const chainage = Number(key); + if (Number.isFinite(chainage) && typeof value === "number" && Number.isFinite(value)) { + offsets.set(rockKey(chainage), value); + } + } + return offsets; +} + /** * 브라우저 안에서 전 측점을 다시 계산한다(정상 경로). * @@ -127,7 +151,7 @@ function refreshLocally(input: CrossRefreshInput): number[] | null { toDesignProfile(alignment, detail.longitudinal.design_profiles?.[0]), ]; - const rockOffsets = readRockBoundarySession(projectId, input.routeId) ?? {}; + const rockOffsets = readRockOffsets(projectId, input.routeId); const rockDefault = readRockBoundaryDefault(projectId); const updated: number[] = []; @@ -137,7 +161,7 @@ function refreshLocally(input: CrossRefreshInput): number[] | null { const design = previous as unknown as Record; // 암 경계는 세션 조정값 → 저장분 → config 기본값 순 — 서버 // `recompute_designs_for_alignment` 의 우선순위와 같다. - const sessionOffset = rockOffsets[section.chainage_m.toFixed(3)]; + const sessionOffset = rockOffsets.get(rockKey(section.chainage_m)); const storedOffset = design.rock_boundary_offset_m; const rockBoundaryOffsetM = typeof sessionOffset === "number"