This commit is contained in:
2026-07-10 19:01:33 +09:00
parent e3d66e717c
commit b98affbf99
22 changed files with 1681 additions and 752 deletions
+36 -7
View File
@@ -47,6 +47,12 @@ from B03_FileInput.B03_FileInput_Schema import (
from common_util.common_util_json import atomic_write_json
from common_util.common_util_storage import resolve_stored_project_path
from common_util.common_util_workflow import load_project_workflow
from common_util.common_util_workflow_state import (
complete_stage,
fail_stage,
get_workflow_state,
start_stage,
)
from config.config_db import get_db_pool
from config.config_system import (
SEND_ANALYSIS_COMPLETION_EMAIL,
@@ -155,8 +161,20 @@ async def trigger_wf1_analysis_and_email(
pool = get_db_pool()
project_info: dict[str, Any] | None = None
try:
await _update_project_status(project_id, "WF1_ANALYZING")
source_filters = list(SURFACE_MODEL_SOURCE_FILTERS)
methods = list(SURFACE_MODEL_PRECOMPUTE)
params = {
"input_file_id": str(input_file_id),
"source_filters": source_filters,
"methods": methods,
"force": False,
}
async with pool.acquire() as connection:
async with connection.cursor() as cursor:
await start_stage(cursor, str(project_id), 1, params)
await connection.commit()
stored_path = await get_project_storage_relative_path(connection, project_id)
project_info = await _get_project_notification_info(connection, project_id)
if not project_info or not project_info.get("user_email"):
@@ -176,8 +194,6 @@ async def trigger_wf1_analysis_and_email(
project_id,
input_file_id,
)
source_filters = list(SURFACE_MODEL_SOURCE_FILTERS)
methods = list(SURFACE_MODEL_PRECOMPUTE)
from B04_wf1_Surface.B04_wf1_Surface_Engine import run_surface_analysis
from B04_wf1_Surface.B04_wf1_Surface_Router import save_surface_analysis_to_db
@@ -195,8 +211,6 @@ async def trigger_wf1_analysis_and_email(
logger.info("WF1 분석 결과 DB 저장 시작: project_id=%s", project_id)
async with pool.acquire() as connection:
# save_surface_analysis_to_db는 트랜잭션을 열지 않는다.
# 호출자가 begin/commit/rollback을 한 번만 책임진다.
await connection.begin()
try:
await save_surface_analysis_to_db(
@@ -206,8 +220,9 @@ async def trigger_wf1_analysis_and_email(
analysis_result=analysis_result,
source_filters=source_filters,
)
async with connection.cursor() as cursor:
await complete_stage(cursor, str(project_id), 1)
await connection.commit()
await _update_project_status(project_id, "WF1_COMPLETE")
logger.info("WF1 분석 결과 DB 저장 완료: project_id=%s", project_id)
except Exception as e:
logger.exception("WF1 분석 결과 DB 저장 실패: %s", e)
@@ -237,7 +252,9 @@ async def trigger_wf1_analysis_and_email(
logger.info("WF1 백그라운드 분석 완료: project_id=%s", project_id)
except Exception as exc:
logger.exception("WF1 백그라운드 분석 실패: project_id=%s", project_id)
await _update_project_status(project_id, "WF1_FAILED")
async with pool.acquire() as connection, connection.cursor() as cursor:
await fail_stage(cursor, str(project_id), 1, str(exc))
await connection.commit()
if project_info and project_info.get("user_email"):
await send_analysis_error_email(
project_id=project_id,
@@ -326,6 +343,8 @@ async def upload_project_files(
metadata=metadata,
)
)
async with connection.cursor() as cursor:
await complete_stage(cursor, str(project_id), 0)
await connection.commit()
except Exception:
await connection.rollback()
@@ -547,6 +566,8 @@ async def finalize_project_upload(
metadata=metadata,
)
await mark_upload_session_completed(connection, session_id=payload.session_id)
async with connection.cursor() as cursor:
await complete_stage(cursor, str(project_id), 0)
await connection.commit()
except Exception:
await connection.rollback()
@@ -641,3 +662,11 @@ async def get_project_upload_status(
status_code=500,
content={"status": "error", "message": "업로드 상태 조회 중 오류가 발생했습니다."},
)
@router.get("/{project_id}/workflow-state")
async def get_project_workflow_state(project_id: str):
pool = get_db_pool()
async with pool.acquire() as connection, connection.cursor(aiomysql.DictCursor) as cursor:
state = await get_workflow_state(cursor, project_id)
return {"status": "success", "workflow_state": state}