Files
Aislo/B08_Quantity/B08_Quantity_Router.py
T
eomsangdonandClaude Opus 5 4f1521eea9 feat(b08): 구조물도 양식 가져오기 — 3단 목록은 고를 때만, 표는 프로젝트에 박힌 양식만 읽음
- 라이브러리 항목을 목록으로(항목마다 AX-ST-<8hex>.json) · 기본 찰쌓기에 코드 부여
- 가져오기: 로그인한 사람의 개인·회사 단 + 프로그램 기본에서 골라 {프로젝트}/B08_Quantity/library 에 박음 · 그 종류의 고친 식은 비움
- 표·원단위·자재총괄·인계는 박힌 양식 → 없으면 프로그램 기본만 읽음(여는 사람마다 값이 안 갈림)
- [확정] 때 아직 안 박힌 기본 양식을 박음 · 장 머리에 「어느 단에서 가져왔나 · 고친 식 N줄」
- 시험 test_b08_structure_library.py 6개 · 전체 1524 통과

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016VBGFXB9AbJBwXP19z75Qq
2026-09-13 18:21:19 +09:00

57 lines
2.4 KiB
Python

"""B08 수량 산출 라우터 — 셸 단계.
수량 본문은 미구현. 지금은 좌측 패널 [확정] 버튼이 워크플로 stage 5(QUANTITY)를
완료 처리해 B09 설계도서 진입을 여는 역할만 한다. 본문(B06 종횡단 기반 산출)을
구현할 때 이 라우터를 확장한다.
"""
import asyncio
import logging
from uuid import UUID
from fastapi import APIRouter
from fastapi.responses import JSONResponse
from common_util.common_util_workflow_state import complete_stage
from config.config_db import get_db_pool
logger = logging.getLogger(__name__)
router = APIRouter(prefix="/api/projects", tags=["B08 Quantity"])
@router.post("/{project_id}/quantity/confirm")
async def confirm_quantity(project_id: UUID) -> JSONResponse:
"""수량 단계 확정 — stage 5(QUANTITY)를 COMPLETE로 전이한다 (본문 미구현).
⚠ 전이 전에 **아직 안 박힌 구조물도 양식을 프로젝트에 박음**(PLAN 4장) — 확정 뒤 프로그램
기본을 고쳐도 확정한 값이 안 흔들리게. 못 박으면 확정하지 않음.
"""
from B08_Quantity.B08_Quantity_Engine_StructureLibrary import pin_program_templates
from B08_Quantity.B08_Quantity_Router_StructureSheet import _project_root
project_root = await _project_root(project_id)
try:
if project_root is None:
raise FileNotFoundError("프로젝트 저장 폴더 없음")
await asyncio.to_thread(pin_program_templates, project_root)
except Exception:
logger.exception("B08 수량 확정 실패(양식 박기): project_id=%s", project_id)
return JSONResponse(
status_code=500,
content={"status": "error", "message": "구조물도 양식을 프로젝트에 박지 못했습니다."},
)
pool = get_db_pool()
async with pool.acquire() as connection:
try:
async with connection.cursor() as cursor:
await complete_stage(cursor, str(project_id), 5)
await connection.commit()
except Exception:
await connection.rollback()
logger.exception("B08 수량 확정 실패: project_id=%s", project_id)
return JSONResponse(
status_code=500,
content={"status": "error", "message": "수량 단계 확정에 실패했습니다."},
)
return JSONResponse(content={"status": "success", "project_id": str(project_id)})