"""서피스가 바뀐 뒤 전처리 체인 다시(763-3 · 요구 605) — 업로드와 같은 길 하나. 부르는 곳 = B04 다른 서피스 [확정] · B05 LAS 나중 올리기 뒤 전처리 다시(765-5). B05~B09 초기화 = 같은 지형 재업로드 길(`purge_project_outputs(keep_preprocess=True)` · 설계 벌 묶음까지 · 단계 2 이후 처음 · 초기값 스냅샷 버림) → `run_preprocess_chain`(지형마다 한 벌 · 끝에 추천 미리 셈 · 실패 길에도). 전처리 결과(B04) · 확정은 그대로. """ import asyncio import logging from pathlib import Path from uuid import UUID logger = logging.getLogger(__name__) async def run_surface_change_chain(project_id: UUID, surface_model_id: int | None) -> None: """B05~B09 를 지우고 자동 설계 체인을 새 확정 서피스로 다시 탐 — 실패는 로그만.""" from B03_FileInput.B03_FileInput_Repository import get_project_storage_relative_path from B03_FileInput.B03_FileInput_Service_Chain import run_preprocess_chain from B05_Profile.B05_Profile_Router_RouteInitial import schedule_precompute from common_util.common_util_initial_snapshot import discard_initial_snapshot from common_util.common_util_project_reset import purge_project_outputs from common_util.common_util_storage import resolve_stored_project_path from common_util.common_util_workflow_state import reset_stages_after_input_change from config.config_db import get_db_pool try: async with get_db_pool().acquire() as connection: stored_path = await get_project_storage_relative_path(connection, project_id) if not stored_path: return root = Path(resolve_stored_project_path(stored_path)) await asyncio.to_thread(discard_initial_snapshot, root) await connection.begin() try: await purge_project_outputs(connection, str(project_id), root, keep_preprocess=True) async with connection.cursor() as cursor: await reset_stages_after_input_change(cursor, str(project_id), 2) await connection.commit() except Exception: await connection.rollback() raise except Exception: # noqa: BLE001 — 체인은 응답 뒤 · 추천은 새 서피스로 셈 logger.exception("서피스 바꿈 체인 — B05~B09 초기화 실패: project_id=%s", project_id) schedule_precompute(project_id) return logger.info("서피스 바꿈 체인 — B05~B09 초기화 뒤 자동 설계: project_id=%s", project_id) await run_preprocess_chain(project_id, surface_model_id)