- 새 M02_Labor_Patch.py — 줄 칸 패치 = SK 꼴 {덮개, 뺀줄, 더한줄}(한 벌) · 로직 줄 · SK 참조 줄만 · 줄 고름 · 자재표시(차례)를 cid 로 바꿔 뺀줄 뒤 제자리 · 셈 = 이름 없는 SK 로 M02_Sangeun_Calc
- M02_Labor_Doc — clean 이 패치 정리 · calc 로직 줄 · 참조 줄 패치 갈래(몇 줄 · 690 줄)
- M02_Labor_Expand — 사전조합 안 줄 패치 갈래 · 머리 「1 ㎡ 당」
- M02_Labor_Ref — 사전조합 줄에 패치 남김 · 줄 있는 일위대가 단위 빈칸 400(빈 새 문서는 받음 — 화면 새로 단추가 단위 null) · 409 글 종류 이름 사전조합 → 일위대가 · labor → 구조물 조합
- POST /api/m02/layers/{층}/sangeun/from-line(층 쓰기 권한) — 새 SK + 바꿀 참조 줄 · 셈 답에 머리
- Labor_Calc.ts 짝은 그대로(settle 은 서버 기준을 받음 · 거울 시험 통과)
- 낡은 시험 고침: test_m02_labor_ref · test_175_precombo_mats · test_204_2_b09_bill_library 의 줄 있는 사전조합에 단위(빈칸 막기) · 참조 줄 분모 = 그 사전조합 단위
- 새 시험 test_715_3_labor_patch.py(임시 storage)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
70 lines
2.6 KiB
Python
70 lines
2.6 KiB
Python
"""M02 단가산출(SK) 셈 길(PLAN 715-1b) — `POST /api/m02/layers/{층}/sangeun/calc` ·
|
|
[단가산출로 저장](715-3) `POST /api/m02/layers/{층}/sangeun/from-line`(층 쓰기 권한).
|
|
|
|
저장 안 함 · 로그인 사용자 · 층 읽기 권한(`Router_Items._root`) · 화면은 최신 응답만.
|
|
몸 = `문서`(저장 전 화면 문서) 또는 `키`(그 층 저장본) + `입력값`(열린입력 · 시험 값).
|
|
문서 읽기 · 쓰기 · 새로 · 복사 · 지우기는 양식 길 · 서고 길 그대로(종류 `sangeun`).
|
|
⚠ 등록은 `main.py`(로그인만).
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException
|
|
from pydantic import BaseModel
|
|
|
|
from common_util.common_util_auth import verify_session
|
|
from M02_MasterTemplete import M02_MasterTemplete_Store as store
|
|
from M02_MasterTemplete import M02_Sangeun_Calc as calc
|
|
from M02_MasterTemplete import M02_Sangeun_Doc as sd
|
|
from M02_MasterTemplete.M02_MasterTemplete_Router_Items import Layer, Session, _call, _root
|
|
|
|
router = APIRouter(prefix="/api/m02", tags=["M02 MasterTemplete Sangeun"])
|
|
|
|
|
|
class SangeunCalcBody(BaseModel):
|
|
문서: dict[str, Any] | None = None
|
|
키: str | None = None
|
|
입력값: dict[str, Any] | None = None
|
|
|
|
|
|
def _calc(body: SangeunCalcBody) -> dict[str, Any]:
|
|
doc = body.문서
|
|
if doc is None:
|
|
if not sd.KEY.match(str(body.키 or "")):
|
|
raise store.StoreError(400, "문서 또는 키(SK-######)")
|
|
doc = store.read(sd.KIND, str(body.키))["문서"]
|
|
return calc.calc_doc(doc, body.입력값)
|
|
|
|
|
|
class FromLineBody(BaseModel):
|
|
줄: dict[str, Any]
|
|
이름: str
|
|
단위: str
|
|
|
|
|
|
@router.post("/layers/{layer}/sangeun/from-line")
|
|
def sangeun_from_line(
|
|
layer: Layer,
|
|
body: FromLineBody,
|
|
owner: str | None = None,
|
|
session: Session = Depends(verify_session),
|
|
) -> dict:
|
|
"""[단가산출로 저장](715-3) — 일위대가 줄 → 그 층 새 단가산출 · 답 = 새 키 + 바꿀 참조 줄."""
|
|
folder = _root(session, layer, owner, write=True)
|
|
return _call(folder, calc.from_line, body.줄, body.이름, body.단위)
|
|
|
|
|
|
@router.post("/layers/{layer}/sangeun/calc")
|
|
def calc_sangeun(
|
|
layer: Layer,
|
|
body: SangeunCalcBody,
|
|
owner: str | None = None,
|
|
session: Session = Depends(verify_session),
|
|
) -> dict:
|
|
"""단가산출 셈 — 줄(cid · 덮개 · 원값) · 기준 · 1단위 · 짝잃음(저장 안 함)."""
|
|
if body.문서 is None and body.키 is None:
|
|
raise HTTPException(status_code=400, detail="문서 또는 키")
|
|
return _call(_root(session, layer, owner), _calc, body)
|