feat(E): 단계 차례 보고서 맨 뒤 · DB 단계 행 여섯 · 체인 단계 상태 함수 (PLAN 565-1)
- 차례 = 지반 · 2D · 3D · 암반 · 광역 · 보고서 — STAB_STEP_ROUTES · 단계 막대 이름 · 아이콘 · 대시보드 요약 이름 같은 차례 - 단계 행 STABILITY 여섯(STAB_AREA 더함) · 022_stab_stages_six.sql = 옛 행 열쇠로 번호만 바꿈 · 없는 광역 행 NOT_STARTED · 다시 돌려도 같음 - mark_stab_step(project_id, step, state, message) — 체인 낱말(ground · 2d · 3d · rock · area · report × run · done · skip · error · cancel) → 단계 행 상태 · 열쇠로 찾음 · 실패 까닭만 남김 - E05 빈 상태 글 = E02 [해석 시작] · 보고서 안내에 암반 · 확률 - 시험 528 단계 여섯 · 상태 함수 · 280_2 가짜 차례 여섯 + 진짜 차례 끝 = E05 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -20,11 +20,37 @@ STAGE_KEYS = [
|
||||
]
|
||||
|
||||
|
||||
# 종류별 단계(요구 345) — ROAD = B03~B09 · PLAN = D02~D04 · STABILITY = E02~E06.
|
||||
# 종류별 단계(요구 345 · 390) — ROAD = B03~B09 · PLAN = D02~D04 ·
|
||||
# STABILITY = E02 · E03 · E04 · E06 · E07 · E05(보고서 맨 뒤 · 옛 행 = 022 SQL 로 다시 깖).
|
||||
STAGE_KEYS_BY_KIND = {
|
||||
"ROAD": STAGE_KEYS,
|
||||
"PLAN": ["PLAN_BASE", "PLAN_ANALYSIS", "PLAN_CONFIRM"],
|
||||
"STABILITY": ["STAB_GROUND", "STAB_SECTION", "STAB_3D", "STAB_REPORT", "STAB_ROCK"],
|
||||
"STABILITY": [
|
||||
"STAB_GROUND",
|
||||
"STAB_SECTION",
|
||||
"STAB_3D",
|
||||
"STAB_ROCK",
|
||||
"STAB_AREA",
|
||||
"STAB_REPORT",
|
||||
],
|
||||
}
|
||||
|
||||
# E 체인 단계 열쇠(`E02_StabGround_Chain.STEPS` + 지반) → 단계 행 열쇠
|
||||
STAB_STEP_STAGE_KEYS = {
|
||||
"ground": "STAB_GROUND",
|
||||
"2d": "STAB_SECTION",
|
||||
"3d": "STAB_3D",
|
||||
"rock": "STAB_ROCK",
|
||||
"area": "STAB_AREA",
|
||||
"report": "STAB_REPORT",
|
||||
}
|
||||
# 체인 단계 상태 → 단계 행 상태(건너뜀 = 저장본이 입력과 같음 · 끊음 = 옛 결과 낡았을 수 있음)
|
||||
STAB_STEP_STATES = {
|
||||
"run": "IN_PROGRESS",
|
||||
"done": "COMPLETE",
|
||||
"skip": "COMPLETE",
|
||||
"error": "FAILED",
|
||||
"cancel": "STALE",
|
||||
}
|
||||
|
||||
|
||||
@@ -208,6 +234,66 @@ async def mark_stage(
|
||||
)
|
||||
|
||||
|
||||
async def mark_stab_step(
|
||||
project_id: str,
|
||||
step: str,
|
||||
state: str,
|
||||
message: str | None = None,
|
||||
cursor: aiomysql.DictCursor | None = None,
|
||||
) -> None:
|
||||
"""E 안정성평가 단계 상태 한 곳(요구 390 · PLAN 565-1) — 대시보드 막대 색.
|
||||
|
||||
`step` = `STAB_STEP_STAGE_KEYS` 열쇠 · `state` = `STAB_STEP_STATES` 열쇠(체인 낱말 그대로) ·
|
||||
`message` = 실패 까닭(행 칸 길이로 자름). 커서 없으면 제 트랜잭션 · DB 없으면 아무것도 안 함.
|
||||
뒤 단계를 STALE 로 돌리지 않음(체인이 차례로 다 돎).
|
||||
"""
|
||||
stage_key = STAB_STEP_STAGE_KEYS[step]
|
||||
row_state = STAB_STEP_STATES[state]
|
||||
if cursor is None:
|
||||
from config import config_db
|
||||
|
||||
if config_db.db_pool is None:
|
||||
return
|
||||
async with config_db.get_db_pool().acquire() as connection:
|
||||
await connection.begin()
|
||||
try:
|
||||
async with connection.cursor() as own:
|
||||
await mark_stab_step(project_id, step, state, message, own)
|
||||
await connection.commit()
|
||||
except Exception:
|
||||
await connection.rollback()
|
||||
raise
|
||||
return
|
||||
now = datetime.utcnow()
|
||||
trimmed = (message or "").strip()[:_STAGE_MESSAGE_MAX_LENGTH] or None
|
||||
await cursor.execute(
|
||||
"""
|
||||
UPDATE project_workflow_stages
|
||||
SET state = %s,
|
||||
progress_percent = CASE WHEN %s = 'COMPLETE' THEN 100
|
||||
WHEN %s = 'IN_PROGRESS' THEN 0 ELSE progress_percent END,
|
||||
message = CASE WHEN message LIKE 'DEV_UNLOCK:%%' THEN message ELSE %s END,
|
||||
started_at = CASE WHEN %s = 'IN_PROGRESS' THEN %s ELSE started_at END,
|
||||
completed_at = CASE WHEN %s = 'COMPLETE' THEN %s
|
||||
WHEN %s = 'IN_PROGRESS' THEN NULL ELSE completed_at END
|
||||
WHERE project_id = %s AND stage_key = %s
|
||||
""",
|
||||
(
|
||||
row_state,
|
||||
row_state,
|
||||
row_state,
|
||||
trimmed if row_state == "FAILED" else None,
|
||||
row_state,
|
||||
now,
|
||||
row_state,
|
||||
now,
|
||||
row_state,
|
||||
project_id,
|
||||
stage_key,
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
async def update_stage_progress(
|
||||
cursor: aiomysql.DictCursor, project_id: str, stage_no: int, progress: int
|
||||
) -> None:
|
||||
|
||||
Reference in New Issue
Block a user