- 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>
87 lines
3.1 KiB
Python
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))
|