knowledge(마스터): 되풀이 기호 바로잡기 · 미공표 산정 버림 · 자재품목 유류·원문번호 정리

되풀이 기호(〃 · ″ · " · 上同)
- 값·칸이름이 통째로 되풀이 기호인 자리 167 곳을 윗줄 값으로 — 단위 · 장비구분 · 장비명 · 항목 · 비고 · 재질
- 소요량 13-6-3 · 13-6-5 · 13-6-9 의 직종 칸 「〃」·「"」 는 윗줄 직종(플랜트제관공)으로 합치고 로직 식 8 곳도 함께
- 인력 LB000399(이름 「〃」)는 직종이 아니라 되풀이 기호 — 줄을 떼고 대장에 폐기
- 인치 기호(1/2〃 · ø12〃)와 설명 글 속 기호는 그대로

건설노임 미공표 산정
- 회차마다 증가율을 곱할 때 원 미만 버림 — 다산소프트와 같은 방식 · 값은 원 단위 정수
- 비고 「4-라 산정: 2025.9 210,772원 × 증가율(원 미만 버림)」
- 미공표직종_추적.md 5절 「단계마다 버림(채택)」 열을 채택으로 바꾸고 산정값(처리 없음)은 견주기용으로 남김

자재품목
- 유류 5줄(휘발유 · 경유 · 선박용경유 · 중유 · 등유) 뗌 — 값이 비고 글뿐 · 대장에 폐기 · 빌더도 뺌
- 품셈재료 중유(MP000359)는 미연결 — 중유는 받지 않기로 함 · 전력 2줄은 그대로 둠
- 원문번호(다산소프트 품번 M000…) 열 삭제 — 대조는 _키대장.json 에만
- 로직·품셈재료의 품번 참조 330 곳을 키로 · master_formula 는 「ID:키」 도 받음
- check_master · master_keys.stamp · M01 저장은 NO_NUMBER 테이블을 알아봄 · _틀.md · _화면_계약.md 도 맞춤

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JgUhN55Z3BCYhUJTjwTNfj
This commit is contained in:
2026-09-20 18:36:08 +09:00
co-authored by Claude Opus 5
parent b94e17ef80
commit 991b671c32
24 changed files with 24494 additions and 24472 deletions
+11 -4
View File
@@ -115,9 +115,9 @@ LABOR_COLS = (
LABOR_STATUS = ("공표", "산정", "미공표", "미확보")
# 원문별 열 한 벌 — 모든 줄이 이 칸을 이 차례로 가짐(없으면 null)
COLS = {
# 자재품목 — 원문번호(남의 품번)는 줄에 두지 않음 · 대조는 `_키대장.json` 에만
"자재품목": (
"",
"원문번호",
"구분",
"상세구분",
"이름",
@@ -241,10 +241,12 @@ def check_form(name: str, data: dict) -> list[str]:
else None
)
for row in rows:
key, number = str(row.get("")), str(row.get("원문번호"))
key, number = str(row.get("")), str(row.get("원문번호") or "")
where = f"{name} · {key} {row.get('이름') or number}"
if not mk.KEY.fullmatch(key) or key[:2] != tid:
out.append(f"{where} · 키 모양이 「{tid}」 + 6자리 아님")
if number and tid in mk.NO_NUMBER:
out.append(f"{where} · 원문번호는 줄에 두지 않음 — 대장에만")
if merged and row.get(merged) not in data.get(merged, {}):
out.append(f"{where} · {merged}{row.get(merged)}」 이 머리에 없음")
if number and mk.section_no(number) != number:
@@ -502,7 +504,7 @@ def duplicate_keys(files: dict[str, dict], book: dict | None = None) -> list[str
rows = data.get("") if data.get("그룹") in mf.TABLE_GROUPS else data.get("")
one_each = data.get("그룹") in ("인력", "재료")
for row in rows or []:
key, number = str(row.get("")), str(row.get("원문번호"))
key, number = str(row.get("")), str(row.get("원문번호") or "")
if key in first:
out.append(f"{name} · 키 겹침 「{key}」 — {first[key]} 에도 있음")
first.setdefault(key, name)
@@ -515,7 +517,12 @@ def duplicate_keys(files: dict[str, dict], book: dict | None = None) -> list[str
had = book[""].get(key)
if had is None:
out.append(f"{name} · {key} · 대장에 없는 키")
elif number not in (had["원문번호"], mk.section_no(had["원문번호"])):
continue
# 줄에 번호를 두지 않는 테이블(`mk.NO_NUMBER`)은 대조를 건너뜀
if key[:2] not in mk.NO_NUMBER and number not in (
had["원문번호"],
mk.section_no(had["원문번호"]),
):
out.append(f"{name} · {key} · 대장 원문번호 「{had['원문번호']}」 와 다름")
elif int(key[2:]) >= book["다음"].get(key[:2], 0):
out.append(f"{name} · {key} · 대장 다음 번호보다 큼")