feat(B03,B04,B05): 초기 설계가 도는 동안 B05·B06 진입을 막는다
파일을 올리면 지표면 확정 직후 "노선 설계로 이동하세요"를 적고 그 뒤에 초기 설계 체인이 돈다. 그 사이 B05에 들어가 만지면 반쯤 계산된 값을 편집하게 되고, 그 편집이 섞인 채 초기값 스냅샷이 찍힌다. 계산이 끝날 때까지 준비 화면(B11)에서 기다리게 한다. - initial_snapshot: 마커(initial_design.lock) 생성·해제·조회와 스냅샷 무효화, 편집 정본 제거를 한곳에 둔다. 마커는 스냅샷 4트리 밖(프로젝트 루트)이라 복원에 딸려 들어가지 않는다. - 체인 두 곳(자동·재설계): 시작에 마커, finally에서 해제. 재설계 체인은 끝에 스냅샷을 무효화한다 — 사용자 입력을 유지한 채 재계산하므로 그 결과를 찍으면 가짜 초기값이 된다. 다음 [초기화]가 폴백을 타며 새 초기값을 만들고 그때 촬영한다. - /surface/status: 마커가 있으면 in_progress + initial_design으로 답한다. stage 1이 COMPLETE면 진행률 파일을 무시하는 기존 분기를 건드리지 않으려고 별도 확인이다. - 진입 게이트(routeAfterPreloadCheck)와 B11이 그 상태를 보고 기다린다. 상태 조회가 실패하면 막지 않고, B11 대기는 20분 상한을 둔다. - [초기화] 폴백: 체인 전에 structures.json과 drainage/edits를 지운다. 남기면 구조물 측점이 사용자 편집분에서 다시 파생돼 초기값이 오염된다(2026-08-29 실측). 테스트 4건 추가. 249 passed·8 failed(기슭막이 이관 때 생긴 기존 실패, 변경 전 동일).
This commit is contained in:
@@ -5,7 +5,10 @@ import {
|
||||
type RoutePath,
|
||||
} from "@config/config_frontend";
|
||||
import type { WorkflowStage } from "@ui/ui_template_workflow_layout";
|
||||
import { fetchConfirmedSurface } from "../B04_PreProcess/B04_PreProcess_Api_Fetch";
|
||||
import {
|
||||
fetchConfirmedSurface,
|
||||
fetchSurfaceStatus,
|
||||
} from "../B04_PreProcess/B04_PreProcess_Api_Fetch";
|
||||
import { isProjectPreloaded, setPreloadTarget } from "./b_asset_cache";
|
||||
import { navigateTo } from "./router";
|
||||
|
||||
@@ -63,6 +66,18 @@ export function goToWorkflowStage(projectId: string, route: RoutePath): void {
|
||||
* 확인에 실패하면 준비 화면으로 보내 거기서 사유를 안내한다.
|
||||
*/
|
||||
async function routeAfterPreloadCheck(projectId: string, route: RoutePath): Promise<void> {
|
||||
// 초기 설계 계산이 끝나기 전에는 담아 둔 자료가 있어도 들여보내지 않는다 — 반쯤 계산된
|
||||
// 화면을 만지면 그 편집이 섞인 채 초기값이 찍힌다(2026-08-29 사용자 확정). 준비 화면이
|
||||
// 끝날 때까지 기다렸다가 목표 화면으로 넘긴다.
|
||||
try {
|
||||
if ((await fetchSurfaceStatus(projectId)).current_stage === "initial_design") {
|
||||
setPreloadTarget(route);
|
||||
navigateTo(ROUTES.B11_LOADING);
|
||||
return;
|
||||
}
|
||||
} catch {
|
||||
/* 상태 조회 실패는 막지 않는다 — 종전 판정(확정 지표면 서명)으로 이어간다. */
|
||||
}
|
||||
let signature: string | null = null;
|
||||
try {
|
||||
signature = (await fetchConfirmedSurface(projectId)).signature;
|
||||
|
||||
Reference in New Issue
Block a user