feat(master_data): 건설품셈 기계설비 1장 로직 19개 — 배관공사
- 강관·동관·스테인리스·주철관·경질관·연질관 접합 및 배관(일당 표는 시공량으로 나눠 m·개소당) - 고소작업대 시공(품 감산·시공량 가산) · 시공위치 요율 · TIG 가산은 입력 고르기 · 겹침은 공통 1-4-2 합산 - 공구손료 및 경장비 덧줄(인력품 %) · Brazing·TIG 소모재료 줄 · 재료_자체 3줄(플럭스·TIG 용접봉·아르곤가스) - 기계설비 1~6장 계수 표 열쇠를 「절 이름 계수」로 — 건축 계수 표와 열쇠 겹침(먼저 읽힌 건축 표가 잡히던 것) - check_master 로직 검사에 열쇠 겹침 · 시험 2개 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PAdA5ThqmtVSsbzjusk1cJ
This commit is contained in:
@@ -276,6 +276,19 @@ def check_logics(files: dict[str, dict], whole: mf.Master) -> list[str]:
|
||||
out += [f"{name} · {x}" for x in found]
|
||||
graph[f"{data.get('원문')}:{row.get('열쇠')}"] = calls
|
||||
out += [f"돌고 도는 참조 · {' → '.join(loop)}" for loop in mf.find_loops(graph)]
|
||||
return out + duplicate_keys(files)
|
||||
|
||||
|
||||
def duplicate_keys(files: dict[str, dict]) -> list[str]:
|
||||
"""같은 그룹·원문에 같은 열쇠 — 먼저 읽힌 파일 것만 찾기에 걸림"""
|
||||
first, out = {}, []
|
||||
for name, data in files.items():
|
||||
rows = data.get("표") if data.get("그룹") in mf.TABLE_GROUPS else data.get("줄")
|
||||
for row in rows or []:
|
||||
ref = f"{data.get('그룹')}:{data.get('원문')}:{row.get('열쇠')}"
|
||||
if ref in first and first[ref] != name:
|
||||
out.append(f"{name} · 열쇠 겹침 「{ref}」 — {first[ref]} 에도 있음")
|
||||
first.setdefault(ref, name)
|
||||
return out
|
||||
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"판": "2026",
|
||||
"표": [
|
||||
{
|
||||
"열쇠": "1-1-1 계수",
|
||||
"열쇠": "1-1-1 강관 용접접합 계수",
|
||||
"이름": "강관 용접접합 계수",
|
||||
"기준": "인력품",
|
||||
"출처": "건설품셈 기계설비 1-1-1",
|
||||
@@ -38,7 +38,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"열쇠": "1-1-2 계수",
|
||||
"열쇠": "1-1-2 강관 용접배관 계수",
|
||||
"이름": "강관 용접배관 계수",
|
||||
"기준": "본 품",
|
||||
"출처": "건설품셈 기계설비 1-1-2",
|
||||
@@ -80,7 +80,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"열쇠": "1-1-3 계수",
|
||||
"열쇠": "1-1-3 강관 나사식 접합 및 배관 계수",
|
||||
"이름": "강관 나사식 접합 및 배관 계수",
|
||||
"기준": "본 품",
|
||||
"출처": "건설품셈 기계설비 1-1-3",
|
||||
@@ -122,7 +122,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"열쇠": "1-1-4 계수",
|
||||
"열쇠": "1-1-4 강관 그루브조인트식 접합 및 배관 계수",
|
||||
"이름": "강관 그루브조인트식 접합 및 배관 계수",
|
||||
"기준": "본 품",
|
||||
"출처": "건설품셈 기계설비 1-1-4",
|
||||
@@ -164,7 +164,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"열쇠": "1-2-1 계수",
|
||||
"열쇠": "1-2-1 동관 용접접합 계수",
|
||||
"이름": "동관 용접접합 계수",
|
||||
"기준": "인력품",
|
||||
"출처": "건설품셈 기계설비 1-2-1",
|
||||
@@ -194,7 +194,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"열쇠": "1-2-2 계수",
|
||||
"열쇠": "1-2-2 동관 용접배관 계수",
|
||||
"이름": "동관 용접배관 계수",
|
||||
"기준": "인력품",
|
||||
"출처": "건설품셈 기계설비 1-2-2",
|
||||
@@ -236,7 +236,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"열쇠": "1-3-1 계수",
|
||||
"열쇠": "1-3-1 스테인리스 강관 용접접합 계수",
|
||||
"이름": "스테인리스 강관 용접접합 계수",
|
||||
"기준": "본 품",
|
||||
"출처": "건설품셈 기계설비 1-3-1",
|
||||
@@ -266,7 +266,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"열쇠": "1-3-2 계수",
|
||||
"열쇠": "1-3-2 스테인리스 강관 용접배관 계수",
|
||||
"이름": "스테인리스 강관 용접배관 계수",
|
||||
"기준": "본 품",
|
||||
"출처": "건설품셈 기계설비 1-3-2",
|
||||
@@ -308,7 +308,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"열쇠": "1-3-3 계수",
|
||||
"열쇠": "1-3-3 스테인리스 강관 그루브조인트식 접합 및 배관 계수",
|
||||
"이름": "스테인리스 강관 그루브조인트식 접합 및 배관 계수",
|
||||
"기준": "본 품",
|
||||
"출처": "건설품셈 기계설비 1-3-3",
|
||||
@@ -350,7 +350,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"열쇠": "1-3-4 계수",
|
||||
"열쇠": "1-3-4 스테인리스 강관 프레스식 접합 및 배관 계수",
|
||||
"이름": "스테인리스 강관 프레스식 접합 및 배관 계수",
|
||||
"기준": "인력품",
|
||||
"출처": "건설품셈 기계설비 1-3-4",
|
||||
@@ -392,7 +392,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"열쇠": "1-3-5 계수",
|
||||
"열쇠": "1-3-5 스테인리스 주름관 접합 및 배관 계수",
|
||||
"이름": "스테인리스 주름관 접합 및 배관 계수",
|
||||
"기준": "인력품",
|
||||
"출처": "건설품셈 기계설비 1-3-5",
|
||||
@@ -422,7 +422,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"열쇠": "1-4-1 계수",
|
||||
"열쇠": "1-4-1 주철관 기계식접합 및 배관 계수",
|
||||
"이름": "주철관 기계식접합 및 배관 계수",
|
||||
"기준": "인력품",
|
||||
"출처": "건설품셈 기계설비 1-4-1",
|
||||
@@ -452,7 +452,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"열쇠": "1-4-2 계수",
|
||||
"열쇠": "1-4-2 주철관 수밀밴드 접합 및 배관 계수",
|
||||
"이름": "주철관 수밀밴드 접합 및 배관 계수",
|
||||
"기준": "인력품",
|
||||
"출처": "건설품셈 기계설비 1-4-2",
|
||||
@@ -482,7 +482,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"열쇠": "1-5-1 계수",
|
||||
"열쇠": "1-5-1 경질관 접착제 접합 및 배관 계수",
|
||||
"이름": "경질관 접착제 접합 및 배관 계수",
|
||||
"기준": "인력품",
|
||||
"출처": "건설품셈 기계설비 1-5-1",
|
||||
@@ -512,7 +512,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"열쇠": "1-5-2 계수",
|
||||
"열쇠": "1-5-2 경질관 고무링 캡조임 접합 및 배관(일반 PVC) 계수",
|
||||
"이름": "경질관 고무링 캡조임 접합 및 배관(일반 PVC) 계수",
|
||||
"기준": "인력품",
|
||||
"출처": "건설품셈 기계설비 1-5-2",
|
||||
@@ -542,7 +542,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"열쇠": "1-5-3 계수",
|
||||
"열쇠": "1-5-3 경질관 고무링 캡조임 접합 및 배관(고강도PVC) 계수",
|
||||
"이름": "경질관 고무링 캡조임 접합 및 배관(고강도PVC) 계수",
|
||||
"기준": "인력품",
|
||||
"출처": "건설품셈 기계설비 1-5-3",
|
||||
@@ -572,7 +572,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"열쇠": "1-6-1 계수",
|
||||
"열쇠": "1-6-1 폴리부틸렌(PB) 일반접합 및 배관 계수",
|
||||
"이름": "폴리부틸렌(PB) 일반접합 및 배관 계수",
|
||||
"기준": "인력품",
|
||||
"출처": "건설품셈 기계설비 1-6-1",
|
||||
@@ -593,7 +593,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"열쇠": "1-6-2 계수",
|
||||
"열쇠": "1-6-2 폴리부틸렌(PB) 이중관 접합 및 배관 계수",
|
||||
"이름": "폴리부틸렌(PB) 이중관 접합 및 배관 계수",
|
||||
"기준": "인력품",
|
||||
"출처": "건설품셈 기계설비 1-6-2",
|
||||
@@ -614,7 +614,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"열쇠": "1-6-3 계수",
|
||||
"열쇠": "1-6-3 가교화 폴리에틸렌관 접합 및 배관 계수",
|
||||
"이름": "가교화 폴리에틸렌관 접합 및 배관 계수",
|
||||
"기준": "인력품",
|
||||
"출처": "건설품셈 기계설비 1-6-3",
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"판": "2026",
|
||||
"표": [
|
||||
{
|
||||
"열쇠": "2-1-1 계수",
|
||||
"열쇠": "2-1-1 아연도금강판덕트(각형덕트) 설치 계수",
|
||||
"이름": "아연도금강판덕트(각형덕트) 설치 계수",
|
||||
"기준": "",
|
||||
"출처": "건설품셈 기계설비 2-1-1",
|
||||
@@ -33,7 +33,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"열쇠": "2-1-2 계수",
|
||||
"열쇠": "2-1-2 아연도금강판덕트(스파이럴덕트) 설치 계수",
|
||||
"이름": "아연도금강판덕트(스파이럴덕트) 설치 계수",
|
||||
"기준": "",
|
||||
"출처": "건설품셈 기계설비 2-1-2",
|
||||
@@ -62,7 +62,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"열쇠": "2-1-3 계수",
|
||||
"열쇠": "2-1-3 스테인리스덕트(각형덕트) 설치 계수",
|
||||
"이름": "스테인리스덕트(각형덕트) 설치 계수",
|
||||
"기준": "",
|
||||
"출처": "건설품셈 기계설비 2-1-3",
|
||||
@@ -91,7 +91,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"열쇠": "2-1-4 계수",
|
||||
"열쇠": "2-1-4 PVC덕트 설치 계수",
|
||||
"이름": "PVC덕트 설치 계수",
|
||||
"기준": "인력품",
|
||||
"출처": "건설품셈 기계설비 2-1-4",
|
||||
@@ -112,7 +112,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"열쇠": "2-1-5 계수",
|
||||
"열쇠": "2-1-5 세대내 환기덕트 설치 계수",
|
||||
"이름": "세대내 환기덕트 설치 계수",
|
||||
"기준": "인력품",
|
||||
"출처": "건설품셈 기계설비 2-1-5",
|
||||
@@ -133,7 +133,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"열쇠": "2-2-6 계수",
|
||||
"열쇠": "2-2-6 제연댐퍼 설치 계수",
|
||||
"이름": "제연댐퍼 설치 계수",
|
||||
"기준": "인력품",
|
||||
"출처": "건설품셈 기계설비 2-2-6",
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"판": "2026",
|
||||
"표": [
|
||||
{
|
||||
"열쇠": "3-1-1 계수",
|
||||
"열쇠": "3-1-1 일반마감 배관보온 계수",
|
||||
"이름": "일반마감 배관보온 계수",
|
||||
"기준": "",
|
||||
"출처": "건설품셈 기계설비 3-1-1",
|
||||
@@ -41,7 +41,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"열쇠": "3-2-1 계수",
|
||||
"열쇠": "3-2-1 일반마감 밸브보온 계수",
|
||||
"이름": "일반마감 밸브보온 계수",
|
||||
"기준": "",
|
||||
"출처": "건설품셈 기계설비 3-2-1",
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"판": "2026",
|
||||
"표": [
|
||||
{
|
||||
"열쇠": "4-1-1 계수",
|
||||
"열쇠": "4-1-1 일반펌프 설치 계수",
|
||||
"이름": "일반펌프 설치 계수",
|
||||
"기준": "인력품",
|
||||
"출처": "건설품셈 기계설비 4-1-1",
|
||||
@@ -25,7 +25,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"열쇠": "4-1-2 계수",
|
||||
"열쇠": "4-1-2 집수정 배수펌프 설치 계수",
|
||||
"이름": "집수정 배수펌프 설치 계수",
|
||||
"기준": "인력품",
|
||||
"출처": "건설품셈 기계설비 4-1-2",
|
||||
@@ -46,7 +46,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"열쇠": "4-2-1 계수",
|
||||
"열쇠": "4-2-1 송풍기 설치 계수",
|
||||
"이름": "송풍기 설치 계수",
|
||||
"기준": "",
|
||||
"출처": "건설품셈 기계설비 4-2-1",
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"판": "2026",
|
||||
"표": [
|
||||
{
|
||||
"열쇠": "5-1-1 계수",
|
||||
"열쇠": "5-1-1 일반밸브 및 콕류 설치 계수",
|
||||
"이름": "일반밸브 및 콕류 설치 계수",
|
||||
"기준": "인력품",
|
||||
"출처": "건설품셈 기계설비 5-1-1",
|
||||
@@ -25,7 +25,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"열쇠": "5-1-2 계수",
|
||||
"열쇠": "5-1-2 감압밸브장치 설치 계수",
|
||||
"이름": "감압밸브장치 설치 계수",
|
||||
"기준": "",
|
||||
"출처": "건설품셈 기계설비 5-1-2",
|
||||
@@ -51,7 +51,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"열쇠": "5-2-1 계수",
|
||||
"열쇠": "5-2-1 스팀트랩 장치 설치 계수",
|
||||
"이름": "스팀트랩 장치 설치 계수",
|
||||
"기준": "인력품",
|
||||
"출처": "건설품셈 기계설비 5-2-1",
|
||||
@@ -72,7 +72,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"열쇠": "5-3-1 계수",
|
||||
"열쇠": "5-3-1 익스팬션조인트 설치 계수",
|
||||
"이름": "익스팬션조인트 설치 계수",
|
||||
"기준": "인력품",
|
||||
"출처": "건설품셈 기계설비 5-3-1",
|
||||
@@ -93,7 +93,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"열쇠": "5-3-2 계수",
|
||||
"열쇠": "5-3-2 플랙시블커넥터 설치 계수",
|
||||
"이름": "플랙시블커넥터 설치 계수",
|
||||
"기준": "인력품",
|
||||
"출처": "건설품셈 기계설비 5-3-2",
|
||||
@@ -114,7 +114,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"열쇠": "5-4-1 계수",
|
||||
"열쇠": "5-4-1 수격방지기 설치 계수",
|
||||
"이름": "수격방지기 설치 계수",
|
||||
"기준": "인력품",
|
||||
"출처": "건설품셈 기계설비 5-4-1",
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"판": "2026",
|
||||
"표": [
|
||||
{
|
||||
"열쇠": "6-1-1 계수",
|
||||
"열쇠": "6-1-1 유량계(직독식) 설치 계수",
|
||||
"이름": "유량계(직독식) 설치 계수",
|
||||
"기준": "",
|
||||
"출처": "건설품셈 기계설비 6-1-1",
|
||||
@@ -34,7 +34,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"열쇠": "6-1-2 계수",
|
||||
"열쇠": "6-1-2 유량계(원격식) 설치 계수",
|
||||
"이름": "유량계(원격식) 설치 계수",
|
||||
"기준": "인력품",
|
||||
"출처": "건설품셈 기계설비 6-1-2",
|
||||
@@ -55,7 +55,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"열쇠": "6-1-3 계수",
|
||||
"열쇠": "6-1-3 세대용 계량기함 설치 계수",
|
||||
"이름": "세대용 계량기함 설치 계수",
|
||||
"기준": "인력품",
|
||||
"출처": "건설품셈 기계설비 6-1-3",
|
||||
@@ -76,7 +76,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"열쇠": "6-2-1 계수",
|
||||
"열쇠": "6-2-1 세대용 적산열량계 설치 계수",
|
||||
"이름": "세대용 적산열량계 설치 계수",
|
||||
"기준": "인력품",
|
||||
"출처": "건설품셈 기계설비 6-2-1",
|
||||
@@ -97,7 +97,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"열쇠": "6-2-2 계수",
|
||||
"열쇠": "6-2-2 건물용 적산열량계 설치 계수",
|
||||
"이름": "건물용 적산열량계 설치 계수",
|
||||
"기준": "인력품",
|
||||
"출처": "건설품셈 기계설비 6-2-2",
|
||||
@@ -118,7 +118,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"열쇠": "6-2-3 계수",
|
||||
"열쇠": "6-2-3 산업용 적산열량계 설치 계수",
|
||||
"이름": "산업용 적산열량계 설치 계수",
|
||||
"기준": "인력품",
|
||||
"출처": "건설품셈 기계설비 6-2-3",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -180,6 +180,9 @@
|
||||
{"열쇠": "단열판", "이름": "단열판", "규격": "", "단위": "㎡", "값": null, "출처": "자체", "비고": "건설품셈 건축 5-4-9"},
|
||||
{"열쇠": "접착제 외벽단열용", "이름": "접착제", "규격": "외벽단열용", "단위": "㎏", "값": null, "출처": "자체", "비고": "건설품셈 건축 5-4-9"},
|
||||
{"열쇠": "표준보강메시", "이름": "표준보강메시", "규격": "", "단위": "㎡", "값": null, "출처": "자체", "비고": "건설품셈 건축 5-4-9"},
|
||||
{"열쇠": "고강도메시", "이름": "고강도메시", "규격": "", "단위": "㎡", "값": null, "출처": "자체", "비고": "건설품셈 건축 5-4-9"}
|
||||
{"열쇠": "고강도메시", "이름": "고강도메시", "규격": "", "단위": "㎡", "값": null, "출처": "자체", "비고": "건설품셈 건축 5-4-9"},
|
||||
{"열쇠": "플럭스(브레이징)", "이름": "플럭스", "규격": "브레이징용", "단위": "㎏", "값": null, "출처": "자체", "비고": "건설품셈 기계설비 1-2-1 · 원문 g"},
|
||||
{"열쇠": "TIG 용접봉(스테인리스)", "이름": "TIG 용접봉", "규격": "스테인리스", "단위": "㎏", "값": null, "출처": "자체", "비고": "건설품셈 기계설비 1-3-1"},
|
||||
{"열쇠": "아르곤가스", "이름": "아르곤가스", "규격": "", "단위": "ℓ", "값": null, "출처": "자체", "비고": "건설품셈 기계설비 1-3-1"}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -298,6 +298,36 @@ def test_견본_파일_검사_통과(whole):
|
||||
assert cm.check_logics(files, whole) == []
|
||||
|
||||
|
||||
def test_열쇠_겹침을_잡음():
|
||||
"""다른 부문 표와 같은 열쇠면 먼저 읽힌 표만 찾기에 걸림."""
|
||||
files = {
|
||||
"계수_건설품셈_건축1장.json": {
|
||||
"그룹": "계수",
|
||||
"원문": "건설품셈",
|
||||
"표": [{"열쇠": "1-1-1 계수"}],
|
||||
},
|
||||
"계수_건설품셈_기계설비1장.json": {
|
||||
"그룹": "계수",
|
||||
"원문": "건설품셈",
|
||||
"표": [{"열쇠": "1-1-1 계수"}],
|
||||
},
|
||||
}
|
||||
assert len(cm.duplicate_keys(files)) == 1
|
||||
assert cm.duplicate_keys(cm.load()) == []
|
||||
|
||||
|
||||
def test_기계설비_강관_용접배관(whole):
|
||||
"""1-1-2 관규격 15 · (배관공 3인 × 247,897 + 보통인부 1인 × 172,068) ÷ 83m · 기계경비 2%."""
|
||||
got = mf.run(
|
||||
whole,
|
||||
"건설품셈:1-1-2 강관 용접배관",
|
||||
{"관규격": 15, "시공방법": "인력시공", "시공위치": "옥내일반배관"},
|
||||
)
|
||||
labor = (3 * Decimal(247897) + Decimal(172068)) / 83
|
||||
assert cents(got["노무비"]) == cents(labor)
|
||||
assert cents(got["경비"]) == cents(labor * Decimal("0.02"))
|
||||
|
||||
|
||||
def test_로직_검사가_틀린_열쇠를_잡음(whole):
|
||||
row = {
|
||||
"열쇠": "시험",
|
||||
|
||||
Reference in New Issue
Block a user