Files
Aislo/common_util/common_util_project_kind.py
T
eomsangdonandClaude Opus 5.5 f2e8bd6d5f feat(536-1): E06 암반 평사투영 — Markland 판정 · Hoek-Bray 평면 · 쐐기 안전율 · 스테레오넷 · 절리 입력 · 화면
- 엔진(자체 · NumPy · SciPy): 평면 · 쐐기(교선) · 전도 Markland(측방 한계 20° 기본) · 평면 Hoek-Bray(인장균열 없음 · 임계 · 깊이 · 수압 · kh · 수동 볼트) · 쐐기 SWedge 꼴(미끄럼 방향 8 경우 · 두 면 · 한 면 · 수압 중력식 · kh · 볼트)
- 스테레오넷 좌표(등각 · 등면적 하반구 · 극점 · 대원 · 교선 · 마찰원 · 일광 엔벨로프 · 위험 영역 = 판정 부등식)
- 길: 절리 작업본 E06_StabRock/joints.json(초기값 · 저장 · 초기화) · 해석 = 암 측점 깎기 쪽만 · 파생 저장본 stab_rock · 결과 · 측점 스테레오넷
- 화면: 좌 절리군 표 · 설정 / 가운데 위험 띠 · 스테레오넷 / 우 측점 결과 · 안전율 표 · E 단계 막대에 E06(끝에 덧붙임)
- 시험 test_536_1(Hoek Sau Mau Ping 0.8184 · 1.0655 · Sharma 윗면 무게 · Hoek-Bray 쐐기 계수 · Kumsar · Priest 두 예제 · Markland 경계 · 투영 왕복 · 위험 영역 = 판정) · test_528 E 단계 수 4 → 5

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 21:26:37 +09:00

109 lines
3.7 KiB
Python

"""종류별 프로젝트 행 만들기 — D 예정노선 · E 안정성평가(요구 345).
임도설계(ROAD)는 B02 그대로. 저장소 경로 · 초기 폴더는 B02 함수를 그대로 씀.
"""
from __future__ import annotations
from datetime import datetime
from typing import Any
from uuid import uuid4
from B02_ProjRegister.B02_ProjRegister_Repository import (
_build_project_storage,
_initialize_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": ("D02_PlanBase", "D03_PlanAnalysis", "D04_PlanConfirm"),
"STABILITY": (
"E02_StabGround",
"E03_StabSection",
"E04_Stab3D",
"E05_StabReport",
"E06_StabRock",
),
}
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,
design_speed_kph: int | None = None,
route_start_m: float | None = None,
route_end_m: float | None = None,
source_project_id: str | None = None,
) -> str:
"""projects 행 + 참여자 + 종류별 단계 + 저장소 폴더 → 새 project_id."""
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, design_speed_kph,
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, 'NEW', 5178, %s,
%s, %s, %s, %s)
""",
(
project_id,
user_id,
company_id,
name,
region,
road_type,
kind,
project_year,
project_year_end,
design_speed_kph,
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,
)
_initialize_project_storage(project_root, project_id)
for stage_dir in KIND_STAGE_DIRS[kind]:
get_project_stage_path(str(project_root), stage_dir)
await connection.commit()
except Exception:
await connection.rollback()
raise
return project_id