feat(827-3): 불러오기 재료 걸음 3 — 고를 재료 판 · 그 파일 안 고름(별칭 아님) · SK 상세 같은 파일 물음

- 새 M02_San_MatPick: 종 열쇠(이름 · 규격 · 단위 · 단서) · 고름 자리 = 개인 층 실무자료/재료고름/<파일 지문>.json([끝내기] 뒤 남음 · 같은 파일 다시 올리면 그대로) · 판(블록마다 재료찾기 판정 → 종 · 첫 판 한 번 셈 → 산근 저장본 칸) · 만들 때 얹기 · 이미 만든 SK 얹기(가져온 그대로인 줄만 · 바꿈 · 따로 고른 줄 그대로 · 풀면 가져온 그대로)
- 만들기: from-hopyo 가 그 파일 고름째 만듦(저장 안 한 판 고름 = 만들 때 저장) · 원본 지문 · 고른 줄 = 이음 + 재료찾기.고름 · 문서 셈 우리 값(엑셀 값 기억 없음) · 별도계상 = 품목만(줄 이음 · 단가 0 그대로)
- 문서 머리 가져온.재료(판정 · 후보 · 단서 · 처음 연결) · 가져온.지문
- 길: GET/POST hopyo-materials/{HP}(판 · [저장] · 만든 것 적용은 물음 예일 때만) · GET/POST material-picks/{지문}(SK 상세 물음)
- 화면: 단가산출 목록 위 「고를 재료」 판(후보 고름 · 찾기 · 고름 풀기 · n 블록에 적용 · 이어진 재료 접힘 · [저장]) · 저장 안 한 고름 = 떠날 때 물음 · 줄 쌓기 재료 줄 판정 배지 · 풍선말(판정 · 단서 · 후보) · 이름 단추 · [이음 고르기] 뒤 「같은 파일 n 줄」 물음
- 별도계상 설명 = 「별도계상 · 품목: 이름 규격」(엔진 이은 품목은 자재표 이름) — test_827_2 기대 글 고침(품목 이음 → 품목 이름)
- 시험 test_827_3 셋(파일 고름 블록 둘 · 다른 파일 0 · 별칭 · 마스터 그대로 · 풀기 · 다시 올림 유지 · 물음 예일 때만 · 따로 바꾼 줄 보존 · 별도계상 품목 + 단가 0)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-13 12:51:04 +09:00
co-authored by Claude Opus 5.5
parent 2d6ae7e248
commit 520bb33909
18 changed files with 1131 additions and 21 deletions
+12 -2
View File
@@ -22,6 +22,7 @@ from typing import Any
from M02_MasterTemplete import M02_Doc_Copy as dc
from M02_MasterTemplete import M02_Doc_Import_Shape as shape
from M02_MasterTemplete import M02_Labor_Ref as refs
from M02_MasterTemplete import M02_San_MatPick as mp
from M02_MasterTemplete import M02_Sangeun_Doc as sd
from M02_MasterTemplete import M02_Sangeun_Imported as imp
@@ -36,7 +37,8 @@ HEAD = (
"원코드",
"규격",
"확정",
) # 뒤 셋 = 원파일(810-3)
"지문",
) # 규격 · 확정 = 원파일(810-3) · 지문 = 올린 파일(827-3 재료 고름)
GUESS = "추정" # 원파일 품셈 조건 글 표지(810-2 `M02_Doc_NativeEst.GUESS`)
SUB = "원파일 소계" # 원파일 소계 덧줄(810-2 `M02_Doc_NativeEst`) — 합 밖 · 비목 칸 비움
PICK = "소요량" # 고른 표 칸 기호 이름 머리
@@ -304,6 +306,7 @@ def _choice(key: str, below: str, items: list[str], value: str) -> dict:
MACHINES = "_기계" # 문서 셈 동안 잠깐 — `derive` 가 머리 `가져온.기계` 로 옮김
MATS = "_재료" # 같은 꼴 — 머리 `가져온.재료`(827-3 `M02_San_MatPick.entry`)
def _machine_entry(item: dict, sym: str) -> dict:
@@ -329,12 +332,15 @@ def _attach(doc: dict, row: dict, ids: list[str], src: dict[str, dict]) -> None:
기계 찾기 판정(812-9) = 문서 `가져온.기계`(단가 기호마다 · 화면 고르기 · 저장 때 별칭)."""
by_id = {dc.md.var_id(v): v for v in doc.get("변수") or []}
found: list[dict] = doc.setdefault(MACHINES, [])
mats: list[dict] = doc.setdefault(MATS, [])
for at, line in enumerate((doc.get("금액") or [])[: len(row["호표"])]):
item = src.get(ids[at]) if at < len(ids) else None
price = str(line.get("단가") or "")
var = by_id.get(price.removesuffix(".계"))
if item is not None and var is not None and (item.get("자원") or {}).get("찾기"):
found.append(_machine_entry(item, dc.md.var_id(var)))
if item is not None and var is not None and (one := mp.entry(item, dc.md.var_id(var), _excel(item))): # fmt: skip
mats.append(one) # 827-3 재료 찾기 판정 · 그 파일 고름
if item is None or var is None or (var.get("연결") or {}).get("갈래") != "숫자":
continue
excel = _excel(item)
@@ -361,7 +367,7 @@ def _attach(doc: dict, row: dict, ids: list[str], src: dict[str, dict]) -> None:
if item.get("참조비목") and isinstance(excel, dict):
excel = excel[item["참조비목"]]
line["단가"], line["비목"] = dc.md.var_id(var), item["참조비목"]
var["연결"] = {**link, XL: excel}
var["연결"] = link if mp.chosen(item) else {**link, XL: excel} # 827-3 고른 줄 = 우리 값
def _numbers(doc: dict, keep: dict) -> None:
@@ -419,12 +425,16 @@ def derive(sk: dict, ctx: tuple | None = None, whole: Any = None) -> dict:
_empty(doc) # 빈 산근 = 엑셀 0 원(줄 없음 합) — 「—」 아님
marks.append(EMPTY)
found = doc.pop(MACHINES, None)
mats = doc.pop(MATS, None)
head |= {"기계": found} if found else {} # 812-9 기계 찾기 판정(줄 쌓기 고르기 · 저장 때 별칭)
doc["가져온"] = head | {"표지": marks} | ({"알림": notes} if notes else {})
shape.shape(doc, meta) # 809-1 · 요구 704 — 지은 이름 → 엑셀 글 머리 · EST 기계 세 줄 = 한 줄
if found: # 세 줄을 한 줄로 합쳐 사라진 기호의 기계 판정은 뺌
alive = {dc.md.var_id(v) for v in doc.get("변수") or []}
doc["가져온"]["기계"] = [x for x in found if x["기호"] in alive]
if mats: # 827-3 재료 찾기 판정(줄 쌓기 풍선말 · 이미 만든 SK 고름 얹기)
alive = {dc.md.var_id(v) for v in doc.get("변수") or []}
doc["가져온"]["재료"] = [x for x in mats if x["기호"] in alive]
return {**doc, "키": str(sk.get("키") or key), "이름": str(sk.get("이름") or doc.get("이름"))}