- 새 M02_Doc_Match(서버 단독) — 후보(결과단위 · 노임 키 · 재료 · 기계 · 품셈 절 번호) · 옵션 풀이(줄 수량 · 단가가 의존하는 선택 · 입력 변수만 돌려 좁힘 · 글 근거 값 유지) · 줄 대조(같음 · 단가 차이 · 단위 환산 · 기계 규격 · 비목 · 율 값 · 율 줄 · 공구손료 유무 · 줄 없음 · 끝수 · 옵션 글) · 판정 확정(다른 항 0 · 원 단위 같음) / 근접 / 없음(가까운 후보 보이기만)
- 새 M02_Doc_MatchSk — 찾기 = SK 가져온.원본.연결후보 적음 · 바꾸기 = 서버가 다시 찾아 확정만 같은 키에 M01 사본 SK(바탕 · 입력값 = 찾은 옵션) · 원래 몸 = 가져온보관 · 되돌리기 · 근접 · 없음 409
- 길 POST /api/m02/layers/{층}/sangeun/{키}/match {할일 찾기 · 바꾸기 · 되돌리기}(층 쓰기)
- M02_Sangeun_Imported clean — 가져온보관 칸 받음 · M02_Doc_Import 형제 SK 가 우리 기초 사본이면 그 수식 문서로 셈(연결 안 끊김)
- 화면 — 원문 패널 「어디서 왔나」 카드 맨 위 판정 띠(띠 알림 부품) · 확정 = [우리 기초 사본으로 바꾸기] · 근접 · 없음 = 단추 없음 + 다른 항 자세히 · 안 찾음 = [우리 기초와 연결 찾기] · 바꾼 SK = [가져온 식으로 되돌리기] · 저장 안 한 고침 있으면 막음 · 끝나면 SK 다시 엶(새 판)
- 시험 test_810_4_match(판정 셋 · 요구 704 파형강관 Φ800 = GF000179 근접 · 단위 환산 × 6 · 기계 규격 · 율 줄 · 옵션 풀이 · 줄 대조 · 바꾸기 = M01 사본 셈 · 되돌리기 · 근접 409 · 형제 사본 · 전수 S8104_ALL) · helper_810_4_sweep
- 낡은 시험 글 대조 고침 — 717_2b(View 다시 엶 mount) · 750_2(createSangeunSide(opt.match)) · 807_1(원문 패널에 SK 문서 넘김)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
88 lines
3.3 KiB
Python
88 lines
3.3 KiB
Python
"""M02 단가산출(SK) 수식 길(PLAN 802-4a 4) — `M02_Doc_Sk_Path` 를 층 권한 안에서.
|
|
|
|
GET /api/m02/layers/{층}/sangeun/{키}/doc 읽기(층 읽기) → {문서, 부름, 끊음, 셈, 사본, 판}
|
|
POST /api/m02/layers/{층}/sangeun/{키}/doc/preview 미리 셈(층 쓰기) {문서?, 끊음?, 할일?}
|
|
→ {…, 전, 후, 바뀐자원?, 버림?}
|
|
POST /api/m02/layers/{층}/sangeun/{키}/doc/save 저장(층 쓰기) {문서?, 끊음?, 할일?, 판} → 읽기 꼴
|
|
POST /api/m02/layers/{층}/sangeun/{키}/match {할일 찾기|바꾸기|되돌리기, 판?}(층 쓰기 · 810-4)
|
|
→ {연결후보?, 판}(바꾸기 = 확정만 · 아니면 409)
|
|
⚠ 등록은 `main.py`(로그인만 · 층 권한은 길 안에서).
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
from fastapi import APIRouter, Depends
|
|
from pydantic import BaseModel
|
|
|
|
from common_util.common_util_auth import verify_session
|
|
from M02_MasterTemplete import M02_Doc_Sk_Path as path
|
|
from M02_MasterTemplete.M02_MasterTemplete_Router_Items import Layer, Session, _call, _root
|
|
|
|
router = APIRouter(prefix="/api/m02", tags=["M02 MasterTemplete Sangeun Doc"])
|
|
|
|
|
|
class DocBody(BaseModel):
|
|
문서: dict[str, Any] | None = None
|
|
끊음: dict[str, Any] | None = None
|
|
할일: str | None = None
|
|
판: str | None = None
|
|
단가기준: str | None = None # 가져온 식만(807-1 · 엑셀 | 우리)
|
|
|
|
|
|
@router.get("/layers/{layer}/sangeun/{key}/doc")
|
|
def read_doc(
|
|
layer: Layer, key: str, owner: str | None = None, session: Session = Depends(verify_session)
|
|
) -> dict:
|
|
return _call(_root(session, layer, owner), path.read, key)
|
|
|
|
|
|
@router.post("/layers/{layer}/sangeun/{key}/doc/preview")
|
|
def preview_doc(
|
|
layer: Layer,
|
|
key: str,
|
|
body: DocBody,
|
|
owner: str | None = None,
|
|
session: Session = Depends(verify_session),
|
|
) -> dict:
|
|
folder = _root(session, layer, owner, write=True)
|
|
return _call(folder, path.preview, key, body.model_dump(exclude_none=True))
|
|
|
|
|
|
class MatchBody(BaseModel):
|
|
할일: str = "찾기" # 찾기 | 바꾸기 | 되돌리기(810-4)
|
|
판: str | None = None
|
|
|
|
|
|
@router.post("/layers/{layer}/sangeun/{key}/match")
|
|
def match_doc(
|
|
layer: Layer,
|
|
key: str,
|
|
body: MatchBody,
|
|
owner: str | None = None,
|
|
session: Session = Depends(verify_session),
|
|
) -> dict:
|
|
"""가져온 식 ↔ 우리 기초(810-4) — 찾기(연결후보 적음) · 바꾸기(확정만 · M01 사본 SK) · 되돌리기."""
|
|
from fastapi import HTTPException
|
|
|
|
from M02_MasterTemplete import M02_Doc_MatchSk as msk
|
|
|
|
jobs = {"찾기": msk.find, "바꾸기": msk.swap, "되돌리기": msk.back}
|
|
if body.할일 not in jobs:
|
|
raise HTTPException(status_code=400, detail="찾기 · 바꾸기 · 되돌리기")
|
|
folder = _root(session, layer, owner, write=True)
|
|
return _call(folder, jobs[body.할일], key, body.판 or "")
|
|
|
|
|
|
@router.post("/layers/{layer}/sangeun/{key}/doc/save")
|
|
def save_doc(
|
|
layer: Layer,
|
|
key: str,
|
|
body: DocBody,
|
|
owner: str | None = None,
|
|
session: Session = Depends(verify_session),
|
|
) -> dict:
|
|
folder = _root(session, layer, owner, write=True)
|
|
return _call(folder, path.save, key, body.model_dump(exclude_none=True))
|