fix(nav): 지표면이 필요 없는 화면은 준비 화면을 거치지 않도록

파일을 아직 올리지 않은 새 프로젝트에서 대시보드 -> 파일 입력으로 이동하면
준비 화면(B11)이 확정 지표면을 찾다 실패해 "담당자에게 연락" 장애 안내를 띄웠다.
파일 입력 화면은 3D 지표면을 쓰지 않으므로 준비 자체가 필요 없다.

- goToWorkflowStage: 담아 둔 지표면을 실제로 쓰는 B04/B05로 갈 때만 준비 화면 경유,
  나머지(B03/B06~B09)는 바로 이동
- 확정 지표면이 없을 때는 장애가 아니라 순서 문제이므로 전용 표식(PRELOAD_NO_SURFACE)을
  던지고, 준비 화면은 안내 문구 + [파일 입력 화면으로] 버튼을 보여 준다

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-08 13:49:37 +09:00
co-authored by Claude Fable 5
parent 9b4f603405
commit 22ecf3ad73
4 changed files with 50 additions and 1 deletions
+9 -1
View File
@@ -279,6 +279,14 @@ export function readPreloadTarget(): string | null {
/** 준비 화면이 표시할 단계 안내. ratio가 null이면 진행률을 모른다는 뜻이다. */
export type PreloadReporter = (label: string, ratio: number | null) => void;
/**
* 아직 확정된 지표면이 없다는 뜻의 오류 표식.
*
* 고장이 아니라 "분석·확정이 아직 안 끝난 정상 상태"다. 준비 화면이 이 표식을 보고
* 장애 안내 대신 다음에 할 일(파일 입력)을 안내한다.
*/
export const PRELOAD_NO_SURFACE = "PRELOAD_NO_SURFACE";
/** 확정된 지표면의 3D 파일과 그 등고선을 보관함에 채운다(준비 화면에서 호출).
*
* 사용자가 실제로 보는 것은 이 둘이라 이것만 챙긴다 — 포인트클라우드·배수유역은 제외
@@ -293,7 +301,7 @@ export async function preloadSurfaceAssets(
): Promise<string> {
report("확정된 지표면을 확인하는 중…", null);
const confirmed = await fetchConfirmedSurface(projectId);
if (!confirmed.model_id) throw new Error("확정된 지표면 모델이 없습니다.");
if (!confirmed.model_id) throw new Error(PRELOAD_NO_SURFACE);
const smooth = confirmed.smooth ?? false;
const interval = confirmed.contour_interval_m ?? 1.0;
+13
View File
@@ -36,8 +36,21 @@ export async function fetchWorkflowState(projectId: string): Promise<WorkflowSta
return data.workflow_state ?? data;
}
/**
* 담아 둔 지표면 자료를 실제로 쓰는 화면.
*
* 이 화면들만 준비 화면(B11)을 거친다. 파일 입력·수량·상세설계·설계도서는 3D 지표면을
* 쓰지 않으므로, 확정 지표면이 없다고 준비 화면에서 막히면 안 된다 — 파일을 아직 올리지
* 않은 새 프로젝트에서 파일 입력 화면조차 못 들어가던 문제(2026-08-08).
*/
const PRELOAD_REQUIRED_ROUTES: readonly RoutePath[] = [ROUTES.B04_PREPROCESS, ROUTES.B05_PROFILE];
export function goToWorkflowStage(projectId: string, route: RoutePath): void {
localStorage.setItem(CURRENT_PROJECT_ID_KEY, projectId);
if (!PRELOAD_REQUIRED_ROUTES.includes(route)) {
navigateTo(route);
return;
}
void routeAfterPreloadCheck(projectId, route);
}