knowledge(마스터): 옛 직종 이름 적용 — 준용대상 16 직종을 현행 줄 「옛이름」 으로 옮김 · 엔진 통합 차례 없앰
- 인력.json — 원문 확인 대응만 현행 줄에 옛이름 칸 + 짧은 이력 비고 · 옮긴 준용대상 16 줄 삭제(48 → 32) · 절단공은 철근 작업 한 줄만 철근공으로 가름 - _키대장.json — 옮긴 16 키에 「폐기 → 새 키」 - 로직 5 파일 89 호표 줄 — 현행 직종 키로 갈음 · 줄 비고에 「옛이름: ○○」 - 엔진·틀·빌더·M01 — 값 → 준용 → 산정 차례 · 옛이름 칸 읽기 전용 · 이름 찾기에 옛이름 걸림 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JgUhN55Z3BCYhUJTjwTNfj
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
원문 = resources/knowledge/original/원가계산/노임단가_* (우리 md · ESTX 값 쓰지 않음).
|
||||
- 인력_엔지니어링노임 · 측량노임 · 건설사업관리노임 · SW노임 · 산림노임 — md 표 그대로 · 줄 수·값을 md 와 기계 대조.
|
||||
- 인력_준용대상 — 새 노임 직종과 이름이 온전히 같은 줄은 옮김(로직 참조도) · 비슷한 이름은 비고에 후보.
|
||||
건설노임 원문 「통합·명칭변경 직종」 목록의 옛 직종은 `통합` = 새 직종 ref(엔진이 그 값을 씀).
|
||||
건설노임 원문 「통합·명칭변경 직종」 목록의 옛 직종은 현행 줄 `옛이름` 으로 옮겼음(`_틀.md` 인력 값).
|
||||
- 인력_건설노임 미공표 — `산정` = {값(원 미만 처리 안 함) · 근거 · 마지막공표} · 원문 4-라.
|
||||
이음 = 원문 회차의 전체직종 평균을 그대로 이음(미공표직종_추적.md 4절) · 산정값은 같은 md 5절과 대조.
|
||||
|
||||
@@ -297,6 +297,11 @@ def main():
|
||||
old_pool = {r["이름"]: f"인력:{d['원문']}:{r['열쇠']}" for d in (wage, make) for r in d["줄"]}
|
||||
merges = merge_list()
|
||||
|
||||
applied = { # 현행 줄이 이미 품은 옛 직종명(`_틀.md` 인력 값 · 옛이름)
|
||||
name
|
||||
for r in json.loads((MD / "인력.json").read_text(encoding="utf-8"))["줄"]
|
||||
for name in (r.get("옛이름") or [])
|
||||
}
|
||||
alias_path = MD / "인력_준용대상.json"
|
||||
alias = mk.old_view(alias_path.name)
|
||||
moved, kept = {}, []
|
||||
@@ -306,22 +311,20 @@ def main():
|
||||
moved[f"인력:준용대상:{r['열쇠']}"] = pool[name]
|
||||
continue
|
||||
assert name not in old_pool, name
|
||||
if name in applied: # 이미 현행 줄 「옛이름」 으로 옮긴 직종 — 준용대상에 다시 만들지 않음
|
||||
continue
|
||||
r = {k: v for k, v in r.items() if k not in ("통합", "후보")}
|
||||
old = name.replace("스레이트", "슬레이트") # 원문 표기 「슬레이트공」
|
||||
new = merges.get(old, [])
|
||||
refs = [old_pool[n] for n in new if n in old_pool]
|
||||
if len(refs) == 1:
|
||||
r["통합"] = refs[0]
|
||||
elif refs:
|
||||
r["통합"] = None
|
||||
r["후보"] = "통합 갈림: " + " · ".join(new) + " — 관리자가 준용으로 고름"
|
||||
if [old_pool[n] for n in new if n in old_pool]:
|
||||
r["후보"] = "재료 갈림: " + " · ".join(new) + " — 관리자가 준용으로 고름"
|
||||
near = candidates(name, {**pool, **old_pool})
|
||||
if near and "후보" not in r:
|
||||
r["후보"] = "비슷한 이름: " + " · ".join(near)
|
||||
kept.append(r)
|
||||
alias["비고"] = (
|
||||
"값을 확인 못 한 직종(공표 노임에 이름이 온전히 같은 직종 없음) — 이름·단위만 · 준용 = 관리자가 고르는 공표 직종 키(`LB000123`)"
|
||||
" · 통합 = 건설노임 원문 「통합·명칭변경 직종」 목록의 새 직종(엔진이 그 값을 씀) · 후보 = 비슷한 이름(값 안 씀) · 비고 = 이 직종을 요구한 품셈 절"
|
||||
" · 후보 = 비슷한 이름(값 안 씀) · 비고 = 이 직종을 요구한 품셈 절"
|
||||
)
|
||||
head = {k: v for k, v in alias.items() if k != "줄"}
|
||||
dump_master(alias_path, head, kept)
|
||||
@@ -343,7 +346,7 @@ def main():
|
||||
f"준용대상 {len(alias['줄'])} → 옮김 {len(moved)} {sorted(moved.values())} · 남김 {len(kept)} · 로직 참조 {n_ref} 곳"
|
||||
)
|
||||
print(
|
||||
f" 통합 {sum(1 for r in kept if r.get('통합'))} · 통합 갈림 {sum(1 for r in kept if '통합 갈림' in str(r.get('후보')))} · 비슷한 이름 {sum(1 for r in kept if '비슷한' in str(r.get('후보')))}"
|
||||
f" 재료 갈림 {sum(1 for r in kept if '재료 갈림' in str(r.get('후보')))} · 비슷한 이름 {sum(1 for r in kept if '비슷한' in str(r.get('후보')))}"
|
||||
)
|
||||
|
||||
estimate(wage)
|
||||
|
||||
@@ -200,14 +200,14 @@ def _check_linked(where: str, row: dict) -> list[str]:
|
||||
|
||||
|
||||
def check_links(whole: mf.Master) -> list[str]:
|
||||
"""끊긴 키 — 품셈재료 연결 · 시중물가 조달 연결 · 인력 준용·통합·후보가 가리키는 줄."""
|
||||
"""끊긴 키 — 품셈재료 연결 · 시중물가 조달 연결 · 인력 준용·후보가 가리키는 줄."""
|
||||
out = []
|
||||
for key, row in whole.index.get("MP", {}).items():
|
||||
link = row.get("연결")
|
||||
if isinstance(link, str) and link not in whole.index.get("MT", {}):
|
||||
out.append(f"{whole.label(key)} · 연결 「{link}」 이 시중물가에 없음")
|
||||
for key, row in whole.index.get("LB", {}).items():
|
||||
for col in ("준용", "통합"):
|
||||
for col in ("준용",):
|
||||
ref = row.get(col)
|
||||
if ref not in (None, "") and str(ref) not in whole.index.get("LB", {}):
|
||||
out.append(f"{whole.label(key)} · {col} 「{ref}」 없는 인력 키")
|
||||
|
||||
@@ -260,15 +260,14 @@ class Master:
|
||||
return f"{row.get('키')} {row.get('이름') or row.get('원문번호')}"
|
||||
|
||||
def value(self, ref: str):
|
||||
"""요소 값 · 출처 글 — 값이 비면 준용(관리자가 고른 키) → 통합(원문 통합 직종 키) → 산정(원문 4-라) 차례."""
|
||||
"""요소 값 · 출처 글 — 값이 비면 준용(관리자가 고른 키) → 산정(원문 4-라) 차례."""
|
||||
row = self.get(ref)
|
||||
if row.get("값") is not None:
|
||||
return row.get("값"), None
|
||||
for col in ("준용", "통합"):
|
||||
alias = row.get(col)
|
||||
if alias not in (None, ""):
|
||||
target = self.get(str(alias))
|
||||
return target.get("값"), f"{col}: {target.get('이름') or alias}"
|
||||
alias = row.get("준용")
|
||||
if alias not in (None, ""):
|
||||
target = self.get(str(alias))
|
||||
return target.get("값"), f"준용: {target.get('이름') or alias}"
|
||||
guess = row.get("산정")
|
||||
if isinstance(guess, dict) and guess.get("값") is not None:
|
||||
return guess["값"], f"산정: 원문 4-라 · 마지막 공표 {guess.get('마지막공표')}"
|
||||
|
||||
@@ -154,7 +154,7 @@ def _read(path: Path, exact: bool = True) -> dict:
|
||||
|
||||
def old_view(name: str, folder: Path = MASTER) -> dict:
|
||||
"""옛 파일 이름으로 읽기(빌더용 · 수는 float) — 줄의 「열쇠」 = 원문번호 · 키·갈래 칸 뺌.
|
||||
준용·통합·연결 같은 참조는 키 그대로."""
|
||||
준용·연결 같은 참조는 키 그대로."""
|
||||
m = re.match(r"^(인력|기계)_(.+)\.json$", name)
|
||||
if m:
|
||||
file, slot, labels = MERGED[m.group(1)]
|
||||
@@ -187,8 +187,8 @@ def _old_ref(book: dict, text: str) -> str:
|
||||
|
||||
|
||||
def _convert(book: dict, row: dict, names: dict) -> dict:
|
||||
"""줄 속 옛 참조 — 준용·통합 · 후보 글(키 옆 이름) · 품셈재료 연결 · 시중물가 조달 나라장터 연결."""
|
||||
for col in ("준용", "통합"):
|
||||
"""줄 속 옛 참조 — 준용 · 후보 글(키 옆 이름) · 품셈재료 연결 · 시중물가 조달 나라장터 연결."""
|
||||
for col in ("준용",):
|
||||
value = row.get(col)
|
||||
if isinstance(value, str) and ":" in value:
|
||||
row[col] = _old_ref(book, value)
|
||||
|
||||
Reference in New Issue
Block a user