refactor(master): 옛 방식 재료 줄 129 개를 고르기 조건+대표 줄로 바꿈 — 금액 그대로 · 남은 178 줄은 까닭별 정리
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JgUhN55Z3BCYhUJTjwTNfj
This commit is contained in:
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user