Files
Aislo/M02_MasterTemplete/M02_Doc_Screen.py
T
eomsangdonandClaude Opus 5.5 9c43296145 feat(804-4): 줄 쌓기 다른 단가산출 · 일위대가 복사해 펼침 — M01 은 M01 전체만
- M02 단가산출 줄 쌓기 [+ 줄] 「다른 단가산출 · 일위대가 복사」 = 찾기 창 탭 [M01 전체 | M02 단가산출 | 일위대가](위 층 · 자기 SK 막음)
- 고름 = 그 문서 전체를 복사해 이 단가산출 항목 · 줄로 펼침(참조 줄 없음 · 원본 연결 없음 · 머리 글 「○○에서 복사」 · 옵션 = 고른 값으로 굳힘 · 기호 겹침 = 새 이름)
- 일위대가 = 로직 줄 → M01 문서 × 수량 ÷ 배 · 참조 SK → 그 SK 문서 × 수량 ÷ 배 · 고정 노임 · 자재 · 기계 · 손 단가 · 율(비목 기준) · 못 옮김 = 「⚠」 글 줄
- 율 줄 밑 = 그 조각 줄만(금액번지 복사N) — 앞 줄 · 다른 조각 안 섞임
- 서버 조각 길 GET …/sangeun/{키}/doc/take?src= (M02_Doc_Take) · 화면 넣기 common_util_line_stack_copy.ts
- 빈 SK(바탕 · 줄 없음)에 수식 길로 저장한 문서가 빈 씨로 덮이던 것 고침(M02_Doc_Sk.settle 차례)
- [단가 갱신] = 사본 값 줄 자원 단가만 지금 M01(구조 · 품 · 식 그대로)
- 시험 test_804_4_line_stack_take 6 · helper_804_2 「복사」 할일

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 08:04:16 +09:00

87 lines
3.1 KiB
Python

"""M02 단가산출(SK) 수식 탭 화면 몫(PLAN 802-4b-2 · 요구 660~665) — M01 수식 문서 화면과 같은 꼴.
- 연결 기록 `record(사본)` — 사본 셈이 쓴 요소 값 · 표 · 단가산출 문서(끊음 먼저)를 화면 캐시로
(화면 = 같은 계산기로 즉시 셈 · `M02_Doc_Sk_Path.answer` 가 `연결` 칸으로 붙임)
- 연결 후보 · 표 하나 = M01 수식 문서 화면 것(`M01_MasterData_Doc`) 그대로 — 로그인 · 층 읽기 권한
POST /api/m02/layers/{층}/sangeun/{키}/doc/links {갈래, 검색, 분류} → {후보, 더있음}
GET /api/m02/layers/{층}/sangeun/{키}/doc/table?key=<표 키> → 표(조건 · 칸)(M01 길 꼴)
- 줄 쌓기 복사(804-4) — M01 단가산출 · 위 층 SK · SC 를 복사할 조각(`M02_Doc_Take.take`)
GET /api/m02/layers/{층}/sangeun/{키}/doc/take?src=<M01 키 | 참조|층|주인|키> → {이름, 출처, 조각, 계?}
⚠ 등록은 `main.py`(로그인만 · 층 권한은 길 안에서).
"""
from __future__ import annotations
import json
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_Copy as dc
from M02_MasterTemplete.M02_MasterTemplete_Router_Items import Layer, Session, _call, _root
router = APIRouter(prefix="/api/m02", tags=["M02 MasterTemplete Sangeun Doc Screen"])
def record(copy: dict) -> dict[str, Any]:
"""사본 문서 셈이 쓴 연결 기록 — 값 사본 색인 위 · 부름(끊음 먼저) 문서."""
import master_doc_record as mr # `M02_Doc_Copy` 가 scripts 를 길에 둔 뒤
rec = mr.Rec(dc.ml.Links(dc.over(copy), dc.docs_of(copy)))
try:
rec.prefetch(copy["문서"])
dc.mc.calc(copy["문서"], rec)
except dc._ERR: # 셈 틀림 = 셈 답 표지(`dc.run`) — 기록은 모은 데까지
pass
return rec.out()
class LinksBody(BaseModel):
갈래: str
검색: str = ""
분류: str = "인력"
def _m01_doc():
from M01_MasterData import M01_MasterData_Doc as m01_doc
return m01_doc
@router.post("/layers/{layer}/sangeun/{sk}/doc/links")
def doc_links(
layer: Layer,
sk: str,
body: LinksBody,
owner: str | None = None,
session: Session = Depends(verify_session),
) -> dict:
return _call(_root(session, layer, owner), _m01_doc().candidates, body.model_dump())
@router.get("/layers/{layer}/sangeun/{sk}/doc/table")
def doc_table(
layer: Layer,
sk: str,
key: str,
owner: str | None = None,
session: Session = Depends(verify_session),
) -> dict:
return _call(_root(session, layer, owner), _m01_doc().table, key)
@router.get("/layers/{layer}/sangeun/{sk}/doc/take")
def doc_take(
layer: Layer,
sk: str,
src: str,
owner: str | None = None,
session: Session = Depends(verify_session),
) -> dict:
from M02_MasterTemplete import M02_Doc_Take as take
got = _call(_root(session, layer, owner), take.take, src)
return json.loads(json.dumps(dc.ml._norm(got), ensure_ascii=False, default=str))