feat(master_data): 건설품셈 토목 5장(강구조) 로직 9줄 · 범위규칙 「이상·이하」 · 자체 재료 4개

- 5-1 강교 제작: 기본공수 × 고강도강 보정 × 대형단품·부품계수 × 본체 보정(연속·총중량·사각/곡률 큰 값·높이 곡선) · 제경비 60%
- 5-1-3 기타재료(용접봉 · 산소 · LPG · 잡품 5% 이내) · 5-2 표면처리 둘 · 도장재료(도료 사용량 식 · 희석재 · 잡재료) · 도장
- 5-3 지조립(개소수 · 작업난이도) · 가설(단일거더 추가 · 확폭 차감 · 해상 인원) · 기타 부재 — 공구손료 요율 표
- 식 엔진: 범위규칙 「이상·이하」 읽음 · 규칙 글 뒤 괄호 설명은 뺌
- 계수 토목 5장: 조건 칸 이름 괄호·빈칸 정리 · 부품계수 범위규칙 「초과·이하」(150㎏ 한 점 어긋남 글로 적음)
- 막힘: 제작도 작성 중급숙련기술자(건설노임 요소 없음) · 5-1-3 재료 수량 기준(돈 로직 아님)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JgUhN55Z3BCYhUJTjwTNfj
This commit is contained in:
2026-09-19 18:56:37 +09:00
co-authored by Claude Opus 5
parent 87c4fd8446
commit 869511a685
5 changed files with 728 additions and 45 deletions
@@ -255,6 +255,9 @@ def _match(table: dict, row: dict, cond: str, want) -> bool:
if table.get("조건", {}).get(cond) == "범위":
low, high = have
rule, *more = table.get("범위규칙", "초과·이하").split(" · ")
rule = rule.split(" (")[0] # 「이상·미만 (원문 …)」 — 괄호 설명은 뺌
if rule == "이상·이하":
return (low is None or want >= low) and (high is None or want <= high)
if rule == "초과·이하":
return (low is None or want > low) and (high is None or want <= high)
if rule == "이상·미만":
@@ -101,7 +101,7 @@
"기준": "",
"출처": "건설품셈 토목 5-1-2",
"조건": {
"대형단품 평균중량 a(ton)": "범위"
"대형단품평균중량": "범위"
},
"값칸": {
"대형단품계수": "수"
@@ -109,28 +109,28 @@
"범위규칙": "이상·미만",
"줄": [
{
"대형단품 평균중량 a(ton)": [
"대형단품평균중량": [
null,
10
],
"대형단품계수": 1.0
},
{
"대형단품 평균중량 a(ton)": [
"대형단품평균중량": [
10,
15
],
"대형단품계수": 0.97
},
{
"대형단품 평균중량 a(ton)": [
"대형단품평균중량": [
15,
20
],
"대형단품계수": 0.92
},
{
"대형단품 평균중량 a(ton)": [
"대형단품평균중량": [
20,
null
],
@@ -151,29 +151,29 @@
"기준": "",
"출처": "건설품셈 토목 5-1-2",
"조건": {
"부품 평균중량 b(㎏)": "범위"
"부품평균중량": "범위"
},
"값칸": {
"부품계수": "수"
},
"범위규칙": "첫 줄 100 이하 · 가운뎃줄 100 초과 150 미만 · 끝줄 150 이상",
"범위규칙": "초과·이하 · 원문 첫 줄 100 이하 · 가운뎃줄 100 초과 150 미만 · 끝줄 150 이상 — 150 한 점만 가운뎃줄로 읽힘",
"줄": [
{
"부품 평균중량 b(㎏)": [
"부품평균중량": [
null,
100
],
"부품계수": 1.00
},
{
"부품 평균중량 b(㎏)": [
"부품평균중량": [
100,
150
],
"부품계수": 0.95
},
{
"부품 평균중량 b(㎏)": [
"부품평균중량": [
150,
null
],
@@ -287,7 +287,7 @@
"출처": "건설품셈 토목 5-1-2",
"조건": {
"형식": "고르기",
"총중량(톤)": "범위"
"총중량": "범위"
},
"값칸": {
"증감계수": "수"
@@ -296,7 +296,7 @@
"줄": [
{
"형식": "플레이트거더",
"총중량(톤)": [
"총중량": [
null,
100
],
@@ -304,7 +304,7 @@
},
{
"형식": "플레이트거더",
"총중량(톤)": [
"총중량": [
100,
300
],
@@ -312,7 +312,7 @@
},
{
"형식": "플레이트거더",
"총중량(톤)": [
"총중량": [
300,
500
],
@@ -320,7 +320,7 @@
},
{
"형식": "플레이트거더",
"총중량(톤)": [
"총중량": [
500,
1000
],
@@ -328,7 +328,7 @@
},
{
"형식": "플레이트거더",
"총중량(톤)": [
"총중량": [
1000,
null
],
@@ -336,7 +336,7 @@
},
{
"형식": "박스거더",
"총중량(톤)": [
"총중량": [
null,
100
],
@@ -344,7 +344,7 @@
},
{
"형식": "박스거더",
"총중량(톤)": [
"총중량": [
100,
300
],
@@ -352,7 +352,7 @@
},
{
"형식": "박스거더",
"총중량(톤)": [
"총중량": [
300,
500
],
@@ -360,7 +360,7 @@
},
{
"형식": "박스거더",
"총중량(톤)": [
"총중량": [
500,
1000
],
@@ -368,7 +368,7 @@
},
{
"형식": "박스거더",
"총중량(톤)": [
"총중량": [
1000,
null
],
@@ -376,7 +376,7 @@
},
{
"형식": "기타형식",
"총중량(톤)": [
"총중량": [
null,
100
],
@@ -384,7 +384,7 @@
},
{
"형식": "기타형식",
"총중량(톤)": [
"총중량": [
100,
300
],
@@ -392,7 +392,7 @@
},
{
"형식": "기타형식",
"총중량(톤)": [
"총중량": [
300,
500
],
@@ -400,7 +400,7 @@
},
{
"형식": "기타형식",
"총중량(톤)": [
"총중량": [
500,
1000
],
@@ -408,7 +408,7 @@
},
{
"형식": "기타형식",
"총중량(톤)": [
"총중량": [
1000,
null
],
@@ -426,7 +426,7 @@
"출처": "건설품셈 토목 5-1-2",
"조건": {
"형식": "고르기",
"사각(°)": "범위"
"사각": "범위"
},
"값칸": {
"증감계수": "수"
@@ -435,7 +435,7 @@
"줄": [
{
"형식": "박스거더이외의형식",
"사각(°)": [
"사각": [
85,
null
],
@@ -443,7 +443,7 @@
},
{
"형식": "박스거더이외의형식",
"사각(°)": [
"사각": [
75,
85
],
@@ -451,7 +451,7 @@
},
{
"형식": "박스거더이외의형식",
"사각(°)": [
"사각": [
45,
75
],
@@ -459,7 +459,7 @@
},
{
"형식": "박스거더이외의형식",
"사각(°)": [
"사각": [
null,
45
],
@@ -467,7 +467,7 @@
},
{
"형식": "박스거더",
"사각(°)": [
"사각": [
85,
null
],
@@ -475,7 +475,7 @@
},
{
"형식": "박스거더",
"사각(°)": [
"사각": [
75,
85
],
@@ -483,7 +483,7 @@
},
{
"형식": "박스거더",
"사각(°)": [
"사각": [
45,
75
],
@@ -491,7 +491,7 @@
},
{
"형식": "박스거더",
"사각(°)": [
"사각": [
null,
45
],
@@ -509,7 +509,7 @@
"출처": "건설품셈 토목 5-1-2",
"조건": {
"형식": "고르기",
"곡률반경 R(m)": "범위"
"곡률반경": "범위"
},
"값칸": {
"증감계수": "수"
@@ -518,7 +518,7 @@
"줄": [
{
"형식": "박스거더이외의형식",
"곡률반경 R(m)": [
"곡률반경": [
500,
null
],
@@ -526,7 +526,7 @@
},
{
"형식": "박스거더이외의형식",
"곡률반경 R(m)": [
"곡률반경": [
250,
500
],
@@ -534,7 +534,7 @@
},
{
"형식": "박스거더이외의형식",
"곡률반경 R(m)": [
"곡률반경": [
100,
250
],
@@ -542,7 +542,7 @@
},
{
"형식": "박스거더이외의형식",
"곡률반경 R(m)": [
"곡률반경": [
null,
100
],
@@ -550,7 +550,7 @@
},
{
"형식": "박스거더",
"곡률반경 R(m)": [
"곡률반경": [
500,
null
],
@@ -558,7 +558,7 @@
},
{
"형식": "박스거더",
"곡률반경 R(m)": [
"곡률반경": [
250,
500
],
@@ -566,7 +566,7 @@
},
{
"형식": "박스거더",
"곡률반경 R(m)": [
"곡률반경": [
100,
250
],
@@ -574,7 +574,7 @@
},
{
"형식": "박스거더",
"곡률반경 R(m)": [
"곡률반경": [
null,
100
],
@@ -0,0 +1,656 @@
{
"그룹": "로직",
"원문": "건설품셈",
"판": "2026",
"줄": [
{
"열쇠": "5-1-1 기본제작공수",
"이름": "강교 제작",
"결과단위": "원/ton",
"출처": "건설품셈 토목 5-1-1",
"소유": "공용",
"입력": [
{ "이름": "형식", "고르기": ["플레이트거더", "박스거더", "강바닥판 플레이트거더", "강바닥판 박스거더", "트러스", "아치", "라멘"] },
{ "이름": "고강도강비율", "단위": "", "범위": [0, 1], "출처": "건설품셈 토목 5-1-2 고강도강재 상당품 비율" },
{ "이름": "대형단품평균중량", "단위": "ton", "출처": "건설품셈 토목 5-1-2 대형단품계수" },
{ "이름": "부품평균중량", "단위": "㎏", "출처": "건설품셈 토목 5-1-2 부품계수" },
{ "이름": "연수", "단위": "연", "출처": "건설품셈 토목 5-1-2 증감계수 a" },
{ "이름": "총중량", "단위": "ton", "출처": "건설품셈 토목 5-1-2 증감계수 b" },
{ "이름": "사각", "단위": "°", "출처": "건설품셈 토목 5-1-2 증감계수 c" },
{ "이름": "곡률반경", "단위": "m", "출처": "건설품셈 토목 5-1-2 증감계수 d" },
{ "이름": "높이곡선변화", "고르기": ["없음", "있음"], "출처": "건설품셈 토목 5-1-2 증감계수 e" }
],
"중간": [
{
"이름": "고강도보정",
"식": "1 + 찾기(계수:건설품셈:5-1-2 영향계수, 형식=만약(형식 == '플레이트거더' 또는 형식 == '강바닥판 플레이트거더', '플레이트거더', '상기 이외의 형식'), 강종='SM 460, HSB 460').영향계수 * 고강도강비율",
"출처": "건설품셈 토목 5-1-2 영향계수"
},
{ "이름": "대형단품계수", "식": "찾기(계수:건설품셈:5-1-2 대형단품계수, 대형단품평균중량=대형단품평균중량).대형단품계수", "출처": "건설품셈 토목 5-1-2" },
{ "이름": "부품계수", "식": "찾기(계수:건설품셈:5-1-2 부품계수, 부품평균중량=부품평균중량).부품계수", "출처": "건설품셈 토목 5-1-2" },
{ "이름": "증감a", "식": "만약(연수 < 2, 0, 찾기(계수:건설품셈:5-1-2 연속 증감계수, 연수=연수).증감계수)", "출처": "건설품셈 토목 5-1-2 a" },
{
"이름": "증감b",
"식": "찾기(계수:건설품셈:5-1-2 총중량 증감계수, 형식=만약(형식 == '플레이트거더' 또는 형식 == '강바닥판 플레이트거더', '플레이트거더', 만약(형식 == '박스거더' 또는 형식 == '강바닥판 박스거더', '박스거더', '기타형식')), 총중량=총중량).증감계수",
"출처": "건설품셈 토목 5-1-2 b"
},
{
"이름": "증감cd",
"식": "최대(찾기(계수:건설품셈:5-1-2 사각 증감계수, 형식=만약(형식 == '박스거더' 또는 형식 == '강바닥판 박스거더', '박스거더', '박스거더이외의형식'), 사각=사각).증감계수, 찾기(계수:건설품셈:5-1-2 곡률 증감계수, 형식=만약(형식 == '박스거더' 또는 형식 == '강바닥판 박스거더', '박스거더', '박스거더이외의형식'), 곡률반경=곡률반경).증감계수)",
"출처": "건설품셈 토목 5-1-2 c · d"
},
{
"이름": "증감e",
"식": "만약(높이곡선변화 == '없음', 0, 찾기(계수:건설품셈:5-1-2 거더 높이 증감계수, 형식=만약(형식 == '박스거더' 또는 형식 == '강바닥판 박스거더', '박스거더', '박스거더이외의형식')).증감계수)",
"출처": "건설품셈 토목 5-1-2 e"
},
{ "이름": "본체보정", "식": "1 + 증감a + 증감b + 증감cd + 증감e", "출처": "건설품셈 토목 5-1-2" }
],
"호표": [
{
"종류": "인력",
"요소": "인력:건설노임:1010",
"이름": "철판공",
"단위": "인",
"수량": "찾기(소요량:건설품셈:5-1-1 기본제작공수, 형식=형식).철판공 * 고강도보정 * 대형단품계수 * 부품계수 * 본체보정",
"비목": "노무비"
},
{
"종류": "인력",
"요소": "인력:건설노임:1012",
"이름": "용접공",
"단위": "인",
"수량": "찾기(소요량:건설품셈:5-1-1 기본제작공수, 형식=형식).용접공 * 고강도보정 * 대형단품계수 * 부품계수 * 본체보정",
"비목": "노무비"
},
{
"종류": "인력",
"요소": "인력:건설노임:1009",
"이름": "철공",
"단위": "인",
"수량": "찾기(소요량:건설품셈:5-1-1 기본제작공수, 형식=형식).가조립_철공 * 대형단품계수 * 본체보정",
"비목": "노무비"
}
],
"덧줄": [
{
"이름": "공장제작 제경비",
"식": "((찾기(소요량:건설품셈:5-1-1 기본제작공수, 형식=형식).철판공 * 고강도보정 * 대형단품계수 * 부품계수 * 본체보정) * 인력:건설노임:1010 + (찾기(소요량:건설품셈:5-1-1 기본제작공수, 형식=형식).용접공 * 고강도보정 * 대형단품계수 * 부품계수 * 본체보정) * 인력:건설노임:1012 + (찾기(소요량:건설품셈:5-1-1 기본제작공수, 형식=형식).가조립_철공 * 대형단품계수 * 본체보정) * 인력:건설노임:1009) * 찾기(계수:건설품셈:5-1-1 제경비, 항목='공장제작 제경비').비율 / 100",
"비목": "경비",
"출처": "건설품셈 토목 5-1-1 주⑤"
}
],
"끝수": null,
"비고": "제작공수 = (절단·용접·단품 공수 × 고강도강 보정 × 대형단품계수 × 부품계수 + 가조립 공수 × 대형단품계수) × 본체 보정계수(5-1-2) · 해석: 강바닥판 플레이트거더·박스거더는 영향계수·증감계수에서 플레이트거더·박스거더로 봄 · 고강도강 SM 460·HSB 460 만 · 연수 1 이하면 증감계수 a 0 · 상하행선 분리면 연수 2배(설계자 입력) · 직선교는 곡률반경 500 이상 입력 · 높이 곡선변화 구간 곡률 500m 이상이면 「없음」 · 부품계수 150㎏ 한 점은 가운뎃줄(0.95)로 읽힘 — 원문 끝줄(0.9) · 제경비 = 표준제작공수 60%(주⑤) — 산재보험료·기타경비·간접노무비·일반관리비·이윤 제외 · 막힘: 제작도 작성(5-1-3 주①) 빠짐 — 건설노임에 「중급숙련기술자」 요소 없음"
},
{
"열쇠": "5-1-3 기타재료 소요량",
"이름": "강교 제작 기타재료",
"결과단위": "원/ton",
"출처": "건설품셈 토목 5-1-3",
"소유": "공용",
"입력": [{ "이름": "잡품", "단위": "%", "범위": [0, 5], "출처": "건설품셈 토목 5-1-3 주②" }],
"중간": [],
"호표": [
{
"종류": "재료",
"요소": "재료:자체:강교 용접봉",
"이름": "용접봉(강교 제작)",
"단위": "㎏",
"수량": "찾기(소요량:건설품셈:5-1-3 기타재료 소요량, 품명='용접봉').수량",
"비목": "재료비",
"출처": "건설품셈 토목 5-1-3"
},
{
"종류": "재료",
"요소": "재료:나라장터자재:20204084",
"이름": "산소가스",
"단위": "L",
"수량": "찾기(소요량:건설품셈:5-1-3 기타재료 소요량, 품명='산소').수량 * 1000",
"비목": "재료비",
"출처": "건설품셈 토목 5-1-3"
},
{
"종류": "재료",
"요소": "재료:나라장터자재:20204251",
"이름": "LPG(건설용)",
"단위": "kg",
"수량": "찾기(소요량:건설품셈:5-1-3 기타재료 소요량, 품명='LPG가스').수량",
"비목": "재료비",
"출처": "건설품셈 토목 5-1-3"
}
],
"덧줄": [
{
"이름": "잡품·기타",
"식": "(찾기(소요량:건설품셈:5-1-3 기타재료 소요량, 품명='용접봉').수량 * 재료:자체:강교 용접봉 + 찾기(소요량:건설품셈:5-1-3 기타재료 소요량, 품명='산소').수량 * 1000 * 재료:나라장터자재:20204084 + 찾기(소요량:건설품셈:5-1-3 기타재료 소요량, 품명='LPG가스').수량 * 재료:나라장터자재:20204251) * 잡품 / 100",
"비목": "재료비",
"출처": "건설품셈 토목 5-1-3 주②"
}
],
"끝수": null,
"비고": "해석: 산소 ㎥ = 나라장터 산소가스 L × 1,000 · 잡품·기타 용접 재료비 5% 이내 — 설계자 입력(아니면 0) · 검사시험비 별도(주③) · 강판 재료 손실량 6% 이내(5-1-3)는 재료 수량 몫 · 공시에 없는 재료 = 재료_자체"
},
{
"열쇠": "5-2-1 소재 표면처리",
"이름": "강교 소재 표면처리",
"결과단위": "원/㎡",
"출처": "건설품셈 토목 5-2-1",
"소유": "공용",
"입력": [],
"중간": [],
"호표": [
{
"종류": "인력",
"요소": "인력:건설노임:1029",
"이름": "도장공",
"단위": "인",
"수량": "찾기(소요량:건설품셈:5-2-1 소재 표면처리, 구분='도장공').수량",
"비목": "노무비"
},
{
"종류": "재료",
"요소": "재료:자체:철구(Shot ball)",
"이름": "철구(Shot ball)",
"단위": "㎏",
"수량": "찾기(소요량:건설품셈:5-2-1 소재 표면처리, 구분='철구(Shot ball)').수량",
"비목": "재료비",
"출처": "건설품셈 토목 5-2-1"
},
{
"종류": "재료",
"요소": "재료:자체:무기질아연말샵프라이머",
"이름": "무기질아연말 샵프라이머 도막두께 20μm",
"단위": "",
"수량": "찾기(소요량:건설품셈:5-2-1 소재 표면처리, 구분='무기질아연말샵프라이머', 규격='도막두께20μm').수량",
"비목": "재료비",
"출처": "건설품셈 토목 5-2-1"
}
],
"덧줄": [],
"끝수": null,
"비고": "공장 Shot Blasting · 전처리프라이머(5-2-2 주①) · 인력품에 공장경비 포함 · 재료 할증 포함 · 공시에 없는 재료 = 재료_자체"
},
{
"열쇠": "5-2-2 제품 표면처리",
"이름": "강교 제품 표면처리",
"결과단위": "원/㎡",
"출처": "건설품셈 토목 5-2-2",
"소유": "공용",
"입력": [{ "이름": "면", "고르기": ["외면", "BOX 형상 내면"], "출처": "건설품셈 토목 5-2-2 비고" }],
"중간": [],
"호표": [
{
"종류": "인력",
"요소": "인력:건설노임:1029",
"이름": "도장공",
"단위": "인",
"수량": "찾기(소요량:건설품셈:5-2-2 제품 표면처리, 구분='도장공').수량 * 만약(면 == '외면', 1, 1 + 찾기(계수:건설품셈:5-2-2 BOX 내면 할증, 항목='BOX 형상의 내면').할증률 / 100)",
"비목": "노무비"
},
{
"종류": "재료",
"요소": "재료:자체:철편(Grit)",
"이름": "철편(Grit)",
"단위": "㎏",
"수량": "찾기(소요량:건설품셈:5-2-2 제품 표면처리, 구분='철편(Grit)').수량",
"비목": "재료비",
"출처": "건설품셈 토목 5-2-2"
}
],
"덧줄": [],
"끝수": null,
"비고": "도장 전 Grit Blasting · SSPC SP10(주①②) · BOX 내면 인력품 60% 할증(비고) · 공시에 없는 재료 = 재료_자체"
},
{
"열쇠": "5-2-3 도장재료 사용량",
"이름": "강교 도장재료",
"결과단위": "원/㎡",
"출처": "건설품셈 토목 5-2-3",
"소유": "공용",
"입력": [
{
"이름": "도료종별",
"고르기": ["무기질 아연말계 도료", "에폭시계 방청도료", "고고형분 에폭시계도료", "우레탄계 도료", "불소수지계 도료", "실록산계 도료", "세라믹계 방식도료", "세라믹계 우레탄도료"],
"출처": "건설품셈 토목 5-2-3 주①"
},
{ "이름": "도장구분", "고르기": ["공장도장", "현장도장"], "출처": "건설품셈 토목 5-2-3 주①" },
{ "이름": "도장", "고르기": ["하도", "중·상도"], "출처": "건설품셈 토목 5-2-3 주①" },
{ "이름": "도막두께", "단위": "μm", "출처": "건설품셈 토목 5-2-3" },
{ "이름": "도료단가", "단위": "원/", "출처": "건설품셈 토목 5-2-3" },
{ "이름": "희석재단가", "단위": "원/", "출처": "건설품셈 토목 5-2-3" }
],
"중간": [
{
"이름": "도료량",
"식": "도막두께 / (찾기(계수:건설품셈:5-2-3 고형분용적비, 도료종별=도료종별).고형분용적비 * 10) / (1 - 찾기(계수:건설품셈:5-2-3 손실률, 구분=도장구분, 도장=도장).손실률 / 100)",
"출처": "건설품셈 토목 5-2-3"
},
{ "이름": "희석재량", "식": "도료량 * 찾기(계수:건설품셈:5-2-3 희석재, 항목='희석재').비율 / 100", "출처": "건설품셈 토목 5-2-3" }
],
"호표": [],
"덧줄": [
{ "이름": "도료", "식": "도료량 * 도료단가", "비목": "재료비", "출처": "건설품셈 토목 5-2-3" },
{ "이름": "희석재", "식": "희석재량 * 희석재단가", "비목": "재료비", "출처": "건설품셈 토목 5-2-3" },
{
"이름": "잡재료",
"식": "(도료량 * 도료단가 + 희석재량 * 희석재단가) * 찾기(계수:건설품셈:5-2-3 잡재료, 항목='잡재료').비율 / 100",
"비목": "재료비",
"출처": "건설품셈 토목 5-2-3 주②"
}
],
"끝수": null,
"비고": "도료 사용량 = 도막두께 ÷ (고형분용적비×10) ÷ (1−손실률) ℓ/㎡ · 희석재 25% · 잡재료 10%(주②) · 도료·희석재는 종류가 많아 단가를 설계자 입력 · 고형분용적비는 제작사 따라 바뀜(주①)"
},
{
"열쇠": "5-2-4 도장",
"이름": "강교 도장(1회)",
"결과단위": "원/㎡",
"출처": "건설품셈 토목 5-2-4",
"소유": "공용",
"입력": [
{ "이름": "도장구분", "고르기": ["공장도장", "현장도장"], "출처": "건설품셈 토목 5-2-4" },
{ "이름": "면", "고르기": ["외면", "박스거더 내면"], "출처": "건설품셈 토목 5-2-4 주③" }
],
"중간": [
{
"이름": "도장면적",
"식": "만약(도장구분 == '공장도장', 찾기(소요량:건설품셈:5-2-4 도장, 구분='도장공').공장도장도장면적, 찾기(소요량:건설품셈:5-2-4 도장, 구분='도장공').현장도장도장면적) * 만약(면 == '외면', 1, 1 - 찾기(계수:건설품셈:5-2-4 내면 도장, 항목='박스거더 내면 도장과 같은 내면 도장').할감률 / 100)",
"출처": "건설품셈 토목 5-2-4"
}
],
"호표": [
{
"종류": "인력",
"요소": "인력:건설노임:1029",
"이름": "도장공",
"단위": "인",
"수량": "만약(도장구분 == '공장도장', 찾기(소요량:건설품셈:5-2-4 도장, 구분='도장공').공장도장수량, 찾기(소요량:건설품셈:5-2-4 도장, 구분='도장공').현장도장수량) / 도장면적",
"비목": "노무비"
},
{
"종류": "인력",
"요소": "인력:건설노임:1003",
"이름": "특별인부",
"단위": "인",
"수량": "만약(도장구분 == '공장도장', 찾기(소요량:건설품셈:5-2-4 도장, 구분='특별인부').공장도장수량, 찾기(소요량:건설품셈:5-2-4 도장, 구분='특별인부').현장도장수량) / 도장면적",
"비목": "노무비"
}
],
"덧줄": [
{
"이름": "공구손료 및 경장비",
"식": "((만약(도장구분 == '공장도장', 찾기(소요량:건설품셈:5-2-4 도장, 구분='도장공').공장도장수량, 찾기(소요량:건설품셈:5-2-4 도장, 구분='도장공').현장도장수량) / 도장면적) * 인력:건설노임:1029 + (만약(도장구분 == '공장도장', 찾기(소요량:건설품셈:5-2-4 도장, 구분='특별인부').공장도장수량, 찾기(소요량:건설품셈:5-2-4 도장, 구분='특별인부').현장도장수량) / 도장면적) * 인력:건설노임:1003) * 만약(도장구분 == '현장도장', 찾기(계수:건설품셈:5-2-4 현장도장 경장비, 항목='현장도장 공구손료 및 경장비').비율, 0) / 100",
"비목": "경비",
"출처": "건설품셈 토목 5-2-4 주⑥"
}
],
"끝수": null,
"비고": "해석: 인력품 = 인력 호표 줄 금액 합(기계 조종원 제외) · 해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 도장 1회 · 신설교량(주①) · 공장도장 인력품에 공장경비 포함(주②) · 내면 도장 일당 도장면적 33% 할감(주③) · 현장도장만 공구손료·경장비 5%(주⑥)"
},
{
"열쇠": "5-3-1 강재거더 지조립",
"이름": "강재거더 지조립",
"결과단위": "원/개소",
"출처": "건설품셈 토목 5-3-1",
"소유": "공용",
"입력": [
{ "이름": "형식", "고르기": ["개구제형", "폐합형"], "출처": "건설품셈 토목 5-3-1" },
{ "이름": "지조립장", "고르기": ["불량", "보통", "양호"], "출처": "건설품셈 토목 5-3-1 주④" },
{
"이름": "크레인",
"고르기": [
"2104-0010",
"2104-0015",
"2104-0020",
"2104-0025",
"2104-0030",
"2104-0035",
"2104-0040",
"2104-0045",
"2104-0050",
"2104-0060",
"2104-0070",
"2104-0080",
"2104-0100",
"2104-0130",
"2104-0160",
"2104-0200",
"2104-0220",
"2104-0250",
"2104-0300"
]
},
{
"이름": "지역",
"고르기": [
"전국평균",
"전국",
"서울",
"경기",
"강원",
"충북",
"충남",
"전북",
"경북",
"경남",
"부산",
"제주",
"대구",
"인천",
"대전",
"울산",
"세종",
"전남광주"
],
"출처": "건설품셈 공통 8-1-7 5"
}
],
"중간": [
{
"이름": "시공량",
"식": "만약(형식 == '개구제형', 찾기(소요량:건설품셈:5-3-1 강재거더 지조립, 구분='인력', 품목='철공').기본조립개소수개구제형, 찾기(소요량:건설품셈:5-3-1 강재거더 지조립, 구분='인력', 품목='철공').기본조립개소수폐합형) + 만약(지조립장 == '보통', 0, 찾기(소요량:건설품셈:5-3-1 작업난이도, 구분=지조립장).작업난이도)",
"출처": "건설품셈 토목 5-3-1 주④"
}
],
"호표": [
{
"종류": "인력",
"요소": "인력:건설노임:1009",
"이름": "철공",
"단위": "인",
"수량": "찾기(소요량:건설품셈:5-3-1 강재거더 지조립, 구분='인력', 품목='철공').수량 / 시공량",
"비목": "노무비"
},
{
"종류": "인력",
"요소": "인력:건설노임:1003",
"이름": "특별인부",
"단위": "인",
"수량": "찾기(소요량:건설품셈:5-3-1 강재거더 지조립, 구분='인력', 품목='특별인부').수량 / 시공량",
"비목": "노무비"
},
{
"종류": "로직",
"요소": "로직(건설품셈:8 기계 시간당 경비, 기계=크레인, 지역=지역)",
"이름": "크레인",
"단위": "시간",
"수량": "찾기(소요량:건설품셈:5-3-1 강재거더 지조립, 구분='장비', 품목='크레인', 규격='100~300ton').수량 * 8 / 시공량"
}
],
"덧줄": [
{
"이름": "공구손료 및 경장비",
"식": "((찾기(소요량:건설품셈:5-3-1 강재거더 지조립, 구분='인력', 품목='철공').수량 / 시공량) * 인력:건설노임:1009 + (찾기(소요량:건설품셈:5-3-1 강재거더 지조립, 구분='인력', 품목='특별인부').수량 / 시공량) * 인력:건설노임:1003) * 찾기(계수:건설품셈:5-3-1 경장비, 형식=형식).비율 / 100",
"비목": "경비",
"출처": "건설품셈 토목 5-3-1 주⑧"
}
],
"끝수": null,
"비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 크레인 원문 100~300ton — 작업여건 따라 설계자 고름 · 작업난이도 불량 −1 · 양호 +1 개소(주④) · 지조립장 조성·가설 벤트 제외(주⑤) · 해석: 인력품 = 인력 호표 줄 금액 합(기계 조종원 제외)"
},
{
"열쇠": "5-3-2 강재거더 가설",
"이름": "강재거더 가설",
"결과단위": "원/개",
"출처": "건설품셈 토목 5-3-2",
"소유": "공용",
"입력": [
{ "이름": "형식", "고르기": ["개구제형", "폐합형"], "출처": "건설품셈 토목 5-3-2" },
{ "이름": "장소", "고르기": ["육상", "해상"], "출처": "건설품셈 토목 5-3-2 주⑥" },
{ "이름": "단일거더", "고르기": ["아님", "지조립 없이 단일거더 직접 인양"], "출처": "건설품셈 토목 5-3-2 주②" },
{ "이름": "확폭등", "고르기": ["아님", "확폭·과도교·과선교 지하 통로내"], "출처": "건설품셈 토목 5-3-2 주⑤" },
{
"이름": "크레인",
"고르기": [
"2104-0010",
"2104-0015",
"2104-0020",
"2104-0025",
"2104-0030",
"2104-0035",
"2104-0040",
"2104-0045",
"2104-0050",
"2104-0060",
"2104-0070",
"2104-0080",
"2104-0100",
"2104-0130",
"2104-0160",
"2104-0200",
"2104-0220",
"2104-0250",
"2104-0300"
]
},
{
"이름": "지역",
"고르기": [
"전국평균",
"전국",
"서울",
"경기",
"강원",
"충북",
"충남",
"전북",
"경북",
"경남",
"부산",
"제주",
"대구",
"인천",
"대전",
"울산",
"세종",
"전남광주"
],
"출처": "건설품셈 공통 8-1-7 5"
}
],
"중간": [
{
"이름": "시공량",
"식": "만약(형식 == '개구제형', 찾기(소요량:건설품셈:5-3-2 강재거더 가설, 구분='인력', 품목='철공').가설개수개구제형, 찾기(소요량:건설품셈:5-3-2 강재거더 가설, 구분='인력', 품목='철공').가설개수폐합형) + 만약(단일거더 == '아님', 0, 찾기(계수:건설품셈:5-3-2 단일거더 추가, 항목='단일 강재거더 직접 인양 가설').개수) - 만약(확폭등 == '아님', 0, 찾기(계수:건설품셈:5-3-2 가설 개수 차감, 항목='교량 확폭, 과도교, 과선교 지하 통로내').개수)",
"출처": "건설품셈 토목 5-3-2 주②⑤"
}
],
"호표": [
{
"종류": "인력",
"요소": "인력:건설노임:1009",
"이름": "철공",
"단위": "인",
"수량": "찾기(소요량:건설품셈:5-3-2 강재거더 가설, 구분='인력', 품목='철공').수량 / 시공량",
"비목": "노무비"
},
{
"종류": "인력",
"요소": "인력:건설노임:1006",
"이름": "비계공",
"단위": "인",
"수량": "찾기(소요량:건설품셈:5-3-2 강재거더 가설, 구분='인력', 품목='비계공').수량 / 시공량",
"비목": "노무비"
},
{
"종류": "인력",
"요소": "인력:건설노임:1003",
"이름": "특별인부",
"단위": "인",
"수량": "찾기(소요량:건설품셈:5-3-2 강재거더 가설, 구분='인력', 품목='특별인부').수량 / 시공량",
"비목": "노무비"
},
{
"종류": "인력",
"요소": "인력:건설노임:1012",
"이름": "용접공",
"단위": "인",
"수량": "찾기(소요량:건설품셈:5-3-2 강재거더 가설, 구분='인력', 품목='용접공').수량 / 시공량",
"비목": "노무비"
},
{
"종류": "로직",
"요소": "로직(건설품셈:8 기계 시간당 경비, 기계=크레인, 지역=지역)",
"이름": "크레인",
"단위": "시간",
"수량": "찾기(소요량:건설품셈:5-3-2 강재거더 가설, 구분='장비', 품목='크레인', 규격='100~300ton').수량 * 8 / 시공량"
},
{
"종류": "로직",
"요소": "로직(건설품셈:8 기계 시간당 경비(조종원 없음), 기계='2106-0005', 지역=지역)",
"이름": "고소작업차 5ton",
"단위": "시간",
"수량": "찾기(소요량:건설품셈:5-3-2 강재거더 가설, 구분='장비', 품목='고소작업차', 규격='5ton').수량 * 8 / 시공량"
},
{
"종류": "인력",
"요소": "인력:건설노임:1006",
"이름": "비계공",
"단위": "인",
"수량": "만약(장소 == '육상', 0, 찾기(계수:건설품셈:5-3-2 해상 추가 인원, 직종='비계공').인원 / 시공량)",
"비목": "노무비",
"출처": "건설품셈 토목 5-3-2 주⑥"
},
{
"종류": "인력",
"요소": "인력:건설노임:1003",
"이름": "특별인부",
"단위": "인",
"수량": "만약(장소 == '육상', 0, 찾기(계수:건설품셈:5-3-2 해상 추가 인원, 직종='특별인부').인원 / 시공량)",
"비목": "노무비",
"출처": "건설품셈 토목 5-3-2 주⑥"
}
],
"덧줄": [
{
"이름": "공구손료 및 경장비",
"식": "((찾기(소요량:건설품셈:5-3-2 강재거더 가설, 구분='인력', 품목='철공').수량 / 시공량) * 인력:건설노임:1009 + (찾기(소요량:건설품셈:5-3-2 강재거더 가설, 구분='인력', 품목='비계공').수량 / 시공량) * 인력:건설노임:1006 + (찾기(소요량:건설품셈:5-3-2 강재거더 가설, 구분='인력', 품목='특별인부').수량 / 시공량) * 인력:건설노임:1003 + (찾기(소요량:건설품셈:5-3-2 강재거더 가설, 구분='인력', 품목='용접공').수량 / 시공량) * 인력:건설노임:1012 + (만약(장소 == '육상', 0, 찾기(계수:건설품셈:5-3-2 해상 추가 인원, 직종='비계공').인원 / 시공량)) * 인력:건설노임:1006 + (만약(장소 == '육상', 0, 찾기(계수:건설품셈:5-3-2 해상 추가 인원, 직종='특별인부').인원 / 시공량)) * 인력:건설노임:1003) * 찾기(계수:건설품셈:5-3-2 경장비, 장소=장소, 형식=형식).인력품대비 / 100",
"비목": "경비",
"출처": "건설품셈 토목 5-3-2 주⑪"
}
],
"끝수": null,
"비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 크레인 원문 100~300ton — 작업여건 따라 설계자 고름 · 해상 가설은 비계공·특별인부 2인씩 추가(주⑥) · 바지선 등 별도 · 높이 할증 없음(주⑧) · 해석: 인력품 = 인력 호표 줄 금액 합(기계 조종원 제외)"
},
{
"열쇠": "5-3-3 기타 부재 설치",
"이름": "강교 기타 부재 설치",
"결과단위": "원/ton",
"출처": "건설품셈 토목 5-3-3",
"소유": "공용",
"입력": [
{ "이름": "장소", "고르기": ["육상", "해상"], "출처": "건설품셈 토목 5-3-3 주②" },
{
"이름": "크레인",
"고르기": [
"2104-0010",
"2104-0015",
"2104-0020",
"2104-0025",
"2104-0030",
"2104-0035",
"2104-0040",
"2104-0045",
"2104-0050",
"2104-0060",
"2104-0070",
"2104-0080",
"2104-0100",
"2104-0130",
"2104-0160",
"2104-0200",
"2104-0220",
"2104-0250",
"2104-0300"
]
},
{
"이름": "지역",
"고르기": [
"전국평균",
"전국",
"서울",
"경기",
"강원",
"충북",
"충남",
"전북",
"경북",
"경남",
"부산",
"제주",
"대구",
"인천",
"대전",
"울산",
"세종",
"전남광주"
],
"출처": "건설품셈 공통 8-1-7 5"
}
],
"중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:5-3-3 기타 부재 설치, 구분='인력', 품목='철공').설치수량" }],
"호표": [
{
"종류": "인력",
"요소": "인력:건설노임:1009",
"이름": "철공",
"단위": "인",
"수량": "찾기(소요량:건설품셈:5-3-3 기타 부재 설치, 구분='인력', 품목='철공').수량 / 시공량",
"비목": "노무비"
},
{
"종류": "인력",
"요소": "인력:건설노임:1006",
"이름": "비계공",
"단위": "인",
"수량": "찾기(소요량:건설품셈:5-3-3 기타 부재 설치, 구분='인력', 품목='비계공').수량 / 시공량",
"비목": "노무비"
},
{
"종류": "인력",
"요소": "인력:건설노임:1003",
"이름": "특별인부",
"단위": "인",
"수량": "찾기(소요량:건설품셈:5-3-3 기타 부재 설치, 구분='인력', 품목='특별인부').수량 / 시공량",
"비목": "노무비"
},
{
"종류": "인력",
"요소": "인력:건설노임:1012",
"이름": "용접공",
"단위": "인",
"수량": "찾기(소요량:건설품셈:5-3-3 기타 부재 설치, 구분='인력', 품목='용접공').수량 / 시공량",
"비목": "노무비"
},
{
"종류": "로직",
"요소": "로직(건설품셈:8 기계 시간당 경비, 기계=크레인, 지역=지역)",
"이름": "크레인",
"단위": "시간",
"수량": "찾기(소요량:건설품셈:5-3-3 기타 부재 설치, 구분='장비', 품목='크레인', 규격='100~300ton').수량 * 8 / 시공량"
},
{
"종류": "인력",
"요소": "인력:건설노임:1003",
"이름": "특별인부",
"단위": "인",
"수량": "만약(장소 == '육상', 0, 찾기(계수:건설품셈:5-3-3 해상 추가 인원, 항목='특별인부').인원 / 시공량)",
"비목": "노무비",
"출처": "건설품셈 토목 5-3-3 주②"
}
],
"덧줄": [
{
"이름": "공구손료 및 경장비",
"식": "((찾기(소요량:건설품셈:5-3-3 기타 부재 설치, 구분='인력', 품목='철공').수량 / 시공량) * 인력:건설노임:1009 + (찾기(소요량:건설품셈:5-3-3 기타 부재 설치, 구분='인력', 품목='비계공').수량 / 시공량) * 인력:건설노임:1006 + (찾기(소요량:건설품셈:5-3-3 기타 부재 설치, 구분='인력', 품목='특별인부').수량 / 시공량) * 인력:건설노임:1003 + (찾기(소요량:건설품셈:5-3-3 기타 부재 설치, 구분='인력', 품목='용접공').수량 / 시공량) * 인력:건설노임:1012 + (만약(장소 == '육상', 0, 찾기(계수:건설품셈:5-3-3 해상 추가 인원, 항목='특별인부').인원 / 시공량)) * 인력:건설노임:1003) * 찾기(계수:건설품셈:5-3-3 경장비, 항목='공구손료 및 경장비').비율 / 100",
"비목": "경비",
"출처": "건설품셈 토목 5-3-3 주⑤"
}
],
"끝수": null,
"비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 크레인 원문 100~300ton — 작업여건 따라 설계자 고름 · 가로보·캔틸레버보·엔드빔·형강류 육상 설치(주①) · 해석: 인력품 = 인력 호표 줄 금액 합(기계 조종원 제외)"
}
]
}
+5 -1
View File
@@ -98,6 +98,10 @@
{ "열쇠": "테르밋용재", "이름": "테르밋용재", "규격": "점화용", "단위": "포", "값": null, "출처": "자체", "비고": "건설품셈 토목 4-5-2 테르밋 용접 소모재료(참고자료)" },
{ "열쇠": "테르밋 몰드", "이름": "몰드", "규격": "테르밋 용접용", "단위": "개", "값": null, "출처": "자체", "비고": "건설품셈 토목 4-5-2 테르밋 용접 소모재료(참고자료)" },
{ "열쇠": "테르밋 골무", "이름": "골무", "규격": "테르밋 용접용", "단위": "개", "값": null, "출처": "자체", "비고": "건설품셈 토목 4-5-2 테르밋 용접 소모재료(참고자료)" },
{ "열쇠": "테르밋 퓨즈", "이름": "퓨즈", "규격": "테르밋 용접용", "단위": "개", "값": null, "출처": "자체", "비고": "건설품셈 토목 4-5-2 테르밋 용접 소모재료(참고자료)" }
{ "열쇠": "테르밋 퓨즈", "이름": "퓨즈", "규격": "테르밋 용접용", "단위": "개", "값": null, "출처": "자체", "비고": "건설품셈 토목 4-5-2 테르밋 용접 소모재료(참고자료)" },
{ "열쇠": "강교 용접봉", "이름": "용접봉", "규격": "강교 제작용", "단위": "㎏", "값": null, "출처": "자체", "비고": "건설품셈 토목 5-1-3 기타재료 소요량" },
{ "열쇠": "철구(Shot ball)", "이름": "철구(Shot ball)", "규격": "", "단위": "㎏", "값": null, "출처": "자체", "비고": "건설품셈 토목 5-2-1 소재 표면처리" },
{ "열쇠": "무기질아연말샵프라이머", "이름": "무기질아연말 샵프라이머", "규격": "도막두께 20μm", "단위": "", "값": null, "출처": "자체", "비고": "건설품셈 토목 5-2-1 소재 표면처리" },
{ "열쇠": "철편(Grit)", "이름": "철편(Grit)", "규격": "", "단위": "㎏", "값": null, "출처": "자체", "비고": "건설품셈 토목 5-2-2 제품 표면처리" }
]
}
+20
View File
@@ -23,6 +23,7 @@ SAMPLES = [
"로직_건설품셈_토목2장.json",
"로직_건설품셈_토목3장.json",
"로직_건설품셈_토목4장.json",
"로직_건설품셈_토목5장.json",
"로직_건설품셈_토목6장.json",
"로직_산림품셈_03장.json",
"로직_산림품셈_04장.json",
@@ -314,6 +315,25 @@ def test_토목_궤광조립_직결형_단선감(whole):
assert got[""][0]["수량"] == Decimal(16) / Decimal("237.5")
def test_토목_강교_제작공수_보정(whole):
"""토목 5-1-2 — 연수 2 는 「이상·이하」 [2,2] · 총중량 표 범위규칙 뒤 괄호 설명은 뺌."""
given = {
"형식": "박스거더",
"고강도강비율": Decimal("0.5"),
"대형단품평균중량": 12,
"부품평균중량": 120,
"연수": 2,
"총중량": 600,
"사각": 60,
"곡률반경": 200,
"높이곡선변화": "있음",
}
got = mf.run(whole, "건설품셈:5-1-1 기본제작공수", given)
# 0.95 × (1 + 0.25×0.5) × 0.97 × 0.95 × (1 0.03 0.02 + 0.25 + 0.11)
want = Decimal("0.95") * Decimal("1.125") * Decimal("0.97") * Decimal("0.95") * Decimal("1.31")
assert got[""][0]["수량"] == want
def test_범위_입력은_막음(whole):
with pytest.raises(mf.FormulaError):
mf.run(