Merge remote-tracking branches 'origin/main_desktop_1', 'origin/sub_laptop_1' and 'origin/sub_laptop_4' into sub_laptop_3

This commit is contained in:
2026-09-21 20:50:36 +09:00
27 changed files with 1152 additions and 141 deletions
@@ -1,8 +1,12 @@
# -*- coding: utf-8 -*-
"""로직 호표의 재료 줄을 「고르기 조건」 으로 바꿈 — 요소 「MP……」{구분, 상세구분[, 규격]}.
"""로직 호표의 재료 줄을 「고르기 조건」 으로 바꿈 — 요소 「MP……」·「MT……」 를 조건 묶음으로.
· 바탕 = 재료_품셈재료.json 의 「고르기」 칸 (`scripts/build_품셈재료_고르기.py` 가 채움)
· 고르기 칸이 빈 품셈재료(연결이 이미 있는 줄 · 짝 없는 줄)는 옛 방식 그대로 둠
· 바탕 셋 —
① 재료_품셈재료.json 의 「고르기」 칸 (`scripts/build_품셈재료_고르기.py` 가 채움)
② 자재품목 줄을 바로 가리키는 「MT……」 — 그 줄의 구분·상세구분·규격 + 대표 = 그 줄
③ 연결이 자재품목 키 하나인 품셈재료 「MP……」 — 그 자재품목 줄로 ② 와 같게
②③ 은 대표 줄이 옛 요소와 같은 줄이라 금액이 그대로임(고르기 화면만 열림)
· 고르기 칸이 비고 연결도 지역·계약종별을 계산 때 푸는 줄(모래 · 자갈 · 전력)은 옛 방식 그대로 둠
· 줄 텍스트의 「"요소": "MP……"」 한 줄만 바꿈 — 나머지 글자·차례 그대로
· 다시 돌려도 같은 결과(이미 바뀐 줄은 건드릴 것이 없음)
@@ -17,13 +21,36 @@ from pathlib import Path
MASTER = Path(__file__).resolve().parents[1]
SRC = MASTER / "재료_품셈재료.json"
LINE = re.compile(r'^(\s*"요소": )"(MP\d{6})"(,?)\s*$')
MARKET = MASTER / "재료_자재품목.json"
LINE = re.compile(r'^(\s*"요소": )"((?:MP|MT)\d{6})"(,?)\s*$')
def _cond_of(row: dict) -> dict | None:
"""자재품목 줄 → 고르기 조건 · 대표는 그 줄(금액이 안 바뀌게)."""
if not row.get("구분"):
return None
cond = {"구분": row["구분"]}
for slot in ("상세구분", "규격"):
if row.get(slot):
cond[slot] = row[slot]
cond["대표"] = str(row[""])
return cond
def _picks() -> dict[str, dict]:
"""요소 키 → 고르기 조건 — 품셈재료 고르기 칸 · 자재품목 줄 · 연결이 키 하나인 품셈재료."""
market = {str(r[""]): r for r in json.loads(MARKET.read_text(encoding="utf-8"))[""]}
picks = {key: cond for key, row in market.items() if (cond := _cond_of(row))}
for row in json.loads(SRC.read_text(encoding="utf-8"))[""]:
link = row.get("연결")
cond = row.get("고르기") or (picks.get(link) if isinstance(link, str) else None)
if cond:
picks[str(row[""])] = cond
return picks
def main(show: bool) -> int:
picks = {
str(r[""]): r.get("고르기") for r in json.loads(SRC.read_text(encoding="utf-8"))[""]
}
picks = _picks()
done, kept, files = 0, 0, 0
for path in sorted(MASTER.glob("로직_*.json")):
text = path.read_text(encoding="utf-8")