Files
Aislo/common_util/common_util_project_kind.py
eomsangdonandClaude Opus 5.5 29512c001b feat(D 예정노선): D02 기준 지정 걷음 · 지점 마킹 = D03 노선분석 · 기준점 둘레 1 km 처음 받기 · 조용히 이어 받기 (PLAN 591-2 · 요구 452 · 453)
- D02 걷음 — 길 · 단계(PLAN 단계 둘 = 노선 분석 · 확정) · [>] · 대시보드 단계 점 · 서버 길 · 폴더 만들기 · 캐시 등록 · 글 · 가이드 폴더
- 등록 [등록] · 받은 예정노선 [보기] = D03 으로 곧바로
- D03 지점 = 긋기에 붙는 점 · 목록 칸(여섯 색 · 「지점 N」 · 🗑) · 핀 끌기 = 그 자리 노선 노드 같이 · [저장] 몸에 실음 · [초기화] = 선만 지우고 지점 남김
- 지도 우클릭 메뉴(부품 상자) — 여기서 긋기 시작(빈 땅 = 새 본선) · 갈래 시작 · 이어 긋기 · 지점 놓기 · 지점 지우기 · 긋기 끝
- 받기 — 처음 = 등록 기준점 둘레 ± 1 km(지점 · 선 없을 때) · 지점 · 선 · 지도 보기 가운데가 받은 범위 밖이면 조용히 이어 받음(단추 · 막는 창 걷음 · 실패만 [다시 받기])
- 좌표계 = 파일 머리 · 없으면 기준점 경도 TM 띠
- 시험: 529_3(D02 지점 API) 지움 → 591_2 로 갈음 · 280_2 · 528 · 530_2 · 547_1 · 548 · 553_4 · 556_2 · 560_4 · 401 · 54_2 = D02 단계 · 페이지 걷음에 맞춤 · 590_1 · 530_2_analyze = 사업연도 · 기준점 한 번에 읽음 · 591_1 D04 씨앗 시험 = 590-1 이 씨앗 줄 걷음에 맞춤

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 10:19:34 +09:00

116 lines
4.1 KiB
Python

"""종류별 프로젝트 행 만들기 — D 예정노선 · E 안정성평가(요구 345).
임도설계(ROAD)는 B02 그대로. 저장소 경로는 B02 함수를 씀 · 초기 폴더는 종류 단계만
(B 양식 복사 · B0x 빈 폴더 없음 · D 는 지형 배치 B04_PreProcess 더함).
"""
from __future__ import annotations
from datetime import datetime
from pathlib import Path
from typing import Any
from uuid import uuid4
from B02_ProjRegister.B02_ProjRegister_Repository import _build_project_storage
from common_util.common_util_audit import record_audit
from common_util.common_util_storage import get_project_stage_path
from common_util.common_util_workflow_state import initialize_project_stages
from config.config_db import get_db_pool
KIND_STAGE_DIRS = {
"PLAN": ("D03_PlanAnalysis", "D04_PlanConfirm", "B04_PreProcess"),
"STABILITY": (
"E02_StabGround",
"E03_StabSection",
"E04_Stab3D",
"E05_StabReport",
"E06_StabRock",
"E07_StabArea",
),
}
def init_kind_storage(project_root: Path, kind: str) -> None:
"""종류 단계 폴더만 — B 양식 · B0x 빈 폴더 · workflow · manifest 없음."""
for stage_dir in KIND_STAGE_DIRS[kind]:
get_project_stage_path(str(project_root), stage_dir)
async def create_kind_project(
*,
request: Any | None,
user_id: int,
company_id: int,
kind: str,
name: str,
region: str | None,
road_type: str | None,
project_year: int | None,
project_year_end: int | None = None,
site: tuple[float, float, str | None] | None = None,
route_start_m: float | None = None,
route_end_m: float | None = None,
source_project_id: str | None = None,
) -> str:
"""projects 행 + 참여자 + 종류별 단계 + 저장소 폴더 → 새 project_id.
site = 예정노선 기준점(경도, 위도, 주소 · 591-1) · 설계속도 칸은 비워 둠(B05 기본).
"""
project_id = str(uuid4())
storage_path, project_root = _build_project_storage(company_id, user_id, project_id)
now = datetime.utcnow()
async with get_db_pool().acquire() as connection, connection.cursor() as cursor:
try:
await connection.begin()
await cursor.execute(
"""
INSERT INTO projects (
id, user_id, company_id, name, region, road_type, project_kind,
project_year, project_year_end, site_lon, site_lat, site_address,
route_start_m, route_end_m, status, crs_epsg, storage_path,
source_project_id, source_copied_at, created_at, updated_at
)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, 'NEW', 5178, %s,
%s, %s, %s, %s)
""",
(
project_id,
user_id,
company_id,
name,
region,
road_type,
kind,
project_year,
project_year_end,
*(site or (None, None, None)),
route_start_m,
route_end_m,
storage_path,
source_project_id,
now if source_project_id else None,
now,
now,
),
)
await cursor.execute(
"INSERT IGNORE INTO project_members (project_id, user_id) VALUES (%s, %s)",
(project_id, user_id),
)
await initialize_project_stages(cursor, project_id, kind)
await record_audit(
cursor,
actor_id=user_id,
action="PROJECT_CREATE",
resource_type="project",
resource_ref=project_id,
request=request,
)
init_kind_storage(project_root, kind)
await connection.commit()
except Exception:
await connection.rollback()
raise
return project_id