From b6a5c0f2b45d00b2a2d8824856716fa61863899f Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sat, 19 Sep 2026 17:42:57 +0900 Subject: [PATCH 01/14] =?UTF-8?q?knowledge(master=5Fdata):=20=EA=B1=B4?= =?UTF-8?q?=EC=84=A4=ED=92=88=EC=85=88=20=EC=9C=A0=EC=A7=80=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=203=EC=9E=A5=20=ED=91=9C=20=EC=9A=94=EC=86=8C?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_0146J72jAMHpcmW4n2Y8WakE --- .../소요량_건설품셈_유지관리3장.json | 501 ++++++++++++++++++ 1 file changed, 501 insertions(+) create mode 100644 resources/master_data/소요량_건설품셈_유지관리3장.json diff --git a/resources/master_data/소요량_건설품셈_유지관리3장.json b/resources/master_data/소요량_건설품셈_유지관리3장.json new file mode 100644 index 00000000..7251a2ea --- /dev/null +++ b/resources/master_data/소요량_건설품셈_유지관리3장.json @@ -0,0 +1,501 @@ +{ + "그룹": "소요량", + "원문": "건설품셈", + "부문": "유지관리", + "판": "2026", + "표": [ + { + "열쇠": "3-1-1 콘크리트구조물 헐기(인력)", + "이름": "콘크리트구조물 헐기(인력)", + "기준": "일당", + "출처": "건설품셈 유지관리 3-1-1", + "조건": { "철근유무": "고르기" }, + "값칸": { "착암공": "인", "보통인부": "인", "소형브레이커(1.5kW)": "대", "시공량": "㎥" }, + "줄": [ + { "철근유무": "무근", "착암공": 2, "보통인부": 1, "소형브레이커(1.5kW)": 2, "시공량": 2.7 }, + { "철근유무": "철근", "착암공": 2, "보통인부": 1, "소형브레이커(1.5kW)": 2, "시공량": 2.3 } + ], + "주": [ + "규격 — 소형브레이커 1.5kW.", + "① 본 품은 소형브레이커(전기식)를 사용하여 콘크리트구조물을 철거하는 기준이다.", + "② 본 품은 콘크리트 헐기, 발생재 정리 작업을 포함한다.", + "③ 장애물 제거(철근, 파이프 등)가 필요한 경우 별도 계상한다.", + "④ 잡재료비(치즐 등)는 인력품의 1%로 계상한다." + ] + }, + { + "열쇠": "3-1-2 콘크리트구조물 헐기(기계)", + "이름": "콘크리트구조물 헐기(기계)", + "기준": "일당", + "출처": "건설품셈 유지관리 3-1-2", + "조건": { "장애물": "고르기" }, + "값칸": { "용접공": "인", "특별인부": "인", "보통인부": "인", "굴착기+압쇄기(1.0㎥)": "대", "굴착기(0.6㎥)": "대", "시공량": "㎥" }, + "줄": [ + { "장애물": "미제거", "특별인부": 2, "보통인부": 1, "굴착기+압쇄기(1.0㎥)": 1, "굴착기(0.6㎥)": 1, "시공량": 50 }, + { "장애물": "제거", "용접공": 1, "특별인부": 2, "보통인부": 1, "굴착기+압쇄기(1.0㎥)": 1, "굴착기(0.6㎥)": 1, "시공량": 45 } + ], + "주": [ + "규격 — 굴착기+압쇄기 1.0㎥ · 굴착기 0.6㎥.", + "① 본 품은 장비(굴착기+압쇄기)를 사용한 철근콘크리트 구조물을 해체하는 기준이다.", + "② 본 품은 콘크리트 헐기 및 부수기, 발생재 정리 작업을 포함한다.", + "③ 본 품은 높이 10m이하 기준이며, 특수조건(하부구조보강 필요 등)에 대한 비용은 별도 계상한다.", + "④ 공사장의 보호 및 안전시설 설치비, 폐기물 상차 및 운반, 폐기물 처리비용은 별도 계상한다.", + "⑤ 장비는 현장여건에 따라 규격을 변경하여 적용할 수 있다.", + "⑥ 대형브레이커가 필요한 경우 '[공통부문] 8-2-13 대형브레이커'를 참조하여 별도 계상한다.", + "⑦ 공구손료 및 경장비(살수장비 등)의 기계경비는 인력품의 4%로 계상한다.", + "⑧ 장애물 제거(철근, 파이프 등) 시 재료량은 재료량 표를 참고한다." + ] + }, + { + "열쇠": "3-1-2 콘크리트구조물 헐기(기계) 재료량", + "이름": "콘크리트구조물 헐기(기계) 장애물 제거 재료량(㎥당)", + "기준": "㎥당", + "출처": "건설품셈 유지관리 3-1-2", + "조건": { "구분": "고르기" }, + "값칸": { "단위": "글", "수량": "수" }, + "줄": [ + { "구분": "산소(대기압상태기준)", "단위": "L", "수량": 135 }, + { "구분": "아세틸렌", "단위": "㎏", "수량": 0.05 } + ], + "주": [ "※ 산소량은 대기압상태의 기준량이며, 압축산소는 35℃에서 150기압으로 압축용기에 넣어 사용하는 것을 기준한다." ] + }, + { + "열쇠": "3-1-3 철골재 철거(인력)", + "이름": "철골재 철거(인력)", + "기준": "일당", + "출처": "건설품셈 유지관리 3-1-3", + "조건": {}, + "값칸": { "용접공": "인", "보통인부": "인", "시공량": "ton" }, + "줄": [ { "용접공": 3, "보통인부": 2, "시공량": 1.4 } ], + "주": [ + "① 본 품은 산소용접기를 사용하여 철골재 구조물을 해체하는 기준이다.", + "② 본 품은 철골재 철거, 발생재 정리 작업을 포함한다.", + "③ 공사장의 보호 및 안전시설 설치비, 폐기물 상차 및 운반, 폐기물 처리비용은 별도 계상한다.", + "④ 재료량은 재료량 표를 참고하여 적용한다." + ] + }, + { + "열쇠": "3-1-3 철골재 철거(인력) 재료량", + "이름": "철골재 철거(인력) 재료량(ton당)", + "기준": "ton당", + "출처": "건설품셈 유지관리 3-1-3", + "조건": { "구분": "고르기" }, + "값칸": { "단위": "글", "수량": "수" }, + "줄": [ + { "구분": "산소", "단위": "병", "수량": 0.7 }, + { "구분": "아세틸렌", "단위": "㎏", "수량": 2.5 }, + { "구분": "LPG", "단위": "㎏", "수량": 2.0 } + ], + "주": [ + "※ 아세틸렌(산소포함) 또는 L.P.G 중 한가지만 선택 사용한다.", + "※ 산소량은 대기압상태의 기준량이며, 압축산소는 35℃에서 150기압으로 압축용기에 넣어 사용하는 것을 기준한다." + ] + }, + { + "열쇠": "3-1-4 철골재 철거(기계)", + "이름": "철골재 철거(기계)", + "기준": "일당", + "출처": "건설품셈 유지관리 3-1-4", + "조건": {}, + "값칸": { "특별인부": "인", "보통인부": "인", "굴착기+빔커터기(1.0㎥)": "대", "굴착기(1.0㎥)": "대", "크레인": "대", "시공량": "ton" }, + "줄": [ { "특별인부": 2, "보통인부": 1, "굴착기+빔커터기(1.0㎥)": 1, "굴착기(1.0㎥)": 1, "크레인": 1, "시공량": 22 } ], + "주": [ + "① 본 품은 장비(굴착기+빔커터기 등)를 사용하여 철골재 구조물을 해체하는 기준이다.", + "② 본 품은 철골재 철거, 발생재 정리 작업을 포함한다.", + "③ 높이 10m이하(지상에서 철거) 기준이며, 특수조건(소형장비 추가투입 등)에 대한 비용은 별도 계상한다.", + "④ 공사장의 보호 및 안전시설 설치비, 폐기물 상차 및 운반, 폐기물 처리비용은 별도 계상한다.", + "⑤ 크레인의 규격은 작업여건(시공높이, 시공위치 등) 및 안전율(적정하중, 작업반경 등)을 고려하여 적합한 규격을 적용한다.", + "⑥ 장비는 현장여건에 따라 규격을 변경하여 적용할 수 있다.", + "⑦ 공구손료 및 경장비(살수장비 등)의 기계경비는 인력품의 4%로 계상한다." + ] + }, + { + "열쇠": "3-1-5 석축 헐기(인력)", + "이름": "석축 헐기(인력)", + "기준": "정의별", + "출처": "건설품셈 유지관리 3-1-5", + "조건": { "공종": "고르기" }, + "값칸": { "기준": "글", "할석공": "인", "보통인부": "인" }, + "줄": [ + { "공종": "메쌓기 뒷길이 45∼60㎝", "기준": "㎡당", "보통인부": 0.2 }, + { "공종": "메쌓기 뒷길이 60∼90㎝", "기준": "㎡당", "보통인부": 0.3 }, + { "공종": "찰쌓기", "기준": "㎡당", "보통인부": 0.6 }, + { "공종": "절석(마름돌) 쌓기", "기준": "㎥당", "할석공": 0.1, "보통인부": 1.1 } + ], + "주": [ + "원문 그대로 — 이 표는 밑줄(칸 경계선) 없이 찍힘.", + "① 본 품은 기준높이 3.6m일 때의 인력헐기를 기준한 것이며, 그 이상일 때의 작업 안전설비 및 특수 조건에 대한 품은 별도 계상한다.", + "② 발생품을 재사용코자 할 때나 제자리 고르기를 할 경우는 별도 계상한다.", + "③ 본 품은 부수기내의 장애물 제거(철근, 파이프 등) 및 공구손료가 포함되어 있다.", + "④ 잡재료는 인력품의 5%이내에서 계상한다." + ] + }, + { + "열쇠": "3-2-1 금속기와 해체", + "이름": "금속기와 해체", + "기준": "㎡당", + "출처": "건설품셈 유지관리 3-2-1", + "조건": {}, + "값칸": { "지붕잇기공": "인", "보통인부": "인" }, + "줄": [ { "지붕잇기공": 0.018, "보통인부": 0.012 } ], + "주": [ + "① 본 품은 금속기와 지붕을 재사용하지 아니하는 때의 절단하여 해체하는 기준이다.", + "② 본 품은 지붕재 및 후레싱 해체 작업을 포함한다.", + "③ 비산방지, 보호 및 안전시설 등의 설치비는 별도 계상한다.", + "④ 폐기물 처리비용은 별도 계상한다.", + "⑤ 공구손료 및 경장비(절단기 등)의 기계경비는 인력품의 3%로 계상한다." + ] + }, + { + "열쇠": "3-2-2 흡음텍스 해체", + "이름": "흡음텍스 해체", + "기준": "㎡당", + "출처": "건설품셈 유지관리 3-2-2", + "조건": {}, + "값칸": { "내장공": "인", "보통인부": "인" }, + "줄": [ { "내장공": 0.016, "보통인부": 0.011 } ], + "주": [ + "① 본 품은 흡음텍스를 재사용하지 아니하는 때의 해체하는 기준이다.", + "② 비산방지, 보호 및 안전시설 등의 설치비는 별도 계상한다.", + "③ 폐기물 처리비용은 별도 계상한다." + ] + }, + { + "열쇠": "3-2-3 경량천장철골틀 해체", + "이름": "경량천장철골틀 해체", + "기준": "㎡당", + "출처": "건설품셈 유지관리 3-2-3", + "조건": {}, + "값칸": { "내장공": "인", "보통인부": "인" }, + "줄": [ { "내장공": 0.018, "보통인부": 0.012 } ], + "주": [ + "① 본 품은 경량천장철골틀을 재사용하지 아니하는 때의 절단하여 해체하는 기준이다.", + "② 본 품은 천장틀(채널, BAR 등) 해체, 달대 및 행거 해체 작업을 포함한다.", + "③ 비산방지, 보호 및 안전시설 등의 설치비는 별도 계상한다.", + "④ 폐기물 처리비용은 별도 계상한다.", + "⑤ 공구손료 및 경장비(절단기 등)의 기계경비는 인력품의 2%로 계상한다." + ] + }, + { + "열쇠": "3-2-4 조적벽 해체", + "이름": "조적벽 해체", + "기준": "㎥당", + "출처": "건설품셈 유지관리 3-2-4", + "조건": {}, + "값칸": { "조적공": "인", "보통인부": "인" }, + "줄": [ { "조적공": 0.380, "보통인부": 0.252 } ], + "주": [ + "① 본 품은 조적벽(높이 3.6m이하)을 재사용하지 아니하는 때의 해체하는 기준이다.", + "② 본 품은 조적벽 해체, 고정철물 해체 작업을 포함한다.", + "③ 비산방지, 보호 및 안전시설 등의 설치비는 별도 계상한다.", + "④ 폐기물 처리비용은 별도 계상한다.", + "⑤ 공구손료 및 경장비(함마 등)의 기계경비는 인력품의 2%로 계상한다." + ] + }, + { + "열쇠": "3-2-5 경량벽체철골틀 해체", + "이름": "경량벽체철골틀 해체", + "기준": "㎡당", + "출처": "건설품셈 유지관리 3-2-5", + "조건": {}, + "값칸": { "내장공": "인", "보통인부": "인" }, + "줄": [ { "내장공": 0.016, "보통인부": 0.011 } ], + "주": [ + "① 본 품은 경량벽체철골틀을 재사용하지 아니하는 때의 절단하여 해체하는 기준이다.", + "② 본 품은 러너 및 스터드 해체 작업을 포함한다.", + "③ 비산방지, 보호 및 안전시설 등의 설치비는 별도 계상한다.", + "④ 폐기물 처리비용은 별도 계상한다.", + "⑤ 공구손료 및 경장비(절단기 등)의 기계경비는 인력품의 2%로 계상한다." + ] + }, + { + "열쇠": "3-2-6 석고판 해체", + "이름": "석고판 해체", + "기준": "㎡당", + "출처": "건설품셈 유지관리 3-2-6", + "조건": { "부위": "고르기" }, + "값칸": { "내장공": "인", "보통인부": "인" }, + "줄": [ + { "부위": "벽", "내장공": 0.014, "보통인부": 0.010 }, + { "부위": "천장", "내장공": 0.016, "보통인부": 0.012 } + ], + "주": [ + "① 본 품은 석고판을 재사용하지 아니하는 때의 절단하여 해체하는 기준이다.", + "② 비산방지, 보호 및 안전시설 등의 설치비는 별도 계상한다.", + "③ 폐기물 처리비용은 별도 계상한다.", + "④ 공구손료 및 경장비(절단기 등)의 기계경비는 인력품의 2%로 계상한다." + ] + }, + { + "열쇠": "3-2-7 도배 해체", + "이름": "도배 해체", + "기준": "㎡당", + "출처": "건설품셈 유지관리 3-2-7", + "조건": { "부위": "고르기" }, + "값칸": { "도배공": "인", "보통인부": "인" }, + "줄": [ + { "부위": "벽", "도배공": 0.008, "보통인부": 0.005 }, + { "부위": "천장", "도배공": 0.010, "보통인부": 0.007 } + ], + "주": [ + "① 본 품은 도배지를 재사용하지 아니하는 때의 해체하는 기준이다.", + "② 본 품은 정배지 및 초배지 해체 작업을 포함한다.", + "③ 비산방지, 보호 및 안전시설 등의 설치비는 별도 계상한다.", + "④ 폐기물 처리비용은 별도 계상한다." + ] + }, + { + "열쇠": "3-2-8 PVC계바닥재 해체", + "이름": "PVC계바닥재 해체", + "기준": "㎡당", + "출처": "건설품셈 유지관리 3-2-8", + "조건": {}, + "값칸": { "내장공": "인", "보통인부": "인" }, + "줄": [ { "내장공": 0.006, "보통인부": 0.004 } ], + "주": [ + "① 본 품은 PVC계 바닥재(시트)를 재사용하지 아니하는 때의 해체하는 기준이다.", + "② 비산방지, 보호 및 안전시설 등의 설치비는 별도 계상한다.", + "③ 폐기물 처리비용은 별도 계상한다." + ] + }, + { + "열쇠": "3-2-9 타일 해체", + "이름": "타일 해체", + "기준": "㎡당", + "출처": "건설품셈 유지관리 3-2-9", + "조건": { "공법": "고르기" }, + "값칸": { "타일공": "인", "보통인부": "인" }, + "줄": [ + { "공법": "떠붙이기", "타일공": 0.037, "보통인부": 0.024 }, + { "공법": "압착붙이기,접착붙이기", "타일공": 0.041, "보통인부": 0.027 } + ], + "주": [ + "① 본 품은 타일을 재사용하지 아니하는 때의 해체하는 기준이다.", + "② 본 품은 타일 및 접착제 깨기 작업을 포함한다.", + "③ 비산방지, 보호 및 안전시설 등의 설치비는 별도 계상한다.", + "④ 폐기물 처리비용은 별도 계상한다.", + "⑤ 공구손료 및 경장비(절단기 등)의 기계경비는 인력품의 6%로 계상한다." + ] + }, + { + "열쇠": "3-2-10 기존방수층 및 보호층 철거", + "이름": "기존방수층 및 보호층 철거", + "기준": "㎡당", + "출처": "건설품셈 유지관리 3-2-10", + "조건": {}, + "값칸": { "착암공": "인", "보통인부": "인", "소형브레이커(1.3㎥/min)": "시간", "공기압축기(3.5㎥/min)": "시간" }, + "줄": [ { "착암공": 0.06, "보통인부": 0.22, "소형브레이커(1.3㎥/min)": 0.10, "공기압축기(3.5㎥/min)": 0.05 } ], + "주": [ + "규격 — 소형브레이커 1.3㎥/min · 공기압축기 3.5㎥/min.", + "① 본 품은 아스팔트 8층 방수를 보수하기 위하여 방수층을 철거하는 품으로 누름 콘크리트층의 파쇄, 방수층 철거, 폐자재 소운반 및 정리품이 포함되어 있다.", + "② 소규모공사(개소당 작업면적 40㎡미만)인 경우는 장비 사용기간 및 품을 40% 범위 내에서 가산하여 적용한다.", + "③ 누름 콘크리트 두께 8㎝ 기준이다." + ] + }, + { + "열쇠": "3-2-11 기존방수층 제거 및 바탕처리", + "이름": "기존방수층 제거 및 바탕처리", + "기준": "㎡당", + "출처": "건설품셈 유지관리 3-2-11", + "조건": { "부위": "고르기" }, + "값칸": { "방수공": "인", "보통인부": "인" }, + "줄": [ + { "부위": "바닥", "방수공": 0.037, "보통인부": 0.015 }, + { "부위": "수직부", "방수공": 0.041, "보통인부": 0.017 } + ], + "주": [ + "① 본 품은 재방수를 하기 위하여 기존방수층(도막방수)을 제거하고 바탕처리하는 기준이다.", + "② 본 품은 방수층 제거, 홈메우기, 불순물 청소, 퍼티 작업을 포함한다.", + "③ 공구손료 및 경장비(엔진송풍기, 연마기 등)의 기계경비는 인력품의 6%로 계상한다.", + "④ 바탕처리에 사용되는 재료(퍼티, 방수테이프 등)는 별도 계상한다." + ] + }, + { + "열쇠": "3-2-12 석면건축자재 해체", + "이름": "석면건축자재 해체", + "기준": "㎡당", + "출처": "건설품셈 유지관리 3-2-12", + "조건": { "부위": "고르기" }, + "값칸": { "석면해체공": "인", "보통인부": "인" }, + "줄": [ + { "부위": "내장재", "석면해체공": 0.120, "보통인부": 0.017 }, + { "부위": "외장재", "석면해체공": 0.045, "보통인부": 0.011 }, + { "부위": "뿜칠재", "석면해체공": 0.5 } + ], + "주": [ + "① 본 품은 석면이 함유된 자재를 해체하는 품으로 적용기준은 다음과 같다.", + "㉮ 내장재는 건축물의 내부 천장재, 내벽체, 간막이재 철거를 기준한 것이다.", + "㉯ 외장재는 슬레이트 지붕재 해체를 기준한 것이다.", + "㉰ 뿜칠재는 철골내화피복재를 기준으로 한 것으로 철골면의 하부면, 측면부, 상부면 등의 해체공사와 철재로 시공된 천장면에 부착되어 있는 뿜칠재의 해체를 기준한 것이다.", + "② 뿜칠재의 경우, 콘크리트면에 부착된 석면 뿜칠재의 해체는 본 품의 20%를 할증하여 적용한다.", + "③ 본 품은 비닐보양재, 오염제거구역 설치 및 해체가 포함된 것이며, 보양막(외장재) 설치 및 해체품은 제외되어 있다.", + "④ 본 품은 일일 작업시간 6시간을 기준한 것이다.", + "⑤ 석면자재의 해체 작업 시 소요되는 기기경비 및 재료비, 소모품비는 별도 계상한다.", + "⑥ 실내 고소작업 및 실외 비계설치를 위한 가설재의 설치는 별도 계상한다." + ] + }, + { + "열쇠": "3-3-1 재도장 시 바탕처리(콘크리트·모르타르면)", + "이름": "재도장 시 바탕처리(콘크리트·모르타르면)", + "기준": "일당", + "출처": "건설품셈 유지관리 3-3-1", + "조건": {}, + "값칸": { "도장공": "인", "보통인부": "인", "시공량": "㎡" }, + "줄": [ { "도장공": 2, "보통인부": 1, "시공량": 230 } ], + "주": [ + "① 본 품은 콘크리트·모르타르면 재도장 시 바탕처리하는 기준이다.", + "② 본 품은 기존 도장면을 제거하지 않고, 곰팡이 등 오염, 균열 부위에 부분적으로 퍼티 및 연마하는 작업 기준이다.", + "③ 공구손료 및 잡재료비(연마지 등)는 인력품의 3%로 계상한다." + ] + }, + { + "열쇠": "3-3-2 재도장 시 바탕처리(철재면)", + "이름": "재도장 시 바탕처리(철재면)", + "기준": "일당", + "출처": "건설품셈 유지관리 3-3-2", + "조건": { "등급": "고르기" }, + "값칸": { "도장공": "인", "보통인부": "인", "시공량": "㎡" }, + "줄": [ + { "등급": "A급", "도장공": 2, "보통인부": 1, "시공량": 20 }, + { "등급": "B급", "도장공": 2, "보통인부": 1, "시공량": 60 } + ], + "주": [ + "① 본 품은 철재면 재도장 시 바탕처리하는 기준이다.", + "② 본 품은 오염(기름때 등) 및 부착물 제거, 도장면 연마 및 청소 작업을 포함한다.", + "③ 대상면의 상태에 따른 적용기준은 적용기준 표와 같다.", + "④ 공구손료 및 잡재료비(연마지 등)는 인력품의 3%로 계상한다." + ] + }, + { + "열쇠": "3-3-2 재도장 시 바탕처리(철재면) 적용기준", + "이름": "재도장 시 바탕처리(철재면) 대상면 적용기준", + "기준": "정의", + "출처": "건설품셈 유지관리 3-3-2", + "조건": { "구분": "고르기" }, + "값칸": { "적용기준": "글" }, + "줄": [ + { "구분": "A급", "적용기준": "재래도장의 탈락이 심하고 부분적으로 부식되어 약품을 사용하여 도막 및 기타 부착물의 완전 제거를 요하는 정도" }, + { "구분": "B급", "적용기준": "재래도장의 부출되어 있는 녹을 제거하고 와이어 브러쉬로 청소할 정도" } + ], + "주": [ "③ 대상면의 상태에 따른 적용기준은 다음과 같다." ] + }, + { + "열쇠": "3-3-3 재도장 시 바탕처리(목재면)", + "이름": "재도장 시 바탕처리(목재면)", + "기준": "일당", + "출처": "건설품셈 유지관리 3-3-3", + "조건": { "등급": "고르기" }, + "값칸": { "도장공": "인", "보통인부": "인", "시공량": "㎡" }, + "줄": [ + { "등급": "A급", "도장공": 2, "보통인부": 1, "시공량": 110 }, + { "등급": "B급", "도장공": 2, "보통인부": 1, "시공량": 270 } + ], + "주": [ + "① 본 품은 목재면 재도장 시 바탕처리하는 기준이다.", + "② 본 품은 오염 및 부착물 제거, 틈새 및 구멍 충진, 퍼티 및 연마 작업을 포함한다.", + "③ 대상면의 상태에 따른 적용기준은 적용기준 표와 같다.", + "④ 공구손료 및 잡재료비(연마지 등)는 인력품의 3%로 계상한다." + ] + }, + { + "열쇠": "3-3-3 재도장 시 바탕처리(목재면) 적용기준", + "이름": "재도장 시 바탕처리(목재면) 대상면 적용기준", + "기준": "정의", + "출처": "건설품셈 유지관리 3-3-3", + "조건": { "구분": "고르기" }, + "값칸": { "적용기준": "글" }, + "줄": [ + { "구분": "A급", "적용기준": "재래도장의 탈락 및 목재의 손상이 심하여 갈라진틈, 구멍 땜 등을 충진하고, 평탄하게 연마해야하는 정도" }, + { "구분": "B급", "적용기준": "재래도장의 탈락 및 목재의 손상이 거의 없으며, 부착물 제거, 부분적으로 퍼티 및 연마를 요하는 정도" } + ], + "주": [ "③ 대상면의 상태에 따른 적용기준은 다음과 같다." ] + }, + { + "열쇠": "3-4-1 지붕 덧씌우기", + "이름": "지붕 덧씌우기", + "기준": "일당", + "출처": "건설품셈 유지관리 3-4-1", + "조건": {}, + "값칸": { "지붕잇기공": "인", "보통인부": "인", "시공량": "㎡" }, + "줄": [ { "지붕잇기공": 4, "보통인부": 2, "시공량": 85 } ], + "주": [ + "비고 — 맞배지붕(경사를 짓는 지붕면이 2개소)은 시공량을 20% 가산하여 적용한다.", + "① 본 품은 기존의 지붕 위에 신규 지붕을 덧씌워 보수하는 기준이다.", + "② 본 품은 바탕정리, 지붕틀 설치, 지붕재(금속기와) 설치, 용마루 및 후레싱 마감 작업을 포함한다.", + "③ 홈통 및 빗물받이 설치는 '[건축부문] 7-2 홈통'을 따른다.", + "④ 비계매기, 비산방지, 보호 및 안전시설의 설치비는 별도 계상한다.", + "⑤ 공구손료 및 경장비(에어콤프, 절단기 등)의 기계경비는 인력품의 2%로 계상한다." + ] + }, + { + "열쇠": "3-4-2 지붕 재설치", + "이름": "지붕 재설치", + "기준": "일당", + "출처": "건설품셈 유지관리 3-4-2", + "조건": {}, + "값칸": { "지붕잇기공": "인", "보통인부": "인", "시공량": "㎡" }, + "줄": [ { "지붕잇기공": 6, "보통인부": 2, "시공량": 50 } ], + "주": [ + "비고 — 맞배지붕(경사를 짓는 지붕면이 2개소)은 시공량을 20% 가산하여 적용한다.", + "① 본 품은 기존의 지붕재가 철거된 상태에서 신규 지붕을 재설치하는 기준이다.", + "② 본 품은 바탕정리, 지붕틀 및 바탕합판 설치, 방수시트 및 단열재 설치, 지붕재(금속기와) 설치, 용마루 및 후레싱 마감 작업을 포함한다.", + "③ 홈통 및 빗물받이 설치는 '[건축부문] 7-2 홈통'을 따른다.", + "④ 지붕재 철거는 별도 계상한다.", + "⑤ 비계매기, 비산방지, 보호 및 안전시설(비계 등)의 설치비는 별도 계상한다.", + "⑥ 공구손료 및 경장비(에어콤프, 절단기 등)의 기계경비는 인력품의 2%로 계상한다." + ] + }, + { + "열쇠": "3-4-3 도배 교체", + "이름": "도배 교체", + "기준": "일당", + "출처": "건설품셈 유지관리 3-4-3", + "조건": { "부위": "고르기" }, + "값칸": { "내장공": "인", "시공량": "㎡" }, + "줄": [ + { "부위": "벽", "내장공": 2, "시공량": 46 }, + { "부위": "천장", "내장공": 2, "시공량": 35 } + ], + "주": [ + "비고 — 사용중인 세대로 가구 등의 지장물이 있는 경우 시공량의 15%를 감한다.", + "① 본 품은 도배지를 해체(재사용하지 아니하는 때)하고 재설치하는 기준이다.", + "② 본 품은 도배지 해체, 바탕정리, 풀먹임, 초배 및 정배 바름 작업을 포함한다.", + "③ 가구 등 지장물의 운반은 별도 계상한다." + ] + }, + { + "열쇠": "3-4-4 PVC계바닥재 교체", + "이름": "PVC계바닥재 교체", + "기준": "일당", + "출처": "건설품셈 유지관리 3-4-4", + "조건": {}, + "값칸": { "내장공": "인", "시공량": "㎡" }, + "줄": [ { "내장공": 2, "시공량": 61 } ], + "주": [ + "비고 — 사용중인 세대로 가구 등의 지장물이 있는 경우 시공량의 15%를 감한다.", + "① 본 품은 PVC계 바닥재(시트)를 해체(재사용하지 아니하는 때)하고 재설치하는 기준이다.", + "② 본 품은 바닥재 해체, 바탕정리, 접착제(부분접합 방식) 바름, 바닥재 설치 작업을 포함한다.", + "③ 가구 등 지장물의 운반은 별도 계상한다." + ] + }, + { + "열쇠": "3-4-5 타일 교체", + "이름": "타일 교체", + "기준": "일당", + "출처": "건설품셈 유지관리 3-4-5", + "조건": { "공법": "고르기" }, + "값칸": { "타일공": "인", "시공량": "㎡" }, + "줄": [ + { "공법": "떠붙이기(벽)", "타일공": 2, "시공량": 7 }, + { "공법": "압착붙이기(바닥)", "타일공": 2, "시공량": 8 } + ], + "주": [ + "비고 — 사용중인 세대로 가구 등의 지장물이 있는 경우 시공량의 15%를 감한다.", + "① 본 품은 타일을 해체(재사용하지 아니하는 때)하고 재설치하는 기준이다.", + "② 본 품은 타일 해체, 바탕정리, 타일 붙임, 줄눈 설치 및 마무리 작업을 포함한다.", + "③ 방수 작업은 별도 계상한다.", + "④ 가구 등 지장물의 운반은 별도 계상한다." + ] + } + ] +} From 5c0c9d5cb1e5a39f7687f2732fdc87ea454bd03c Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sat, 19 Sep 2026 17:45:21 +0900 Subject: [PATCH 02/14] =?UTF-8?q?knowledge(master=5Fdata):=20=EA=B1=B4?= =?UTF-8?q?=EC=84=A4=ED=92=88=EC=85=88=20=EC=9C=A0=EC=A7=80=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=204=EC=9E=A5=20=ED=91=9C=20=EC=9A=94=EC=86=8C?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_0146J72jAMHpcmW4n2Y8WakE --- .../소요량_건설품셈_유지관리4장.json | 353 ++++++++++++++++++ 1 file changed, 353 insertions(+) create mode 100644 resources/master_data/소요량_건설품셈_유지관리4장.json diff --git a/resources/master_data/소요량_건설품셈_유지관리4장.json b/resources/master_data/소요량_건설품셈_유지관리4장.json new file mode 100644 index 00000000..4004e49b --- /dev/null +++ b/resources/master_data/소요량_건설품셈_유지관리4장.json @@ -0,0 +1,353 @@ +{ + "그룹": "소요량", + "원문": "건설품셈", + "부문": "유지관리", + "판": "2026", + "표": [ + { + "열쇠": "4-1-1 배관 해체", + "이름": "배관 해체", + "기준": "m당", + "출처": "건설품셈 유지관리 4-1-1", + "조건": { "관종": "고르기", "규격(㎜)": "고르기" }, + "값칸": { "배관공": "인", "보통인부": "인" }, + "줄": [ + { "관종": "강관", "규격(㎜)": "ø15이하", "배관공": 0.012, "보통인부": 0.008 }, + { "관종": "강관", "규격(㎜)": "20", "배관공": 0.013, "보통인부": 0.009 }, + { "관종": "강관", "규격(㎜)": "25", "배관공": 0.017, "보통인부": 0.011 }, + { "관종": "강관", "규격(㎜)": "32", "배관공": 0.019, "보통인부": 0.013 }, + { "관종": "강관", "규격(㎜)": "40", "배관공": 0.021, "보통인부": 0.014 }, + { "관종": "강관", "규격(㎜)": "50", "배관공": 0.027, "보통인부": 0.018 }, + { "관종": "강관", "규격(㎜)": "65", "배관공": 0.031, "보통인부": 0.021 }, + { "관종": "강관", "규격(㎜)": "80", "배관공": 0.039, "보통인부": 0.026 }, + { "관종": "강관", "규격(㎜)": "100", "배관공": 0.053, "보통인부": 0.035 }, + { "관종": "강관", "규격(㎜)": "125", "배관공": 0.067, "보통인부": 0.045 }, + { "관종": "강관", "규격(㎜)": "150", "배관공": 0.079, "보통인부": 0.053 }, + { "관종": "강관", "규격(㎜)": "200", "배관공": 0.121, "보통인부": 0.080 }, + { "관종": "강관", "규격(㎜)": "250", "배관공": 0.161, "보통인부": 0.107 }, + { "관종": "강관", "규격(㎜)": "300", "배관공": 0.208, "보통인부": 0.139 }, + { "관종": "강관", "규격(㎜)": "350", "배관공": 0.250, "보통인부": 0.167 }, + { "관종": "강관", "규격(㎜)": "400", "배관공": 0.296, "보통인부": 0.197 }, + { "관종": "동관", "규격(㎜)": "ø15이하", "배관공": 0.010, "보통인부": 0.007 }, + { "관종": "동관", "규격(㎜)": "20", "배관공": 0.012, "보통인부": 0.008 }, + { "관종": "동관", "규격(㎜)": "25", "배관공": 0.015, "보통인부": 0.010 }, + { "관종": "동관", "규격(㎜)": "32", "배관공": 0.018, "보통인부": 0.012 }, + { "관종": "동관", "규격(㎜)": "40", "배관공": 0.020, "보통인부": 0.014 }, + { "관종": "동관", "규격(㎜)": "50", "배관공": 0.027, "보통인부": 0.018 }, + { "관종": "동관", "규격(㎜)": "65", "배관공": 0.031, "보통인부": 0.021 }, + { "관종": "동관", "규격(㎜)": "80", "배관공": 0.039, "보통인부": 0.026 }, + { "관종": "동관", "규격(㎜)": "100", "배관공": 0.053, "보통인부": 0.035 }, + { "관종": "동관", "규격(㎜)": "125", "배관공": 0.066, "보통인부": 0.044 }, + { "관종": "동관", "규격(㎜)": "150", "배관공": 0.078, "보통인부": 0.052 }, + { "관종": "동관", "규격(㎜)": "200", "배관공": 0.116, "보통인부": 0.077 }, + { "관종": "동관", "규격(㎜)": "250", "배관공": 0.153, "보통인부": 0.102 } + ], + "주": [ + "원문 그대로 — 동관 300~400 규격 칸은 빈 칸(글자층 전각 빈칸).", + "① 본 품은 배관을 재사용하지 아니하는 때의 절단하여 해체하는 기준이다.", + "② 본 품은 지지철물, 배관 해체를 포함한다.", + "③ 비산방지, 보호 및 안전시설 등의 설치비는 별도 계상한다.", + "④ 폐기물 처리비용은 별도 계상한다.", + "⑤ 공구손료 및 경장비(절단기 등)의 기계경비는 인력품의 2%로 계상한다." + ] + }, + { + "열쇠": "4-1-2 각형덕트 해체", + "이름": "각형덕트 해체", + "기준": "㎡당", + "출처": "건설품셈 유지관리 4-1-2", + "조건": { "호칭두께(mm)": "고르기" }, + "값칸": { "덕트공": "인", "보통인부": "인" }, + "줄": [ + { "호칭두께(mm)": "0.5", "덕트공": 0.064, "보통인부": 0.043 }, + { "호칭두께(mm)": "0.6", "덕트공": 0.060, "보통인부": 0.040 }, + { "호칭두께(mm)": "0.8", "덕트공": 0.063, "보통인부": 0.042 }, + { "호칭두께(mm)": "1.0", "덕트공": 0.077, "보통인부": 0.051 }, + { "호칭두께(mm)": "1.2", "덕트공": 0.089, "보통인부": 0.059 }, + { "호칭두께(mm)": "1.6", "덕트공": 0.111, "보통인부": 0.074 } + ], + "주": [ + "① 본 품은 각형덕트(아연도금강판, 스테인리스)를 재사용하지 아니하는 때의 절단하여 해체하는 기준이다.", + "② 본 품은 지지철물, 덕트 절단 및 해체를 포함한다.", + "③ 비산방지, 보호 및 안전시설 등의 설치비는 별도 계상한다.", + "④ 폐기물 처리비용은 별도 계상한다.", + "⑤ 공구손료 및 경장비(절단기 등)의 기계경비는 인력품의 2%로 계상한다." + ] + }, + { + "열쇠": "4-1-3 스파이럴덕트 해체", + "이름": "스파이럴덕트 해체", + "기준": "m당", + "출처": "건설품셈 유지관리 4-1-3", + "조건": { "철판두께(㎜)": "고르기", "규격(㎜)": "고르기" }, + "값칸": { "덕트공": "인", "보통인부": "인" }, + "줄": [ + { "철판두께(㎜)": "0.5", "규격(㎜)": "ø150이하", "덕트공": 0.036, "보통인부": 0.024 }, + { "철판두께(㎜)": "0.5", "규격(㎜)": "160", "덕트공": 0.037, "보통인부": 0.025 }, + { "철판두께(㎜)": "0.5", "규격(㎜)": "180", "덕트공": 0.041, "보통인부": 0.028 }, + { "철판두께(㎜)": "0.5", "규격(㎜)": "200", "덕트공": 0.045, "보통인부": 0.030 }, + { "철판두께(㎜)": "0.6", "규격(㎜)": "225", "덕트공": 0.050, "보통인부": 0.033 }, + { "철판두께(㎜)": "0.6", "규격(㎜)": "250", "덕트공": 0.055, "보통인부": 0.036 }, + { "철판두께(㎜)": "0.6", "규격(㎜)": "275", "덕트공": 0.059, "보통인부": 0.040 }, + { "철판두께(㎜)": "0.6", "규격(㎜)": "300", "덕트공": 0.064, "보통인부": 0.043 }, + { "철판두께(㎜)": "0.6", "규격(㎜)": "350", "덕트공": 0.074, "보통인부": 0.049 }, + { "철판두께(㎜)": "0.6", "규격(㎜)": "400", "덕트공": 0.084, "보통인부": 0.056 }, + { "철판두께(㎜)": "0.6", "규격(㎜)": "450", "덕트공": 0.104, "보통인부": 0.069 }, + { "철판두께(㎜)": "0.6", "규격(㎜)": "500", "덕트공": 0.114, "보통인부": 0.076 }, + { "철판두께(㎜)": "0.6", "규격(㎜)": "550", "덕트공": 0.123, "보통인부": 0.082 }, + { "철판두께(㎜)": "0.6", "규격(㎜)": "600", "덕트공": 0.132, "보통인부": 0.088 } + ], + "주": [ + "① 본 품은 스파이럴덕트(아연도금강판)를 재사용하지 아니하는 때의 절단하여 해체하는 기준이다.", + "② 본 품은 지지철물, 덕트 절단 및 해체를 포함한다.", + "③ 비산방지, 보호 및 안전시설 등의 설치비는 별도 계상한다.", + "④ 폐기물 처리비용은 별도 계상한다.", + "⑤ 공구손료 및 경장비(절단기 등)의 기계경비는 인력품의 2%로 계상한다." + ] + }, + { + "열쇠": "4-1-4 배관보온 해체", + "이름": "배관보온 해체", + "기준": "m당", + "출처": "건설품셈 유지관리 4-1-4", + "조건": { "보온재종류": "고르기", "규격(㎜)": "고르기" }, + "값칸": { "보온공": "인", "보통인부": "인" }, + "줄": [ + { "보온재종류": "고무발포보온재", "규격(㎜)": "ø15", "보온공": 0.014, "보통인부": 0.010 }, + { "보온재종류": "고무발포보온재", "규격(㎜)": "20", "보온공": 0.016, "보통인부": 0.011 }, + { "보온재종류": "고무발포보온재", "규격(㎜)": "25", "보온공": 0.017, "보통인부": 0.011 }, + { "보온재종류": "고무발포보온재", "규격(㎜)": "32", "보온공": 0.020, "보통인부": 0.013 }, + { "보온재종류": "고무발포보온재", "규격(㎜)": "40", "보온공": 0.023, "보통인부": 0.016 }, + { "보온재종류": "고무발포보온재", "규격(㎜)": "50", "보온공": 0.027, "보통인부": 0.018 }, + { "보온재종류": "고무발포보온재", "규격(㎜)": "65", "보온공": 0.029, "보통인부": 0.020 }, + { "보온재종류": "고무발포보온재", "규격(㎜)": "80", "보온공": 0.033, "보통인부": 0.022 }, + { "보온재종류": "고무발포보온재", "규격(㎜)": "100", "보온공": 0.038, "보통인부": 0.025 }, + { "보온재종류": "고무발포보온재", "규격(㎜)": "125", "보온공": 0.046, "보통인부": 0.030 }, + { "보온재종류": "고무발포보온재", "규격(㎜)": "150", "보온공": 0.053, "보통인부": 0.035 }, + { "보온재종류": "고무발포보온재", "규격(㎜)": "200", "보온공": 0.064, "보통인부": 0.042 }, + { "보온재종류": "고무발포보온재", "규격(㎜)": "250", "보온공": 0.073, "보통인부": 0.049 }, + { "보온재종류": "고무발포보온재", "규격(㎜)": "300", "보온공": 0.083, "보통인부": 0.055 }, + { "보온재종류": "발포폴리에틸렌보온재", "규격(㎜)": "ø15", "보온공": 0.010, "보통인부": 0.007 }, + { "보온재종류": "발포폴리에틸렌보온재", "규격(㎜)": "20", "보온공": 0.012, "보통인부": 0.008 }, + { "보온재종류": "발포폴리에틸렌보온재", "규격(㎜)": "25", "보온공": 0.012, "보통인부": 0.008 }, + { "보온재종류": "발포폴리에틸렌보온재", "규격(㎜)": "32", "보온공": 0.014, "보통인부": 0.010 }, + { "보온재종류": "발포폴리에틸렌보온재", "규격(㎜)": "40", "보온공": 0.017, "보통인부": 0.011 }, + { "보온재종류": "발포폴리에틸렌보온재", "규격(㎜)": "50", "보온공": 0.019, "보통인부": 0.013 }, + { "보온재종류": "발포폴리에틸렌보온재", "규격(㎜)": "65", "보온공": 0.021, "보통인부": 0.014 }, + { "보온재종류": "발포폴리에틸렌보온재", "규격(㎜)": "80", "보온공": 0.024, "보통인부": 0.016 }, + { "보온재종류": "발포폴리에틸렌보온재", "규격(㎜)": "100", "보온공": 0.027, "보통인부": 0.018 }, + { "보온재종류": "발포폴리에틸렌보온재", "규격(㎜)": "125", "보온공": 0.033, "보통인부": 0.022 }, + { "보온재종류": "발포폴리에틸렌보온재", "규격(㎜)": "150", "보온공": 0.038, "보통인부": 0.025 }, + { "보온재종류": "발포폴리에틸렌보온재", "규격(㎜)": "200", "보온공": 0.045, "보통인부": 0.030 }, + { "보온재종류": "발포폴리에틸렌보온재", "규격(㎜)": "250", "보온공": 0.052, "보통인부": 0.035 }, + { "보온재종류": "발포폴리에틸렌보온재", "규격(㎜)": "300", "보온공": 0.059, "보통인부": 0.039 }, + { "보온재종류": "유리면보온재(글라스울)", "규격(㎜)": "ø15", "보온공": 0.016, "보통인부": 0.011 }, + { "보온재종류": "유리면보온재(글라스울)", "규격(㎜)": "20", "보온공": 0.018, "보통인부": 0.012 }, + { "보온재종류": "유리면보온재(글라스울)", "규격(㎜)": "25", "보온공": 0.019, "보통인부": 0.013 }, + { "보온재종류": "유리면보온재(글라스울)", "규격(㎜)": "32", "보온공": 0.023, "보통인부": 0.015 }, + { "보온재종류": "유리면보온재(글라스울)", "규격(㎜)": "40", "보온공": 0.026, "보통인부": 0.017 }, + { "보온재종류": "유리면보온재(글라스울)", "규격(㎜)": "50", "보온공": 0.031, "보통인부": 0.020 }, + { "보온재종류": "유리면보온재(글라스울)", "규격(㎜)": "65", "보온공": 0.033, "보통인부": 0.022 }, + { "보온재종류": "유리면보온재(글라스울)", "규격(㎜)": "80", "보온공": 0.038, "보통인부": 0.025 }, + { "보온재종류": "유리면보온재(글라스울)", "규격(㎜)": "100", "보온공": 0.043, "보통인부": 0.028 }, + { "보온재종류": "유리면보온재(글라스울)", "규격(㎜)": "125", "보온공": 0.051, "보통인부": 0.034 }, + { "보온재종류": "유리면보온재(글라스울)", "규격(㎜)": "150", "보온공": 0.060, "보통인부": 0.040 }, + { "보온재종류": "유리면보온재(글라스울)", "규격(㎜)": "200", "보온공": 0.072, "보통인부": 0.048 }, + { "보온재종류": "유리면보온재(글라스울)", "규격(㎜)": "250", "보온공": 0.082, "보통인부": 0.055 }, + { "보온재종류": "유리면보온재(글라스울)", "규격(㎜)": "300", "보온공": 0.093, "보통인부": 0.062 } + ], + "주": [ + "① 본 품은 배관보온재(보온두께 50mm이하)를 재사용하지 아니하는 때의 절단하여 해체하는 기준이다.", + "② 비산방지, 보호 및 안전시설 등의 설치비는 별도 계상한다.", + "③ 폐기물 처리비용은 별도 계상한다." + ] + }, + { + "열쇠": "4-1-5 덕트보온 해체", + "이름": "덕트보온 해체", + "기준": "㎡당", + "출처": "건설품셈 유지관리 4-1-5", + "조건": { "보온재종류": "고르기" }, + "값칸": { "보온공": "인", "보통인부": "인" }, + "줄": [ + { "보온재종류": "고무발포보온재·발포폴리에틸렌보온재", "보온공": 0.081, "보통인부": 0.054 }, + { "보온재종류": "유리면보온재(글라스울)", "보온공": 0.096, "보통인부": 0.064 } + ], + "주": [ + "① 본 품은 재사용하지 아니하는 때의 보온재를 절단하여 해체하는 기준이다.", + "② 비산방지, 보호 및 안전시설 등의 설치비는 별도 계상한다.", + "③ 폐기물 처리비용은 별도 계상한다." + ] + }, + { + "열쇠": "4-1-6 펌프 해체", + "이름": "펌프 해체", + "기준": "대당", + "출처": "건설품셈 유지관리 4-1-6", + "조건": { "규격(kW)": "고르기" }, + "값칸": { "기계설비공": "인", "보통인부": "인" }, + "줄": [ + { "규격(kW)": "0.75 이하", "기계설비공": 0.245, "보통인부": 0.163 }, + { "규격(kW)": "1.5 이하", "기계설비공": 0.271, "보통인부": 0.181 }, + { "규격(kW)": "2.2 이하", "기계설비공": 0.312, "보통인부": 0.208 }, + { "규격(kW)": "3.7 이하", "기계설비공": 0.359, "보통인부": 0.239 }, + { "규격(kW)": "5.5 이하", "기계설비공": 0.432, "보통인부": 0.288 }, + { "규격(kW)": "7.5 이하", "기계설비공": 0.545, "보통인부": 0.363 }, + { "규격(kW)": "11 이하", "기계설비공": 0.685, "보통인부": 0.457 }, + { "규격(kW)": "15 이하", "기계설비공": 0.727, "보통인부": 0.485 }, + { "규격(kW)": "22 이하", "기계설비공": 1.175, "보통인부": 0.783 }, + { "규격(kW)": "37 이하", "기계설비공": 1.517, "보통인부": 1.011 }, + { "규격(kW)": "55 이하", "기계설비공": 2.440, "보통인부": 1.627 }, + { "규격(kW)": "75 이하", "기계설비공": 2.989, "보통인부": 1.993 } + ], + "주": [ + "① 본 품은 일반펌프(급수 및 소방펌프)를 재사용하지 아니하는 때의 절단하여 해체하는 기준이다.", + "② 본 품은 방진가대 해체, 펌프 절단 및 해체를 포함한다.", + "③ 비산방지, 보호 및 안전시설 등의 설치비는 별도 계상한다.", + "④ 폐기물 처리비용은 별도 계상한다.", + "⑤ 공구손료 및 경장비(절단기 등)의 기계경비는 인력품의 2%로 계상한다." + ] + }, + { + "열쇠": "4-1-7 일반기계설비 철거 및 이설", + "이름": "일반기계설비 철거 및 이설 요율", + "기준": "단위:%", + "출처": "건설품셈 유지관리 4-1-7", + "조건": { "구분": "고르기" }, + "값칸": { "철거(재사용고려)": "%", "철거(재사용안함)": "%", "동일구내(인접장소)이설": "%" }, + "줄": [ + { "구분": "1. 기기류", "철거(재사용고려)": 80, "철거(재사용안함)": 60, "동일구내(인접장소)이설": 160 }, + { "구분": "2. 철골류", "철거(재사용고려)": 70, "철거(재사용안함)": 50, "동일구내(인접장소)이설": 150 }, + { "구분": "3. 배관류", "철거(재사용고려)": 60, "철거(재사용안함)": 40, "동일구내(인접장소)이설": 140 }, + { "구분": "4. BELT CONVEYOR류", "철거(재사용고려)": 80, "철거(재사용안함)": 60, "동일구내(인접장소)이설": 160 }, + { "구분": "5. 보온재", "철거(재사용고려)": 60, "철거(재사용안함)": 40, "동일구내(인접장소)이설": 140 }, + { "구분": "6. HEATER & TANK류", "철거(재사용고려)": 70, "철거(재사용안함)": 50, "동일구내(인접장소)이설": 150 }, + { "구분": "7. PUMP & FAN류", "철거(재사용고려)": 60, "철거(재사용안함)": 40, "동일구내(인접장소)이설": 140 }, + { "구분": "8. CRANE류", "철거(재사용고려)": 70, "철거(재사용안함)": 50, "동일구내(인접장소)이설": 150 } + ], + "주": [ + "① '4-1-1 배관 해체~4-1-6 펌프 해체'의 각 항목을 우선 적용하며, 외의 항목은 상기류 유사폼목에 적용할 수 있다.(원문 그대로 「유사폼목」)", + "② 공구손료 및 소모재료는 별도 계상한다.", + "③ 상기의 율은 설치를 100%로 볼 때이다.", + "④ 특수기기에 대하여는 별도 계상한다.", + "⑤ 철거한 설비를 동일구내 또한 인접한 장소가 아닌 곳에 재 설치할 경우에는 설치품+철거품(재사용을 고려할 경우)으로 계상한다.", + "⑥ 다음 항목의 철거는 신설의 50%(재사용을 고려치 않을 경우)로 계상한다 — 적용항목 표를 참고한다." + ] + }, + { + "열쇠": "4-1-7 일반기계설비 철거 및 이설 적용항목", + "이름": "일반기계설비 철거 신설 50% 적용항목", + "기준": "정의", + "출처": "건설품셈 유지관리 4-1-7", + "조건": {}, + "값칸": { "항목": "글" }, + "줄": [ { "항목": "1-4-1 주철관 기계식 접합 및 배관 · 4-2-1 송풍기 설치 · 5-1-1 일반밸브 및 콕류 설치 · 5-1-2 감압밸브장치 설치 · 5-2-1 스팀트랩 장치 설치 · 5-3-1 익스팬션조인트 설치 · 5-3-2 플랙시블커넥터 설치 · 8-1-2 냉동기 설치 · 8-1-3 냉각탑 설치 · 8-2-1 공기가열기, 공기냉각기, 공기여과기 설치 · 8-2-3 공기조화기(Air Handling Unit) 설치 · 8-3-6 방열기 설치 · 10-1-1 옥내소화전함설치 · 10-1-2 소화용구 격납상자설치 · 10-3-1 지하식설치 · 10-3-2 지상식설치 · 10-4-1 일반송수구설치 · 10-4-2 방수구설치" } ], + "주": [ "⑥ 다음 항목의 철거는 신설의 50%(재사용을 고려치 않을 경우)로 계상한다." ] + }, + { + "열쇠": "4-2-1 자동제어설비 철거 및 이설", + "이름": "자동제어설비 철거 및 이설", + "기준": "적용내용", + "출처": "건설품셈 유지관리 4-2-1", + "조건": {}, + "값칸": { "항목": "글", "철거요율": "%", "이설요율": "%" }, + "줄": [ + { + "항목": "12-1-1 계기반 설치 · 12-1-2 플랜트계기 설치 · 12-2-2 계량기 설치 · 12-2-3 도압배관 · 12-2-4 Control Air 배관 · 12-2-5 압축공기 발생장치 및 공기관 배관", + "철거요율": 40, + "이설요율": 140 + } + ], + "주": [ + "적용내용 — 철거는 본 품의 40%(재사용)를 계상한다. 이설은 본 품의 140%를 계상한다." + ] + }, + { + "열쇠": "4-3-1 유량계 교체", + "이름": "유량계 교체", + "기준": "일당", + "출처": "건설품셈 유지관리 4-3-1", + "조건": { "규격(mm)": "고르기" }, + "값칸": { "배관공": "인", "보통인부": "인", "시공량(보호통)": "개", "시공량(유량계)": "개" }, + "줄": [ + { "규격(mm)": "ø13~15", "배관공": 1, "보통인부": 1, "시공량(보호통)": 6.0, "시공량(유량계)": 8.0 }, + { "규격(mm)": "ø20~32", "배관공": 1, "보통인부": 1, "시공량(보호통)": 5.0, "시공량(유량계)": 7.0 }, + { "규격(mm)": "ø40~50", "배관공": 1, "보통인부": 1, "시공량(보호통)": 4.0, "시공량(유량계)": 6.0 }, + { "규격(mm)": "ø65~80", "배관공": 1, "보통인부": 1, "시공량(유량계)": 2.0 }, + { "규격(mm)": "ø100~150", "배관공": 1, "보통인부": 1, "시공량(유량계)": 1.5 }, + { "규격(mm)": "ø200~300", "배관공": 1, "보통인부": 1, "시공량(유량계)": 1.0 } + ], + "주": [ + "비고 — 동일장소에서 수도미터, 온수미터를 병행 교체 시(해체 후 재부착)에는 유량계 교체 시공량에 30%를 감한다.", + "① 본 품은 수도미터(급수용), 온수미터(급탕용, 난방용)의 옥내배관 교체(해체 후 재부착) 기준이다.", + "② 보호통·뚜껑철거 및 재설치가 요구되는 경우에 보호통을 적용한다.", + "③ 본 품은 유량계 해체 및 재부착, 작동시험 및 마무리 작업을 포함한다.", + "④ 공구손료 및 경장비의 기계경비는 인력품의 1%로 계상한다." + ] + }, + { + "열쇠": "4-3-2 관갱생공", + "이름": "관갱생공", + "기준": "m당", + "출처": "건설품셈 유지관리 4-3-2", + "조건": { "규격(㎜)": "고르기" }, + "값칸": { "규사": "㎏", "에폭시도료": "㎏", "배관공": "인", "특별인부": "인", "장비사용시간": "시간" }, + "줄": [ + { "규격(㎜)": "ø15", "규사": 0.520, "에폭시도료": 0.060, "배관공": 0.072, "특별인부": 0.036, "장비사용시간": 0.053 }, + { "규격(㎜)": "20", "규사": 0.590, "에폭시도료": 0.107, "배관공": 0.072, "특별인부": 0.036, "장비사용시간": 0.053 }, + { "규격(㎜)": "25", "규사": 0.707, "에폭시도료": 0.127, "배관공": 0.072, "특별인부": 0.036, "장비사용시간": 0.053 }, + { "규격(㎜)": "32", "규사": 0.880, "에폭시도료": 0.173, "배관공": 0.072, "특별인부": 0.036, "장비사용시간": 0.053 }, + { "규격(㎜)": "40", "규사": 1.083, "에폭시도료": 0.203, "배관공": 0.072, "특별인부": 0.036, "장비사용시간": 0.053 }, + { "규격(㎜)": "50", "규사": 1.343, "에폭시도료": 0.260, "배관공": 0.072, "특별인부": 0.036, "장비사용시간": 0.053 }, + { "규격(㎜)": "65", "규사": 1.687, "에폭시도료": 0.330, "배관공": 0.081, "특별인부": 0.039, "장비사용시간": 0.064 }, + { "규격(㎜)": "80", "규사": 2.083, "에폭시도료": 0.387, "배관공": 0.081, "특별인부": 0.039, "장비사용시간": 0.064 }, + { "규격(㎜)": "100", "규사": 2.580, "에폭시도료": 0.513, "배관공": 0.081, "특별인부": 0.039, "장비사용시간": 0.064 }, + { "규격(㎜)": "125", "규사": 3.177, "에폭시도료": 0.647, "배관공": 0.101, "특별인부": 0.050, "장비사용시간": 0.080 }, + { "규격(㎜)": "150", "규사": 3.977, "에폭시도료": 0.777, "배관공": 0.101, "특별인부": 0.050, "장비사용시간": 0.080 }, + { "규격(㎜)": "200", "규사": 5.030, "에폭시도료": 1.027, "배관공": 0.101, "특별인부": 0.050, "장비사용시간": 0.080 }, + { "규격(㎜)": "250", "규사": 6.297, "에폭시도료": 1.277, "배관공": 0.111, "특별인부": 0.056, "장비사용시간": 0.089 }, + { "규격(㎜)": "300", "규사": 7.610, "에폭시도료": 1.650, "배관공": 0.111, "특별인부": 0.056, "장비사용시간": 0.089 } + ], + "주": [ + "① 본 품은 에어샌드공법을 기준한 것이다.", + "② 도장두께는 0.3∼1㎜일 때를 기준한 것이다.", + "③ 본 품에는 강관 갱생을 위한 관내부세척, 열풍건조, 관내부 피복코팅 및 소운반 품이 포함되어 있다.", + "④ 입상관의 경우는 본 품에 30%를 가산한다.", + "⑤ 검사구 설치, 밸브 및 보온 해체 복구, 가설급수 배관 및 해체에 대한 비용은 별도 계상한다.", + "⑥ 관세척 공사시 발생되는 폐기물을 폐기물관리법 등의 규정에 따라 적정하게 처리하는데 소요되는 비용은 별도 계상한다.", + "⑦ 사용장비중 공기압축기는 규격 25.5㎥/min를 기준한 것이며, 라이닝기(1set)에 대한 기계경비는 별도 계상한다.", + "⑧ 장비조합은 장비조합 표를 기준한다." + ] + }, + { + "열쇠": "4-3-2 관갱생공 장비조합", + "이름": "관갱생공 장비조합", + "기준": "정의", + "출처": "건설품셈 유지관리 4-3-2", + "조건": { "규격(㎜)범위": "고르기" }, + "값칸": { "라이닝기": "글", "공기압축기": "대" }, + "줄": [ + { "규격(㎜)범위": "ø15∼50", "라이닝기": "1set", "공기압축기": 1 }, + { "규격(㎜)범위": "ø65∼100", "라이닝기": "1set", "공기압축기": 2 }, + { "규격(㎜)범위": "ø125∼200", "라이닝기": "1set", "공기압축기": 5 }, + { "규격(㎜)범위": "ø250∼300", "라이닝기": "1set", "공기압축기": 6 } + ], + "주": [ "⑧ 장비조합은 다음을 기준한다." ] + }, + { + "열쇠": "4-3-3 배관누수 검사", + "이름": "배관누수 검사", + "기준": "일당", + "출처": "건설품셈 유지관리 4-3-3", + "조건": {}, + "값칸": { "배관공": "인", "시공량": "회" }, + "줄": [ { "배관공": 2, "시공량": 2.8 } ], + "주": [ + "① 본 품은 급수용, 급탕용, 난방용 옥내배관(∅50mm이하)의 누수보수를 위해 배관을 검사하는 기준이다.", + "② 본 품은 작업준비, 수도검침 및 기록, 미터기 해체 및 재설치, 공기압시험 및 누수탐지, 정리 작업을 포함한다.", + "③ 누수부위에 대한 해체 및 복구, 누수배관 교체 작업은 별도 계상한다.", + "④ 공구손료 및 경장비(공기압축기, 압력계 등)의 기계경비는 인력품의 3%로 계상한다." + ] + } + ] +} From 7e51d2792c48ab099db91838c6f32e01df6eb460 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sat, 19 Sep 2026 17:49:56 +0900 Subject: [PATCH 03/14] =?UTF-8?q?knowledge(master=5Fdata):=20=EA=B1=B4?= =?UTF-8?q?=EC=84=A4=ED=92=88=EC=85=88=20=EA=B1=B4=EC=B6=95=201=EC=9E=A5?= =?UTF-8?q?=20=ED=91=9C=20=EC=9A=94=EC=86=8C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_0146J72jAMHpcmW4n2Y8WakE --- .../master_data/소요량_건설품셈_건축1장.json | 1765 +++++++++++++++++ 1 file changed, 1765 insertions(+) create mode 100644 resources/master_data/소요량_건설품셈_건축1장.json diff --git a/resources/master_data/소요량_건설품셈_건축1장.json b/resources/master_data/소요량_건설품셈_건축1장.json new file mode 100644 index 00000000..ea6bf2a8 --- /dev/null +++ b/resources/master_data/소요량_건설품셈_건축1장.json @@ -0,0 +1,1765 @@ +{ + "그룹": "소요량", + "원문": "건설품셈", + "부문": "건축", + "판": "2026", + "표": [ + { + "그룹": "계수", + "열쇠": "1-1-1 기본철골공수", + "이름": "기본철골공수", + "기준": "인·일/t", + "출처": "건설품셈 건축 1-1-1", + "조건": { + "강재총사용량(t)": "고르기" + }, + "값칸": { + "기본철골공수": "인·일/t" + }, + "줄": [ + { + "강재총사용량(t)": "60미만", + "기본철골공수": 2.48 + }, + { + "강재총사용량(t)": "60이상", + "기본철골공수": 2.31 + }, + { + "강재총사용량(t)": "100이상", + "기본철골공수": 2.2 + }, + { + "강재총사용량(t)": "300이상", + "기본철골공수": 1.97 + }, + { + "강재총사용량(t)": "1,000이상", + "기본철골공수": 1.75 + }, + { + "강재총사용량(t)": "2,000이상", + "기본철골공수": 1.63 + } + ], + "주": [ + "비고 — 전용접부재(Built up) 제작을 기준으로 한 공수로써 H형강부재(Rolled shape) 제작의 경우는 기본 철골공수×0.71로 산정한다.", + "① 기본철골공수에는 비계 및 보조공이 포함되었다.", + "② 공장제작에 따른 제경비는 기본철골공수의 60%이며, 기본철골공수에 포함되지 않았다.", + "③ 산재보험료·기타경비·간접노무비·일반관리비·이윤 등은 공장제작에 따른 제경비에 포함되지 않았다.", + "④ 용접품은 별도 계상한다." + ] + }, + { + "그룹": "계수", + "열쇠": "1-1-1 기본철골공수 H형강환산계수", + "이름": "기본철골공수 H형강부재(Rolled shape) 환산계수", + "기준": "환산", + "출처": "건설품셈 건축 1-1-1", + "조건": { + "부재구분": "고르기" + }, + "값칸": { + "환산계수": "수" + }, + "줄": [ + { + "부재구분": "H형강부재(Rolled shape)", + "환산계수": 0.71 + } + ], + "주": [ + "비고 — 전용접부재(Built up) 제작을 기준으로 한 공수로써 H형강부재(Rolled shape) 제작의 경우는 기본 철골공수×0.71로 산정한다." + ] + }, + { + "그룹": "계수", + "열쇠": "1-1-2 작업난이도", + "이름": "철골공수 산정 — 작업난이도", + "기준": "철골공수=기본철골공수×작업난이도", + "출처": "건설품셈 건축 1-1-2", + "조건": { + "구조공별": "고르기" + }, + "값칸": { + "난이도": "글" + }, + "줄": [ + { + "구조공별": "조립공장, 창고 등으로 가공부재종류가 적은 구조", + "난이도": "0.8∼0.95" + }, + { + "구조공별": "사무청사 등 표준라멘구조", + "난이도": "1.0" + }, + { + "구조공별": "기타 가공부재 종류가 많은 구조", + "난이도": "1.05∼1.2" + } + ], + "주": [ + "철골공수=기본철골공수×작업난이도" + ] + }, + { + "열쇠": "1-1-2 소요 부자재량", + "이름": "철골 가공 조립 소요 부자재량(ton당)", + "기준": "ton당", + "출처": "건설품셈 건축 1-1-2", + "조건": { + "재료": "고르기" + }, + "값칸": { + "단위": "글", + "전용접부재": "수", + "H형강부재": "수" + }, + "줄": [ + { + "재료": "산소", + "단위": "㎥", + "전용접부재": 7.0, + "H형강부재": 3.5 + }, + { + "재료": "L.P.G", + "단위": "㎏", + "전용접부재": 2.8, + "H형강부재": 1.4 + }, + { + "재료": "서비스볼트", + "단위": "본", + "전용접부재": 2.0, + "H형강부재": 1.0 + }, + { + "재료": "보조강재", + "단위": "㎏", + "전용접부재": 6.0, + "H형강부재": 2.0 + } + ], + "주": [ + "※ 철골제작에서 용접을 제외한 철골가공 조립과정에서 소요되는 부자재량이며, 현장 철골 세우기는 별도 계상함.", + "※ 서비스 볼트는 일반 볼트이며 규격은 설계에 따라 계상함." + ] + }, + { + "그룹": "계수", + "열쇠": "1-1-3 기본용접공수", + "이름": "기본용접공수", + "기준": "인·일/t — 1ton당 필릿 용접 각장 6㎜ 환산수량", + "출처": "건설품셈 건축 1-1-3", + "조건": { + "환산용접길이(m/t)": "고르기" + }, + "값칸": { + "기본용접공수": "인·일/t" + }, + "줄": [ + { + "환산용접길이(m/t)": "20미만", + "기본용접공수": 0.22 + }, + { + "환산용접길이(m/t)": "20이상", + "기본용접공수": 0.37 + }, + { + "환산용접길이(m/t)": "30이상", + "기본용접공수": 0.51 + }, + { + "환산용접길이(m/t)": "40이상", + "기본용접공수": 0.63 + }, + { + "환산용접길이(m/t)": "50이상", + "기본용접공수": 0.73 + }, + { + "환산용접길이(m/t)": "60이상", + "기본용접공수": 0.85 + }, + { + "환산용접길이(m/t)": "70이상", + "기본용접공수": 0.95 + }, + { + "환산용접길이(m/t)": "80이상", + "기본용접공수": 1.05 + }, + { + "환산용접길이(m/t)": "90이상", + "기본용접공수": 1.15 + }, + { + "환산용접길이(m/t)": "100이상", + "기본용접공수": 1.24 + }, + { + "환산용접길이(m/t)": "110이상", + "기본용접공수": 1.34 + }, + { + "환산용접길이(m/t)": "120이상", + "기본용접공수": 1.43 + }, + { + "환산용접길이(m/t)": "130이상", + "기본용접공수": 1.51 + }, + { + "환산용접길이(m/t)": "140이상", + "기본용접공수": 1.6 + }, + { + "환산용접길이(m/t)": "150이상", + "기본용접공수": 1.69 + }, + { + "환산용접길이(m/t)": "160이상", + "기본용접공수": 1.77 + }, + { + "환산용접길이(m/t)": "170이상", + "기본용접공수": 1.85 + }, + { + "환산용접길이(m/t)": "180이상", + "기본용접공수": 1.93 + }, + { + "환산용접길이(m/t)": "190이상", + "기본용접공수": 2.02 + }, + { + "환산용접길이(m/t)": "200이상", + "기본용접공수": 2.09 + } + ], + "주": [ + "비고 — 전용접부재(Built up) 제작을 기준으로 한 공수로써 H형강부재(Rolled shape) 제작의 경우는 기본용접공수×0.73으로 산정한다.", + "원문 그대로 — 이어진 가로 표를 쪽마다 머리 줄을 따로 달아 두 표로 찍음.", + "① 1ton당 필릿 용접 각장 6㎜ 환산수량이다.", + "② 공장제작에 따른 제경비는 기본용접공수의 60%이며, 기본용접공수에 포함되지 않았다.", + "③ 산재보험료·기타경비·간접노무비·일반관리비·이윤 등은 공장제작에 따른 제경비에 포함되지 않았다.", + "④ 환산용접길이는 '용접길이×환산계수'로 산출한다.", + "⑤ 특수 구조물의 경우, 세부적인 용접과 절단작업에 대하여, 기계설비부문 플랜트용접공사의 세부 항목을 참조할 수 있다." + ] + }, + { + "그룹": "계수", + "열쇠": "1-1-3 기본용접공수 H형강환산계수", + "이름": "기본용접공수 H형강부재(Rolled shape) 환산계수", + "기준": "환산", + "출처": "건설품셈 건축 1-1-3", + "조건": { + "부재구분": "고르기" + }, + "값칸": { + "환산계수": "수" + }, + "줄": [ + { + "부재구분": "H형강부재(Rolled shape)", + "환산계수": 0.73 + } + ], + "주": [ + "비고 — 전용접부재(Built up) 제작을 기준으로 한 공수로써 H형강부재(Rolled shape) 제작의 경우는 기본용접공수×0.73으로 산정한다." + ] + }, + { + "그룹": "계수", + "열쇠": "1-1-3 필릿용접시의 환산계수", + "이름": "필릿용접시의 환산계수", + "기준": "환산용접길이=용접길이×환산계수", + "출처": "건설품셈 건축 1-1-3", + "조건": { + "판두께(㎜)": "고르기" + }, + "값칸": { + "환산계수": "수" + }, + "줄": [ + { + "판두께(㎜)": "5", + "환산계수": 0.55 + }, + { + "판두께(㎜)": "6", + "환산계수": 0.68 + }, + { + "판두께(㎜)": "7", + "환산계수": 0.81 + }, + { + "판두께(㎜)": "8", + "환산계수": 0.94 + }, + { + "판두께(㎜)": "9", + "환산계수": 1.06 + }, + { + "판두께(㎜)": "10", + "환산계수": 1.17 + }, + { + "판두께(㎜)": "11", + "환산계수": 1.29 + }, + { + "판두께(㎜)": "12", + "환산계수": 1.4 + }, + { + "판두께(㎜)": "13", + "환산계수": 1.5 + }, + { + "판두께(㎜)": "14", + "환산계수": 1.6 + }, + { + "판두께(㎜)": "15", + "환산계수": 1.7 + }, + { + "판두께(㎜)": "16", + "환산계수": 1.79 + }, + { + "판두께(㎜)": "17", + "환산계수": 1.87 + }, + { + "판두께(㎜)": "18", + "환산계수": 2.0 + }, + { + "판두께(㎜)": "19", + "환산계수": 2.04 + }, + { + "판두께(㎜)": "20", + "환산계수": 2.11 + } + ], + "주": [ + "④ 환산용접길이는 '용접길이×환산계수'로 산출한다." + ] + }, + { + "그룹": "계수", + "열쇠": "1-1-3 V,K,X용접시의 환산계수", + "이름": "V, K, X용접시의 환산계수", + "기준": "환산용접길이=용접길이×환산계수", + "출처": "건설품셈 건축 1-1-3", + "조건": { + "판두께(㎜)": "고르기" + }, + "값칸": { + "환산계수": "수" + }, + "줄": [ + { + "판두께(㎜)": "6", + "환산계수": 2.86 + }, + { + "판두께(㎜)": "7", + "환산계수": 2.94 + }, + { + "판두께(㎜)": "8", + "환산계수": 3.03 + }, + { + "판두께(㎜)": "9", + "환산계수": 3.12 + }, + { + "판두께(㎜)": "10", + "환산계수": 3.22 + }, + { + "판두께(㎜)": "11", + "환산계수": 3.32 + }, + { + "판두께(㎜)": "12", + "환산계수": 3.43 + }, + { + "판두께(㎜)": "13", + "환산계수": 3.54 + }, + { + "판두께(㎜)": "14", + "환산계수": 3.66 + }, + { + "판두께(㎜)": "15", + "환산계수": 3.78 + }, + { + "판두께(㎜)": "16", + "환산계수": 3.9 + }, + { + "판두께(㎜)": "18", + "환산계수": 4.17 + }, + { + "판두께(㎜)": "20", + "환산계수": 4.45 + }, + { + "판두께(㎜)": "22", + "환산계수": 4.75 + }, + { + "판두께(㎜)": "24", + "환산계수": 5.07 + }, + { + "판두께(㎜)": "26", + "환산계수": 5.41 + }, + { + "판두께(㎜)": "28", + "환산계수": 5.77 + }, + { + "판두께(㎜)": "30", + "환산계수": 6.14 + }, + { + "판두께(㎜)": "32", + "환산계수": 6.53 + }, + { + "판두께(㎜)": "34", + "환산계수": 6.95 + }, + { + "판두께(㎜)": "35", + "환산계수": 7.16 + }, + { + "판두께(㎜)": "40", + "환산계수": 8.29 + }, + { + "판두께(㎜)": "45", + "환산계수": 9.54 + }, + { + "판두께(㎜)": "50", + "환산계수": 10.9 + }, + { + "판두께(㎜)": "55", + "환산계수": 12.58 + }, + { + "판두께(㎜)": "60", + "환산계수": 13.97 + }, + { + "판두께(㎜)": "65", + "환산계수": 15.68 + }, + { + "판두께(㎜)": "70", + "환산계수": 17.5 + }, + { + "판두께(㎜)": "75", + "환산계수": 19.44 + }, + { + "판두께(㎜)": "80", + "환산계수": 21.49 + } + ], + "주": [ + "원문 그대로 — 판두께·환산계수 두 줄이 한 짝, 칸 선은 짝 사이에만 있고 짝 안 두 줄은 줄마다 찍힘." + ] + }, + { + "그룹": "계수", + "열쇠": "1-1-4 강재총사용량에 의한 보정계수", + "이름": "강재총사용량에 의한 보정계수", + "기준": "용접공수=기본용접공수×강재총사용량에 의한 보정계수", + "출처": "건설품셈 건축 1-1-4", + "조건": { + "강재총사용량(t)": "고르기" + }, + "값칸": { + "보정계수": "수" + }, + "줄": [ + { + "강재총사용량(t)": "30미만", + "보정계수": 1.36 + }, + { + "강재총사용량(t)": "30이상", + "보정계수": 1.31 + }, + { + "강재총사용량(t)": "60이상", + "보정계수": 1.22 + }, + { + "강재총사용량(t)": "100이상", + "보정계수": 1.16 + }, + { + "강재총사용량(t)": "200이상", + "보정계수": 1.08 + }, + { + "강재총사용량(t)": "300이상", + "보정계수": 1.04 + }, + { + "강재총사용량(t)": "400이상", + "보정계수": 1.01 + }, + { + "강재총사용량(t)": "500이상", + "보정계수": 0.99 + }, + { + "강재총사용량(t)": "600이상", + "보정계수": 0.97 + }, + { + "강재총사용량(t)": "700이상", + "보정계수": 0.96 + }, + { + "강재총사용량(t)": "800이상", + "보정계수": 0.94 + }, + { + "강재총사용량(t)": "900이상", + "보정계수": 0.93 + }, + { + "강재총사용량(t)": "1,000이상", + "보정계수": 0.92 + }, + { + "강재총사용량(t)": "1,500이상", + "보정계수": 0.89 + }, + { + "강재총사용량(t)": "2,000이상", + "보정계수": 0.86 + } + ], + "주": [ + "용접공수=기본용접공수×강재총사용량에 의한 보정계수" + ] + }, + { + "열쇠": "1-1-4 소요 용접재료량", + "이름": "용접공수 산정 — 소요 용접재료량(m당)", + "기준": "m당", + "출처": "건설품셈 건축 1-1-4", + "조건": { + "재료": "고르기" + }, + "값칸": { + "단위": "글", + "수용접": "수", + "반자동용접": "수", + "자동용접": "수" + }, + "줄": [ + { + "재료": "용접봉", + "단위": "㎏", + "수용접": 0.42 + }, + { + "재료": "CO_2 와이어", + "단위": "㎏", + "반자동용접": 0.23 + }, + { + "재료": "탄산가스", + "단위": "㎏", + "반자동용접": 0.12 + }, + { + "재료": "잠호용접와이어", + "단위": "㎏", + "자동용접": 0.21 + }, + { + "재료": "FLUX", + "단위": "㎏", + "자동용접": 0.21 + } + ], + "주": [ + "※ 필릿 용접 6㎜ 환산수량으로 반자동용접을 표준으로 함." + ] + }, + { + "열쇠": "1-2-1 현장 세우기", + "이름": "철골 현장 세우기", + "기준": "ton당", + "출처": "건설품셈 건축 1-2-1", + "조건": { + "층수구분": "고르기" + }, + "값칸": { + "철골공": "인", + "비계공": "인", + "특별인부": "인" + }, + "줄": [ + { + "층수구분": "6층 미만", + "철골공": 0.33, + "비계공": 0.14, + "특별인부": 0.07 + }, + { + "층수구분": "20층 미만", + "철골공": 0.44, + "비계공": 0.18, + "특별인부": 0.09 + }, + { + "층수구분": "30층 미만", + "철골공": 0.52, + "비계공": 0.22, + "특별인부": 0.11 + }, + { + "층수구분": "40층 미만", + "철골공": 0.59, + "비계공": 0.24, + "특별인부": 0.12 + }, + { + "층수구분": "40층 이상", + "철골공": 0.65, + "비계공": 0.27, + "특별인부": 0.14 + } + ], + "주": [ + "① 본 품은 가공이 완료된 상태의 철골을 현장에 설치하는 기준이다.", + "② 본 품은 철골 세우기, 가조임 및 변형잡기를 포함한다.", + "③ 타워크레인의 가설·이동·해체에 소요되는 품은 별도 계상한다.", + "④ 자재의 진출입이 어렵고, 작업공간이 협소한 현장(도심지 등)에서는 본 품의 20%를 할증하여 적용한다.", + "⑤ 재료량은 재료량 표를 참고하여 적용한다.", + "⑥ 현장세우기 보정 — 현장조립비=표준단가×K1(보정계수 K1=a×b×c×d), a~d 는 <표·a-1><표·a-2><표·b-1><표·b-2><표·c><표·d> 를 따름.", + "발전소, 공항터미널 등과 같은 특수구조물과 50층 이상(또는 150M 이상)의 초고층건물 현장세우기는 별도 계상한다." + ] + }, + { + "열쇠": "1-2-1 현장 세우기 재료량", + "이름": "철골 현장 세우기 재료량(ton당)", + "기준": "ton당", + "출처": "건설품셈 건축 1-2-1", + "조건": {}, + "값칸": { + "규격": "글", + "단위": "글", + "수량": "수", + "비고": "글" + }, + "줄": [ + { + "규격": "가조임", + "단위": "본", + "수량": 20.0, + "비고": "손율 4%" + } + ], + "주": [ + "⑤ 재료량은 다음을 참고하여 적용한다." + ] + }, + { + "그룹": "계수", + "열쇠": "1-2-1 표·a-1 ㎡당 강재사용에 따른 보정치(6층 미만)", + "이름": "현장세우기 보정 — ㎡당 강재사용량에 따른 보정치 a(6층 미만)", + "기준": "1㎡당", + "출처": "건설품셈 건축 1-2-1", + "조건": { + "강재사용량(㎏)": "고르기" + }, + "값칸": { + "보정치(a)": "수" + }, + "줄": [ + { + "강재사용량(㎏)": "50미만", + "보정치(a)": 1.3 + }, + { + "강재사용량(㎏)": "50이상 55미만", + "보정치(a)": 1.26 + }, + { + "강재사용량(㎏)": "55이상 60미만", + "보정치(a)": 1.22 + }, + { + "강재사용량(㎏)": "60이상 65미만", + "보정치(a)": 1.18 + }, + { + "강재사용량(㎏)": "65이상 70미만", + "보정치(a)": 1.14 + }, + { + "강재사용량(㎏)": "70이상 80미만", + "보정치(a)": 1.1 + }, + { + "강재사용량(㎏)": "80이상 90미만", + "보정치(a)": 1.05 + }, + { + "강재사용량(㎏)": "90이상 110미만", + "보정치(a)": 1.0 + }, + { + "강재사용량(㎏)": "110이상 130미만", + "보정치(a)": 0.95 + }, + { + "강재사용량(㎏)": "130이상 150미만", + "보정치(a)": 0.89 + }, + { + "강재사용량(㎏)": "150이상 190미만", + "보정치(a)": 0.84 + }, + { + "강재사용량(㎏)": "190이상 250미만", + "보정치(a)": 0.77 + } + ], + "주": [ + "a. ㎡당강재사용량에 따른 보정치" + ] + }, + { + "그룹": "계수", + "열쇠": "1-2-1 표·a-2 ㎡당 강재사용에 따른 보정치(6층 이상)", + "이름": "현장세우기 보정 — ㎡당 강재사용량에 따른 보정치 a(6층 이상)", + "기준": "a=1+(60-N)×0.003, N: ㎡당 강재사용량(㎏/㎡)", + "출처": "건설품셈 건축 1-2-1", + "조건": { + "N(㎏)": "고르기" + }, + "값칸": { + "보정치(a)": "수" + }, + "줄": [ + { + "N(㎏)": "40", + "보정치(a)": 1.06 + }, + { + "N(㎏)": "50", + "보정치(a)": 1.03 + }, + { + "N(㎏)": "60", + "보정치(a)": 1.0 + }, + { + "N(㎏)": "70", + "보정치(a)": 0.97 + }, + { + "N(㎏)": "80", + "보정치(a)": 0.94 + }, + { + "N(㎏)": "90", + "보정치(a)": 0.91 + }, + { + "N(㎏)": "100", + "보정치(a)": 0.88 + }, + { + "N(㎏)": "110", + "보정치(a)": 0.85 + }, + { + "N(㎏)": "120", + "보정치(a)": 0.82 + }, + { + "N(㎏)": "130", + "보정치(a)": 0.79 + } + ], + "주": [ + "a. ㎡당강재사용량에 따른 보정치" + ] + }, + { + "그룹": "계수", + "열쇠": "1-2-1 표·b-1 강재 총 사용량에 따른 보정치(6층 미만)", + "이름": "현장세우기 보정 — 강재 총 사용량에 따른 보정치 b(6층 미만)", + "기준": "보정계수", + "출처": "건설품셈 건축 1-2-1", + "조건": { + "강재총사용량(ton)": "고르기" + }, + "값칸": { + "보정치(b)": "수" + }, + "줄": [ + { + "강재총사용량(ton)": "10미만", + "보정치(b)": 1.34 + }, + { + "강재총사용량(ton)": "10이상 15미만", + "보정치(b)": 1.3 + }, + { + "강재총사용량(ton)": "15이상 20미만", + "보정치(b)": 1.26 + }, + { + "강재총사용량(ton)": "20이상 30미만", + "보정치(b)": 1.22 + }, + { + "강재총사용량(ton)": "30이상 50미만", + "보정치(b)": 1.18 + }, + { + "강재총사용량(ton)": "50이상 80미만", + "보정치(b)": 1.14 + }, + { + "강재총사용량(ton)": "80이상 150미만", + "보정치(b)": 1.1 + }, + { + "강재총사용량(ton)": "150이상 250미만", + "보정치(b)": 1.05 + }, + { + "강재총사용량(ton)": "250이상 500미만", + "보정치(b)": 1.0 + }, + { + "강재총사용량(ton)": "500이상 1,000미만", + "보정치(b)": 0.95 + }, + { + "강재총사용량(ton)": "1,000이상", + "보정치(b)": 0.89 + } + ], + "주": [ + "b. 강재총사용량에 따른 보정치" + ] + }, + { + "그룹": "계수", + "열쇠": "1-2-1 표·b-2 강재 총 사용량에 따른 보정치(6층 이상)", + "이름": "현장세우기 보정 — 강재 총 사용량에 따른 보정치 b(6층 이상)", + "기준": "100ton이하 b=1.12+7/T, 100ton이상 b=0.97+15/T, T: 가공총톤수(ton)", + "출처": "건설품셈 건축 1-2-1", + "조건": { + "T(ton)": "고르기" + }, + "값칸": { + "보정치(b)": "수" + }, + "줄": [ + { + "T(ton)": "40이하", + "보정치(b)": 1.3 + }, + { + "T(ton)": "50", + "보정치(b)": 1.26 + }, + { + "T(ton)": "60", + "보정치(b)": 1.24 + }, + { + "T(ton)": "70", + "보정치(b)": 1.22 + }, + { + "T(ton)": "80", + "보정치(b)": 1.21 + }, + { + "T(ton)": "90", + "보정치(b)": 1.2 + }, + { + "T(ton)": "100", + "보정치(b)": 1.19 + }, + { + "T(ton)": "200", + "보정치(b)": 1.045 + }, + { + "T(ton)": "300", + "보정치(b)": 1.02 + }, + { + "T(ton)": "400", + "보정치(b)": 1.008 + }, + { + "T(ton)": "500", + "보정치(b)": 1.0 + }, + { + "T(ton)": "600", + "보정치(b)": 0.995 + }, + { + "T(ton)": "700", + "보정치(b)": 0.991 + }, + { + "T(ton)": "800", + "보정치(b)": 0.989 + }, + { + "T(ton)": "900", + "보정치(b)": 0.987 + }, + { + "T(ton)": "1,000", + "보정치(b)": 0.985 + }, + { + "T(ton)": "1,100", + "보정치(b)": 0.984 + }, + { + "T(ton)": "1,200", + "보정치(b)": 0.983 + }, + { + "T(ton)": "1,300", + "보정치(b)": 0.982 + }, + { + "T(ton)": "1,400", + "보정치(b)": 0.981 + } + ], + "주": [ + "b. 강재총사용량에 따른 보정치" + ] + }, + { + "그룹": "계수", + "열쇠": "1-2-1 표·c 건물 높이에 따른 보정치", + "이름": "현장세우기 보정 — 건물 높이에 따른 보정치 c(6층 이상)", + "기준": "c=1+(0.5H-10)×0.003, H: 건물높이", + "출처": "건설품셈 건축 1-2-1", + "조건": { + "건물높이(H)": "고르기" + }, + "값칸": { + "보정치(c)": "수" + }, + "줄": [ + { + "건물높이(H)": "50m", + "보정치(c)": 1.045 + }, + { + "건물높이(H)": "45", + "보정치(c)": 1.038 + }, + { + "건물높이(H)": "40", + "보정치(c)": 1.03 + }, + { + "건물높이(H)": "35", + "보정치(c)": 1.023 + }, + { + "건물높이(H)": "30", + "보정치(c)": 1.015 + }, + { + "건물높이(H)": "25", + "보정치(c)": 1.008 + }, + { + "건물높이(H)": "20", + "보정치(c)": 1.0 + }, + { + "건물높이(H)": "15", + "보정치(c)": 0.993 + }, + { + "건물높이(H)": "10", + "보정치(c)": 0.985 + }, + { + "건물높이(H)": "5", + "보정치(c)": 0.978 + } + ], + "주": [ + "c. 건물 높이에 따른 보정치" + ] + }, + { + "그룹": "계수", + "열쇠": "1-2-1 표·d 스판평균면적에 따른 보정치", + "이름": "현장세우기 보정 — 스판평균면적에 따른 보정치 d(6층 이상)", + "기준": "d=33/S+0.33, S: 스판 평균면적(㎡)", + "출처": "건설품셈 건축 1-2-1", + "조건": { + "스판평균면적(S)": "고르기" + }, + "값칸": { + "보정치(d)": "수" + }, + "줄": [ + { + "스판평균면적(S)": "20㎡(16-25)", + "보정치(d)": 1.98 + }, + { + "스판평균면적(S)": "30(26-35)", + "보정치(d)": 1.43 + }, + { + "스판평균면적(S)": "40(36-45)", + "보정치(d)": 1.16 + }, + { + "스판평균면적(S)": "50(46-55)", + "보정치(d)": 0.99 + }, + { + "스판평균면적(S)": "60(56-65)", + "보정치(d)": 0.88 + }, + { + "스판평균면적(S)": "70(66-75)", + "보정치(d)": 0.8 + }, + { + "스판평균면적(S)": "80(76-85)", + "보정치(d)": 0.74 + } + ], + "주": [ + "※ 본 표는 간사이(Span)가 10m 이하인 경우임." + ] + }, + { + "열쇠": "1-2-2 탑다운공법 지하 현장 세우기", + "이름": "탑다운공법 지하 현장 세우기", + "기준": "ton당", + "출처": "건설품셈 건축 1-2-2", + "조건": { + "지하층구분": "고르기" + }, + "값칸": { + "철골공": "인", + "용접공": "인", + "특별인부": "인" + }, + "줄": [ + { + "지하층구분": "지하4층 미만", + "철골공": 0.812, + "용접공": 0.382, + "특별인부": 0.171 + }, + { + "지하층구분": "지하7층 미만", + "철골공": 0.878, + "용접공": 0.344, + "특별인부": 0.208 + }, + { + "지하층구분": "지하10층 미만", + "철골공": 0.927, + "용접공": 0.306, + "특별인부": 0.242 + }, + { + "지하층구분": "지하10층 이상", + "철골공": 0.976, + "용접공": 0.268, + "특별인부": 0.276 + } + ], + "주": [ + "① 본 품은 탑다운 공법에 의해 설치되는 1층 바닥 스판을 포함하여 지하층 바닥 스판에 가공이 완료된 상태의 철골을 현장에서 설치하는 기준이다.", + "② 지하 현장 세우기는 철골 가공 조립(공장 생산)이 완료된 상태로 지하에 철골 자재 반입이 완료된 것을 조립 설치하는 기준으로 지상에서 지하로 자재를 반입하는 작업은 제외되어 있다.", + "③ 본 품은 철골 세우기, 가조임 및 변형잡기, 고장력 볼트 본조임, 현장용접을 포함한다.", + "④ 공구손료 및 경장비(전기드릴, 용접기 등)의 기계경비는 인력품의 2%로 계상한다.", + "⑤ 재료량은 설계수량을 적용한다." + ] + }, + { + "열쇠": "1-2-3 철골세우기 장비의 작업능력", + "이름": "철골세우기 장비의 작업능력", + "기준": "1일 처리능력(ton)", + "출처": "건설품셈 건축 1-2-3", + "조건": { + "철골세우기중기": "고르기", + "철골건물의종류": "고르기" + }, + "값칸": { + "1일처리능력": "ton" + }, + "줄": [ + { + "철골세우기중기": "크레인(무한궤도/타이어)", + "철골건물의종류": "창고소규모건물,공장대규모건물,트러스,거더류", + "1일처리능력": 15 + }, + { + "철골세우기중기": "크레인(무한궤도/타이어)", + "철골건물의종류": "기둥,크레인거더", + "1일처리능력": 25 + }, + { + "철골세우기중기": "크레인(무한궤도/타이어)", + "철골건물의종류": "기타", + "1일처리능력": 8 + }, + { + "철골세우기중기": "타워크레인", + "철골건물의종류": "고층건물", + "1일처리능력": 15 + }, + { + "철골세우기중기": "트럭탑재형 크레인", + "철골건물의종류": "소규모건물", + "1일처리능력": 10 + }, + { + "철골세우기중기": "굴착기", + "철골건물의종류": "탑다운공법 지하 거더류", + "1일처리능력": 12 + } + ], + "주": [ + "① 부재의 단위중량에 대한 작업량 및 작업여건에 따라 처리능력을 별도로 결정할 수 있다.", + "② 철골세우기 장비의 손료산정기준에 적용한다.", + "③ 장비규격은 작업여건(작업범위, 위치 등)에 따라 변경할 수 있다." + ] + }, + { + "열쇠": "1-2-4 고장력 볼트 본조임", + "이름": "고장력 볼트 본조임", + "기준": "강재 ton당", + "출처": "건설품셈 건축 1-2-4", + "조건": { + "본수구분": "고르기" + }, + "값칸": { + "철골공": "인", + "특별인부": "인" + }, + "줄": [ + { + "본수구분": "30본/t미만", + "철골공": 0.43, + "특별인부": 0.12 + }, + { + "본수구분": "50본/t미만", + "철골공": 0.52, + "특별인부": 0.14 + }, + { + "본수구분": "70본/t미만", + "철골공": 0.59, + "특별인부": 0.16 + }, + { + "본수구분": "90본/t미만", + "철골공": 0.66, + "특별인부": 0.18 + }, + { + "본수구분": "110본/t미만", + "철골공": 0.72, + "특별인부": 0.2 + }, + { + "본수구분": "110본/t이상", + "철골공": 0.74, + "특별인부": 0.2 + } + ], + "주": [ + "① 본 품은 철골세우기 완료 후 볼트 조임을 완료하는 작업 기준이다.", + "② 본 품은 고장력 볼트(육각볼트, 토크-전단형볼트)의 본조임 및 조임검사가 포함된 것이다.", + "③ 공구손료 및 경장비(전기드릴 등)의 기계경비는 인력품의 3%로 계상한다.", + "④ 본 품은 철골설계수량 300ton 미만을 표준으로 한 것이며 300ton 이상인 고장력 볼트 본조임은 고장력 볼트조임 보정계수표(a)를 적용한다.", + "※ 볼트본조임비=표준단가×K, 보정계수 K=a(고장력 볼트조임 보정계수)." + ] + }, + { + "그룹": "계수", + "열쇠": "1-2-4 고장력 볼트조임 보정계수표(a)", + "이름": "고장력 볼트조임 보정계수표(a)", + "기준": "보정계수 K=a", + "출처": "건설품셈 건축 1-2-4", + "조건": { + "강재총사용량": "고르기", + "1ton당볼트본수": "고르기" + }, + "값칸": { + "보정계수": "수" + }, + "줄": [ + { + "강재총사용량": "300t이상∼500t미만", + "1ton당볼트본수": "50본 미만", + "보정계수": 0.91 + }, + { + "강재총사용량": "300t이상∼500t미만", + "1ton당볼트본수": "50본 이상", + "보정계수": 0.92 + }, + { + "강재총사용량": "300t이상∼500t미만", + "1ton당볼트본수": "90본 이상", + "보정계수": 0.93 + }, + { + "강재총사용량": "500t이상∼1,000t미만", + "1ton당볼트본수": "50본 미만", + "보정계수": 0.87 + }, + { + "강재총사용량": "500t이상∼1,000t미만", + "1ton당볼트본수": "50본 이상", + "보정계수": 0.88 + }, + { + "강재총사용량": "500t이상∼1,000t미만", + "1ton당볼트본수": "90본 이상", + "보정계수": 0.89 + }, + { + "강재총사용량": "1,000t이상", + "1ton당볼트본수": "50본 미만", + "보정계수": 0.84 + }, + { + "강재총사용량": "1,000t이상", + "1ton당볼트본수": "50본 이상", + "보정계수": 0.85 + }, + { + "강재총사용량": "1,000t이상", + "1ton당볼트본수": "90본 이상", + "보정계수": 0.86 + } + ], + "주": [ + "머리 — 「1ton당 볼트 본수」.", + "300ton 이상인 고장력 볼트 본조임은 다음의 보정치를 적용한다." + ] + }, + { + "열쇠": "1-2-5 현장용접", + "이름": "현장용접", + "기준": "각장 6㎜ 환산용접 길이 1m당", + "출처": "건설품셈 건축 1-2-5", + "조건": {}, + "값칸": { + "용접공": "인" + }, + "줄": [ + { + "용접공": 0.04 + } + ], + "주": [ + "① 본 품은 철골부재를 CO2 용접으로 반자동 용접하는 기준이다.", + "② 본 품은 용접 준비, 용접 및 정리작업이 포함된 것이다.", + "③ 공구손료 및 경장비(용접기 등)의 기계경비는 인력품의 4%로 계상한다.", + "④ 별도의 방풍설비가 필요한 경우 별도로 계상한다.", + "⑤ 재료량은 재료량 표를 참고하여 적용한다.(원문 그대로 — 문서상 ⑤ 가 ② 와 같은 글로 중복 인쇄됨)" + ] + }, + { + "열쇠": "1-2-5 현장용접 재료량", + "이름": "현장용접 재료량(각장 6㎜ 환산용접 길이 1m당)", + "기준": "각장 6㎜ 환산용접 길이 1m당", + "출처": "건설품셈 건축 1-2-5", + "조건": { + "구분": "고르기" + }, + "값칸": { + "단위": "글", + "수량": "수" + }, + "줄": [ + { + "구분": "CO_2 와이어", + "단위": "㎏", + "수량": 0.28 + }, + { + "구분": "탄산가스", + "단위": "㎏", + "수량": 0.14 + } + ], + "주": [ + "⑥ 재료량은 다음을 참고하여 적용한다." + ] + }, + { + "열쇠": "1-2-6 앵커 볼트 설치", + "이름": "앵커 볼트 설치", + "기준": "개당", + "출처": "건설품셈 건축 1-2-6", + "조건": { + "규격": "고르기" + }, + "값칸": { + "철골공": "인", + "특별인부": "인" + }, + "줄": [ + { + "규격": "ø16이하", + "철골공": 0.05, + "특별인부": 0.02 + }, + { + "규격": "ø20이하", + "철골공": 0.08, + "특별인부": 0.03 + }, + { + "규격": "ø24이하", + "철골공": 0.12, + "특별인부": 0.05 + }, + { + "규격": "ø28이하", + "철골공": 0.16, + "특별인부": 0.06 + }, + { + "규격": "ø32이하", + "철골공": 0.2, + "특별인부": 0.07 + }, + { + "규격": "ø40이하", + "철골공": 0.23, + "특별인부": 0.09 + } + ], + "주": [ + "① 본 품은 철골세우기를 위해 앵커볼트 설치를 기준한 것이다.", + "② 본 품은 설치위치 확인, 앵커볼트 및 틀 설치가 포함된 것이다.", + "③ 별도의 철제틀이 필요한 경우에는 철물 제작품을 적용한다.", + "④ 일반철골공사에 적용하고 기계설치에는 적용하지 않는다.", + "⑤ 공구손료 및 경장비(용접기 등)의 기계경비는 인력품의 2%로 계상한다.", + "⑥ 콘크리트 독립주 위에서나 기타 비계가 양호치 못한 장소에서는 본 품의 20%까지 가산한다." + ] + }, + { + "열쇠": "1-2-7 철골세우기용 장비의 가설 및 해체이동", + "이름": "철골세우기용 장비의 가설 및 해체이동", + "기준": "대당", + "출처": "건설품셈 건축 1-2-7", + "조건": { + "공종별": "고르기" + }, + "값칸": { + "비계공": "인" + }, + "줄": [ + { + "공종별": "가설", + "비계공": 42.0 + }, + { + "공종별": "해체정비", + "비계공": 42.0 + }, + { + "공종별": "수직이동(1회당)", + "비계공": 6.0 + } + ], + "주": [ + "① 타워크레인 규격은 8ton(권상능력)×50m(작업반경)이고 가설높이는 32.5m일 때의 기준이다.", + "② 타워크레인의 가설이동 해체의 장비와 자재운반(부속자재포함)의 기계경비는 별도 계상한다.", + "③ 타워크레인의 기초설치 및 철거에 소요되는 재료 및 품은 별도 계상한다.", + "④ 타워크레인의 가설이동 해체에 소요되는 공구손료는 인력품의 3%로 계상한다.", + "⑤ 본 품의 타워크레인은 건물 외부 고정식일 경우이며 브레이싱 설치 해체에 대한 재료 및 품은 별도 계상한다.", + "⑥ 본 품의 타워크레인의 가설·해체정비, 수직 이동품은 특수 비계공이며 이외의 필요한 품(전공 등)은 별도 계상한다.", + "⑦ 타워크레인의 가설이동 해체 소요일수 표준은 소요일수 표와 같다." + ] + }, + { + "열쇠": "1-2-7 타워크레인 가설이동해체 소요일수", + "이름": "타워크레인 가설이동 해체 소요일수 표준", + "기준": "정의", + "출처": "건설품셈 건축 1-2-7", + "조건": { + "구분": "고르기" + }, + "값칸": { + "소요일수": "글" + }, + "줄": [ + { + "구분": "가설", + "소요일수": "5∼8일" + }, + { + "구분": "정비", + "소요일수": "100ton시마다 1일" + }, + { + "구분": "수직이동", + "소요일수": "1일" + }, + { + "구분": "해체", + "소요일수": "4∼7일" + } + ], + "주": [ + "⑦ 타워크레인의 가설이동 해체 소요일수 표준은 다음과 같다." + ] + }, + { + "열쇠": "1-3-1 데크플레이트 가스절단", + "이름": "데크플레이트 가스절단", + "기준": "절단길이 10m당", + "출처": "건설품셈 건축 1-3-1", + "조건": { + "판두께": "고르기" + }, + "값칸": { + "용접공": "인" + }, + "줄": [ + { + "판두께": "1.6㎜", + "용접공": 0.17 + }, + { + "판두께": "2.3㎜", + "용접공": 0.23 + } + ], + "주": [ + "① 본 품에는 공구손료가 포함되어 있다.", + "② 재료량은 재료량 표를 참고하여 적용한다." + ] + }, + { + "열쇠": "1-3-1 데크플레이트 가스절단 재료량", + "이름": "데크플레이트 가스절단 재료량(절단길이 10m당)", + "기준": "절단길이 10m당", + "출처": "건설품셈 건축 1-3-1", + "조건": { + "규격": "고르기" + }, + "값칸": { + "산소": "㎥", + "아세틸렌": "㎏", + "L.P.G": "㎏" + }, + "줄": [ + { + "규격": "판두께 1.6㎜", + "산소": 0.37, + "아세틸렌": 0.15, + "L.P.G": 0.12 + }, + { + "규격": "판두께 2.3㎜", + "산소": 0.42, + "아세틸렌": 0.16, + "L.P.G": 0.14 + } + ], + "주": [ + "※ 아세틸렌(산소포함) 또는 L.P.G 중 한가지만 선택 사용한다.", + "※ 산소량은 대기압상태의 기준량이며, 압축산소는 35℃에서 150기압으로 압축용기에 넣어 사용하는 것을 기준으로 한다." + ] + }, + { + "열쇠": "1-3-2 데크플레이트 플라즈마 절단", + "이름": "데크플레이트 플라즈마 절단", + "기준": "절단길이 10m당", + "출처": "건설품셈 건축 1-3-2", + "조건": {}, + "값칸": { + "철골공": "인", + "특별인부": "인" + }, + "줄": [ + { + "철골공": 0.05, + "특별인부": 0.02 + } + ], + "주": [ + "① 본 품은 플라즈마 절단기를 사용하여 데크플레이트를 절단하는 기준으로 일반 데크플레이트와 철근일체형 데크플레이트에 동일하게 적용한다.", + "② 본 품은 절단위치 확인, 데크플레이트 절단작업이 포함된 것이다.", + "③ 공구손료 및 경장비(플라즈마 절단기 등)의 기계경비는 인력품의 10%로 계상한다." + ] + }, + { + "열쇠": "1-3-3 데크플레이트 설치", + "이름": "데크플레이트 설치", + "기준": "㎡당", + "출처": "건설품셈 건축 1-3-3", + "조건": {}, + "값칸": { + "철골공": "인", + "용접공": "인", + "특별인부": "인" + }, + "줄": [ + { + "철골공": 0.03, + "용접공": 0.01, + "특별인부": 0.01 + } + ], + "주": [ + "비고 — 본 품은 10층까지 적용하며, 높이별 인력품의 할증은 할증률 표를 따른다.", + "① 본 품은 주문 제작된 데크플레이트를 설치하는 기준으로 일반 데크플레이트와 철근 일체형 데크플레이트에 동일하게 적용한다.", + "② 본 품은 데크설치(판개), 고정 및 용접, 마감부 처리, 개구부 막이, 엔드플레이트, 콘크리트 스토퍼 작업이 포함된 것이다.", + "③ 소모재료는 설계에 따라 별도 계상한다.", + "④ 공구손료 및 경장비(용접기 등)의 기계경비는 인력품의 5%로 계상한다.", + "⑤ 사용재료의 양중은 현장여건에 따라 양중기계를 선정할 수 있으며 기계경비는 별도 계상한다." + ] + }, + { + "그룹": "계수", + "열쇠": "1-3-3 데크플레이트 설치 높이별 할증률", + "이름": "데크플레이트 설치 높이별 인력품 할증률", + "기준": "할증", + "출처": "건설품셈 건축 1-3-3", + "조건": { + "층수구간": "고르기" + }, + "값칸": { + "할증률": "%" + }, + "줄": [ + { + "층수구간": "11층에서 15층까지", + "할증률": 4 + }, + { + "층수구간": "16층 이상 매 5개층 증가마다 추가", + "할증률": 1 + } + ], + "주": [ + "비고 — 본 품은 10층까지 적용하며, 높이별 인력품의 할증은 11층에서 15층까지는 4%, 16층 이상은 매 5개층 증가마다 1%씩 추가 가산한다." + ] + }, + { + "열쇠": "1-4-1 부대철골 설치", + "이름": "부대철골 설치", + "기준": "ton당", + "출처": "건설품셈 건축 1-4-1", + "조건": {}, + "값칸": { + "철골공": "인", + "특별인부": "인", + "크레인(50ton)": "hr" + }, + "줄": [ + { + "철골공": 1.67, + "특별인부": 0.42, + "크레인(50ton)": 2.5 + } + ], + "주": [ + "규격 — 크레인 50ton.", + "① 본 품은 중도리, 띠장, 캐노피 등 철골공사와 병행하여 시공되는 부대철골의 설치를 기준한 것이다.", + "② 본 품은 현장설치 및 볼트조임 작업이 포함된 것이다.", + "③ 장비의 규격은 작업여건(작업범위, 위치 등)에 따라 변경할 수 있다." + ] + }, + { + "열쇠": "1-4-2 스터드볼트(Stud bolt) 설치", + "이름": "스터드볼트(Stud bolt) 설치", + "기준": "1,000개당", + "출처": "건설품셈 건축 1-4-2", + "조건": { + "부위": "고르기", + "용접구분": "고르기" + }, + "값칸": { + "용접공": "인", + "특별인부": "인" + }, + "줄": [ + { + "부위": "데크플레이트", + "용접구분": "자동용접", + "용접공": 1.52, + "특별인부": 0.9 + }, + { + "부위": "데크플레이트", + "용접구분": "수동용접", + "용접공": 2.67, + "특별인부": 1.58 + }, + { + "부위": "지하 철골 기둥", + "용접구분": "자동용접", + "용접공": 0.94, + "특별인부": 0.63 + }, + { + "부위": "지하 철골 기둥", + "용접구분": "수동용접", + "용접공": 1.65, + "특별인부": 1.11 + } + ], + "주": [ + "① 데크플레이트는 데크플레이트가 설치된 상태에서 스터드볼트를 2열로 용접하는 것을 기준으로 한다.", + "② 지하 철골 기둥은 탑다운공법에 의해 설치된 지하 철골 기둥에 스터드볼트를 용접하는 것을 기준으로 한다.", + "③ 자동용접은 스터드볼트 전용용접기를 사용하는 것을 말하며, 수동용접은 아크용접기를 사용하는 것을 말한다.", + "④ 본 품은 설치위치 확인, 용접 작업이 포함된 것이다.", + "⑤ 공구손료 및 경장비(용접기 등)는 자동용접인 경우 인력품의 22%, 수동용접인 경우 인력품의 18%로 계상한다.", + "⑥ 잡재료는 주재료비의 5%로 계상한다." + ] + }, + { + "열쇠": "1-4-3 철골 내화 피복뿜칠", + "이름": "철골 내화 피복뿜칠", + "기준": "㎜/100㎡당", + "출처": "건설품셈 건축 1-4-3", + "조건": {}, + "값칸": { + "도장공": "인", + "특별인부": "인", + "보통인부": "인", + "그라우팅믹서(390×2(ℓ))": "hr", + "그라우팅펌프(40∼125(ℓ/min))": "hr" + }, + "줄": [ + { + "도장공": 0.062, + "특별인부": 0.056, + "보통인부": 0.062, + "그라우팅믹서(390×2(ℓ))": 0.18, + "그라우팅펌프(40∼125(ℓ/min))": 0.18 + } + ], + "주": [ + "규격 — 그라우팅믹서 390×2(ℓ) · 그라우팅펌프 40∼125(ℓ/min).", + "① 본 품은 내화 피복 질석계 자재를 습식으로 시공하는 기준이다.", + "② 본 품은 방진막 설치 및 해체, 뿜칠작업이 포함된 것이다.", + "③ 철골 바탕면 처리, 청소 및 검사는 별도 계상한다.", + "④ 소모재료 및 장비의 설치, 해체, 이동에 소요되는 품은 별도 계상한다.", + "⑤ 공구손료 및 경장비(분사기 등)의 기계경비는 인력품의 5%로 계상한다.", + "⑥ 철골내화 피복 뿜칠 내화 시간은 국토교통부고시 내화구조의 성능기준에 따른다.", + "⑦ 재료량은 재료량 표를 참고하여 적용한다." + ] + }, + { + "열쇠": "1-4-3 철골 내화 피복뿜칠 재료량", + "이름": "철골 내화 피복뿜칠 재료량(㎜/100㎡당)", + "기준": "㎜/100㎡당", + "출처": "건설품셈 건축 1-4-3", + "조건": { + "구분": "고르기" + }, + "값칸": { + "단위": "글", + "수량": "수" + }, + "줄": [ + { + "구분": "질석", + "단위": "㎏", + "수량": 38.8 + } + ], + "주": [ + "⑦ 재료량은 다음을 참고하여 적용한다." + ] + }, + { + "열쇠": "1-4-4 경량형강철골조 조립설치", + "이름": "경량형강철골조 조립설치", + "기준": "ton당", + "출처": "건설품셈 건축 1-4-4", + "조건": { + "구조구분": "고르기" + }, + "값칸": { + "철공": "인" + }, + "줄": [ + { + "구조구분": "내력식", + "철공": 15.93 + }, + { + "구조구분": "비내력식", + "철공": 12.54 + } + ], + "주": [ + "① 본 품은 건축구조용 표면처리 경량형강을 기준한 것이다.", + "② 본 품은 경량형강 철골세우기로서 내력식은 4층이하를 기준한 것이다.", + "③ 지붕트러스는 내력식을 적용한다.", + "④ 본 품은 소운반, 먹매김, 가공, 조립·설치품이 포함되어 있다.", + "⑤ 공구손료는 인력품의 3%로 계상한다.", + "⑥ 경량형강 철골설치에 장비가 필요한 경우 기계경비는 별도 계상한다.", + "⑦ 외부 비계매기가 필요할 경우 별도 계상한다.", + "⑧ 주재료(스터드, 트랙, 조이스트 등)는 설계수량에 따라 계상하며, 부자재(스크류, 힐티 등)는 주자재비의 3%로 계상한다." + ] + } + ] +} From 6ac235bd7315ccb72dd32937b6a2dd101867d87d Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sat, 19 Sep 2026 17:51:57 +0900 Subject: [PATCH 04/14] =?UTF-8?q?knowledge(master=5Fdata):=20=EA=B1=B4?= =?UTF-8?q?=EC=84=A4=ED=92=88=EC=85=88=20=EA=B1=B4=EC=B6=95=202=EC=9E=A5?= =?UTF-8?q?=20=ED=91=9C=20=EC=9A=94=EC=86=8C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_0146J72jAMHpcmW4n2Y8WakE --- .../master_data/소요량_건설품셈_건축2장.json | 309 ++++++++++++++++++ 1 file changed, 309 insertions(+) create mode 100644 resources/master_data/소요량_건설품셈_건축2장.json diff --git a/resources/master_data/소요량_건설품셈_건축2장.json b/resources/master_data/소요량_건설품셈_건축2장.json new file mode 100644 index 00000000..6b0cb8ef --- /dev/null +++ b/resources/master_data/소요량_건설품셈_건축2장.json @@ -0,0 +1,309 @@ +{ + "그룹": "소요량", + "원문": "건설품셈", + "부문": "건축", + "판": "2026", + "표": [ + { + "열쇠": "2-1-1 벽돌 쌓기", + "이름": "벽돌 쌓기", + "기준": "일당", + "출처": "건설품셈 건축 2-1-1", + "조건": { "시공높이": "고르기", "벽두께": "고르기" }, + "값칸": { "조적공": "인", "보통인부": "인", "시공량": "㎡" }, + "줄": [ + { "시공높이": "3.6m이하", "벽두께": "0.5B", "조적공": 3, "보통인부": 1, "시공량": 25 }, + { "시공높이": "3.6m이하", "벽두께": "1.0B", "조적공": 3, "보통인부": 1, "시공량": 15 }, + { "시공높이": "3.6m이하", "벽두께": "1.5B", "조적공": 3, "보통인부": 1, "시공량": 11 }, + { "시공높이": "3.6m초과~7.2m이하", "벽두께": "0.5B", "조적공": 3, "보통인부": 2, "시공량": 23 }, + { "시공높이": "3.6m초과~7.2m이하", "벽두께": "1.0B", "조적공": 3, "보통인부": 2, "시공량": 13 }, + { "시공높이": "3.6m초과~7.2m이하", "벽두께": "1.5B", "조적공": 3, "보통인부": 2, "시공량": 10 } + ], + "주": [ + "비고 — 공간쌓기를 하는 경우 시공량의 9%를 감한다.", + "비고 — 비계사용 시 높이 7.2m초과하는 경우 3.6m마다 시공량(시공높이 3.6m초과 ~7.2m이하)의 3%를 감한다.", + "비고 — 지게차를 사용하는 경우 보통인부 1인을 제외하고, 지게차 2.5hr을 반영한다.", + "① 본 품은 시멘트 벽돌(19×9×5.7㎝) 쌓기 기준이다.", + "② 본 품은 먹매김, 규준틀설치, 정착철물 설치(긴결철선, 앵커철물 등), 모르타르 비빔, 벽돌 절단 및 쌓기, 줄눈누르기 및 마무리 작업을 포함한다.", + "③ 본 품 배합이 완료된 상태의 건조시멘트모르타르 기준이며, 모르타르 배합(시멘트, 모래)이 필요할 경우 '[건축부문] 9-1-1 모르타르 배합'을 따른다.", + "④ 공구손료 및 경장비(비빔기 등)의 기계경비는 인력품의 2%로 계상한다." + ] + }, + { + "열쇠": "2-1-1 벽돌쌓기 재료량", + "이름": "벽돌쌓기 재료량(㎡당)", + "기준": "㎡당", + "출처": "건설품셈 건축 2-1-1", + "조건": { "벽두께": "고르기" }, + "값칸": { "벽돌(19×9×5.7㎝)": "매", "모르타르": "㎥" }, + "줄": [ + { "벽두께": "0.5B", "벽돌(19×9×5.7㎝)": 75, "모르타르": 0.019 }, + { "벽두께": "1.0B", "벽돌(19×9×5.7㎝)": 149, "모르타르": 0.049 }, + { "벽두께": "1.5B", "벽돌(19×9×5.7㎝)": 224, "모르타르": 0.078 } + ], + "주": [ "※ 모르타르의 재료량은 할증이 포함된 것이며, 배합비는 1:3 이다." ] + }, + { + "열쇠": "2-1-2 치장쌓기 및 줄눈설치", + "이름": "치장쌓기 및 줄눈설치", + "기준": "일당", + "출처": "건설품셈 건축 2-1-2", + "조건": { "시공높이": "고르기", "벽두께": "고르기" }, + "값칸": { "조적공": "인", "줄눈공": "인", "보통인부": "인", "시공량": "㎡" }, + "줄": [ + { "시공높이": "3.6m이하", "벽두께": "0.5B", "조적공": 3, "줄눈공": 2, "보통인부": 1, "시공량": 20 }, + { "시공높이": "3.6m이하", "벽두께": "1.0B", "조적공": 3, "줄눈공": 2, "보통인부": 1, "시공량": 13 }, + { "시공높이": "3.6m이하", "벽두께": "1.5B", "조적공": 3, "줄눈공": 2, "보통인부": 1, "시공량": 9 }, + { "시공높이": "3.6m초과~7.2m이하", "벽두께": "0.5B", "조적공": 3, "줄눈공": 2, "보통인부": 2, "시공량": 18 }, + { "시공높이": "3.6m초과~7.2m이하", "벽두께": "1.0B", "조적공": 3, "줄눈공": 2, "보통인부": 2, "시공량": 11 }, + { "시공높이": "3.6m초과~7.2m이하", "벽두께": "1.5B", "조적공": 3, "줄눈공": 2, "보통인부": 2, "시공량": 8 } + ], + "주": [ + "비고 — 비계사용 시 높이 7.2m초과하는 경우 3.6m마다 시공량(시공높이 3.6m초과 ~7.2m이하)의 3%를 감한다.", + "비고 — 지게차를 사용하는 경우 보통인부 1인을 제외하고, 지게차 2.5hr을 반영한다.", + "① 본 품은 치장벽돌(19×9×5.7㎝)의 공간쌓기(한면치장) 기준이다.", + "② 본 품은 먹매김, 규준틀설치, 정착철물 설치(고정철물, 줄눈보강근, 앵커철물, L형강앵글 등), 모르타르 비빔, 벽돌 절단 및 쌓기, 줄눈파기, 치장줄눈 작업을 포함한다.", + "③ 본 품 배합이 완료된 상태의 건조시멘트모르타르 기준이며, 모르타르 배합(시멘트, 모래)이 필요할 경우 '[건축부문] 9-1-1 모르타르 배합'을 따른다.", + "④ 공구손료 및 경장비(비빔기 등)의 기계경비는 인력품의 2%로 계상한다." + ] + }, + { + "열쇠": "2-1-2 치장쌓기 및 줄눈 재료량", + "이름": "치장쌓기 및 줄눈 재료량(㎡당)", + "기준": "㎡당", + "출처": "건설품셈 건축 2-1-2", + "조건": { "벽두께": "고르기" }, + "값칸": { "벽돌(19×9×5.7㎝)": "매", "모르타르(쌓기)": "㎥", "모르타르(치장줄눈)": "㎥" }, + "줄": [ + { "벽두께": "0.5B", "벽돌(19×9×5.7㎝)": 75, "모르타르(쌓기)": 0.019, "모르타르(치장줄눈)": 0.003 }, + { "벽두께": "1.0B", "벽돌(19×9×5.7㎝)": 149, "모르타르(쌓기)": 0.049, "모르타르(치장줄눈)": 0.003 }, + { "벽두께": "1.5B", "벽돌(19×9×5.7㎝)": 224, "모르타르(쌓기)": 0.078, "모르타르(치장줄눈)": 0.003 } + ], + "주": [ "※ 모르타르의 재료량은 할증이 포함된 것이며, 배합비는 쌓기 1:3 / 치장줄눈 1:1 이다." ] + }, + { + "열쇠": "2-1-3 아치쌓기", + "이름": "아치쌓기", + "기준": "1,000매당", + "출처": "건설품셈 건축 2-1-3", + "조건": { "벽두께": "고르기" }, + "값칸": { "조적공": "인", "보통인부": "인" }, + "줄": [ + { "벽두께": "1.0B", "조적공": 4.5, "보통인부": 2.2 }, + { "벽두께": "1.5B", "조적공": 3.6, "보통인부": 2.0 } + ], + "주": [ + "① 본 품은 기본벽돌(19×9×5.7㎝)의 아치쌓기 기준이다.", + "② 모르타르 배합 및 비빔, 먹매김, 아치벽돌쌓기, 줄눈파기 및 마무리작업을 포함한다.", + "③ 아치용 쌓기에 필요한 가설형틀 및 동바리는 별도 계상한다.", + "④ 공구손료 및 경장비(비빔기 등)의 기계경비는 인력품의 2%로 계상한다." + ] + }, + { + "열쇠": "2-1-4 아치쌓기 치장줄눈 설치", + "이름": "아치쌓기 치장줄눈 설치", + "기준": "1,000매당", + "출처": "건설품셈 건축 2-1-4", + "조건": { "벽두께": "고르기" }, + "값칸": { "줄눈공": "인" }, + "줄": [ + { "벽두께": "1.0B", "줄눈공": 0.4 }, + { "벽두께": "1.5B", "줄눈공": 0.3 } + ], + "주": [ + "① 본 품은 아치쌓기 구간에 치장줄눈을 채우는 기준이다.", + "② 모르타르 배합 및 비빔, 치장줄눈설치 및 마무리 작업을 포함한다." + ] + }, + { + "열쇠": "2-1-4 아치쌓기 및 치장줄눈 재료량", + "이름": "아치쌓기 및 치장줄눈 재료량(1,000매당)", + "기준": "1,000매당", + "출처": "건설품셈 건축 2-1-4", + "조건": { "벽두께": "고르기" }, + "값칸": { "모르타르(쌓기)": "㎥", "모르타르(치장줄눈)": "㎥" }, + "줄": [ + { "벽두께": "1.0B", "모르타르(쌓기)": 0.31, "모르타르(치장줄눈)": 0.019 }, + { "벽두께": "1.5B", "모르타르(쌓기)": 0.34, "모르타르(치장줄눈)": 0.013 } + ], + "주": [ "※ 재료량은 할증이 포함된 것이며, 배합비는 쌓기 1:2 / 치장줄눈 1:1 이다." ] + }, + { + "열쇠": "2-1-5 인방보 설치", + "이름": "인방보 설치", + "기준": "m당", + "출처": "건설품셈 건축 2-1-5", + "조건": { "유형": "고르기" }, + "값칸": { "조적공": "인" }, + "줄": [ + { "유형": "벽돌", "조적공": 0.06 }, + { "유형": "치장벽돌", "조적공": 0.08 }, + { "유형": "블록", "조적공": 0.08 }, + { "유형": "ALC블록", "조적공": 0.06 } + ], + "주": [ + "① 본 품은 개구부 상부에 인방보를 설치하는 기준이다.", + "② 각 유형별 작업범위는 작업범위 표와 같다.", + "③ 인방보를 현장타설 콘크리트로 설치하는 경우 별도 계상한다." + ] + }, + { + "열쇠": "2-1-5 인방보 설치 작업범위", + "이름": "인방보 설치 유형별 작업범위", + "기준": "정의", + "출처": "건설품셈 건축 2-1-5", + "조건": { "구분": "고르기" }, + "값칸": { "작업범위": "글" }, + "줄": [ + { "구분": "벽돌", "작업범위": "인방보(기성콘크리트보) 설치, 철근 및 블록메시 보강, 동바리 설치·해체 작업을 포함한다." }, + { "구분": "치장벽돌", "작업범위": "정착철물(앵커철물, L형강앵글 등) 설치, 인방보(치장벽돌) 설치 작업을 포함한다." }, + { "구분": "블록", "작업범위": "인방보(U형블록) 설치, 철근 보강, 사춤, 동바리 및 가틀 설치·해체 작업을 포함한다." }, + { "구분": "ALC블록", "작업범위": "인방보(ALC인방보) 설치, 철근 보강, 동바리 설치·해체 작업을 포함한다." } + ], + "주": [ "② 각 유형별 작업범위는 다음과 같다." ] + }, + { + "열쇠": "2-2-1 블록쌓기", + "이름": "블록쌓기", + "기준": "일당", + "출처": "건설품셈 건축 2-2-1", + "조건": { "시공높이": "고르기", "블록규격(mm)": "고르기" }, + "값칸": { "조적공": "인", "보통인부": "인", "시공량(한면마감)": "㎡", "시공량(양면마감)": "㎡" }, + "줄": [ + { "시공높이": "3.6m이하", "블록규격(mm)": "390x190x190", "조적공": 3, "보통인부": 1, "시공량(한면마감)": 20, "시공량(양면마감)": 19 }, + { "시공높이": "3.6m이하", "블록규격(mm)": "390x190x150", "조적공": 3, "보통인부": 1, "시공량(한면마감)": 24, "시공량(양면마감)": 23 }, + { "시공높이": "3.6m이하", "블록규격(mm)": "390x190x100", "조적공": 3, "보통인부": 1, "시공량(한면마감)": 28, "시공량(양면마감)": 27 }, + { "시공높이": "3.6m초과~7.2m이하", "블록규격(mm)": "390x190x190", "조적공": 3, "보통인부": 2, "시공량(한면마감)": 19, "시공량(양면마감)": 18 }, + { "시공높이": "3.6m초과~7.2m이하", "블록규격(mm)": "390x190x150", "조적공": 3, "보통인부": 2, "시공량(한면마감)": 23, "시공량(양면마감)": 22 }, + { "시공높이": "3.6m초과~7.2m이하", "블록규격(mm)": "390x190x100", "조적공": 3, "보통인부": 2, "시공량(한면마감)": 27, "시공량(양면마감)": 25 } + ], + "주": [ + "비고 — 비계사용 시 높이 7.2m초과하는 경우 3.6m마다 시공량(시공높이 3.6m초과 ~7.2m이하)의 3%를 감한다.", + "비고 — 지게차를 사용하는 경우 보통인부 1인을 제외하고, 지게차 2.5hr을 반영한다.", + "① 본 품은 콘크리트 블록을 막힌줄눈으로 쌓는 기준이다.", + "② 본 품은 먹매김, 규준틀설치, 와이어 매쉬 삽입, 모르타르 비빔, 블록 절단 및 쌓기, 줄눈누르기 및 마무리 작업을 포함한다.", + "③ 본 품 배합이 완료된 상태의 건조시멘트모르타르 기준이며, 모르타르 배합(시멘트, 모래)이 필요할 경우 '[건축부문] 9-1-1 모르타르 배합'을 따른다.", + "④ 인방보 설치가 필요한 경우 '[건축부문] 2-1-5 인방보 설치'를 따른다.", + "⑤ 공구손료 및 경장비(비빔기 등)의 기계경비는 인력품의 2%로 계상한다." + ] + }, + { + "열쇠": "2-2-1 블록쌓기 재료량", + "이름": "블록쌓기 재료량(㎡당)", + "기준": "㎡당", + "출처": "건설품셈 건축 2-2-1", + "조건": { "블록규격": "고르기" }, + "값칸": { "모르타르": "㎥" }, + "줄": [ + { "블록규격": "390×190×190mm", "모르타르": 0.010 }, + { "블록규격": "390×190×150mm", "모르타르": 0.009 }, + { "블록규격": "390×190×100mm", "모르타르": 0.006 } + ], + "주": [ "※ 재료량은 할증이 포함된 것이며, 배합비는 1:3 이다." ] + }, + { + "열쇠": "2-2-2 블록 보강쌓기", + "이름": "블록 보강쌓기", + "기준": "일당", + "출처": "건설품셈 건축 2-2-2", + "조건": { "시공높이": "고르기", "블록규격(mm)": "고르기" }, + "값칸": { "조적공": "인", "보통인부": "인", "시공량(한면마감)": "㎡", "시공량(양면마감)": "㎡" }, + "줄": [ + { "시공높이": "3.6m이하", "블록규격(mm)": "390x190x190", "조적공": 3, "보통인부": 1, "시공량(한면마감)": 18, "시공량(양면마감)": 17 }, + { "시공높이": "3.6m이하", "블록규격(mm)": "390x190x150", "조적공": 3, "보통인부": 1, "시공량(한면마감)": 22, "시공량(양면마감)": 21 }, + { "시공높이": "3.6m이하", "블록규격(mm)": "390x190x100", "조적공": 3, "보통인부": 1, "시공량(한면마감)": 26, "시공량(양면마감)": 25 }, + { "시공높이": "3.6m초과~7.2m이하", "블록규격(mm)": "390x190x190", "조적공": 3, "보통인부": 2, "시공량(한면마감)": 17, "시공량(양면마감)": 16 }, + { "시공높이": "3.6m초과~7.2m이하", "블록규격(mm)": "390x190x150", "조적공": 3, "보통인부": 2, "시공량(한면마감)": 20, "시공량(양면마감)": 19 }, + { "시공높이": "3.6m초과~7.2m이하", "블록규격(mm)": "390x190x100", "조적공": 3, "보통인부": 2, "시공량(한면마감)": 24, "시공량(양면마감)": 23 } + ], + "주": [ + "비고 — 블록 매장마다(간격 400mm) 사춤을 하는 경우 시공량의 5%를 감한다.", + "비고 — 비계사용 시 높이 7.2m초과하는 경우 3.6m마다 시공량(시공높이 3.6m초과 ~7.2m이하)의 3%를 감한다.", + "비고 — 지게차를 사용하는 경우 보통인부 1인을 제외하고, 지게차 2.5hr을 반영한다.", + "① 본 품은 콘크리트 블록 2장마다(간격 800mm) 사춤하는 통줄눈 쌓기 기준이다.", + "② 본 품은 먹매김, 규준틀설치, 모르타르 비빔, 철망 및 고정철물 설치, 철근 절단 및 설치, 블록 절단 및 쌓기, 모르타르 사춤, 줄눈누르기 및 마무리 작업을 포함한다.", + "③ 본 품 배합이 완료된 상태의 건조시멘트모르타르 기준이며, 모르타르 배합(시멘트, 모래)이 필요할 경우 '[건축부문] 9-1-1 모르타르 배합'을 따른다.", + "④ 인방보 설치가 필요한 경우 '[건축부문] 2-1-5 인방보 설치'를 따른다.", + "⑤ 공구손료 및 경장비(비빔기 등)의 기계경비는 인력품의 3%로 계상한다." + ] + }, + { + "열쇠": "2-2-2 블록 보강쌓기 재료량", + "이름": "블록 보강쌓기 재료량(㎡당)", + "기준": "㎡당", + "출처": "건설품셈 건축 2-2-2", + "조건": { "블록규격": "고르기" }, + "값칸": { "모르타르": "㎥" }, + "줄": [ + { "블록규격": "390×190×190mm", "모르타르": 0.027 }, + { "블록규격": "390×190×150mm", "모르타르": 0.019 }, + { "블록규격": "390×190×100mm", "모르타르": 0.012 } + ], + "주": [ "※ 재료량은 할증이 포함된 것이며, 배합비는 1:3 이다." ] + }, + { + "열쇠": "2-3-1 ALC블록 쌓기", + "이름": "ALC블록 쌓기", + "기준": "일당", + "출처": "건설품셈 건축 2-3-1", + "조건": { "시공높이": "고르기", "블록규격(mm)": "고르기" }, + "값칸": { "조적공": "인", "보통인부": "인", "시공량": "㎡" }, + "줄": [ + { "시공높이": "3.6m이하", "블록규격(mm)": "600x400x100", "조적공": 3, "보통인부": 1, "시공량": 23 }, + { "시공높이": "3.6m이하", "블록규격(mm)": "600x400x125", "조적공": 3, "보통인부": 1, "시공량": 20 }, + { "시공높이": "3.6m이하", "블록규격(mm)": "600x300x150", "조적공": 3, "보통인부": 1, "시공량": 18 }, + { "시공높이": "3.6m이하", "블록규격(mm)": "600x300x200", "조적공": 3, "보통인부": 1, "시공량": 17 }, + { "시공높이": "3.6m초과~7.2m이하", "블록규격(mm)": "600x400x100", "조적공": 3, "보통인부": 2, "시공량": 22 }, + { "시공높이": "3.6m초과~7.2m이하", "블록규격(mm)": "600x400x125", "조적공": 3, "보통인부": 2, "시공량": 19 }, + { "시공높이": "3.6m초과~7.2m이하", "블록규격(mm)": "600x300x150", "조적공": 3, "보통인부": 2, "시공량": 17 }, + { "시공높이": "3.6m초과~7.2m이하", "블록규격(mm)": "600x300x200", "조적공": 3, "보통인부": 2, "시공량": 16 } + ], + "주": [ + "비고 — 비계사용 시 높이 7.2m초과하는 경우 3.6m마다 시공량(시공높이 3.6m초과 ~7.2m이하)의 3%를 감한다.", + "비고 — 지게차를 사용하는 경우 보통인부 1인을 제외하고, 지게차 2.5hr을 반영한다.", + "① 본 품은 경량기포 콘크리트 블록(ALC블록)의 쌓기 기준이다.", + "② 먹매김, 규준틀설치, 모르타르 비빔, 고정철물 설치, 블록 절단 및 설치, 줄눈누르기 및 마무리 작업을 포함한다.", + "③ 본 품 배합이 완료된 상태의 건조시멘트모르타르 기준이며, 모르타르 배합(시멘트, 모래)이 필요할 경우 '[건축부문] 9-1-1 모르타르 배합'을 따른다.", + "④ 인방보 설치가 필요한 경우 '[건축부문] 2-1-5 인방보 설치'를 따른다.", + "⑤ 공구손료 및 경장비(비빔기 등)의 기계경비는 인력품의 3%로 계상한다." + ] + }, + { + "열쇠": "2-3-1 경량기포 콘크리트(ALC) 재료량", + "이름": "경량기포 콘크리트(ALC) 재료량(㎡당)", + "기준": "㎡당", + "출처": "건설품셈 건축 2-3-1", + "조건": { "블록규격(mm)": "고르기" }, + "값칸": { "모르타르": "kg" }, + "줄": [ + { "블록규격(mm)": "600×400×100", "모르타르": 6.0 }, + { "블록규격(mm)": "600×400×125", "모르타르": 7.0 }, + { "블록규격(mm)": "600×300×150", "모르타르": 9.5 }, + { "블록규격(mm)": "600×300×200", "모르타르": 12.0 } + ], + "주": [ "※ 재료량은 할증이 포함된 것이다." ] + }, + { + "열쇠": "2-3-2 ALC패널 설치", + "이름": "ALC패널 설치", + "기준": "일당", + "출처": "건설품셈 건축 2-3-2", + "조건": { "패널두께(mm)": "고르기" }, + "값칸": { "조적공": "인", "보통인부": "인", "시공량": "㎡" }, + "줄": [ + { "패널두께(mm)": "75", "조적공": 3, "보통인부": 1, "시공량": 22 }, + { "패널두께(mm)": "100", "조적공": 3, "보통인부": 1, "시공량": 19 }, + { "패널두께(mm)": "125", "조적공": 3, "보통인부": 1, "시공량": 16 }, + { "패널두께(mm)": "150", "조적공": 3, "보통인부": 1, "시공량": 14 }, + { "패널두께(mm)": "175", "조적공": 3, "보통인부": 1, "시공량": 13 }, + { "패널두께(mm)": "200", "조적공": 3, "보통인부": 1, "시공량": 11 } + ], + "주": [ + "① 본 품은 경량콘크리트 패널의 내벽설치 기준이다.", + "② 본 품은 먹매김, 패널 절단 및 설치, 충전재 주입 및 마무리 작업을 포함한다.", + "③ 부속철물 설치는 별도 계상한다.", + "④ 공구손료 및 경장비(절단기 등)의 기계경비는 인력품의 3%로 계상한다." + ] + } + ] +} From 01a3b594231cf65f1279cd5a3a116eed4e4a49d4 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sat, 19 Sep 2026 17:53:15 +0900 Subject: [PATCH 05/14] =?UTF-8?q?knowledge(master=5Fdata):=20=EA=B1=B4?= =?UTF-8?q?=EC=84=A4=ED=92=88=EC=85=88=20=EA=B1=B4=EC=B6=95=203=EC=9E=A5?= =?UTF-8?q?=20=ED=91=9C=20=EC=9A=94=EC=86=8C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_0146J72jAMHpcmW4n2Y8WakE --- .../master_data/소요량_건설품셈_건축3장.json | 173 ++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 resources/master_data/소요량_건설품셈_건축3장.json diff --git a/resources/master_data/소요량_건설품셈_건축3장.json b/resources/master_data/소요량_건설품셈_건축3장.json new file mode 100644 index 00000000..b9e23a53 --- /dev/null +++ b/resources/master_data/소요량_건설품셈_건축3장.json @@ -0,0 +1,173 @@ +{ + "그룹": "소요량", + "원문": "건설품셈", + "부문": "건축", + "판": "2026", + "표": [ + { + "열쇠": "3-1-1 바탕 고르기", + "이름": "타일공사 바탕 고르기", + "기준": "일당", + "출처": "건설품셈 건축 3-1-1", + "조건": { "부위": "고르기" }, + "값칸": { "미장공": "인", "보통인부": "인", "시공량": "㎡" }, + "줄": [ + { "부위": "벽", "미장공": 2, "보통인부": 1, "시공량": 45 }, + { "부위": "바닥", "미장공": 2, "보통인부": 1, "시공량": 62 } + ], + "주": [ + "① 본 품은 타일공사 전 두께 24mm이하(2회 바름)로 모르타르를 바르는 기준이다.", + "② 본 품은 모르타르 비빔 및 바름, 쇠흙손 마감, 물매 맞추기를 포함한다.", + "③ 본 품 배합이 완료된 상태의 건조시멘트모르타르 기준이며, 모르타르 배합(시멘트, 모래)이 필요할 경우 '[건축부문] 9-1-1 모르타르 배합'을 따른다.", + "④ 공구손료 및 경장비(비빔기 등)의 기계경비는 인력품의 2%로 계상한다." + ] + }, + { + "열쇠": "3-1-2 타일줄눈 설치", + "이름": "타일줄눈 설치", + "기준": "㎡당", + "출처": "건설품셈 건축 3-1-2", + "조건": { "부위": "고르기", "타일규격(㎡)": "고르기" }, + "값칸": { "줄눈공": "인" }, + "줄": [ + { "부위": "바닥면", "타일규격(㎡)": "0.04~0.10㎡이하", "줄눈공": 0.016 }, + { "부위": "바닥면", "타일규격(㎡)": "0.11~0.20㎡이하", "줄눈공": 0.013 }, + { "부위": "바닥면", "타일규격(㎡)": "0.21~0.40㎡이하", "줄눈공": 0.011 }, + { "부위": "벽면", "타일규격(㎡)": "0.04~0.10㎡이하", "줄눈공": 0.020 }, + { "부위": "벽면", "타일규격(㎡)": "0.11~0.20㎡이하", "줄눈공": 0.017 }, + { "부위": "벽면", "타일규격(㎡)": "0.21~0.40㎡이하", "줄눈공": 0.015 } + ], + "주": [ + "① 본 품은 배합이 완료된 상태의 줄눈재로 타일의 줄눈을 설치(도포)하는 기준이다.", + "② 본 품은 줄눈재 비빔, 줄눈설치 및 마무리 작업을 포함한다.", + "③ 재료량은 재료량 표를 참고한다." + ] + }, + { + "열쇠": "3-1-2 타일줄눈 설치 재료량", + "이름": "타일줄눈 설치 재료량(㎡당)", + "기준": "㎡당", + "출처": "건설품셈 건축 3-1-2", + "조건": { "공법": "고르기" }, + "값칸": { "줄눈모르타르량": "㎥" }, + "줄": [ + { "공법": "떠붙이기", "줄눈모르타르량": 0.005 }, + { "공법": "압착붙이기", "줄눈모르타르량": 0.001 } + ], + "주": [ "※ 배합비 1:1 기준하며, 재료할증은 포함되어 있다." ] + }, + { + "열쇠": "3-2-1 떠붙이기", + "이름": "타일 떠붙이기", + "기준": "일당", + "출처": "건설품셈 건축 3-2-1", + "조건": { "타일규격(㎡)": "고르기" }, + "값칸": { "타일공": "인", "보통인부": "인", "시공량": "㎡" }, + "줄": [ + { "타일규격(㎡)": "0.04~0.10이하", "타일공": 2, "보통인부": 1, "시공량": 13 }, + { "타일규격(㎡)": "0.11~0.20이하", "타일공": 2, "보통인부": 1, "시공량": 15 }, + { "타일규격(㎡)": "0.21~0.40이하", "타일공": 2, "보통인부": 1, "시공량": 16 } + ], + "주": [ + "비고 — 특수타일(유도타일, 축광타일, 문양을 내기위해 비규칙적으로 절단하여 시공되는 이형타일 등) 붙임은 시공량의 26~33%를 감한다.", + "① 본 품은 모르타르를 사용한 타일의 떠붙이기(벽면) 기준이다.", + "② 본 품에는 모르타르 비빔, 먹매김, 규준틀설치, 타일붙임, 줄눈파기 및 마무리작업을 포함한다.", + "③ 특정 모양으로 형상화된 타일(부조타일, 벽화타일)을 붙이는 경우 별도 계상한다.", + "④ 본 품 배합이 완료된 상태의 건조시멘트모르타르 기준이며, 모르타르 배합(시멘트, 모래)이 필요할 경우 '[건축부문] 9-1-1 모르타르 배합'을 따른다.", + "⑤ 공구손료 및 경장비(비빔기 등)의 기계경비는 인력품의 3%로 계상한다.", + "⑥ 붙임 모르타르 재료량은 재료량 표를 참고한다." + ] + }, + { + "열쇠": "3-2-1 떠붙이기 붙임 모르타르 재료량", + "이름": "떠붙이기 붙임 모르타르 재료량(㎡당)", + "기준": "㎡당", + "출처": "건설품셈 건축 3-2-1", + "조건": { "바름두께": "고르기" }, + "값칸": { "붙임모르타르(벽체)": "㎥" }, + "줄": [ + { "바름두께": "12㎜", "붙임모르타르(벽체)": 0.014 }, + { "바름두께": "15㎜", "붙임모르타르(벽체)": 0.017 }, + { "바름두께": "18㎜", "붙임모르타르(벽체)": 0.020 }, + { "바름두께": "24㎜", "붙임모르타르(벽체)": 0.026 } + ], + "주": [ "※ 배합비 1:3 기준하며, 재료할증은 포함되어 있다." ] + }, + { + "열쇠": "3-2-2 압착 붙이기", + "이름": "타일 압착 붙이기", + "기준": "일당", + "출처": "건설품셈 건축 3-2-2", + "조건": { "타일규격(㎡)": "고르기" }, + "값칸": { "타일공": "인", "보통인부": "인", "시공량(바닥면)": "㎡", "시공량(벽면)": "㎡" }, + "줄": [ + { "타일규격(㎡)": "0.04~0.10이하", "타일공": 2, "보통인부": 1, "시공량(바닥면)": 18, "시공량(벽면)": 15 }, + { "타일규격(㎡)": "0.11~0.20이하", "타일공": 2, "보통인부": 1, "시공량(바닥면)": 21, "시공량(벽면)": 16 }, + { "타일규격(㎡)": "0.21~0.40이하", "타일공": 2, "보통인부": 1, "시공량(바닥면)": 22, "시공량(벽면)": 18 } + ], + "주": [ + "비고 — 모자이크(유니트형) 타일 붙임은 시공량의 20%를 감한다.", + "비고 — 특수타일(유도타일, 축광타일, 문양을 내기위해 비규칙적으로 절단하여 시공되는 이형타일 등) 붙임은 시공량의 26~33%를 감한다.", + "① 본 품은 모르타르를 사용한 타일의 압착 붙이기 기준이다.", + "② 본 품에는 모르타르 비빔, 먹매김, 규준틀설치, 타일붙임, 줄눈파기 및 마무리작업을 포함한다.", + "③ 특정 모양으로 형상화된 타일(부조타일, 벽화타일)을 붙이는 경우 별도 계상한다.", + "④ 본 품 배합이 완료된 상태의 건조시멘트모르타르 기준이며, 모르타르 배합(시멘트, 모래)이 필요할 경우 '[건축부문] 9-1-1 모르타르 배합'을 따른다.", + "⑤ 공구손료 및 경장비(비빔기 등)의 기계경비는 인력품의 3%로 계상한다.", + "⑥ 붙임 모르타르 재료량은 재료량 표를 참고한다." + ] + }, + { + "열쇠": "3-2-2 압착 붙이기 붙임 모르타르 재료량", + "이름": "압착 붙이기 붙임 모르타르 재료량(㎡당)", + "기준": "㎡당", + "출처": "건설품셈 건축 3-2-2", + "조건": { "바름두께": "고르기" }, + "값칸": { "붙임모르타르(바닥면)": "㎥", "붙임모르타르(벽면)": "㎥" }, + "줄": [ + { "바름두께": "5㎜", "붙임모르타르(바닥면)": 0.005, "붙임모르타르(벽면)": 0.006 }, + { "바름두께": "6㎜", "붙임모르타르(바닥면)": 0.006, "붙임모르타르(벽면)": 0.007 }, + { "바름두께": "7㎜", "붙임모르타르(바닥면)": 0.007, "붙임모르타르(벽면)": 0.008 } + ], + "주": [ "※ 배합비 1:2 기준하며, 재료할증은 포함되어 있다." ] + }, + { + "열쇠": "3-2-3 접착 붙이기", + "이름": "타일 접착 붙이기", + "기준": "일당", + "출처": "건설품셈 건축 3-2-3", + "조건": { "타일규격(㎡)": "고르기" }, + "값칸": { "타일공": "인", "보통인부": "인", "시공량": "㎡" }, + "줄": [ + { "타일규격(㎡)": "0.04~0.10이하", "타일공": 2, "보통인부": 1, "시공량": 25 }, + { "타일규격(㎡)": "0.11~0.20이하", "타일공": 2, "보통인부": 1, "시공량": 26 }, + { "타일규격(㎡)": "0.21~0.40이하", "타일공": 2, "보통인부": 1, "시공량": 28 } + ], + "주": [ + "비고 — 모자이크(유니트형) 타일 붙임은 시공량의 20%를 감한다.", + "비고 — 특수타일(유도타일, 축광타일, 문양을 내기위해 비규칙적으로 절단하여 시공되는 이형타일 등) 붙임은 시공량의 26~33%를 감한다.", + "① 본 품은 유기질접착제를 사용한 타일의 접착붙이기(벽면) 기준이다.", + "② 본 품에는 먹매김, 규준틀설치, 접착제 비빔, 타일붙임, 줄눈파기 및 마무리작업을 포함한다.", + "③ 특정 모양으로 형상화된 타일(부조타일, 벽화타일)을 붙이는 경우 별도 계상한다.", + "④ 공구손료 및 경장비(비빔기 등)의 기계경비는 인력품의 3%로 계상한다." + ] + }, + { + "열쇠": "3-2-4 접착 붙이기(에폭시 접착제)", + "이름": "타일 접착 붙이기(에폭시 접착제)", + "기준": "일당", + "출처": "건설품셈 건축 3-2-4", + "조건": { "타일규격(㎡)": "고르기" }, + "값칸": { "타일공": "인", "보통인부": "인", "시공량": "㎡" }, + "줄": [ + { "타일규격(㎡)": "0.21~0.40이하", "타일공": 2, "보통인부": 1, "시공량": 21 }, + { "타일규격(㎡)": "0.40~0.75이하", "타일공": 3, "보통인부": 1, "시공량": 30 } + ], + "주": [ + "① 본 품은 에폭시 접착제를 사용한 타일의 접착 붙이기(벽면) 기준이다.", + "② 본 품에는 먹매김, 규준틀설치, 접착제 비빔, 타일붙임, 줄눈파기 및 마무리작업을 포함한다.", + "③ 특정 모양으로 형상화된 타일(부조타일, 벽화타일)을 붙이는 경우 별도 계상한다.", + "④ 공구손료 및 경장비(비빔기 등)의 기계경비는 인력품의 3%로 계상한다." + ] + } + ] +} From 89b0d220c3d4a6d0088dc4676702d58fa3794c84 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sat, 19 Sep 2026 18:03:02 +0900 Subject: [PATCH 06/14] =?UTF-8?q?feat(master=5Fdata):=20=EA=B1=B4=EC=84=A4?= =?UTF-8?q?=ED=92=88=EC=85=88=20=ED=86=A0=EB=AA=A9=201=EC=9E=A5(=EB=8F=84?= =?UTF-8?q?=EB=A1=9C=ED=8F=AC=EC=9E=A5)=20=EB=A1=9C=EC=A7=81=2056=EC=A4=84?= =?UTF-8?q?=20=C2=B7=208=EC=9E=A5=20=EA=B8=B0=EA=B3=84=20=EA=B3=A0?= =?UTF-8?q?=EB=A5=B4=EA=B8=B0=20=EB=84=93=ED=9E=98=20=C2=B7=20=EC=9E=90?= =?UTF-8?q?=EC=B2=B4=20=EC=9E=AC=EB=A3=8C=204=EA=B0=9C=20=C2=B7=20?= =?UTF-8?q?=EC=8B=9C=ED=97=98=202=EA=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01JgUhN55Z3BCYhUJTjwTNfj --- .../master_data/로직_건설품셈_공통8장.json | 6 +- .../master_data/로직_건설품셈_토목1장.json | 3623 +++++++++++++++++ resources/master_data/재료_자체.json | 6 +- resources/tester/test_masterdata_check.py | 38 +- 4 files changed, 3668 insertions(+), 5 deletions(-) create mode 100644 resources/master_data/로직_건설품셈_토목1장.json diff --git a/resources/master_data/로직_건설품셈_공통8장.json b/resources/master_data/로직_건설품셈_공통8장.json index 6b313ad8..21e9b5fe 100644 --- a/resources/master_data/로직_건설품셈_공통8장.json +++ b/resources/master_data/로직_건설품셈_공통8장.json @@ -69,7 +69,7 @@ "출처": "건설품셈 공통 8-1-5 · 8-1-6", "소유": "공용", "입력": [ - { "이름": "기계", "고르기": ["1730-0015", "7204-0055", "0602-0150", "2702-0020", "0101-0007", "0101-0010", "0101-0012", "0101-0019", "0101-0032", "2105-0005", "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", "4504-0032", "4504-0036", "4504-0041", "4504-0043", "4504-0047", "4504-0052", "4205-0010", "4205-0017", "4205-0020", "4205-0030", "4205-0040", "4205-0045", "5205-0071", "5205-0103", "5205-0210", "5405-0110", "7505-0025", "0502-0036", "1306-0100", "7204-0160", "1506-0032", "0121-0004", "2105-0002", "2105-0003", "2105-0010", "2105-0015", "2105-0018", "1305-0007"] }, + { "이름": "기계", "고르기": ["1730-0015", "7204-0055", "0602-0150", "2702-0020", "0101-0007", "0101-0010", "0101-0012", "0101-0019", "0101-0032", "2105-0005", "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", "4504-0032", "4504-0036", "4504-0041", "4504-0043", "4504-0047", "4504-0052", "4205-0010", "4205-0017", "4205-0020", "4205-0030", "4205-0040", "4205-0045", "5205-0071", "5205-0103", "5205-0210", "5405-0110", "7505-0025", "0502-0036", "1306-0100", "7204-0160", "1506-0032", "0121-0004", "2105-0002", "2105-0003", "2105-0010", "2105-0015", "2105-0018", "1305-0007", "1306-0120", "1106-0010", "1106-0012", "1206-0008", "3201-0003", "5205-0170"] }, { "이름": "지역", "고르기": [ @@ -316,7 +316,9 @@ "1305-0007", "2106-0002", "2106-0003", - "2106-0005" + "2106-0005", + "3302-0038", + "4430-0400" ] }, { diff --git a/resources/master_data/로직_건설품셈_토목1장.json b/resources/master_data/로직_건설품셈_토목1장.json new file mode 100644 index 00000000..22b6fa28 --- /dev/null +++ b/resources/master_data/로직_건설품셈_토목1장.json @@ -0,0 +1,3623 @@ +{ + "그룹": "로직", + "원문": "건설품셈", + "판": "2026", + "줄": [ + { + "열쇠": "1-1-2 유도선 설치 및 해체", + "이름": "유도선 설치 및 해체", + "결과단위": "원/m", + "출처": "건설품셈 토목 1-1-2", + "소유": "공용", + "입력": [{ "이름": "설치간격", "고르기": ["6m이하", "10m이하"] }], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-1-2 유도선 설치 및 해체, 설치간격=설치간격).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-1-2 유도선 설치 및 해체, 설치간격=설치간격).특별인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-1-2 유도선 설치 및 해체, 설치간격=설치간격).보통인부 / 시공량", + "비목": "노무비" + } + ], + "덧줄": [], + "끝수": null, + "비고": "스틱 설치 천공 별도(주③)" + }, + { + "열쇠": "1-2-1 인력식 소규모장비 포설", + "이름": "동상방지층 인력식 소규모장비 포설", + "결과단위": "원/㎥", + "출처": "건설품셈 토목 1-2-1", + "소유": "공용", + "입력": [ + { "이름": "살수", "고르기": ["살수차", "인력 살수"], "출처": "건설품셈 토목 1-2-1 비고" }, + { "이름": "두께", "단위": "㎝", "출처": "건설품셈 토목 1-2-1 비고" }, + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + }, + { "이름": "보정작업", "고르기": ["해당 없음", "암석작업(연암・보통암・경암)", "전석섞인토사"], "출처": "건설품셈 공통 8-1-7 1" } + ], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-2-1 인력식 소규모장비 포설).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1018", + "이름": "포설공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-2-1 인력식 소규모장비 포설).포설공 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-2-1 인력식 소규모장비 포설).보통인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 굴착기(무한궤도) 시간당 경비, 기계='0201-0060', 지역=지역, 보정작업=보정작업)", + "이름": "굴착기 0.6㎥", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-2-1 인력식 소규모장비 포설).굴착기 * 8 / 시공량" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='7204-0055', 지역=지역)", + "이름": "살수차 5,500ℓ", + "단위": "시간", + "수량": "만약(살수 == '살수차', 찾기(소요량:건설품셈:1-2-1 인력식 소규모장비 포설).살수차 * 8 / 시공량, 0)" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "만약(살수 == '인력 살수', 1 / 두께, 0)", + "비목": "노무비", + "출처": "건설품셈 토목 1-2-1 비고" + } + ], + "덧줄": [], + "끝수": null, + "비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 해석: 인력 살수 = 살수차 빼고 보통인부 100㎡당 1인 · 100㎡ × 두께 = ㎥ 로 바꿈(두께 ㎝ 입력) · 살수량(주④ 두께 20㎝·100㎡당 2ton) 물값은 계산에 안 넣음 · 장비조합·규격 현장여건·시험포장 따라 바꿀 수 있음(주③) · 막힘: 진동롤러(핸드가이드식) 빠짐 — 칸 이름 「진동롤러(핸드가이드식)」 식에서 못 부름" + }, + { + "열쇠": "1-2-2 기계포설(길어깨)", + "이름": "동상방지층 기계포설(길어깨)", + "결과단위": "원/㎥", + "출처": "건설품셈 토목 1-2-2", + "소유": "공용", + "입력": [ + { "이름": "살수", "고르기": ["살수차", "인력 살수"], "출처": "건설품셈 토목 1-2-2 비고" }, + { "이름": "두께", "단위": "㎝", "출처": "건설품셈 토목 1-2-2 비고" }, + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + }, + { "이름": "보정작업", "고르기": ["해당 없음", "암석작업(연암・보통암・경암)", "전석섞인토사"], "출처": "건설품셈 공통 8-1-7 1" } + ], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-2-2 기계포설(길어깨)).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1018", + "이름": "포설공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-2-2 기계포설(길어깨)).포설공 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-2-2 기계포설(길어깨)).보통인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 굴착기(무한궤도) 시간당 경비, 기계='0201-0100', 지역=지역, 보정작업=보정작업)", + "이름": "굴착기 1.0㎥", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-2-2 기계포설(길어깨)).굴착기 * 8 / 시공량" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='1306-0120', 지역=지역)", + "이름": "진동롤러 12ton", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-2-2 기계포설(길어깨)).진동롤러 * 8 / 시공량" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='7204-0160', 지역=지역)", + "이름": "살수차 16,000ℓ", + "단위": "시간", + "수량": "만약(살수 == '살수차', 찾기(소요량:건설품셈:1-2-2 기계포설(길어깨)).살수차 * 8 / 시공량, 0)" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "만약(살수 == '인력 살수', 1 / 두께, 0)", + "비목": "노무비", + "출처": "건설품셈 토목 1-2-2 비고" + } + ], + "덧줄": [], + "끝수": null, + "비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 해석: 인력 살수 = 살수차 빼고 보통인부 100㎡당 1인 · 100㎡ × 두께 = ㎥ 로 바꿈(두께 ㎝ 입력) · 살수량(주④ 두께 20㎝·100㎡당 2ton) 물값은 계산에 안 넣음 · 장비조합·규격 현장여건·시험포장 따라 바꿀 수 있음(주③)" + }, + { + "열쇠": "1-2-3 기계포설(본선)", + "이름": "동상방지층 기계포설(본선)", + "결과단위": "원/㎥", + "출처": "건설품셈 토목 1-2-3", + "소유": "공용", + "입력": [ + { "이름": "살수", "고르기": ["살수차", "인력 살수"], "출처": "건설품셈 토목 1-2-3 비고" }, + { "이름": "두께", "단위": "㎝", "출처": "건설품셈 토목 1-2-3 비고" }, + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + } + ], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-2-3 기계포설(본선)).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1018", + "이름": "포설공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-2-3 기계포설(본선)).포설공 / 시공량", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='0502-0036', 지역=지역)", + "이름": "모터그레이더 3.6m", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-2-3 기계포설(본선)).모터그레이더 * 8 / 시공량" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='1306-0120', 지역=지역)", + "이름": "진동롤러 12ton", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-2-3 기계포설(본선)).진동롤러 * 8 / 시공량" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='7204-0160', 지역=지역)", + "이름": "살수차 16,000ℓ", + "단위": "시간", + "수량": "만약(살수 == '살수차', 찾기(소요량:건설품셈:1-2-3 기계포설(본선)).살수차 * 8 / 시공량, 0)" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "만약(살수 == '인력 살수', 1 / 두께, 0)", + "비목": "노무비", + "출처": "건설품셈 토목 1-2-3 비고" + } + ], + "덧줄": [], + "끝수": null, + "비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 해석: 인력 살수 = 살수차 빼고 보통인부 100㎡당 1인 · 100㎡ × 두께 = ㎥ 로 바꿈(두께 ㎝ 입력) · 살수량(주④ 두께 20㎝·100㎡당 2ton) 물값은 계산에 안 넣음 · 장비조합·규격 현장여건·시험포장 따라 바꿀 수 있음(주③)" + }, + { + "열쇠": "1-3-1 인력식 소규모장비 포설", + "이름": "보조기층 인력식 소규모장비 포설", + "결과단위": "원/㎥", + "출처": "건설품셈 토목 1-3-1", + "소유": "공용", + "입력": [ + { "이름": "살수", "고르기": ["살수차", "인력 살수"], "출처": "건설품셈 토목 1-3-1 비고" }, + { "이름": "두께", "단위": "㎝", "출처": "건설품셈 토목 1-3-1 비고" }, + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + }, + { "이름": "보정작업", "고르기": ["해당 없음", "암석작업(연암・보통암・경암)", "전석섞인토사"], "출처": "건설품셈 공통 8-1-7 1" } + ], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-3-1 인력식 소규모장비 포설).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1018", + "이름": "포설공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-3-1 인력식 소규모장비 포설).포설공 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-3-1 인력식 소규모장비 포설).보통인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 굴착기(무한궤도) 시간당 경비, 기계='0201-0060', 지역=지역, 보정작업=보정작업)", + "이름": "굴착기 0.6㎥", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-3-1 인력식 소규모장비 포설).굴착기 * 8 / 시공량" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='7204-0055', 지역=지역)", + "이름": "살수차 5,500ℓ", + "단위": "시간", + "수량": "만약(살수 == '살수차', 찾기(소요량:건설품셈:1-3-1 인력식 소규모장비 포설).살수차 * 8 / 시공량, 0)" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "만약(살수 == '인력 살수', 1 / 두께, 0)", + "비목": "노무비", + "출처": "건설품셈 토목 1-3-1 비고" + } + ], + "덧줄": [], + "끝수": null, + "비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 해석: 인력 살수 = 살수차 빼고 보통인부 100㎡당 1인 · 100㎡ × 두께 = ㎥ 로 바꿈(두께 ㎝ 입력) · 살수량(주④ 두께 20㎝·100㎡당 2ton) 물값은 계산에 안 넣음 · 장비조합·규격 현장여건·시험포장 따라 바꿀 수 있음(주③) · 막힘: 진동롤러(핸드가이드식) 빠짐 — 칸 이름 「진동롤러(핸드가이드식)」 식에서 못 부름" + }, + { + "열쇠": "1-3-2 기계포설(길어깨)", + "이름": "보조기층 기계포설(길어깨)", + "결과단위": "원/㎥", + "출처": "건설품셈 토목 1-3-2", + "소유": "공용", + "입력": [ + { "이름": "살수", "고르기": ["살수차", "인력 살수"], "출처": "건설품셈 토목 1-3-2 비고" }, + { "이름": "두께", "단위": "㎝", "출처": "건설품셈 토목 1-3-2 비고" }, + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + }, + { "이름": "보정작업", "고르기": ["해당 없음", "암석작업(연암・보통암・경암)", "전석섞인토사"], "출처": "건설품셈 공통 8-1-7 1" } + ], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-3-2 기계포설(길어깨)).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1018", + "이름": "포설공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-3-2 기계포설(길어깨)).포설공 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-3-2 기계포설(길어깨)).보통인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 굴착기(무한궤도) 시간당 경비, 기계='0201-0100', 지역=지역, 보정작업=보정작업)", + "이름": "굴착기 1.0㎥", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-3-2 기계포설(길어깨)).굴착기 * 8 / 시공량" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='1306-0120', 지역=지역)", + "이름": "진동롤러 12ton", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-3-2 기계포설(길어깨)).진동롤러 * 8 / 시공량" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='7204-0160', 지역=지역)", + "이름": "살수차 16,000ℓ", + "단위": "시간", + "수량": "만약(살수 == '살수차', 찾기(소요량:건설품셈:1-3-2 기계포설(길어깨)).살수차 * 8 / 시공량, 0)" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "만약(살수 == '인력 살수', 1 / 두께, 0)", + "비목": "노무비", + "출처": "건설품셈 토목 1-3-2 비고" + } + ], + "덧줄": [], + "끝수": null, + "비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 해석: 인력 살수 = 살수차 빼고 보통인부 100㎡당 1인 · 100㎡ × 두께 = ㎥ 로 바꿈(두께 ㎝ 입력) · 살수량(주④ 두께 20㎝·100㎡당 2ton) 물값은 계산에 안 넣음 · 장비조합·규격 현장여건·시험포장 따라 바꿀 수 있음(주③)" + }, + { + "열쇠": "1-3-3 기계포설(본선)", + "이름": "보조기층 기계포설(본선)", + "결과단위": "원/㎥", + "출처": "건설품셈 토목 1-3-3", + "소유": "공용", + "입력": [ + { "이름": "살수", "고르기": ["살수차", "인력 살수"], "출처": "건설품셈 토목 1-3-3 비고" }, + { "이름": "두께", "단위": "㎝", "출처": "건설품셈 토목 1-3-3 비고" }, + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + } + ], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-3-3 기계포설(본선)).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1018", + "이름": "포설공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-3-3 기계포설(본선)).포설공 / 시공량", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='0502-0036', 지역=지역)", + "이름": "모터그레이더 3.6m", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-3-3 기계포설(본선)).모터그레이더 * 8 / 시공량" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='1306-0120', 지역=지역)", + "이름": "진동롤러 12ton", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-3-3 기계포설(본선)).진동롤러 * 8 / 시공량" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='7204-0160', 지역=지역)", + "이름": "살수차 16,000ℓ", + "단위": "시간", + "수량": "만약(살수 == '살수차', 찾기(소요량:건설품셈:1-3-3 기계포설(본선)).살수차 * 8 / 시공량, 0)" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "만약(살수 == '인력 살수', 1 / 두께, 0)", + "비목": "노무비", + "출처": "건설품셈 토목 1-3-3 비고" + } + ], + "덧줄": [], + "끝수": null, + "비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 해석: 인력 살수 = 살수차 빼고 보통인부 100㎡당 1인 · 100㎡ × 두께 = ㎥ 로 바꿈(두께 ㎝ 입력) · 살수량(주④ 두께 20㎝·100㎡당 2ton) 물값은 계산에 안 넣음 · 장비조합·규격 현장여건·시험포장 따라 바꿀 수 있음(주③)" + }, + { + "열쇠": "1-4-1 인력식 소규모장비 포설", + "이름": "입도조정기층 인력식 소규모장비 포설", + "결과단위": "원/㎥", + "출처": "건설품셈 토목 1-4-1", + "소유": "공용", + "입력": [ + { "이름": "살수", "고르기": ["살수차", "인력 살수"], "출처": "건설품셈 토목 1-4-1 비고" }, + { "이름": "두께", "단위": "㎝", "출처": "건설품셈 토목 1-4-1 비고" }, + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + }, + { "이름": "보정작업", "고르기": ["해당 없음", "암석작업(연암・보통암・경암)", "전석섞인토사"], "출처": "건설품셈 공통 8-1-7 1" } + ], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-4-1 인력식 소규모장비 포설).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1018", + "이름": "포설공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-4-1 인력식 소규모장비 포설).포설공 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-4-1 인력식 소규모장비 포설).보통인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 굴착기(무한궤도) 시간당 경비, 기계='0201-0060', 지역=지역, 보정작업=보정작업)", + "이름": "굴착기 0.6㎥", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-4-1 인력식 소규모장비 포설).굴착기 * 8 / 시공량" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='7204-0055', 지역=지역)", + "이름": "살수차 5,500ℓ", + "단위": "시간", + "수량": "만약(살수 == '살수차', 찾기(소요량:건설품셈:1-4-1 인력식 소규모장비 포설).살수차 * 8 / 시공량, 0)" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "만약(살수 == '인력 살수', 1 / 두께, 0)", + "비목": "노무비", + "출처": "건설품셈 토목 1-4-1 비고" + } + ], + "덧줄": [], + "끝수": null, + "비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 해석: 인력 살수 = 살수차 빼고 보통인부 100㎡당 1인 · 100㎡ × 두께 = ㎥ 로 바꿈(두께 ㎝ 입력) · 살수량(주④ 두께 20㎝·100㎡당 2ton) 물값은 계산에 안 넣음 · 장비조합·규격 현장여건·시험포장 따라 바꿀 수 있음(주③) · 막힘: 진동롤러(핸드가이드식) 빠짐 — 칸 이름 「진동롤러(핸드가이드식)」 식에서 못 부름" + }, + { + "열쇠": "1-4-2 기계포설(길어깨)", + "이름": "입도조정기층 기계포설(길어깨)", + "결과단위": "원/㎥", + "출처": "건설품셈 토목 1-4-2", + "소유": "공용", + "입력": [ + { "이름": "살수", "고르기": ["살수차", "인력 살수"], "출처": "건설품셈 토목 1-4-2 비고" }, + { "이름": "두께", "단위": "㎝", "출처": "건설품셈 토목 1-4-2 비고" }, + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + }, + { "이름": "보정작업", "고르기": ["해당 없음", "암석작업(연암・보통암・경암)", "전석섞인토사"], "출처": "건설품셈 공통 8-1-7 1" } + ], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-4-2 기계포설(길어깨)).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1018", + "이름": "포설공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-4-2 기계포설(길어깨)).포설공 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-4-2 기계포설(길어깨)).보통인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 굴착기(무한궤도) 시간당 경비, 기계='0201-0100', 지역=지역, 보정작업=보정작업)", + "이름": "굴착기 1.0㎥", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-4-2 기계포설(길어깨)).굴착기 * 8 / 시공량" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='1306-0120', 지역=지역)", + "이름": "진동롤러 12ton", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-4-2 기계포설(길어깨)).진동롤러 * 8 / 시공량" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='7204-0160', 지역=지역)", + "이름": "살수차 16,000ℓ", + "단위": "시간", + "수량": "만약(살수 == '살수차', 찾기(소요량:건설품셈:1-4-2 기계포설(길어깨)).살수차 * 8 / 시공량, 0)" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "만약(살수 == '인력 살수', 1 / 두께, 0)", + "비목": "노무비", + "출처": "건설품셈 토목 1-4-2 비고" + } + ], + "덧줄": [], + "끝수": null, + "비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 해석: 인력 살수 = 살수차 빼고 보통인부 100㎡당 1인 · 100㎡ × 두께 = ㎥ 로 바꿈(두께 ㎝ 입력) · 살수량(주④ 두께 20㎝·100㎡당 2ton) 물값은 계산에 안 넣음 · 장비조합·규격 현장여건·시험포장 따라 바꿀 수 있음(주③)" + }, + { + "열쇠": "1-4-3 기계포설(본선)", + "이름": "입도조정기층 기계포설(본선)", + "결과단위": "원/㎥", + "출처": "건설품셈 토목 1-4-3", + "소유": "공용", + "입력": [ + { "이름": "살수", "고르기": ["살수차", "인력 살수"], "출처": "건설품셈 토목 1-4-3 비고" }, + { "이름": "두께", "단위": "㎝", "출처": "건설품셈 토목 1-4-3 비고" }, + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + } + ], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-4-3 기계포설(본선)).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1018", + "이름": "포설공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-4-3 기계포설(본선)).포설공 / 시공량", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='0502-0036', 지역=지역)", + "이름": "모터그레이더 3.6m", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-4-3 기계포설(본선)).모터그레이더 * 8 / 시공량" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='1306-0120', 지역=지역)", + "이름": "진동롤러 12ton", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-4-3 기계포설(본선)).진동롤러 * 8 / 시공량" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='7204-0160', 지역=지역)", + "이름": "살수차 16,000ℓ", + "단위": "시간", + "수량": "만약(살수 == '살수차', 찾기(소요량:건설품셈:1-4-3 기계포설(본선)).살수차 * 8 / 시공량, 0)" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "만약(살수 == '인력 살수', 1 / 두께, 0)", + "비목": "노무비", + "출처": "건설품셈 토목 1-4-3 비고" + } + ], + "덧줄": [], + "끝수": null, + "비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 해석: 인력 살수 = 살수차 빼고 보통인부 100㎡당 1인 · 100㎡ × 두께 = ㎥ 로 바꿈(두께 ㎝ 입력) · 살수량(주④ 두께 20㎝·100㎡당 2ton) 물값은 계산에 안 넣음 · 장비조합·규격 현장여건·시험포장 따라 바꿀 수 있음(주③)" + }, + { + "열쇠": "1-5-1 텍코팅 및 프라임 코팅 살포", + "이름": "텍코팅 및 프라임 코팅 살포", + "결과단위": "원/㎡", + "출처": "건설품셈 토목 1-5-1", + "소유": "공용", + "입력": [ + { "이름": "구분", "고르기": ["인력식", "기계식"] }, + { "이름": "비산방지살포량", "단위": "ℓ/㎡", "출처": "건설품셈 토목 1-5-1 비고" }, + { "이름": "양생모래량", "단위": "㎥/㎡", "출처": "건설품셈 토목 1-5-1 비고" }, + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + } + ], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-5-1 텍코팅 및 프라임 코팅 살포, 구분=구분).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-5-1 텍코팅 및 프라임 코팅 살포, 구분=구분).보통인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "비산방지살포량 / 2000", + "비목": "노무비", + "출처": "건설품셈 토목 1-5-1 비고" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "양생모래량 / 2", + "비목": "노무비", + "출처": "건설품셈 토목 1-5-1 비고" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비(조종원 없음), 기계='3302-0038', 지역=지역)", + "이름": "아스팔트 디스트리뷰터 3,800ℓ", + "단위": "시간", + "수량": "만약(구분 == '기계식', 찾기(소요량:건설품셈:1-5-1 텍코팅 및 프라임 코팅 살포, 구분=구분).아스팔트디스트리뷰터 * 8 / 시공량, 0)" + } + ], + "덧줄": [], + "끝수": null, + "비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 비산 방지 보통인부 2,000ℓ당 1인 · 양생 모래 2㎥당 1인(비고) — 살포량·모래량 설계자 입력(없으면 0) · 해석: 아스팔트 디스트리뷰터는 기계 요소에 조종원 직종이 비어 조종원 없는 경비 로직으로 부름(조종원 빠짐) · 역청재 재료 원문 표에 없음 · 막힘: 아스팔트스프레어 빠짐 — 칸 이름 「아스팔트스프레어(수동식 살포기)」 식에서 못 부름" + }, + { + "열쇠": "1-5-2 아스팔트 기층 소규모포설", + "이름": "아스팔트 기층 소규모포설", + "결과단위": "원/㎡", + "출처": "건설품셈 토목 1-5-2", + "소유": "공용", + "입력": [ + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + } + ], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-5-2 아스팔트 기층 소규모포설).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1019", + "이름": "포장공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-5-2 아스팔트 기층 소규모포설).포장공 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-5-2 아스팔트 기층 소규모포설).보통인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='1730-0015', 지역=지역)", + "이름": "플레이트 콤팩터 1.5ton", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-5-2 아스팔트 기층 소규모포설).플레이트콤팩터 * 8 / 시공량" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='7204-0055', 지역=지역)", + "이름": "살수차 5,500ℓ", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-5-2 아스팔트 기층 소규모포설).살수차 * 8 / 시공량" + } + ], + "덧줄": [], + "끝수": null, + "비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 1층 포설두께 7.5㎝ 이하(주②) · 아스콘 재료 원문 표에 없음 · 막힘: 진동롤러(핸드가이드식) 빠짐 — 칸 이름 「진동롤러(핸드가이드식)」 식에서 못 부름 · 막힘: 로더(타이어) 빠짐 — 칸 이름 「로더(타이어)」 식에서 못 부름" + }, + { + "열쇠": "1-5-5 아스팔트 표층 소규모포설", + "이름": "아스팔트 표층 소규모포설", + "결과단위": "원/㎡", + "출처": "건설품셈 토목 1-5-5", + "소유": "공용", + "입력": [ + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + } + ], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-5-5 아스팔트 표층 소규모포설).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1019", + "이름": "포장공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-5-5 아스팔트 표층 소규모포설).포장공 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-5-5 아스팔트 표층 소규모포설).보통인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='1730-0015', 지역=지역)", + "이름": "플레이트 콤팩터 1.5ton", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-5-5 아스팔트 표층 소규모포설).플레이트콤팩터 * 8 / 시공량" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='7204-0055', 지역=지역)", + "이름": "살수차 5,500ℓ", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-5-5 아스팔트 표층 소규모포설).살수차 * 8 / 시공량" + } + ], + "덧줄": [], + "끝수": null, + "비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 1층 포설두께 7.5㎝ 이하(주②) · 아스콘 재료 원문 표에 없음 · 막힘: 진동롤러(핸드가이드식) 빠짐 — 칸 이름 「진동롤러(핸드가이드식)」 식에서 못 부름 · 막힘: 로더(타이어) 빠짐 — 칸 이름 「로더(타이어)」 식에서 못 부름" + }, + { + "열쇠": "1-5-6 아스팔트 표층 기계포설(소형장비)", + "이름": "아스팔트 표층 기계포설(소형장비)", + "결과단위": "원/㎡", + "출처": "건설품셈 토목 1-5-6", + "소유": "공용", + "입력": [ + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + }, + { "이름": "보정작업", "고르기": ["해당 없음", "암석작업(연암・보통암・경암)", "전석섞인토사"], "출처": "건설품셈 공통 8-1-7 1" } + ], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-5-6 아스팔트 표층 기계포설(소형장비)).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1019", + "이름": "포장공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-5-6 아스팔트 표층 기계포설(소형장비)).포장공 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-5-6 아스팔트 표층 기계포설(소형장비)).보통인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 굴착기(무한궤도) 시간당 경비, 기계='0201-0060', 지역=지역, 보정작업=보정작업)", + "이름": "굴착기 0.6㎥", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-5-6 아스팔트 표층 기계포설(소형장비)).굴착기 * 8 / 시공량" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='1106-0010', 지역=지역)", + "이름": "머캐덤롤러 8~10ton", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-5-6 아스팔트 표층 기계포설(소형장비)).머캐덤롤러 * 8 / 시공량" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='1206-0008', 지역=지역)", + "이름": "탠덤롤러 5∼8ton", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-5-6 아스팔트 표층 기계포설(소형장비)).탠덤롤러 * 8 / 시공량" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='7204-0055', 지역=지역)", + "이름": "살수차 5,500ℓ", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-5-6 아스팔트 표층 기계포설(소형장비)).살수차 * 8 / 시공량" + } + ], + "덧줄": [], + "끝수": null, + "비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 1층 포설두께 5~7㎝(주②) · 아스콘 재료 원문 표에 없음 · 막힘: 아스팔트 피니셔 빠짐 — 칸 이름 「아스팔트 피니셔」 식에서 못 부름 · 막힘: 타이어롤러 줄 빠짐 — 기계 요소에 타이어롤러 없음" + }, + { + "열쇠": "1-5-7 아스팔트 표층 기계포설(대형장비)", + "이름": "아스팔트 표층 기계포설(대형장비)", + "결과단위": "원/㎡", + "출처": "건설품셈 토목 1-5-7", + "소유": "공용", + "입력": [ + { "이름": "시공폭", "고르기": ["2m≤시공폭<3m", "3m≤시공폭"] }, + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + } + ], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-5-7 아스팔트 표층 기계포설(대형장비), 시공폭=시공폭).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1019", + "이름": "포장공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-5-7 아스팔트 표층 기계포설(대형장비), 시공폭=시공폭).포장공 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-5-7 아스팔트 표층 기계포설(대형장비), 시공폭=시공폭).보통인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='1106-0012', 지역=지역)", + "이름": "머캐덤롤러 10∼12ton", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-5-7 아스팔트 표층 기계포설(대형장비), 시공폭=시공폭).머캐덤롤러 * 8 / 시공량" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='1206-0008', 지역=지역)", + "이름": "탠덤롤러 5∼8ton", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-5-7 아스팔트 표층 기계포설(대형장비), 시공폭=시공폭).탠덤롤러 * 8 / 시공량" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='7204-0160', 지역=지역)", + "이름": "살수차 16,000ℓ", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-5-7 아스팔트 표층 기계포설(대형장비), 시공폭=시공폭).살수차 * 8 / 시공량" + } + ], + "덧줄": [], + "끝수": null, + "비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 추가 장비(아스팔트온도조절장비 등) 기계경비 별도(주⑤) · 아스콘 재료 원문 표에 없음 · 막힘: 아스팔트 피니셔 빠짐 — 칸 이름 「아스팔트 피니셔」 식에서 못 부름 · 막힘: 타이어롤러 줄 빠짐 — 기계 요소에 타이어롤러 없음" + }, + { + "열쇠": "1-5-8 쇄석 매스틱 아스팔트(SMA) 표층 포설", + "이름": "쇄석 매스틱 아스팔트(SMA) 표층 포설", + "결과단위": "원/㎡", + "출처": "건설품셈 토목 1-5-8", + "소유": "공용", + "입력": [ + { "이름": "시공폭", "고르기": ["2m≤시공폭<3m", "3m≤시공폭"] }, + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + } + ], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-5-8 쇄석 매스틱 아스팔트(SMA) 표층 포설, 시공폭=시공폭).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1019", + "이름": "포장공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-5-8 쇄석 매스틱 아스팔트(SMA) 표층 포설, 시공폭=시공폭).포장공 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-5-8 쇄석 매스틱 아스팔트(SMA) 표층 포설, 시공폭=시공폭).보통인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='1106-0012', 지역=지역)", + "이름": "머캐덤롤러 10∼12ton", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-5-8 쇄석 매스틱 아스팔트(SMA) 표층 포설, 시공폭=시공폭).머캐덤롤러 * 8 / 시공량" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='1206-0008', 지역=지역)", + "이름": "탠덤롤러 5∼8ton", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-5-8 쇄석 매스틱 아스팔트(SMA) 표층 포설, 시공폭=시공폭).탠덤롤러 * 8 / 시공량" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='7204-0160', 지역=지역)", + "이름": "살수차 16,000ℓ", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-5-8 쇄석 매스틱 아스팔트(SMA) 표층 포설, 시공폭=시공폭).살수차 * 8 / 시공량" + } + ], + "덧줄": [], + "끝수": null, + "비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 시공폭 2m 미만은 1-5-6(주③) · 추가 장비(아스팔트온도조절장비 등) 기계경비 별도(주⑤) · 아스콘 재료 원문 표에 없음 · 막힘: 아스팔트 피니셔 빠짐 — 칸 이름 「아스팔트 피니셔」 식에서 못 부름" + }, + { + "열쇠": "1-5-9 배수성·저소음 아스팔트 표층 포설", + "이름": "배수성·저소음 아스팔트 표층 포설", + "결과단위": "원/㎡", + "출처": "건설품셈 토목 1-5-9", + "소유": "공용", + "입력": [ + { "이름": "시공폭", "고르기": ["2m≤시공폭<3m", "3m≤시공폭"] }, + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + } + ], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-5-9 배수성·저소음 아스팔트 표층 포설, 시공폭=시공폭).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1019", + "이름": "포장공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-5-9 배수성·저소음 아스팔트 표층 포설, 시공폭=시공폭).포장공 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-5-9 배수성·저소음 아스팔트 표층 포설, 시공폭=시공폭).보통인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='1106-0012', 지역=지역)", + "이름": "머캐덤롤러 10∼12ton", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-5-9 배수성·저소음 아스팔트 표층 포설, 시공폭=시공폭).머캐덤롤러 * 8 / 시공량" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='1206-0008', 지역=지역)", + "이름": "탠덤롤러 5∼8ton", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-5-9 배수성·저소음 아스팔트 표층 포설, 시공폭=시공폭).탠덤롤러 * 8 / 시공량" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='7204-0160', 지역=지역)", + "이름": "살수차 16,000ℓ", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-5-9 배수성·저소음 아스팔트 표층 포설, 시공폭=시공폭).살수차 * 8 / 시공량" + } + ], + "덧줄": [], + "끝수": null, + "비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 시공폭 2m 미만은 1-5-6(주③) · 추가 장비(아스팔트온도조절장비 등) 기계경비 별도(주⑤) · 아스콘 재료 원문 표에 없음 · 막힘: 아스팔트 피니셔 빠짐 — 칸 이름 「아스팔트 피니셔」 식에서 못 부름" + }, + { + "열쇠": "1-6-1 린 콘크리트 기층 포설", + "이름": "린 콘크리트 기층 포설", + "결과단위": "원/㎥", + "출처": "건설품셈 토목 1-6-1", + "소유": "공용", + "입력": [ + { "이름": "포장", "고르기": ["일반포장", "터널포장"] }, + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + } + ], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-6-1 린 콘크리트 기층 포설, 포장=포장).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1019", + "이름": "포장공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-6-1 린 콘크리트 기층 포설, 포장=포장).포장공 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-6-1 린 콘크리트 기층 포설, 포장=포장).보통인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='3201-0003', 지역=지역)", + "이름": "아스팔트 피니셔 3m", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-6-1 린 콘크리트 기층 포설, 포장=포장).아스팔트피니셔 * 8 / 시공량" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='1306-0100', 지역=지역)", + "이름": "진동롤러 10ton", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-6-1 린 콘크리트 기층 포설, 포장=포장).진동롤러 * 8 / 시공량" + } + ], + "덧줄": [], + "끝수": null, + "비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 린 콘크리트 재료 원문 표에 없음 · 막힘: 타이어롤러 줄 빠짐 — 기계 요소에 타이어롤러 없음" + }, + { + "열쇠": "1-6-2 표층 인력포설", + "이름": "콘크리트 표층 인력포설", + "결과단위": "원/㎥", + "출처": "건설품셈 토목 1-6-2", + "소유": "공용", + "입력": [{ "이름": "형식", "고르기": ["A-Type", "B-Type"] }, { "이름": "두께", "고르기": ["20㎝", "30㎝", "40㎝"] }], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-6-2 표층 인력포설, 형식=형식, 두께=두께).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1019", + "이름": "포장공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-6-2 표층 인력포설, 형식=형식, 두께=두께).포장공 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-6-2 표층 인력포설, 형식=형식, 두께=두께).보통인부 / 시공량", + "비목": "노무비" + } + ], + "덧줄": [], + "끝수": null, + "비고": "형식 A-Type = 믹서트럭 직접 타설 · B-Type = 후진 진입·경운기 운반 타설(적용기준 표) · 거푸집·줄눈 별도(주③) · 콘크리트 재료 원문 표에 없음" + }, + { + "열쇠": "1-6-3 콘크리트 표층 기계포설(소형장비)", + "이름": "콘크리트 표층 기계포설(소형장비)", + "결과단위": "원/㎥", + "출처": "건설품셈 토목 1-6-3", + "소유": "공용", + "입력": [ + { "이름": "포장", "고르기": ["일반포장", "터널포장", "공항포장"] }, + { "이름": "지장물", "고르기": ["해당 없음", "연속 포설 불가"], "출처": "건설품셈 토목 1-6-3 비고" }, + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + }, + { "이름": "보정작업", "고르기": ["해당 없음", "암석작업(연암・보통암・경암)", "전석섞인토사"], "출처": "건설품셈 공통 8-1-7 1" } + ], + "중간": [ + { + "이름": "시공량", + "식": "찾기(소요량:건설품셈:1-6-3 콘크리트 표층 기계포설(소형장비), 포장=포장).시공량 * (1 - 만약(포장 == '공항포장', 만약(지장물 == '연속 포설 불가', 찾기(소요량:건설품셈:1-6-3 콘크리트 표층 기계포설(소형장비) 계수 비고, 구분='공항포장에서 집수정, 기초 등 지장물에 의해 이동이 빈번하게 발생하여 연속적인 포설이 불가능할 경우 시공량의 15%를 감한다.').값, 0), 0) / 100)", + "출처": "건설품셈 토목 1-6-3 비고" + } + ], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1019", + "이름": "포장공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-6-3 콘크리트 표층 기계포설(소형장비), 포장=포장).포장공 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-6-3 콘크리트 표층 기계포설(소형장비), 포장=포장).특별인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-6-3 콘크리트 표층 기계포설(소형장비), 포장=포장).보통인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 굴착기(무한궤도) 시간당 경비, 기계='0201-0100', 지역=지역, 보정작업=보정작업)", + "이름": "굴착기 1.0㎥", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-6-3 콘크리트 표층 기계포설(소형장비), 포장=포장).굴착기 * 8 / 시공량" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='7204-0160', 지역=지역)", + "이름": "살수차 16,000ℓ", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-6-3 콘크리트 표층 기계포설(소형장비), 포장=포장).살수차 * 8 / 시공량" + } + ], + "덧줄": [], + "끝수": null, + "비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 공항포장에서 지장물로 연속 포설 불가 시 시공량 15% 감(비고) — 공항포장에만 · 해석: 감은 시공량에 곱함 · 양생제·마대·잡품 재료비 별도(주⑤) · 막힘: 콘크리트 페이버 빠짐 — 칸 이름 「콘크리트 페이버」 식에서 못 부름" + }, + { + "열쇠": "1-6-4 콘크리트 표층 기계포설(대형장비)", + "이름": "콘크리트 표층 기계포설(대형장비)", + "결과단위": "원/㎥", + "출처": "건설품셈 토목 1-6-4", + "소유": "공용", + "입력": [ + { "이름": "포장", "고르기": ["일반포장", "터널포장", "공항포장"] }, + { "이름": "지장물", "고르기": ["해당 없음", "연속 포설 불가"], "출처": "건설품셈 토목 1-6-4 비고" }, + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + }, + { "이름": "보정작업", "고르기": ["해당 없음", "암석작업(연암・보통암・경암)", "전석섞인토사"], "출처": "건설품셈 공통 8-1-7 1" } + ], + "중간": [ + { + "이름": "시공량", + "식": "찾기(소요량:건설품셈:1-6-4 콘크리트 표층 기계포설(대형장비), 포장=포장).시공량 * (1 - 만약(포장 == '공항포장', 만약(지장물 == '연속 포설 불가', 찾기(소요량:건설품셈:1-6-4 콘크리트 표층 기계포설(대형장비) 계수 비고, 구분='공항포장에서 집수정, 기초 등 지장물에 의해 이동이 빈번하게 발생하여 연속적인 포설이 불가능할 경우 시공량의 15%를 감한다.').값, 0), 0) / 100)", + "출처": "건설품셈 토목 1-6-4 비고" + } + ], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1019", + "이름": "포장공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-6-4 콘크리트 표층 기계포설(대형장비), 포장=포장).포장공 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-6-4 콘크리트 표층 기계포설(대형장비), 포장=포장).특별인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-6-4 콘크리트 표층 기계포설(대형장비), 포장=포장).보통인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 굴착기(무한궤도) 시간당 경비, 기계='0201-0100', 지역=지역, 보정작업=보정작업)", + "이름": "굴착기 1.0㎥", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-6-4 콘크리트 표층 기계포설(대형장비), 포장=포장).굴착기 * 8 / 시공량" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='7204-0160', 지역=지역)", + "이름": "살수차 16,000ℓ", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-6-4 콘크리트 표층 기계포설(대형장비), 포장=포장).살수차 * 8 / 시공량" + } + ], + "덧줄": [], + "끝수": null, + "비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 공항포장에서 지장물로 연속 포설 불가 시 시공량 15% 감(비고) — 공항포장에만 · 해석: 감은 시공량에 곱함 · 양생제·마대·잡품 재료비 별도(주⑤) · 막힘: 콘크리트 페이버 빠짐 — 칸 이름 「콘크리트 페이버」 식에서 못 부름" + }, + { + "열쇠": "1-6-5 기계포설 장비조립 및 해체", + "이름": "콘크리트 페이버 조립 및 해체", + "결과단위": "원/회", + "출처": "건설품셈 토목 1-6-5", + "소유": "공용", + "입력": [ + { "이름": "구분", "고르기": ["외부 반출/반입", "작업구간 이동"] }, + { "이름": "작업", "고르기": ["조립", "해체"] }, + { + "이름": "크레인", + "고르기": [ + "2105-0005", + "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", + "2105-0002", + "2105-0003", + "2105-0010", + "2105-0015", + "2105-0018" + ] + }, + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + } + ], + "중간": [{ "이름": "소요일수", "식": "찾기(소요량:건설품셈:1-6-5 기계포설 장비조립 및 해체, 구분=구분, 작업=작업).소요일수" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1051", + "이름": "기계설비공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-6-5 기계포설 장비조립 및 해체, 구분=구분, 작업=작업).기계설비공 * 소요일수", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1009", + "이름": "철공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-6-5 기계포설 장비조립 및 해체, 구분=구분, 작업=작업).철공 * 소요일수", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-6-5 기계포설 장비조립 및 해체, 구분=구분, 작업=작업).특별인부 * 소요일수", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계=크레인, 지역=지역)", + "이름": "크레인", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-6-5 기계포설 장비조립 및 해체, 구분=구분, 작업=작업).크레인 * 8 * 소요일수" + } + ], + "덧줄": [ + { + "이름": "공구손료 및 경장비", + "식": "((찾기(소요량:건설품셈:1-6-5 기계포설 장비조립 및 해체, 구분=구분, 작업=작업).기계설비공 * 소요일수) * 인력:건설노임:1051 + (찾기(소요량:건설품셈:1-6-5 기계포설 장비조립 및 해체, 구분=구분, 작업=작업).철공 * 소요일수) * 인력:건설노임:1009 + (찾기(소요량:건설품셈:1-6-5 기계포설 장비조립 및 해체, 구분=구분, 작업=작업).특별인부 * 소요일수) * 인력:건설노임:1003) * 찾기(소요량:건설품셈:1-6-5 기계포설 장비조립 및 해체 계수 주⑤, 구분='공구손료 및 경장비(소형브레이커, 용접기 등)의 기계경비').값 / 100", + "비목": "경비", + "출처": "건설품셈 토목 1-6-5 주⑤" + } + ], + "끝수": null, + "비고": "해석: 인력품 = 인력 호표 줄 금액 합(기계 조종원 제외) · 해석: 편성 인원·장비는 1일 편성 — 소요일수를 곱함 · 크레인 1대 × 1일 8시간 · 크레인 종류·규격 설계자 고름 — 원문 규격 없음(주④ 현장여건)" + }, + { + "열쇠": "1-6-6 포장줄눈 절단", + "이름": "포장줄눈 절단", + "결과단위": "원/m", + "출처": "건설품셈 토목 1-6-6", + "소유": "공용", + "입력": [ + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + } + ], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-6-6 포장줄눈 절단).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-6-6 포장줄눈 절단).특별인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-6-6 포장줄눈 절단).보통인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비(조종원 없음), 기계='4430-0400', 지역=지역)", + "이름": "커터 320~400㎜", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-6-6 포장줄눈 절단).커터 * 8 / 시공량" + } + ], + "덧줄": [ + { + "이름": "공구손료 및 경장비", + "식": "((찾기(소요량:건설품셈:1-6-6 포장줄눈 절단).특별인부 / 시공량) * 인력:건설노임:1003 + (찾기(소요량:건설품셈:1-6-6 포장줄눈 절단).보통인부 / 시공량) * 인력:건설노임:1002) * 찾기(소요량:건설품셈:1-6-6 포장줄눈 절단 계수 주③, 구분='공구손료 및 경장비(동력분무기 등)의 기계경비').값 / 100", + "비목": "경비", + "출처": "건설품셈 토목 1-6-6 주③" + } + ], + "끝수": null, + "비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 해석: 인력품 = 인력 호표 줄 금액 합(기계 조종원 제외) · 해석: 커터는 기계 요소에 조종원 직종이 비어 조종원 없는 경비 로직으로 부름 · 블레이드·물 별도(주④)" + }, + { + "열쇠": "1-6-7 포장줄눈 설치", + "이름": "포장줄눈 설치", + "결과단위": "원/m", + "출처": "건설품셈 토목 1-6-7", + "소유": "공용", + "입력": [], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-6-7 포장줄눈 설치).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-6-7 포장줄눈 설치).특별인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-6-7 포장줄눈 설치).보통인부 / 시공량", + "비목": "노무비" + } + ], + "덧줄": [], + "끝수": null, + "비고": "줄눈재·백업재 재료비 별도(주③)" + }, + { + "열쇠": "1-7-1 보도용 블록 설치(소형)", + "이름": "보도용 블록 설치(소형)", + "결과단위": "원/㎡", + "출처": "건설품셈 토목 1-7-1", + "소유": "공용", + "입력": [ + { "이름": "형식", "고르기": ["A-Type", "B-Type"] }, + { "이름": "유도블록", "고르기": ["아님", "유도・점자블록"], "출처": "건설품셈 토목 1-7-1 비고" }, + { "이름": "정밀절단", "고르기": ["전동절단기", "아님"], "출처": "건설품셈 토목 1-7-1 비고" }, + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + }, + { "이름": "보정작업", "고르기": ["해당 없음", "암석작업(연암・보통암・경암)", "전석섞인토사"], "출처": "건설품셈 공통 8-1-7 1" } + ], + "중간": [ + { + "이름": "시공량", + "식": "찾기(소요량:건설품셈:1-7-1 보도용 블록 설치(소형), 형식=형식).시공량 * (1 - 만약(유도블록 == '아님', 0, 찾기(소요량:건설품셈:1-7-1 보도용 블록 설치(소형) 계수 비고, 구분='유도・점자블록을 설치하는 경우 시공량의 10%를 감하여 적용한다.').값) / 100)", + "출처": "건설품셈 토목 1-7-1 비고" + }, + { "이름": "굴착기", "식": "만약(형식 == 'A-Type', '0201-0060', '0201-0040')", "출처": "건설품셈 토목 1-7-1 「굴착기규격」 0.6㎥ · 0.4㎥" } + ], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1019", + "이름": "포장공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-7-1 보도용 블록 설치(소형), 형식=형식).포장공 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "(찾기(소요량:건설품셈:1-7-1 보도용 블록 설치(소형), 형식=형식).특별인부 - 만약(정밀절단 == '아님', 찾기(소요량:건설품셈:1-7-1 보도용 블록 설치(소형) 계수 비고, 구분='블록 정밀절단(전동절단기)에 의한 시공이 아닌 경우, 특별인부 1인을 감하여 적용한다.').값, 0)) / 시공량", + "비목": "노무비", + "출처": "건설품셈 토목 1-7-1 비고" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-7-1 보도용 블록 설치(소형), 형식=형식).보통인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 굴착기(무한궤도) 시간당 경비, 기계=굴착기, 지역=지역, 보정작업=보정작업)", + "이름": "굴착기", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-7-1 보도용 블록 설치(소형), 형식=형식).굴착기 * 8 / 시공량" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='1730-0015', 지역=지역)", + "이름": "플레이트 콤팩터 1.5ton", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-7-1 보도용 블록 설치(소형), 형식=형식).플레이트콤팩터 * 8 / 시공량" + } + ], + "덧줄": [], + "끝수": null, + "비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 형식 A = 장비 이동·적재 쉬운 구간 · B = 협소 구간(적용기준 표) · 해석: 감은 시공량에 곱함 · 블록·모래 재료 원문 표에 없음" + }, + { + "열쇠": "1-7-2 보도용 블록 설치(대형)", + "이름": "보도용 블록 설치(대형)", + "결과단위": "원/㎡", + "출처": "건설품셈 토목 1-7-2", + "소유": "공용", + "입력": [ + { "이름": "형식", "고르기": ["A-Type", "B-Type"] }, + { "이름": "유도블록", "고르기": ["아님", "유도・점자블록"], "출처": "건설품셈 토목 1-7-2 비고" }, + { "이름": "정밀절단", "고르기": ["전동절단기", "아님"], "출처": "건설품셈 토목 1-7-2 비고" }, + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + }, + { "이름": "보정작업", "고르기": ["해당 없음", "암석작업(연암・보통암・경암)", "전석섞인토사"], "출처": "건설품셈 공통 8-1-7 1" } + ], + "중간": [ + { + "이름": "시공량", + "식": "찾기(소요량:건설품셈:1-7-2 보도용 블록 설치(대형), 형식=형식).시공량 * (1 - 만약(유도블록 == '아님', 0, 찾기(소요량:건설품셈:1-7-2 보도용 블록 설치(대형) 계수 비고, 구분='유도・점자블록을 설치하는 경우 시공량의 10%를 감하여 적용한다.').값) / 100)", + "출처": "건설품셈 토목 1-7-2 비고" + }, + { "이름": "굴착기", "식": "만약(형식 == 'A-Type', '0201-0060', '0201-0040')", "출처": "건설품셈 토목 1-7-2 「굴착기규격」 0.6㎥ · 0.4㎥" } + ], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1019", + "이름": "포장공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-7-2 보도용 블록 설치(대형), 형식=형식).포장공 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "(찾기(소요량:건설품셈:1-7-2 보도용 블록 설치(대형), 형식=형식).특별인부 - 만약(정밀절단 == '아님', 찾기(소요량:건설품셈:1-7-2 보도용 블록 설치(대형) 계수 비고, 구분='블록 정밀절단(전동절단기)에 의한 시공이 아닌 경우, 특별인부 1인을 감하여 적용한다.').값, 0)) / 시공량", + "비목": "노무비", + "출처": "건설품셈 토목 1-7-2 비고" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-7-2 보도용 블록 설치(대형), 형식=형식).보통인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 굴착기(무한궤도) 시간당 경비, 기계=굴착기, 지역=지역, 보정작업=보정작업)", + "이름": "굴착기", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-7-2 보도용 블록 설치(대형), 형식=형식).굴착기 * 8 / 시공량" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='1730-0015', 지역=지역)", + "이름": "플레이트 콤팩터 1.5ton", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-7-2 보도용 블록 설치(대형), 형식=형식).플레이트콤팩터 * 8 / 시공량" + } + ], + "덧줄": [], + "끝수": null, + "비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 형식 A = 장비 이동·적재 쉬운 구간 · B = 협소 구간(적용기준 표) · 해석: 감은 시공량에 곱함 · 블록·모래 재료 원문 표에 없음" + }, + { + "열쇠": "1-7-3 투수아스팔트 표층 소규모포설", + "이름": "투수아스팔트 표층 소규모포설", + "결과단위": "원/㎡", + "출처": "건설품셈 토목 1-7-3", + "소유": "공용", + "입력": [ + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + } + ], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-7-3 투수아스팔트 표층 소규모포설).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1019", + "이름": "포장공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-7-3 투수아스팔트 표층 소규모포설).포장공 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-7-3 투수아스팔트 표층 소규모포설).보통인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='7204-0055', 지역=지역)", + "이름": "살수차 5,500ℓ", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-7-3 투수아스팔트 표층 소규모포설).살수차 * 8 / 시공량" + } + ], + "덧줄": [], + "끝수": null, + "비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 필터층·보조기층·기층 별도(주④) · 아스콘 재료 원문 표에 없음 · 막힘: 로더(타이어) 빠짐 — 칸 이름 「로더(타이어)」 식에서 못 부름 · 막힘: 진동롤러(핸드가이드식) 빠짐 — 칸 이름 「진동롤러(핸드가이드식)」 식에서 못 부름 · 막힘: 플레이트 콤팩터 빠짐 — 칸 이름 「플레이트 콤팩터」 식에서 못 부름" + }, + { + "열쇠": "1-7-4 투수아스팔트 표층 기계포설(소형장비)", + "이름": "투수아스팔트 표층 기계포설(소형장비)", + "결과단위": "원/㎡", + "출처": "건설품셈 토목 1-7-4", + "소유": "공용", + "입력": [ + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + }, + { "이름": "보정작업", "고르기": ["해당 없음", "암석작업(연암・보통암・경암)", "전석섞인토사"], "출처": "건설품셈 공통 8-1-7 1" } + ], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-7-4 투수아스팔트 표층 기계포설(소형장비)).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1019", + "이름": "포장공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-7-4 투수아스팔트 표층 기계포설(소형장비)).포장공 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-7-4 투수아스팔트 표층 기계포설(소형장비)).보통인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 굴착기(무한궤도) 시간당 경비, 기계='0201-0060', 지역=지역, 보정작업=보정작업)", + "이름": "굴착기 0.6㎥", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-7-4 투수아스팔트 표층 기계포설(소형장비)).굴착기 * 8 / 시공량" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='1106-0010', 지역=지역)", + "이름": "머캐덤롤러 8∼10ton", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-7-4 투수아스팔트 표층 기계포설(소형장비)).머캐덤롤러 * 8 / 시공량" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='1206-0008', 지역=지역)", + "이름": "탠덤롤러 5∼8ton", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-7-4 투수아스팔트 표층 기계포설(소형장비)).탠덤롤러 * 8 / 시공량" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='7204-0160', 지역=지역)", + "이름": "살수차 16,000ℓ", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-7-4 투수아스팔트 표층 기계포설(소형장비)).살수차 * 8 / 시공량" + } + ], + "덧줄": [], + "끝수": null, + "비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 필터층·보조기층·기층 별도(주④) · 아스콘 재료 원문 표에 없음 · 막힘: 아스팔트 피니셔 빠짐 — 칸 이름 「아스팔트 피니셔」 식에서 못 부름" + }, + { + "열쇠": "1-7-5 탄성포장재 포설", + "이름": "탄성포장재 포설", + "결과단위": "원/㎡", + "출처": "건설품셈 토목 1-7-5", + "소유": "공용", + "입력": [ + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + } + ], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-7-5 탄성포장재 포설).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-7-5 탄성포장재 포설).특별인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-7-5 탄성포장재 포설).보통인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='4205-0020', 지역=지역)", + "이름": "콘크리트 믹서 0.20㎥", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-7-5 탄성포장재 포설).믹서 * 8 / 시공량" + } + ], + "덧줄": [ + { + "이름": "공구손료 및 경장비", + "식": "((찾기(소요량:건설품셈:1-7-5 탄성포장재 포설).특별인부 / 시공량) * 인력:건설노임:1003 + (찾기(소요량:건설품셈:1-7-5 탄성포장재 포설).보통인부 / 시공량) * 인력:건설노임:1002) * 찾기(소요량:건설품셈:1-7-5 탄성포장재 포설 계수 주④, 구분='공구손료 및 경장비(발전기, 다짐롤러 등)의 기계경비').값 / 100", + "비목": "경비", + "출처": "건설품셈 토목 1-7-5 주④" + } + ], + "끝수": null, + "비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 해석: 인력품 = 인력 호표 줄 금액 합(기계 조종원 제외) · 해석: 믹서 0.2㎥ = 기계 요소 콘크리트 믹서 0.20㎥ · 무늬 포설 별도(주③) · 탄성포장재 재료 원문 표에 없음" + }, + { + "열쇠": "1-8-1 교통 안전표지판 설치", + "이름": "교통 안전표지판 설치", + "결과단위": "원/개소", + "출처": "건설품셈 토목 1-8-1", + "소유": "공용", + "입력": [ + { "이름": "작업", "고르기": ["지주", "표지판"] }, + { + "이름": "크레인", + "고르기": [ + "2105-0005", + "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", + "2105-0002", + "2105-0003", + "2105-0010", + "2105-0015", + "2105-0018" + ] + }, + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + } + ], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-8-1 교통 안전표지판 설치, 작업=작업).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-1 교통 안전표지판 설치, 작업=작업).특별인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-1 교통 안전표지판 설치, 작업=작업).보통인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계=크레인, 지역=지역)", + "이름": "크레인", + "단위": "시간", + "수량": "만약(작업 == '지주', 찾기(소요량:건설품셈:1-8-1 교통 안전표지판 설치, 작업=작업).크레인 * 8 / 시공량, 0)" + } + ], + "덧줄": [ + { + "이름": "공구손료 및 경장비", + "식": "((찾기(소요량:건설품셈:1-8-1 교통 안전표지판 설치, 작업=작업).특별인부 / 시공량) * 인력:건설노임:1003 + (찾기(소요량:건설품셈:1-8-1 교통 안전표지판 설치, 작업=작업).보통인부 / 시공량) * 인력:건설노임:1002) * 찾기(소요량:건설품셈:1-8-1 교통 안전표지판 설치 계수 주⑤, 구분='공구손료 및 경장비(드릴, 발전기 등)의 기계경비').값 / 100", + "비목": "경비", + "출처": "건설품셈 토목 1-8-1 주⑤" + } + ], + "끝수": null, + "비고": "해석: 인력품 = 인력 호표 줄 금액 합(기계 조종원 제외) · 해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 크레인 종류·규격 설계자 고름 — 원문 규격 5ton(지주) · 기초·폐자재 운반 별도(주③)" + }, + { + "열쇠": "1-8-2 도로 표지판 설치", + "이름": "도로 표지판 설치", + "결과단위": "원/개소", + "출처": "건설품셈 토목 1-8-2", + "소유": "공용", + "입력": [ + { "이름": "형식", "고르기": ["복주식 + 표지판 (8㎡이하 1개)", "편지식 + 표지판 (12㎡이하 1개)", "문형식 + 표지판 (8㎡이하 2개)"] }, + { + "이름": "크레인", + "고르기": [ + "2105-0005", + "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", + "2105-0002", + "2105-0003", + "2105-0010", + "2105-0015", + "2105-0018" + ] + }, + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + } + ], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-8-2 도로 표지판 설치, 형식=형식).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-2 도로 표지판 설치, 형식=형식).특별인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-2 도로 표지판 설치, 형식=형식).보통인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계=크레인, 지역=지역)", + "이름": "크레인", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-8-2 도로 표지판 설치, 형식=형식).크레인 * 8 / 시공량" + } + ], + "덧줄": [], + "끝수": null, + "비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 크레인 종류·규격 설계자 고름 — 원문 규격 복주식 5ton · 편지식 25ton · 문형식 50ton(크레인 규격 표) · 기초·폐자재 운반 별도(주③) · 막힘: 표지판 추가 설치(주④) 빠짐 — 조건 칸 이름 「표지판 설치 규격(개소당)」 식에서 못 부름" + }, + { + "열쇠": "1-8-3 도로반사경 설치", + "이름": "도로반사경 설치", + "결과단위": "원/본", + "출처": "건설품셈 토목 1-8-3", + "소유": "공용", + "입력": [{ "이름": "면", "고르기": ["1면", "2면"] }], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-8-3 도로반사경 설치, 면=면).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-3 도로반사경 설치, 면=면).특별인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-3 도로반사경 설치, 면=면).보통인부 / 시공량", + "비목": "노무비" + } + ], + "덧줄": [ + { + "이름": "공구손료 및 경장비", + "식": "((찾기(소요량:건설품셈:1-8-3 도로반사경 설치, 면=면).특별인부 / 시공량) * 인력:건설노임:1003 + (찾기(소요량:건설품셈:1-8-3 도로반사경 설치, 면=면).보통인부 / 시공량) * 인력:건설노임:1002) * 찾기(소요량:건설품셈:1-8-3 도로반사경 설치 계수 주③, 구분='공구손료 및 경장비(전동드릴, 발전기 등)의 기계경비').값 / 100", + "비목": "경비", + "출처": "건설품셈 토목 1-8-3 주③" + } + ], + "끝수": null, + "비고": "해석: 인력품 = 인력 호표 줄 금액 합(기계 조종원 제외) · 재료 원문 표에 없음" + }, + { + "열쇠": "1-8-5 시선유도표지 설치", + "이름": "시선유도표지 설치", + "결과단위": "원/개소", + "출처": "건설품셈 토목 1-8-5", + "소유": "공용", + "입력": [{ "이름": "설치위치", "고르기": ["흙속매설용", "가드레일용", "옹벽용"] }], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-8-5 시선유도표지 설치, 설치위치=설치위치).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-5 시선유도표지 설치, 설치위치=설치위치).특별인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-5 시선유도표지 설치, 설치위치=설치위치).보통인부 / 시공량", + "비목": "노무비" + } + ], + "덧줄": [ + { + "이름": "공구손료 및 경장비", + "식": "((찾기(소요량:건설품셈:1-8-5 시선유도표지 설치, 설치위치=설치위치).특별인부 / 시공량) * 인력:건설노임:1003 + (찾기(소요량:건설품셈:1-8-5 시선유도표지 설치, 설치위치=설치위치).보통인부 / 시공량) * 인력:건설노임:1002) * 찾기(소요량:건설품셈:1-8-5 시선유도표지 설치 계수 주③, 구분='공구손료 및 경장비(전동드릴 등)의 기계경비').값 / 100", + "비목": "경비", + "출처": "건설품셈 토목 1-8-5 주③" + } + ], + "끝수": null, + "비고": "해석: 인력품 = 인력 호표 줄 금액 합(기계 조종원 제외) · 재료 원문 표에 없음" + }, + { + "열쇠": "1-8-6 볼라드 설치", + "이름": "볼라드 설치", + "결과단위": "원/개소", + "출처": "건설품셈 토목 1-8-6", + "소유": "공용", + "입력": [], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-8-6 볼라드 설치).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-6 볼라드 설치).특별인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-6 볼라드 설치).보통인부 / 시공량", + "비목": "노무비" + } + ], + "덧줄": [ + { + "이름": "공구손료 및 경장비", + "식": "((찾기(소요량:건설품셈:1-8-6 볼라드 설치).특별인부 / 시공량) * 인력:건설노임:1003 + (찾기(소요량:건설품셈:1-8-6 볼라드 설치).보통인부 / 시공량) * 인력:건설노임:1002) * 찾기(소요량:건설품셈:1-8-6 볼라드 설치 계수 주③, 구분='공구손료 및 경장비(코어드릴, 발전기 등)의 기계경비').값 / 100", + "비목": "경비", + "출처": "건설품셈 토목 1-8-6 주③" + } + ], + "끝수": null, + "비고": "해석: 인력품 = 인력 호표 줄 금액 합(기계 조종원 제외) · 재료 원문 표에 없음" + }, + { + "열쇠": "1-8-7 주차 블록 설치", + "이름": "주차 블록 설치", + "결과단위": "원/개소", + "출처": "건설품셈 토목 1-8-7", + "소유": "공용", + "입력": [], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-8-7 주차 블록 설치).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-7 주차 블록 설치).특별인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-7 주차 블록 설치).보통인부 / 시공량", + "비목": "노무비" + } + ], + "덧줄": [ + { + "이름": "공구손료 및 경장비", + "식": "((찾기(소요량:건설품셈:1-8-7 주차 블록 설치).특별인부 / 시공량) * 인력:건설노임:1003 + (찾기(소요량:건설품셈:1-8-7 주차 블록 설치).보통인부 / 시공량) * 인력:건설노임:1002) * 찾기(소요량:건설품셈:1-8-7 주차 블록 설치 계수 주③, 구분='공구손료 및 경장비(전동드릴, 발전기 등)의 기계경비').값 / 100", + "비목": "경비", + "출처": "건설품셈 토목 1-8-7 주③" + } + ], + "끝수": null, + "비고": "해석: 인력품 = 인력 호표 줄 금액 합(기계 조종원 제외) · 재료 원문 표에 없음" + }, + { + "열쇠": "1-8-8 차선규제봉 설치", + "이름": "차선규제봉 설치", + "결과단위": "원/개소", + "출처": "건설품셈 토목 1-8-8", + "소유": "공용", + "입력": [], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-8-8 차선규제봉 설치).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-8 차선규제봉 설치).특별인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-8 차선규제봉 설치).보통인부 / 시공량", + "비목": "노무비" + } + ], + "덧줄": [ + { + "이름": "공구손료 및 경장비", + "식": "((찾기(소요량:건설품셈:1-8-8 차선규제봉 설치).특별인부 / 시공량) * 인력:건설노임:1003 + (찾기(소요량:건설품셈:1-8-8 차선규제봉 설치).보통인부 / 시공량) * 인력:건설노임:1002) * 찾기(소요량:건설품셈:1-8-8 차선규제봉 설치 계수 주③, 구분='공구손료 및 경장비(전동드릴, 발전기 등)의 기계경비').값 / 100", + "비목": "경비", + "출처": "건설품셈 토목 1-8-8 주③" + } + ], + "끝수": null, + "비고": "해석: 인력품 = 인력 호표 줄 금액 합(기계 조종원 제외) · 재료 원문 표에 없음" + }, + { + "열쇠": "1-8-4 도로표지병 설치", + "이름": "도로표지병 설치", + "결과단위": "원/개소", + "출처": "건설품셈 토목 1-8-4", + "소유": "공용", + "입력": [{ "이름": "주재료비", "단위": "원/개소", "출처": "건설품셈 토목 1-8-4 주④" }], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-8-4 도로표지병 설치).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-4 도로표지병 설치).특별인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-4 도로표지병 설치).보통인부 / 시공량", + "비목": "노무비" + } + ], + "덧줄": [ + { + "이름": "공구손료 및 경장비", + "식": "((찾기(소요량:건설품셈:1-8-4 도로표지병 설치).특별인부 / 시공량) * 인력:건설노임:1003 + (찾기(소요량:건설품셈:1-8-4 도로표지병 설치).보통인부 / 시공량) * 인력:건설노임:1002) * 찾기(소요량:건설품셈:1-8-4 도로표지병 설치 계수 주③, 구분='공구손료 및 경장비(전동드릴 등)의 기계경비').값 / 100", + "비목": "경비", + "출처": "건설품셈 토목 1-8-4 주③" + }, + { + "이름": "잡재료", + "식": "주재료비 * 찾기(소요량:건설품셈:1-8-4 도로표지병 설치 계수 주④, 구분='잡재료비(접착제 등)').값 / 100", + "비목": "재료비", + "출처": "건설품셈 토목 1-8-4 주④" + } + ], + "끝수": null, + "비고": "해석: 인력품 = 인력 호표 줄 금액 합(기계 조종원 제외) · 주재료(표지병) 값 설계자 입력 — 잡재료 = 주재료비 5%" + }, + { + "열쇠": "1-8-9 차선도색 차선 밑그림", + "이름": "차선 밑그림", + "결과단위": "원/㎡", + "출처": "건설품셈 토목 1-8-9", + "소유": "공용", + "입력": [ + { "이름": "도색", "고르기": ["실선", "파선", "횡단보도, 주차장", "문자, 기호"] }, + { "이름": "주재료비", "단위": "원/㎡", "출처": "건설품셈 토목 1-8-9 주⑤" } + ], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-8-9 차선도색 차선 밑그림, 도색=도색).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-9 차선도색 차선 밑그림, 도색=도색).특별인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-9 차선도색 차선 밑그림, 도색=도색).보통인부 / 시공량", + "비목": "노무비" + } + ], + "덧줄": [ + { + "이름": "잡재료 및 소모재료", + "식": "주재료비 * 찾기(소요량:건설품셈:1-8-9 차선도색 차선 밑그림 계수 주⑤, 구분='잡재료 및 소모재료').값 / 100", + "비목": "재료비", + "출처": "건설품셈 토목 1-8-9 주⑤" + } + ], + "끝수": null, + "비고": "주재료(페인트·유리알) 값 설계자 입력 — 잡재료 = 주재료비 1% · 사전 청소 별도 · 페인트·유리알 재료량 별도 · 막힘: 트럭 줄 빠짐 — 기계 요소에 트럭(화물) 없음(덤프트럭만)" + }, + { + "열쇠": "1-8-9 차선도색 수용성형 페인트 수동식", + "이름": "차선도색 수용성형 페인트 수동식", + "결과단위": "원/㎡", + "출처": "건설품셈 토목 1-8-9", + "소유": "공용", + "입력": [ + { "이름": "도색", "고르기": ["실선", "파선", "횡단보도, 주차장", "문자, 기호"] }, + { "이름": "표지병감", "단위": "%", "범위": [0, 10], "출처": "건설품셈 토목 1-8-9 비고" }, + { "이름": "주재료비", "단위": "원/㎡", "출처": "건설품셈 토목 1-8-9 주⑥" } + ], + "중간": [ + { "이름": "시공량", "식": "찾기(소요량:건설품셈:1-8-9 차선도색 수용성형 페인트 수동식, 도색=도색).시공량 * (1 - 표지병감 / 100)", "출처": "건설품셈 토목 1-8-9 비고" } + ], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-9 차선도색 수용성형 페인트 수동식, 도색=도색).특별인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-9 차선도색 수용성형 페인트 수동식, 도색=도색).보통인부 / 시공량", + "비목": "노무비" + } + ], + "덧줄": [ + { + "이름": "공구손료 및 경장비", + "식": "((찾기(소요량:건설품셈:1-8-9 차선도색 수용성형 페인트 수동식, 도색=도색).특별인부 / 시공량) * 인력:건설노임:1003 + (찾기(소요량:건설품셈:1-8-9 차선도색 수용성형 페인트 수동식, 도색=도색).보통인부 / 시공량) * 인력:건설노임:1002) * 찾기(소요량:건설품셈:1-8-9 차선도색 수용성형 페인트 수동식 계수 주⑤, 구분='공구손료 및 경장비(라인마커 등)의 기계경비').값 / 100", + "비목": "경비", + "출처": "건설품셈 토목 1-8-9 주⑤" + }, + { + "이름": "잡재료 및 소모재료", + "식": "주재료비 * 찾기(소요량:건설품셈:1-8-9 차선도색 수용성형 페인트 수동식 계수 주⑥, 구분='잡재료 및 소모재료').값 / 100", + "비목": "재료비", + "출처": "건설품셈 토목 1-8-9 주⑥" + } + ], + "끝수": null, + "비고": "해석: 인력품 = 인력 호표 줄 금액 합(기계 조종원 제외) · 주재료(페인트·유리알) 값 설계자 입력 — 잡재료 = 주재료비 1% · 표지병 등으로 능률 저하 시 시공량 10%까지 감(비고) — 설계자 입력(아니면 0) · 해석: 감은 시공량에 곱함 · 사전 청소 별도 · 페인트·유리알 재료량 별도 · 막힘: 트럭 줄 빠짐 — 기계 요소에 트럭(화물) 없음(덤프트럭만)" + }, + { + "열쇠": "1-8-9 차선도색 수용성형 페인트 기계식", + "이름": "차선도색 수용성형 페인트 기계식", + "결과단위": "원/㎡", + "출처": "건설품셈 토목 1-8-9", + "소유": "공용", + "입력": [ + { "이름": "도색", "고르기": ["실선", "파선"] }, + { "이름": "표지병감", "단위": "%", "범위": [0, 10], "출처": "건설품셈 토목 1-8-9 비고" }, + { "이름": "주재료비", "단위": "원/㎡", "출처": "건설품셈 토목 1-8-9 주⑤" } + ], + "중간": [ + { "이름": "시공량", "식": "찾기(소요량:건설품셈:1-8-9 차선도색 수용성형 페인트 기계식, 도색=도색).시공량 * (1 - 표지병감 / 100)", "출처": "건설품셈 토목 1-8-9 비고" } + ], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-9 차선도색 수용성형 페인트 기계식, 도색=도색).특별인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-9 차선도색 수용성형 페인트 기계식, 도색=도색).보통인부 / 시공량", + "비목": "노무비" + } + ], + "덧줄": [ + { + "이름": "잡재료 및 소모재료", + "식": "주재료비 * 찾기(소요량:건설품셈:1-8-9 차선도색 수용성형 페인트 기계식 계수 주⑤, 구분='잡재료 및 소모재료').값 / 100", + "비목": "재료비", + "출처": "건설품셈 토목 1-8-9 주⑤" + } + ], + "끝수": null, + "비고": "주재료(페인트·유리알) 값 설계자 입력 — 잡재료 = 주재료비 1% · 표지병 등으로 능률 저하 시 시공량 10%까지 감(비고) — 설계자 입력(아니면 0) · 해석: 감은 시공량에 곱함 · 사전 청소 별도 · 페인트·유리알 재료량 별도 · 막힘: 라인마커트럭 줄 빠짐 — 기계 요소에 라인마커트럭 없음 · 막힘: 트럭 줄 빠짐 — 기계 요소에 트럭(화물) 없음(덤프트럭만)" + }, + { + "열쇠": "1-8-9 차선도색 융착식 도료 수동식", + "이름": "차선도색 융착식 도료 수동식", + "결과단위": "원/㎡", + "출처": "건설품셈 토목 1-8-9", + "소유": "공용", + "입력": [ + { "이름": "도색", "고르기": ["실선", "파선", "횡단보도, 주차장", "문자, 기호"] }, + { "이름": "표지병감", "단위": "%", "범위": [0, 10], "출처": "건설품셈 토목 1-8-9 비고" } + ], + "중간": [ + { "이름": "시공량", "식": "찾기(소요량:건설품셈:1-8-9 차선도색 융착식 도료 수동식, 도색=도색).시공량 * (1 - 표지병감 / 100)", "출처": "건설품셈 토목 1-8-9 비고" } + ], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-9 차선도색 융착식 도료 수동식, 도색=도색).특별인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-9 차선도색 융착식 도료 수동식, 도색=도색).보통인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "재료", + "요소": "재료:자체:차선도색 프라이머", + "이름": "프라이머(융착식 도료)", + "단위": "kg", + "수량": "찾기(소요량:건설품셈:1-8-9 융착식 도료 수동식 재료).프라이머 / 10", + "비목": "재료비", + "출처": "건설품셈 토목 1-8-9 재료(10㎡당)" + }, + { + "종류": "재료", + "요소": "재료:나라장터자재:20204251", + "이름": "프로판가스(건설용 LPG)", + "단위": "kg", + "수량": "찾기(소요량:건설품셈:1-8-9 융착식 도료 수동식 재료).프로판가스 / 10", + "비목": "재료비", + "출처": "건설품셈 토목 1-8-9 재료(10㎡당)" + } + ], + "덧줄": [], + "끝수": null, + "비고": "표지병 등으로 능률 저하 시 시공량 10%까지 감(비고) — 설계자 입력(아니면 0) · 해석: 감은 시공량에 곱함 · 해석: 프로판가스 = 나라장터 액화석유가스 건설용LPG · 공시에 없는 재료(프라이머) = 재료_자체 · 트럭 4.5ton = 용해기 운반(트럭 작업 표) · 사전 청소 별도 · 페인트·유리알 재료량 별도 · 막힘: 트럭 2.5ton 줄 빠짐 — 칸 이름 「트럭 2.5ton」 식에서 못 부름 · 기계 요소에 트럭(화물) 없음 · 막힘: 트럭 줄 빠짐 — 기계 요소에 트럭(화물) 없음(덤프트럭만)" + }, + { + "열쇠": "1-8-9 차선도색 상온경화형 플라스틱 도료 구동식", + "이름": "차선도색 상온경화형 플라스틱 도료 구동식", + "결과단위": "원/㎡", + "출처": "건설품셈 토목 1-8-9", + "소유": "공용", + "입력": [ + { "이름": "도색", "고르기": ["실선", "파선", "횡단보도, 주차장", "문자, 기호"] }, + { "이름": "표지병감", "단위": "%", "범위": [0, 10], "출처": "건설품셈 토목 1-8-9 비고" }, + { "이름": "주재료비", "단위": "원/㎡", "출처": "건설품셈 토목 1-8-9 주⑥" } + ], + "중간": [ + { + "이름": "시공량", + "식": "찾기(소요량:건설품셈:1-8-9 차선도색 상온경화형 플라스틱 도료 구동식, 도색=도색).시공량 * (1 - 표지병감 / 100)", + "출처": "건설품셈 토목 1-8-9 비고" + } + ], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-9 차선도색 상온경화형 플라스틱 도료 구동식, 도색=도색).특별인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-9 차선도색 상온경화형 플라스틱 도료 구동식, 도색=도색).보통인부 / 시공량", + "비목": "노무비" + } + ], + "덧줄": [ + { + "이름": "공구손료 및 경장비", + "식": "((찾기(소요량:건설품셈:1-8-9 차선도색 상온경화형 플라스틱 도료 구동식, 도색=도색).특별인부 / 시공량) * 인력:건설노임:1003 + (찾기(소요량:건설품셈:1-8-9 차선도색 상온경화형 플라스틱 도료 구동식, 도색=도색).보통인부 / 시공량) * 인력:건설노임:1002) * 찾기(소요량:건설품셈:1-8-9 차선도색 상온경화형 플라스틱 도료 구동식 계수 주⑤, 구분='공구손료 및 경장비(핸드믹서 등)의 기계경비').값 / 100", + "비목": "경비", + "출처": "건설품셈 토목 1-8-9 주⑤" + }, + { + "이름": "잡재료 및 소모재료", + "식": "주재료비 * 찾기(소요량:건설품셈:1-8-9 차선도색 상온경화형 플라스틱 도료 구동식 계수 주⑥, 구분='잡재료 및 소모재료').값 / 100", + "비목": "재료비", + "출처": "건설품셈 토목 1-8-9 주⑥" + } + ], + "끝수": null, + "비고": "해석: 인력품 = 인력 호표 줄 금액 합(기계 조종원 제외) · 주재료(페인트·유리알) 값 설계자 입력 — 잡재료 = 주재료비 1% · 표지병 등으로 능률 저하 시 시공량 10%까지 감(비고) — 설계자 입력(아니면 0) · 해석: 감은 시공량에 곱함 · 라인마커 기계경비 별도(주⑤) · 사전 청소 별도 · 페인트·유리알 재료량 별도 · 막힘: 트럭 줄 빠짐 — 기계 요소에 트럭(화물) 없음(덤프트럭만)" + }, + { + "열쇠": "1-8-10 가드레일 설치 지주 설치", + "이름": "가드레일 지주 설치", + "결과단위": "원/m", + "출처": "건설품셈 토목 1-8-10", + "소유": "공용", + "입력": [{ "이름": "지주간격", "고르기": ["2m", "4m"] }], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-8-10 가드레일 설치 지주 설치, 지주간격=지주간격).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-10 가드레일 설치 지주 설치, 지주간격=지주간격).특별인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-10 가드레일 설치 지주 설치, 지주간격=지주간격).보통인부 / 시공량", + "비목": "노무비" + } + ], + "덧줄": [], + "끝수": null, + "비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 막힘: 굴착기+대형브레이커 빠짐 — 칸 이름 「굴착기+대형브레이커」 식에서 못 부름 · 막힘: 트럭 줄 빠짐 — 기계 요소에 트럭(화물) 없음(덤프트럭만)" + }, + { + "열쇠": "1-8-10 가드레일 설치 판 설치", + "이름": "가드레일 설치 판 설치", + "결과단위": "원/m", + "출처": "건설품셈 토목 1-8-10", + "소유": "공용", + "입력": [ + { "이름": "지주간격", "고르기": ["2m", "4m"] }, + { "이름": "W", "고르기": ["2W", "3W"] }, + { "이름": "곡선감", "단위": "%", "범위": [0, 40], "출처": "건설품셈 토목 1-8-10 주④" } + ], + "중간": [ + { + "이름": "시공량", + "식": "찾기(소요량:건설품셈:1-8-10 가드레일 설치 판 설치, 지주간격=지주간격, W=W).시공량 * (1 - 곡선감 / 100)", + "출처": "건설품셈 토목 1-8-10 주④" + } + ], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-10 가드레일 설치 판 설치, 지주간격=지주간격, W=W).특별인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-10 가드레일 설치 판 설치, 지주간격=지주간격, W=W).보통인부 / 시공량", + "비목": "노무비" + } + ], + "덧줄": [ + { + "이름": "공구손료 및 경장비", + "식": "((찾기(소요량:건설품셈:1-8-10 가드레일 설치 판 설치, 지주간격=지주간격, W=W).특별인부 / 시공량) * 인력:건설노임:1003 + (찾기(소요량:건설품셈:1-8-10 가드레일 설치 판 설치, 지주간격=지주간격, W=W).보통인부 / 시공량) * 인력:건설노임:1002) * 찾기(소요량:건설품셈:1-8-10 가드레일 설치 판 설치 계수 주⑤, 구분='공구손료 및 경장비(전동드릴 등)의 기계경비').값 / 100", + "비목": "경비", + "출처": "건설품셈 토목 1-8-10 주⑤" + } + ], + "끝수": null, + "비고": "해석: 인력품 = 인력 호표 줄 금액 합(기계 조종원 제외) · 램프 등 곡선구간 시공량 40% 범위 감 — 설계자 입력(아니면 0) · 해석: 감은 시공량에 곱함 · 가드레일 재료 원문 표에 없음 · 막힘: 트럭 줄 빠짐 — 기계 요소에 트럭(화물) 없음(덤프트럭만)" + }, + { + "열쇠": "1-8-11 중앙분리대 설치(가드레일식) 판 설치", + "이름": "중앙분리대 설치(가드레일식) 판 설치", + "결과단위": "원/m", + "출처": "건설품셈 토목 1-8-11", + "소유": "공용", + "입력": [{ "이름": "지주간격", "고르기": ["2m", "4m"] }, { "이름": "W", "고르기": ["2W", "3W"] }], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-8-11 중앙분리대 설치(가드레일식) 판 설치, 지주간격=지주간격, W=W).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-11 중앙분리대 설치(가드레일식) 판 설치, 지주간격=지주간격, W=W).특별인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-11 중앙분리대 설치(가드레일식) 판 설치, 지주간격=지주간격, W=W).보통인부 / 시공량", + "비목": "노무비" + } + ], + "덧줄": [ + { + "이름": "공구손료 및 경장비", + "식": "((찾기(소요량:건설품셈:1-8-11 중앙분리대 설치(가드레일식) 판 설치, 지주간격=지주간격, W=W).특별인부 / 시공량) * 인력:건설노임:1003 + (찾기(소요량:건설품셈:1-8-11 중앙분리대 설치(가드레일식) 판 설치, 지주간격=지주간격, W=W).보통인부 / 시공량) * 인력:건설노임:1002) * 찾기(소요량:건설품셈:1-8-11 중앙분리대 설치(가드레일식) 판 설치 계수 주④, 구분='공구손료 및 경장비(전동드릴 등)의 기계경비').값 / 100", + "비목": "경비", + "출처": "건설품셈 토목 1-8-11 주④" + } + ], + "끝수": null, + "비고": "해석: 인력품 = 인력 호표 줄 금액 합(기계 조종원 제외) · 가드레일 재료 원문 표에 없음 · 막힘: 트럭 줄 빠짐 — 기계 요소에 트럭(화물) 없음(덤프트럭만)" + }, + { + "열쇠": "1-8-11 중앙분리대 설치(가드레일식) 지주 설치", + "이름": "중앙분리대(가드레일식) 지주 설치", + "결과단위": "원/m", + "출처": "건설품셈 토목 1-8-11", + "소유": "공용", + "입력": [ + { "이름": "지주간격", "고르기": ["2m", "4m"] }, + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + } + ], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-8-11 중앙분리대 설치(가드레일식) 지주 설치, 지주간격=지주간격).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-11 중앙분리대 설치(가드레일식) 지주 설치, 지주간격=지주간격).특별인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-11 중앙분리대 설치(가드레일식) 지주 설치, 지주간격=지주간격).보통인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='5205-0170', 지역=지역)", + "이름": "공기압축기 17.0㎥/min", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-8-11 중앙분리대 설치(가드레일식) 지주 설치, 지주간격=지주간격).공기압축기 * 8 / 시공량" + } + ], + "덧줄": [], + "끝수": null, + "비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 장비 규격 현장여건 따라 바꿀 수 있음(주④) · 막힘: 굴착기+대형브레이커 빠짐 — 칸 이름 「굴착기+대형브레이커」 식에서 못 부름 · 막힘: 크롤러드릴(공기식) 빠짐 — 칸 이름 「크롤러드릴(공기식)」 식에서 못 부름 · 막힘: 트럭 줄 빠짐 — 기계 요소에 트럭(화물) 없음(덤프트럭만)" + }, + { + "열쇠": "1-8-12 중앙분리대 설치(콘크리트포설식)", + "이름": "중앙분리대 설치(콘크리트포설식)", + "결과단위": "원/m", + "출처": "건설품셈 토목 1-8-12", + "소유": "공용", + "입력": [ + { "이름": "높이", "고르기": ["0.81m", "1.27m"] }, + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + }, + { "이름": "보정작업", "고르기": ["해당 없음", "암석작업(연암・보통암・경암)", "전석섞인토사"], "출처": "건설품셈 공통 8-1-7 1" } + ], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-8-12 중앙분리대 설치(콘크리트포설식), 높이=높이).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1019", + "이름": "포장공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-12 중앙분리대 설치(콘크리트포설식), 높이=높이).포장공 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1008", + "이름": "철근공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-12 중앙분리대 설치(콘크리트포설식), 높이=높이).철근공 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-12 중앙분리대 설치(콘크리트포설식), 높이=높이).보통인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 굴착기(무한궤도) 시간당 경비, 기계='0201-0100', 지역=지역, 보정작업=보정작업)", + "이름": "굴착기 1.0㎥", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-8-12 중앙분리대 설치(콘크리트포설식), 높이=높이).굴착기 * 8 / 시공량" + } + ], + "덧줄": [], + "끝수": null, + "비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 유도선·수축줄눈 별도(주③) · 콘크리트·철망 재료 원문 표에 없음 · 막힘: 콘크리트 피니셔 빠짐 — 칸 이름 「콘크리트 피니셔」 식에서 못 부름" + }, + { + "열쇠": "1-8-13 유색포장(미끄럼방지)", + "이름": "유색포장(미끄럼방지)", + "결과단위": "원/㎡", + "출처": "건설품셈 토목 1-8-13", + "소유": "공용", + "입력": [{ "이름": "형식", "고르기": ["A-Type", "B-Type"] }], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-8-13 유색포장(미끄럼방지), 형식=형식).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1029", + "이름": "도장공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-13 유색포장(미끄럼방지), 형식=형식).도장공 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-13 유색포장(미끄럼방지), 형식=형식).보통인부 / 시공량", + "비목": "노무비" + } + ], + "덧줄": [], + "끝수": null, + "비고": "형식 A-Type = 전면처리 · B-Type = 이격식(적용기준 표) · 아크릴수지·규사 재료 원문 표에 없음 · 막힘: 트럭 줄 빠짐 — 기계 요소에 트럭(화물) 없음(덤프트럭만)" + }, + { + "열쇠": "1-8-14 표시못 설치", + "이름": "표시못 설치", + "결과단위": "원/개소", + "출처": "건설품셈 토목 1-8-14", + "소유": "공용", + "입력": [{ "이름": "형식", "고르기": ["A-Type", "B-Type"] }], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-8-14 표시못 설치, 형식=형식).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-14 표시못 설치, 형식=형식).특별인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-14 표시못 설치, 형식=형식).보통인부 / 시공량", + "비목": "노무비" + } + ], + "덧줄": [], + "끝수": null, + "비고": "형식 A-Type = 산재 구간 · B-Type = 밀집 구간(적용기준 표) · 요율 표(A-Type 2% · B-Type 4%)는 무엇에 곱하는지 원문 글 없음 — 계산에 안 넣음 · 표시못 재료 원문 표에 없음 · 막힘: 트럭 줄 빠짐 — 기계 요소에 트럭(화물) 없음(덤프트럭만)" + }, + { + "열쇠": "1-8-15 L형측구 설치(포설식)", + "이름": "L형측구 설치(포설식)", + "결과단위": "원/m", + "출처": "건설품셈 토목 1-8-15", + "소유": "공용", + "입력": [ + { "이름": "높이", "고르기": ["H=0.5m이하", "H=1.2m"] }, + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + }, + { "이름": "보정작업", "고르기": ["해당 없음", "암석작업(연암・보통암・경암)", "전석섞인토사"], "출처": "건설품셈 공통 8-1-7 1" } + ], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-8-15 L형측구 설치(포설식), 높이=높이).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1019", + "이름": "포장공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-15 L형측구 설치(포설식), 높이=높이).포장공 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-8-15 L형측구 설치(포설식), 높이=높이).보통인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 굴착기(무한궤도) 시간당 경비, 기계='0201-0060', 지역=지역, 보정작업=보정작업)", + "이름": "굴착기 0.6㎥", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-8-15 L형측구 설치(포설식), 높이=높이).굴착기 * 8 / 시공량" + } + ], + "덧줄": [], + "끝수": null, + "비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · H=1.2m 는 2회 포설 기준(주①) · 유도선·터파기·되메우기·수축줄눈 별도(주③) · 콘크리트 재료 원문 표에 없음 · 막힘: 콘크리트 페이버 빠짐 — 칸 이름 「콘크리트 페이버」 식에서 못 부름" + }, + { + "열쇠": "1-9-1 방음벽 설치 앵커볼트 설치", + "이름": "방음벽 앵커볼트 설치", + "결과단위": "원/개", + "출처": "건설품셈 토목 1-9-1", + "소유": "공용", + "입력": [], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-9-1 방음벽 설치 앵커볼트 설치).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1009", + "이름": "철공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-9-1 방음벽 설치 앵커볼트 설치).철공 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-9-1 방음벽 설치 앵커볼트 설치).보통인부 / 시공량", + "비목": "노무비" + } + ], + "덧줄": [ + { + "이름": "공구손료 및 경장비", + "식": "((찾기(소요량:건설품셈:1-9-1 방음벽 설치 앵커볼트 설치).철공 / 시공량) * 인력:건설노임:1009 + (찾기(소요량:건설품셈:1-9-1 방음벽 설치 앵커볼트 설치).보통인부 / 시공량) * 인력:건설노임:1002) * 찾기(소요량:건설품셈:1-9-1 방음벽 설치 앵커볼트 설치 계수 주③, 구분='공구손료 및 경장비(용접기 등)의 기계경비').값 / 100", + "비목": "경비", + "출처": "건설품셈 토목 1-9-1 주③" + } + ], + "끝수": null, + "비고": "해석: 인력품 = 인력 호표 줄 금액 합(기계 조종원 제외) · 앵커볼트 재료 원문 표에 없음" + }, + { + "열쇠": "1-9-3 낙석방지책 설치 지주 설치", + "이름": "낙석방지책 지주 설치", + "결과단위": "원/개", + "출처": "건설품셈 토목 1-9-3", + "소유": "공용", + "입력": [ + { + "이름": "크레인", + "고르기": [ + "2105-0005", + "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", + "2105-0002", + "2105-0003", + "2105-0010", + "2105-0015", + "2105-0018" + ] + }, + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + } + ], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-9-3 낙석방지책 설치 지주 설치).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1012", + "이름": "용접공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-9-3 낙석방지책 설치 지주 설치).용접공 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-9-3 낙석방지책 설치 지주 설치).특별인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-9-3 낙석방지책 설치 지주 설치).보통인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계=크레인, 지역=지역)", + "이름": "크레인", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-9-3 낙석방지책 설치 지주 설치).크레인 * 8 / 시공량" + } + ], + "덧줄": [ + { + "이름": "공구손료 및 경장비", + "식": "((찾기(소요량:건설품셈:1-9-3 낙석방지책 설치 지주 설치).용접공 / 시공량) * 인력:건설노임:1012 + (찾기(소요량:건설품셈:1-9-3 낙석방지책 설치 지주 설치).특별인부 / 시공량) * 인력:건설노임:1003 + (찾기(소요량:건설품셈:1-9-3 낙석방지책 설치 지주 설치).보통인부 / 시공량) * 인력:건설노임:1002) * 찾기(소요량:건설품셈:1-9-3 낙석방지책 설치 지주 설치 계수 주④, 구분='공구손료 및 경장비(용접기 등)의 기계경비').값 / 100", + "비목": "경비", + "출처": "건설품셈 토목 1-9-3 주④" + } + ], + "끝수": null, + "비고": "해석: 인력품 = 인력 호표 줄 금액 합(기계 조종원 제외) · 해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 크레인 종류·규격 설계자 고름 — 원문 규격 10ton · 터파기·기초·되메우기 별도(주③)" + }, + { + "열쇠": "1-9-3 낙석방지책 설치 와이어 설치", + "이름": "낙석방지책 와이어 설치", + "결과단위": "원/m", + "출처": "건설품셈 토목 1-9-3", + "소유": "공용", + "입력": [], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-9-3 낙석방지책 설치 와이어 설치).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-9-3 낙석방지책 설치 와이어 설치).특별인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-9-3 낙석방지책 설치 와이어 설치).보통인부 / 시공량", + "비목": "노무비" + } + ], + "덧줄": [ + { + "이름": "공구손료 및 경장비", + "식": "((찾기(소요량:건설품셈:1-9-3 낙석방지책 설치 와이어 설치).특별인부 / 시공량) * 인력:건설노임:1003 + (찾기(소요량:건설품셈:1-9-3 낙석방지책 설치 와이어 설치).보통인부 / 시공량) * 인력:건설노임:1002) * 찾기(소요량:건설품셈:1-9-3 낙석방지책 설치 와이어 설치 계수 주④, 구분='공구손료 및 경장비(절단기 등)의 기계경비').값 / 100", + "비목": "경비", + "출처": "건설품셈 토목 1-9-3 주④" + } + ], + "끝수": null, + "비고": "해석: 인력품 = 인력 호표 줄 금액 합(기계 조종원 제외) · 비계 별도(주③) · 재료 원문 표에 없음" + }, + { + "열쇠": "1-9-3 낙석방지책 설치 철망 설치", + "이름": "낙석방지책 철망 설치", + "결과단위": "원/㎡", + "출처": "건설품셈 토목 1-9-3", + "소유": "공용", + "입력": [], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-9-3 낙석방지책 설치 철망 설치).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-9-3 낙석방지책 설치 철망 설치).특별인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-9-3 낙석방지책 설치 철망 설치).보통인부 / 시공량", + "비목": "노무비" + } + ], + "덧줄": [ + { + "이름": "공구손료 및 경장비", + "식": "((찾기(소요량:건설품셈:1-9-3 낙석방지책 설치 철망 설치).특별인부 / 시공량) * 인력:건설노임:1003 + (찾기(소요량:건설품셈:1-9-3 낙석방지책 설치 철망 설치).보통인부 / 시공량) * 인력:건설노임:1002) * 찾기(소요량:건설품셈:1-9-3 낙석방지책 설치 철망 설치 계수 주④, 구분='공구손료 및 경장비(절단기 등)의 기계경비').값 / 100", + "비목": "경비", + "출처": "건설품셈 토목 1-9-3 주④" + } + ], + "끝수": null, + "비고": "해석: 인력품 = 인력 호표 줄 금액 합(기계 조종원 제외) · 비계 별도(주③) · 재료 원문 표에 없음" + }, + { + "열쇠": "1-9-4 낙석방지망 설치 기초 착암", + "이름": "낙석방지망 기초 착암", + "결과단위": "원/㎡", + "출처": "건설품셈 토목 1-9-4", + "소유": "공용", + "입력": [ + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + } + ], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-9-4 낙석방지망 설치 기초 착암).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1015", + "이름": "착암공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-9-4 낙석방지망 설치 기초 착암).착암공 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1006", + "이름": "비계공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-9-4 낙석방지망 설치 기초 착암).비계공 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-9-4 낙석방지망 설치 기초 착암).보통인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='5205-0103', 지역=지역)", + "이름": "공기압축기 10.3㎥/min", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:1-9-4 낙석방지망 설치 기초 착암).공기압축기 * 8 / 시공량" + } + ], + "덧줄": [], + "끝수": null, + "비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 재료량 설계수량(주④) · 비탈면 고르기 별도(주③) · 막힘: 소형브레이커 2.7㎥/min 줄 빠짐 — 기계 요소 5210-0027 손료 계수(상각·정비·관리) 빈칸" + }, + { + "열쇠": "1-9-4 낙석방지망 설치 철망 및 와이어 설치", + "이름": "낙석방지망 철망 및 와이어 설치", + "결과단위": "원/㎡", + "출처": "건설품셈 토목 1-9-4", + "소유": "공용", + "입력": [ + { "이름": "구분", "고르기": ["기계식", "인력식"] }, + { + "이름": "크레인", + "고르기": [ + "2105-0005", + "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", + "2105-0002", + "2105-0003", + "2105-0010", + "2105-0015", + "2105-0018" + ] + }, + { "이름": "방지망", "고르기": ["포켓식", "비포켓식"], "출처": "건설품셈 토목 1-9-4 재료(참고자료)" }, + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + } + ], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:1-9-4 낙석방지망 설치 철망 및 와이어 설치, 구분=구분).시공량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-9-4 낙석방지망 설치 철망 및 와이어 설치, 구분=구분).특별인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:1-9-4 낙석방지망 설치 철망 및 와이어 설치, 구분=구분).보통인부 / 시공량", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계=크레인, 지역=지역)", + "이름": "크레인", + "단위": "시간", + "수량": "만약(구분 == '기계식', 찾기(소요량:건설품셈:1-9-4 낙석방지망 설치 철망 및 와이어 설치, 구분=구분).크레인 * 8 / 시공량, 0)" + }, + { + "종류": "재료", + "요소": "재료:자체:낙석방지망 철망", + "이름": "철망(낙석방지망)", + "단위": "㎡", + "수량": "찾기(소요량:건설품셈:1-9-4 낙석방지망 설치 재료, 구분='철망').수량", + "비목": "재료비", + "출처": "건설품셈 토목 1-9-4 재료(참고자료)" + }, + { + "종류": "재료", + "요소": "재료:자체:결속선", + "이름": "결속선", + "단위": "m", + "수량": "찾기(소요량:건설품셈:1-9-4 낙석방지망 설치 재료, 구분='결속선').수량", + "비목": "재료비", + "출처": "건설품셈 토목 1-9-4 재료(참고자료)" + }, + { + "종류": "재료", + "요소": "재료:자체:에폭시", + "이름": "에폭시", + "단위": "kg", + "수량": "만약(방지망 == '포켓식', 찾기(소요량:건설품셈:1-9-4 낙석방지망 설치 재료, 구분='에폭시').수량, 0)", + "비목": "재료비", + "출처": "건설품셈 토목 1-9-4 재료(참고자료)" + } + ], + "덧줄": [], + "끝수": null, + "비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 크레인 종류·규격 설계자 고름 — 원문 규격 50ton(기계식) · 재료량은 참고자료(㎡당) — 지주·고정핀·클립·모르타르·와이어로프 설계 따라 별도 · 에폭시는 포켓식만 · 공시에 없는 재료 = 재료_자체" + } + ] +} diff --git a/resources/master_data/재료_자체.json b/resources/master_data/재료_자체.json index e12e66fe..b65bfc32 100644 --- a/resources/master_data/재료_자체.json +++ b/resources/master_data/재료_자체.json @@ -81,6 +81,10 @@ { "열쇠": "복합비료", "이름": "비료", "규격": "복합비료", "단위": "㎏", "값": null, "출처": "자체", "비고": "건설품셈 공통 4-1-3 재료량" }, { "열쇠": "피복제", "이름": "피복제", "규격": "화이버/펄프류", "단위": "㎏", "값": null, "출처": "자체", "비고": "건설품셈 공통 4-1-3 재료량" }, { "열쇠": "침식방지안정제", "이름": "침식방지안정제", "규격": "합성접착제", "단위": "㎏", "값": null, "출처": "자체", "비고": "건설품셈 공통 4-1-3 재료량" }, - { "열쇠": "착색제", "이름": "색소", "규격": "착색제", "단위": "㎏", "값": null, "출처": "자체", "비고": "건설품셈 공통 4-1-3 재료량" } + { "열쇠": "착색제", "이름": "색소", "규격": "착색제", "단위": "㎏", "값": null, "출처": "자체", "비고": "건설품셈 공통 4-1-3 재료량" }, + { "열쇠": "차선도색 프라이머", "이름": "프라이머", "규격": "융착식 도료 차선도색용", "단위": "kg", "값": null, "출처": "자체", "비고": "건설품셈 토목 1-8-9 융착식 도료 수동식 재료" }, + { "열쇠": "낙석방지망 철망", "이름": "철망", "규격": "낙석방지망용", "단위": "㎡", "값": null, "출처": "자체", "비고": "건설품셈 토목 1-9-4 낙석방지망 재료(참고자료)" }, + { "열쇠": "결속선", "이름": "결속선", "규격": "", "단위": "m", "값": null, "출처": "자체", "비고": "건설품셈 토목 1-9-4 낙석방지망 재료(참고자료)" }, + { "열쇠": "에폭시", "이름": "에폭시", "규격": "", "단위": "kg", "값": null, "출처": "자체", "비고": "건설품셈 토목 1-9-4 낙석방지망 재료(참고자료) · 포켓식만" } ] } diff --git a/resources/tester/test_masterdata_check.py b/resources/tester/test_masterdata_check.py index 0bea85fb..a2d4d158 100644 --- a/resources/tester/test_masterdata_check.py +++ b/resources/tester/test_masterdata_check.py @@ -19,6 +19,7 @@ SAMPLES = [ "로직_건설품셈_공통4장.json", "로직_건설품셈_공통7장.json", "로직_건설품셈_공통8장.json", + "로직_건설품셈_토목1장.json", "로직_산림품셈_03장.json", "로직_산림품셈_04장.json", "로직_산림품셈_05장.json", @@ -205,13 +206,23 @@ def test_방제_벌목조재_감_할증(whole): def test_건설_석재판_습식_공구손료(whole): """공통 7-4-1 — 바닥부 테라조판 석공 3 · 줄눈공 1 · 보통인부 2 ÷ 15㎡ · 공구손료 인력품 2%.""" got = mf.run(whole, "건설품셈:7-4-1 습식공법", {"시공부위": "바닥부", "자재": "테라조판"}) - assert [line["수량"] for line in got["줄"][:3]] == [Decimal(3) / 15, Decimal(1) / 15, Decimal(2) / 15] + assert [line["수량"] for line in got["줄"][:3]] == [ + Decimal(3) / 15, + Decimal(1) / 15, + Decimal(2) / 15, + ] assert got["경비"] == got["노무비"] * Decimal("0.02") def test_건설_정원석_난이도_가산(whole): """공통 4-4-1 — 쌓기 20ton 미만 조경공 1.212 × 1.1 · 굴착기 0.7㎥ 0.657hr 그대로.""" - given = {"작업": "쌓기", "중량": "20ton 미만", "난이도가산": 10, "지역": "전국평균", "보정작업": "해당 없음"} + given = { + "작업": "쌓기", + "중량": "20ton 미만", + "난이도가산": 10, + "지역": "전국평균", + "보정작업": "해당 없음", + } got = mf.run(whole, "건설품셈:4-4-1 정원석 쌓기 및 놓기", given) assert [line["수량"] for line in got["줄"][:2]] == [Decimal("1.3332"), Decimal("0.657")] @@ -231,6 +242,29 @@ def test_건설_흙깎기_암_치즐(whole): assert got["줄"][-1]["금액"] == brk["금액"] / 100 +def test_토목_동상방지층_인력_살수(whole): + """토목 1-2-1 — 165㎥/일 · 인력 살수면 살수차 0 · 보통인부 100㎡당 1인 = 두께 20㎝ 에서 1/20 인/㎥.""" + given = {"살수": "인력 살수", "두께": 20, "지역": "전국평균", "보정작업": "해당 없음"} + got = mf.run(whole, "건설품셈:1-2-1 인력식 소규모장비 포설", given) + qty = {line["이름"]: line["수량"] for line in got["줄"]} + assert qty["굴착기 0.6㎥"] == Decimal(8) / 165 + assert qty["살수차 5,500ℓ"] == 0 + assert got["줄"][-1]["수량"] == Decimal(1) / 20 + + +def test_토목_보도블록_감(whole): + """토목 1-7-1 — B-Type 190㎡/일 × 0.9(유도블록) · 정밀절단 아니면 특별인부 2 - 1.""" + given = { + "형식": "B-Type", + "유도블록": "유도・점자블록", + "정밀절단": "아님", + "지역": "전국평균", + "보정작업": "해당 없음", + } + got = mf.run(whole, "건설품셈:1-7-1 보도용 블록 설치(소형)", given) + assert got["줄"][1]["수량"] == Decimal(1) / Decimal(171) + + def test_범위_입력은_막음(whole): with pytest.raises(mf.FormulaError): mf.run( From 0f4e396cb091fd678c80ba5411ea5c88644c6180 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sat, 19 Sep 2026 18:04:17 +0900 Subject: [PATCH 07/14] =?UTF-8?q?feat(master=5Fdata):=20=EA=B1=B4=EC=84=A4?= =?UTF-8?q?=ED=92=88=EC=85=88=20=ED=86=A0=EB=AA=A9=202=EC=9E=A5(=ED=95=98?= =?UTF-8?q?=EC=B2=9C)=20=EB=A1=9C=EC=A7=81=207=EC=A4=84=20=C2=B7=20?= =?UTF-8?q?=EC=8B=9C=ED=97=98=201=EA=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01JgUhN55Z3BCYhUJTjwTNfj --- .../master_data/로직_건설품셈_토목2장.json | 394 ++++++++++++++++++ resources/tester/test_masterdata_check.py | 8 + 2 files changed, 402 insertions(+) create mode 100644 resources/master_data/로직_건설품셈_토목2장.json diff --git a/resources/master_data/로직_건설품셈_토목2장.json b/resources/master_data/로직_건설품셈_토목2장.json new file mode 100644 index 00000000..526f2278 --- /dev/null +++ b/resources/master_data/로직_건설품셈_토목2장.json @@ -0,0 +1,394 @@ +{ + "그룹": "로직", + "원문": "건설품셈", + "판": "2026", + "줄": [ + { + "열쇠": "2-1-1 사석부설", + "이름": "사석부설", + "결과단위": "원/㎥", + "출처": "건설품셈 토목 2-1-1", + "소유": "공용", + "입력": [ + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + }, + { "이름": "보정작업", "고르기": ["해당 없음", "암석작업(연암・보통암・경암)", "전석섞인토사"], "출처": "건설품셈 공통 8-1-7 1" } + ], + "중간": [], + "호표": [ + { "종류": "인력", "요소": "인력:건설노임:1002", "이름": "보통인부", "단위": "인", "수량": "찾기(소요량:건설품셈:2-1-1 사석부설).보통인부", "비목": "노무비" }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 굴착기(무한궤도) 시간당 경비, 기계='0201-0100', 지역=지역, 보정작업=보정작업)", + "이름": "굴착기 1.0㎥", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:2-1-1 사석부설).굴삭기" + } + ], + "덧줄": [], + "끝수": null, + "비고": "필터매트는 건설품셈 공통 5-2-1 매트부설 · 사석 재료 원문 표에 없음" + }, + { + "열쇠": "2-1-2 사석고르기", + "이름": "사석고르기", + "결과단위": "원/㎡", + "출처": "건설품셈 토목 2-1-2", + "소유": "공용", + "입력": [], + "중간": [], + "호표": [ + { "종류": "인력", "요소": "인력:건설노임:1002", "이름": "보통인부", "단위": "인", "수량": "찾기(소요량:건설품셈:2-1-2 사석고르기).보통인부", "비목": "노무비" } + ], + "덧줄": [], + "끝수": null, + "비고": "잡석 채움 포함(주②) · 막힘: 굴삭기+부착용집게 빠짐 — 칸 이름 「굴삭기+부착용집게」 식에서 못 부름" + }, + { + "열쇠": "2-2-2 매트리스형 돌망태 설치", + "이름": "매트리스형 돌망태 설치", + "결과단위": "원/㎡", + "출처": "건설품셈 토목 2-2-2", + "소유": "공용", + "입력": [ + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + }, + { "이름": "보정작업", "고르기": ["해당 없음", "암석작업(연암・보통암・경암)", "전석섞인토사"], "출처": "건설품셈 공통 8-1-7 1" } + ], + "중간": [], + "호표": [ + { "종류": "인력", "요소": "인력:건설노임:1033", "이름": "석공", "단위": "인", "수량": "찾기(소요량:건설품셈:2-2-2 매트리스형 돌망태 설치).석공", "비목": "노무비" }, + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:2-2-2 매트리스형 돌망태 설치).특별인부", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:2-2-2 매트리스형 돌망태 설치).보통인부", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 굴착기(무한궤도) 시간당 경비, 기계='0201-0100', 지역=지역, 보정작업=보정작업)", + "이름": "굴착기 1.0㎥", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:2-2-2 매트리스형 돌망태 설치).굴착기" + } + ], + "덧줄": [], + "끝수": null, + "비고": "폭 200㎝ · 높이 30㎝ 기준(주①) · 필터매트는 건설품셈 공통 5-2-1 매트부설 · 망태·망태석 재료 원문 표에 없음" + }, + { + "열쇠": "2-2-3 돌망태형옹벽 설치", + "이름": "돌망태형옹벽 설치", + "결과단위": "원/㎥", + "출처": "건설품셈 토목 2-2-3", + "소유": "공용", + "입력": [ + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + }, + { "이름": "보정작업", "고르기": ["해당 없음", "암석작업(연암・보통암・경암)", "전석섞인토사"], "출처": "건설품셈 공통 8-1-7 1" } + ], + "중간": [], + "호표": [ + { "종류": "인력", "요소": "인력:건설노임:1033", "이름": "석공", "단위": "인", "수량": "찾기(소요량:건설품셈:2-2-3 돌망태형옹벽 설치).석공", "비목": "노무비" }, + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:2-2-3 돌망태형옹벽 설치).특별인부", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:2-2-3 돌망태형옹벽 설치).보통인부", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 굴착기(무한궤도) 시간당 경비, 기계='0201-0060', 지역=지역, 보정작업=보정작업)", + "이름": "굴착기 0.6㎥", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:2-2-3 돌망태형옹벽 설치).굴착기" + } + ], + "덧줄": [], + "끝수": null, + "비고": "높이 5m 이하(주①) · 터파기·지반고르기 별도(주③) · 필터매트는 건설품셈 공통 5-2-1 매트부설 · 철망태·망태석 재료 원문 표에 없음" + }, + { + "열쇠": "2-3-1 식생매트 설치", + "이름": "식생매트 설치", + "결과단위": "원/㎡", + "출처": "건설품셈 토목 2-3-1", + "소유": "공용", + "입력": [ + { "이름": "작업", "고르기": ["식생매트설치", "복토"] }, + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + }, + { "이름": "보정작업", "고르기": ["해당 없음", "암석작업(연암・보통암・경암)", "전석섞인토사"], "출처": "건설품셈 공통 8-1-7 1" } + ], + "중간": [], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "만약(작업 == '식생매트설치', 찾기(소요량:건설품셈:2-3-1 식생매트 설치, 작업=작업).특별인부, 0)", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:2-3-1 식생매트 설치, 작업=작업).보통인부", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 굴착기(무한궤도) 시간당 경비, 기계='0201-0060', 지역=지역, 보정작업=보정작업)", + "이름": "굴착기 0.6㎥", + "단위": "시간", + "수량": "만약(작업 == '복토', 찾기(소요량:건설품셈:2-3-1 식생매트 설치, 작업=작업).굴삭기, 0)" + } + ], + "덧줄": [], + "끝수": null, + "비고": "작업(식생매트설치 · 복토)마다 따로 계상 — 둘 다 하면 두 줄 · 종자살포·잔디·관수·시비 별도(주③) · 식생매트 재료 원문 표에 없음" + }, + { + "열쇠": "2-3-2 블록 붙이기(인력)", + "이름": "블록 붙이기(인력)", + "결과단위": "원/㎡", + "출처": "건설품셈 토목 2-3-2", + "소유": "공용", + "입력": [], + "중간": [], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:2-3-2 블록 붙이기(인력)).특별인부", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:2-3-2 블록 붙이기(인력)).보통인부", + "비목": "노무비" + } + ], + "덧줄": [], + "끝수": null, + "비고": "비탈면 고르기·흙 채움·잔디심기 별도(주③) · 호안블록 재료 원문 표에 없음" + }, + { + "열쇠": "2-3-3 블록 붙이기(기계)", + "이름": "블록 붙이기(기계)", + "결과단위": "원/㎡", + "출처": "건설품셈 토목 2-3-3", + "소유": "공용", + "입력": [ + { "이름": "장비", "고르기": ["크레인", "굴착기"], "출처": "건설품셈 토목 2-3-3 주④" }, + { + "이름": "크레인", + "고르기": [ + "2105-0005", + "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", + "2105-0002", + "2105-0003", + "2105-0010", + "2105-0015", + "2105-0018" + ] + }, + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + }, + { "이름": "보정작업", "고르기": ["해당 없음", "암석작업(연암・보통암・경암)", "전석섞인토사"], "출처": "건설품셈 공통 8-1-7 1" } + ], + "중간": [], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:2-3-3 블록 붙이기(기계)).특별인부", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:2-3-3 블록 붙이기(기계)).보통인부", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계=크레인, 지역=지역)", + "이름": "크레인", + "단위": "시간", + "수량": "만약(장비 == '크레인', 찾기(소요량:건설품셈:2-3-3 블록 붙이기(기계)).크레인, 0)" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 굴착기(무한궤도) 시간당 경비, 기계='0201-0020', 지역=지역, 보정작업=보정작업)", + "이름": "굴착기 0.2㎥", + "단위": "시간", + "수량": "만약(장비 == '굴착기', 찾기(소요량:건설품셈:2-3-3 블록 붙이기(기계) 계수 주④, 구분='크레인 대체 굴착기 사용시간').값, 0)", + "출처": "건설품셈 토목 2-3-3 주④" + } + ], + "덧줄": [], + "끝수": null, + "비고": "크레인 종류·규격 설계자 고름 — 원문 규격 10톤 · 현장여건 따라 크레인 대신 굴착기 0.2㎥ 0.063hr(주④) · 비탈면 고르기·흙 채움·잔디심기 별도(주③) · 호안블록 재료 원문 표에 없음" + } + ] +} diff --git a/resources/tester/test_masterdata_check.py b/resources/tester/test_masterdata_check.py index a2d4d158..d888e89a 100644 --- a/resources/tester/test_masterdata_check.py +++ b/resources/tester/test_masterdata_check.py @@ -20,6 +20,7 @@ SAMPLES = [ "로직_건설품셈_공통7장.json", "로직_건설품셈_공통8장.json", "로직_건설품셈_토목1장.json", + "로직_건설품셈_토목2장.json", "로직_산림품셈_03장.json", "로직_산림품셈_04장.json", "로직_산림품셈_05장.json", @@ -265,6 +266,13 @@ def test_토목_보도블록_감(whole): assert got["줄"][1]["수량"] == Decimal(1) / Decimal(171) +def test_토목_블록붙이기_굴착기_대체(whole): + """토목 2-3-3 주④ — 크레인 대신 굴착기 0.2㎥ 0.063hr · 크레인 0.""" + given = {"장비": "굴착기", "크레인": "2104-0010", "지역": "전국평균", "보정작업": "해당 없음"} + got = mf.run(whole, "건설품셈:2-3-3 블록 붙이기(기계)", given) + assert [line["수량"] for line in got["줄"][2:]] == [0, Decimal("0.063")] + + def test_범위_입력은_막음(whole): with pytest.raises(mf.FormulaError): mf.run( From 6b34f5d7d3d83fe0cdd709f4d0c59044c6d148e7 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sat, 19 Sep 2026 18:11:40 +0900 Subject: [PATCH 08/14] =?UTF-8?q?docs(master=5Fdata):=20=EA=B4=80=EB=A6=AC?= =?UTF-8?q?=EC=9E=90=20=ED=99=94=EB=A9=B4=20=EA=B3=84=EC=95=BD=20=E2=80=94?= =?UTF-8?q?=20M01=20API=20=EA=B8=B8=C2=B7=EC=9D=91=EB=8B=B5=20=EB=AA=A8?= =?UTF-8?q?=EC=96=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 읽기(그룹·파일·줄·표·로직) · 시험 계산 · 저장(409·422) 약속 Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01PAdA5ThqmtVSsbzjusk1cJ --- resources/master_data/_화면_계약.md | 59 +++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 resources/master_data/_화면_계약.md diff --git a/resources/master_data/_화면_계약.md b/resources/master_data/_화면_계약.md new file mode 100644 index 00000000..cc4e524c --- /dev/null +++ b/resources/master_data/_화면_계약.md @@ -0,0 +1,59 @@ +# 관리자 화면 계약 (M01) + +`resources/master_data/` 첫 층 JSON 을 보고 고치는 화면과 서버(`M01_MasterData/`) 사이의 약속. 파일 모양은 `_틀.md`. + +## 1. 공통 + +- 길 머리 `/api/m01` · 시스템 관리자만(아니면 403). +- 봉투 칸 이름은 영문 · 줄·표·로직 알맹이는 파일 그대로(한글 칸). +- 수는 JSON 수로 옴. +- `version` = 파일 판본(내용 해시). 읽을 때 받아 두고 저장 때 그대로 돌려줌. +- `file` = 파일 이름(`소요량_건설품셈_기계설비7장.json`). 밑줄 파일·하위 폴더는 없음. +- 없는 파일·열쇠 = 404 · 틀린 요청 = 400. + +## 2. 읽기 + +| 길 | 받음 | 줌 | +|---|---|---| +| `GET /groups` | | `{groups: [{group, files, rows}]}` — 그룹 차례는 `_틀.md` 2장 | +| `GET /groups/{group}/files` | | `{files: [{file, book, chapter, edition, rows, version}]}` | +| `GET /rows` | `file` · `page`(1) · `size`(50) · `q` | `{file, version, total, page, size, rows: [줄…]}` | +| `GET /tables` | `file` · `q` | `{file, version, tables: [{열쇠, 이름, 기준, 출처, 조건, 값칸, count}]}` | +| `GET /table` | `file` · `key` | `{file, version, table: {표 하나 통째}}` | +| `GET /logics` | `book` · `chapter` · `q` · `blocked`(0/1) | `{logics: [{file, book, chapter, 열쇠, 이름, 결과단위, 출처, blocked, reasons}]}` | +| `GET /logic` | `book` · `key` | `{file, version, logic: {로직 한 줄 통째}, blocked, reasons}` | + +- `rows` 는 요소·로직 파일은 `줄`, 표형 파일(소요량·계수)은 `표` 를 줄로 봄. +- `q` = 이름 찾기 — `열쇠`·`이름` 에 든 글(대소문자 무시). +- `chapter` = 파일 이름의 장(`13장` · `01장`) · 없으면 "". +- `blocked` = 로직 검사(`check_master.py 로직`)에 걸림 · `reasons` = 걸린 까닭 글. + +## 3. 시험 계산 + +`POST /calc` 받음 `{book, key, inputs: {이름: 값}}` + +- 됨 — `{ok: true, lines: [{이름, 단위, 수량, 단가, 금액, 비목: {비목: 금액}}], sums: {노무비, 재료비, 경비, 계}, middle: {이름: 값}}` +- 돈 아닌 로직 — `{ok: true, result, middle}` +- 멈춤 — `{ok: false, reason}` (200). 까닭 = 엔진 글 그대로(「입력 「돌」 없음」 · 「값 없음 — 관리자가 채울 값」 …). +- 계산은 저장된 파일로만 — 화면 캐시의 고친 값은 [저장] 뒤에 반영. + +## 4. 저장 + +`POST /save` 받음 `{files: [{file, version, changes: [{op, key, row}]}]}` + +- `op` — `edit`(열쇠 `key` 줄을 `row` 로 바꿈) · `add`(`row` 더함 · `key` 안 씀) · `delete`(`key` 줄 지움). +- 요소 파일 = `줄` 한 줄 · 표형 파일 = `표` 하나 · 로직 파일 = 로직 한 줄. `row` 는 통째(칸 일부만 보내지 않음). +- 화면은 조작을 캐시에 쌓고 [저장] 한 번에 보냄 — 서버는 이때만 파일에 씀. +- 순서: 모든 `version` 대조 → 모두 적용(메모리) → 검사 → 모두 씀. 하나라도 걸리면 아무것도 안 씀. + +| 답 | 뜻 | 몸 | +|---|---|---| +| 200 | 씀 | `{files: [{file, version}]}` — 새 판본 | +| 409 | 낡은 화면 — 그 사이 파일이 바뀜 | `{detail: {stale: [file…]}}` → 다시 읽고 다시 고침 | +| 422 | 검사 걸림 | `{detail: {errors: [글…]}}` | +| 404 | 없는 파일·열쇠 | `{detail}` | +| 400 | 틀린 `op` · 더할 열쇠가 이미 있음 · 고친 줄의 열쇠가 딴 줄과 겹침 | `{detail}` | + +- 검사 = `check_master.py` 의 틀(고친 파일) + 로직 변수(모든 로직 파일, 고친 뒤 마스터 기준). **고친 뒤 새로 생긴 걸림**만 막음 — 원래 있던 걸림은 막지 않음. +- 요소를 지워 어떤 로직이 가리키던 것이 사라지면 로직 변수 검사에 걸림(422). +- 쓰기는 UTF-8 · LF · 들여쓰기 2칸. From e11827f8f42e43e73340e0938deabaf3181eefa3 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sat, 19 Sep 2026 18:15:20 +0900 Subject: [PATCH 09/14] =?UTF-8?q?feat(M01):=20=EB=A7=88=EC=8A=A4=ED=84=B0?= =?UTF-8?q?=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EA=B4=80=EB=A6=AC=EC=9E=90=20?= =?UTF-8?q?API=20=EC=84=9C=EB=B2=84=20=EC=AA=BD=20=E2=80=94=20=EC=9D=BD?= =?UTF-8?q?=EA=B8=B0=20=C2=B7=20=EC=8B=9C=ED=97=98=20=EA=B3=84=EC=82=B0=20?= =?UTF-8?q?=C2=B7=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - M01_MasterData 라우터 + 파일 저장소 (/api/m01 · 시스템관리자 전용) - 저장 = 판본 대조(409) → 적용 → 틀·로직 변수 검사(새 걸림 422) → 씀 - check_master.py 에 load(folder) · check_saved · calc 드러냄 - 계약 문서 장 이름 보정(공통3장) - 시험 test_m01_api.py 8개 (임시 폴더 사본) Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01PAdA5ThqmtVSsbzjusk1cJ --- M01_MasterData/M01_MasterData_Router.py | 101 ++++++ M01_MasterData/M01_MasterData_Store.py | 300 ++++++++++++++++++ main.py | 2 + resources/master_data/_화면_계약.md | 2 +- resources/master_data/scripts/check_master.py | 28 +- resources/tester/test_m01_api.py | 176 ++++++++++ 6 files changed, 602 insertions(+), 7 deletions(-) create mode 100644 M01_MasterData/M01_MasterData_Router.py create mode 100644 M01_MasterData/M01_MasterData_Store.py create mode 100644 resources/tester/test_m01_api.py diff --git a/M01_MasterData/M01_MasterData_Router.py b/M01_MasterData/M01_MasterData_Router.py new file mode 100644 index 00000000..17ffe0b3 --- /dev/null +++ b/M01_MasterData/M01_MasterData_Router.py @@ -0,0 +1,101 @@ +"""M01 마스터 데이터 관리자 API — 계약 `resources/master_data/_화면_계약.md`. + +⚠ 권한은 등록하는 쪽(`main.py`)이 `system_admin_only` 로 붙임. +""" + +from __future__ import annotations + +from decimal import Decimal +from typing import Any, Literal + +from fastapi import APIRouter, HTTPException +from pydantic import BaseModel + +from M01_MasterData import M01_MasterData_Store as store + +router = APIRouter(prefix="/api/m01", tags=["M01 MasterData"]) + + +class CalcBody(BaseModel): + book: str + key: str + inputs: dict[str, Any] = {} + + +class Change(BaseModel): + op: Literal["edit", "add", "delete"] + key: str | None = None + row: dict[str, Any] | None = None + + +class FileChanges(BaseModel): + file: str + version: str + changes: list[Change] + + +class SaveBody(BaseModel): + files: list[FileChanges] + + +def _num(v): + """Decimal → JSON 수(그냥 두면 글자로 나감).""" + if isinstance(v, Decimal): + return int(v) if v == v.to_integral_value() else float(v) + if isinstance(v, list): + return [_num(x) for x in v] + if isinstance(v, dict): + return {k: _num(x) for k, x in v.items()} + return v + + +def _call(fn, *args): + try: + return _num(fn(*args)) + except store.StoreError as e: + raise HTTPException(status_code=e.status, detail=e.detail) from e + + +@router.get("/groups") +def get_groups() -> dict: + return {"groups": _call(store.groups)} + + +@router.get("/groups/{group}/files") +def get_files(group: str) -> dict: + return {"files": _call(store.files_of, group)} + + +@router.get("/rows") +def get_rows(file: str, page: int = 1, size: int = 50, q: str = "") -> dict: + return _call(store.rows, file, page, size, q) + + +@router.get("/tables") +def get_tables(file: str, q: str = "") -> dict: + return _call(store.tables, file, q) + + +@router.get("/table") +def get_table(file: str, key: str) -> dict: + return _call(store.table, file, key) + + +@router.get("/logics") +def get_logics(book: str = "", chapter: str = "", q: str = "", blocked: int | None = None) -> dict: + return {"logics": _call(store.logics, book, chapter, q, blocked)} + + +@router.get("/logic") +def get_logic(book: str, key: str) -> dict: + return _call(store.logic, book, key) + + +@router.post("/calc") +def post_calc(body: CalcBody) -> dict: + return _call(store.calc, body.book, body.key, body.inputs) + + +@router.post("/save") +def post_save(body: SaveBody) -> dict: + return {"files": _call(store.save, [f.model_dump() for f in body.files])} diff --git a/M01_MasterData/M01_MasterData_Store.py b/M01_MasterData/M01_MasterData_Store.py new file mode 100644 index 00000000..6540b563 --- /dev/null +++ b/M01_MasterData/M01_MasterData_Store.py @@ -0,0 +1,300 @@ +"""M01 마스터 데이터 파일 저장소 — `resources/master_data/` 첫 층 JSON 읽기·검사·쓰기. + +계약: `resources/master_data/_화면_계약.md` · 파일 모양: `_틀.md` +검사·계산 엔진: `scripts/check_master.py`. +""" + +from __future__ import annotations + +import hashlib +import json +import os +import re +import sys +import threading +from decimal import Decimal +from pathlib import Path + +SCRIPTS = Path(__file__).resolve().parents[1] / "resources/master_data/scripts" +sys.path.insert(0, str(SCRIPTS)) + +import check_master as cm # noqa: E402 + +FOLDER: Path = cm.MASTER # 시험은 사본 폴더로 바꿈 +_CHAPTER = re.compile(r"_([^_]*\d+장)\.json$") # 「공통3장」 · 「13장」 +# ponytail: 저장은 한 번에 하나(프로세스 안 잠금) · 서버를 여럿 띄우면 파일 잠금으로 +_LOCK = threading.Lock() + + +class StoreError(Exception): + def __init__(self, status: int, detail): + super().__init__(detail) + self.status, self.detail = status, detail + + +# ── 읽기 ────────────────────────────────────────────────────────────── +def _path(file: str) -> Path: + path = FOLDER / file + if "/" in file or "\\" in file or file.startswith("_") or not path.is_file(): + raise StoreError(404, f"없는 파일 「{file}」") + return path + + +def version_of(raw: bytes) -> str: + return hashlib.sha256(raw).hexdigest()[:16] + + +def read(file: str) -> tuple[dict, str]: + raw = _path(file).read_bytes() + return json.loads(raw, parse_float=Decimal, parse_int=Decimal), version_of(raw) + + +def items_key(data: dict) -> str: + return "표" if data.get("그룹") in cm.mf.TABLE_GROUPS else "줄" + + +def chapter_of(file: str) -> str: + m = _CHAPTER.search(file) + return m.group(1) if m else "" + + +def _hit(row: dict, q: str) -> bool: + q = q.lower() + return not q or q in str(row.get("열쇠", "")).lower() or q in str(row.get("이름", "")).lower() + + +def groups() -> list[dict]: + out = {g: {"group": g, "files": 0, "rows": 0} for g in cm.mf.GROUPS} + for data in cm.load(folder=FOLDER).values(): + slot = out.get(data.get("그룹")) + if slot: + slot["files"] += 1 + slot["rows"] += len(data.get(items_key(data)) or []) + return list(out.values()) + + +def files_of(group: str) -> list[dict]: + if group not in cm.mf.GROUPS: + raise StoreError(404, f"없는 그룹 「{group}」") + out = [] + for path in sorted(FOLDER.glob(f"{group}_*.json")): + data, version = read(path.name) + out.append( + { + "file": path.name, + "book": data.get("원문"), + "chapter": chapter_of(path.name), + "edition": data.get("판"), + "rows": len(data.get(items_key(data)) or []), + "version": version, + } + ) + return out + + +def rows(file: str, page: int, size: int, q: str) -> dict: + data, version = read(file) + hits = [r for r in data.get(items_key(data)) or [] if _hit(r, q)] + page, size = max(page, 1), min(max(size, 1), 500) + return { + "file": file, + "version": version, + "total": len(hits), + "page": page, + "size": size, + "rows": hits[(page - 1) * size : page * size], + } + + +def tables(file: str, q: str) -> dict: + data, version = read(file) + if items_key(data) != "표": + raise StoreError(400, f"표형 파일 아님 「{file}」") + heads = ("열쇠", "이름", "기준", "출처", "조건", "값칸") + return { + "file": file, + "version": version, + "tables": [ + {**{k: t.get(k) for k in heads}, "count": len(t.get("줄") or [])} + for t in data["표"] + if _hit(t, q) + ], + } + + +def _one(data: dict, key: str) -> dict: + for row in data.get(items_key(data)) or []: + if str(row.get("열쇠")) == key: + return row + raise StoreError(404, f"없는 열쇠 「{key}」") + + +def table(file: str, key: str) -> dict: + data, version = read(file) + return {"file": file, "version": version, "table": _one(data, key)} + + +def _logic_files(files: dict[str, dict]): + for name, data in files.items(): + if data.get("그룹") == "로직": + yield name, data + + +def logics(book: str, chapter: str, q: str, blocked: int | None) -> list[dict]: + files = cm.load(folder=FOLDER) + whole = cm.mf.Master(files) + out = [] + for name, data in _logic_files(files): + if (book and data.get("원문") != book) or (chapter and chapter_of(name) != chapter): + continue + for row in data.get("줄") or []: + if not _hit(row, q): + continue + reasons = cm.mf.check_logic(whole, data.get("원문"), row)[0] + if blocked is not None and bool(reasons) != bool(blocked): + continue + out.append( + { + "file": name, + "book": data.get("원문"), + "chapter": chapter_of(name), + **{k: row.get(k) for k in ("열쇠", "이름", "결과단위", "출처")}, + "blocked": bool(reasons), + "reasons": reasons, + } + ) + return out + + +def logic(book: str, key: str) -> dict: + files = cm.load(folder=FOLDER) + for name, data in _logic_files(files): + if data.get("원문") != book: + continue + for row in data.get("줄") or []: + if str(row.get("열쇠")) == key: + reasons = cm.mf.check_logic(cm.mf.Master(files), book, row)[0] + _, version = read(name) + return { + "file": name, + "version": version, + "logic": row, + "blocked": bool(reasons), + "reasons": reasons, + } + raise StoreError(404, f"없는 로직 「{book}:{key}」") + + +# ── 시험 계산 ────────────────────────────────────────────────────────── +def calc(book: str, key: str, inputs: dict) -> dict: + given = {k: _dec(v) for k, v in inputs.items()} + try: + result = cm.calc(cm.load(folder=FOLDER), f"{book}:{key}", given) + except (cm.mf.FormulaError, ArithmeticError, KeyError, TypeError, ValueError) as e: + return {"ok": False, "reason": str(e) or type(e).__name__} + if "결과" in result: + return {"ok": True, "result": result["결과"], "middle": result["중간"]} + return { + "ok": True, + "lines": result["줄"], + "sums": {k: result[k] for k in cm.mf.BUNDLE}, + "middle": result["중간"], + } + + +# ── 저장 ────────────────────────────────────────────────────────────── +def _dec(v): + """화면이 보낸 수 → Decimal(파일을 읽은 모양과 같게).""" + if isinstance(v, bool) or v is None: + return v + if isinstance(v, (int, float)): + return Decimal(str(v)) + if isinstance(v, list): + return [_dec(x) for x in v] + if isinstance(v, dict): + return {k: _dec(x) for k, x in v.items()} + return v + + +def _apply(data: dict, changes: list[dict], file: str) -> None: + items = data.setdefault(items_key(data), []) + for ch in changes: + op, key, row = ch.get("op"), ch.get("key"), _dec(ch.get("row")) + if op not in ("edit", "add", "delete"): + raise StoreError(400, f"모르는 op 「{op}」") + if op != "add": + at = next((i for i, r in enumerate(items) if str(r.get("열쇠")) == key), None) + if at is None: + raise StoreError(404, f"{file} · 없는 열쇠 「{key}」") + if op != "delete" and not (isinstance(row, dict) and "열쇠" in row): + raise StoreError(400, f"{file} · row 에 열쇠 없음") + new_key = str(row["열쇠"]) if op != "delete" else None + taken = {str(r.get("열쇠")) for i, r in enumerate(items) if op == "add" or i != at} + if new_key in taken: + raise StoreError(400, f"{file} · 열쇠 겹침 「{new_key}」") + if op == "add": + items.append(row) + elif op == "edit": + items[at] = row + else: + del items[at] + + +def save(batch: list[dict]) -> list[dict]: + with _LOCK: + stale = [p.get("file", "") for p in batch if read(p.get("file", ""))[1] != p.get("version")] + if stale: + raise StoreError(409, {"stale": stale}) + before, after = cm.load(folder=FOLDER), cm.load(folder=FOLDER) # after = 고칠 사본 + names = [part["file"] for part in batch] + for part in batch: + _apply(after[part["file"]], part.get("changes") or [], part["file"]) + old = set(cm.check_saved(before, names)) + new = [x for x in cm.check_saved(after, names) if x not in old] + if new: + raise StoreError(422, {"errors": new}) + out = [] + for name in dict.fromkeys(names): + text = dump(after[name]) + tmp = FOLDER / f".{name}.tmp" + tmp.write_text(text, encoding="utf-8", newline="\n") + os.replace(tmp, FOLDER / name) + out.append({"file": name, "version": version_of(text.encode("utf-8"))}) + return out + + +# ── 쓰기 모양 ───────────────────────────────────────────────────────── +def _atom(v) -> str: + if isinstance(v, Decimal): + return str(v) + return json.dumps(v, ensure_ascii=False) + + +def _flat(v) -> str: + if isinstance(v, dict): + return ( + "{ " + ", ".join(f"{_atom(k)}: {_flat(x)}" for k, x in v.items()) + " }" if v else "{}" + ) + if isinstance(v, list): + return "[" + ", ".join(_flat(x) for x in v) + "]" + return _atom(v) + + +def dump(v, indent: int = 0, width: int = 160) -> str: + """UTF-8 · 들여쓰기 2칸 · 한 줄에 들어가는 묶음은 한 줄로.""" + flat = _flat(v) + if indent and len(flat) + indent <= width or not isinstance(v, (dict, list)) or not v: + return flat + ("" if indent else "\n") + pad = " " * (indent + 2) + if isinstance(v, dict): + body = [f"{pad}{_atom(k)}: {dump(x, indent + 2, width)}" for k, x in v.items()] + text = "{\n" + ",\n".join(body) + "\n" + " " * indent + "}" + else: + text = ( + "[\n" + + ",\n".join(pad + dump(x, indent + 2, width) for x in v) + + "\n" + + " " * indent + + "]" + ) + return text + ("" if indent else "\n") diff --git a/main.py b/main.py index 85f2344a..916efeaa 100644 --- a/main.py +++ b/main.py @@ -76,6 +76,7 @@ from B09_Estimation.B09_Estimation_Router_MaterialPrices import ( router as b09_material_prices_router, ) from Z01_MasterData.Z01_MasterData_Router import router as z01_master_data_router +from M01_MasterData.M01_MasterData_Router import router as m01_master_data_router from common_util.common_util_audit import note_api_call, record_call_burst from common_util.common_util_auth import ( require_company, @@ -659,6 +660,7 @@ app.include_router(b09_material_prices_router, dependencies=protected_with_compa # Z01 마스터 데이터 — 회사·프로젝트가 아니라 시스템 관리자만 본다(2026-09-15 브레인 Z01). system_admin_only = [Depends(verify_session), Depends(require_system_admin)] app.include_router(z01_master_data_router, dependencies=system_admin_only) +app.include_router(m01_master_data_router, dependencies=system_admin_only) # 개발 전용 잠금 해제 — 다른 라우터와 **같은 보호**를 받는다(로그인·회사·프로젝트 접근). # 그 위에 서버가 환경까지 한 번 더 본다. app.include_router(dev_unlock_router, dependencies=protected_with_company) diff --git a/resources/master_data/_화면_계약.md b/resources/master_data/_화면_계약.md index cc4e524c..aa0d76eb 100644 --- a/resources/master_data/_화면_계약.md +++ b/resources/master_data/_화면_계약.md @@ -25,7 +25,7 @@ - `rows` 는 요소·로직 파일은 `줄`, 표형 파일(소요량·계수)은 `표` 를 줄로 봄. - `q` = 이름 찾기 — `열쇠`·`이름` 에 든 글(대소문자 무시). -- `chapter` = 파일 이름의 장(`13장` · `01장`) · 없으면 "". +- `chapter` = 파일 이름의 장(`공통3장` · `13장` · `01장`) · 없으면 "". - `blocked` = 로직 검사(`check_master.py 로직`)에 걸림 · `reasons` = 걸린 까닭 글. ## 3. 시험 계산 diff --git a/resources/master_data/scripts/check_master.py b/resources/master_data/scripts/check_master.py index 0bee4a7b..84224b7a 100644 --- a/resources/master_data/scripts/check_master.py +++ b/resources/master_data/scripts/check_master.py @@ -59,10 +59,10 @@ ROW_KEYS = { } -def load(names: list[str] | None = None) -> dict[str, dict]: - """첫 층 JSON 모두(밑줄 파일 빼고) — 수는 Decimal.""" +def load(names: list[str] | None = None, folder: Path = MASTER) -> dict[str, dict]: + """첫 층 JSON 모두(밑줄 파일 빼고) — 수는 Decimal. `folder` = 마스터 폴더(M01 시험은 사본).""" out = {} - for path in sorted(MASTER.glob("*.json")): + for path in sorted(Path(folder).glob("*.json")): if path.name.startswith("_") or ( names and path.name not in names and path.stem not in names ): @@ -73,8 +73,19 @@ def load(names: list[str] | None = None) -> dict[str, dict]: return out -def master() -> mf.Master: - return mf.Master(load()) +def master(folder: Path = MASTER) -> mf.Master: + return mf.Master(load(folder=folder)) + + +def check_saved(files: dict[str, dict], changed: list[str]) -> list[str]: + """저장 전 검사(M01) — 고친 파일의 틀 + 모든 로직의 변수. `files` = 폴더 전부(고친 뒤).""" + out = [x for name in changed for x in check_form(name, files[name])] + return out + check_logics(files, mf.Master(files)) + + +def calc(files: dict[str, dict], ref: str, given: dict) -> dict: + """시험 계산(M01) — `ref` = 「원문:로직 열쇠」 · 멈추면 FormulaError.""" + return mf.run(mf.Master(files), ref, given) # ── (1) 틀 ──────────────────────────────────────────────────────────── @@ -228,7 +239,12 @@ def check_body(files: dict[str, dict]) -> list[str]: if not text: out.append(f"{where} · 본문 절 못 찾음 「{table.get('출처')}」") continue - mine = _flat(table.get("줄")) | _flat(table.get("기준")) | _flat(table.get("주")) | _flat(table.get("값칸")) + mine = ( + _flat(table.get("줄")) + | _flat(table.get("기준")) + | _flat(table.get("주")) + | _flat(table.get("값칸")) + ) fake = mine - numbers_in(text) if fake: out.append(f"{where} · 허구 {len(fake)} {sorted(fake, key=Decimal)}") diff --git a/resources/tester/test_m01_api.py b/resources/tester/test_m01_api.py new file mode 100644 index 00000000..35c73fdc --- /dev/null +++ b/resources/tester/test_m01_api.py @@ -0,0 +1,176 @@ +"""M01 마스터 데이터 API — 계약 `resources/master_data/_화면_계약.md`. + +임시 폴더에 master_data 첫 층 JSON 사본을 두고 읽기 · 시험 계산 · 저장 · 409 · 422. +""" + +from __future__ import annotations + +import json +import shutil +from decimal import Decimal +from pathlib import Path + +import pytest +from fastapi import FastAPI +from fastapi.testclient import TestClient + +from M01_MasterData import M01_MasterData_Router as router_module +from M01_MasterData import M01_MasterData_Store as store + +REAL = store.FOLDER +LABOR = "인력_건설노임.json" +LOGIC_BOOK, LOGIC_KEY = ( + "건설품셈", + "3-3-1 암발파(미진동굴착 TYPE-Ⅰ)", +) # 화약취급공 1016 · 보통인부 1002 + + +@pytest.fixture +def client(tmp_path: Path, monkeypatch) -> TestClient: + for path in REAL.glob("*.json"): + if not path.name.startswith("_"): + shutil.copy(path, tmp_path / path.name) + monkeypatch.setattr(store, "FOLDER", tmp_path) + app = FastAPI() + app.include_router(router_module.router) + return TestClient(app) + + +def _get(client: TestClient, url: str, **params) -> dict: + res = client.get(url, params=params) + assert res.status_code == 200, res.text + return res.json() + + +def _calc(client: TestClient, **inputs) -> dict: + res = client.post( + "/api/m01/calc", json={"book": LOGIC_BOOK, "key": LOGIC_KEY, "inputs": inputs} + ) + assert res.status_code == 200, res.text + return res.json() + + +def _labor_row(client: TestClient, key: str) -> tuple[dict, str]: + got = _get(client, "/api/m01/rows", file=LABOR, q="", size=500) + return next(r for r in got["rows"] if r["열쇠"] == key), got["version"] + + +def test_그룹_파일_줄_쪽나눔_찾기(client: TestClient) -> None: + groups = {g["group"]: g for g in _get(client, "/api/m01/groups")["groups"]} + assert list(groups) == ["인력", "재료", "기계", "소요량", "계수", "환율", "요율", "로직"] + files = _get(client, "/api/m01/groups/인력/files")["files"] + assert LABOR in [f["file"] for f in files] + assert groups["인력"]["files"] == len(files) + page2 = _get(client, "/api/m01/rows", file=LABOR, page=2, size=10) + assert page2["page"] == 2 and len(page2["rows"]) == 10 and page2["total"] > 20 + hit = _get(client, "/api/m01/rows", file=LABOR, q="보통인부") + assert [r["열쇠"] for r in hit["rows"]] == ["1002"] + assert client.get("/api/m01/rows", params={"file": "없음.json"}).status_code == 404 + assert client.get("/api/m01/rows", params={"file": "../main.py"}).status_code == 404 + + +def test_표형_요소_표_목록과_표_하나(client: TestClient) -> None: + file = "소요량_건설품셈_공통3장.json" + listed = _get(client, "/api/m01/tables", file=file, q="암발파") + one = next(t for t in listed["tables"] if t["열쇠"] == LOGIC_KEY) + assert one["count"] >= 1 and "줄" not in one + table = _get(client, "/api/m01/table", file=file, key=LOGIC_KEY)["table"] + assert len(table["줄"]) == one["count"] and table["값칸"] == one["값칸"] + assert client.get("/api/m01/tables", params={"file": LABOR}).status_code == 400 + + +def test_로직_목록_하나_시험계산(client: TestClient) -> None: + listed = _get(client, "/api/m01/logics", book=LOGIC_BOOK, chapter="공통3장", q="암발파")[ + "logics" + ] + assert LOGIC_KEY in [x["열쇠"] for x in listed] + assert all(x["chapter"] == "공통3장" and not x["blocked"] for x in listed) + assert _get(client, "/api/m01/logics", blocked=1)["logics"] == [] + one = _get(client, "/api/m01/logic", book=LOGIC_BOOK, key=LOGIC_KEY) + assert one["file"] == "로직_건설품셈_공통3장.json" and one["blocked"] is False + got = _calc(client) + assert got["ok"] is True + lines = {x["이름"]: x for x in got["lines"]} + assert Decimal(str(lines["화약취급공"]["금액"])) == Decimal( + str(lines["화약취급공"]["수량"]) + ) * Decimal(str(lines["화약취급공"]["단가"])) + assert got["sums"]["계"] == pytest.approx(sum(x["금액"] for x in got["lines"])) + stop = _calc(client, 없는입력=1) + assert stop["ok"] is False and "모르는 입력" in stop["reason"] + + +def test_저장_고침은_파일에_쓰고_낡은_판본은_409(client: TestClient) -> None: + row, version = _labor_row(client, "1016") + before = _calc(client)["sums"]["계"] + edited = {**row, "값": row["값"] + 1000} + body = { + "files": [ + { + "file": LABOR, + "version": version, + "changes": [{"op": "edit", "key": "1016", "row": edited}], + } + ] + } + res = client.post("/api/m01/save", json=body) + assert res.status_code == 200, res.text + new_version = res.json()["files"][0]["version"] + assert new_version != version + assert _labor_row(client, "1016") == (edited, new_version) + assert _calc(client)["sums"]["계"] == pytest.approx(before + 1000 * 0.04) # 화약취급공 0.040 인 + data = json.loads((store.FOLDER / LABOR).read_text(encoding="utf-8")) + assert ( + data["그룹"] == "인력" + and len(data["줄"]) == _get(client, "/api/m01/rows", file=LABOR)["total"] + ) + again = client.post("/api/m01/save", json=body) # 옛 판본 그대로 + assert again.status_code == 409 and again.json()["detail"]["stale"] == [LABOR] + + +def test_저장_검사에_걸리면_아무것도_안_씀(client: TestClient) -> None: + _, version = _labor_row(client, "1016") + raw = (store.FOLDER / LABOR).read_bytes() + gone = {"file": LABOR, "version": version, "changes": [{"op": "delete", "key": "1016"}]} + res = client.post("/api/m01/save", json={"files": [gone]}) + assert res.status_code == 422 and any("1016" in x for x in res.json()["detail"]["errors"]) + bad_form = {**_labor_row(client, "1002")[0], "열쇠": "9999"} + del bad_form["출처"] + res = client.post( + "/api/m01/save", json={"files": [{**gone, "changes": [{"op": "add", "row": bad_form}]}]} + ) + assert res.status_code == 422 and any("출처" in x for x in res.json()["detail"]["errors"]) + dup = {**gone, "changes": [{"op": "add", "row": _labor_row(client, "1002")[0]}]} + assert client.post("/api/m01/save", json={"files": [dup]}).status_code == 400 + assert (store.FOLDER / LABOR).read_bytes() == raw + + +def test_더함_지움_로직_파일도_같은_길(client: TestClient) -> None: + one = _get(client, "/api/m01/logic", book=LOGIC_BOOK, key=LOGIC_KEY) + copy = {**one["logic"], "열쇠": LOGIC_KEY + " 사본"} + add = {"file": one["file"], "version": one["version"], "changes": [{"op": "add", "row": copy}]} + res = client.post("/api/m01/save", json={"files": [add]}) + assert res.status_code == 200, res.text + assert _get(client, "/api/m01/logic", book=LOGIC_BOOK, key=copy["열쇠"])["blocked"] is False + drop = { + "file": one["file"], + "version": res.json()["files"][0]["version"], + "changes": [{"op": "delete", "key": copy["열쇠"]}], + } + assert client.post("/api/m01/save", json={"files": [drop]}).status_code == 200 + assert ( + client.get("/api/m01/logic", params={"book": LOGIC_BOOK, "key": copy["열쇠"]}).status_code + == 404 + ) + + +def test_쓰기_모양은_읽은_값과_같음() -> None: + for name in ("소요량_건설품셈_기계설비13장.json", "로직_건설품셈_토목2장.json", LABOR): + data = json.loads((REAL / name).read_text(encoding="utf-8"), parse_float=Decimal) + text = store.dump(data) + assert json.loads(text, parse_float=Decimal) == data + assert "\r" not in text and text.endswith("}\n") + + +def test_main_은_시스템관리자만() -> None: + main = (Path(__file__).resolve().parents[2] / "main.py").read_text(encoding="utf-8") + assert "app.include_router(m01_master_data_router, dependencies=system_admin_only)" in main From a132b9d8fd6aca003da3e5afe7d30eb99b7bbbb6 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sat, 19 Sep 2026 18:19:45 +0900 Subject: [PATCH 10/14] =?UTF-8?q?knowledge(=EA=B1=B4=EC=84=A4=ED=92=88?= =?UTF-8?q?=EC=85=88=ED=86=A0=EB=AA=A99=EC=9E=A5):=20=EC=B8=A1=EB=9F=89=20?= =?UTF-8?q?9-5=20=EA=B3=84=EC=97=B4=20=EC=86=8C=EC=9A=94=EB=9F=89=20?= =?UTF-8?q?=EC=9A=94=EC=86=8C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 건설품셈 토목 제9장 측량 9-5 지도제작 계열(9-5-1 항공사진촬영~ 9-5-10 무인비행장치 측량, 신규 170표)의 표·계수·글 속 계산 상수를 소요량_건설품셈_토목9장.json 에 이어 담음(누계 288표). check_master.py 틀·본문 0건 확인. 9-6~9-18 지적측량 계열은 이어서 담을 예정. --- .../master_data/소요량_건설품셈_토목9장.json | 11093 ++++++++++++++++ 1 file changed, 11093 insertions(+) diff --git a/resources/master_data/소요량_건설품셈_토목9장.json b/resources/master_data/소요량_건설품셈_토목9장.json index 23685f1f..d8b82c0d 100644 --- a/resources/master_data/소요량_건설품셈_토목9장.json +++ b/resources/master_data/소요량_건설품셈_토목9장.json @@ -17487,6 +17487,11099 @@ } ], "주": [] + }, + { + "열쇠": "9-5-1 디지털항공사진 GSD별 제원", + "이름": "디지털항공사진 지상표본거리(GSD)별 제원", + "기준": "초점거리 11.2㎝ 기준", + "출처": "건설품셈 토목 9-5-1", + "조건": { + "GSD(㎝)": "고르기" + }, + "값칸": { + "비행고도(m)": "m", + "1변실거리_종": "㎞", + "1변실거리_횡": "㎞", + "촬영면적": "㎢", + "촬영기선장": "㎞", + "코스간격": "㎞", + "스테레오면적": "㎢" + }, + "줄": [ + { + "GSD(㎝)": 8, + "비행고도(m)": 1600, + "1변실거리_종": 1.12, + "1변실거리_횡": 1.34, + "촬영면적": 1.5, + "촬영기선장": 0.45, + "코스간격": 0.94, + "스테레오면적": 0.42 + }, + { + "GSD(㎝)": 10, + "비행고도(m)": 2000, + "1변실거리_종": 1.4, + "1변실거리_횡": 1.68, + "촬영면적": 2.35, + "촬영기선장": 0.56, + "코스간격": 1.17, + "스테레오면적": 0.66 + }, + { + "GSD(㎝)": 12, + "비행고도(m)": 2400, + "1변실거리_종": 1.68, + "1변실거리_횡": 2.012, + "촬영면적": 3.38, + "촬영기선장": 0.67, + "코스간격": 1.41, + "스테레오면적": 0.95 + }, + { + "GSD(㎝)": 15, + "비행고도(m)": 3000, + "1변실거리_종": 2.1, + "1변실거리_횡": 2.52, + "촬영면적": 5.29, + "촬영기선장": 0.84, + "코스간격": 1.76, + "스테레오면적": 1.48 + }, + { + "GSD(㎝)": 20, + "비행고도(m)": 4000, + "1변실거리_종": 2.8, + "1변실거리_횡": 3.35, + "촬영면적": 9.4, + "촬영기선장": 1.12, + "코스간격": 2.35, + "스테레오면적": 2.63 + }, + { + "GSD(㎝)": 25, + "비행고도(m)": 5000, + "1변실거리_종": 3.5, + "1변실거리_횡": 4.19, + "촬영면적": 14.69, + "촬영기선장": 1.4, + "코스간격": 2.93, + "스테레오면적": 4.11 + }, + { + "GSD(㎝)": 42, + "비행고도(m)": 8400, + "1변실거리_종": 5.89, + "1변실거리_횡": 7.043, + "촬영면적": 41.46, + "촬영기선장": 2.36, + "코스간격": 4.93, + "스테레오면적": 11.61 + }, + { + "GSD(㎝)": 80, + "비행고도(m)": 16000, + "1변실거리_종": 11.21, + "1변실거리_횡": 13.41, + "촬영면적": 150.41, + "촬영기선장": 4.49, + "코스간격": 9.39, + "스테레오면적": 42.12 + } + ], + "주": [ + "비행고도 = 지상표본거리(GSD)×초점거리/CCD크기.", + "1변 실거리(종·횡) = 영상크기(종·횡)×지상표본거리(GSD).", + "촬영면적 = 1변 실거리(종)×1변 실거리(횡).", + "촬영기선장 = 1변 실거리(종)×(1-종중복도).", + "코스간격 = 1변 실거리(횡)×(1-횡중복도).", + "스테레오면적 = 촬영기선장×코스간격.", + "사진 중복도는 비행방향으로 60%, 스트립 사이 30%를 기준으로 한 것이다.", + "항공사진 촬영은 각 촬영 노선마다 양단에서의 여유는 각각 2매 이상으로 하고, 촬영축척이나 지형에 따라 조정하며 촬영구역 경계에 접한 촬영노선에서는 사진 폭의 약 30%를 여유 있게 촬영한다.", + "촬영기준면의 변화 또는 산악지대의 촬영에서 중복도를 변경할 경우에는 별도 계산한다.", + "항공사진축척 및 지상표본거리(GSD)는 최종도면의 축척, 최고비행고도, 등고선 간격, 도화기의 정밀도 및 사진의 사용목적에 따라 결정한다.", + "측량용 카메라의 초점거리는 1/100m단위까지 정밀측정 한다." + ] + }, + { + "열쇠": "9-5-1 적용예 카메라제원1", + "이름": "항공사진촬영 적용예(카메라 제원1: 영상크기 14,016×16,768pixel, CCD 5.6㎛, 초점거리 11.2㎝)", + "기준": "", + "출처": "건설품셈 토목 9-5-1 적용예", + "조건": { + "GSD(㎝)": "고르기" + }, + "값칸": { + "비행고도(m)": "m", + "1변실거리_종": "㎞", + "1변실거리_횡": "㎞", + "촬영면적": "㎢", + "촬영기선장": "㎞", + "코스간격": "㎞", + "스테레오면적": "㎢" + }, + "줄": [ + { + "GSD(㎝)": 8, + "비행고도(m)": 1600, + "1변실거리_종": 1.12, + "1변실거리_횡": 1.34, + "촬영면적": 1.5, + "촬영기선장": 0.45, + "코스간격": 0.94, + "스테레오면적": 0.42 + }, + { + "GSD(㎝)": 10, + "비행고도(m)": 2000, + "1변실거리_종": 1.4, + "1변실거리_횡": 1.68, + "촬영면적": 2.35, + "촬영기선장": 0.56, + "코스간격": 1.17, + "스테레오면적": 0.66 + }, + { + "GSD(㎝)": 12, + "비행고도(m)": 2400, + "1변실거리_종": 1.68, + "1변실거리_횡": 2.01, + "촬영면적": 3.38, + "촬영기선장": 0.67, + "코스간격": 1.41, + "스테레오면적": 0.95 + }, + { + "GSD(㎝)": 15, + "비행고도(m)": 3000, + "1변실거리_종": 2.1, + "1변실거리_횡": 2.52, + "촬영면적": 5.29, + "촬영기선장": 0.84, + "코스간격": 1.76, + "스테레오면적": 1.48 + }, + { + "GSD(㎝)": 20, + "비행고도(m)": 4000, + "1변실거리_종": 2.8, + "1변실거리_횡": 3.35, + "촬영면적": 9.4, + "촬영기선장": 1.12, + "코스간격": 2.35, + "스테레오면적": 2.63 + }, + { + "GSD(㎝)": 25, + "비행고도(m)": 5000, + "1변실거리_종": 3.5, + "1변실거리_횡": 4.19, + "촬영면적": 14.69, + "촬영기선장": 1.4, + "코스간격": 2.93, + "스테레오면적": 4.11 + }, + { + "GSD(㎝)": 42, + "비행고도(m)": 8400, + "1변실거리_종": 5.89, + "1변실거리_횡": 7.04, + "촬영면적": 41.46, + "촬영기선장": 2.35, + "코스간격": 4.93, + "스테레오면적": 11.61 + }, + { + "GSD(㎝)": 80, + "비행고도(m)": 16000, + "1변실거리_종": 11.21, + "1변실거리_횡": 13.41, + "촬영면적": 150.41, + "촬영기선장": 4.49, + "코스간격": 9.39, + "스테레오면적": 42.12 + } + ], + "주": [] + }, + { + "열쇠": "9-5-1 적용예 카메라제원2", + "이름": "항공사진촬영 적용예(카메라 제원2: 영상크기 14,790×23,010pixel, CCD 4.6㎛, 초점거리 12㎝)", + "기준": "", + "출처": "건설품셈 토목 9-5-1 적용예", + "조건": { + "GSD(㎝)": "고르기" + }, + "값칸": { + "비행고도(m)": "m", + "1변실거리_종": "㎞", + "1변실거리_횡": "㎞", + "촬영면적": "㎢", + "촬영기선장": "㎞", + "코스간격": "㎞", + "스테레오면적": "㎢" + }, + "줄": [ + { + "GSD(㎝)": 8, + "비행고도(m)": 2087, + "1변실거리_종": 1.18, + "1변실거리_횡": 1.84, + "촬영면적": 2.18, + "촬영기선장": 0.47, + "코스간격": 1.29, + "스테레오면적": 0.61 + }, + { + "GSD(㎝)": 10, + "비행고도(m)": 2609, + "1변실거리_종": 1.48, + "1변실거리_횡": 2.3, + "촬영면적": 3.4, + "촬영기선장": 0.59, + "코스간격": 1.61, + "스테레오면적": 0.95 + }, + { + "GSD(㎝)": 12, + "비행고도(m)": 3130, + "1변실거리_종": 1.77, + "1변실거리_횡": 2.76, + "촬영면적": 4.9, + "촬영기선장": 0.71, + "코스간격": 1.93, + "스테레오면적": 1.37 + }, + { + "GSD(㎝)": 15, + "비행고도(m)": 3913, + "1변실거리_종": 2.22, + "1변실거리_횡": 3.45, + "촬영면적": 7.66, + "촬영기선장": 0.89, + "코스간격": 2.42, + "스테레오면적": 2.14 + }, + { + "GSD(㎝)": 20, + "비행고도(m)": 5217, + "1변실거리_종": 2.96, + "1변실거리_횡": 4.6, + "촬영면적": 13.61, + "촬영기선장": 1.18, + "코스간격": 3.22, + "스테레오면적": 3.81 + }, + { + "GSD(㎝)": 25, + "비행고도(m)": 6522, + "1변실거리_종": 3.7, + "1변실거리_횡": 5.75, + "촬영면적": 21.27, + "촬영기선장": 1.48, + "코스간격": 4.03, + "스테레오면적": 5.96 + }, + { + "GSD(㎝)": 42, + "비행고도(m)": 10957, + "1변실거리_종": 6.21, + "1변실거리_횡": 9.66, + "촬영면적": 60.03, + "촬영기선장": 2.48, + "코스간격": 6.76, + "스테레오면적": 16.81 + }, + { + "GSD(㎝)": 80, + "비행고도(m)": 20870, + "1변실거리_종": 11.83, + "1변실거리_횡": 18.41, + "촬영면적": 217.8, + "촬영기선장": 4.73, + "코스간격": 12.89, + "스테레오면적": 60.98 + } + ], + "주": [] + }, + { + "열쇠": "9-5-1 월별 천후표", + "이름": "항공사진촬영 월별 천후표(쾌청일수)", + "기준": "", + "출처": "건설품셈 토목 9-5-1", + "조건": { + "지역별": "고르기", + "월": "고르기" + }, + "값칸": { + "쾌청일수": "일" + }, + "줄": [ + { + "지역별": "춘천", + "월": "1월", + "쾌청일수": "(7)" + }, + { + "지역별": "춘천", + "월": "2월", + "쾌청일수": "(5)" + }, + { + "지역별": "춘천", + "월": "3월", + "쾌청일수": 6 + }, + { + "지역별": "춘천", + "월": "4월", + "쾌청일수": 4 + }, + { + "지역별": "춘천", + "월": "5월", + "쾌청일수": 4 + }, + { + "지역별": "춘천", + "월": "6월", + "쾌청일수": 2 + }, + { + "지역별": "춘천", + "월": "7월", + "쾌청일수": 0 + }, + { + "지역별": "춘천", + "월": "8월", + "쾌청일수": 0 + }, + { + "지역별": "춘천", + "월": "9월", + "쾌청일수": 2 + }, + { + "지역별": "춘천", + "월": "10월", + "쾌청일수": 5 + }, + { + "지역별": "춘천", + "월": "11월", + "쾌청일수": 3 + }, + { + "지역별": "춘천", + "월": "12월", + "쾌청일수": "(7)" + }, + { + "지역별": "춘천", + "월": "계", + "쾌청일수": 45 + }, + { + "지역별": "강릉", + "월": "1월", + "쾌청일수": "(11)" + }, + { + "지역별": "강릉", + "월": "2월", + "쾌청일수": "(6)" + }, + { + "지역별": "강릉", + "월": "3월", + "쾌청일수": "(6)" + }, + { + "지역별": "강릉", + "월": "4월", + "쾌청일수": 4 + }, + { + "지역별": "강릉", + "월": "5월", + "쾌청일수": 3 + }, + { + "지역별": "강릉", + "월": "6월", + "쾌청일수": 2 + }, + { + "지역별": "강릉", + "월": "7월", + "쾌청일수": 0 + }, + { + "지역별": "강릉", + "월": "8월", + "쾌청일수": 1 + }, + { + "지역별": "강릉", + "월": "9월", + "쾌청일수": 1 + }, + { + "지역별": "강릉", + "월": "10월", + "쾌청일수": 5 + }, + { + "지역별": "강릉", + "월": "11월", + "쾌청일수": 6 + }, + { + "지역별": "강릉", + "월": "12월", + "쾌청일수": "(10)" + }, + { + "지역별": "강릉", + "월": "계", + "쾌청일수": 55 + }, + { + "지역별": "서울", + "월": "1월", + "쾌청일수": "(8)" + }, + { + "지역별": "서울", + "월": "2월", + "쾌청일수": "(6)" + }, + { + "지역별": "서울", + "월": "3월", + "쾌청일수": 6 + }, + { + "지역별": "서울", + "월": "4월", + "쾌청일수": 5 + }, + { + "지역별": "서울", + "월": "5월", + "쾌청일수": 6 + }, + { + "지역별": "서울", + "월": "6월", + "쾌청일수": 2 + }, + { + "지역별": "서울", + "월": "7월", + "쾌청일수": 0 + }, + { + "지역별": "서울", + "월": "8월", + "쾌청일수": 1 + }, + { + "지역별": "서울", + "월": "9월", + "쾌청일수": 4 + }, + { + "지역별": "서울", + "월": "10월", + "쾌청일수": 7 + }, + { + "지역별": "서울", + "월": "11월", + "쾌청일수": 4 + }, + { + "지역별": "서울", + "월": "12월", + "쾌청일수": "(6)" + }, + { + "지역별": "서울", + "월": "계", + "쾌청일수": 55 + }, + { + "지역별": "인천", + "월": "1월", + "쾌청일수": "(7)" + }, + { + "지역별": "인천", + "월": "2월", + "쾌청일수": "(6)" + }, + { + "지역별": "인천", + "월": "3월", + "쾌청일수": 7 + }, + { + "지역별": "인천", + "월": "4월", + "쾌청일수": 5 + }, + { + "지역별": "인천", + "월": "5월", + "쾌청일수": 5 + }, + { + "지역별": "인천", + "월": "6월", + "쾌청일수": 1 + }, + { + "지역별": "인천", + "월": "7월", + "쾌청일수": 0 + }, + { + "지역별": "인천", + "월": "8월", + "쾌청일수": 1 + }, + { + "지역별": "인천", + "월": "9월", + "쾌청일수": 3 + }, + { + "지역별": "인천", + "월": "10월", + "쾌청일수": 6 + }, + { + "지역별": "인천", + "월": "11월", + "쾌청일수": 5 + }, + { + "지역별": "인천", + "월": "12월", + "쾌청일수": "(6)" + }, + { + "지역별": "인천", + "월": "계", + "쾌청일수": 52 + }, + { + "지역별": "울릉도", + "월": "1월", + "쾌청일수": 0 + }, + { + "지역별": "울릉도", + "월": "2월", + "쾌청일수": 0 + }, + { + "지역별": "울릉도", + "월": "3월", + "쾌청일수": "(2)" + }, + { + "지역별": "울릉도", + "월": "4월", + "쾌청일수": 3 + }, + { + "지역별": "울릉도", + "월": "5월", + "쾌청일수": 3 + }, + { + "지역별": "울릉도", + "월": "6월", + "쾌청일수": 1 + }, + { + "지역별": "울릉도", + "월": "7월", + "쾌청일수": 1 + }, + { + "지역별": "울릉도", + "월": "8월", + "쾌청일수": 0 + }, + { + "지역별": "울릉도", + "월": "9월", + "쾌청일수": 0 + }, + { + "지역별": "울릉도", + "월": "10월", + "쾌청일수": 1 + }, + { + "지역별": "울릉도", + "월": "11월", + "쾌청일수": 0 + }, + { + "지역별": "울릉도", + "월": "12월", + "쾌청일수": 0 + }, + { + "지역별": "울릉도", + "월": "계", + "쾌청일수": 11 + }, + { + "지역별": "수원", + "월": "1월", + "쾌청일수": "(7)" + }, + { + "지역별": "수원", + "월": "2월", + "쾌청일수": "(5)" + }, + { + "지역별": "수원", + "월": "3월", + "쾌청일수": 6 + }, + { + "지역별": "수원", + "월": "4월", + "쾌청일수": 5 + }, + { + "지역별": "수원", + "월": "5월", + "쾌청일수": 5 + }, + { + "지역별": "수원", + "월": "6월", + "쾌청일수": 2 + }, + { + "지역별": "수원", + "월": "7월", + "쾌청일수": 0 + }, + { + "지역별": "수원", + "월": "8월", + "쾌청일수": 0 + }, + { + "지역별": "수원", + "월": "9월", + "쾌청일수": 4 + }, + { + "지역별": "수원", + "월": "10월", + "쾌청일수": 6 + }, + { + "지역별": "수원", + "월": "11월", + "쾌청일수": 4 + }, + { + "지역별": "수원", + "월": "12월", + "쾌청일수": "(6)" + }, + { + "지역별": "수원", + "월": "계", + "쾌청일수": 50 + }, + { + "지역별": "청주", + "월": "1월", + "쾌청일수": "(4)" + }, + { + "지역별": "청주", + "월": "2월", + "쾌청일수": "(4)" + }, + { + "지역별": "청주", + "월": "3월", + "쾌청일수": 6 + }, + { + "지역별": "청주", + "월": "4월", + "쾌청일수": 5 + }, + { + "지역별": "청주", + "월": "5월", + "쾌청일수": 5 + }, + { + "지역별": "청주", + "월": "6월", + "쾌청일수": 1 + }, + { + "지역별": "청주", + "월": "7월", + "쾌청일수": 0 + }, + { + "지역별": "청주", + "월": "8월", + "쾌청일수": 0 + }, + { + "지역별": "청주", + "월": "9월", + "쾌청일수": 2 + }, + { + "지역별": "청주", + "월": "10월", + "쾌청일수": 6 + }, + { + "지역별": "청주", + "월": "11월", + "쾌청일수": 4 + }, + { + "지역별": "청주", + "월": "12월", + "쾌청일수": "(3)" + }, + { + "지역별": "청주", + "월": "계", + "쾌청일수": 40 + }, + { + "지역별": "추풍령", + "월": "1월", + "쾌청일수": "(5)" + }, + { + "지역별": "추풍령", + "월": "2월", + "쾌청일수": "(3)" + }, + { + "지역별": "추풍령", + "월": "3월", + "쾌청일수": "(6)" + }, + { + "지역별": "추풍령", + "월": "4월", + "쾌청일수": 3 + }, + { + "지역별": "추풍령", + "월": "5월", + "쾌청일수": 5 + }, + { + "지역별": "추풍령", + "월": "6월", + "쾌청일수": 3 + }, + { + "지역별": "추풍령", + "월": "7월", + "쾌청일수": 0 + }, + { + "지역별": "추풍령", + "월": "8월", + "쾌청일수": 0 + }, + { + "지역별": "추풍령", + "월": "9월", + "쾌청일수": 1 + }, + { + "지역별": "추풍령", + "월": "10월", + "쾌청일수": 6 + }, + { + "지역별": "추풍령", + "월": "11월", + "쾌청일수": 6 + }, + { + "지역별": "추풍령", + "월": "12월", + "쾌청일수": "(4)" + }, + { + "지역별": "추풍령", + "월": "계", + "쾌청일수": 42 + }, + { + "지역별": "포항", + "월": "1월", + "쾌청일수": 11 + }, + { + "지역별": "포항", + "월": "2월", + "쾌청일수": 6 + }, + { + "지역별": "포항", + "월": "3월", + "쾌청일수": 7 + }, + { + "지역별": "포항", + "월": "4월", + "쾌청일수": 5 + }, + { + "지역별": "포항", + "월": "5월", + "쾌청일수": 5 + }, + { + "지역별": "포항", + "월": "6월", + "쾌청일수": 1 + }, + { + "지역별": "포항", + "월": "7월", + "쾌청일수": 1 + }, + { + "지역별": "포항", + "월": "8월", + "쾌청일수": 1 + }, + { + "지역별": "포항", + "월": "9월", + "쾌청일수": 1 + }, + { + "지역별": "포항", + "월": "10월", + "쾌청일수": 5 + }, + { + "지역별": "포항", + "월": "11월", + "쾌청일수": 7 + }, + { + "지역별": "포항", + "월": "12월", + "쾌청일수": 9 + }, + { + "지역별": "포항", + "월": "계", + "쾌청일수": 59 + }, + { + "지역별": "대구", + "월": "1월", + "쾌청일수": "(8)" + }, + { + "지역별": "대구", + "월": "2월", + "쾌청일수": 5 + }, + { + "지역별": "대구", + "월": "3월", + "쾌청일수": 7 + }, + { + "지역별": "대구", + "월": "4월", + "쾌청일수": 5 + }, + { + "지역별": "대구", + "월": "5월", + "쾌청일수": 5 + }, + { + "지역별": "대구", + "월": "6월", + "쾌청일수": 1 + }, + { + "지역별": "대구", + "월": "7월", + "쾌청일수": 0 + }, + { + "지역별": "대구", + "월": "8월", + "쾌청일수": 1 + }, + { + "지역별": "대구", + "월": "9월", + "쾌청일수": 1 + }, + { + "지역별": "대구", + "월": "10월", + "쾌청일수": 5 + }, + { + "지역별": "대구", + "월": "11월", + "쾌청일수": 6 + }, + { + "지역별": "대구", + "월": "12월", + "쾌청일수": 6 + }, + { + "지역별": "대구", + "월": "계", + "쾌청일수": 50 + }, + { + "지역별": "전주", + "월": "1월", + "쾌청일수": "(3)" + }, + { + "지역별": "전주", + "월": "2월", + "쾌청일수": 3 + }, + { + "지역별": "전주", + "월": "3월", + "쾌청일수": 6 + }, + { + "지역별": "전주", + "월": "4월", + "쾌청일수": 5 + }, + { + "지역별": "전주", + "월": "5월", + "쾌청일수": 5 + }, + { + "지역별": "전주", + "월": "6월", + "쾌청일수": 1 + }, + { + "지역별": "전주", + "월": "7월", + "쾌청일수": 0 + }, + { + "지역별": "전주", + "월": "8월", + "쾌청일수": 0 + }, + { + "지역별": "전주", + "월": "9월", + "쾌청일수": 2 + }, + { + "지역별": "전주", + "월": "10월", + "쾌청일수": 6 + }, + { + "지역별": "전주", + "월": "11월", + "쾌청일수": 3 + }, + { + "지역별": "전주", + "월": "12월", + "쾌청일수": "(3)" + }, + { + "지역별": "전주", + "월": "계", + "쾌청일수": 37 + }, + { + "지역별": "울산", + "월": "1월", + "쾌청일수": 10 + }, + { + "지역별": "울산", + "월": "2월", + "쾌청일수": 5 + }, + { + "지역별": "울산", + "월": "3월", + "쾌청일수": 7 + }, + { + "지역별": "울산", + "월": "4월", + "쾌청일수": 5 + }, + { + "지역별": "울산", + "월": "5월", + "쾌청일수": 5 + }, + { + "지역별": "울산", + "월": "6월", + "쾌청일수": 1 + }, + { + "지역별": "울산", + "월": "7월", + "쾌청일수": 1 + }, + { + "지역별": "울산", + "월": "8월", + "쾌청일수": 2 + }, + { + "지역별": "울산", + "월": "9월", + "쾌청일수": 1 + }, + { + "지역별": "울산", + "월": "10월", + "쾌청일수": 4 + }, + { + "지역별": "울산", + "월": "11월", + "쾌청일수": 6 + }, + { + "지역별": "울산", + "월": "12월", + "쾌청일수": 9 + }, + { + "지역별": "울산", + "월": "계", + "쾌청일수": 56 + }, + { + "지역별": "광주", + "월": "1월", + "쾌청일수": "(3)" + }, + { + "지역별": "광주", + "월": "2월", + "쾌청일수": 4 + }, + { + "지역별": "광주", + "월": "3월", + "쾌청일수": 5 + }, + { + "지역별": "광주", + "월": "4월", + "쾌청일수": 4 + }, + { + "지역별": "광주", + "월": "5월", + "쾌청일수": 4 + }, + { + "지역별": "광주", + "월": "6월", + "쾌청일수": 0 + }, + { + "지역별": "광주", + "월": "7월", + "쾌청일수": 0 + }, + { + "지역별": "광주", + "월": "8월", + "쾌청일수": 1 + }, + { + "지역별": "광주", + "월": "9월", + "쾌청일수": 2 + }, + { + "지역별": "광주", + "월": "10월", + "쾌청일수": 6 + }, + { + "지역별": "광주", + "월": "11월", + "쾌청일수": 3 + }, + { + "지역별": "광주", + "월": "12월", + "쾌청일수": "(2)" + }, + { + "지역별": "광주", + "월": "계", + "쾌청일수": 34 + }, + { + "지역별": "부산", + "월": "1월", + "쾌청일수": 12 + }, + { + "지역별": "부산", + "월": "2월", + "쾌청일수": 6 + }, + { + "지역별": "부산", + "월": "3월", + "쾌청일수": 7 + }, + { + "지역별": "부산", + "월": "4월", + "쾌청일수": 5 + }, + { + "지역별": "부산", + "월": "5월", + "쾌청일수": 5 + }, + { + "지역별": "부산", + "월": "6월", + "쾌청일수": 1 + }, + { + "지역별": "부산", + "월": "7월", + "쾌청일수": 0 + }, + { + "지역별": "부산", + "월": "8월", + "쾌청일수": 3 + }, + { + "지역별": "부산", + "월": "9월", + "쾌청일수": 2 + }, + { + "지역별": "부산", + "월": "10월", + "쾌청일수": 5 + }, + { + "지역별": "부산", + "월": "11월", + "쾌청일수": 7 + }, + { + "지역별": "부산", + "월": "12월", + "쾌청일수": 9 + }, + { + "지역별": "부산", + "월": "계", + "쾌청일수": 62 + }, + { + "지역별": "목포", + "월": "1월", + "쾌청일수": "(2)" + }, + { + "지역별": "목포", + "월": "2월", + "쾌청일수": "(2)" + }, + { + "지역별": "목포", + "월": "3월", + "쾌청일수": 5 + }, + { + "지역별": "목포", + "월": "4월", + "쾌청일수": 4 + }, + { + "지역별": "목포", + "월": "5월", + "쾌청일수": 4 + }, + { + "지역별": "목포", + "월": "6월", + "쾌청일수": 0 + }, + { + "지역별": "목포", + "월": "7월", + "쾌청일수": 0 + }, + { + "지역별": "목포", + "월": "8월", + "쾌청일수": 1 + }, + { + "지역별": "목포", + "월": "9월", + "쾌청일수": 3 + }, + { + "지역별": "목포", + "월": "10월", + "쾌청일수": 5 + }, + { + "지역별": "목포", + "월": "11월", + "쾌청일수": 2 + }, + { + "지역별": "목포", + "월": "12월", + "쾌청일수": "(2)" + }, + { + "지역별": "목포", + "월": "계", + "쾌청일수": 30 + }, + { + "지역별": "여수", + "월": "1월", + "쾌청일수": 6 + }, + { + "지역별": "여수", + "월": "2월", + "쾌청일수": 5 + }, + { + "지역별": "여수", + "월": "3월", + "쾌청일수": 7 + }, + { + "지역별": "여수", + "월": "4월", + "쾌청일수": 5 + }, + { + "지역별": "여수", + "월": "5월", + "쾌청일수": 4 + }, + { + "지역별": "여수", + "월": "6월", + "쾌청일수": 0 + }, + { + "지역별": "여수", + "월": "7월", + "쾌청일수": 0 + }, + { + "지역별": "여수", + "월": "8월", + "쾌청일수": 4 + }, + { + "지역별": "여수", + "월": "9월", + "쾌청일수": 2 + }, + { + "지역별": "여수", + "월": "10월", + "쾌청일수": 5 + }, + { + "지역별": "여수", + "월": "11월", + "쾌청일수": 6 + }, + { + "지역별": "여수", + "월": "12월", + "쾌청일수": 6 + }, + { + "지역별": "여수", + "월": "계", + "쾌청일수": 50 + }, + { + "지역별": "제주", + "월": "1월", + "쾌청일수": 0 + }, + { + "지역별": "제주", + "월": "2월", + "쾌청일수": 0 + }, + { + "지역별": "제주", + "월": "3월", + "쾌청일수": 3 + }, + { + "지역별": "제주", + "월": "4월", + "쾌청일수": 4 + }, + { + "지역별": "제주", + "월": "5월", + "쾌청일수": 4 + }, + { + "지역별": "제주", + "월": "6월", + "쾌청일수": 0 + }, + { + "지역별": "제주", + "월": "7월", + "쾌청일수": 0 + }, + { + "지역별": "제주", + "월": "8월", + "쾌청일수": 1 + }, + { + "지역별": "제주", + "월": "9월", + "쾌청일수": 0 + }, + { + "지역별": "제주", + "월": "10월", + "쾌청일수": 2 + }, + { + "지역별": "제주", + "월": "11월", + "쾌청일수": 1 + }, + { + "지역별": "제주", + "월": "12월", + "쾌청일수": 0 + }, + { + "지역별": "제주", + "월": "계", + "쾌청일수": 15 + }, + { + "지역별": "서귀포", + "월": "1월", + "쾌청일수": "(1)" + }, + { + "지역별": "서귀포", + "월": "2월", + "쾌청일수": 0 + }, + { + "지역별": "서귀포", + "월": "3월", + "쾌청일수": 3 + }, + { + "지역별": "서귀포", + "월": "4월", + "쾌청일수": 5 + }, + { + "지역별": "서귀포", + "월": "5월", + "쾌청일수": 3 + }, + { + "지역별": "서귀포", + "월": "6월", + "쾌청일수": 0 + }, + { + "지역별": "서귀포", + "월": "7월", + "쾌청일수": 0 + }, + { + "지역별": "서귀포", + "월": "8월", + "쾌청일수": 0 + }, + { + "지역별": "서귀포", + "월": "9월", + "쾌청일수": 2 + }, + { + "지역별": "서귀포", + "월": "10월", + "쾌청일수": 4 + }, + { + "지역별": "서귀포", + "월": "11월", + "쾌청일수": 1 + }, + { + "지역별": "서귀포", + "월": "12월", + "쾌청일수": 0 + }, + { + "지역별": "서귀포", + "월": "계", + "쾌청일수": 19 + }, + { + "지역별": "속초", + "월": "1월", + "쾌청일수": "(11)" + }, + { + "지역별": "속초", + "월": "2월", + "쾌청일수": "(6)" + }, + { + "지역별": "속초", + "월": "3월", + "쾌청일수": "(6)" + }, + { + "지역별": "속초", + "월": "4월", + "쾌청일수": 4 + }, + { + "지역별": "속초", + "월": "5월", + "쾌청일수": 4 + }, + { + "지역별": "속초", + "월": "6월", + "쾌청일수": 2 + }, + { + "지역별": "속초", + "월": "7월", + "쾌청일수": 0 + }, + { + "지역별": "속초", + "월": "8월", + "쾌청일수": 0 + }, + { + "지역별": "속초", + "월": "9월", + "쾌청일수": 2 + }, + { + "지역별": "속초", + "월": "10월", + "쾌청일수": 6 + }, + { + "지역별": "속초", + "월": "11월", + "쾌청일수": 6 + }, + { + "지역별": "속초", + "월": "12월", + "쾌청일수": "(10)" + }, + { + "지역별": "속초", + "월": "계", + "쾌청일수": 57 + }, + { + "지역별": "철원", + "월": "1월", + "쾌청일수": "(10)" + }, + { + "지역별": "철원", + "월": "2월", + "쾌청일수": "(4)" + }, + { + "지역별": "철원", + "월": "3월", + "쾌청일수": 6 + }, + { + "지역별": "철원", + "월": "4월", + "쾌청일수": 4 + }, + { + "지역별": "철원", + "월": "5월", + "쾌청일수": 4 + }, + { + "지역별": "철원", + "월": "6월", + "쾌청일수": 2 + }, + { + "지역별": "철원", + "월": "7월", + "쾌청일수": 0 + }, + { + "지역별": "철원", + "월": "8월", + "쾌청일수": 0 + }, + { + "지역별": "철원", + "월": "9월", + "쾌청일수": 4 + }, + { + "지역별": "철원", + "월": "10월", + "쾌청일수": 6 + }, + { + "지역별": "철원", + "월": "11월", + "쾌청일수": 5 + }, + { + "지역별": "철원", + "월": "12월", + "쾌청일수": "(8)" + }, + { + "지역별": "철원", + "월": "계", + "쾌청일수": 53 + }, + { + "지역별": "원주", + "월": "1월", + "쾌청일수": "(9)" + }, + { + "지역별": "원주", + "월": "2월", + "쾌청일수": "(4)" + }, + { + "지역별": "원주", + "월": "3월", + "쾌청일수": 5 + }, + { + "지역별": "원주", + "월": "4월", + "쾌청일수": 4 + }, + { + "지역별": "원주", + "월": "5월", + "쾌청일수": 5 + }, + { + "지역별": "원주", + "월": "6월", + "쾌청일수": 1 + }, + { + "지역별": "원주", + "월": "7월", + "쾌청일수": 0 + }, + { + "지역별": "원주", + "월": "8월", + "쾌청일수": 0 + }, + { + "지역별": "원주", + "월": "9월", + "쾌청일수": 3 + }, + { + "지역별": "원주", + "월": "10월", + "쾌청일수": 6 + }, + { + "지역별": "원주", + "월": "11월", + "쾌청일수": 4 + }, + { + "지역별": "원주", + "월": "12월", + "쾌청일수": "(7)" + }, + { + "지역별": "원주", + "월": "계", + "쾌청일수": 48 + }, + { + "지역별": "서산", + "월": "1월", + "쾌청일수": "(3)" + }, + { + "지역별": "서산", + "월": "2월", + "쾌청일수": "(3)" + }, + { + "지역별": "서산", + "월": "3월", + "쾌청일수": "(5)" + }, + { + "지역별": "서산", + "월": "4월", + "쾌청일수": 5 + }, + { + "지역별": "서산", + "월": "5월", + "쾌청일수": 4 + }, + { + "지역별": "서산", + "월": "6월", + "쾌청일수": 2 + }, + { + "지역별": "서산", + "월": "7월", + "쾌청일수": 0 + }, + { + "지역별": "서산", + "월": "8월", + "쾌청일수": 0 + }, + { + "지역별": "서산", + "월": "9월", + "쾌청일수": 4 + }, + { + "지역별": "서산", + "월": "10월", + "쾌청일수": 6 + }, + { + "지역별": "서산", + "월": "11월", + "쾌청일수": 2 + }, + { + "지역별": "서산", + "월": "12월", + "쾌청일수": "(3)" + }, + { + "지역별": "서산", + "월": "계", + "쾌청일수": 37 + }, + { + "지역별": "울진", + "월": "1월", + "쾌청일수": "(10)" + }, + { + "지역별": "울진", + "월": "2월", + "쾌청일수": "(5)" + }, + { + "지역별": "울진", + "월": "3월", + "쾌청일수": 6 + }, + { + "지역별": "울진", + "월": "4월", + "쾌청일수": 5 + }, + { + "지역별": "울진", + "월": "5월", + "쾌청일수": 4 + }, + { + "지역별": "울진", + "월": "6월", + "쾌청일수": 1 + }, + { + "지역별": "울진", + "월": "7월", + "쾌청일수": 0 + }, + { + "지역별": "울진", + "월": "8월", + "쾌청일수": 1 + }, + { + "지역별": "울진", + "월": "9월", + "쾌청일수": 2 + }, + { + "지역별": "울진", + "월": "10월", + "쾌청일수": 5 + }, + { + "지역별": "울진", + "월": "11월", + "쾌청일수": 7 + }, + { + "지역별": "울진", + "월": "12월", + "쾌청일수": 9 + }, + { + "지역별": "울진", + "월": "계", + "쾌청일수": 55 + }, + { + "지역별": "대전", + "월": "1월", + "쾌청일수": "(4)" + }, + { + "지역별": "대전", + "월": "2월", + "쾌청일수": "(4)" + }, + { + "지역별": "대전", + "월": "3월", + "쾌청일수": 6 + }, + { + "지역별": "대전", + "월": "4월", + "쾌청일수": 5 + }, + { + "지역별": "대전", + "월": "5월", + "쾌청일수": 5 + }, + { + "지역별": "대전", + "월": "6월", + "쾌청일수": 1 + }, + { + "지역별": "대전", + "월": "7월", + "쾌청일수": 0 + }, + { + "지역별": "대전", + "월": "8월", + "쾌청일수": 0 + }, + { + "지역별": "대전", + "월": "9월", + "쾌청일수": 3 + }, + { + "지역별": "대전", + "월": "10월", + "쾌청일수": 6 + }, + { + "지역별": "대전", + "월": "11월", + "쾌청일수": 3 + }, + { + "지역별": "대전", + "월": "12월", + "쾌청일수": "(3)" + }, + { + "지역별": "대전", + "월": "계", + "쾌청일수": 40 + }, + { + "지역별": "안동", + "월": "1월", + "쾌청일수": "(9)" + }, + { + "지역별": "안동", + "월": "2월", + "쾌청일수": "(6)" + }, + { + "지역별": "안동", + "월": "3월", + "쾌청일수": 7 + }, + { + "지역별": "안동", + "월": "4월", + "쾌청일수": 5 + }, + { + "지역별": "안동", + "월": "5월", + "쾌청일수": 5 + }, + { + "지역별": "안동", + "월": "6월", + "쾌청일수": 1 + }, + { + "지역별": "안동", + "월": "7월", + "쾌청일수": 0 + }, + { + "지역별": "안동", + "월": "8월", + "쾌청일수": 1 + }, + { + "지역별": "안동", + "월": "9월", + "쾌청일수": 1 + }, + { + "지역별": "안동", + "월": "10월", + "쾌청일수": 3 + }, + { + "지역별": "안동", + "월": "11월", + "쾌청일수": 5 + }, + { + "지역별": "안동", + "월": "12월", + "쾌청일수": "(7)" + }, + { + "지역별": "안동", + "월": "계", + "쾌청일수": 50 + }, + { + "지역별": "군산", + "월": "1월", + "쾌청일수": "(5)" + }, + { + "지역별": "군산", + "월": "2월", + "쾌청일수": 2 + }, + { + "지역별": "군산", + "월": "3월", + "쾌청일수": 5 + }, + { + "지역별": "군산", + "월": "4월", + "쾌청일수": 4 + }, + { + "지역별": "군산", + "월": "5월", + "쾌청일수": 6 + }, + { + "지역별": "군산", + "월": "6월", + "쾌청일수": 1 + }, + { + "지역별": "군산", + "월": "7월", + "쾌청일수": 2 + }, + { + "지역별": "군산", + "월": "8월", + "쾌청일수": 0 + }, + { + "지역별": "군산", + "월": "9월", + "쾌청일수": 4 + }, + { + "지역별": "군산", + "월": "10월", + "쾌청일수": 6 + }, + { + "지역별": "군산", + "월": "11월", + "쾌청일수": 2 + }, + { + "지역별": "군산", + "월": "12월", + "쾌청일수": "(2)" + }, + { + "지역별": "군산", + "월": "계", + "쾌청일수": 39 + }, + { + "지역별": "통영", + "월": "1월", + "쾌청일수": 12 + }, + { + "지역별": "통영", + "월": "2월", + "쾌청일수": 5 + }, + { + "지역별": "통영", + "월": "3월", + "쾌청일수": 7 + }, + { + "지역별": "통영", + "월": "4월", + "쾌청일수": 6 + }, + { + "지역별": "통영", + "월": "5월", + "쾌청일수": 3 + }, + { + "지역별": "통영", + "월": "6월", + "쾌청일수": 0 + }, + { + "지역별": "통영", + "월": "7월", + "쾌청일수": 0 + }, + { + "지역별": "통영", + "월": "8월", + "쾌청일수": 1 + }, + { + "지역별": "통영", + "월": "9월", + "쾌청일수": 3 + }, + { + "지역별": "통영", + "월": "10월", + "쾌청일수": 6 + }, + { + "지역별": "통영", + "월": "11월", + "쾌청일수": 7 + }, + { + "지역별": "통영", + "월": "12월", + "쾌청일수": 9 + }, + { + "지역별": "통영", + "월": "계", + "쾌청일수": 59 + }, + { + "지역별": "완도", + "월": "1월", + "쾌청일수": "(4)" + }, + { + "지역별": "완도", + "월": "2월", + "쾌청일수": 3 + }, + { + "지역별": "완도", + "월": "3월", + "쾌청일수": 5 + }, + { + "지역별": "완도", + "월": "4월", + "쾌청일수": 5 + }, + { + "지역별": "완도", + "월": "5월", + "쾌청일수": 5 + }, + { + "지역별": "완도", + "월": "6월", + "쾌청일수": 1 + }, + { + "지역별": "완도", + "월": "7월", + "쾌청일수": 2 + }, + { + "지역별": "완도", + "월": "8월", + "쾌청일수": 1 + }, + { + "지역별": "완도", + "월": "9월", + "쾌청일수": 3 + }, + { + "지역별": "완도", + "월": "10월", + "쾌청일수": 6 + }, + { + "지역별": "완도", + "월": "11월", + "쾌청일수": 3 + }, + { + "지역별": "완도", + "월": "12월", + "쾌청일수": "(3)" + }, + { + "지역별": "완도", + "월": "계", + "쾌청일수": 41 + }, + { + "지역별": "진주", + "월": "1월", + "쾌청일수": 8 + }, + { + "지역별": "진주", + "월": "2월", + "쾌청일수": 4 + }, + { + "지역별": "진주", + "월": "3월", + "쾌청일수": 5 + }, + { + "지역별": "진주", + "월": "4월", + "쾌청일수": 3 + }, + { + "지역별": "진주", + "월": "5월", + "쾌청일수": 3 + }, + { + "지역별": "진주", + "월": "6월", + "쾌청일수": 0 + }, + { + "지역별": "진주", + "월": "7월", + "쾌청일수": 0 + }, + { + "지역별": "진주", + "월": "8월", + "쾌청일수": 1 + }, + { + "지역별": "진주", + "월": "9월", + "쾌청일수": 1 + }, + { + "지역별": "진주", + "월": "10월", + "쾌청일수": 4 + }, + { + "지역별": "진주", + "월": "11월", + "쾌청일수": 4 + }, + { + "지역별": "진주", + "월": "12월", + "쾌청일수": 5 + }, + { + "지역별": "진주", + "월": "계", + "쾌청일수": 38 + } + ], + "주": [ + "( )는 월간 3일 이상 적설이 있는 달의 쾌청일수를 말한다.", + "이 표의 숫자는 쾌청일수를 말하며 단지 구름의 양이 1.0(구름양 10%)이하를 기준한 기상 통계이므로 사진촬영에 크게 영향을 끼치는 겨울철의 적설, 도심지역의 연무 현상 및 산악지대의 태양각 등의 특수 지상조건을 고려하여 증감할 수 있다.", + "사진축척에 따른 실제 비행고도 및 비행기의 종류를 고려하여 증감할 수 있다.", + "이 표의 쾌청일수는 1일 8회의 관측치를 평균한 2008년∼2018년의 기상청 통계이며, 운항체류일수의 계산에 활용한다.", + "이 표에 명시되지 않은 지역은 가장 가까운 지역의 자료를 활용할 수 있다.", + "여러 개월에 걸쳐 항공촬영을 행하는 경우 해당 개월의 쾌청일수 산술평균을 적용한다." + ] + }, + { + "열쇠": "9-5-1 운항속도", + "이름": "항공사진촬영 운항속도", + "기준": "", + "출처": "건설품셈 토목 9-5-1", + "조건": { + "GSD구분": "고르기" + }, + "값칸": { + "기지이동운항속도": "㎞/hr", + "운항속도": "㎞/hr", + "비고": "" + }, + "줄": [ + { + "GSD구분": "GSD ≤ 65cm", + "기지이동운항속도": 240, + "운항속도": 200, + "비고": "FMC사용" + }, + { + "GSD구분": "GSD > 65cm", + "기지이동운항속도": 240, + "운항속도": 220, + "비고": "FMC사용" + } + ], + "주": [ + "본 제원은 항공사진촬영이 가능한 경비행기를 기준한 것이다." + ] + }, + { + "열쇠": "9-5-1 예비운항시간", + "이름": "항공사진촬영 예비운항시간", + "기준": "", + "출처": "건설품셈 토목 9-5-1", + "조건": { + "항목": "고르기" + }, + "값칸": { + "시간(분)": "분" + }, + "줄": [ + { + "항목": "시운전", + "시간(분)": 25 + }, + { + "항목": "편류측정", + "시간(분)": 15 + }, + { + "항목": "코스진입", + "시간(분)": 5 + }, + { + "항목": "이착륙", + "시간(분)": 20 + } + ], + "주": [ + "편류측정 횟수는 총 코스 연장 100km마다 1회로 하며, 노선측량의 촬영에서는 별도 가산할 수 있다.", + "본 제원은 항공사진촬영이 가능한 경비행기를 기준한 것이다.", + "항공기의 종류, 최대운항속도 및 기상조건에 따라 조정 적용할 수 있다.", + "코스진입은 매 코스당 1회, 시운전 및 이착륙은 운항 1일당 1회로 한다." + ] + }, + { + "열쇠": "9-5-1 촬영기준 계산식 상수 — 그룹 계수", + "이름": "항공사진촬영기준 계산식의 비율·기준 상수", + "기준": "", + "출처": "건설품셈 토목 9-5-1", + "조건": { + "항목": "고르기" + }, + "값칸": { + "값": "" + }, + "줄": [ + { + "항목": "천후장애시간(왕복운항시간 대비)", + "값": "200%" + }, + { + "항목": "보완촬영시간(촬영운항시간 대비)", + "값": "50%" + }, + { + "항목": "순촬영소요일수 산정 기준시간", + "값": "5시간" + } + ], + "주": [] + }, + { + "열쇠": "9-5-1 항공사진촬영(작업일수·인원)", + "이름": "항공사진촬영 작업구분별 작업일수 및 인원", + "기준": "촬영거리 200km", + "출처": "건설품셈 토목 9-5-1", + "조건": { + "작업구분": "고르기", + "GSD구간": "고르기", + "직종": "고르기" + }, + "값칸": { + "작업일수": "일", + "인원": "" + }, + "줄": [ + { + "작업구분": "계획준비", + "GSD구간": "GSD≤25cm", + "작업일수": 1 + }, + { + "작업구분": "계획준비", + "GSD구간": "25cm Date: Sat, 19 Sep 2026 18:27:45 +0900 Subject: [PATCH 11/14] =?UTF-8?q?fix(master=5Fdata):=20=EA=B3=B5=ED=86=B56?= =?UTF-8?q?=EC=9E=A5=206-3-1=20=ED=95=A9=ED=8C=90=20%=20=ED=95=9C=20?= =?UTF-8?q?=EC=B9=B8=20=EB=B0=80=EB=A6=BC=20=C2=B7=20=EC=82=B0=EB=A6=BC=20?= =?UTF-8?q?=EA=B8=B0=EA=B3=84=20=EB=B0=B0=ED=84=B0=EB=A6=AC=20=EA=B7=9C?= =?UTF-8?q?=EA=B2=A9=20=EA=B8=80=EC=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_016WRFJmmhPi4exAzHgPZHMT --- resources/master_data/기계_산림품셈.json | 2 +- resources/master_data/소요량_건설품셈_공통6장.json | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/resources/master_data/기계_산림품셈.json b/resources/master_data/기계_산림품셈.json index 19808200..df96ebe6 100644 --- a/resources/master_data/기계_산림품셈.json +++ b/resources/master_data/기계_산림품셈.json @@ -184,7 +184,7 @@ "단위": { "손료계수": "1일 1대당 4시간 가동", "취득가액": "원" }, "값": { "손료계수": 0.0040, "취득가액": 9894500 }, "출처": { "손료계수": "산림품셈 2-2-8", "취득가액": "산림품셈 2-2-8" } }, - { "열쇠": "2-2-8 리튬폴리머 배터리(평균가)", "이름": "리튬폴리머 배터리(평균가)", "규격": "16,000mA, 32,000mA", + { "열쇠": "2-2-8 리튬폴리머 배터리(평균가)", "이름": "리튬폴리머 배터리(평균가)", "규격": "16,000mA, 32000mA", "단위": { "손료계수": "1일 1대당 4시간 가동", "취득가액": "원" }, "값": { "손료계수": 0.0028, "취득가액": 7104000 }, "출처": { "손료계수": "산림품셈 2-2-8", "취득가액": "산림품셈 2-2-8" }, diff --git a/resources/master_data/소요량_건설품셈_공통6장.json b/resources/master_data/소요량_건설품셈_공통6장.json index b4b7ed89..185abf8c 100644 --- a/resources/master_data/소요량_건설품셈_공통6장.json +++ b/resources/master_data/소요량_건설품셈_공통6장.json @@ -501,16 +501,16 @@ "조건": { "사용횟수": "고르기" }, "값칸": { "합판": "%", "소모자재": "%" }, "줄": [ - { "사용횟수": "1회", "합판": 55.0, "소모자재": 4.0 }, - { "사용횟수": "2회", "합판": 44.3, "소모자재": 7.0 }, - { "사용횟수": "3회", "합판": 38.0, "소모자재": 8.0 }, - { "사용횟수": "4회", "합판": 35.0, "소모자재": 9.0 }, - { "사용횟수": "5회", "합판": 32.7, "소모자재": 10.0 }, - { "사용횟수": "6회", "소모자재": 11.0 } + { "사용횟수": "1회", "소모자재": 4.0 }, + { "사용횟수": "2회", "합판": 55.0, "소모자재": 7.0 }, + { "사용횟수": "3회", "합판": 44.3, "소모자재": 8.0 }, + { "사용횟수": "4회", "합판": 38.0, "소모자재": 9.0 }, + { "사용횟수": "5회", "합판": 35.0, "소모자재": 10.0 }, + { "사용횟수": "6회", "합판": 32.7, "소모자재": 11.0 } ], "주": [ "소모자재(박리재 등)는 주자재비의 %", - "합판 6회 값은 원문 「-」(빈칸)" + "합판 1회는 수량 칸(1.03㎡)이라 %가 없음" ] }, { From c1627f89f609a1612278926080b0944bf02dc4a7 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sat, 19 Sep 2026 18:35:28 +0900 Subject: [PATCH 12/14] =?UTF-8?q?knowledge(=EA=B1=B4=EC=84=A4=ED=92=88?= =?UTF-8?q?=EC=85=88=ED=86=A0=EB=AA=A99=EC=9E=A5):=20=EC=A7=80=EC=A0=81?= =?UTF-8?q?=EC=B8=A1=EB=9F=89=209-6~9-18=20=EC=86=8C=EC=9A=94=EB=9F=89=20?= =?UTF-8?q?=EC=9A=94=EC=86=8C=ED=99=94=20=E2=80=94=209=EC=9E=A5=20?= =?UTF-8?q?=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 건설품셈 토목 제9장 측량 9-6 지적기준점측량~9-18 자료정비(신규 99표)의 표·계수·글 속 계산 상수를 소요량_건설품셈_토목9장.json 에 이어 담음(누계 387표). check_master.py 틀·본문 0건 확인. 이로써 제9장 측량(9-1~9-18) 전 절 옮김 완료. --- .../master_data/소요량_건설품셈_토목9장.json | 8809 +++++++++++++++++ 1 file changed, 8809 insertions(+) diff --git a/resources/master_data/소요량_건설품셈_토목9장.json b/resources/master_data/소요량_건설품셈_토목9장.json index d8b82c0d..87c79ac1 100644 --- a/resources/master_data/소요량_건설품셈_토목9장.json +++ b/resources/master_data/소요량_건설품셈_토목9장.json @@ -28580,6 +28580,8815 @@ } ], "주": [] + }, + { + "열쇠": "9-6-1 지적삼각측량", + "이름": "지적삼각측량", + "기준": "구하는점 5점, 주어진점 3점", + "출처": "건설품셈 토목 9-6-1", + "조건": { + "작업별": "고르기", + "세부": "고르기", + "구간": "고르기", + "직종": "고르기" + }, + "값칸": { + "값": "" + }, + "줄": [ + { + "작업별": "자료조사", + "구간": "일수", + "직종": "", + "값": "(1.48)" + }, + { + "작업별": "자료조사", + "구간": "1일당", + "직종": "지적기사", + "값": 1 + }, + { + "작업별": "자료조사", + "구간": "1일당", + "직종": "지적산업기사", + "값": 2 + }, + { + "작업별": "자료조사", + "구간": "합계", + "직종": "지적기사", + "값": "(1.48)" + }, + { + "작업별": "자료조사", + "구간": "합계", + "직종": "지적산업기사", + "값": "(2.96)" + }, + { + "작업별": "계획준비", + "구간": "일수", + "직종": "", + "값": "(1.13)" + }, + { + "작업별": "계획준비", + "구간": "1일당", + "직종": "지적기사", + "값": 1 + }, + { + "작업별": "계획준비", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "계획준비", + "구간": "합계", + "직종": "지적기사", + "값": "(1.13)" + }, + { + "작업별": "계획준비", + "구간": "합계", + "직종": "지적산업기사", + "값": "(1.13)" + }, + { + "작업별": "답사", + "구간": "일수", + "직종": "", + "값": 2.78 + }, + { + "작업별": "답사", + "구간": "1일당", + "직종": "지적산업기사", + "값": 2 + }, + { + "작업별": "답사", + "구간": "1일당", + "직종": "지적기능사", + "값": 1 + }, + { + "작업별": "답사", + "구간": "합계", + "직종": "지적산업기사", + "값": 5.56 + }, + { + "작업별": "답사", + "구간": "합계", + "직종": "지적기능사", + "값": 2.78 + }, + { + "작업별": "선점", + "구간": "일수", + "직종": "", + "값": 1.57 + }, + { + "작업별": "선점", + "구간": "1일당", + "직종": "지적기사", + "값": 1 + }, + { + "작업별": "선점", + "구간": "1일당", + "직종": "지적산업기사", + "값": 2 + }, + { + "작업별": "선점", + "구간": "합계", + "직종": "지적기사", + "값": 1.57 + }, + { + "작업별": "선점", + "구간": "합계", + "직종": "지적산업기사", + "값": 3.14 + }, + { + "작업별": "조표", + "구간": "일수", + "직종": "", + "값": 3.65 + }, + { + "작업별": "조표", + "구간": "1일당", + "직종": "지적산업기사", + "값": 2 + }, + { + "작업별": "조표", + "구간": "1일당", + "직종": "지적기능사", + "값": 1 + }, + { + "작업별": "조표", + "구간": "1일당", + "직종": "인부", + "값": 1 + }, + { + "작업별": "조표", + "구간": "합계", + "직종": "지적산업기사", + "값": 7.3 + }, + { + "작업별": "조표", + "구간": "합계", + "직종": "지적기능사", + "값": 3.65 + }, + { + "작업별": "조표", + "구간": "합계", + "직종": "인부", + "값": 3.65 + }, + { + "작업별": "관측", + "구간": "일수", + "직종": "", + "값": 3.74 + }, + { + "작업별": "관측", + "구간": "1일당", + "직종": "지적산업기사", + "값": 2 + }, + { + "작업별": "관측", + "구간": "1일당", + "직종": "지적기능사", + "값": 1 + }, + { + "작업별": "관측", + "구간": "합계", + "직종": "지적산업기사", + "값": 7.48 + }, + { + "작업별": "관측", + "구간": "합계", + "직종": "지적기능사", + "값": 3.74 + }, + { + "작업별": "계산", + "구간": "일수", + "직종": "", + "값": "(1.65)" + }, + { + "작업별": "계산", + "구간": "1일당", + "직종": "지적산업기사", + "값": 2 + }, + { + "작업별": "계산", + "구간": "합계", + "직종": "지적산업기사", + "값": "(3.30)" + }, + { + "작업별": "등사", + "구간": "일수", + "직종": "", + "값": "(1.48)" + }, + { + "작업별": "등사", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "등사", + "구간": "합계", + "직종": "지적산업기사", + "값": "(1.48)" + }, + { + "작업별": "준비도", + "세부": "작성", + "구간": "일수", + "직종": "", + "값": "(1.74)" + }, + { + "작업별": "준비도", + "세부": "작성", + "구간": "1일당", + "직종": "지적기능사", + "값": 1 + }, + { + "작업별": "준비도", + "세부": "작성", + "구간": "합계", + "직종": "지적기능사", + "값": "(1.74)" + }, + { + "작업별": "준비도", + "세부": "확인", + "구간": "일수", + "직종": "", + "값": "(0.26)" + }, + { + "작업별": "준비도", + "세부": "확인", + "구간": "1일당", + "직종": "지적기사", + "값": 1 + }, + { + "작업별": "준비도", + "세부": "확인", + "구간": "합계", + "직종": "지적기사", + "값": "(0.26)" + }, + { + "작업별": "기지부합여부확인", + "구간": "일수", + "직종": "", + "값": 3.22 + }, + { + "작업별": "기지부합여부확인", + "구간": "1일당", + "직종": "지적산업기사", + "값": 2 + }, + { + "작업별": "기지부합여부확인", + "구간": "1일당", + "직종": "지적기능사", + "값": 1 + }, + { + "작업별": "기지부합여부확인", + "구간": "합계", + "직종": "지적산업기사", + "값": 6.44 + }, + { + "작업별": "기지부합여부확인", + "구간": "합계", + "직종": "지적기능사", + "값": 3.22 + }, + { + "작업별": "성과작성", + "세부": "계산부", + "구간": "일수", + "직종": "", + "값": "(1.48)" + }, + { + "작업별": "성과작성", + "세부": "계산부", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "성과작성", + "세부": "계산부", + "구간": "합계", + "직종": "지적산업기사", + "값": "(1.48)" + }, + { + "작업별": "성과작성", + "세부": "대장", + "구간": "일수", + "직종": "", + "값": "(0.70)" + }, + { + "작업별": "성과작성", + "세부": "대장", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "성과작성", + "세부": "대장", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.70)" + }, + { + "작업별": "점검", + "구간": "일수", + "직종": "", + "값": "(0.78)" + }, + { + "작업별": "점검", + "구간": "1일당", + "직종": "지적기사", + "값": 1 + }, + { + "작업별": "점검", + "구간": "합계", + "직종": "지적기사", + "값": "(0.78)" + }, + { + "작업별": "성과인계", + "구간": "일수", + "직종": "", + "값": "(0.44)" + }, + { + "작업별": "성과인계", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "성과인계", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.44)" + }, + { + "작업별": "소계", + "세부": "외업", + "구간": "일수", + "직종": "", + "값": 14.96 + }, + { + "작업별": "소계", + "세부": "외업", + "구간": "합계", + "직종": "지적기사", + "값": 1.57 + }, + { + "작업별": "소계", + "세부": "외업", + "구간": "합계", + "직종": "지적산업기사", + "값": 29.92 + }, + { + "작업별": "소계", + "세부": "외업", + "구간": "합계", + "직종": "지적기능사", + "값": 13.39 + }, + { + "작업별": "소계", + "세부": "외업", + "구간": "합계", + "직종": "인부", + "값": 3.65 + }, + { + "작업별": "소계", + "세부": "내업", + "구간": "일수", + "직종": "", + "값": "(11.14)" + }, + { + "작업별": "소계", + "세부": "내업", + "구간": "합계", + "직종": "지적기사", + "값": "(3.65)" + }, + { + "작업별": "소계", + "세부": "내업", + "구간": "합계", + "직종": "지적산업기사", + "값": "(11.49)" + }, + { + "작업별": "소계", + "세부": "내업", + "구간": "합계", + "직종": "지적기능사", + "값": "(1.74)" + }, + { + "작업별": "합계", + "구간": "일수", + "직종": "", + "값": 26.1 + }, + { + "작업별": "합계", + "구간": "합계", + "직종": "지적기사", + "값": 5.22 + }, + { + "작업별": "합계", + "구간": "합계", + "직종": "지적산업기사", + "값": 41.41 + }, + { + "작업별": "합계", + "구간": "합계", + "직종": "지적기능사", + "값": 15.13 + }, + { + "작업별": "합계", + "구간": "합계", + "직종": "인부", + "값": 3.65 + } + ], + "주": [ + "( )는 내업임.", + "본 품은 「공간정보의 구축 및 관리 등에 관한 법률」 시행령 제8조 제1항 제3호의 규정에 의하여 「지적측량시행규칙」 제8조의 규정에 따라 지적삼각점측량을 경위의 측량방법에 의하여 실시할 경우의 품이다.", + "본 품은 작업지역의 표고 500m미만인 경우를 기준으로 한 것이며, 500m 이상일 때에는 표고계수 값 이내를 가산할 수 있다.", + "본 품에는 관측부 1부, 지적삼각측량 계산부 1부, 지적삼각망도 1부, 점의조서 1부의 성과품이 포함되어 있다.", + "본 품은 축척과 측량지역의 대·소에 불구하고 여점 3점, 구점 5점을 기준으로 한 것이다.", + "지적삼각보조점 측량수수료는 본 품에 의한 측량비의 50%의 값을 적용한다. 다만, 지적법령에 의거 영구표지를 설치하고 지적삼각측량방법에 준하였을 경우에는 지적삼각측량품을 적용한다.", + "벌채보상비, 재료의 소모품비 등은 실정에 따라 별도 계상한다.", + "관측기계는 GPS, 토탈스테이션, 광파거리측거기, 각 관측 장비로 한다.", + "본 품에 사용되는 기계경비 및 재료소모품비는 별도 계상한다.", + "매설작업에 따르는 자재대 및 운반비 인부임은 별도로 계상한다.", + "본 품의 외업에 필요한 여비는 공무원여비규정에 의한 국내여행자의 일비를 별도 계상한다.", + "[결정단가] = (∑W+직접경비+간접측량비)/8. [합계] = [단가]×13." + ] + }, + { + "열쇠": "9-6-1 표고계수 가산범위", + "이름": "지적삼각측량 표고계수 가산범위", + "기준": "", + "출처": "건설품셈 토목 9-6-1 주②", + "조건": { + "표고명": "고르기" + }, + "값칸": { + "가산범위(%)": "%" + }, + "줄": [ + { + "표고명": "500m∼1,000m", + "가산범위(%)": 20 + }, + { + "표고명": "1,000m초과", + "가산범위(%)": 40 + } + ], + "주": [] + }, + { + "열쇠": "9-6-1 계산예", + "이름": "지적삼각측량 계산예(구하는점 10점, 주어진점 3점)", + "기준": "", + "출처": "건설품셈 토목 9-6-1 계산예", + "조건": { + "구분": "고르기" + }, + "값칸": { + "수량": "", + "단가": "", + "금액": "" + }, + "줄": [ + { + "구분": "지적기사", + "수량": 5.22, + "단가": "w_1", + "금액": "W_1= 5.22×w_1" + }, + { + "구분": "지적산업기사", + "수량": 41.41, + "단가": "w_2", + "금액": "W_2=41.41×w_2" + }, + { + "구분": "지적기능사", + "수량": 15.13, + "단가": "w_3", + "금액": "W_3=15.13×w_3" + }, + { + "구분": "인부", + "수량": 3.65, + "단가": "w_4", + "금액": "W_4= 3.65×w_4" + }, + { + "구분": "계", + "금액": "∑W" + } + ], + "주": [] + }, + { + "열쇠": "9-6-2 지적도근점측량", + "이름": "지적도근점측량", + "기준": "도근점 50점", + "출처": "건설품셈 토목 9-6-2", + "조건": { + "작업별": "고르기", + "세부": "고르기", + "구간": "고르기", + "직종": "고르기" + }, + "값칸": { + "값": "" + }, + "줄": [ + { + "작업별": "자료조사", + "구간": "일수", + "직종": "", + "값": "(1.12)" + }, + { + "작업별": "자료조사", + "구간": "1일당", + "직종": "지적기사", + "값": 1 + }, + { + "작업별": "자료조사", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "자료조사", + "구간": "합계", + "직종": "지적기사", + "값": "(1.12)" + }, + { + "작업별": "자료조사", + "구간": "합계", + "직종": "지적산업기사", + "값": "(1.12)" + }, + { + "작업별": "계획준비", + "구간": "일수", + "직종": "", + "값": "(0.56)" + }, + { + "작업별": "계획준비", + "구간": "1일당", + "직종": "지적기사", + "값": 1 + }, + { + "작업별": "계획준비", + "구간": "1일당", + "직종": "지적산업기사", + "값": 2 + }, + { + "작업별": "계획준비", + "구간": "합계", + "직종": "지적기사", + "값": "(0.56)" + }, + { + "작업별": "계획준비", + "구간": "합계", + "직종": "지적산업기사", + "값": "(1.12)" + }, + { + "작업별": "답사", + "구간": "일수", + "직종": "", + "값": 0.84 + }, + { + "작업별": "답사", + "구간": "1일당", + "직종": "지적산업기사", + "값": 2 + }, + { + "작업별": "답사", + "구간": "1일당", + "직종": "지적기능사", + "값": 1 + }, + { + "작업별": "답사", + "구간": "합계", + "직종": "지적산업기사", + "값": 1.68 + }, + { + "작업별": "답사", + "구간": "합계", + "직종": "지적기능사", + "값": 0.84 + }, + { + "작업별": "선점", + "구간": "일수", + "직종": "", + "값": 1.96 + }, + { + "작업별": "선점", + "구간": "1일당", + "직종": "지적기사", + "값": 1 + }, + { + "작업별": "선점", + "구간": "1일당", + "직종": "지적산업기사", + "값": 2 + }, + { + "작업별": "선점", + "구간": "1일당", + "직종": "인부", + "값": 1 + }, + { + "작업별": "선점", + "구간": "합계", + "직종": "지적기사", + "값": 1.96 + }, + { + "작업별": "선점", + "구간": "합계", + "직종": "지적산업기사", + "값": 3.92 + }, + { + "작업별": "선점", + "구간": "합계", + "직종": "인부", + "값": 1.96 + }, + { + "작업별": "관측", + "구간": "일수", + "직종": "", + "값": 3.92 + }, + { + "작업별": "관측", + "구간": "1일당", + "직종": "지적산업기사", + "값": 2 + }, + { + "작업별": "관측", + "구간": "1일당", + "직종": "지적기능사", + "값": 1 + }, + { + "작업별": "관측", + "구간": "합계", + "직종": "지적산업기사", + "값": 7.84 + }, + { + "작업별": "관측", + "구간": "합계", + "직종": "지적기능사", + "값": 3.92 + }, + { + "작업별": "계산", + "구간": "일수", + "직종": "", + "값": "(1.68)" + }, + { + "작업별": "계산", + "구간": "1일당", + "직종": "지적산업기사", + "값": 2 + }, + { + "작업별": "계산", + "구간": "합계", + "직종": "지적산업기사", + "값": "(3.36)" + }, + { + "작업별": "지적전산파일변환", + "구간": "일수", + "직종": "", + "값": "(1.12)" + }, + { + "작업별": "지적전산파일변환", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "지적전산파일변환", + "구간": "합계", + "직종": "지적산업기사", + "값": "(1.12)" + }, + { + "작업별": "준비도작성", + "구간": "일수", + "직종": "", + "값": "(1.12)" + }, + { + "작업별": "준비도작성", + "구간": "1일당", + "직종": "지적기능사", + "값": 1 + }, + { + "작업별": "준비도작성", + "구간": "합계", + "직종": "지적기능사", + "값": "(1.12)" + }, + { + "작업별": "기지부합여부확인", + "구간": "일수", + "직종": "", + "값": 2.24 + }, + { + "작업별": "기지부합여부확인", + "구간": "1일당", + "직종": "지적산업기사", + "값": 2 + }, + { + "작업별": "기지부합여부확인", + "구간": "1일당", + "직종": "지적기능사", + "값": 1 + }, + { + "작업별": "기지부합여부확인", + "구간": "합계", + "직종": "지적산업기사", + "값": 4.48 + }, + { + "작업별": "기지부합여부확인", + "구간": "합계", + "직종": "지적기능사", + "값": 2.24 + }, + { + "작업별": "성과작성", + "구간": "일수", + "직종": "", + "값": "(1.12)" + }, + { + "작업별": "성과작성", + "구간": "1일당", + "직종": "지적산업기사", + "값": 2 + }, + { + "작업별": "성과작성", + "구간": "합계", + "직종": "지적산업기사", + "값": "(2.24)" + }, + { + "작업별": "점검", + "구간": "일수", + "직종": "", + "값": "(0.56)" + }, + { + "작업별": "점검", + "구간": "1일당", + "직종": "지적기사", + "값": 1 + }, + { + "작업별": "점검", + "구간": "합계", + "직종": "지적기사", + "값": "(0.56)" + }, + { + "작업별": "성과인계", + "구간": "일수", + "직종": "", + "값": "(0.56)" + }, + { + "작업별": "성과인계", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "성과인계", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.56)" + }, + { + "작업별": "소계", + "세부": "외업", + "구간": "일수", + "직종": "", + "값": 8.96 + }, + { + "작업별": "소계", + "세부": "외업", + "구간": "합계", + "직종": "지적기사", + "값": 1.96 + }, + { + "작업별": "소계", + "세부": "외업", + "구간": "합계", + "직종": "지적산업기사", + "값": 17.92 + }, + { + "작업별": "소계", + "세부": "외업", + "구간": "합계", + "직종": "지적기능사", + "값": 7.0 + }, + { + "작업별": "소계", + "세부": "외업", + "구간": "합계", + "직종": "인부", + "값": 1.96 + }, + { + "작업별": "소계", + "세부": "내업", + "구간": "일수", + "직종": "", + "값": "(7.84)" + }, + { + "작업별": "소계", + "세부": "내업", + "구간": "합계", + "직종": "지적기사", + "값": "(2.24)" + }, + { + "작업별": "소계", + "세부": "내업", + "구간": "합계", + "직종": "지적산업기사", + "값": "(9.52)" + }, + { + "작업별": "소계", + "세부": "내업", + "구간": "합계", + "직종": "지적기능사", + "값": "(1.12)" + }, + { + "작업별": "합계", + "구간": "일수", + "직종": "", + "값": 16.8 + }, + { + "작업별": "합계", + "구간": "합계", + "직종": "지적기사", + "값": 4.2 + }, + { + "작업별": "합계", + "구간": "합계", + "직종": "지적산업기사", + "값": 27.44 + }, + { + "작업별": "합계", + "구간": "합계", + "직종": "지적기능사", + "값": 8.12 + }, + { + "작업별": "합계", + "구간": "합계", + "직종": "인부", + "값": 1.96 + } + ], + "주": [ + "( )는 내업임.", + "본 품은 「공간정보의 구축 및 관리 등에 관한 법률」 제8조 제1항 제3호의 규정에 의하여 「지적측량시행규칙」 제12조 규정에 따라 지적도근측량을 경위의 측량방법에 의해 실시할 경우의 품이다.", + "방위각법에 의한 측량방법을 기준으로 하였으며, 배각법에 의하여 측량하였을 경우에는 가산계수를 곱하여 계상한다.", + "본 품에는 관측부 1부, 도근측량부 1부, 도근망도 1부의 성과품이 포함되어 있다.", + "본 품은 축척과 측량지역의 대·소에 불구하고 도근점 50점을 기준으로 한 것이다.", + "본 품에는 지적도근점측량을 위한 지적삼각측량 품이 포함되지 않았으므로 지적삼각측량비를 별도 계상한다.", + "본 품에는 지적도근점 표시를 하기 위한 재료 표지대는 포함되지 않았다.", + "거리측정 등 관측기계는 GPS, 토탈스테이션, 광파거리측거기, 각 관측장비로 한다.", + "본 품에 사용되는 기계경비 및 재료소모품비는 별도 계상한다.", + "매설작업에 따르는 자재대 및 운반비 인부임은 별도로 계상한다.", + "본 품의 외업에 필요한 여비는 공무원여비규정에 의한 국내여행자의 일비를 별도 계상한다.", + "[결정단가] = (∑W+직접경비+간접측량비)/50. [합계] = [단가]×300." + ] + }, + { + "열쇠": "9-6-2 가산계수", + "이름": "지적도근점측량 배각법 가산계수", + "기준": "", + "출처": "건설품셈 토목 9-6-2 주②", + "조건": { + "구분": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "구분": "방위각법", + "계수": 1.0 + }, + { + "구분": "배각법", + "계수": 1.37 + } + ], + "주": [] + }, + { + "열쇠": "9-6-2 계산예", + "이름": "지적도근점측량 계산예(배각법 300점, 기본계수1.0+가산계수0.37=1.37)", + "기준": "", + "출처": "건설품셈 토목 9-6-2 계산예", + "조건": { + "구분": "고르기" + }, + "값칸": { + "수량": "", + "단가": "", + "금액": "" + }, + "줄": [ + { + "구분": "지적기사", + "수량": "4.20×1.37 = 5.75", + "단가": "w_1", + "금액": "W_1= 5.75×w_1" + }, + { + "구분": "지적산업기사", + "수량": "27.44×1.37 = 37.59", + "단가": "w_2", + "금액": "W_2=37.59×w_2" + }, + { + "구분": "지적기능사", + "수량": "8.12×1.37 =11.12", + "단가": "w_3", + "금액": "W_3=11.12×w_3" + }, + { + "구분": "인부", + "수량": "1.96×1.37 = 2.69", + "단가": "w_4", + "금액": "W_4= 2.69×w_4" + }, + { + "구분": "계", + "금액": "∑W" + } + ], + "주": [ + "㉠기본계수:1.0, ㉡가산계수:0.37, 합계 : 1.37 = (㉠+㉡)." + ] + }, + { + "열쇠": "9-6-3가 지적삼각점 현황조사", + "이름": "지적기준점현황조사(지적삼각점)", + "기준": "지적기준점 10점", + "출처": "건설품셈 토목 9-6-3", + "조건": { + "작업별": "고르기", + "세부": "고르기", + "구간": "고르기", + "직종": "고르기" + }, + "값칸": { + "값": "" + }, + "줄": [ + { + "작업별": "자료조사", + "구간": "일수", + "직종": "", + "값": "(0.48)" + }, + { + "작업별": "자료조사", + "구간": "1일당", + "직종": "지적기사", + "값": 1.0 + }, + { + "작업별": "자료조사", + "구간": "합계", + "직종": "지적기사", + "값": "(0.48)" + }, + { + "작업별": "계획준비", + "구간": "일수", + "직종": "", + "값": "(0.27)" + }, + { + "작업별": "계획준비", + "구간": "1일당", + "직종": "지적기사", + "값": 1.0 + }, + { + "작업별": "계획준비", + "구간": "합계", + "직종": "지적기사", + "값": "(0.27)" + }, + { + "작업별": "현지조사", + "구간": "일수", + "직종": "", + "값": 4.33 + }, + { + "작업별": "현지조사", + "구간": "1일당", + "직종": "지적기사", + "값": 1.0 + }, + { + "작업별": "현지조사", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1.0 + }, + { + "작업별": "현지조사", + "구간": "합계", + "직종": "지적기사", + "값": 4.33 + }, + { + "작업별": "현지조사", + "구간": "합계", + "직종": "지적산업기사", + "값": 4.33 + }, + { + "작업별": "조사보고서작성", + "구간": "일수", + "직종": "", + "값": "(0.34)" + }, + { + "작업별": "조사보고서작성", + "구간": "1일당", + "직종": "지적기사", + "값": 1.0 + }, + { + "작업별": "조사보고서작성", + "구간": "합계", + "직종": "지적기사", + "값": "(0.34)" + }, + { + "작업별": "점검 및 보고", + "구간": "일수", + "직종": "", + "값": "(0.27)" + }, + { + "작업별": "점검 및 보고", + "구간": "1일당", + "직종": "지적기사", + "값": 1.0 + }, + { + "작업별": "점검 및 보고", + "구간": "합계", + "직종": "지적기사", + "값": "(0.27)" + }, + { + "작업별": "소계", + "세부": "외업", + "구간": "일수", + "직종": "", + "값": 4.33 + }, + { + "작업별": "소계", + "세부": "외업", + "구간": "합계", + "직종": "지적기사", + "값": 4.33 + }, + { + "작업별": "소계", + "세부": "외업", + "구간": "합계", + "직종": "지적산업기사", + "값": 4.33 + }, + { + "작업별": "소계", + "세부": "내업", + "구간": "일수", + "직종": "", + "값": "(1.36)" + }, + { + "작업별": "소계", + "세부": "내업", + "구간": "합계", + "직종": "지적기사", + "값": "(1.36)" + }, + { + "작업별": "합계", + "구간": "일수", + "직종": "", + "값": 5.69 + }, + { + "작업별": "합계", + "구간": "합계", + "직종": "지적기사", + "값": 5.69 + }, + { + "작업별": "합계", + "구간": "합계", + "직종": "지적산업기사", + "값": 4.33 + } + ], + "주": [] + }, + { + "열쇠": "9-6-3나 지적도근점 현황조사", + "이름": "지적기준점현황조사(지적도근점)", + "기준": "지적기준점 10점", + "출처": "건설품셈 토목 9-6-3", + "조건": { + "작업별": "고르기", + "세부": "고르기", + "구간": "고르기", + "직종": "고르기" + }, + "값칸": { + "값": "" + }, + "줄": [ + { + "작업별": "자료조사", + "구간": "일수", + "직종": "", + "값": "(0.03)" + }, + { + "작업별": "자료조사", + "구간": "1일당", + "직종": "지적기사", + "값": 1.0 + }, + { + "작업별": "자료조사", + "구간": "합계", + "직종": "지적기사", + "값": "(0.03)" + }, + { + "작업별": "계획준비", + "구간": "일수", + "직종": "", + "값": "(0.01)" + }, + { + "작업별": "계획준비", + "구간": "1일당", + "직종": "지적기사", + "값": 1.0 + }, + { + "작업별": "계획준비", + "구간": "합계", + "직종": "지적기사", + "값": "(0.01)" + }, + { + "작업별": "현지조사", + "구간": "일수", + "직종": "", + "값": 0.21 + }, + { + "작업별": "현지조사", + "구간": "1일당", + "직종": "지적기사", + "값": 1.0 + }, + { + "작업별": "현지조사", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1.0 + }, + { + "작업별": "현지조사", + "구간": "합계", + "직종": "지적기사", + "값": 0.21 + }, + { + "작업별": "현지조사", + "구간": "합계", + "직종": "지적산업기사", + "값": 0.21 + }, + { + "작업별": "조사보고서작성", + "구간": "일수", + "직종": "", + "값": "(0.03)" + }, + { + "작업별": "조사보고서작성", + "구간": "1일당", + "직종": "지적기사", + "값": 1.0 + }, + { + "작업별": "조사보고서작성", + "구간": "합계", + "직종": "지적기사", + "값": "(0.03)" + }, + { + "작업별": "점검 및 보고", + "구간": "일수", + "직종": "", + "값": "(0.02)" + }, + { + "작업별": "점검 및 보고", + "구간": "1일당", + "직종": "지적기사", + "값": 1.0 + }, + { + "작업별": "점검 및 보고", + "구간": "합계", + "직종": "지적기사", + "값": "(0.02)" + }, + { + "작업별": "소계", + "세부": "외업", + "구간": "일수", + "직종": "", + "값": 0.21 + }, + { + "작업별": "소계", + "세부": "외업", + "구간": "합계", + "직종": "지적기사", + "값": 0.21 + }, + { + "작업별": "소계", + "세부": "외업", + "구간": "합계", + "직종": "지적산업기사", + "값": 0.21 + }, + { + "작업별": "소계", + "세부": "내업", + "구간": "일수", + "직종": "", + "값": "(0.09)" + }, + { + "작업별": "소계", + "세부": "내업", + "구간": "합계", + "직종": "지적기사", + "값": "(0.09)" + }, + { + "작업별": "합계", + "구간": "일수", + "직종": "", + "값": 0.3 + }, + { + "작업별": "합계", + "구간": "합계", + "직종": "지적기사", + "값": 0.3 + }, + { + "작업별": "합계", + "구간": "합계", + "직종": "지적산업기사", + "값": 0.21 + } + ], + "주": [ + "본 품은 「공간정보의 구축 및 관리 등에 관한 법률」제105조 및 같은 법 시행령 제104조에 따라 위탁된 지적삼각점, 지적삼각보조점, 지적도근점의 정확하고 효율적인 관리를 위해 기준점의 위치, 망실·훼손·시인성 등의 현황을 조사하는 업무를 수행할 경우의 품이다.", + "본 품은 지적기준점 10점을 현황조사하는데 소요되는 품으로 1점의 품셈을 산출하기 위해서는 위의 품의 10분의 1을 적용한다.", + "지적삼각보조점의 현황조사는 지적도근점 현황조사품을 준용한다. 다만, 지적삼각보조점의 위치가 산악지에 위치한 경우에는 지적삼각점 현황조사품을 준용할 수 있다.", + "작업상 지적도근점측량 등이 수반되는 경우에는 별도 계상한다.", + "도서지역 등의 조사업무를 위하여 선박 등을 임차할 경우에는 임차료 실비를 별도 계상한다.", + "본 품에는 지적기준점 현황조사서 1부, 지적기준점 현황조사 결과 파일 1식의 성과작성품이 포함되어 있다." + ] + }, + { + "열쇠": "9-7-1 신규등록측량(도해)", + "이름": "신규등록측량(도해)", + "기준": "1필지당(토지1,500㎡·임야5,000㎡)", + "출처": "건설품셈 토목 9-7-1", + "조건": { + "작업별": "고르기", + "세부": "고르기", + "직종": "고르기" + }, + "값칸": { + "값": "" + }, + "줄": [ + { + "작업별": "자료조사", + "직종": "지적기사", + "값": "(0.04)" + }, + { + "작업별": "자료조사", + "직종": "지적산업기사", + "값": "(0.05)" + }, + { + "작업별": "측량계획 및 준비", + "직종": "지적기사", + "값": "(0.04)" + }, + { + "작업별": "측량계획 및 준비", + "직종": "지적산업기사", + "값": "(0.03)" + }, + { + "작업별": "측량준비도 작성", + "직종": "지적기사", + "값": "(0.02)" + }, + { + "작업별": "측량준비도 작성", + "직종": "지적산업기사", + "값": "(0.03)" + }, + { + "작업별": "현지측량 준비", + "직종": "지적기사", + "값": 0.01 + }, + { + "작업별": "현지측량 준비", + "직종": "지적산업기사", + "값": 0.02 + }, + { + "작업별": "현지측량 준비", + "직종": "지적기능사", + "값": 0.01 + }, + { + "작업별": "현지측량", + "직종": "지적기사", + "값": 0.29 + }, + { + "작업별": "현지측량", + "직종": "지적산업기사", + "값": 0.29 + }, + { + "작업별": "현지측량", + "직종": "지적기능사", + "값": 0.29 + }, + { + "작업별": "성과설명", + "직종": "지적기사", + "값": 0.04 + }, + { + "작업별": "측량결과도 등 측량성과물 작성", + "직종": "지적기사", + "값": "(0.07)" + }, + { + "작업별": "측량결과도 등 측량성과물 작성", + "직종": "지적산업기사", + "값": "(0.15)" + }, + { + "작업별": "측량성과 관련서류 작성", + "직종": "지적산업기사", + "값": "(0.02)" + }, + { + "작업별": "측량성과 검사요청", + "직종": "지적기사", + "값": "(0.03)" + }, + { + "작업별": "측량성과 검사요청", + "직종": "지적산업기사", + "값": "(0.04)" + }, + { + "작업별": "지적측량 성과도교부", + "직종": "지적기사", + "값": "(0.02)" + }, + { + "작업별": "지적측량 성과도교부", + "직종": "지적산업기사", + "값": "(0.02)" + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적기사", + "값": 0.34 + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적산업기사", + "값": 0.31 + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적기능사", + "값": 0.3 + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적기사", + "값": "(0.22)" + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적산업기사", + "값": "(0.34)" + }, + { + "작업별": "합계", + "직종": "지적기사", + "값": 0.56 + }, + { + "작업별": "합계", + "직종": "지적산업기사", + "값": 0.65 + }, + { + "작업별": "합계", + "직종": "지적기능사", + "값": 0.3 + } + ], + "주": [ + "( )는 내업임.", + "본 품은 「공간정보의 구축 및 관리 등에 관한 법률」 제2조제29호의 규정에 의하여 새로 조성된 토지와 지적공부에 등록되어 있지 아니한 토지를 지적공부에 등록하거나 같은법 제86조 규정의 토지개발사업 이외의 토지를 새로이 지적공부에 수치로 등록하기 위하여 경위의 도해 측량방법으로 실시하는 품이다.", + "n은 가산횟수로 (대상면적-기준면적)÷기준면적.", + "본 품에는 신규등록 측량결과도 1부, 면적측정부 1부, 이동지조서 1부, 지적공부정리파일 1부, 측량결과부(측량성과도 등) 1부의 성과작성품이 포함되어 있다.", + "신규등록할 토지의 축척은 1/600, 1/1000, 1/1200, 1/2400, 1/3000, 1/6000로 구분한다.", + "본 품에 사용되는 기계경비 및 재료소모품비는 별도 계상한다.", + "작업상 지적측량기준점을 설치할 경우에는 지적측량기준점 설치비를 별도 계상한다.", + "도서지역 등의 측량을 위하여 선박 등을 임차할 경우에는 임차료 실비를 별도 계상한다.", + "본 품의 외업에 필요한 여비는 공무원여비규정에 의한 국내여행자의 일비를 별도 계상한다.", + "[결정단가] = ∑W+직접경비+간접측량비." + ] + }, + { + "열쇠": "9-7-1 면적계수", + "이름": "신규등록측량(도해) 면적계수", + "기준": "", + "출처": "건설품셈 토목 9-7-1 주②", + "조건": { + "가산횟수": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "가산횟수": "0회", + "계수": 1.0 + }, + { + "가산횟수": "1회", + "계수": 1.3 + }, + { + "가산횟수": "2회이상", + "계수": "1.2+(0.10×n)" + } + ], + "주": [] + }, + { + "열쇠": "9-7-1 등록계수", + "이름": "신규등록측량(도해) 등록계수", + "기준": "", + "출처": "건설품셈 토목 9-7-1 주③", + "조건": { + "구분": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "구분": "토지", + "계수": 1.0 + }, + { + "구분": "임야", + "계수": 1.2 + } + ], + "주": [] + }, + { + "열쇠": "9-7-1 지역구분계수", + "이름": "신규등록측량(도해) 지역구분계수", + "기준": "", + "출처": "건설품셈 토목 9-7-1 주④", + "조건": { + "구분": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "구분": "면", + "계수": 1.0 + }, + { + "구분": "읍", + "계수": 1.1 + }, + { + "구분": "동시", + "계수": 1.3 + }, + { + "구분": "동구", + "계수": 1.4 + } + ], + "주": [] + }, + { + "열쇠": "9-7-1 계산예", + "이름": "신규등록측량(도해) 계산예(구지역, 1필지 7,000㎡ 미등록 토지)", + "기준": "", + "출처": "건설품셈 토목 9-7-1 계산예", + "조건": { + "구분": "고르기" + }, + "값칸": { + "수량(T)": "", + "단가": "", + "금액": "" + }, + "줄": [ + { + "구분": "지적기사", + "수량(T)": "0.56×2.00=1.12", + "단가": "w_1", + "금액": "W_1=1.12×w_1" + }, + { + "구분": "지적산업기사", + "수량(T)": "0.65×2.00=1.30", + "단가": "w_2", + "금액": "W_2=1.30×w_2" + }, + { + "구분": "지적기능사", + "수량(T)": "0.30×2.00=0.60", + "단가": "w_3", + "금액": "W_3=0.60×w_3" + }, + { + "구분": "계", + "금액": "∑W" + } + ], + "주": [ + "㉠기본계수:1.00, ㉡등록계수:0.00, ㉢지역구분계수:0.40, ㉣면적계수:0.60. 합계 : 2.00 = (㉠+㉡+㉢+㉣)." + ] + }, + { + "열쇠": "9-7-2 신규등록측량(수치)", + "이름": "신규등록측량(수치)", + "기준": "1필지당(토지1,500㎡·임야5,000㎡)", + "출처": "건설품셈 토목 9-7-2", + "조건": { + "작업별": "고르기", + "세부": "고르기", + "직종": "고르기" + }, + "값칸": { + "값": "" + }, + "줄": [ + { + "작업별": "자료조사", + "직종": "지적기사", + "값": "(0.04)" + }, + { + "작업별": "자료조사", + "직종": "지적산업기사", + "값": "(0.05)" + }, + { + "작업별": "측량계획 및 준비", + "직종": "지적기사", + "값": "(0.04)" + }, + { + "작업별": "측량계획 및 준비", + "직종": "지적산업기사", + "값": "(0.02)" + }, + { + "작업별": "측량준비도 작성", + "직종": "지적기사", + "값": "(0.01)" + }, + { + "작업별": "측량준비도 작성", + "직종": "지적산업기사", + "값": "(0.04)" + }, + { + "작업별": "현지측량 준비", + "직종": "지적기사", + "값": 0.01 + }, + { + "작업별": "현지측량 준비", + "직종": "지적산업기사", + "값": 0.02 + }, + { + "작업별": "현지측량 준비", + "직종": "지적기능사", + "값": 0.01 + }, + { + "작업별": "현지측량", + "직종": "지적기사", + "값": 0.26 + }, + { + "작업별": "현지측량", + "직종": "지적산업기사", + "값": 0.26 + }, + { + "작업별": "현지측량", + "직종": "지적기능사", + "값": 0.26 + }, + { + "작업별": "성과설명", + "직종": "지적기사", + "값": 0.04 + }, + { + "작업별": "측량결과도 등 측량성과물 작성", + "직종": "지적기사", + "값": "(0.06)" + }, + { + "작업별": "측량결과도 등 측량성과물 작성", + "직종": "지적산업기사", + "값": "(0.15)" + }, + { + "작업별": "측량성과 관련서류 작성", + "직종": "지적산업기사", + "값": "(0.02)" + }, + { + "작업별": "측량성과 검사요청", + "직종": "지적기사", + "값": "(0.03)" + }, + { + "작업별": "측량성과 검사요청", + "직종": "지적산업기사", + "값": "(0.05)" + }, + { + "작업별": "지적측량 성과도교부", + "직종": "지적기사", + "값": "(0.03)" + }, + { + "작업별": "지적측량 성과도교부", + "직종": "지적산업기사", + "값": "(0.01)" + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적기사", + "값": 0.31 + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적산업기사", + "값": 0.28 + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적기능사", + "값": 0.27 + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적기사", + "값": "(0.21)" + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적산업기사", + "값": "(0.34)" + }, + { + "작업별": "합계", + "직종": "지적기사", + "값": 0.52 + }, + { + "작업별": "합계", + "직종": "지적산업기사", + "값": 0.62 + }, + { + "작업별": "합계", + "직종": "지적기능사", + "값": 0.27 + } + ], + "주": [ + "( )는 내업임.", + "본 품은 「공간정보의 구축 및 관리 등에 관한 법률」 제2조 제29호의 규정에 의하여 새로 조성된 토지와 지적공부에 등록되어 있지 아니한 토지를 지적공부에 등록하거나 같은법 제86조 규정의 토지개발사업 이외의 토지를 새로이 지적공부에 수치로 등록하기 위하여 경위의 측량방법으로 실시하는 품이다.", + "n은 가산횟수로 (대상면적-기준면적)÷기준면적.", + "본 품에는 신규등록 측량결과도 및 계산부 1부, 좌표면적 계산부 1부, 이동지조서 1부, 지적공부정리파일 1부, 측량결과부(측량성과도 등) 1부의 성과작성품이 포함되어 있다.", + "신규등록할 토지의 축척은 1/500, 1/1000로 구분한다.", + "본 품에 사용되는 기계경비 및 재료소모품비는 별도 계상한다.", + "작업상 지적측량기준점을 설치할 경우에는 지적측량기준점 설치비를 별도 계상한다.", + "도서지역 등의 측량을 위하여 선박 등을 임차할 경우에는 임차료 실비를 별도 계상한다.", + "본 품의 외업에 필요한 여비는 공무원여비규정에 의한 국내여행자의 일비를 별도 계상한다." + ] + }, + { + "열쇠": "9-7-2 면적계수", + "이름": "신규등록측량(수치) 면적계수", + "기준": "", + "출처": "건설품셈 토목 9-7-2 주②", + "조건": { + "가산횟수": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "가산횟수": "0회", + "계수": 1.0 + }, + { + "가산횟수": "1회", + "계수": 1.3 + }, + { + "가산횟수": "2회이상", + "계수": "1.2+(0.10×n)" + } + ], + "주": [] + }, + { + "열쇠": "9-7-2 지역구분계수", + "이름": "신규등록측량(수치) 지역구분계수", + "기준": "", + "출처": "건설품셈 토목 9-7-2 주③", + "조건": { + "구분": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "구분": "면", + "계수": 1.0 + }, + { + "구분": "읍", + "계수": 1.1 + }, + { + "구분": "동시", + "계수": 1.3 + }, + { + "구분": "동구", + "계수": 1.4 + } + ], + "주": [] + }, + { + "열쇠": "9-7-3 토지구획정리 신규등록 측량(수치)", + "이름": "토지구획정리 신규등록 측량(수치)", + "기준": "1지구 200,000㎡", + "출처": "건설품셈 토목 9-7-3", + "조건": { + "작업별": "고르기", + "세부": "고르기", + "직종": "고르기" + }, + "값칸": { + "값": "" + }, + "줄": [ + { + "작업별": "자료조사", + "직종": "지적산업기사", + "값": "(4.04)" + }, + { + "작업별": "계획준비", + "직종": "지적기사", + "값": "(3.43)" + }, + { + "작업별": "계획준비", + "직종": "지적산업기사", + "값": "(3.43)" + }, + { + "작업별": "현장조사", + "직종": "지적기사", + "값": 3.41 + }, + { + "작업별": "현장조사", + "직종": "지적산업기사", + "값": 6.82 + }, + { + "작업별": "지적전산파일변환", + "직종": "지적산업기사", + "값": "(3.59)" + }, + { + "작업별": "지구계준비도", + "세부": "작성", + "직종": "지적산업기사", + "값": "(6.20)" + }, + { + "작업별": "지구계준비도", + "세부": "확인", + "직종": "지적기사", + "값": "(0.92)" + }, + { + "작업별": "가구점", + "세부": "측량", + "직종": "지적기사", + "값": 9.36 + }, + { + "작업별": "가구점", + "세부": "측량", + "직종": "지적산업기사", + "값": 18.72 + }, + { + "작업별": "가구점", + "세부": "측량", + "직종": "지적기능사", + "값": 9.36 + }, + { + "작업별": "가구점", + "세부": "계산", + "직종": "지적기사", + "값": "(10.88)" + }, + { + "작업별": "가구점", + "세부": "계산", + "직종": "지적산업기사", + "값": "(10.88)" + }, + { + "작업별": "필계점", + "세부": "측량", + "직종": "지적기사", + "값": 6.5 + }, + { + "작업별": "필계점", + "세부": "측량", + "직종": "지적산업기사", + "값": 13.0 + }, + { + "작업별": "필계점", + "세부": "측량", + "직종": "지적기능사", + "값": 6.5 + }, + { + "작업별": "필계점", + "세부": "계산", + "직종": "지적기사", + "값": "(9.45)" + }, + { + "작업별": "필계점", + "세부": "계산", + "직종": "지적산업기사", + "값": "(9.45)" + }, + { + "작업별": "중심점계산", + "직종": "지적기사", + "값": "(8.41)" + }, + { + "작업별": "중심점계산", + "직종": "지적산업기사", + "값": "(8.41)" + }, + { + "작업별": "말박기측량", + "세부": "계산", + "직종": "지적기사", + "값": "(10.91)" + }, + { + "작업별": "말박기측량", + "세부": "계산", + "직종": "지적산업기사", + "값": "(10.91)" + }, + { + "작업별": "말박기측량", + "세부": "측량", + "직종": "지적기사", + "값": 15.14 + }, + { + "작업별": "말박기측량", + "세부": "측량", + "직종": "지적산업기사", + "값": 30.28 + }, + { + "작업별": "말박기측량", + "세부": "측량", + "직종": "지적기능사", + "값": 15.14 + }, + { + "작업별": "좌표면적계산", + "직종": "지적기사", + "값": "(8.44)" + }, + { + "작업별": "좌표면적계산", + "직종": "지적산업기사", + "값": "(8.44)" + }, + { + "작업별": "결과도작성", + "직종": "지적산업기사", + "값": "(6.20)" + }, + { + "작업별": "성과작성", + "직종": "지적산업기사", + "값": "(36.50)" + }, + { + "작업별": "조서작성", + "직종": "지적산업기사", + "값": "(11.78)" + }, + { + "작업별": "점검", + "직종": "지적기사", + "값": "(5.02)" + }, + { + "작업별": "성과인계", + "직종": "지적기사", + "값": "(2.58)" + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적기사", + "값": 34.41 + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적산업기사", + "값": 68.82 + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적기능사", + "값": 31.0 + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적기사", + "값": "(60.04)" + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적산업기사", + "값": "(119.83)" + }, + { + "작업별": "합계", + "직종": "지적기사", + "값": 94.45 + }, + { + "작업별": "합계", + "직종": "지적산업기사", + "값": 188.65 + }, + { + "작업별": "합계", + "직종": "지적기능사", + "값": 31.0 + } + ], + "주": [ + "( )는 내업임.", + "본 품은 「공간정보의 구축 및 관리 등에 관한 법률」 제86조 규정의 도시개발사업 또는 그 밖에 대통령령이 정하는 토지개발사업(토지구획정리·공업단지 등)과 공유수면을 매립하여 새로이 지적공부에 수치로 등록하기 위하여 경위의 측량방법으로 실시하는 품이다.", + "본 품의 기준면적은 1지구 200,000㎡를 기준한 것으로 초과하는 경우 면적체감계수를 곱하여 각각 합산한 품으로 한다. 작업과정이 동일한 방법으로 연속되지 않을 경우에는 체감계수를 적용하지 않는다.", + "본 품은 1지구내의 필지수를 50필지 이하를 기준으로 한 것으로 초과하는 경우 필지가산계수를 곱하여 계상한다.", + "축척은 1/500 또는 1/1000으로 한다.", + "측량지구면적이 10,000㎡이하인 경우에는 10,000㎡의 품으로 한다.", + "면적계산은 좌표를 면적프로그램에 의하여 컴퓨터 계산한 품, 좌표점 전개는 프로그램, 거리측정은 광파기, 결과도 작성은 프로그램에 의한 것이다.", + "본 품에는 지구계 분할측량품은 포함되어 있지 않다.", + "본 품에 사용되는 기계경비 및 재료소모품비는 별도 계상한다.", + "본 품에는 지적기준점측량이 포함되어 있지 않으므로 지적기준점측량을 실시할 경우에는 지적기준점측량비를 별도 계상한다.", + "말박기 측량을 수반하지 않을 경우 말박기 측량품을 제외한다.", + "본 품의 외업에 필요한 여비는 공무원여비규정에 의한 국내여행자의 일비를 별도 계상한다." + ] + }, + { + "열쇠": "9-7-3 면적체감계수", + "이름": "토지구획정리 신규등록 측량 면적체감계수", + "기준": "", + "출처": "건설품셈 토목 9-7-3 주②", + "조건": { + "구분": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "구분": "20만㎡이하", + "계수": 1.0 + }, + { + "구분": "20만㎡초과∼50만㎡", + "계수": 0.9 + }, + { + "구분": "50만㎡초과∼100만㎡", + "계수": 0.8 + }, + { + "구분": "100만㎡초과∼200만㎡", + "계수": 0.7 + }, + { + "구분": "200만㎡초과∼300만㎡", + "계수": 0.6 + }, + { + "구분": "300만㎡초과", + "계수": 0.5 + } + ], + "주": [ + "원문 표 머리 줄바꿈 표기: 50만㎡초과∼1/00만㎡, 100만㎡초과∼2/00만㎡(100만㎡·200만㎡가 줄바꿈으로 나뉘어 찍힘)." + ] + }, + { + "열쇠": "9-7-3 필지가산계수", + "이름": "토지구획정리 신규등록 측량 필지가산계수", + "기준": "", + "출처": "건설품셈 토목 9-7-3 주③", + "조건": { + "필지수": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "필지수": "50 이하", + "계수": 1.0 + }, + { + "필지수": "51∼100", + "계수": 1.05 + }, + { + "필지수": "101∼200", + "계수": 1.1 + }, + { + "필지수": "201∼300", + "계수": 1.15 + }, + { + "필지수": "301∼400", + "계수": 1.2 + }, + { + "필지수": "401∼500", + "계수": 1.25 + }, + { + "필지수": "500초과시 매100필지마다", + "계수": "1.05×n" + } + ], + "주": [] + }, + { + "열쇠": "9-7-4 경지구획정리 신규등록 측량(수치)", + "이름": "경지구획정리 신규등록 측량(수치)", + "기준": "", + "출처": "건설품셈 토목 9-7-4", + "조건": { + "작업별": "고르기", + "세부": "고르기", + "직종": "고르기" + }, + "값칸": { + "값": "" + }, + "줄": [ + { + "작업별": "자료조사", + "직종": "지적산업기사", + "값": "(6.82)" + }, + { + "작업별": "계획준비", + "직종": "지적기사", + "값": "(2.63)" + }, + { + "작업별": "계획준비", + "직종": "지적산업기사", + "값": "(2.63)" + }, + { + "작업별": "현장조사", + "직종": "지적기사", + "값": 2.76 + }, + { + "작업별": "현장조사", + "직종": "지적산업기사", + "값": 2.76 + }, + { + "작업별": "지적전산파일변환", + "직종": "지적산업기사", + "값": "(12.02)" + }, + { + "작업별": "지구계준비도", + "세부": "작성", + "직종": "지적기사", + "값": "(7.84)" + }, + { + "작업별": "지구계준비도", + "세부": "작성", + "직종": "지적산업기사", + "값": "(15.68)" + }, + { + "작업별": "지구계준비도", + "세부": "작성", + "직종": "지적기능사", + "값": "(7.84)" + }, + { + "작업별": "지구계준비도", + "세부": "확인", + "직종": "지적기사", + "값": "(1.05)" + }, + { + "작업별": "필계점", + "세부": "측량", + "직종": "지적기사", + "값": 15.38 + }, + { + "작업별": "필계점", + "세부": "측량", + "직종": "지적산업기사", + "값": 30.76 + }, + { + "작업별": "필계점", + "세부": "측량", + "직종": "지적기능사", + "값": 15.38 + }, + { + "작업별": "필계점", + "세부": "계산", + "직종": "지적기사", + "값": "(16.73)" + }, + { + "작업별": "필계점", + "세부": "계산", + "직종": "지적산업기사", + "값": "(16.73)" + }, + { + "작업별": "좌표면적계산", + "직종": "지적기사", + "값": "(15.78)" + }, + { + "작업별": "좌표면적계산", + "직종": "지적산업기사", + "값": "(15.78)" + }, + { + "작업별": "결과도작성", + "직종": "지적기사", + "값": "(3.03)" + }, + { + "작업별": "결과도작성", + "직종": "지적산업기사", + "값": "(6.06)" + }, + { + "작업별": "결과도작성", + "직종": "지적기능사", + "값": "(3.03)" + }, + { + "작업별": "성과작성", + "직종": "지적기사", + "값": "(18.16)" + }, + { + "작업별": "성과작성", + "직종": "지적산업기사", + "값": "(36.32)" + }, + { + "작업별": "성과작성", + "직종": "지적기능사", + "값": "(18.16)" + }, + { + "작업별": "조서작성", + "직종": "지적산업기사", + "값": "(11.78)" + }, + { + "작업별": "조서작성", + "직종": "지적기능사", + "값": "(5.89)" + }, + { + "작업별": "점검", + "직종": "지적기사", + "값": "(5.66)" + }, + { + "작업별": "성과인계", + "직종": "지적기사", + "값": "(1.40)" + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적기사", + "값": 18.14 + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적산업기사", + "값": 33.52 + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적기능사", + "값": 15.38 + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적기사", + "값": "(72.28)" + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적산업기사", + "값": "(123.82)" + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적기능사", + "값": "(34.92)" + }, + { + "작업별": "합계", + "직종": "지적기사", + "값": 90.42 + }, + { + "작업별": "합계", + "직종": "지적산업기사", + "값": 157.34 + }, + { + "작업별": "합계", + "직종": "지적기능사", + "값": 50.3 + } + ], + "주": [ + "( )는 내업임.", + "본 품은 「공간정보의 구축 및 관리 등에 관한 법률」 제86조 규정의 농어촌정비사업 등을 위한 「농어촌정비법」, 「공유수면매립법」 등에 의하여 공유수면을 매립하여 새로이 지적공부에 수치로 등록하기 위하여 경위의 측량방법으로 실시하는 품이다.", + "측량지구의 면적이 1,000,000㎡를 초과할 경우에는 면적체감계수를 곱하여 각각 합산한 품으로 한다.", + "축척은 1/500 또는 1/1000으로 한다.", + "측량지구면적이 30,000㎡이하인 경우에는 30,000㎡의 품으로 한다.", + "면적계산은 좌표를 면적프로그램에 의하여 컴퓨터로 계산한 품, 좌표점 전개는 프로그램, 거리측정은 광파기, 결과도 작성은 프로그램에 의한 것이다.", + "본 품에는 지구계 분할측량품은 포함되어 있지 않다.", + "중심점·가구점, 필계점, 말박기 측량을 필요로 할 경우에는 본 품의 30%의 값을 적용한 품으로 한다.", + "본 품에 사용되는 기계경비 및 재료소모품비는 별도 계상한다.", + "본 품에는 지적기준점측량이 포함되어 있지 않으므로 지적기준점측량을 실시할 경우에는 지적기준점측량비를 별도 계상한다.", + "본 품의 외업에 필요한 여비는 공무원여비규정에 의한 국내여행자의 일비를 별도 계상한다." + ] + }, + { + "열쇠": "9-7-4 면적체감계수", + "이름": "경지구획정리 신규등록 측량 면적체감계수", + "기준": "", + "출처": "건설품셈 토목 9-7-4 주②", + "조건": { + "구분": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "구분": "100만㎡이하", + "계수": 1.0 + }, + { + "구분": "100만㎡초과∼300만㎡", + "계수": 0.9 + }, + { + "구분": "300만㎡초과∼500만㎡", + "계수": 0.8 + }, + { + "구분": "500만㎡초과∼800만㎡", + "계수": 0.7 + }, + { + "구분": "800만㎡초과∼1000만㎡", + "계수": 0.6 + }, + { + "구분": "1000만㎡초과", + "계수": 0.5 + } + ], + "주": [] + }, + { + "열쇠": "9-8-1 등록전환 측량(도해)", + "이름": "등록전환 측량(도해)", + "기준": "1필지당 1,500㎡", + "출처": "건설품셈 토목 9-8-1", + "조건": { + "작업별": "고르기", + "세부": "고르기", + "직종": "고르기" + }, + "값칸": { + "값": "" + }, + "줄": [ + { + "작업별": "자료조사", + "직종": "지적기사", + "값": "(0.05)" + }, + { + "작업별": "자료조사", + "직종": "지적산업기사", + "값": "(0.06)" + }, + { + "작업별": "측량계획 및 준비", + "직종": "지적기사", + "값": "(0.05)" + }, + { + "작업별": "측량계획 및 준비", + "직종": "지적산업기사", + "값": "(0.02)" + }, + { + "작업별": "측량준비도 작성", + "직종": "지적기사", + "값": "(0.02)" + }, + { + "작업별": "측량준비도 작성", + "직종": "지적산업기사", + "값": "(0.03)" + }, + { + "작업별": "현지측량 준비", + "직종": "지적기사", + "값": 0.01 + }, + { + "작업별": "현지측량 준비", + "직종": "지적산업기사", + "값": 0.02 + }, + { + "작업별": "현지측량 준비", + "직종": "지적기능사", + "값": 0.01 + }, + { + "작업별": "현지측량", + "직종": "지적기사", + "값": 0.45 + }, + { + "작업별": "현지측량", + "직종": "지적산업기사", + "값": 0.45 + }, + { + "작업별": "현지측량", + "직종": "지적기능사", + "값": 0.45 + }, + { + "작업별": "성과설명", + "직종": "지적기사", + "값": 0.05 + }, + { + "작업별": "측량결과도 등 측량성과물 작성", + "직종": "지적기사", + "값": "(0.07)" + }, + { + "작업별": "측량결과도 등 측량성과물 작성", + "직종": "지적산업기사", + "값": "(0.16)" + }, + { + "작업별": "측량성과 관련서류 작성", + "직종": "지적산업기사", + "값": "(0.02)" + }, + { + "작업별": "측량성과 검사요청", + "직종": "지적기사", + "값": "(0.03)" + }, + { + "작업별": "측량성과 검사요청", + "직종": "지적산업기사", + "값": "(0.04)" + }, + { + "작업별": "지적측량 성과도교부", + "직종": "지적기사", + "값": "(0.03)" + }, + { + "작업별": "지적측량 성과도교부", + "직종": "지적산업기사", + "값": "(0.01)" + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적기사", + "값": 0.51 + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적산업기사", + "값": 0.47 + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적기능사", + "값": 0.46 + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적기사", + "값": "(0.25)" + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적산업기사", + "값": "(0.34)" + }, + { + "작업별": "합계", + "직종": "지적기사", + "값": 0.76 + }, + { + "작업별": "합계", + "직종": "지적산업기사", + "값": 0.81 + }, + { + "작업별": "합계", + "직종": "지적기능사", + "값": 0.46 + } + ], + "주": [ + "( )는 내업임.", + "본 품은 「공간정보의 구축 및 관리 등에 관한 법률」 제2조 제30호의 규정에 의하여 임야대장 및 임야도에 등록된 토지를 토지대장 및 지적도에 옮겨 등록하기 위하여 실시하는 측량 품이다.", + "n은 가산횟수로 (대상면적-기준면적)÷기준면적.", + "본 품에는 등록전환 측량결과도 1부, 면적측정부 1부, 이동지조서 3부, 지적공부정리파일 1식, 측량결과부(측량성과도 등) 1부의 성과작성품이 포함되어 있다.", + "등록전환할 토지의 축척은 1/600, 1/1000, 1/1200, 1/2400로 구분한다.", + "본 품에 사용되는 기계경비 및 재료소모품비는 별도 계상한다.", + "작업상 지적측량기준점을 설치할 경우에는 지적측량기준점 설치비를 별도 계상한다.", + "도서지역 등의 측량을 위하여 선박 등을 임차할 경우에는 임차료 실비를 별도 계상한다.", + "본 품의 외업에 필요한 여비는 공무원여비규정에 의한 국내여행자의 일비를 별도 계상한다.", + "[결정단가] = ∑W + 직접경비 + 간접측량비." + ] + }, + { + "열쇠": "9-8-1 면적계수", + "이름": "등록전환 측량(도해) 면적계수", + "기준": "", + "출처": "건설품셈 토목 9-8-1 주②", + "조건": { + "가산횟수": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "가산횟수": "0회", + "계수": 1.0 + }, + { + "가산횟수": "1회", + "계수": 1.3 + }, + { + "가산횟수": "2회이상", + "계수": "1.2+(0.10×n)" + } + ], + "주": [] + }, + { + "열쇠": "9-8-1 지역구분계수", + "이름": "등록전환 측량(도해) 지역구분계수", + "기준": "", + "출처": "건설품셈 토목 9-8-1 주③", + "조건": { + "구분": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "구분": "면", + "계수": 1.0 + }, + { + "구분": "읍", + "계수": 1.1 + }, + { + "구분": "동시", + "계수": 1.3 + }, + { + "구분": "동구", + "계수": 1.4 + } + ], + "주": [] + }, + { + "열쇠": "9-8-1 계산예", + "이름": "등록전환 측량(도해) 계산예(구지역, 1필지 7,000㎡ 임야→토지)", + "기준": "", + "출처": "건설품셈 토목 9-8-1 계산예", + "조건": { + "구분": "고르기" + }, + "값칸": { + "수량(T)": "", + "단가": "", + "금액": "" + }, + "줄": [ + { + "구분": "지적기사", + "수량(T)": "0.76×2.00=1.52", + "단가": "w_1", + "금액": "W_1=1.52×w_1" + }, + { + "구분": "지적산업기사", + "수량(T)": "0.81×2.00=1.62", + "단가": "w_2", + "금액": "W_2=1.62×w_2" + }, + { + "구분": "지적기능사", + "수량(T)": "0.46×2.00=0.92", + "단가": "w_3", + "금액": "W_3=0.92×w_3" + }, + { + "구분": "계", + "금액": "∑W" + } + ], + "주": [ + "㉠기본계수:1.00, ㉡등록계수:0.00, ㉢지역구분계수:0.40, ㉣면적계수:0.60. 합계 : 2.00 = (㉠+㉡+㉢+㉣)." + ] + }, + { + "열쇠": "9-8-2 등록전환 측량(수치)", + "이름": "등록전환 측량(수치)", + "기준": "1필지당 1,500㎡", + "출처": "건설품셈 토목 9-8-2", + "조건": { + "작업별": "고르기", + "세부": "고르기", + "직종": "고르기" + }, + "값칸": { + "값": "" + }, + "줄": [ + { + "작업별": "자료조사", + "직종": "지적기사", + "값": "(0.05)" + }, + { + "작업별": "자료조사", + "직종": "지적산업기사", + "값": "(0.06)" + }, + { + "작업별": "측량계획 및 준비", + "직종": "지적기사", + "값": "(0.04)" + }, + { + "작업별": "측량계획 및 준비", + "직종": "지적산업기사", + "값": "(0.02)" + }, + { + "작업별": "측량준비도 작성", + "직종": "지적기사", + "값": "(0.02)" + }, + { + "작업별": "측량준비도 작성", + "직종": "지적산업기사", + "값": "(0.03)" + }, + { + "작업별": "현지측량 준비", + "직종": "지적기사", + "값": 0.01 + }, + { + "작업별": "현지측량 준비", + "직종": "지적산업기사", + "값": 0.02 + }, + { + "작업별": "현지측량 준비", + "직종": "지적기능사", + "값": 0.01 + }, + { + "작업별": "현지측량", + "직종": "지적기사", + "값": 0.45 + }, + { + "작업별": "현지측량", + "직종": "지적산업기사", + "값": 0.45 + }, + { + "작업별": "현지측량", + "직종": "지적기능사", + "값": 0.45 + }, + { + "작업별": "성과설명", + "직종": "지적기사", + "값": 0.05 + }, + { + "작업별": "측량결과도 등 측량성과물 작성", + "직종": "지적기사", + "값": "(0.07)" + }, + { + "작업별": "측량결과도 등 측량성과물 작성", + "직종": "지적산업기사", + "값": "(0.15)" + }, + { + "작업별": "측량성과 관련서류 작성", + "직종": "지적산업기사", + "값": "(0.02)" + }, + { + "작업별": "측량성과 검사요청", + "직종": "지적기사", + "값": "(0.03)" + }, + { + "작업별": "측량성과 검사요청", + "직종": "지적산업기사", + "값": "(0.05)" + }, + { + "작업별": "지적측량 성과도교부", + "직종": "지적기사", + "값": "(0.03)" + }, + { + "작업별": "지적측량 성과도교부", + "직종": "지적산업기사", + "값": "(0.01)" + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적기사", + "값": 0.51 + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적산업기사", + "값": 0.47 + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적기능사", + "값": 0.46 + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적기사", + "값": "(0.24)" + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적산업기사", + "값": "(0.34)" + }, + { + "작업별": "합계", + "직종": "지적기사", + "값": 0.75 + }, + { + "작업별": "합계", + "직종": "지적산업기사", + "값": 0.81 + }, + { + "작업별": "합계", + "직종": "지적기능사", + "값": 0.46 + } + ], + "주": [ + "( )는 내업임.", + "본 품은 「공간정보의 구축 및 관리 등에 관한 법률」 제2조 제30호의 규정에 의하여 임야대장 및 임야도에 등록된 토지를 수치로 등록하기 위하여 경위의 측량방법으로 실시하는 측량 품이다.", + "n은 가산횟수로 (대상면적-기준면적)÷기준면적.", + "본 품에는 등록전환 측량결과도 및 계산부 1부, 좌표면적계산부 1부, 이동지조서 3부, 지적공부정리파일 1식, 측량결과부(측량성과도 등) 1부의 성과작성품이 포함되어 있다.", + "등록전환할 토지의 축척은 1/500, 1/1000로 구분한다.", + "본 품에 사용되는 기계경비 및 재료소모품비는 별도 계상한다.", + "작업상 지적측량기준점을 설치할 경우에는 지적측량기준점 설치비를 별도 계상한다.", + "도서지역 등의 측량을 위하여 선박 등을 임차할 경우에는 임차료 실비를 별도 계상한다.", + "본 품의 외업에 필요한 여비는 공무원여비규정에 의한 국내여행자의 일비를 별도 계상한다." + ] + }, + { + "열쇠": "9-8-2 면적계수", + "이름": "등록전환 측량(수치) 면적계수", + "기준": "", + "출처": "건설품셈 토목 9-8-2 주②", + "조건": { + "가산횟수": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "가산횟수": "0회", + "계수": 1.0 + }, + { + "가산횟수": "1회", + "계수": 1.3 + }, + { + "가산횟수": "2회이상", + "계수": "1.2+(0.10×n)" + } + ], + "주": [] + }, + { + "열쇠": "9-8-2 지역구분계수", + "이름": "등록전환 측량(수치) 지역구분계수", + "기준": "", + "출처": "건설품셈 토목 9-8-2 주③", + "조건": { + "구분": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "구분": "면", + "계수": 1.0 + }, + { + "구분": "읍", + "계수": 1.1 + }, + { + "구분": "동시", + "계수": 1.3 + }, + { + "구분": "동구", + "계수": 1.4 + } + ], + "주": [] + }, + { + "열쇠": "9-9-1 분할측량(도해)", + "이름": "분할측량(도해)", + "기준": "1필지당(토지1,500㎡·임야5,000㎡)", + "출처": "건설품셈 토목 9-9-1", + "조건": { + "작업별": "고르기", + "세부": "고르기", + "직종": "고르기" + }, + "값칸": { + "값": "" + }, + "줄": [ + { + "작업별": "자료조사", + "직종": "지적기사", + "값": "(0.04)" + }, + { + "작업별": "자료조사", + "직종": "지적산업기사", + "값": "(0.05)" + }, + { + "작업별": "측량계획 및 준비", + "직종": "지적기사", + "값": "(0.04)" + }, + { + "작업별": "측량계획 및 준비", + "직종": "지적산업기사", + "값": "(0.03)" + }, + { + "작업별": "측량준비도 작성", + "직종": "지적기사", + "값": "(0.02)" + }, + { + "작업별": "측량준비도 작성", + "직종": "지적산업기사", + "값": "(0.03)" + }, + { + "작업별": "현지측량 준비", + "직종": "지적기사", + "값": 0.01 + }, + { + "작업별": "현지측량 준비", + "직종": "지적산업기사", + "값": 0.02 + }, + { + "작업별": "현지측량 준비", + "직종": "지적기능사", + "값": 0.01 + }, + { + "작업별": "현지측량", + "직종": "지적기사", + "값": 0.45 + }, + { + "작업별": "현지측량", + "직종": "지적산업기사", + "값": 0.45 + }, + { + "작업별": "현지측량", + "직종": "지적기능사", + "값": 0.45 + }, + { + "작업별": "성과설명", + "직종": "지적기사", + "값": 0.05 + }, + { + "작업별": "측량결과도 등 측량성과물 작성", + "직종": "지적기사", + "값": "(0.07)" + }, + { + "작업별": "측량결과도 등 측량성과물 작성", + "직종": "지적산업기사", + "값": "(0.15)" + }, + { + "작업별": "측량성과 관련서류 작성", + "직종": "지적산업기사", + "값": 0.02 + }, + { + "작업별": "측량성과 검사요청", + "직종": "지적기사", + "값": "(0.03)" + }, + { + "작업별": "측량성과 검사요청", + "직종": "지적산업기사", + "값": "(0.04)" + }, + { + "작업별": "지적측량 성과도교부", + "직종": "지적기사", + "값": "(0.02)" + }, + { + "작업별": "지적측량 성과도교부", + "직종": "지적산업기사", + "값": "(0.02)" + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적기사", + "값": 0.51 + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적산업기사", + "값": 0.47 + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적기능사", + "값": 0.46 + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적기사", + "값": "(0.22)" + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적산업기사", + "값": "(0.34)" + }, + { + "작업별": "합계", + "직종": "지적기사", + "값": 0.73 + }, + { + "작업별": "합계", + "직종": "지적산업기사", + "값": 0.81 + }, + { + "작업별": "합계", + "직종": "지적기능사", + "값": 0.46 + } + ], + "주": [ + "( )는 내업임.", + "본 품은 「공간정보의 구축 및 관리 등에 관한 법률」 제2조 제31호의 규정에 의하여 지적공부에 등록된 도해지역의 1필지를 2필지 이상으로 나누어 등록하기 위한 측량 품이다.", + "n은 가산횟수로 (대상면적-기준면적)÷기준면적.", + "본 품에는 분할측량결과도 1부, 면적측정부 1부, 이동지조서 3부, 지적공부정리파일 1식, 측량결과부(측량성과도 등) 1부의 성과작성품이 포함되어 있다.", + "분할측량할 토지의 축척은 1/600, 1/1000, 1/1200, 1/2400, 1/3000, 1/6000로 구분한다.", + "본 품은 분할후 2필지를 기준으로 하여 1필지단위로 본 산출품에 의한 측량비용을 적용하고, 1필지 추가 될 때마다 본 품에 의한 측량비를 가산한다.", + "인가·허가 면적 등을 도상에서 맞추어 분할선을 현장에 표시하는 경우에는 본 품에 의한 측량비의 40%를 가산 적용한다.", + "분할(예정)선을 도상에서 맞추어 현장에 표시하는 지정분할의 경우에는 본 품에 의한 측량비의 30%를 가산 적용한다.", + "도해지역에서 도시계획시설(도로, 하천, 공원 등)에 편입된 면적을 현장측량을 수반하지 않고 계획도면상으로 면적을 측정하여 성과를 작성하는 시설편입지측량(도해)의 경우 본 품의 내업품을 적용한다.", + "본 품에 사용되는 기계경비 및 재료소모품비는 별도 계상한다.", + "작업상 지적측량기준점을 설치할 경우에는 지적측량기준점 설치비를 별도 계상한다.", + "도서지역 등의 측량을 위하여 선박 등을 임차할 경우에는 임차료 실비를 별도 계상한다.", + "본 품의 외업에 필요한 여비는 공무원여비규정에 의한 국내여행자의 일비를 별도 계상한다.", + "[결정단가] = (∑W+직접경비+간접측량비)/2." + ] + }, + { + "열쇠": "9-9-1 면적계수", + "이름": "분할측량(도해) 면적계수", + "기준": "", + "출처": "건설품셈 토목 9-9-1 주②", + "조건": { + "가산횟수": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "가산횟수": "0회", + "계수": 1.0 + }, + { + "가산횟수": "1회", + "계수": 1.3 + }, + { + "가산횟수": "2회이상", + "계수": "1.2+(0.10×n)" + } + ], + "주": [] + }, + { + "열쇠": "9-9-1 등록계수", + "이름": "분할측량(도해) 등록계수", + "기준": "", + "출처": "건설품셈 토목 9-9-1 주③", + "조건": { + "구분": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "구분": "토지", + "계수": 1.0 + }, + { + "구분": "임야", + "계수": 1.2 + } + ], + "주": [] + }, + { + "열쇠": "9-9-1 지역구분계수", + "이름": "분할측량(도해) 지역구분계수", + "기준": "", + "출처": "건설품셈 토목 9-9-1 주④", + "조건": { + "구분": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "구분": "면", + "계수": 1.0 + }, + { + "구분": "읍", + "계수": 1.1 + }, + { + "구분": "동시", + "계수": 1.3 + }, + { + "구분": "동구", + "계수": 1.4 + } + ], + "주": [] + }, + { + "열쇠": "9-9-1 계산예", + "이름": "분할측량(도해) 계산예(구지역, 1필지 6,000㎡ 토지를 2필지로 분할)", + "기준": "", + "출처": "건설품셈 토목 9-9-1 계산예", + "조건": { + "구분": "고르기" + }, + "값칸": { + "수량(T)": "", + "단가": "", + "금액": "" + }, + "줄": [ + { + "구분": "지적기사", + "수량(T)": "0.73×2.00=1.46", + "단가": "w_1", + "금액": "W_1=1.46×w_1" + }, + { + "구분": "지적산업기사", + "수량(T)": "0.81×2.00=1.62", + "단가": "w_2", + "금액": "W_2=1.62×w_2" + }, + { + "구분": "지적기능사", + "수량(T)": "0.46×2.00=0.92", + "단가": "w_3", + "금액": "W_3=0.92×w_3" + }, + { + "구분": "계", + "금액": "∑W" + } + ], + "주": [ + "㉠기본계수:1.00, ㉡등록계수:0.00, ㉢지역구분계수:0.40, ㉣면적계수:0.60. 합계 : 2.00 = (㉠+㉡+㉢+㉣)." + ] + }, + { + "열쇠": "9-9-2 분할측량(수치)", + "이름": "분할측량(수치)", + "기준": "1필지당 1,500㎡", + "출처": "건설품셈 토목 9-9-2", + "조건": { + "작업별": "고르기", + "세부": "고르기", + "직종": "고르기" + }, + "값칸": { + "값": "" + }, + "줄": [ + { + "작업별": "자료조사", + "직종": "지적기사", + "값": "(0.04)" + }, + { + "작업별": "자료조사", + "직종": "지적산업기사", + "값": "(0.05)" + }, + { + "작업별": "측량계획 및 준비", + "직종": "지적기사", + "값": "(0.04)" + }, + { + "작업별": "측량계획 및 준비", + "직종": "지적산업기사", + "값": "(0.02)" + }, + { + "작업별": "측량준비도 작성", + "직종": "지적기사", + "값": "(0.01)" + }, + { + "작업별": "측량준비도 작성", + "직종": "지적산업기사", + "값": "(0.04)" + }, + { + "작업별": "현지측량 준비", + "직종": "지적기사", + "값": 0.01 + }, + { + "작업별": "현지측량 준비", + "직종": "지적산업기사", + "값": 0.02 + }, + { + "작업별": "현지측량 준비", + "직종": "지적기능사", + "값": 0.01 + }, + { + "작업별": "현지측량", + "직종": "지적기사", + "값": 0.38 + }, + { + "작업별": "현지측량", + "직종": "지적산업기사", + "값": 0.38 + }, + { + "작업별": "현지측량", + "직종": "지적기능사", + "값": 0.38 + }, + { + "작업별": "성과설명", + "직종": "지적기사", + "값": 0.05 + }, + { + "작업별": "측량결과도 등 측량성과물 작성", + "직종": "지적기사", + "값": "(0.06)" + }, + { + "작업별": "측량결과도 등 측량성과물 작성", + "직종": "지적산업기사", + "값": "(0.15)" + }, + { + "작업별": "측량성과 관련서류 작성", + "직종": "지적산업기사", + "값": "(0.02)" + }, + { + "작업별": "측량성과 검사요청", + "직종": "지적기사", + "값": "(0.03)" + }, + { + "작업별": "측량성과 검사요청", + "직종": "지적산업기사", + "값": "(0.05)" + }, + { + "작업별": "지적측량 성과도교부", + "직종": "지적기사", + "값": "(0.03)" + }, + { + "작업별": "지적측량 성과도교부", + "직종": "지적산업기사", + "값": "(0.01)" + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적기사", + "값": 0.44 + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적산업기사", + "값": 0.4 + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적기능사", + "값": 0.39 + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적기사", + "값": "(0.21)" + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적산업기사", + "값": "(0.34)" + }, + { + "작업별": "합계", + "직종": "지적기사", + "값": 0.65 + }, + { + "작업별": "합계", + "직종": "지적산업기사", + "값": 0.74 + }, + { + "작업별": "합계", + "직종": "지적기능사", + "값": 0.39 + } + ], + "주": [ + "( )는 내업임.", + "본 품은 「공간정보의 구축 및 관리 등에 관한 법률」 제2조 제31호의 규정에 의하여 지적공부에 등록된 수치지역의 1필지를 2필지 이상으로 나누어 등록하기 위한 측량 품이다.", + "n은 가산횟수로 (대상면적-기준면적)÷기준면적.", + "본 품에는 분할측량결과도 및 계산부 1부, 좌표면적계산부 1부, 이동지조서 3부, 지적공부정리파일 1식, 측량결과부(측량성과도 등) 1부의 성과작성품이 포함되어 있다.", + "분할측량할 토지의 축척은 1/500, 1/1000로 구분한다.", + "본 품은 분할후 2필지를 기준으로 하여 1필지단위로 본 산출품에 의한 측량비용을 적용하고, 1필지 추가 될 때마다 본 품에 의한 측량비를 가산한다.", + "인가·허가 면적 등을 도상에서 맞추어 분할선을 현장에 표시하는 경우에는 본 품에 의한 측량비의 40%를 가산 적용한다.", + "분할(예정)선을 도상에서 맞추어 현장에 표시하는 지정분할의 경우에는 본 품에 의한 측량비의 30%를 가산 적용한다.", + "수치지역에서 도시계획시설(도로, 하천, 공원 등)에 편입된 면적을 현장측량을 수반하지 않고 계획도면상으로 면적을 측정하여 성과를 작성하는 시설편입지면적측정(수치)의 경우 본 품의 내업품을 적용한다.", + "본 품에 사용되는 기계경비 및 재료소모품비는 별도 계상한다.", + "작업상 지적측량기준점을 설치할 경우에는 지적측량기준점 설치비를 별도 계상한다.", + "도서지역 등의 측량을 위하여 선박 등을 임차할 경우에는 임차료 실비를 별도 계상한다.", + "본 품의 외업에 필요한 여비는 공무원여비규정에 의한 국내여행자의 일비를 별도 계상한다.", + "[결정단가] = (∑W+직접경비+간접측량비)/2." + ] + }, + { + "열쇠": "9-9-2 면적계수", + "이름": "분할측량(수치) 면적계수", + "기준": "", + "출처": "건설품셈 토목 9-9-2 주②", + "조건": { + "가산횟수": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "가산횟수": "0회", + "계수": 1.0 + }, + { + "가산횟수": "1회", + "계수": 1.3 + }, + { + "가산횟수": "2회이상", + "계수": "1.2+(0.10×n)" + } + ], + "주": [] + }, + { + "열쇠": "9-9-2 지역구분계수", + "이름": "분할측량(수치) 지역구분계수", + "기준": "", + "출처": "건설품셈 토목 9-9-2 주③", + "조건": { + "구분": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "구분": "면", + "계수": 1.0 + }, + { + "구분": "읍", + "계수": 1.1 + }, + { + "구분": "동시", + "계수": 1.3 + }, + { + "구분": "동구", + "계수": 1.4 + } + ], + "주": [] + }, + { + "열쇠": "9-9-2 계산예", + "이름": "분할측량(수치) 계산예(구지역·수치지역, 1필지 7,000㎡ 토지를 2필지로 분할)", + "기준": "", + "출처": "건설품셈 토목 9-9-2 계산예", + "조건": { + "구분": "고르기" + }, + "값칸": { + "수량(T)": "", + "단가": "", + "금액": "" + }, + "줄": [ + { + "구분": "지적기사", + "수량(T)": "0.65×2.00=1.30", + "단가": "w_1", + "금액": "W_1=1.30×w_1" + }, + { + "구분": "지적산업기사", + "수량(T)": "0.74×2.00=1.48", + "단가": "w_2", + "금액": "W_2=1.48×w_2" + }, + { + "구분": "지적기능사", + "수량(T)": "0.39×2.00=0.78", + "단가": "w_3", + "금액": "W_3=0.78×w_3" + }, + { + "구분": "계", + "금액": "∑W" + } + ], + "주": [ + "㉠기본계수:1.00, ㉡등록계수:0.00, ㉢지역구분계수:0.40, ㉣면적계수:0.60. 합계 1.90 = (㉠+㉡+㉢+㉣)(원문 그대로 1.90, 넷을 더하면 2.00, 아래 표는 ×2.00)." + ] + }, + { + "열쇠": "9-10-1 축척변경 측량(도해→도해)", + "이름": "축척변경 측량(도해지역에서 도해지역으로)", + "기준": "1필지당(토지1,500㎡·임야5,000㎡)", + "출처": "건설품셈 토목 9-10-1", + "조건": { + "작업별": "고르기", + "세부": "고르기", + "직종": "고르기" + }, + "값칸": { + "값": "" + }, + "줄": [ + { + "작업별": "자료조사", + "직종": "지적기사", + "값": "(0.04)" + }, + { + "작업별": "자료조사", + "직종": "지적산업기사", + "값": "(0.05)" + }, + { + "작업별": "측량계획 및 준비", + "직종": "지적기사", + "값": "(0.04)" + }, + { + "작업별": "측량계획 및 준비", + "직종": "지적산업기사", + "값": "(0.03)" + }, + { + "작업별": "측량준비도 작성", + "직종": "지적기사", + "값": "(0.02)" + }, + { + "작업별": "측량준비도 작성", + "직종": "지적산업기사", + "값": "(0.03)" + }, + { + "작업별": "현지측량 준비", + "직종": "지적기사", + "값": 0.01 + }, + { + "작업별": "현지측량 준비", + "직종": "지적산업기사", + "값": 0.02 + }, + { + "작업별": "현지측량 준비", + "직종": "지적기능사", + "값": 0.01 + }, + { + "작업별": "현지측량", + "직종": "지적기사", + "값": 0.4 + }, + { + "작업별": "현지측량", + "직종": "지적산업기사", + "값": 0.4 + }, + { + "작업별": "현지측량", + "직종": "지적기능사", + "값": 0.4 + }, + { + "작업별": "성과설명", + "직종": "지적기사", + "값": 0.06 + }, + { + "작업별": "측량결과도 등 측량성과물 작성", + "직종": "지적기사", + "값": "(0.07)" + }, + { + "작업별": "측량결과도 등 측량성과물 작성", + "직종": "지적산업기사", + "값": "(0.15)" + }, + { + "작업별": "성과 관련 서류작성", + "직종": "지적산업기사", + "값": "(0.02)" + }, + { + "작업별": "측량성과 검사요청", + "직종": "지적기사", + "값": "(0.03)" + }, + { + "작업별": "측량성과 검사요청", + "직종": "지적산업기사", + "값": "(0.04)" + }, + { + "작업별": "지적측량 성과도교부", + "직종": "지적기사", + "값": "(0.02)" + }, + { + "작업별": "지적측량 성과도교부", + "직종": "지적산업기사", + "값": "(0.02)" + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적기사", + "값": 0.47 + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적산업기사", + "값": 0.42 + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적기능사", + "값": 0.41 + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적기사", + "값": "(0.22)" + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적산업기사", + "값": "(0.34)" + }, + { + "작업별": "합계", + "직종": "지적기사", + "값": 0.69 + }, + { + "작업별": "합계", + "직종": "지적산업기사", + "값": 0.76 + }, + { + "작업별": "합계", + "직종": "지적기능사", + "값": 0.41 + } + ], + "주": [ + "( )는 내업임.", + "본 품은 「공간정보의 구축 및 관리 등에 관한 법률」 제2조 제34호 규정에 의하여 지적도에 등록된 경계점의 정밀도를 높이기 위하여 작은 축척을 큰축척으로 변경하여 등록하기 위해서 도해측량방법으로 실시하는 측량 품이다.", + "n은 가산횟수로 (대상면적-기준면적)÷기준면적.", + "본 품에는 축척변경 측량결과도 1부, 측량결과부(측량성과도 등) 1부의 성과작성품이 포함되어 있다.", + "축척변경 할 토지의 축척은 1/500, 1/600, 1/1000, 1/1200, 1/2400로 구분한다.", + "본 품에 사용되는 기계경비 및 재료소모품비는 별도 계상한다.", + "본 품의 외업에 필요한 여비는 공무원여비규정에 의한 국내여행자의 일비를 별도 계상한다.", + "작업상 지적측량기준점을 설치할 경우에는 지적측량기준점 설치비를 별도 계상한다.", + "도서지역 등의 측량을 위하여 선박 등을 임차할 경우에는 임차료 실비를 별도 계상한다." + ] + }, + { + "열쇠": "9-10-1 면적계수", + "이름": "축척변경 측량(도해→도해) 면적계수", + "기준": "", + "출처": "건설품셈 토목 9-10-1 주②", + "조건": { + "가산횟수": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "가산횟수": "0회", + "계수": 1.0 + }, + { + "가산횟수": "1회", + "계수": 1.3 + }, + { + "가산횟수": "2회이상", + "계수": "1.2+(0.10×n)" + } + ], + "주": [] + }, + { + "열쇠": "9-10-1 등록계수", + "이름": "축척변경 측량(도해→도해) 등록계수", + "기준": "", + "출처": "건설품셈 토목 9-10-1 주③", + "조건": { + "구분": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "구분": "토지", + "계수": 1.0 + }, + { + "구분": "임야", + "계수": 1.2 + } + ], + "주": [] + }, + { + "열쇠": "9-10-1 지역구분계수", + "이름": "축척변경 측량(도해→도해) 지역구분계수", + "기준": "", + "출처": "건설품셈 토목 9-10-1 주④", + "조건": { + "구분": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "구분": "면", + "계수": 1.0 + }, + { + "구분": "읍", + "계수": 1.1 + }, + { + "구분": "동시", + "계수": 1.3 + }, + { + "구분": "동구", + "계수": 1.4 + } + ], + "주": [] + }, + { + "열쇠": "9-10-2 축척변경 측량(도해→수치)", + "이름": "축척변경 측량(도해지역에서 수치지역으로)", + "기준": "1필지당 1,500㎡", + "출처": "건설품셈 토목 9-10-2", + "조건": { + "작업별": "고르기", + "세부": "고르기", + "직종": "고르기" + }, + "값칸": { + "값": "" + }, + "줄": [ + { + "작업별": "자료조사", + "직종": "지적기사", + "값": "(0.04)" + }, + { + "작업별": "자료조사", + "직종": "지적산업기사", + "값": "(0.05)" + }, + { + "작업별": "측량계획 및 준비", + "직종": "지적기사", + "값": "(0.04)" + }, + { + "작업별": "측량계획 및 준비", + "직종": "지적산업기사", + "값": "(0.02)" + }, + { + "작업별": "측량준비도 작성", + "직종": "지적기사", + "값": "(0.01)" + }, + { + "작업별": "측량준비도 작성", + "직종": "지적산업기사", + "값": "(0.04)" + }, + { + "작업별": "현지측량 준비", + "직종": "지적기사", + "값": 0.01 + }, + { + "작업별": "현지측량 준비", + "직종": "지적산업기사", + "값": 0.02 + }, + { + "작업별": "현지측량 준비", + "직종": "지적기능사", + "값": 0.01 + }, + { + "작업별": "현지측량", + "직종": "지적기사", + "값": 0.44 + }, + { + "작업별": "현지측량", + "직종": "지적산업기사", + "값": 0.44 + }, + { + "작업별": "현지측량", + "직종": "지적기능사", + "값": 0.44 + }, + { + "작업별": "성과설명", + "직종": "지적기사", + "값": 0.06 + }, + { + "작업별": "측량결과도 등 측량성과물 작성", + "직종": "지적기사", + "값": "(0.06)" + }, + { + "작업별": "측량결과도 등 측량성과물 작성", + "직종": "지적산업기사", + "값": "(0.15)" + }, + { + "작업별": "성과 관련 서류작성", + "직종": "지적산업기사", + "값": "(0.02)" + }, + { + "작업별": "측량성과 검사요청", + "직종": "지적기사", + "값": "(0.03)" + }, + { + "작업별": "측량성과 검사요청", + "직종": "지적산업기사", + "값": "(0.05)" + }, + { + "작업별": "지적측량 성과도교부", + "직종": "지적기사", + "값": "(0.03)" + }, + { + "작업별": "지적측량 성과도교부", + "직종": "지적산업기사", + "값": "(0.01)" + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적기사", + "값": 0.51 + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적산업기사", + "값": 0.46 + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적기능사", + "값": 0.45 + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적기사", + "값": "(0.21)" + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적산업기사", + "값": "(0.34)" + }, + { + "작업별": "합계", + "직종": "지적기사", + "값": 0.72 + }, + { + "작업별": "합계", + "직종": "지적산업기사", + "값": 0.8 + }, + { + "작업별": "합계", + "직종": "지적기능사", + "값": 0.45 + } + ], + "주": [ + "( )는 내업임.", + "본 품은 「공간정보의 구축 및 관리 등에 관한 법률」 제2조 제34호 규정에 의하여 지적도에 등록된 경계점의 정밀도를 높이기 위하여 작은 축척을 큰축척으로 변경하여 수치로 등록하기 위해서 경위의 측량방법으로 실시하는 측량 품이다.", + "n은 가산횟수로 (대상면적-기준면적)÷기준면적.", + "본 품에는 축척변경 측량결과도 및 계산부 1부, 측량결과부(측량성과도 등) 1부, 좌표면적계산부 1부의 성과작성품이 포함되어 있다.", + "축척변경 할 토지의 축척은 1/500, 1/1000로 구분한다.", + "본 품에 사용되는 기계경비 및 재료소모품비는 별도 계상한다.", + "작업상 지적측량기준점을 설치할 경우에는 지적측량기준점 설치비를 별도 계상한다.", + "도서지역 등의 측량을 위하여 선박 등을 임차할 경우에는 임차료 실비를 별도 계상한다.", + "본 품의 외업에 필요한 여비는 공무원여비규정에 의한 국내여행자의 일비를 별도 계상한다." + ] + }, + { + "열쇠": "9-10-2 면적계수", + "이름": "축척변경 측량(도해→수치) 면적계수", + "기준": "", + "출처": "건설품셈 토목 9-10-2 주②", + "조건": { + "가산횟수": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "가산횟수": "0회", + "계수": 1.0 + }, + { + "가산횟수": "1회", + "계수": 1.3 + }, + { + "가산횟수": "2회이상", + "계수": "1.2+(0.10×n)" + } + ], + "주": [] + }, + { + "열쇠": "9-10-2 지역구분계수", + "이름": "축척변경 측량(도해→수치) 지역구분계수", + "기준": "", + "출처": "건설품셈 토목 9-10-2 주③", + "조건": { + "구분": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "구분": "면", + "계수": 1.0 + }, + { + "구분": "읍", + "계수": 1.1 + }, + { + "구분": "동시", + "계수": 1.3 + }, + { + "구분": "동구", + "계수": 1.4 + } + ], + "주": [] + }, + { + "열쇠": "9-11-1 토지구획정리 지적확정측량", + "이름": "토지구획정리 지적확정측량", + "기준": "1지구 100,000㎡", + "출처": "건설품셈 토목 9-11-1", + "조건": { + "작업별": "고르기", + "세부": "고르기", + "직종": "고르기" + }, + "값칸": { + "값": "" + }, + "줄": [ + { + "작업별": "계획준비", + "직종": "지적기사", + "값": "(3.43)" + }, + { + "작업별": "계획준비", + "직종": "지적산업기사", + "값": "(3.43)" + }, + { + "작업별": "자료조사", + "직종": "지적산업기사", + "값": "(4.04)" + }, + { + "작업별": "현장조사", + "직종": "지적기사", + "값": 3.41 + }, + { + "작업별": "현장조사", + "직종": "지적산업기사", + "값": 6.82 + }, + { + "작업별": "지적전산파일변환", + "직종": "지적산업기사", + "값": "(3.59)" + }, + { + "작업별": "지구계준비도", + "세부": "작성", + "직종": "지적산업기사", + "값": "(6.20)" + }, + { + "작업별": "지구계준비도", + "세부": "확인", + "직종": "지적기사", + "값": "(0.92)" + }, + { + "작업별": "지구계", + "세부": "측량", + "직종": "지적기사", + "값": 7.04 + }, + { + "작업별": "지구계", + "세부": "측량", + "직종": "지적산업기사", + "값": 14.08 + }, + { + "작업별": "지구계", + "세부": "측량", + "직종": "지적기능사", + "값": 7.04 + }, + { + "작업별": "지구계", + "세부": "결과도작성", + "직종": "지적기사", + "값": "(6.59)" + }, + { + "작업별": "지구계", + "세부": "결과도작성", + "직종": "지적산업기사", + "값": "(6.59)" + }, + { + "작업별": "가구점", + "세부": "측량", + "직종": "지적기사", + "값": 9.36 + }, + { + "작업별": "가구점", + "세부": "측량", + "직종": "지적산업기사", + "값": 18.72 + }, + { + "작업별": "가구점", + "세부": "측량", + "직종": "지적기능사", + "값": 9.36 + }, + { + "작업별": "가구점", + "세부": "계산", + "직종": "지적기사", + "값": "(10.88)" + }, + { + "작업별": "가구점", + "세부": "계산", + "직종": "지적산업기사", + "값": "(10.88)" + }, + { + "작업별": "필계점", + "세부": "측량", + "직종": "지적기사", + "값": 15.14 + }, + { + "작업별": "필계점", + "세부": "측량", + "직종": "지적산업기사", + "값": "30.28)" + }, + { + "작업별": "필계점", + "세부": "측량", + "직종": "지적기능사", + "값": 15.14 + }, + { + "작업별": "필계점", + "세부": "계산", + "직종": "지적기사", + "값": "(10.91)" + }, + { + "작업별": "필계점", + "세부": "계산", + "직종": "지적산업기사", + "값": "(10.91)" + }, + { + "작업별": "중심점계산", + "직종": "지적기사", + "값": "(8.41)" + }, + { + "작업별": "중심점계산", + "직종": "지적산업기사", + "값": "(8.41)" + }, + { + "작업별": "말박기측량", + "세부": "측량", + "직종": "지적기사", + "값": 6.5 + }, + { + "작업별": "말박기측량", + "세부": "측량", + "직종": "지적산업기사", + "값": 13.0 + }, + { + "작업별": "말박기측량", + "세부": "측량", + "직종": "지적기능사", + "값": 6.5 + }, + { + "작업별": "말박기측량", + "세부": "계산", + "직종": "지적기사", + "값": "(9.45)" + }, + { + "작업별": "말박기측량", + "세부": "계산", + "직종": "지적산업기사", + "값": "(9.45)" + }, + { + "작업별": "좌표면적계산", + "직종": "지적기사", + "값": "(8.44)" + }, + { + "작업별": "좌표면적계산", + "직종": "지적산업기사", + "값": "(8.44)" + }, + { + "작업별": "결과도작성", + "직종": "지적산업기사", + "값": "(6.20)" + }, + { + "작업별": "성과작성", + "직종": "지적산업기사", + "값": "(16.42)" + }, + { + "작업별": "조서작성", + "직종": "지적산업기사", + "값": "(11.78)" + }, + { + "작업별": "납품도서류작성", + "직종": "지적산업기사", + "값": "(20.08)" + }, + { + "작업별": "점검", + "직종": "지적기사", + "값": "(5.02)" + }, + { + "작업별": "성과설명 및 인계", + "직종": "지적기사", + "값": "(2.58)" + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적기사", + "값": 41.45 + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적산업기사", + "값": 82.9 + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적기능사", + "값": 38.04 + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적기사", + "값": "(66.63)" + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적산업기사", + "값": "(126.42)" + }, + { + "작업별": "합계", + "직종": "지적기사", + "값": 108.08 + }, + { + "작업별": "합계", + "직종": "지적산업기사", + "값": 209.32 + }, + { + "작업별": "합계", + "직종": "지적기능사", + "값": 38.04 + } + ], + "주": [ + "( )는 내업임. 원문 그대로: 필계점 측량 지적산업기사 칸 「30.28)」(여는 괄호 없음).", + "토지구획정리 지적확정측량이라 함은 「공간정보의 구축 및 관리 등에 관한 법률」 제86조 규정에 의한 도시개발사업 및 같은 법 시행령 제83조의 규정에 의한 토지개발사업에 따른 경계점좌표등록부에 토지의 표시를 새로 등록하기 위하여 실시하는 세부측량을 말한다.", + "본 품의 기준면적은 1지구 100,000㎡를 기준한 것으로 초과하는 경우 면적체감계수를 곱하여 각각 합산한 품으로 하며, 작업과정이 동일한 방법으로 연속되지 않을 경우에는 체감계수를 적용하지 않는다.", + "축척은 1/500로 한다. 다만, 부적당하다고 인정될 때에는 사전 시·도와 협의하여 인접지의 도면 축척으로 시행할 수 있다.", + "면적계산은 좌표를 면적프로그램에 의하여 컴퓨터로 계산, 좌표점 전개는 프로그램에 의하여 전개, 거리측정 등의 측량기계는 토탈스테이션·광파측거기·각 관측 장비, 지적도 작성은 자동제도기에 의한 것이다.", + "본 품에는 지구계 분할측량품은 포함되어 있지 않다.", + "측량지구면적이 10,000㎡이하인 경우에는 10,000㎡의 품으로 한다.", + "말박기측량을 수반하지 않을 경우 말박기측량 품을 제외한다.", + "본 품에 사용되는 기계경비 및 재료소모품비는 별도 계상한다.", + "도서지역 등의 측량을 위하여 선박 등을 임차할 경우에는 임차료 실비를 별도 계상한다.", + "본 품의 외업에 필요한 여비는 공무원여비규정에 의한 국내여행자의 일비를 별도 계상한다.", + "본 품에 지적기준점측량이 포함되어 있지 않으므로 지적기준점측량을 실시할 경우에는 지적기준점측량비를 별도 계상한다." + ] + }, + { + "열쇠": "9-11-1 면적체감계수", + "이름": "토지구획정리 지적확정측량 면적체감계수", + "기준": "", + "출처": "건설품셈 토목 9-11-1 주②", + "조건": { + "구분": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "구분": "10만㎡이하", + "계수": 1.0 + }, + { + "구분": "10만㎡초과∼50만㎡", + "계수": 0.9 + }, + { + "구분": "50만㎡초과∼100만㎡", + "계수": 0.8 + }, + { + "구분": "100만㎡초과∼200만㎡", + "계수": 0.7 + }, + { + "구분": "200만㎡초과∼300만㎡", + "계수": 0.6 + }, + { + "구분": "300만㎡초과", + "계수": 0.5 + } + ], + "주": [] + }, + { + "열쇠": "9-11-1 계산예", + "이름": "토지구획정리 지적확정측량 계산예(면적 500,000㎡, 지적삼각3점·지적도근점200점)", + "기준": "", + "출처": "건설품셈 토목 9-11-1 계산예", + "조건": { + "구간": "고르기", + "구분": "고르기" + }, + "값칸": { + "수량(T)": "", + "단가": "", + "금액": "" + }, + "줄": [ + { + "구간": "기본단가(10만㎡까지)", + "구분": "지적기사", + "수량(T)": "108.08 × 1.0 = 108.08", + "단가": "w_1", + "금액": "W_1=108.08×w_1" + }, + { + "구간": "기본단가(10만㎡까지)", + "구분": "지적산업기사", + "수량(T)": "209.32 × 1.0 = 209.32", + "단가": "w_2", + "금액": "W_2=209.32×w_2" + }, + { + "구간": "기본단가(10만㎡까지)", + "구분": "지적기능사", + "수량(T)": "38.04 × 1.0 = 38.04", + "단가": "w_3", + "금액": "W_3=38.04×w_3" + }, + { + "구간": "체감계수적용단가(10만㎡초과50만㎡까지)", + "구분": "지적기사", + "수량(T)": "108.08 × 0.9 = 97.27", + "단가": "w_1", + "금액": "W_1=97.27×w_1" + }, + { + "구간": "체감계수적용단가(10만㎡초과50만㎡까지)", + "구분": "지적산업기사", + "수량(T)": "209.32 × 0.9 = 188.39", + "단가": "w_2", + "금액": "W_2=188.39×w_2" + }, + { + "구간": "체감계수적용단가(10만㎡초과50만㎡까지)", + "구분": "지적기능사", + "수량(T)": "38.04 × 0.9 = 34.24", + "단가": "w_3", + "금액": "W_3=34.24×w_3" + } + ], + "주": [ + "㉠기본계수(10만㎡까지):1.0, ㉡기본계수(10만㎡초과 50만㎡까지):0.9.", + "[결정단가] = (∑W+직접경비+간접측량비)/100,000㎡. [합계∑W_1] = (단가×100,000). [합계∑W_2] = (단가×400,000).", + "㉰ 지적삼각 측량비 : ∑W_3. ㉱ 지적도근 측량비 : ∑W_4. [총 계] = ∑W_1+∑W_2+∑W_3+∑W_4.", + "기준면적이 100,000㎡까지는 1㎡당 기본단가를, 100,000㎡를 초과하는 면적에 대해서는 체감계수가 적용된 단가로 측량비를 산출하여 전체 합산한다." + ] + }, + { + "열쇠": "9-11-2 경지구획정리 지적확정측량", + "이름": "경지구획정리 지적확정측량", + "기준": "1지구 1,000,000㎡", + "출처": "건설품셈 토목 9-11-2", + "조건": { + "작업별": "고르기", + "세부": "고르기", + "직종": "고르기" + }, + "값칸": { + "값": "" + }, + "줄": [ + { + "작업별": "계획준비", + "직종": "지적기사", + "값": "(2.63)" + }, + { + "작업별": "계획준비", + "직종": "지적산업기사", + "값": "(2.63)" + }, + { + "작업별": "자료조사", + "직종": "지적산업기사", + "값": "(6.82)" + }, + { + "작업별": "현장조사", + "직종": "지적기사", + "값": 2.76 + }, + { + "작업별": "현장조사", + "직종": "지적산업기사", + "값": 2.76 + }, + { + "작업별": "지적전산파일변환", + "직종": "지적산업기사", + "값": "(12.02)" + }, + { + "작업별": "지구계준비도", + "세부": "작성", + "직종": "지적기사", + "값": "(7.84)" + }, + { + "작업별": "지구계준비도", + "세부": "작성", + "직종": "지적산업기사", + "값": "(15.68)" + }, + { + "작업별": "지구계준비도", + "세부": "작성", + "직종": "지적기능사", + "값": "(7.84)" + }, + { + "작업별": "지구계준비도", + "세부": "확인", + "직종": "지적기사", + "값": "(1.05)" + }, + { + "작업별": "지구계", + "세부": "측량", + "직종": "지적기사", + "값": 10.29 + }, + { + "작업별": "지구계", + "세부": "측량", + "직종": "지적산업기사", + "값": 20.58 + }, + { + "작업별": "지구계", + "세부": "측량", + "직종": "지적기능사", + "값": 10.29 + }, + { + "작업별": "지구계", + "세부": "결과도작성", + "직종": "지적기사", + "값": "(15.50)" + }, + { + "작업별": "지구계", + "세부": "결과도작성", + "직종": "지적산업기사", + "값": "(31.00)" + }, + { + "작업별": "지구계", + "세부": "결과도작성", + "직종": "지적기능사", + "값": "(15.50)" + }, + { + "작업별": "필계점", + "세부": "측량", + "직종": "지적기사", + "값": 15.38 + }, + { + "작업별": "필계점", + "세부": "측량", + "직종": "지적산업기사", + "값": 30.76 + }, + { + "작업별": "필계점", + "세부": "측량", + "직종": "지적기능사", + "값": 15.38 + }, + { + "작업별": "필계점", + "세부": "계산", + "직종": "지적기사", + "값": "(16.73)" + }, + { + "작업별": "필계점", + "세부": "계산", + "직종": "지적산업기사", + "값": "(16.73)" + }, + { + "작업별": "좌표면적계산", + "직종": "지적기사", + "값": "(15.77)" + }, + { + "작업별": "좌표면적계산", + "직종": "지적산업기사", + "값": "(15.77)" + }, + { + "작업별": "결과도작성", + "직종": "지적기사", + "값": "(3.03)" + }, + { + "작업별": "결과도작성", + "직종": "지적산업기사", + "값": "(6.06)" + }, + { + "작업별": "결과도작성", + "직종": "지적기능사", + "값": "(3.03)" + }, + { + "작업별": "성과도작성", + "직종": "지적기사", + "값": "(9.70)" + }, + { + "작업별": "성과도작성", + "직종": "지적산업기사", + "값": "(19.40)" + }, + { + "작업별": "성과도작성", + "직종": "지적기능사", + "값": "(9.70)" + }, + { + "작업별": "조서작성", + "직종": "지적산업기사", + "값": "(11.78)" + }, + { + "작업별": "조서작성", + "직종": "지적기능사", + "값": "(5.89)" + }, + { + "작업별": "납품도서류작성", + "직종": "지적기사", + "값": "(8.46)" + }, + { + "작업별": "납품도서류작성", + "직종": "지적산업기사", + "값": "(16.92)" + }, + { + "작업별": "납품도서류작성", + "직종": "지적기능사", + "값": "(8.46)" + }, + { + "작업별": "점검", + "직종": "지적기사", + "값": "(5.66)" + }, + { + "작업별": "성과설명 및 인계", + "직종": "지적기사", + "값": "(1.40)" + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적기사", + "값": 28.43 + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적산업기사", + "값": 54.1 + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적기능사", + "값": 25.67 + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적기사", + "값": "(87.77)" + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적산업기사", + "값": "(154.81)" + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적기능사", + "값": "(50.42)" + }, + { + "작업별": "합계", + "직종": "지적기사", + "값": 116.2 + }, + { + "작업별": "합계", + "직종": "지적산업기사", + "값": 208.91 + }, + { + "작업별": "합계", + "직종": "지적기능사", + "값": 76.09 + } + ], + "주": [ + "( )는 내업임.", + "경지구획정리 지적확정측량이라 함은 「공간정보의 구축 및 관리 등에 관한 법률」 제86조 규정의 농어촌정비사업 중 「경지정리」 사업에 수반되는 세부측량을 말한다.", + "측량지구의 면적이 1,000,000㎡를 초과할 경우에는 면적체감계수를 곱하여 각각 합산한 품으로 한다. 작업과정이 동일한 방법으로 연속되지 않을 경우에는 체감계수를 적용하지 않는다.", + "경지구획정리의 축척은 1/1,000로 하되 필요한 경우에는 미리 시·도지사의 승인을 얻어 6천분의 1까지 작성할 수 있다.", + "면적계산은 좌표를 면적프로그램에 의하여 컴퓨터로 계산, 좌표점 전개는 프로그램을 활용, 거리측정 기계는 토탈스테이션·광파측거기·각 관측장비로 한다.", + "본 품에는 지구계 분할측량품은 포함되어 있지 않다.", + "본 품에 지적기준점측량이 포함되어 있지 않으므로 지적기준점측량을 실시할 경우에는 지적기준점측량비를 별도 계상한다.", + "본 품의 기준면적은 1지구 1,000,000㎡를 기준으로 한 것이며, 측량지구면적이 30,000㎡이하인 경우에는 30,000㎡의 품으로 한다.", + "중심점·가구점, 필계점, 말박기 측량을 필요로 할 경우에는 본 품의 30%의 값을 적용한 품으로 한다.", + "본 품에 사용되는 기계경비 및 재료소모품비는 별도 계상한다.", + "도서지역 등의 측량을 위하여 선박 등을 임차할 경우에는 임차료 실비를 별도 계상한다.", + "본 품의 외업에 필요한 여비는 공무원여비규정에 의한 국내여행자의 일비를 별도 계상한다." + ] + }, + { + "열쇠": "9-11-2 면적체감계수", + "이름": "경지구획정리 지적확정측량 면적체감계수", + "기준": "", + "출처": "건설품셈 토목 9-11-2 주②", + "조건": { + "면적별": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "면적별": "100만㎡이하", + "계수": 1.0 + }, + { + "면적별": "100만㎡초과∼300만㎡", + "계수": 0.9 + }, + { + "면적별": "300만㎡초과∼500만㎡", + "계수": 0.8 + }, + { + "면적별": "500만㎡초과∼800만㎡", + "계수": 0.7 + }, + { + "면적별": "800만㎡초과∼1000만㎡", + "계수": 0.6 + }, + { + "면적별": "1000만㎡초과", + "계수": 0.5 + } + ], + "주": [] + }, + { + "열쇠": "9-11-2 계산예", + "이름": "경지구획정리 지적확정측량 계산예(면적 1,700,000㎡)", + "기준": "", + "출처": "건설품셈 토목 9-11-2 계산예", + "조건": { + "구간": "고르기", + "구분": "고르기" + }, + "값칸": { + "수량(T)": "", + "단가": "", + "금액": "" + }, + "줄": [ + { + "구간": "기본단가(100만㎡까지)", + "구분": "지적기사", + "수량(T)": "116.20 × 1.0 = 116.20", + "단가": "w_1", + "금액": "W_1=116.20×w_1" + }, + { + "구간": "기본단가(100만㎡까지)", + "구분": "지적산업기사", + "수량(T)": "208.91 × 1.0 = 208.91", + "단가": "w_2", + "금액": "W_2=208.91×w_2" + }, + { + "구간": "기본단가(100만㎡까지)", + "구분": "지적기능사", + "수량(T)": "76.09 × 1.0 = 76.09", + "단가": "w_3", + "금액": "W_3=76.09×w_3" + }, + { + "구간": "체감계수적용단가(100만㎡초과300만㎡까지)", + "구분": "지적기사", + "수량(T)": "116.20 × 0.9 = 104.58", + "단가": "w_1", + "금액": "W_1=104.58×w_1" + }, + { + "구간": "체감계수적용단가(100만㎡초과300만㎡까지)", + "구분": "지적산업기사", + "수량(T)": "208.91 × 0.9 = 188.02", + "단가": "w_2", + "금액": "W_2=188.02×w_2" + }, + { + "구간": "체감계수적용단가(100만㎡초과300만㎡까지)", + "구분": "지적기능사", + "수량(T)": "76.09 × 0.9 = 68.48", + "단가": "w_3", + "금액": "W_3=68.48×w_3" + } + ], + "주": [ + "㉠기본계수(100만㎡까지):1.0, ㉡기본계수(100만㎡초과 300만㎡까지):0.9.", + "[결정단가] = (∑W+직접경비+간접측량비)/1,000,000㎡. [합계∑W_1] = (단가×1,000,000). [합계∑W_2] = (단가×700,000).", + "㉰ 지적삼각 측량비 : ∑W_3. ㉱ 지적도근 측량비 : ∑W_4. [총 계] = ∑W_1+∑W_2+∑W_3+∑W_4." + ] + }, + { + "열쇠": "9-12-1 예정지적좌표도 작성업무", + "이름": "예정지적좌표도 작성업무", + "기준": "예정지적좌표도 1점", + "출처": "건설품셈 토목 9-12-1", + "조건": { + "작업별": "고르기" + }, + "값칸": { + "지적기사": "", + "지적산업기사": "", + "지적기능사": "" + }, + "줄": [ + { + "작업별": "계획준비", + "지적기사": "(0.08)", + "지적산업기사": "(0.08)" + }, + { + "작업별": "준비도작성", + "지적산업기사": "(0.10)" + }, + { + "작업별": "면적측정 및 계산", + "지적산업기사": "(0.03)" + }, + { + "작업별": "결과도 작성", + "지적산업기사": "(0.13)" + }, + { + "작업별": "결과부 및 조서작성", + "지적산업기사": "(0.09)" + }, + { + "작업별": "성과점검 및 인계", + "지적산업기사": "(0.08)" + }, + { + "작업별": "계", + "지적기사": "(0.08)", + "지적산업기사": "(0.51)" + } + ], + "주": [ + "( )는 내업임.", + "본 품은 「공간정보의 구축 및 관리 등에 관한 법률」 제86조 규정에 의한 도시개발사업 또는 그 밖에 대통령이 정하는 토지개발사업 등을 위하여 실시하는 토지개발사업지구의 지구계점에 대한 예정지적좌표도 작성업무의 품이며, 예정지적좌표도 1점을 기준으로 한다.", + "본 품에는 지구계점 예정지적좌표계산부 1부, 좌표면적 및 경계점간 거리계산부 1부, 지구계 예정도(1/500 또는 1/1000) 1부, 지구계 예정종합도 1부의 성과작성품이 포함되어 있다. 본 품에 없는 성과작성 요구시 별도의 품을 가산한다.", + "축척은 1/500 또는 1/1000으로 한다.", + "면적계산은 좌표를 면적프로그램에 의하여 컴퓨터로 계산, 좌표점 전개는 프로그램에 의하여 전개, 결과도 작성은 프로그램에 의한 것이다.", + "본 품에는 택지개발예정지적좌표도 지구계점 측량업무 이외의 품은 포함되어 있지 않다.", + "본 품의 외업에 필요한 여비는 공무원여비규정에 의한 국내여행자의 일비를 별도 계상한다." + ] + }, + { + "열쇠": "9-13-1 지적재조사측량", + "이름": "지적재조사측량", + "기준": "지구당 400필지∼450필지", + "출처": "건설품셈 토목 9-13-1", + "조건": { + "작업별": "고르기", + "세부": "고르기", + "구간": "고르기", + "직종": "고르기" + }, + "값칸": { + "값": "" + }, + "줄": [ + { + "작업별": "자료조사", + "구간": "일수", + "직종": "", + "값": "(0.06)" + }, + { + "작업별": "자료조사", + "구간": "1일당", + "직종": "지적기사", + "값": 1 + }, + { + "작업별": "자료조사", + "구간": "합계", + "직종": "지적기사", + "값": "(0.06)" + }, + { + "작업별": "계획준비", + "세부": "현장답사", + "구간": "일수", + "직종": "", + "값": 0.02 + }, + { + "작업별": "계획준비", + "세부": "현장답사", + "구간": "1일당", + "직종": "지적기사", + "값": 1 + }, + { + "작업별": "계획준비", + "세부": "현장답사", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "계획준비", + "세부": "현장답사", + "구간": "1일당", + "직종": "지적기능사", + "값": 1 + }, + { + "작업별": "계획준비", + "세부": "현장답사", + "구간": "합계", + "직종": "지적기사", + "값": 0.02 + }, + { + "작업별": "계획준비", + "세부": "현장답사", + "구간": "합계", + "직종": "지적산업기사", + "값": 0.02 + }, + { + "작업별": "계획준비", + "세부": "현장답사", + "구간": "합계", + "직종": "지적기능사", + "값": 0.02 + }, + { + "작업별": "계획준비", + "세부": "사전계획", + "구간": "일수", + "직종": "", + "값": "(0.01)" + }, + { + "작업별": "계획준비", + "세부": "사전계획", + "구간": "1일당", + "직종": "지적기사", + "값": 1 + }, + { + "작업별": "계획준비", + "세부": "사전계획", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "계획준비", + "세부": "사전계획", + "구간": "합계", + "직종": "지적기사", + "값": "(0.01)" + }, + { + "작업별": "계획준비", + "세부": "사전계획", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.01)" + }, + { + "작업별": "사업지구내외 측량", + "구간": "일수", + "직종": "", + "값": 0.05 + }, + { + "작업별": "사업지구내외 측량", + "구간": "1일당", + "직종": "지적기사", + "값": 1 + }, + { + "작업별": "사업지구내외 측량", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "사업지구내외 측량", + "구간": "1일당", + "직종": "지적기능사", + "값": 1 + }, + { + "작업별": "사업지구내외 측량", + "구간": "합계", + "직종": "지적기사", + "값": 0.05 + }, + { + "작업별": "사업지구내외 측량", + "구간": "합계", + "직종": "지적산업기사", + "값": 0.05 + }, + { + "작업별": "사업지구내외 측량", + "구간": "합계", + "직종": "지적기능사", + "값": 0.05 + }, + { + "작업별": "일필지 측량", + "구간": "일수", + "직종": "", + "값": 0.16 + }, + { + "작업별": "일필지 측량", + "구간": "1일당", + "직종": "지적기사", + "값": 1 + }, + { + "작업별": "일필지 측량", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "일필지 측량", + "구간": "1일당", + "직종": "지적기능사", + "값": 1 + }, + { + "작업별": "일필지 측량", + "구간": "합계", + "직종": "지적기사", + "값": 0.16 + }, + { + "작업별": "일필지 측량", + "구간": "합계", + "직종": "지적산업기사", + "값": 0.16 + }, + { + "작업별": "일필지 측량", + "구간": "합계", + "직종": "지적기능사", + "값": 0.16 + }, + { + "작업별": "면적측정 및 계산", + "구간": "일수", + "직종": "", + "값": "(0.02)" + }, + { + "작업별": "면적측정 및 계산", + "구간": "1일당", + "직종": "지적기사", + "값": 1 + }, + { + "작업별": "면적측정 및 계산", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "면적측정 및 계산", + "구간": "합계", + "직종": "지적기사", + "값": "(0.02)" + }, + { + "작업별": "면적측정 및 계산", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.02)" + }, + { + "작업별": "토지현황조사서 작성", + "구간": "일수", + "직종": "", + "값": "(0.02)" + }, + { + "작업별": "토지현황조사서 작성", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "토지현황조사서 작성", + "구간": "1일당", + "직종": "지적기능사", + "값": 1 + }, + { + "작업별": "토지현황조사서 작성", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.02)" + }, + { + "작업별": "토지현황조사서 작성", + "구간": "합계", + "직종": "지적기능사", + "값": "(0.02)" + }, + { + "작업별": "경계조정협의", + "구간": "일수", + "직종": "", + "값": 0.34 + }, + { + "작업별": "경계조정협의", + "구간": "1일당", + "직종": "지적기사", + "값": 1 + }, + { + "작업별": "경계조정협의", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "경계조정협의", + "구간": "1일당", + "직종": "지적기능사", + "값": 1 + }, + { + "작업별": "경계조정협의", + "구간": "합계", + "직종": "지적기사", + "값": 0.34 + }, + { + "작업별": "경계조정협의", + "구간": "합계", + "직종": "지적산업기사", + "값": 0.34 + }, + { + "작업별": "경계조정협의", + "구간": "합계", + "직종": "지적기능사", + "값": 0.34 + }, + { + "작업별": "확정경계점표지 설치", + "구간": "일수", + "직종": "", + "값": 0.05 + }, + { + "작업별": "확정경계점표지 설치", + "구간": "1일당", + "직종": "지적기사", + "값": 1 + }, + { + "작업별": "확정경계점표지 설치", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "확정경계점표지 설치", + "구간": "1일당", + "직종": "지적기능사", + "값": 1 + }, + { + "작업별": "확정경계점표지 설치", + "구간": "합계", + "직종": "지적기사", + "값": 0.05 + }, + { + "작업별": "확정경계점표지 설치", + "구간": "합계", + "직종": "지적산업기사", + "값": 0.05 + }, + { + "작업별": "확정경계점표지 설치", + "구간": "합계", + "직종": "지적기능사", + "값": 0.05 + }, + { + "작업별": "경계확정 측량", + "구간": "일수", + "직종": "", + "값": 0.04 + }, + { + "작업별": "경계확정 측량", + "구간": "1일당", + "직종": "지적기사", + "값": 1 + }, + { + "작업별": "경계확정 측량", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "경계확정 측량", + "구간": "1일당", + "직종": "지적기능사", + "값": 1 + }, + { + "작업별": "경계확정 측량", + "구간": "합계", + "직종": "지적기사", + "값": 0.04 + }, + { + "작업별": "경계확정 측량", + "구간": "합계", + "직종": "지적산업기사", + "값": 0.04 + }, + { + "작업별": "경계확정 측량", + "구간": "합계", + "직종": "지적기능사", + "값": 0.04 + }, + { + "작업별": "지적확정(예정)조서 작성", + "구간": "일수", + "직종": "", + "값": "(0.03)" + }, + { + "작업별": "지적확정(예정)조서 작성", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "지적확정(예정)조서 작성", + "구간": "1일당", + "직종": "지적기능사", + "값": 1 + }, + { + "작업별": "지적확정(예정)조서 작성", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.03)" + }, + { + "작업별": "지적확정(예정)조서 작성", + "구간": "합계", + "직종": "지적기능사", + "값": "(0.03)" + }, + { + "작업별": "지상경계점등록부 작성", + "구간": "일수", + "직종": "", + "값": "(0.04)" + }, + { + "작업별": "지상경계점등록부 작성", + "구간": "1일당", + "직종": "지적기사", + "값": 1 + }, + { + "작업별": "지상경계점등록부 작성", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "지상경계점등록부 작성", + "구간": "합계", + "직종": "지적기사", + "값": "(0.04)" + }, + { + "작업별": "지상경계점등록부 작성", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.04)" + }, + { + "작업별": "이의신청 처리 및 성과물 작성", + "구간": "일수", + "직종": "", + "값": "(0.05)" + }, + { + "작업별": "이의신청 처리 및 성과물 작성", + "구간": "1일당", + "직종": "지적기사", + "값": 1 + }, + { + "작업별": "이의신청 처리 및 성과물 작성", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "이의신청 처리 및 성과물 작성", + "구간": "1일당", + "직종": "지적기능사", + "값": 1 + }, + { + "작업별": "이의신청 처리 및 성과물 작성", + "구간": "합계", + "직종": "지적기사", + "값": "(0.05)" + }, + { + "작업별": "이의신청 처리 및 성과물 작성", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.05)" + }, + { + "작업별": "이의신청 처리 및 성과물 작성", + "구간": "합계", + "직종": "지적기능사", + "값": "(0.05)" + }, + { + "작업별": "소계", + "세부": "외업", + "구간": "일수", + "직종": "", + "값": 0.66 + }, + { + "작업별": "소계", + "세부": "외업", + "구간": "합계", + "직종": "지적기사", + "값": 0.66 + }, + { + "작업별": "소계", + "세부": "외업", + "구간": "합계", + "직종": "지적산업기사", + "값": 0.66 + }, + { + "작업별": "소계", + "세부": "외업", + "구간": "합계", + "직종": "지적기능사", + "값": 0.66 + }, + { + "작업별": "소계", + "세부": "내업", + "구간": "일수", + "직종": "", + "값": "(0.23)" + }, + { + "작업별": "소계", + "세부": "내업", + "구간": "합계", + "직종": "지적기사", + "값": "(0.18)" + }, + { + "작업별": "소계", + "세부": "내업", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.17)" + }, + { + "작업별": "소계", + "세부": "내업", + "구간": "합계", + "직종": "지적기능사", + "값": "(0.10)" + }, + { + "작업별": "합계", + "구간": "일수", + "직종": "", + "값": 0.89 + }, + { + "작업별": "합계", + "구간": "합계", + "직종": "지적기사", + "값": 0.84 + }, + { + "작업별": "합계", + "구간": "합계", + "직종": "지적산업기사", + "값": 0.83 + }, + { + "작업별": "합계", + "구간": "합계", + "직종": "지적기능사", + "값": 0.76 + } + ], + "주": [ + "본 품은 「지적재조사에 관한 특별법」에 따라 종이에 구현된 지적을 디지털 지적으로 전환함으로써 국토의 효율적 관리를 위한 지적재조사 사업을 실시하는 경우의 품이다. 지적재조사 측량·조사의 업무공정비율은 「지적재조사 책임수행기관 운영규정」 제17조에 따른다.", + "본 품에는 좌표면적 및 경계점간 거리계산부 2부, 일필지경계점간 거리측정부 2부, 재조사측량 계획도 2부, 위성(일필지경계점) 측량부 2부, 네트워크 RTK 워성측량 관측기록부 2부, 경계점(보조점) 관측 및 좌표 계산부 2부, 면적 집계표 및 대비표 2부, 지적확정조서 2부, 종전 지번별 조서 1부, 경계점표지 등록부 1부, 일필지 조사서 1부의 성과작성품이 포함되어 있다.", + "본 품에 사용된 거리측정 기계는 Network-RTK, 토털스테이션, 각 관측 장비이다.", + "본 품은 지구당 400필지∼450필지를 기준으로 조사한 것이며, 필지 수가 증·감되어도 본 품을 적용한다.", + "본 품의 외업에 필요한 여비는 공무원여비규정에 의한 국내 여행자의 일비를 별도 계상한다.", + "본 품의 적용계수는 지상측량에 의할 경우로 국한한다. 드론지적측량규정에 의한 드론측량은 별도의 품에 의한다.", + "도서지역 등의 측량을 위하여 선박 등을 임차할 경우에는 임차료 실비를 별도 계상한다.", + "본 품에 사용되는 기계경비 및 재료소모품비는 별도 계상한다.", + "작업상 드론지적측량 실시할 경우 영상 후처리 사용되는 소프트웨어 비용은 별도 계상한다.", + "작업상 필요한 지적기준점을 설치하는 경우에는 지적기준점측량에 따른 비용을 별도 계상한다.", + "지적기준점 매설작업에 따르는 자재대, 운반비, 인부임은 별도 계상한다.", + "토지소유자 등이 경계점표지를 표석으로 설치를 요청하는 경우 자재대, 운반비, 인부임은 소유자 부담으로 별도 계상한다." + ] + }, + { + "열쇠": "9-13-1 지역구분계수", + "이름": "지적재조사측량 지역구분계수", + "기준": "", + "출처": "건설품셈 토목 9-13-1 주②", + "조건": { + "구분": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "구분": "군지역", + "계수": 1.0 + }, + { + "구분": "시지역", + "계수": 1.26 + }, + { + "구분": "구지역", + "계수": 1.36 + } + ], + "주": [] + }, + { + "열쇠": "9-14-1 경계복원 측량(도해)", + "이름": "경계복원 측량(도해)", + "기준": "1필지당(토지300㎡·임야3,000㎡)", + "출처": "건설품셈 토목 9-14-1", + "조건": { + "작업별": "고르기", + "세부": "고르기", + "직종": "고르기" + }, + "값칸": { + "값": "" + }, + "줄": [ + { + "작업별": "자료조사", + "직종": "지적기사", + "값": "(0.04)" + }, + { + "작업별": "자료조사", + "직종": "지적산업기사", + "값": "(0.04)" + }, + { + "작업별": "측량계획 및 준비", + "직종": "지적기사", + "값": "(0.04)" + }, + { + "작업별": "측량계획 및 준비", + "직종": "지적산업기사", + "값": "(0.03)" + }, + { + "작업별": "측량준비도 작성", + "직종": "지적기사", + "값": "(0.01)" + }, + { + "작업별": "측량준비도 작성", + "직종": "지적산업기사", + "값": "(0.02)" + }, + { + "작업별": "현지측량 준비", + "직종": "지적기사", + "값": 0.01 + }, + { + "작업별": "현지측량 준비", + "직종": "지적산업기사", + "값": 0.02 + }, + { + "작업별": "현지측량 준비", + "직종": "지적기능사", + "값": 0.01 + }, + { + "작업별": "현지측량", + "직종": "지적기사", + "값": 0.46 + }, + { + "작업별": "현지측량", + "직종": "지적산업기사", + "값": 0.46 + }, + { + "작업별": "현지측량", + "직종": "지적기능사", + "값": 0.46 + }, + { + "작업별": "성과설명", + "직종": "지적기사", + "값": 0.06 + }, + { + "작업별": "측량결과도 등 측량성과물 작성", + "직종": "지적기사", + "값": "(0.06)" + }, + { + "작업별": "측량결과도 등 측량성과물 작성", + "직종": "지적산업기사", + "값": "(0.14)" + }, + { + "작업별": "측량성과 관련서류 작성", + "직종": "지적산업기사", + "값": "(0.02)" + }, + { + "작업별": "측량성과 검사요청", + "직종": "지적기사", + "값": "(0.03)" + }, + { + "작업별": "측량성과 검사요청", + "직종": "지적산업기사", + "값": "(0.03)" + }, + { + "작업별": "지적측량 성과도교부", + "직종": "지적기사", + "값": "(0.02)" + }, + { + "작업별": "지적측량 성과도교부", + "직종": "지적산업기사", + "값": "(0.01" + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적기사", + "값": 0.53 + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적산업기사", + "값": 0.48 + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적기능사", + "값": 0.47 + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적기사", + "값": "(0.2)" + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적산업기사", + "값": "(0.29)" + }, + { + "작업별": "합계", + "직종": "지적기사", + "값": 0.73 + }, + { + "작업별": "합계", + "직종": "지적산업기사", + "값": 0.77 + }, + { + "작업별": "합계", + "직종": "지적기능사", + "값": 0.47 + } + ], + "주": [ + "( )는 내업임. 원문 그대로: 지적측량 성과도교부 지적산업기사 칸 「(0.01」(닫는 괄호 없이 찍힘).", + "본 품은 도해지역의 필지를 「공간정보의 구축 및 관리 등에 관한 법률」 제2조 제4호의 규정에 의하여 같은 법률 제2조 제25호에서 말하는 “경계점”을 지상에 복원하는 측량 품이다.", + "n은 가산횟수로 (대상면적-기준면적)÷기준면적.", + "본 품에는 경계복원 측량결과도 1부, 측량결과부(측량성과도 등) 1부의 성과작성품이 포함되어 있다.", + "경계복원 측량할 토지의 축척은 1/600, 1/1000, 1/1200, 1/2400, 1/3000, 1/6000로 구분한다.", + "본 품에 사용되는 기계경비 및 재료소모품비는 별도 계상한다.", + "작업상 지적측량기준점을 설치할 경우에는 지적측량기준점 설치비를 별도 계상한다.", + "도서지역 등의 측량을 위하여 선박 등을 임차할 경우에는 임차료 실비를 별도 계상한다.", + "본 품의 외업에 필요한 여비는 공무원여비규정에 의한 국내여행자의 일비를 별도 계상한다.", + "본 품의 측량결과에 대한 설명을 부가한 감정도 및 감정서 발급을 요청할 경우에는 추가 품을 가산 적용할 수 있다.", + "[결정단가] = ∑W+직접경비+간접측량비." + ] + }, + { + "열쇠": "9-14-1 면적계수", + "이름": "경계복원 측량(도해) 면적계수", + "기준": "", + "출처": "건설품셈 토목 9-14-1 주②", + "조건": { + "가산횟수": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "가산횟수": "0회", + "계수": 1.0 + }, + { + "가산횟수": "1회", + "계수": 1.3 + }, + { + "가산횟수": "2회이상", + "계수": "1.2+(0.10×n)" + } + ], + "주": [] + }, + { + "열쇠": "9-14-1 등록계수", + "이름": "경계복원 측량(도해) 등록계수", + "기준": "", + "출처": "건설품셈 토목 9-14-1 주③", + "조건": { + "구분": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "구분": "토지", + "계수": 1.0 + }, + { + "구분": "임야", + "계수": 1.2 + } + ], + "주": [] + }, + { + "열쇠": "9-14-1 지역구분계수", + "이름": "경계복원 측량(도해) 지역구분계수", + "기준": "", + "출처": "건설품셈 토목 9-14-1 주④", + "조건": { + "구분": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "구분": "면", + "계수": 1.0 + }, + { + "구분": "읍", + "계수": 1.1 + }, + { + "구분": "동시", + "계수": 1.3 + }, + { + "구분": "동구", + "계수": 1.4 + } + ], + "주": [] + }, + { + "열쇠": "9-14-1 계산예", + "이름": "경계복원 측량(도해) 계산예(구지역, 1필지 1,500㎡ 토지)", + "기준": "", + "출처": "건설품셈 토목 9-14-1 계산예", + "조건": { + "구분": "고르기" + }, + "값칸": { + "수량(T)": "", + "단가": "", + "금액": "" + }, + "줄": [ + { + "구분": "지적기사", + "수량(T)": "0.73×2.00=1.46", + "단가": "w_1", + "금액": "W_1=1.46×w_1" + }, + { + "구분": "지적산업기사", + "수량(T)": "0.77×2.00=1.54", + "단가": "w_2", + "금액": "W_2=1.54×w_2" + }, + { + "구분": "지적기능사", + "수량(T)": "0.47×2.00=0.94", + "단가": "w_3", + "금액": "W_3=0.94×w_3" + }, + { + "구분": "계", + "금액": "∑W" + } + ], + "주": [ + "㉠기본계수:1.00, ㉡등록계수:0.00, ㉢지역구분계수:0.40, ㉣면적계수:0.60. 합계 : 2.00 = (㉠+㉡+㉢+㉣)." + ] + }, + { + "열쇠": "9-14-2 경계복원 측량(수치)", + "이름": "경계복원 측량(수치)", + "기준": "1필지당 300㎡", + "출처": "건설품셈 토목 9-14-2", + "조건": { + "작업별": "고르기", + "세부": "고르기", + "직종": "고르기" + }, + "값칸": { + "값": "" + }, + "줄": [ + { + "작업별": "자료조사", + "직종": "지적기사", + "값": "(0.04)" + }, + { + "작업별": "자료조사", + "직종": "지적산업기사", + "값": "(0.04)" + }, + { + "작업별": "측량계획 및 준비", + "직종": "지적기사", + "값": "(0.04)" + }, + { + "작업별": "측량계획 및 준비", + "직종": "지적산업기사", + "값": "(0.02)" + }, + { + "작업별": "측량준비도 작성", + "직종": "지적기사", + "값": "(0.01)" + }, + { + "작업별": "측량준비도 작성", + "직종": "지적산업기사", + "값": "(0.02)" + }, + { + "작업별": "현지측량 준비", + "직종": "지적기사", + "값": 0.01 + }, + { + "작업별": "현지측량 준비", + "직종": "지적산업기사", + "값": 0.02 + }, + { + "작업별": "현지측량 준비", + "직종": "지적기능사", + "값": 0.01 + }, + { + "작업별": "현지측량", + "직종": "지적기사", + "값": 0.33 + }, + { + "작업별": "현지측량", + "직종": "지적산업기사", + "값": 0.33 + }, + { + "작업별": "현지측량", + "직종": "지적기능사", + "값": 0.33 + }, + { + "작업별": "성과설명", + "직종": "지적기사", + "값": 0.04 + }, + { + "작업별": "측량결과도 등 측량성과물 작성", + "직종": "지적기사", + "값": "(0.06)" + }, + { + "작업별": "측량결과도 등 측량성과물 작성", + "직종": "지적산업기사", + "값": "(0.12)" + }, + { + "작업별": "측량성과 관련서류 작성", + "직종": "지적산업기사", + "값": "(0.02)" + }, + { + "작업별": "측량성과 검사요청", + "직종": "지적기사", + "값": "(0.03)" + }, + { + "작업별": "측량성과 검사요청", + "직종": "지적산업기사", + "값": "(0.04)" + }, + { + "작업별": "지적측량 성과도교부", + "직종": "지적기사", + "값": "(0.02)" + }, + { + "작업별": "지적측량 성과도교부", + "직종": "지적산업기사", + "값": "(0.01)" + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적기사", + "값": 0.38 + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적산업기사", + "값": 0.35 + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적기능사", + "값": 0.34 + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적기사", + "값": "(0.20)" + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적산업기사", + "값": "(0.27)" + }, + { + "작업별": "합계", + "직종": "지적기사", + "값": 0.58 + }, + { + "작업별": "합계", + "직종": "지적산업기사", + "값": 0.62 + }, + { + "작업별": "합계", + "직종": "지적기능사", + "값": 0.34 + } + ], + "주": [ + "( )는 내업임.", + "본 품은 수치지역의 토지를 「공간정보의 구축 및 관리 등에 관한 법률」 제2조 제4호의 규정에 의하여 같은 법률 제2조 제25호에서 말하는 “경계점”을 지상에 복원하는 측량 품이다.", + "n은 가산횟수로 (대상면적-기준면적)÷기준면적.", + "본 품에는 경계복원 측량결과도 및 계산부 1부, 측량결과부(측량성과도 등) 1부의 성과작성품이 포함되어 있다.", + "경계복원 측량할 토지의 축척은 1/500, 1/1000로 구분한다.", + "본 품에 사용되는 기계경비 및 재료소모품비는 별도 계상한다.", + "작업상 지적측량기준점을 설치할 경우에는 지적측량기준점 설치비를 별도 계상한다.", + "도서지역 등의 측량을 위하여 선박 등을 임차할 경우에는 임차료 실비를 별도 계상한다.", + "본 품의 외업에 필요한 여비는 공무원여비규정에 의한 국내여행자의 일비를 별도 계상한다.", + "본 품의 측량결과에 대한 설명을 부가한 감정도 및 감정서 발급을 요청할 경우에는 추가 품을 가산 적용할 수 있다.", + "[결정단가] = ∑W+직접경비+간접측량비." + ] + }, + { + "열쇠": "9-14-2 면적계수", + "이름": "경계복원 측량(수치) 면적계수", + "기준": "", + "출처": "건설품셈 토목 9-14-2 주②", + "조건": { + "가산횟수": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "가산횟수": "0회", + "계수": 1.0 + }, + { + "가산횟수": "1회", + "계수": 1.3 + }, + { + "가산횟수": "2회이상", + "계수": "1.2+(0.10×n)" + } + ], + "주": [] + }, + { + "열쇠": "9-14-2 지역구분계수", + "이름": "경계복원 측량(수치) 지역구분계수", + "기준": "", + "출처": "건설품셈 토목 9-14-2 주③", + "조건": { + "구분": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "구분": "면", + "계수": 1.0 + }, + { + "구분": "읍", + "계수": 1.1 + }, + { + "구분": "동시", + "계수": 1.3 + }, + { + "구분": "동구", + "계수": 1.4 + } + ], + "주": [] + }, + { + "열쇠": "9-14-2 계산예", + "이름": "경계복원 측량(수치) 계산예(구지역·수치지역, 1필지 1,500㎡ 토지)", + "기준": "", + "출처": "건설품셈 토목 9-14-2 계산예", + "조건": { + "구분": "고르기" + }, + "값칸": { + "수량(T)": "", + "단가": "", + "금액": "" + }, + "줄": [ + { + "구분": "지적기사", + "수량(T)": "0.58×2.00=1.16", + "단가": "w_1", + "금액": "W_1=1.16×w_1" + }, + { + "구분": "지적산업기사", + "수량(T)": "0.62×2.00=1.24", + "단가": "w_2", + "금액": "W_2=1.24×w_2" + }, + { + "구분": "지적기능사", + "수량(T)": "0.34×2.00=0.68", + "단가": "w_3", + "금액": "W_3=0.68×w_3" + }, + { + "구분": "계", + "금액": "∑W" + } + ], + "주": [ + "㉠기본계수:1.00, ㉡등록계수:0.00, ㉢지역구분계수:0.40, ㉣면적계수:0.60. 합계 : 2.00 = (㉠+㉡+㉢+㉣)." + ] + }, + { + "열쇠": "9-15-1 지적현황 측량(도해)", + "이름": "지적현황 측량(도해)", + "기준": "1필지당(토지1,500㎡·임야5,000㎡)", + "출처": "건설품셈 토목 9-15-1", + "조건": { + "작업별": "고르기", + "세부": "고르기", + "직종": "고르기" + }, + "값칸": { + "값": "" + }, + "줄": [ + { + "작업별": "자료조사", + "직종": "지적기사", + "값": "(0.04)" + }, + { + "작업별": "자료조사", + "직종": "지적산업기사", + "값": "(0.04)" + }, + { + "작업별": "측량계획 및 준비", + "직종": "지적기사", + "값": "(0.04)" + }, + { + "작업별": "측량계획 및 준비", + "직종": "지적산업기사", + "값": "(0.03)" + }, + { + "작업별": "측량준비도 작성", + "직종": "지적기사", + "값": "(0.01)" + }, + { + "작업별": "측량준비도 작성", + "직종": "지적산업기사", + "값": "(0.02)" + }, + { + "작업별": "현지측량 준비", + "직종": "지적기사", + "값": 0.01 + }, + { + "작업별": "현지측량 준비", + "직종": "지적산업기사", + "값": 0.02 + }, + { + "작업별": "현지측량 준비", + "직종": "지적기능사", + "값": 0.01 + }, + { + "작업별": "현지측량", + "직종": "지적기사", + "값": 0.41 + }, + { + "작업별": "현지측량", + "직종": "지적산업기사", + "값": 0.41 + }, + { + "작업별": "현지측량", + "직종": "지적기능사", + "값": 0.41 + }, + { + "작업별": "성과설명", + "직종": "지적기사", + "값": 0.06 + }, + { + "작업별": "측량결과도 등 측량성과물 작성", + "직종": "지적기사", + "값": "(0.06)" + }, + { + "작업별": "측량결과도 등 측량성과물 작성", + "직종": "지적산업기사", + "값": "(0.14)" + }, + { + "작업별": "측량성과 관련서류 작성", + "직종": "지적산업기사", + "값": "(0.02)" + }, + { + "작업별": "측량성과 검사요청", + "직종": "지적기사", + "값": "(0.03)" + }, + { + "작업별": "측량성과 검사요청", + "직종": "지적산업기사", + "값": "(0.03)" + }, + { + "작업별": "지적측량 성과도교부", + "직종": "지적기사", + "값": "(0.02)" + }, + { + "작업별": "지적측량 성과도교부", + "직종": "지적산업기사", + "값": "(0.01)" + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적기사", + "값": 0.48 + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적산업기사", + "값": 0.43 + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적기능사", + "값": 0.42 + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적기사", + "값": "(0.20)" + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적산업기사", + "값": "(0.29)" + }, + { + "작업별": "합계", + "직종": "지적기사", + "값": 0.68 + }, + { + "작업별": "합계", + "직종": "지적산업기사", + "값": 0.72 + }, + { + "작업별": "합계", + "직종": "지적기능사", + "값": 0.42 + } + ], + "주": [ + "( )는 내업임.", + "본 품은 도해지역에서 「공간정보의 구축 및 관리 등에 관한 법률」 제18조의 규정에 의한 지상구조물 또는 지형지물이 점유하는 위치현황을 지적도 및 임야도에 등록된 경계와 대비하여 표시하는 데에 필요한 측량 품이다.", + "n은 가산횟수로 (대상면적-기준면적)÷기준면적.", + "본 품에는 지적현황측량결과도 1부, 측량결과부(측량성과도 등) 1부, 면적계산부 1부의 성과작성품이 포함되어 있다.", + "지적현황측량할 토지의 축척은 1/600, 1/1000, 1/1200, 1/2400, 1/3000, 1/6000로 구분한다.", + "인가·허가 면적 등을 도상에서 맞추어 분할선을 현장에 표시하는 경우에는 본 품에 의한 측량비의 40%를 가산 적용한다.", + "분할(예정)선을 도상에서 맞추어 현장에 표시하는 지정분할의 경우에는 본 품에 의한 측량비의 30%를 가산 적용한다.", + "본 품의 측량결과에 대한 설명을 부가한 감정도 및 감정서 발급을 요청할 경우에는 추가 품을 가산 적용할 수 있다.", + "본 품에 사용되는 기계경비 및 재료소모품비는 별도 계상한다.", + "작업상 지적측량기준점을 설치할 경우에는 지적측량기준점 설치비를 별도 계상한다.", + "도서지역 등의 측량을 위하여 선박 등을 임차할 경우에는 임차료 실비를 별도 계상한다.", + "본 품의 외업에 필요한 여비는 공무원여비규정에 의한 국내여행자의 일비를 별도 계상한다.", + "[결정단가] = (∑W+직접경비+간접측량비)/2." + ] + }, + { + "열쇠": "9-15-1 면적계수", + "이름": "지적현황 측량(도해) 면적계수", + "기준": "", + "출처": "건설품셈 토목 9-15-1 주②", + "조건": { + "가산횟수": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "가산횟수": "0회", + "계수": 1.0 + }, + { + "가산횟수": "1회", + "계수": 1.3 + }, + { + "가산횟수": "2회이상", + "계수": "1.2+(0.10×n)" + } + ], + "주": [] + }, + { + "열쇠": "9-15-1 등록계수", + "이름": "지적현황 측량(도해) 등록계수", + "기준": "", + "출처": "건설품셈 토목 9-15-1 주③", + "조건": { + "구분": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "구분": "토지", + "계수": 1.0 + }, + { + "구분": "임야", + "계수": 1.2 + } + ], + "주": [] + }, + { + "열쇠": "9-15-1 지역구분계수", + "이름": "지적현황 측량(도해) 지역구분계수", + "기준": "", + "출처": "건설품셈 토목 9-15-1 주④", + "조건": { + "구분": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "구분": "면", + "계수": 1.0 + }, + { + "구분": "읍", + "계수": 1.1 + }, + { + "구분": "동시", + "계수": 1.3 + }, + { + "구분": "동구", + "계수": 1.4 + } + ], + "주": [] + }, + { + "열쇠": "9-15-1 계산예", + "이름": "지적현황 측량(도해) 계산예(구지역, 1필지 7,000㎡를 2필지로 현황측량)", + "기준": "", + "출처": "건설품셈 토목 9-15-1 계산예", + "조건": { + "구분": "고르기" + }, + "값칸": { + "수량(T)": "", + "단가": "", + "금액": "" + }, + "줄": [ + { + "구분": "지적기사", + "수량(T)": "0.68×2.00=1.36", + "단가": "w_1", + "금액": "W_1=1.36×w_1" + }, + { + "구분": "지적산업기사", + "수량(T)": "0.72×2.00=1.44", + "단가": "w_2", + "금액": "W_2=1.44×w_2" + }, + { + "구분": "지적기능사", + "수량(T)": "0.42×2.00=0.84", + "단가": "w_3", + "금액": "W_3=0.84×w_3" + }, + { + "구분": "계", + "금액": "∑W" + } + ], + "주": [ + "㉠기본계수:1.00, ㉡등록계수:0.00, ㉢지역구분계수:0.40, ㉣면적계수:0.60. 합계 : 2.00 = (㉠+㉡+㉢+㉣)." + ] + }, + { + "열쇠": "9-15-2 지적현황 측량(수치)", + "이름": "지적현황 측량(수치)", + "기준": "1필지당 1,500㎡", + "출처": "건설품셈 토목 9-15-2", + "조건": { + "작업별": "고르기", + "세부": "고르기", + "직종": "고르기" + }, + "값칸": { + "값": "" + }, + "줄": [ + { + "작업별": "자료조사", + "직종": "지적기사", + "값": "(0.04)" + }, + { + "작업별": "자료조사", + "직종": "지적산업기사", + "값": "(0.04)" + }, + { + "작업별": "측량계획 및 준비", + "직종": "지적기사", + "값": "(0.04)" + }, + { + "작업별": "측량계획 및 준비", + "직종": "지적산업기사", + "값": "(0.02)" + }, + { + "작업별": "측량준비도 작성", + "직종": "지적기사", + "값": "(0.01)" + }, + { + "작업별": "측량준비도 작성", + "직종": "지적산업기사", + "값": "(0.02)" + }, + { + "작업별": "현지측량 준비", + "직종": "지적기사", + "값": 0.01 + }, + { + "작업별": "현지측량 준비", + "직종": "지적산업기사", + "값": 0.02 + }, + { + "작업별": "현지측량 준비", + "직종": "지적기능사", + "값": 0.01 + }, + { + "작업별": "현지측량", + "직종": "지적기사", + "값": 0.36 + }, + { + "작업별": "현지측량", + "직종": "지적산업기사", + "값": 0.36 + }, + { + "작업별": "현지측량", + "직종": "지적기능사", + "값": 0.36 + }, + { + "작업별": "성과설명", + "직종": "지적기사", + "값": 0.04 + }, + { + "작업별": "측량결과도 등 측량성과물 작성", + "직종": "지적기사", + "값": "(0.06)" + }, + { + "작업별": "측량결과도 등 측량성과물 작성", + "직종": "지적산업기사", + "값": "(0.12)" + }, + { + "작업별": "측량성과 관련서류 작성", + "직종": "지적산업기사", + "값": "(0.02)" + }, + { + "작업별": "측량성과 검사요청", + "직종": "지적기사", + "값": "(0.03)" + }, + { + "작업별": "측량성과 검사요청", + "직종": "지적산업기사", + "값": "(0.04)" + }, + { + "작업별": "지적측량 성과도교부", + "직종": "지적기사", + "값": "(0.02)" + }, + { + "작업별": "지적측량 성과도교부", + "직종": "지적산업기사", + "값": "(0.01)" + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적기사", + "값": 0.41 + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적산업기사", + "값": 0.38 + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적기능사", + "값": 0.37 + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적기사", + "값": "(0.20)" + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적산업기사", + "값": "(0.27)" + }, + { + "작업별": "합계", + "직종": "지적기사", + "값": 0.61 + }, + { + "작업별": "합계", + "직종": "지적산업기사", + "값": 0.65 + }, + { + "작업별": "합계", + "직종": "지적기능사", + "값": 0.37 + } + ], + "주": [ + "( )는 내업임.", + "본 품은 수치지역에서 「공간정보의 구축 및 관리 등에 관한 법률」 제18조의 규정에 의한 지상구조물 또는 지형지물이 점유하는 위치현황을 지적도 또는 임야도에 등록된 경계와 대비하여 표시하는 데에 필요한 측량 품이다.", + "n은 가산횟수로 (대상면적-기준면적)÷기준면적.", + "본 품에는 지적현황측량결과도 및 계산부 1부, 측량결과부(측량성과도 등) 1부, 좌표면적계산부 1부의 성과작성품이 포함되어 있다.", + "지적현황측량할 토지의 축척은 1/500, 1/1000로 구분한다.", + "인가·허가 면적 등을 도상에서 맞추어 분할선을 현장에 표시하는 경우에는 본 품에 의한 측량비의 40%를 가산 적용한다.", + "분할(예정)선을 도상에서 맞추어 현장에 표시하는 지정분할의 경우에는 본 품에 의한 측량비의 30%를 가산 적용한다.", + "본 품의 측량결과에 대한 설명을 부가한 감정도 및 감정서 발급을 요청할 경우에는 추가 품을 가산 적용할 수 있다.", + "본 품에 사용되는 기계경비 및 재료소모품비는 별도 계상한다.", + "작업상 지적기준점측량과 수준측량을 실시할 경우에는 지적기준점측량 및 수준측량 비용을 별도 계상한다.", + "도서지역 등의 측량을 위하여 선박 등을 임차할 경우에는 임차료 실비를 별도 계상한다.", + "본 품의 외업에 필요한 여비는 공무원여비규정에 의한 국내여행자의 일비를 별도 계상한다.", + "[결정단가] = (∑W+직접경비+간접측량비)/2." + ] + }, + { + "열쇠": "9-15-2 면적계수", + "이름": "지적현황 측량(수치) 면적계수", + "기준": "", + "출처": "건설품셈 토목 9-15-2 주②", + "조건": { + "가산횟수": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "가산횟수": "0회", + "계수": 1.0 + }, + { + "가산횟수": "1회", + "계수": 1.3 + }, + { + "가산횟수": "2회이상", + "계수": "1.2+(0.10×n)" + } + ], + "주": [] + }, + { + "열쇠": "9-15-2 지역구분계수", + "이름": "지적현황 측량(수치) 지역구분계수", + "기준": "", + "출처": "건설품셈 토목 9-15-2 주③", + "조건": { + "구분": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "구분": "면", + "계수": 1.0 + }, + { + "구분": "읍", + "계수": 1.1 + }, + { + "구분": "동시", + "계수": 1.3 + }, + { + "구분": "동구", + "계수": 1.4 + } + ], + "주": [] + }, + { + "열쇠": "9-15-2 계산예", + "이름": "지적현황 측량(수치) 계산예(구지역·수치지역, 1필지 7,000㎡를 2필지로 현황측량)", + "기준": "", + "출처": "건설품셈 토목 9-15-2 계산예", + "조건": { + "구분": "고르기" + }, + "값칸": { + "수량(T)": "", + "단가": "", + "금액": "" + }, + "줄": [ + { + "구분": "지적기사", + "수량(T)": "0.61×2.00=1.22", + "단가": "w_1", + "금액": "W_1=1.22×w_1" + }, + { + "구분": "지적산업기사", + "수량(T)": "0.65×2.00=1.30", + "단가": "w_2", + "금액": "W_2=1.30×w_2" + }, + { + "구분": "지적기능사", + "수량(T)": "0.37×2.00=0.74", + "단가": "w_3", + "금액": "W_3=0.74×w_3" + }, + { + "구분": "계", + "금액": "∑W" + } + ], + "주": [ + "㉠기본계수:1.00, ㉡등록계수:0.00, ㉢지역구분계수:0.40, ㉣면적계수:0.60. 합계 : 2.00 = (㉠+㉡+㉢+㉣)." + ] + }, + { + "열쇠": "9-15-3 지적불부합지조사 측량(도해)", + "이름": "지적불부합지조사 측량(도해)", + "기준": "1필지당(토지1,500㎡·임야5,000㎡)", + "출처": "건설품셈 토목 9-15-3", + "조건": { + "작업별": "고르기", + "세부": "고르기", + "직종": "고르기" + }, + "값칸": { + "값": "" + }, + "줄": [ + { + "작업별": "자료조사", + "직종": "지적기사", + "값": "(0.04)" + }, + { + "작업별": "자료조사", + "직종": "지적산업기사", + "값": "(0.05)" + }, + { + "작업별": "측량계획 및 준비", + "직종": "지적기사", + "값": "(0.01)" + }, + { + "작업별": "측량계획 및 준비", + "직종": "지적산업기사", + "값": "(0.01)" + }, + { + "작업별": "지적전산 파일 변환", + "직종": "지적산업기사", + "값": "(0.06)" + }, + { + "작업별": "측량준비도 작성", + "직종": "지적기사", + "값": "(0.01)" + }, + { + "작업별": "측량준비도 작성", + "직종": "지적산업기사", + "값": "(0.01)" + }, + { + "작업별": "측량준비도 확인", + "직종": "지적기사", + "값": "(0.01)" + }, + { + "작업별": "실지측량", + "직종": "지적기사", + "값": 0.35 + }, + { + "작업별": "실지측량", + "직종": "지적산업기사", + "값": 0.34 + }, + { + "작업별": "실지측량", + "직종": "지적기능사", + "값": 0.34 + }, + { + "작업별": "측량결과도 등 측량성과물 작성", + "직종": "지적기사", + "값": "(0.15)" + }, + { + "작업별": "측량결과도 등 측량성과물 작성", + "직종": "지적산업기사", + "값": "(0.33)" + }, + { + "작업별": "측량성과 관련서류 작성", + "직종": "지적기사", + "값": "(0.01)" + }, + { + "작업별": "측량성과 관련서류 작성", + "직종": "지적산업기사", + "값": "(0.03)" + }, + { + "작업별": "측량성과 검사요청", + "직종": "지적기사", + "값": "(0.03)" + }, + { + "작업별": "측량성과 검사요청", + "직종": "지적산업기사", + "값": "(0.04)" + }, + { + "작업별": "지적측량 성과도 교부", + "직종": "지적기사", + "값": "(0.02)" + }, + { + "작업별": "지적측량 성과도 교부", + "직종": "지적산업기사", + "값": "(0.02)" + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적기사", + "값": 0.35 + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적산업기사", + "값": 0.34 + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적기능사", + "값": 0.34 + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적기사", + "값": "(0.28)" + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적산업기사", + "값": "(0.55)" + }, + { + "작업별": "합계", + "직종": "지적기사", + "값": 0.63 + }, + { + "작업별": "합계", + "직종": "지적산업기사", + "값": 0.89 + }, + { + "작업별": "합계", + "직종": "지적기능사", + "값": 0.34 + } + ], + "주": [ + "( )는 내업임.", + "n은 가산횟수로 (대상면적-기준면적)÷기준면적.", + "본 품에는 불부합지조사 측량결과도 1부, 면적측정부 1부, 면적조서 3부, 측량결과부(측량성과도 등) 1부의 성과작성품이 포함되어 있다.", + "본 품은 도해지역의 불부합지조사 측량시 작업한 품이다.", + "측량할 토지의 축척은 1/600, 1/1000, 1/1200, 1/2400, 1/3000, 1/6,000로 구분한다.", + "작업상 지적측량기준점을 설치할 경우에는 지적측량기준점 설치비를 별도 계상한다.", + "도서지역 등의 측량을 위하여 선박 등을 임차할 경우에는 임차료 실비를 별도 계상한다.", + "본 품에 사용되는 기계경비 및 재료소모품비는 별도 계상한다.", + "본 품의 외업에 필요한 여비는 공무원여비규정에 의한 국내여행자의 일비를 별도 계상한다." + ] + }, + { + "열쇠": "9-15-3 면적계수", + "이름": "지적불부합지조사 측량(도해) 면적계수", + "기준": "", + "출처": "건설품셈 토목 9-15-3 주①", + "조건": { + "가산횟수": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "가산횟수": "0회", + "계수": 1.0 + }, + { + "가산횟수": "1회", + "계수": 1.3 + }, + { + "가산횟수": "2회이상", + "계수": "1.2+(0.10×n)" + } + ], + "주": [] + }, + { + "열쇠": "9-15-3 등록계수", + "이름": "지적불부합지조사 측량(도해) 등록계수", + "기준": "", + "출처": "건설품셈 토목 9-15-3 주②", + "조건": { + "구분": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "구분": "토지", + "계수": 1.0 + }, + { + "구분": "임야", + "계수": 1.2 + } + ], + "주": [] + }, + { + "열쇠": "9-15-3 지역구분계수", + "이름": "지적불부합지조사 측량(도해) 지역구분계수", + "기준": "", + "출처": "건설품셈 토목 9-15-3 주③", + "조건": { + "구분": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "구분": "면", + "계수": 1.0 + }, + { + "구분": "읍", + "계수": 1.1 + }, + { + "구분": "동시", + "계수": 1.3 + }, + { + "구분": "동구", + "계수": 1.4 + } + ], + "주": [] + }, + { + "열쇠": "9-16-1 도시계획선명시 측량(도해)", + "이름": "도시계획선명시 측량(도해)", + "기준": "1필지당(토지300㎡·임야3,000㎡)", + "출처": "건설품셈 토목 9-16-1", + "조건": { + "작업별": "고르기", + "세부": "고르기", + "직종": "고르기" + }, + "값칸": { + "값": "" + }, + "줄": [ + { + "작업별": "자료조사", + "직종": "지적기사", + "값": "(0.04)" + }, + { + "작업별": "자료조사", + "직종": "지적산업기사", + "값": "(0.04)" + }, + { + "작업별": "측량계획 및 준비", + "직종": "지적기사", + "값": "(0.04)" + }, + { + "작업별": "측량계획 및 준비", + "직종": "지적산업기사", + "값": "(0.03)" + }, + { + "작업별": "측량준비도 작성", + "직종": "지적기사", + "값": "(0.01)" + }, + { + "작업별": "측량준비도 작성", + "직종": "지적산업기사", + "값": "(0.02)" + }, + { + "작업별": "현지측량 준비", + "직종": "지적기사", + "값": 0.01 + }, + { + "작업별": "현지측량 준비", + "직종": "지적산업기사", + "값": 0.02 + }, + { + "작업별": "현지측량 준비", + "직종": "지적기능사", + "값": 0.01 + }, + { + "작업별": "현지측량", + "직종": "지적기사", + "값": 0.46 + }, + { + "작업별": "현지측량", + "직종": "지적산업기사", + "값": 0.46 + }, + { + "작업별": "현지측량", + "직종": "지적기능사", + "값": 0.46 + }, + { + "작업별": "성과설명", + "직종": "지적기사", + "값": 0.06 + }, + { + "작업별": "측량결과도 등 측량성과물 작성", + "직종": "지적기사", + "값": "(0.06)" + }, + { + "작업별": "측량결과도 등 측량성과물 작성", + "직종": "지적산업기사", + "값": "(0.14)" + }, + { + "작업별": "측량성과 관련서류 작성", + "직종": "지적산업기사", + "값": "(0.02)" + }, + { + "작업별": "측량성과 검사요청", + "직종": "지적기사", + "값": "(0.03)" + }, + { + "작업별": "측량성과 검사요청", + "직종": "지적산업기사", + "값": "(0.03)" + }, + { + "작업별": "지적측량 성과도교부", + "직종": "지적기사", + "값": "(0.02)" + }, + { + "작업별": "지적측량 성과도교부", + "직종": "지적산업기사", + "값": "(0.01)" + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적기사", + "값": 0.53 + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적산업기사", + "값": 0.48 + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적기능사", + "값": 0.47 + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적기사", + "값": "(0.20)" + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적산업기사", + "값": "(0.29)" + }, + { + "작업별": "합계", + "직종": "지적기사", + "값": 0.73 + }, + { + "작업별": "합계", + "직종": "지적산업기사", + "값": 0.77 + }, + { + "작업별": "합계", + "직종": "지적기능사", + "값": 0.47 + } + ], + "주": [ + "( )는 내업임.", + "본 품은 도해지역의 필지를 「공간정보의 구축 및 관리 등에 관한 법률」 제2조 제4호의 규정에 의하여 같은 법률 제2조 제25호에서 말하는 “경계점”을 지상에 복원하는 측량 품이다.", + "n은 가산횟수로 (대상면적-기준면적)÷기준면적.", + "본 품에는 경계복원 측량결과도 1부, 측량결과부(측량성과도 등) 1부의 성과작성품이 포함되어 있다.", + "경계복원 측량할 토지의 축척은 1/600, 1/1000, 1/1200, 1/2400, 1/3000, 1/6000으로 구분한다.", + "도해지역에서 「국토의 계획 및 이용에 관한 법률」 제30조제6항 및 같은 법 제32조제4항의 도시관리계획선을 지상에 복원하기 위하여 실시하는 측량의 경우 본 품을 적용한다.", + "본 품에 사용되는 기계경비 및 재료소모품비는 별도 계상한다.", + "작업상 지적측량기준점을 설치할 경우에는 지적측량기준점 설치비를 별도 계상한다.", + "도서지역 등의 측량을 위하여 선박 등을 임차할 경우에는 임차료 실비를 별도 계상한다.", + "본 품의 외업에 필요한 여비는 공무원여비규정에 의한 국내여행자의 일비를 별도 계상한다.", + "본 품의 측량결과에 대한 설명을 부가한 감정도 및 감정서 발급을 요청할 경우에는 추가 품을 가산 적용할 수 있다.", + "[결정단가] = ΣW+직접경비+간접측량비." + ] + }, + { + "열쇠": "9-16-1 면적계수", + "이름": "도시계획선명시 측량(도해) 면적계수", + "기준": "", + "출처": "건설품셈 토목 9-16-1 주②", + "조건": { + "가산횟수": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "가산횟수": "0회", + "계수": 1.0 + }, + { + "가산횟수": "1회", + "계수": 1.3 + }, + { + "가산횟수": "2회이상", + "계수": "1.2+(0.10×n)" + } + ], + "주": [] + }, + { + "열쇠": "9-16-1 등록계수", + "이름": "도시계획선명시 측량(도해) 등록계수", + "기준": "", + "출처": "건설품셈 토목 9-16-1 주③", + "조건": { + "구분": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "구분": "토지", + "계수": 1.0 + }, + { + "구분": "임야", + "계수": 1.2 + } + ], + "주": [] + }, + { + "열쇠": "9-16-1 지역구분계수", + "이름": "도시계획선명시 측량(도해) 지역구분계수", + "기준": "", + "출처": "건설품셈 토목 9-16-1 주④", + "조건": { + "구분": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "구분": "면", + "계수": 1.0 + }, + { + "구분": "읍", + "계수": 1.1 + }, + { + "구분": "동시", + "계수": 1.3 + }, + { + "구분": "동구", + "계수": 1.4 + } + ], + "주": [] + }, + { + "열쇠": "9-16-1 계산예", + "이름": "도시계획선명시 측량(도해) 계산예(구지역, 1필지 1,500㎡ 토지)", + "기준": "", + "출처": "건설품셈 토목 9-16-1 계산예", + "조건": { + "구분": "고르기" + }, + "값칸": { + "수량(T)": "", + "단가": "", + "금액": "" + }, + "줄": [ + { + "구분": "지적기사", + "수량(T)": "0.73×2.00=1.46", + "단가": "w_1", + "금액": "W_1=1.46×w_1" + }, + { + "구분": "지적산업기사", + "수량(T)": "0.77×2.00=1.54", + "단가": "w_2", + "금액": "W_2=1.54×w_2" + }, + { + "구분": "지적기능사", + "수량(T)": "0.47×2.00=0.94", + "단가": "w_3", + "금액": "W_3=0.94×w_3" + }, + { + "구분": "계", + "금액": "∑W" + } + ], + "주": [ + "㉠기본계수:1.00, ㉡등록계수:0.00, ㉢지역구분계수:0.40, ㉣면적계수:0.60. 합계 : 2.00 = (㉠+㉡+㉢+㉣)." + ] + }, + { + "열쇠": "9-16-2 도시계획선명시 측량(수치)", + "이름": "도시계획선명시 측량(수치)", + "기준": "1필지당 300㎡", + "출처": "건설품셈 토목 9-16-2", + "조건": { + "작업별": "고르기", + "세부": "고르기", + "직종": "고르기" + }, + "값칸": { + "값": "" + }, + "줄": [ + { + "작업별": "자료조사", + "직종": "지적기사", + "값": "(0.04)" + }, + { + "작업별": "자료조사", + "직종": "지적산업기사", + "값": "(0.04)" + }, + { + "작업별": "측량계획 및 준비", + "직종": "지적기사", + "값": "(0.04)" + }, + { + "작업별": "측량계획 및 준비", + "직종": "지적산업기사", + "값": "(0.02)" + }, + { + "작업별": "측량준비도 작성", + "직종": "지적기사", + "값": "(0.01)" + }, + { + "작업별": "측량준비도 작성", + "직종": "지적산업기사", + "값": "(0.02)" + }, + { + "작업별": "현지측량 준비", + "직종": "지적기사", + "값": 0.01 + }, + { + "작업별": "현지측량 준비", + "직종": "지적산업기사", + "값": 0.02 + }, + { + "작업별": "현지측량 준비", + "직종": "지적기능사", + "값": 0.01 + }, + { + "작업별": "현지측량", + "직종": "지적기사", + "값": 0.33 + }, + { + "작업별": "현지측량", + "직종": "지적산업기사", + "값": 0.33 + }, + { + "작업별": "현지측량", + "직종": "지적기능사", + "값": 0.33 + }, + { + "작업별": "성과설명", + "직종": "지적기사", + "값": 0.04 + }, + { + "작업별": "측량결과도 등 측량성과물 작성", + "직종": "지적기사", + "값": "(0.06)" + }, + { + "작업별": "측량결과도 등 측량성과물 작성", + "직종": "지적산업기사", + "값": "(0.12)" + }, + { + "작업별": "측량성과 관련서류 작성", + "직종": "지적산업기사", + "값": "(0.02)" + }, + { + "작업별": "측량성과 검사요청", + "직종": "지적기사", + "값": "(0.03)" + }, + { + "작업별": "측량성과 검사요청", + "직종": "지적산업기사", + "값": "(0.04)" + }, + { + "작업별": "지적측량 성과도교부", + "직종": "지적기사", + "값": "(0.02)" + }, + { + "작업별": "지적측량 성과도교부", + "직종": "지적산업기사", + "값": "(0.01)" + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적기사", + "값": 0.38 + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적산업기사", + "값": 0.35 + }, + { + "작업별": "소계", + "세부": "외업", + "직종": "지적기능사", + "값": 0.34 + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적기사", + "값": "(0.20)" + }, + { + "작업별": "소계", + "세부": "내업", + "직종": "지적산업기사", + "값": "(0.27)" + }, + { + "작업별": "합계", + "직종": "지적기사", + "값": 0.58 + }, + { + "작업별": "합계", + "직종": "지적산업기사", + "값": 0.62 + }, + { + "작업별": "합계", + "직종": "지적기능사", + "값": 0.34 + } + ], + "주": [ + "( )는 내업임.", + "본 품은 수치지역의 토지를 「공간정보의 구축 및 관리 등에 관한 법률」 제2조 제4호의 규정에 의하여 같은 법률 제2조 제25호에서 말하는 “경계점”을 지상에 복원하는 측량 품이다.", + "n은 가산횟수로 (대상면적-기준면적)÷기준면적.", + "본 품에는 경계복원 측량결과도 및 계산부 1부, 측량결과부(측량성과도 등) 1부의 성과작성품이 포함되어 있다.", + "경계복원 측량할 토지의 축척은 1/500, 1/1000로 구분한다.", + "수치지역에서 「국토의 계획 및 이용에 관한 법률」 제30조제6항 및 같은 법 제32조제4항의 도시관리계획선을 지상에 복원하기 위하여 실시하는 측량의 경우 본 품을 적용한다.", + "본 품에 사용되는 기계경비 및 재료소모품비는 별도 계상한다.", + "작업상 지적측량기준점을 설치할 경우에는 지적측량기준점 설치비를 별도 계상한다.", + "도서지역 등의 측량을 위하여 선박 등을 임차할 경우에는 임차료 실비를 별도 계상한다.", + "본 품의 외업에 필요한 여비는 공무원여비규정에 의한 국내여행자의 일비를 별도 계상한다.", + "본 품의 측량결과에 대한 설명을 부가한 감정도 및 감정서 발급을 요청할 경우에는 추가 품을 가산 적용할 수 있다.", + "[결정단가] = ΣW+직접경비+간접측량비." + ] + }, + { + "열쇠": "9-16-2 면적계수", + "이름": "도시계획선명시 측량(수치) 면적계수", + "기준": "", + "출처": "건설품셈 토목 9-16-2 주②", + "조건": { + "가산횟수": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "가산횟수": "0회", + "계수": 1.0 + }, + { + "가산횟수": "1회", + "계수": 1.3 + }, + { + "가산횟수": "2회이상", + "계수": "1.2+(0.10×n)" + } + ], + "주": [] + }, + { + "열쇠": "9-16-2 지역구분계수", + "이름": "도시계획선명시 측량(수치) 지역구분계수", + "기준": "", + "출처": "건설품셈 토목 9-16-2 주③", + "조건": { + "구분": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "구분": "면", + "계수": 1.0 + }, + { + "구분": "읍", + "계수": 1.1 + }, + { + "구분": "동시", + "계수": 1.3 + }, + { + "구분": "동구", + "계수": 1.4 + } + ], + "주": [] + }, + { + "열쇠": "9-16-2 계산예", + "이름": "도시계획선명시 측량(수치) 계산예(구지역·수치지역, 1필지 1,500㎡ 토지)", + "기준": "", + "출처": "건설품셈 토목 9-16-2 계산예", + "조건": { + "구분": "고르기" + }, + "값칸": { + "수량(T)": "", + "단가": "", + "금액": "" + }, + "줄": [ + { + "구분": "지적기사", + "수량(T)": "0.58×2.00=1.16", + "단가": "w_1", + "금액": "W_1=1.16×w_1" + }, + { + "구분": "지적산업기사", + "수량(T)": "0.62×2.00=1.24", + "단가": "w_2", + "금액": "W_2=1.24×w_2" + }, + { + "구분": "지적기능사", + "수량(T)": "0.34×2.00=0.68", + "단가": "w_3", + "금액": "W_3=0.68×w_3" + }, + { + "구분": "계", + "금액": "∑W" + } + ], + "주": [ + "㉠기본계수:1.00, ㉡등록계수:0.00, ㉢지역구분계수:0.40, ㉣면적계수:0.60. 합계 : 2.00 = (㉠+㉡+㉢+㉣)." + ] + }, + { + "열쇠": "9-17-1 자동제도(좌표독취)", + "이름": "자동제도(좌표독취)", + "기준": "지적도 크기 1매", + "출처": "건설품셈 토목 9-17-1", + "조건": { + "작업별": "고르기", + "구간": "고르기", + "직종": "고르기" + }, + "값칸": { + "값": "" + }, + "줄": [ + { + "작업별": "자료조사", + "구간": "일수", + "직종": "", + "값": "(0.04)" + }, + { + "작업별": "자료조사", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "자료조사", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.04)" + }, + { + "작업별": "계획준비", + "구간": "일수", + "직종": "", + "값": "(0.03)" + }, + { + "작업별": "계획준비", + "구간": "1일당", + "직종": "지적기사", + "값": 1 + }, + { + "작업별": "계획준비", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "계획준비", + "구간": "합계", + "직종": "지적기사", + "값": "(0.03)" + }, + { + "작업별": "계획준비", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.03)" + }, + { + "작업별": "좌표독취", + "구간": "일수", + "직종": "", + "값": "(0.37)" + }, + { + "작업별": "좌표독취", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "좌표독취", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.37)" + }, + { + "작업별": "도면작성편집", + "구간": "일수", + "직종": "", + "값": "(0.15)" + }, + { + "작업별": "도면작성편집", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "도면작성편집", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.15)" + }, + { + "작업별": "대조수정", + "구간": "일수", + "직종": "", + "값": "(0.09)" + }, + { + "작업별": "대조수정", + "구간": "1일당", + "직종": "지적기사", + "값": 1 + }, + { + "작업별": "대조수정", + "구간": "합계", + "직종": "지적기사", + "값": "(0.09)" + }, + { + "작업별": "성과작성", + "구간": "일수", + "직종": "", + "값": "(0.06)" + }, + { + "작업별": "성과작성", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "성과작성", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.06)" + }, + { + "작업별": "점검", + "구간": "일수", + "직종": "", + "값": "(0.07)" + }, + { + "작업별": "점검", + "구간": "1일당", + "직종": "지적기사", + "값": 1 + }, + { + "작업별": "점검", + "구간": "합계", + "직종": "지적기사", + "값": "(0.07)" + }, + { + "작업별": "성과인계", + "구간": "일수", + "직종": "", + "값": "(0.02)" + }, + { + "작업별": "성과인계", + "구간": "1일당", + "직종": "지적기사", + "값": 1 + }, + { + "작업별": "성과인계", + "구간": "합계", + "직종": "지적기사", + "값": "(0.02)" + }, + { + "작업별": "합계", + "구간": "일수", + "직종": "", + "값": "(0.83)" + }, + { + "작업별": "합계", + "구간": "합계", + "직종": "지적기사", + "값": "(0.21)" + }, + { + "작업별": "합계", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.65)" + } + ], + "주": [ + "( )는 내업임.", + "본 품은 좌표를 독취하여 자동제도기에 의해 도면작성 한 것이다.", + "본 품은 지적도 크기의 1매를 기준으로 한 것이다.", + "본 품에 사용되는 기계경비 및 재료소모품비는 별도 계상한다.", + "특수한 용지를 사용할 때에는 실정에 따라 재료비를 별도 계상한다.", + "기준규격의 1/2 이하의 도면작성시에는 본 품에 의한 도면작성수수료의 50%의 값을 적용한다." + ] + }, + { + "열쇠": "9-17-1 등록계수", + "이름": "자동제도(좌표독취) 등록계수", + "기준": "", + "출처": "건설품셈 토목 9-17-1 주①", + "조건": { + "구분": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "구분": "토지", + "계수": 1.0 + }, + { + "구분": "임야", + "계수": 1.28 + } + ], + "주": [] + }, + { + "열쇠": "9-17-2 자동제도(좌표입력)", + "이름": "자동제도(좌표입력)", + "기준": "지적도 크기 1매", + "출처": "건설품셈 토목 9-17-2", + "조건": { + "작업별": "고르기", + "구간": "고르기", + "직종": "고르기" + }, + "값칸": { + "값": "" + }, + "줄": [ + { + "작업별": "자료조사", + "구간": "일수", + "직종": "", + "값": "(0.05)" + }, + { + "작업별": "자료조사", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "자료조사", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.05)" + }, + { + "작업별": "계획준비", + "구간": "일수", + "직종": "", + "값": "(0.03)" + }, + { + "작업별": "계획준비", + "구간": "1일당", + "직종": "지적기사", + "값": 1 + }, + { + "작업별": "계획준비", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "계획준비", + "구간": "합계", + "직종": "지적기사", + "값": "(0.03)" + }, + { + "작업별": "계획준비", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.03)" + }, + { + "작업별": "좌표입력", + "구간": "일수", + "직종": "", + "값": "(0.31)" + }, + { + "작업별": "좌표입력", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "좌표입력", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.31)" + }, + { + "작업별": "도면작성", + "구간": "일수", + "직종": "", + "값": "(0.19)" + }, + { + "작업별": "도면작성", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "도면작성", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.19)" + }, + { + "작업별": "대조수정", + "구간": "일수", + "직종": "", + "값": "(0.07)" + }, + { + "작업별": "대조수정", + "구간": "1일당", + "직종": "지적기사", + "값": 1 + }, + { + "작업별": "대조수정", + "구간": "합계", + "직종": "지적기사", + "값": "(0.07)" + }, + { + "작업별": "성과작성", + "구간": "일수", + "직종": "", + "값": "(0.05)" + }, + { + "작업별": "성과작성", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "성과작성", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.05)" + }, + { + "작업별": "점검", + "구간": "일수", + "직종": "", + "값": "(0.03)" + }, + { + "작업별": "점검", + "구간": "1일당", + "직종": "지적기사", + "값": 1 + }, + { + "작업별": "점검", + "구간": "합계", + "직종": "지적기사", + "값": "(0.03)" + }, + { + "작업별": "성과인계", + "구간": "일수", + "직종": "", + "값": "(0.01)" + }, + { + "작업별": "성과인계", + "구간": "1일당", + "직종": "지적기사", + "값": 1 + }, + { + "작업별": "성과인계", + "구간": "합계", + "직종": "지적기사", + "값": "(0.01)" + }, + { + "작업별": "합계", + "구간": "일수", + "직종": "", + "값": "(0.74)" + }, + { + "작업별": "합계", + "구간": "합계", + "직종": "지적기사", + "값": "(0.14)" + }, + { + "작업별": "합계", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.63)" + } + ], + "주": [ + "( )는 내업임.", + "본 품은 좌표를 컴퓨터에 입력하여 자동제도기에 의해 도면작성 한 것이다.", + "본 품은 지적도 크기의 1매를 기준으로 한 것이다.", + "본 품에 사용되는 기계경비 및 재료소모품비는 별도 계상한다.", + "특수한 용지를 사용할 때에는 실정에 따라 재료비를 별도 계상한다.", + "기준규격의 1/2 이하의 도면작성시 본 품에 의한 도면작성수수료의 50%의 값을 적용한다." + ] + }, + { + "열쇠": "9-17-2 등록계수", + "이름": "자동제도(좌표입력) 등록계수", + "기준": "", + "출처": "건설품셈 토목 9-17-2 주①", + "조건": { + "구분": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "구분": "토지", + "계수": 1.0 + }, + { + "구분": "임야", + "계수": 1.28 + } + ], + "주": [] + }, + { + "열쇠": "9-17-3 자동제도(파일제공)", + "이름": "자동제도(파일제공)", + "기준": "지적도 크기 1매", + "출처": "건설품셈 토목 9-17-3", + "조건": { + "작업별": "고르기", + "구간": "고르기", + "직종": "고르기" + }, + "값칸": { + "값": "" + }, + "줄": [ + { + "작업별": "자료조사", + "구간": "일수", + "직종": "", + "값": "(0.05)" + }, + { + "작업별": "자료조사", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "자료조사", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.05)" + }, + { + "작업별": "계획준비", + "구간": "일수", + "직종": "", + "값": "(0.04)" + }, + { + "작업별": "계획준비", + "구간": "1일당", + "직종": "지적기사", + "값": 1 + }, + { + "작업별": "계획준비", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "계획준비", + "구간": "합계", + "직종": "지적기사", + "값": "(0.04)" + }, + { + "작업별": "계획준비", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.04)" + }, + { + "작업별": "데이터 편집", + "구간": "일수", + "직종": "", + "값": "(0.09)" + }, + { + "작업별": "데이터 편집", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "데이터 편집", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.09)" + }, + { + "작업별": "도면작성", + "구간": "일수", + "직종": "", + "값": "(0.06)" + }, + { + "작업별": "도면작성", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "도면작성", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.06)" + }, + { + "작업별": "대조수정", + "구간": "일수", + "직종": "", + "값": "(0.08)" + }, + { + "작업별": "대조수정", + "구간": "1일당", + "직종": "지적기사", + "값": 1 + }, + { + "작업별": "대조수정", + "구간": "합계", + "직종": "지적기사", + "값": "(0.08)" + }, + { + "작업별": "성과작성", + "구간": "일수", + "직종": "", + "값": "(0.07)" + }, + { + "작업별": "성과작성", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "성과작성", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.07)" + }, + { + "작업별": "점검", + "구간": "일수", + "직종": "", + "값": "(0.03)" + }, + { + "작업별": "점검", + "구간": "1일당", + "직종": "지적기사", + "값": 1 + }, + { + "작업별": "점검", + "구간": "합계", + "직종": "지적기사", + "값": "(0.03)" + }, + { + "작업별": "성과인계", + "구간": "일수", + "직종": "", + "값": "(0.03)" + }, + { + "작업별": "성과인계", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "성과인계", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.03)" + }, + { + "작업별": "합계", + "구간": "일수", + "직종": "", + "값": "(0.45)" + }, + { + "작업별": "합계", + "구간": "합계", + "직종": "지적기사", + "값": "(0.15)" + }, + { + "작업별": "합계", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.34)" + } + ], + "주": [ + "( )는 내업임.", + "본 품은 좌표파일을 제공받아 자동제도기에 의해 도면작성한 것이다.", + "본 품은 지적도 크기의 1매를 기준으로 한 것이다.", + "본 품에 사용되는 기계경비 및 재료소모품비는 별도 계상한다.", + "특수한 용지를 사용할 때에는 실정에 따라 재료비를 별도 계상한다.", + "기준규격의 1/2 이하의 도면작성시 본 품에 의한 도면작성수수료의 50%의 값을 적용한다." + ] + }, + { + "열쇠": "9-17-3 등록계수", + "이름": "자동제도(파일제공) 등록계수", + "기준": "", + "출처": "건설품셈 토목 9-17-3 주①", + "조건": { + "구분": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "구분": "토지", + "계수": 1.0 + }, + { + "구분": "임야", + "계수": 1.28 + } + ], + "주": [] + }, + { + "열쇠": "9-17-4 도면작성", + "이름": "도면작성", + "기준": "지적도 크기 1장", + "출처": "건설품셈 토목 9-17-4", + "조건": { + "작업별": "고르기", + "구간": "고르기", + "직종": "고르기" + }, + "값칸": { + "값": "" + }, + "줄": [ + { + "작업별": "지적전산파일변환", + "구간": "일수", + "직종": "", + "값": "(0.25)" + }, + { + "작업별": "지적전산파일변환", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "지적전산파일변환", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.25)" + }, + { + "작업별": "제도", + "구간": "일수", + "직종": "", + "값": "(0.34)" + }, + { + "작업별": "제도", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "제도", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.34)" + }, + { + "작업별": "대조수정", + "구간": "일수", + "직종": "", + "값": "(0.03)" + }, + { + "작업별": "대조수정", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "대조수정", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.03)" + }, + { + "작업별": "성과작성", + "구간": "일수", + "직종": "", + "값": "(0.13)" + }, + { + "작업별": "성과작성", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "성과작성", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.13)" + }, + { + "작업별": "점검", + "구간": "일수", + "직종": "", + "값": "(0.02)" + }, + { + "작업별": "점검", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "점검", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.02)" + }, + { + "작업별": "성과인계", + "구간": "일수", + "직종": "", + "값": "(0.01)" + }, + { + "작업별": "성과인계", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "성과인계", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.01)" + }, + { + "작업별": "합계", + "구간": "일수", + "직종": "", + "값": "(0.78)" + }, + { + "작업별": "합계", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.78)" + } + ], + "주": [ + "( )는 내업임.", + "본 품에는 지적도면 사본 1부의 성과작성품이 포함되어 있다.", + "본 품은 지적도 크기의 1장을 기준한 것이다.", + "본 품에 사용되는 기계경비 및 재료소모품비는 별도 계상한다.", + "특수한 용지를 사용할 때에는 실정에 따라 재료비를 별도 계상한다.", + "기준규격의 1/2 이하의 도면작성시에는 본 품에 의한 도면작성수수료의 50%의 값을 적용한다." + ] + }, + { + "열쇠": "9-17-4 등록계수", + "이름": "도면작성 등록계수", + "기준": "", + "출처": "건설품셈 토목 9-17-4 주①", + "조건": { + "구분": "고르기" + }, + "값칸": { + "계수": "" + }, + "줄": [ + { + "구분": "토지", + "계수": 1.0 + }, + { + "구분": "임야", + "계수": 1.28 + } + ], + "주": [] + }, + { + "열쇠": "9-17-5 조서작성", + "이름": "조서작성", + "기준": "", + "출처": "건설품셈 토목 9-17-5", + "조건": { + "작업별": "고르기", + "구간": "고르기", + "직종": "고르기" + }, + "값칸": { + "값": "" + }, + "줄": [ + { + "작업별": "자료조사", + "구간": "일수", + "직종": "", + "값": "(0.01)" + }, + { + "작업별": "자료조사", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "자료조사", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.01)" + }, + { + "작업별": "조서작성", + "구간": "일수", + "직종": "", + "값": "(0.01)" + }, + { + "작업별": "조서작성", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "조서작성", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.01)" + }, + { + "작업별": "점검", + "구간": "일수", + "직종": "", + "값": "(0.01)" + }, + { + "작업별": "점검", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "점검", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.01)" + }, + { + "작업별": "성과인계", + "구간": "일수", + "직종": "", + "값": "(0.01)" + }, + { + "작업별": "성과인계", + "구간": "1일당", + "직종": "지적산업기사", + "값": 1 + }, + { + "작업별": "성과인계", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.01)" + }, + { + "작업별": "합계", + "구간": "일수", + "직종": "", + "값": "(0.04)" + }, + { + "작업별": "합계", + "구간": "합계", + "직종": "지적산업기사", + "값": "(0.04)" + } + ], + "주": [ + "( )는 내업임.", + "본 품에는 면적조서 1부의 성과작성품이 포함되어 있다.", + "본 품은 일단의 토지개발사업지구, 도로편입지, 하천편입지 등에 대한 전필별 조서작성에 따른 작업 품이다.", + "본 품에 사용되는 기계경비 및 재료소모품비는 별도 계상한다.", + "조서용지는 A4횡 사이즈 10횡(또는 줄)을 기준 서식으로 한다." + ] + }, + { + "열쇠": "9-18-1 개별지적(전산)자료정비(토지·수치)", + "이름": "개별지적(전산)자료정비(토지·수치)", + "기준": "1필지", + "출처": "건설품셈 토목 9-18-1", + "조건": { + "작업구분": "고르기", + "세부": "고르기" + }, + "값칸": { + "지적기사": "", + "지적산업기사": "", + "지적기능사": "" + }, + "줄": [ + { + "작업구분": "계획준비", + "지적기사": "(0.002)", + "지적산업기사": "(0.002)" + }, + { + "작업구분": "자료조사", + "지적산업기사": "(0.010)" + }, + { + "작업구분": "준비도 작성", + "지적산업기사": "(0.007)" + }, + { + "작업구분": "자료정비", + "지적산업기사": "(0.030)", + "지적기능사": "(0.030)" + }, + { + "작업구분": "성과결정", + "지적기사": "(0.004)" + }, + { + "작업구분": "성과점검 및 인계", + "지적기사": "(0.004)" + }, + { + "작업구분": "소계", + "세부": "내업", + "지적기사": "(0.010)", + "지적산업기사": "(0.049)", + "지적기능사": "(0.030)" + }, + { + "작업구분": "합계", + "지적기사": 0.01, + "지적산업기사": 0.049, + "지적기능사": 0.03 + } + ], + "주": [ + "( )는 내업임.", + "본 품은 「공간정보의 구축 및 관리 등에 관한 법률」 제84조제2항 및 같은 법 시행령 제82조에 따라 개별지적전산자료의 오류(축척별, 행정구역별, 도곽별 등)를 조사·정비하기 위한 업무를 수행할 경우의 품이다.", + "본 품에는 성과도면파일(DAT 등), 성과조서파일 및 인쇄물의 성과작성품이 포함되어 있다.", + "본 품은 1필지를 기준한 것이다.", + "성과 탑재 완료 후 관리기관의 자료변동 등으로 인한 유지보수 발생 시에는 별도 품을 계상한다.", + "본 품에 사용되는 기계경비 및 재료소모품비는 별도 계상한다." + ] + }, + { + "열쇠": "9-18-2 개별지적(전산)자료정비(임야)", + "이름": "개별지적(전산)자료정비(임야)", + "기준": "1필지", + "출처": "건설품셈 토목 9-18-2", + "조건": { + "작업구분": "고르기", + "세부": "고르기" + }, + "값칸": { + "지적기사": "", + "지적산업기사": "", + "지적기능사": "" + }, + "줄": [ + { + "작업구분": "계획준비", + "지적기사": "(0.002)", + "지적산업기사": "(0.002)" + }, + { + "작업구분": "자료조사", + "지적산업기사": "(0.010)" + }, + { + "작업구분": "준비도 작성", + "지적산업기사": "(0.009)" + }, + { + "작업구분": "자료정비", + "지적산업기사": "(0.042)", + "지적기능사": "(0.042)" + }, + { + "작업구분": "성과결정", + "지적기사": "(0.005)" + }, + { + "작업구분": "성과점검 및 인계", + "지적기사": "(0.004)" + }, + { + "작업구분": "소계", + "세부": "내업", + "지적기사": "(0.011)", + "지적산업기사": "(0.063)", + "지적기능사": "(0.042)" + }, + { + "작업구분": "합계", + "지적기사": 0.011, + "지적산업기사": 0.063, + "지적기능사": 0.042 + } + ], + "주": [ + "( )는 내업임.", + "본 품은 「공간정보의 구축 및 관리 등에 관한 법률」 제84조제2항 및 같은 법 시행령 제82조에 따라 개별지적전산자료의 오류(축척별, 행정구역별, 도곽별 등)를 조사·정비하기 위한 업무를 수행할 경우의 품이다.", + "본 품에는 성과도면파일(DAT 등), 성과조서파일 및 인쇄물의 성과작성품이 포함되어 있다.", + "본 품은 1필지를 기준한 것이다.", + "성과 탑재 완료 후 관리기관의 자료변동 등으로 인한 유지보수 발생 시에는 별도 품을 계상한다.", + "본 품에 사용되는 기계경비 및 재료소모품비는 별도 계상한다." + ] + }, + { + "열쇠": "9-18-3 연속지적도 작성(도해·수치)", + "이름": "연속지적도 작성(도해·수치)", + "기준": "지적(임야)도 1도곽", + "출처": "건설품셈 토목 9-18-3", + "조건": { + "작업구분": "고르기", + "세부": "고르기" + }, + "값칸": { + "지적기사": "", + "지적산업기사": "", + "지적기능사": "" + }, + "줄": [ + { + "작업구분": "계획 및 준비", + "지적기사": "(0.001)", + "지적산업기사": "(0.001)" + }, + { + "작업구분": "자료조사 및 수집", + "지적산업기사": "(0.001)" + }, + { + "작업구분": "공간/속성자료 위상,구조화 작업", + "지적산업기사": "(0.014)", + "지적기능사": "(0.007)" + }, + { + "작업구분": "성과대조 및 협의", + "지적기사": "(0.001)" + }, + { + "작업구분": "성과납품", + "지적기사": "(0.001)" + }, + { + "작업구분": "소계", + "세부": "내업", + "지적기사": "(0.003)", + "지적산업기사": "(0.016)", + "지적기능사": "(0.007)" + }, + { + "작업구분": "합계", + "지적기사": 0.003, + "지적산업기사": 0.016, + "지적기능사": 0.007 + } + ], + "주": [ + "( )는 내업임.", + "본 품은 「공간정보의 구축 및 관리 등에 관한 법률」 제90조의2에 따라 부동산종합공부시스템에 구축된 지적도면을 이용하여 토지정책기반자료로 활용될 수 있는 데이터를 구축하기 위한 연속된 형태의 도면을 신규로 작성할 경우의 품이다.", + "본 품에는 연속지적도, 좌표데이터, 완료보고서 등의 성과작성품이 포함되어 있다.", + "본 품은 지적(임야)도 1도곽을 기준한 것이다.", + "본 품에 사용되는 기계경비 및 재료소모품비는 별도 계상한다." + ] + }, + { + "열쇠": "9-18-4 연속지적도 품질개선(토지)", + "이름": "연속지적도 품질개선(토지)", + "기준": "지적(임야)도 1도곽", + "출처": "건설품셈 토목 9-18-4", + "조건": { + "작업구분": "고르기", + "세부": "고르기" + }, + "값칸": { + "지적기사": "", + "지적산업기사": "", + "지적기능사": "" + }, + "줄": [ + { + "작업구분": "계획 및 준비", + "지적기사": "(0.001)", + "지적산업기사": "(0.001)" + }, + { + "작업구분": "자료조사 및 수집", + "지적산업기사": "(0.001)" + }, + { + "작업구분": "자료분석 및 기초자료 정비", + "지적산업기사": "(0.001)", + "지적기능사": "(0.001)" + }, + { + "작업구분": "공간/속성자료 위상,구조화 수정", + "지적산업기사": "(0.036)" + }, + { + "작업구분": "성과대조 및 협의", + "지적기사": "(0.002)" + }, + { + "작업구분": "성과납품", + "지적기사": "(0.001)", + "지적산업기사": "(0.001)" + }, + { + "작업구분": "소계", + "세부": "내업", + "지적기사": "(0.004)", + "지적산업기사": "(0.040)", + "지적기능사": "(0.001)" + }, + { + "작업구분": "합계", + "지적기사": 0.004, + "지적산업기사": 0.04, + "지적기능사": 0.001 + } + ], + "주": [ + "( )는 내업임.", + "본 품은 「공간정보의 구축 및 관리 등에 관한 법률」 제90조의2에 따라 부동산종합공부시스템에 구축된 연속지적도를 지적측량 현황 데이터 및 지적활용데이터 등을 이용, 데이터베이스의 품질을 향상하여 국가공간정보체계의 기반 지리정보가 될 수 있도록 데이터베이스를 구축하는 업무를 수행할 경우의 품이다.", + "본 품에는 개별지적정비데이터(DAT), 연속지적도, 좌표데이터, 필지별 정비조서(정비한 개별지적 대상), 정비 전후 비교(요구시), 완료보고서 등의 성과작성품이 포함되어 있다.", + "본 품은 지적(임야)도 1도곽을 기준한 것이다.", + "본 품에 사용되는 기계경비 및 재료소모품비는 별도 계상한다." + ] + }, + { + "열쇠": "9-18-5 연속지적도 품질개선(임야)", + "이름": "연속지적도 품질개선(임야)", + "기준": "지적(임야)도 1도곽", + "출처": "건설품셈 토목 9-18-5", + "조건": { + "작업구분": "고르기", + "세부": "고르기" + }, + "값칸": { + "지적기사": "", + "지적산업기사": "" + }, + "줄": [ + { + "작업구분": "계획 및 준비", + "지적기사": "(0.001)", + "지적산업기사": "(0.001)" + }, + { + "작업구분": "자료조사 및 수집", + "지적산업기사": "(0.001)" + }, + { + "작업구분": "자료분석 및 기초자료 정비", + "지적산업기사": "(0.002)" + }, + { + "작업구분": "공간/속성자료 위상,구조화 수정", + "지적산업기사": "(0.038)" + }, + { + "작업구분": "성과대조 및 협의", + "지적기사": "(0.002)" + }, + { + "작업구분": "성과납품", + "지적기사": "(0.001)", + "지적산업기사": "(0.001)" + }, + { + "작업구분": "소계", + "세부": "내업", + "지적기사": "(0.004)", + "지적산업기사": "(0.043)" + }, + { + "작업구분": "합계", + "지적기사": 0.004, + "지적산업기사": 0.043 + } + ], + "주": [ + "( )는 내업임.", + "본 품은 「공간정보의 구축 및 관리 등에 관한 법률」 제90조의2에 따라 부동산종합공부시스템에 구축된 연속지적도를 지적측량 현황 데이터 및 지적활용데이터 등을 이용, 데이터베이스의 품질을 향상하여 국가공간정보체계의 기반 지리정보가 될 수 있도록 데이터베이스를 구축하는 업무를 수행할 경우의 품이다.", + "본 품에는 개별지적정비데이터(DAT), 연속지적도, 좌표데이터, 필지별 정비조서(정비한 개별지적 대상), 정비 전후 비교(요구시), 완료보고서 등의 성과작성품이 포함되어 있다.", + "본 품은 지적(임야)도 1도곽을 기준한 것이다.", + "본 품에 사용되는 기계경비 및 재료소모품비는 별도 계상한다." + ] + }, + { + "열쇠": "9-18-6 연속지적도 품질개선(수치)", + "이름": "연속지적도 품질개선(수치)", + "기준": "지적(임야)도 1도곽", + "출처": "건설품셈 토목 9-18-6", + "조건": { + "작업구분": "고르기", + "세부": "고르기" + }, + "값칸": { + "지적기사": "", + "지적산업기사": "", + "지적기능사": "" + }, + "줄": [ + { + "작업구분": "계획 및 준비", + "지적기사": "(0.001)" + }, + { + "작업구분": "자료조사 및 수집", + "지적산업기사": "(0.001)" + }, + { + "작업구분": "자료분석 및 기초자료 정비", + "지적산업기사": "(0.001)" + }, + { + "작업구분": "공간/속성자료 위상,구조화 수정", + "지적산업기사": "(0.010)", + "지적기능사": "(0.010)" + }, + { + "작업구분": "성과대조 및 협의", + "지적산업기사": "(0.002)" + }, + { + "작업구분": "성과납품", + "지적기사": "(0.001)" + }, + { + "작업구분": "소계", + "세부": "내업", + "지적기사": "(0.002)", + "지적산업기사": "(0.014)", + "지적기능사": "(0.010)" + }, + { + "작업구분": "합계", + "지적기사": 0.002, + "지적산업기사": 0.014, + "지적기능사": 0.01 + } + ], + "주": [ + "( )는 내업임.", + "본 품은 「공간정보의 구축 및 관리 등에 관한 법률」 제90조의2에 따라 부동산종합공부시스템에 구축된 연속지적도를 지적측량 현황 데이터 및 지적활용데이터 등을 이용, 데이터베이스의 품질을 향상하여 국가공간정보체계의 기반 지리정보가 될 수 있도록 데이터베이스를 구축하는 업무를 수행할 경우의 품이다.", + "본 품에는 개별지적정비데이터(DAT), 연속지적도, 좌표데이터, 필지별 정비조서(정비한 개별지적 대상), 정비 전후 비교(요구시), 완료보고서 등의 성과작성품이 포함되어 있다.", + "본 품은 지적(임야)도 1도곽을 기준한 것이다.", + "본 품에 사용되는 기계경비 및 재료소모품비는 별도 계상한다." + ] } ] } From 10598f3681fbec888acb20ebbba7184009f531e3 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sat, 19 Sep 2026 18:43:36 +0900 Subject: [PATCH 13/14] =?UTF-8?q?feat(M01):=20=EB=A7=88=EC=8A=A4=ED=84=B0?= =?UTF-8?q?=20=EC=9A=94=EC=86=8C=20=EA=B4=80=EB=A6=AC=EC=9E=90=20=ED=99=94?= =?UTF-8?q?=EB=A9=B4=20-=20=EA=B7=B8=EB=A3=B9=20=ED=83=AD=207=20=C2=B7=20?= =?UTF-8?q?=EC=9A=94=EC=86=8C=20=ED=91=9C=20=C2=B7=20=ED=91=9C=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D/=ED=91=9C=20=ED=95=98=EB=82=98=20=C2=B7=20=EC=B4=88?= =?UTF-8?q?=EC=95=88(=EA=B3=A0=EC=B9=9C=20=EC=B9=B8=20=EB=85=B8=EB=9E=91)?= =?UTF-8?q?=20=C2=B7=20=EC=A0=80=EC=9E=A5=20409/422=20=EC=95=88=EB=82=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_016WRFJmmhPi4exAzHgPZHMT --- A00_Common/main.ts | 1 + A00_Common/router.ts | 2 + B01_Dashboard/B01_Dashboard_UI_Page.ts | 5 + M01_MasterData/M01_MasterData_Api_Fetch.ts | 109 ++++++++++ M01_MasterData/M01_MasterData_Draft.ts | 161 +++++++++++++++ M01_MasterData/M01_MasterData_UI_Cells.ts | 121 +++++++++++ M01_MasterData/M01_MasterData_UI_Page.ts | 226 +++++++++++++++++++++ M01_MasterData/M01_MasterData_UI_Rows.ts | 153 ++++++++++++++ M01_MasterData/M01_MasterData_UI_Style.css | 219 ++++++++++++++++++++ M01_MasterData/M01_MasterData_UI_Tables.ts | 200 ++++++++++++++++++ config/config_frontend.ts | 3 + ui_template/ui_template_locale.ts | 2 + ui_template/ui_template_locale_m1.ts | 39 ++++ 13 files changed, 1241 insertions(+) create mode 100644 M01_MasterData/M01_MasterData_Api_Fetch.ts create mode 100644 M01_MasterData/M01_MasterData_Draft.ts create mode 100644 M01_MasterData/M01_MasterData_UI_Cells.ts create mode 100644 M01_MasterData/M01_MasterData_UI_Page.ts create mode 100644 M01_MasterData/M01_MasterData_UI_Rows.ts create mode 100644 M01_MasterData/M01_MasterData_UI_Style.css create mode 100644 M01_MasterData/M01_MasterData_UI_Tables.ts create mode 100644 ui_template/ui_template_locale_m1.ts diff --git a/A00_Common/main.ts b/A00_Common/main.ts index 26d914b8..537077f4 100644 --- a/A00_Common/main.ts +++ b/A00_Common/main.ts @@ -27,6 +27,7 @@ const FOOTERLESS_ROUTES: readonly RoutePath[] = [ ROUTES.B10_PAYMENT, ROUTES.B11_STATUS, ROUTES.Z01_MASTER_DATA, + ROUTES.M01_MASTER_DATA, ]; function bootstrap(): void { diff --git a/A00_Common/router.ts b/A00_Common/router.ts index b6c99652..547dc50f 100644 --- a/A00_Common/router.ts +++ b/A00_Common/router.ts @@ -61,6 +61,8 @@ const routeTable: Partial Promise>> = { (await import("../B11_Status/B11_Status_UI_Loading")).renderB11Loading, [ROUTES.Z01_MASTER_DATA]: async () => (await import("../Z01_MasterData/Z01_MasterData_UI_Page")).renderZ01MasterData, + [ROUTES.M01_MASTER_DATA]: async () => + (await import("../M01_MasterData/M01_MasterData_UI_Page")).renderM01MasterData, }; /** 로그인 여부 (토큰 존재 확인) */ diff --git a/B01_Dashboard/B01_Dashboard_UI_Page.ts b/B01_Dashboard/B01_Dashboard_UI_Page.ts index 9f675b88..6e47a210 100644 --- a/B01_Dashboard/B01_Dashboard_UI_Page.ts +++ b/B01_Dashboard/B01_Dashboard_UI_Page.ts @@ -139,6 +139,11 @@ function buildSystemSettingsPanel(): HTMLElement { variant: "ghost", onClick: () => navigateTo(ROUTES.Z01_MASTER_DATA), }), + createButton({ + label: L("B01_Dashboard_MasterElements"), + variant: "ghost", + onClick: () => navigateTo(ROUTES.M01_MASTER_DATA), + }), ); return wrap; } diff --git a/M01_MasterData/M01_MasterData_Api_Fetch.ts b/M01_MasterData/M01_MasterData_Api_Fetch.ts new file mode 100644 index 00000000..76e11db9 --- /dev/null +++ b/M01_MasterData/M01_MasterData_Api_Fetch.ts @@ -0,0 +1,109 @@ +/* ============================================================================= + * M01_MasterData_Api_Fetch.ts + * 마스터 요소 화면 서버 호출 — 계약 `resources/master_data/_화면_계약.md` · 시스템 관리자만 + * ========================================================================== */ + +import { API_BASE_URL } from "@config/config_frontend"; + +/** 줄·표 한 개 — 파일 그대로(한글 칸). */ +export type Row = Record; + +export interface GroupInfo { + group: string; + files: number; + rows: number; +} + +export interface FileInfo { + file: string; + book: string | null; + chapter: string; + edition: string | null; + rows: number; + version: string; +} + +export interface RowsPage { + file: string; + version: string; + total: number; + page: number; + size: number; + rows: Row[]; +} + +export interface TableHead { + 열쇠: string; + 이름: string; + 기준: string; + 출처: string; + 조건: Record; + 값칸: Record; + count: number; +} + +export interface Change { + op: "edit" | "add" | "delete"; + key?: string; + row?: Row; +} + +export interface FileChanges { + file: string; + version: string; + changes: Change[]; +} + +/** 저장 결과 — 200 은 새 판본 · 나머지는 화면이 그대로 안내할 상태. */ +export type SaveResult = + | { status: 200; files: { file: string; version: string }[] } + | { status: 409; stale: string[] } + | { status: 422; errors: string[] } + | { status: number; detail: string }; + +async function call(path: string, init: RequestInit = {}): Promise<{ status: number; body: T }> { + const response = await fetch(`${API_BASE_URL}/m01${path}`, { + credentials: "include", + headers: { "Content-Type": "application/json" }, + ...init, + }); + return { status: response.status, body: (await response.json()) as T }; +} + +async function get(path: string, params: Record): Promise { + const query = new URLSearchParams(Object.entries(params).map(([k, v]) => [k, String(v)])); + const { status, body } = await call(`${path}?${query}`); + if (status !== 200) throw new Error(String(body.detail ?? `HTTP ${status}`)); + return body; +} + +export const fetchGroups = async (): Promise => + (await get<{ groups: GroupInfo[] }>("/groups", {})).groups; + +export const fetchFiles = async (group: string): Promise => + (await get<{ files: FileInfo[] }>(`/groups/${encodeURIComponent(group)}/files`, {})).files; + +export const fetchRows = (file: string, page: number, size: number, q: string): Promise => + get("/rows", { file, page, size, q }); + +export const fetchTables = ( + file: string, + q: string, +): Promise<{ version: string; tables: TableHead[] }> => get("/tables", { file, q }); + +export const fetchTable = ( + file: string, + key: string, +): Promise<{ version: string; table: Row & { 줄: Row[] } }> => get("/table", { file, key }); + +export async function saveFiles(files: FileChanges[]): Promise { + const { status, body } = await call>("/save", { + method: "POST", + body: JSON.stringify({ files }), + }); + const detail = body.detail as { stale?: string[]; errors?: string[] } | string | undefined; + if (status === 200) return { status, files: body.files as { file: string; version: string }[] }; + if (status === 409 && typeof detail === "object") return { status, stale: detail.stale ?? [] }; + if (status === 422 && typeof detail === "object") return { status, errors: detail.errors ?? [] }; + return { status, detail: typeof detail === "string" ? detail : JSON.stringify(detail) }; +} diff --git a/M01_MasterData/M01_MasterData_Draft.ts b/M01_MasterData/M01_MasterData_Draft.ts new file mode 100644 index 00000000..4201d541 --- /dev/null +++ b/M01_MasterData/M01_MasterData_Draft.ts @@ -0,0 +1,161 @@ +/* ============================================================================= + * M01_MasterData_Draft.ts + * 고친 것 초안 — sessionStorage 에만 쌓임(자동저장 없음) · [저장] 때만 서버로. + * + * 요소 파일 = 줄 단위(edits · adds · deletes) · 표형 파일 = 표 하나 통째(tables). + * ========================================================================== */ + +import type { FileChanges, Row } from "./M01_MasterData_Api_Fetch"; + +/** o = 원래 줄 번호(새 줄은 null) — 노랑 칠은 이 번호의 원래 줄과 견줌. */ +export interface TableItem { + o: number | null; + r: Row; +} + +interface TableDraft { + base: Row; + items: TableItem[]; +} + +interface FileDraft { + version: string; + edits: Record; + adds: Row[]; + deletes: string[]; + tables: Record; +} + +const STORAGE_KEY = "m01_master_draft"; +const listeners = new Set<() => void>(); + +function readStore(): Record { + try { + return JSON.parse(sessionStorage.getItem(STORAGE_KEY) ?? "{}") as Record; + } catch { + return {}; + } +} + +let store = readStore(); + +export const same = (a: unknown, b: unknown): boolean => JSON.stringify(a) === JSON.stringify(b); + +/** 구독 — 돌려받은 함수를 부르면 해제. */ +export function onDraftChange(fn: () => void): () => void { + listeners.add(fn); + return () => void listeners.delete(fn); +} + +function touch(file: string): void { + const d = store[file]; + if ( + d && + !Object.keys(d.edits).length && + !d.adds.length && + !d.deletes.length && + !Object.keys(d.tables).length + ) { + delete store[file]; + } + try { + sessionStorage.setItem(STORAGE_KEY, JSON.stringify(store)); + } catch { + /* 저장소 막힘 — 이 탭 메모리에서만 유지 */ + } + listeners.forEach((fn) => fn()); +} + +function slot(file: string, version: string): FileDraft { + return (store[file] ??= { version, edits: {}, adds: [], deletes: [], tables: {} }); +} + +export function peek(file: string): FileDraft | undefined { + return store[file]; +} + +const countOf = (d: FileDraft): number => + Object.keys(d.edits).length + d.adds.length + d.deletes.length + Object.keys(d.tables).length; + +export const fileCount = (file: string): number => (store[file] ? countOf(store[file]) : 0); +export const totalCount = (): number => Object.values(store).reduce((n, d) => n + countOf(d), 0); + +/** 그 파일을 초안이 받은 판본과 다른 판본으로 읽었나 — 저장하면 409 로 막힐 초안. */ +export const isStale = (file: string, version: string): boolean => + store[file] !== undefined && store[file].version !== version; + +/* --- 요소 파일 --- */ +export function editRow(file: string, version: string, key: string, orig: Row, next: Row): void { + const d = slot(file, version); + if (same(orig, next)) delete d.edits[key]; + else d.edits[key] = next; + touch(file); +} + +export function addRow(file: string, version: string, row: Row): void { + slot(file, version).adds.push(row); + touch(file); +} + +export function setAdd(file: string, index: number, row: Row): void { + store[file].adds[index] = row; + touch(file); +} + +export function removeAdd(file: string, index: number): void { + store[file].adds.splice(index, 1); + touch(file); +} + +export function toggleDelete(file: string, version: string, key: string): void { + const d = slot(file, version); + d.deletes = d.deletes.includes(key) ? d.deletes.filter((k) => k !== key) : [...d.deletes, key]; + touch(file); +} + +/* --- 표형 파일 --- */ +export function setTable( + file: string, + version: string, + key: string, + base: Row, + items: TableItem[], + orig: Row[], +): void { + const d = slot(file, version); + if (items.length === orig.length && items.every((it, i) => it.o === i && same(it.r, orig[i]))) { + delete d.tables[key]; + } else { + d.tables[key] = { base, items }; + } + touch(file); +} + +export const tableItems = (file: string, key: string): TableItem[] | undefined => + store[file]?.tables[key]?.items; + +/* --- 저장·버리기 --- */ +export function payload(): FileChanges[] { + return Object.entries(store).map(([file, d]) => ({ + file, + version: d.version, + changes: [ + ...Object.entries(d.edits) + .filter(([key]) => !d.deletes.includes(key)) + .map(([key, row]) => ({ op: "edit" as const, key, row })), + ...Object.entries(d.tables).map(([key, t]) => ({ + op: "edit" as const, + key, + row: { ...t.base, 줄: t.items.map((it) => it.r) }, + })), + ...d.adds.map((row) => ({ op: "add" as const, row })), + ...d.deletes.map((key) => ({ op: "delete" as const, key })), + ], + })); +} + +/** files 를 안 주면 전부 버림. */ +export function discard(files?: string[]): void { + for (const file of files ?? Object.keys(store)) delete store[file]; + touch(""); +} diff --git a/M01_MasterData/M01_MasterData_UI_Cells.ts b/M01_MasterData/M01_MasterData_UI_Cells.ts new file mode 100644 index 00000000..f1e4441b --- /dev/null +++ b/M01_MasterData/M01_MasterData_UI_Cells.ts @@ -0,0 +1,121 @@ +/* ============================================================================= + * M01_MasterData_UI_Cells.ts + * 칸 다루기 — 값 → 글 · 글 → 값 · 눌러 고치기 · 쪽 나눔 띠 (요소·표 화면 공용) + * ========================================================================== */ + +import { createButton, el } from "@ui/ui_template_elements"; +import { t as L } from "@ui/ui_template_locale"; +import type { Row } from "./M01_MasterData_Api_Fetch"; + +/** 묶음 값(`값 = {가격: …}`)을 「값›가격」 칸으로 펼칠 때의 구분자. */ +export const SEP = "›"; + +export const isScalar = (v: unknown): boolean => + v === null || v === undefined || ["string", "number", "boolean"].includes(typeof v); + +/** 줄 → 칸 이름별 값. 묶음(dict) 칸은 한 단계 펼침. */ +export function flatten(row: Row): Record { + const out: Record = {}; + for (const [k, v] of Object.entries(row)) { + if (v && typeof v === "object" && !Array.isArray(v)) { + for (const [k2, v2] of Object.entries(v)) out[`${k}${SEP}${k2}`] = v2; + } else { + out[k] = v; + } + } + return out; +} + +/** 칸 이름(펼친 것 포함)에 값을 넣은 새 줄. */ +export function withCell(row: Row, path: string, value: unknown): Row { + const [head, sub] = path.split(SEP); + if (sub === undefined) return { ...row, [head]: value }; + return { ...row, [head]: { ...(row[head] as Row), [sub]: value } }; +} + +export function show(v: unknown): string { + if (v === null || v === undefined) return ""; + if (Array.isArray(v)) return v.map((x) => (x === null ? "" : String(x))).join(" ~ "); + return typeof v === "object" ? JSON.stringify(v) : String(v); +} + +const NUMBER = /^-?\d+(\.\d+)?$/; + +/** 글 → 수(수 꼴이면) 아니면 글. 빈 글 = null. */ +export function toNumberish(text: string): number | string | null { + const s = text.replace(/,/g, "").trim(); + if (s === "") return null; + return NUMBER.test(s) ? Number(s) : text.trim(); +} + +/** 원래 값의 꼴을 따라 글을 값으로 — 글이었으면 글 · 수·빈 칸이었으면 수 꼴이면 수. */ +export const coerce = (text: string, orig: unknown): unknown => + typeof orig === "string" ? text : toNumberish(text); + +/** 「아래 ~ 위」 → [아래, 위] (빈 쪽 = null · 「~」 없으면 한 값). */ +export function toRange(text: string): unknown { + if (!text.includes("~")) return toNumberish(text); + return text.split("~").map((s) => (s.trim() === "" ? null : toNumberish(s))); +} + +/** 칸을 눌러 고침 — Enter·칸 밖 누름 = 확정 · Esc = 취소. */ +export function startEdit(td: HTMLElement, text: string, commit: (value: string) => void): void { + if (td.querySelector("input")) return; + const input = el("input", { className: "m01-master__cell-input", attrs: { type: "text" } }); + input.value = text; + td.textContent = ""; + td.append(input); + input.focus(); + input.select(); + let done = false; + const finish = (ok: boolean): void => { + if (done) return; + done = true; + if (ok && input.value !== text) commit(input.value); + else td.textContent = text; + }; + input.addEventListener("keydown", (e) => { + if (e.key === "Enter") finish(true); + else if (e.key === "Escape") finish(false); + }); + input.addEventListener("blur", () => finish(true)); +} + +/** 쪽 나눔 띠 — 이전·다음 · 「n / N 쪽 · 전체 줄」. */ +export function buildPager( + total: number, + size: number, + page: number, + goto: (page: number) => void, +): HTMLElement { + const last = Math.max(1, Math.ceil(total / size)); + const prev = createButton({ label: L("M01_Prev"), variant: "ghost", disabled: page <= 1 }); + const next = createButton({ label: L("M01_Next"), variant: "ghost", disabled: page >= last }); + prev.addEventListener("click", () => goto(page - 1)); + next.addEventListener("click", () => goto(page + 1)); + return el("div", { + className: "m01-master__pager", + children: [ + el("span", { + text: `${page} / ${last} ${L("M01_Page")} · ${total.toLocaleString("ko-KR")} ${L("M01_Rows")}`, + }), + prev, + next, + ], + }); +} + +/** 칸 하나 — 노랑(고침) · 눌러 고침. */ +export function buildCell( + text: string, + opts: { changed: boolean; onEdit?: (value: string) => void }, +): HTMLTableCellElement { + const td = el("td", { text, attrs: { title: text } }); + td.classList.toggle("is-changed", opts.changed); + if (opts.onEdit) { + const onEdit = opts.onEdit; + td.classList.add("is-editable"); + td.addEventListener("click", () => startEdit(td, text, onEdit)); + } + return td; +} diff --git a/M01_MasterData/M01_MasterData_UI_Page.ts b/M01_MasterData/M01_MasterData_UI_Page.ts new file mode 100644 index 00000000..69f178ac --- /dev/null +++ b/M01_MasterData/M01_MasterData_UI_Page.ts @@ -0,0 +1,226 @@ +/* ============================================================================= + * M01_MasterData_UI_Page.ts + * 마스터 요소 화면 — 좌측 도킹 패널(그룹 탭 7 · 파일 고르기) / 우측 요소 표 · 표 목록 + * + * 시스템 관리자만. 고친 것은 초안(sessionStorage)에 쌓이고 [저장] 한 번에 서버로 — + * 자동저장 없음. 로직 그룹은 다음 화면. + * ========================================================================== */ + +import "@ui/ui_template_workflow_layout.css"; +import { ROUTES } from "@config/config_frontend"; +import { + createButton, + el, + hideLoadingOverlay, + showLoadingOverlay, + showToast, +} from "@ui/ui_template_elements"; +import { t as L } from "@ui/ui_template_locale"; +import { createWorkflowOverlays } from "@ui/ui_template_overlay"; +import { navigateTo } from "../A00_Common/router"; +import { fetchSessionUser } from "../A06_Login/A06_Login_Api_Fetch"; +import { + fetchFiles, + fetchGroups, + saveFiles, + type FileInfo, + type GroupInfo, +} from "./M01_MasterData_Api_Fetch"; +import { discard, isStale, onDraftChange, payload, totalCount } from "./M01_MasterData_Draft"; +import { renderRows } from "./M01_MasterData_UI_Rows"; +import { renderTables } from "./M01_MasterData_UI_Tables"; +import "./M01_MasterData_UI_Style.css"; + +const TABLE_GROUPS = ["소요량", "계수"]; +const fileLabel = (file: string): string => file.replace(/^[^_]+_/, "").replace(/\.json$/, ""); + +export async function renderM01MasterData(root: HTMLElement): Promise { + const user = await fetchSessionUser().catch(() => null); + if (user?.role !== "SYSTEM_ADMIN") { + showToast(L("M01_AdminOnly"), "error"); + navigateTo(ROUTES.B01_ACCOUNT); + return; + } + showLoadingOverlay(); + let groups: GroupInfo[] = []; + try { + groups = (await fetchGroups()).filter((g) => g.group !== "로직"); + } catch (error) { + showToast(error instanceof Error ? error.message : L("M01_LoadFailed"), "error"); + } finally { + hideLoadingOverlay(); + } + root.innerHTML = ""; + root.append(buildPage(groups)); +} + +function buildPage(groups: GroupInfo[]): HTMLElement { + let group = ""; + let current: FileInfo | null = null; + let query = ""; + let dispose = (): void => {}; + + /* --- 우측: 머리(제목·찾기·저장) + 알림 + 본문 --- */ + const title = el("h2", { className: "m01-master__title", text: L("M01_PickFile") }); + const search = el("input", { + className: "m01-master__search", + attrs: { type: "search", placeholder: L("M01_Search") }, + }); + const summary = el("span", { className: "m01-master__summary" }); + const save = createButton({ label: L("M01_Save"), variant: "filled" }); + const drop = createButton({ label: L("M01_Discard"), variant: "ghost" }); + const notice = el("div", { className: "m01-master__notice", attrs: { hidden: "" } }); + const body = el("div", { className: "m01-master__body" }); + const head = el("div", { + className: "m01-master__head", + children: [title, search, summary, drop, save], + }); + + const showNotice = (nodes: (HTMLElement | string)[]): void => { + notice.replaceChildren(...nodes); + notice.hidden = nodes.length === 0; + }; + const refreshBar = (): void => { + const n = totalCount(); + summary.textContent = n ? L("M01_Changed").replace("{value}", String(n)) : ""; + save.disabled = drop.disabled = n === 0; + }; + onDraftChange(refreshBar); + refreshBar(); + + const openFile = (file: FileInfo): void => { + dispose(); + current = file; + title.textContent = `${group} · ${fileLabel(file.file)}`; + const view = TABLE_GROUPS.includes(group) ? renderTables : renderRows; + dispose = view(body, file.file, query); + showNotice(isStale(file.file, file.version) ? [L("M01_FileStale")] : []); + }; + + let searchTimer: number | undefined; + search.addEventListener("input", () => { + window.clearTimeout(searchTimer); + searchTimer = window.setTimeout(() => { + query = search.value.trim(); + if (current) openFile(current); + }, 300); + }); + + drop.addEventListener("click", () => { + if (!window.confirm(L("M01_DiscardConfirm"))) return; + discard(); + showNotice([]); + }); + + save.addEventListener("click", async () => { + save.disabled = true; + try { + const result = await saveFiles(payload()); + if (result.status === 200 && "files" in result) { + discard(result.files.map((f) => f.file)); + showNotice([]); + showToast(L("M01_Saved"), "success"); + await reloadFiles(); + } else if (result.status === 409 && "stale" in result) { + showNotice(staleNotice(result.stale)); + } else if (result.status === 422 && "errors" in result) { + showNotice([ + el("strong", { text: L("M01_CheckErrors") }), + ...result.errors.map((e) => el("p", { text: e })), + ]); + } else if ("detail" in result) { + showNotice([L("M01_SaveFailed").replace("{value}", result.detail)]); + } + } catch (error) { + showNotice([ + L("M01_SaveFailed").replace("{value}", error instanceof Error ? error.message : ""), + ]); + } finally { + refreshBar(); + } + }); + + const staleNotice = (stale: string[]): (HTMLElement | string)[] => { + const again = createButton({ label: L("M01_StaleReload"), variant: "ghost" }); + again.addEventListener("click", async () => { + discard(stale); + showNotice([]); + await reloadFiles(); + }); + return [L("M01_Stale").replace("{value}", stale.map(fileLabel).join(", ")), again]; + }; + + /* --- 좌측: 그룹 탭 + 파일 --- */ + const tabs = el("div", { className: "m01-master__tabs" }); + const files = el("div", { className: "m01-master__files" }); + + const reloadFiles = async (): Promise => { + if (!group) return; + let list: FileInfo[] = []; + try { + list = await fetchFiles(group); + } catch (error) { + showToast(error instanceof Error ? error.message : L("M01_LoadFailed"), "error"); + } + files.replaceChildren( + ...list.map((f) => { + const button = el("button", { + className: "m01-master__file", + attrs: { type: "button" }, + children: [ + el("span", { text: fileLabel(f.file) }), + el("span", { className: "m01-master__muted", text: f.rows.toLocaleString("ko-KR") }), + ], + }); + button.classList.toggle("is-active", f.file === current?.file); + button.addEventListener("click", () => { + files.querySelector(".is-active")?.classList.remove("is-active"); + button.classList.add("is-active"); + openFile(f); + }); + return button; + }), + ); + const again = list.find((f) => f.file === current?.file); + if (again) openFile(again); + }; + + for (const g of groups) { + const tab = el("button", { + className: "m01-master__tab", + attrs: { type: "button" }, + children: [ + el("span", { text: g.group }), + el("span", { className: "m01-master__muted", text: String(g.files) }), + ], + }); + tab.addEventListener("click", () => { + tabs.querySelector(".is-active")?.classList.remove("is-active"); + tab.classList.add("is-active"); + group = g.group; + current = null; + dispose(); + body.replaceChildren(); + title.textContent = L("M01_PickFile"); + void reloadFiles(); + }); + tabs.append(tab); + } + + const layout = el("div", { className: "ui-workflow-layout m01-master" }); + const main = el("main", { + className: "ui-workflow-layout__main", + children: [el("div", { className: "m01-master__panel", children: [head, notice, body] })], + }); + const overlays = createWorkflowOverlays({ + title: L("M01_Title"), + optionsContent: el("div", { className: "m01-master__side", children: [tabs, files] }), + showProjectName: false, + onOptionsOpenChange: (isOpen) => layout.classList.toggle("is-options-open", isOpen), + }); + layout.append( + el("div", { className: "ui-workflow-layout__body", children: [main] }), + overlays.root, + ); + return layout; +} diff --git a/M01_MasterData/M01_MasterData_UI_Rows.ts b/M01_MasterData/M01_MasterData_UI_Rows.ts new file mode 100644 index 00000000..93f346b9 --- /dev/null +++ b/M01_MasterData/M01_MasterData_UI_Rows.ts @@ -0,0 +1,153 @@ +/* ============================================================================= + * M01_MasterData_UI_Rows.ts + * 요소 파일(인력·재료·기계·환율·요율) 표 — 한 줄 = 요소 · 이름 찾기 · 쪽 나눔 · 눌러 고침(노랑) + * ========================================================================== */ + +import { createButton, el, showToast } from "@ui/ui_template_elements"; +import { t as L } from "@ui/ui_template_locale"; +import { fetchRows, type Row, type RowsPage } from "./M01_MasterData_Api_Fetch"; +import { + addRow, + editRow, + onDraftChange, + peek, + removeAdd, + same, + setAdd, + toggleDelete, +} from "./M01_MasterData_Draft"; +import { + buildCell, + buildPager, + coerce, + flatten, + isScalar, + show, + withCell, +} from "./M01_MasterData_UI_Cells"; + +const SIZE = 50; +const FALLBACK: Row = { 열쇠: "", 이름: "", 규격: "", 단위: "", 값: null, 출처: "" }; + +/** 새 줄 바탕 — 본 줄과 같은 칸 · 글 칸은 "" · 수·값 칸은 null. */ +function blank(sample: Row): Row { + const out: Row = {}; + for (const [k, v] of Object.entries(sample)) { + if (v && typeof v === "object" && !Array.isArray(v)) out[k] = blank(v as Row); + else out[k] = typeof v === "string" && k !== "값" ? "" : null; + } + return out; +} + +/** 돌려받은 함수 = 이 화면을 걷을 때 부를 해제. */ +export function renderRows(host: HTMLElement, file: string, q: string): () => void { + let page = 1; + let data: RowsPage | null = null; + + const paint = (): void => { + if (!data) return; + const d = data; + const draft = peek(file); + const adds = draft?.adds ?? []; + const cols: string[] = []; + for (const row of [...adds, ...d.rows]) { + for (const k of Object.keys(flatten(row))) if (!cols.includes(k)) cols.push(k); + } + const head = el("tr", { children: [el("th"), ...cols.map((c) => el("th", { text: c }))] }); + const body = el("tbody"); + + adds.forEach((row, i) => { + const flat = flatten(row); + const tr = el("tr", { className: "is-new" }); + tr.append(actionCell(L("M01_RowRemove"), () => removeAdd(file, i))); + for (const c of cols) { + tr.append( + buildCell(show(flat[c]), { + changed: true, + onEdit: (text) => setAdd(file, i, withCell(row, c, coerce(text, flat[c]))), + }), + ); + } + body.append(tr); + }); + + for (const row of d.rows) { + const key = String(row["열쇠"]); + const cur = draft?.edits[key] ?? row; + const deleted = draft?.deletes.includes(key) ?? false; + const orig = flatten(row); + const now = flatten(cur); + const tr = el("tr"); + tr.classList.toggle("is-deleted", deleted); + tr.append( + actionCell(deleted ? L("M01_RowRestore") : L("M01_RowDelete"), () => + toggleDelete(file, d.version, key), + ), + ); + for (const c of cols) { + const editable = !deleted && isScalar(orig[c]); + tr.append( + buildCell(show(now[c]), { + changed: !same(now[c], orig[c]), + onEdit: editable + ? (text) => + editRow(file, d.version, key, row, withCell(cur, c, coerce(text, orig[c]))) + : undefined, + }), + ); + } + body.append(tr); + } + + const add = createButton({ label: L("M01_RowAdd"), variant: "ghost" }); + add.addEventListener("click", () => addRow(file, d.version, blank(d.rows[0] ?? FALLBACK))); + const empty = + d.rows.length || adds.length + ? [] + : [el("p", { className: "m01-master__empty", text: L("M01_NoRows") })]; + host.replaceChildren( + el("div", { + className: "m01-master__bar", + children: [add, buildPager(d.total, SIZE, d.page, go)], + }), + el("div", { + className: "m01-master__grid-wrap", + children: [ + el("table", { + className: "m01-master__grid", + children: [el("thead", { children: [head] }), body], + }), + ], + }), + ...empty, + ); + }; + + const go = (next: number): void => { + page = next; + void load(); + }; + + const load = async (): Promise => { + try { + data = await fetchRows(file, page, SIZE, q); + paint(); + } catch (error) { + showToast(error instanceof Error ? error.message : L("M01_LoadFailed"), "error"); + } + }; + + const off = onDraftChange(paint); + void load(); + return off; +} + +function actionCell(label: string, onClick: () => void): HTMLTableCellElement { + const button = el("button", { + className: "m01-master__row-btn", + text: label, + attrs: { type: "button" }, + }); + button.addEventListener("click", onClick); + return el("td", { children: [button] }); +} diff --git a/M01_MasterData/M01_MasterData_UI_Style.css b/M01_MasterData/M01_MasterData_UI_Style.css new file mode 100644 index 00000000..ef501483 --- /dev/null +++ b/M01_MasterData/M01_MasterData_UI_Style.css @@ -0,0 +1,219 @@ +/* M01 마스터 요소 — 좌측 도킹 패널(그룹 탭 · 파일) / 우측 표 */ +.m01-master [hidden] { + display: none !important; +} + +.m01-master__side { + display: flex; + flex-direction: column; + gap: var(--spacing-8); + padding-top: var(--spacing-8); +} + +.m01-master__tabs { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: var(--spacing-4); +} + +.m01-master__files { + display: flex; + flex-direction: column; + gap: 2px; +} + +.m01-master__tab, +.m01-master__file { + display: flex; + justify-content: space-between; + gap: var(--spacing-8); + padding: var(--spacing-4) var(--spacing-8); + border: 1px solid var(--color-border); + border-radius: var(--radius-buttons); + background: var(--color-surface); + color: var(--color-text-body); + font: inherit; + font-size: var(--text-body-sm); + text-align: left; + cursor: pointer; +} + +.m01-master__file { + border-color: transparent; + background: transparent; +} + +.m01-master__tab:hover, +.m01-master__file:hover { + background: var(--color-paper); +} + +.m01-master__tab.is-active, +.m01-master__file.is-active { + background: var(--color-mist-violet); + color: var(--color-accent); +} + +.m01-master__muted { + color: var(--color-text-muted); + font-size: var(--text-caption); +} + +/* ── 우측 ── */ +.m01-master__panel { + display: flex; + flex-direction: column; + gap: var(--spacing-12); + min-width: 0; + padding: var(--spacing-16) var(--spacing-24); +} + +.m01-master__head, +.m01-master__bar { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: var(--spacing-12); +} + +.m01-master__title { + flex: 1 1 auto; + margin: 0; + color: var(--color-text); + font-size: var(--text-body); +} + +.m01-master__summary { + color: var(--color-accent); + font-size: var(--text-body-sm); + font-weight: var(--font-weight-bold); +} + +.m01-master__notice { + display: flex; + flex-direction: column; + gap: var(--spacing-4); + padding: var(--spacing-8) var(--spacing-12); + max-height: 30vh; + overflow: auto; + border-left: 4px solid var(--color-danger); + background: color-mix(in srgb, var(--color-danger) 10%, var(--color-canvas)); + color: var(--color-danger); + font-size: var(--text-body-sm); +} + +.m01-master__notice p { + margin: 0; +} + +.m01-master__body { + display: flex; + flex-direction: column; + gap: var(--spacing-12); + min-width: 0; +} + +.m01-master__grid-wrap { + max-height: calc(100vh - 300px); + overflow: auto; + border: 1px solid var(--color-border); + border-radius: var(--radius-cards); +} + +.m01-master__grid { + border-collapse: collapse; + font-size: var(--text-body-sm); +} + +.m01-master__grid th, +.m01-master__grid td { + max-width: 320px; + padding: var(--spacing-8) var(--spacing-12); + overflow: hidden; + border-bottom: 1px solid var(--color-border); + text-align: left; + text-overflow: ellipsis; + white-space: nowrap; +} + +.m01-master__grid th { + position: sticky; + top: 0; + z-index: 1; + background: var(--color-surface); + color: var(--color-text-secondary); + font-weight: var(--font-weight-medium); +} + +.m01-master__grid td.is-editable { + cursor: text; +} + +/* 고친 칸 — 노랑 */ +.m01-master__grid td.is-changed { + background: color-mix(in srgb, var(--color-warning) 28%, var(--color-canvas)); +} + +.m01-master__grid tr.is-deleted td { + color: var(--color-text-muted); + text-decoration: line-through; + background: color-mix(in srgb, var(--color-danger) 8%, var(--color-canvas)); +} + +.m01-master__cell-input { + width: 100%; + min-width: 6em; + padding: 2px var(--spacing-4); +} + +.m01-master__row-btn { + padding: 2px var(--spacing-8); + border: 1px solid var(--color-border); + border-radius: var(--radius-buttons); + background: var(--color-surface); + color: var(--color-text-body); + font: inherit; + font-size: var(--text-caption); + cursor: pointer; +} + +.m01-master__pager { + display: flex; + align-items: center; + gap: var(--spacing-12); + margin-left: auto; + color: var(--color-text-secondary); + font-size: var(--text-body-sm); +} + +.m01-master__tables { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); + gap: var(--spacing-8); +} + +.m01-master__table-card { + display: flex; + flex-direction: column; + gap: 2px; + padding: var(--spacing-8) var(--spacing-12); + border: 1px solid var(--color-border); + border-radius: var(--radius-cards); + background: var(--color-surface); + color: var(--color-text-body); + font: inherit; + text-align: left; + cursor: pointer; +} + +.m01-master__table-card:hover { + background: var(--color-paper); +} + +.m01-master__table-card.is-changed { + background: color-mix(in srgb, var(--color-warning) 28%, var(--color-canvas)); +} + +.m01-master__empty { + color: var(--color-text-muted); +} diff --git a/M01_MasterData/M01_MasterData_UI_Tables.ts b/M01_MasterData/M01_MasterData_UI_Tables.ts new file mode 100644 index 00000000..2915f944 --- /dev/null +++ b/M01_MasterData/M01_MasterData_UI_Tables.ts @@ -0,0 +1,200 @@ +/* ============================================================================= + * M01_MasterData_UI_Tables.ts + * 표형 파일(소요량·계수) — 표 목록 → 표 하나(조건 칸 + 값 칸의 긴 줄) · 눌러 고침(노랑) · 줄 더하기·지우기 + * ========================================================================== */ + +import { createButton, el, showToast } from "@ui/ui_template_elements"; +import { t as L } from "@ui/ui_template_locale"; +import { fetchTable, fetchTables, type Row, type TableHead } from "./M01_MasterData_Api_Fetch"; +import { + onDraftChange, + peek, + same, + setTable, + tableItems, + type TableItem, +} from "./M01_MasterData_Draft"; +import { + buildCell, + buildPager, + coerce, + show, + toNumberish, + toRange, +} from "./M01_MasterData_UI_Cells"; + +const LIST_SIZE = 30; + +/** 돌려받은 함수 = 이 화면을 걷을 때 부를 해제. */ +export function renderTables(host: HTMLElement, file: string, q: string): () => void { + let stop = (): void => {}; + const list = (page = 1): void => { + stop(); + stop = (): void => {}; + void showList(host, file, q, page, (key) => { + stop = openTable(host, file, key, () => list(page)); + }); + }; + list(); + const off = onDraftChange( + () => host.querySelector(".m01-master__tables") && markChanged(host, file), + ); + return () => { + stop(); + off(); + }; +} + +/** 목록 위 「고침」 표시만 다시 — 목록을 다시 받지 않음. */ +function markChanged(host: HTMLElement, file: string): void { + const changed = peek(file)?.tables ?? {}; + host.querySelectorAll(".m01-master__table-card").forEach((card) => { + card.classList.toggle("is-changed", card.dataset.key! in changed); + }); +} + +async function showList( + host: HTMLElement, + file: string, + q: string, + page: number, + open: (key: string) => void, +): Promise { + let tables: TableHead[]; + try { + tables = (await fetchTables(file, q)).tables; + } catch (error) { + showToast(error instanceof Error ? error.message : L("M01_LoadFailed"), "error"); + return; + } + const cards = tables.slice((page - 1) * LIST_SIZE, page * LIST_SIZE).map((t) => { + const card = el("button", { + className: "m01-master__table-card", + attrs: { type: "button", "data-key": t.열쇠 }, + children: [ + el("strong", { text: t.이름 || t.열쇠 }), + el("span", { className: "m01-master__muted", text: `${t.열쇠} · ${t.기준 || "—"}` }), + el("span", { + className: "m01-master__muted", + text: `${Object.keys(t.조건 ?? {}).join(" · ") || "—"} → ${Object.keys(t.값칸 ?? {}).join(" · ")} · ${t.count} ${L("M01_Rows")}`, + }), + ], + }); + card.classList.toggle("is-changed", t.열쇠 in (peek(file)?.tables ?? {})); + card.addEventListener("click", () => open(t.열쇠)); + return card; + }); + host.replaceChildren( + buildPager(tables.length, LIST_SIZE, page, (p) => void showList(host, file, q, p, open)), + el("div", { className: "m01-master__tables", children: cards }), + ); +} + +/** 표 하나. 돌려받은 함수 = 해제. */ +function openTable(host: HTMLElement, file: string, key: string, back: () => void): () => void { + let off = (): void => {}; + void (async () => { + let version: string; + let table: Row & { 줄: Row[] }; + try { + ({ version, table } = await fetchTable(file, key)); + } catch (error) { + showToast(error instanceof Error ? error.message : L("M01_LoadFailed"), "error"); + return; + } + const { 줄: orig, ...base } = table; + const conds = (table.조건 ?? {}) as Record; + const values = (table.값칸 ?? {}) as Record; + const cols = [...Object.keys(conds), ...Object.keys(values)]; + for (const row of orig) for (const k of Object.keys(row)) if (!cols.includes(k)) cols.push(k); + const items = (): TableItem[] => tableItems(file, key) ?? orig.map((r, o) => ({ o, r })); + const commit = (next: TableItem[]): void => setTable(file, version, key, base, next, orig); + + const parse = (col: string, text: string, prev: unknown): unknown => { + if (conds[col] === "범위") return toRange(text); + if (conds[col] === "고르기") return text; + return col in values || conds[col] === "수" ? toNumberish(text) : coerce(text, prev); + }; + const headText = (c: string): string => + c in conds ? `${c} (${conds[c]})` : c in values ? `${c} (${values[c]})` : c; + + const paint = (): void => { + const now = items(); + const body = el("tbody"); + now.forEach((item, i) => { + const tr = el("tr"); + tr.classList.toggle("is-new", item.o === null); + const del = el("button", { + className: "m01-master__row-btn", + text: L("M01_RowRemove"), + attrs: { type: "button" }, + }); + del.addEventListener("click", () => commit(now.filter((_, j) => j !== i))); + tr.append(el("td", { children: [del] })); + for (const c of cols) { + const was = item.o === null ? undefined : orig[item.o][c]; + tr.append( + buildCell(show(item.r[c]), { + changed: item.o === null || !same(item.r[c], was), + onEdit: (text) => { + const value = parse(c, text, item.r[c]); + const r = { ...item.r }; + if (value === null || value === "") + delete r[c]; // 원문 「-」 = 칸을 뺌 + else r[c] = value; + commit(now.map((it, j) => (j === i ? { ...it, r } : it))); + }, + }), + ); + } + body.append(tr); + }); + const add = createButton({ label: L("M01_RowAdd"), variant: "ghost" }); + add.addEventListener("click", () => commit([...now, { o: null, r: {} }])); + const backButton = createButton({ label: L("M01_BackToTables"), variant: "ghost" }); + backButton.addEventListener("click", () => { + off(); + back(); + }); + const notes = ((table.주 ?? []) as string[]).map((n) => + el("p", { className: "m01-master__muted", text: n }), + ); + host.replaceChildren( + el("div", { + className: "m01-master__bar", + children: [ + backButton, + el("strong", { text: String(table.이름 ?? key) }), + el("span", { + className: "m01-master__muted", + text: `${key} · ${table.기준 || "—"} · ${table.출처 || ""}`, + }), + add, + ], + }), + el("div", { + className: "m01-master__grid-wrap", + children: [ + el("table", { + className: "m01-master__grid", + children: [ + el("thead", { + children: [ + el("tr", { + children: [el("th"), ...cols.map((c) => el("th", { text: headText(c) }))], + }), + ], + }), + body, + ], + }), + ], + }), + ...notes, + ); + }; + off = onDraftChange(paint); + paint(); + })(); + return () => off(); +} diff --git a/config/config_frontend.ts b/config/config_frontend.ts index 277a9238..a5738a7f 100644 --- a/config/config_frontend.ts +++ b/config/config_frontend.ts @@ -118,6 +118,8 @@ export const ROUTES = { B11_LOADING: "b11-loading", // 시스템 관리자 전용 — 로직·기초값 마스터 보기 (2026-09-15 브레인 Z01). Z01_MASTER_DATA: "z01-master-data", + // 시스템 관리자 전용 — 마스터 요소(파일 첫 층 JSON) 보기·고치기. + M01_MASTER_DATA: "m01-master-data", } as const; export type RouteKey = keyof typeof ROUTES; @@ -141,6 +143,7 @@ export const PROTECTED_ROUTES: readonly RoutePath[] = [ ROUTES.B11_STATUS, ROUTES.B11_LOADING, ROUTES.Z01_MASTER_DATA, + ROUTES.M01_MASTER_DATA, ]; /* ----------------------------------------------------------------------------- diff --git a/ui_template/ui_template_locale.ts b/ui_template/ui_template_locale.ts index df2909ad..a36c79d4 100644 --- a/ui_template/ui_template_locale.ts +++ b/ui_template/ui_template_locale.ts @@ -24,6 +24,7 @@ import { ui_locales_a } from "./ui_template_locale_a"; import { ui_locales_b1 } from "./ui_template_locale_b1"; import { ui_locales_b2 } from "./ui_template_locale_b2"; import { ui_locales_b3 } from "./ui_template_locale_b3"; +import { ui_locales_m1 } from "./ui_template_locale_m1"; /** 지원 언어 인덱스: 0 = 한국어, 1 = 영어 */ export const LANGUAGES = ["ko", "en"] as const; @@ -58,6 +59,7 @@ export const ui_locales = { ...ui_locales_b1, ...ui_locales_b2, ...ui_locales_b3, + ...ui_locales_m1, } as const; export type LocaleKey = keyof typeof ui_locales; diff --git a/ui_template/ui_template_locale_m1.ts b/ui_template/ui_template_locale_m1.ts new file mode 100644 index 00000000..1429d66d --- /dev/null +++ b/ui_template/ui_template_locale_m1.ts @@ -0,0 +1,39 @@ +/* ============================================================================= + * ui_template_locale_m1.ts + * M01 마스터 요소 화면(시스템 관리자) 사전 — 신규 문구는 최하단에 추가. + * ========================================================================== */ + +export const ui_locales_m1 = { + B01_Dashboard_MasterElements: ["마스터 요소", "Master Elements"], + M01_Title: ["마스터 요소", "Master Elements"], + M01_AdminOnly: ["시스템 관리자만 볼 수 있음", "System administrators only"], + M01_LoadFailed: ["마스터 요소를 못 읽음", "Failed to load master elements"], + M01_PickFile: ["왼쪽에서 그룹과 파일을 고를 것", "Pick a group and a file on the left"], + M01_Search: ["이름 찾기", "Find by name"], + M01_Prev: ["이전", "Prev"], + M01_Next: ["다음", "Next"], + M01_Page: ["쪽", "pages"], + M01_Rows: ["줄", "rows"], + M01_NoRows: ["줄 없음", "No rows"], + M01_RowAdd: ["줄 더하기", "Add row"], + M01_RowDelete: ["지우기", "Delete"], + M01_RowRestore: ["되살리기", "Restore"], + M01_RowRemove: ["빼기", "Remove"], + M01_BackToTables: ["← 표 목록", "← Tables"], + M01_Changed: ["고친 곳 {value}", "{value} changes"], + M01_Save: ["저장", "Save"], + M01_Discard: ["고친 것 버리기", "Discard changes"], + M01_DiscardConfirm: ["고친 것을 모두 버릴까?", "Discard all changes?"], + M01_Saved: ["저장했음", "Saved"], + M01_SaveFailed: ["저장 못 함 — {value}", "Save failed — {value}"], + M01_Stale: [ + "그 사이 파일이 바뀜({value}) — 고친 것을 버리고 다시 읽은 뒤 다시 고칠 것", + "Files changed meanwhile ({value}) — discard and reload, then edit again", + ], + M01_StaleReload: ["버리고 다시 읽기", "Discard and reload"], + M01_FileStale: [ + "고치기 시작한 뒤 이 파일이 바뀜 — 저장하면 막힘", + "This file changed after you started editing — saving will be refused", + ], + M01_CheckErrors: ["검사에 걸림", "Validation failed"], +} as const; From 3a36a0372caafc05b619427c966b511f35edba3a Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sat, 19 Sep 2026 18:45:17 +0900 Subject: [PATCH 14/14] =?UTF-8?q?feat(M01):=20=EA=B4=80=EB=A6=AC=EC=9E=90?= =?UTF-8?q?=20=ED=99=94=EB=A9=B4=20=EB=A1=9C=EC=A7=81=20=EC=B9=B8=20?= =?UTF-8?q?=E2=80=94=20=EC=9D=BC=EC=9C=84=EB=8C=80=EA=B0=80=ED=91=9C(?= =?UTF-8?q?=ED=98=B8=ED=91=9C)=20=EA=B3=A0=EC=B9=98=EA=B8=B0=20=C2=B7=20?= =?UTF-8?q?=EC=8B=9C=ED=97=98=20=EA=B3=84=EC=82=B0=20=C2=B7=20=EC=9A=94?= =?UTF-8?q?=EC=86=8C=20=EC=B0=BE=EA=B8=B0=20=EC=B0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 화면: 왼쪽 로직 목록(원문·장·이름 찾기·막힘) / 가운데 머리·받을 값·호표·중간 값·덧줄·끝수 / 오른쪽 시험 계산 - 고친 것은 캐시에 쌓고 [저장] 한 번에 · [고친 것 버리기] · 줄 더하기·지우기 · 로직 새로 만들기·지우기 - 진입은 mountM01Logic(host) — 공용 진입 파일(sub_laptop_3 몫)이 한 줄로 붙임 - 서버: 로직 하나에 단가 자동(prices) · 요소 찾기(GET /elements) · 저장 전 시험 계산(calc 에 row·file) - 계약 문서 갱신 · 시험 1개 더함(9개 통과) Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01PAdA5ThqmtVSsbzjusk1cJ --- M01_MasterData/M01_MasterData_Router.py | 9 +- M01_MasterData/M01_MasterData_Store.py | 59 ++- M01_MasterData/M01_MasterData_UI_Logic_Api.ts | 164 +++++++ .../M01_MasterData_UI_Logic_Calc.ts | 164 +++++++ .../M01_MasterData_UI_Logic_Edit.ts | 423 ++++++++++++++++++ .../M01_MasterData_UI_Logic_List.ts | 155 +++++++ .../M01_MasterData_UI_Logic_Page.ts | 360 +++++++++++++++ .../M01_MasterData_UI_Logic_Pick.ts | 109 +++++ .../M01_MasterData_UI_Logic_Style.css | 388 ++++++++++++++++ .../M01_MasterData_UI_Logic_Text.ts | 99 ++++ resources/master_data/_화면_계약.md | 9 +- resources/tester/test_m01_api.py | 22 + 12 files changed, 1954 insertions(+), 7 deletions(-) create mode 100644 M01_MasterData/M01_MasterData_UI_Logic_Api.ts create mode 100644 M01_MasterData/M01_MasterData_UI_Logic_Calc.ts create mode 100644 M01_MasterData/M01_MasterData_UI_Logic_Edit.ts create mode 100644 M01_MasterData/M01_MasterData_UI_Logic_List.ts create mode 100644 M01_MasterData/M01_MasterData_UI_Logic_Page.ts create mode 100644 M01_MasterData/M01_MasterData_UI_Logic_Pick.ts create mode 100644 M01_MasterData/M01_MasterData_UI_Logic_Style.css create mode 100644 M01_MasterData/M01_MasterData_UI_Logic_Text.ts diff --git a/M01_MasterData/M01_MasterData_Router.py b/M01_MasterData/M01_MasterData_Router.py index 17ffe0b3..0746de12 100644 --- a/M01_MasterData/M01_MasterData_Router.py +++ b/M01_MasterData/M01_MasterData_Router.py @@ -20,6 +20,8 @@ class CalcBody(BaseModel): book: str key: str inputs: dict[str, Any] = {} + row: dict[str, Any] | None = None # 저장 전 고친 로직 줄(없으면 저장된 파일로) + file: str | None = None # 새 로직이면 더할 로직 파일 class Change(BaseModel): @@ -91,9 +93,14 @@ def get_logic(book: str, key: str) -> dict: return _call(store.logic, book, key) +@router.get("/elements") +def get_elements(group: str, q: str = "", limit: int = 50) -> dict: + return _call(store.elements, group, q, limit) + + @router.post("/calc") def post_calc(body: CalcBody) -> dict: - return _call(store.calc, body.book, body.key, body.inputs) + return _call(store.calc, body.book, body.key, body.inputs, body.row, body.file) @router.post("/save") diff --git a/M01_MasterData/M01_MasterData_Store.py b/M01_MasterData/M01_MasterData_Store.py index 6540b563..9968fd86 100644 --- a/M01_MasterData/M01_MasterData_Store.py +++ b/M01_MasterData/M01_MasterData_Store.py @@ -173,7 +173,8 @@ def logic(book: str, key: str) -> dict: continue for row in data.get("줄") or []: if str(row.get("열쇠")) == key: - reasons = cm.mf.check_logic(cm.mf.Master(files), book, row)[0] + whole = cm.mf.Master(files) + reasons = cm.mf.check_logic(whole, book, row)[0] _, version = read(name) return { "file": name, @@ -181,15 +182,67 @@ def logic(book: str, key: str) -> dict: "logic": row, "blocked": bool(reasons), "reasons": reasons, + "prices": _prices(whole, row), } raise StoreError(404, f"없는 로직 「{book}:{key}」") +def _brief(ref: str, row: dict) -> dict: + return {"ref": ref, **{k: row.get(k) for k in ("이름", "규격", "단위", "값", "값칸")}} + + +def _prices(whole, row: dict) -> dict: + """호표 요소 → 요소 줄 요약(단가 자동 칸) · `{이름}` 낀 열쇠·하위 로직은 계산 때 정해짐.""" + out = {} + for item in row.get("호표") or []: + ref = str(item.get("요소", "")) + if item.get("종류") != "로직" and "{" not in ref: + try: + out[ref] = _brief(ref, whole.get(ref)) + except cm.mf.FormulaError: + out[ref] = None + return out + + +def elements(group: str, q: str, limit: int) -> dict: + """요소 찾기 창 — 그룹 전체에서 이름·열쇠 찾기 · `ref` 는 식에 그대로 넣는 `그룹:원문:열쇠`.""" + if group not in cm.mf.GROUPS: + raise StoreError(404, f"없는 그룹 「{group}」") + hits = [] + for name, data in cm.load(folder=FOLDER).items(): + if data.get("그룹") != group: + continue + for row in data.get(items_key(data)) or []: + if _hit(row, q): + ref = f"{group}:{data.get('원문')}:{row.get('열쇠')}" + hits.append({**_brief(ref, row), "file": name}) + return {"total": len(hits), "items": hits[: min(max(limit, 1), 200)]} + + # ── 시험 계산 ────────────────────────────────────────────────────────── -def calc(book: str, key: str, inputs: dict) -> dict: +def _swap(files: dict, book: str, key: str, row: dict, file: str | None) -> None: + """저장 전 시험 — 메모리 사본에서 그 로직을 고친 줄로 바꿈(없으면 `file` 에 더함).""" + row = _dec(row) + for name, data in _logic_files(files): + if data.get("원문") == book: + items = data.get("줄") or [] + for i, old in enumerate(items): + if str(old.get("열쇠")) == key: + items[i] = row + return + if file not in files or files[file].get("그룹") != "로직": + raise StoreError(404, f"없는 로직 파일 「{file}」") + files[file].setdefault("줄", []).append(row) + + +def calc(book: str, key: str, inputs: dict, row: dict | None = None, file: str | None = None): given = {k: _dec(v) for k, v in inputs.items()} + files = cm.load(folder=FOLDER) + if row is not None: + _swap(files, book, key, row, file) + key = str(row.get("열쇠", key)) try: - result = cm.calc(cm.load(folder=FOLDER), f"{book}:{key}", given) + result = cm.calc(files, f"{book}:{key}", given) except (cm.mf.FormulaError, ArithmeticError, KeyError, TypeError, ValueError) as e: return {"ok": False, "reason": str(e) or type(e).__name__} if "결과" in result: diff --git a/M01_MasterData/M01_MasterData_UI_Logic_Api.ts b/M01_MasterData/M01_MasterData_UI_Logic_Api.ts new file mode 100644 index 00000000..4f559904 --- /dev/null +++ b/M01_MasterData/M01_MasterData_UI_Logic_Api.ts @@ -0,0 +1,164 @@ +/* ============================================================================= + * M01_MasterData_UI_Logic_Api.ts + * 로직 화면이 부르는 서버 길 — 계약 `resources/master_data/_화면_계약.md` · `/api/m01` + * ========================================================================== */ + +import { API_BASE_URL } from "@config/config_frontend"; + +/** 로직 한 줄 — 파일 그대로(한글 칸) · 틀 `_틀.md` 6장 */ +export interface LogicInput { + 이름: string; + 단위?: string; + 고르기?: string[]; + 범위?: [number, number]; +} +export interface HoLine { + 종류: string; + 요소: string; + 이름?: string; + 규격?: string; + 단위?: string; + 수량: string; + 비목?: string; +} +export interface NamedFormula { + 이름: string; + 식: string; + 비목?: string; + 출처?: string; +} +export interface LogicRow { + 열쇠: string; + 이름: string; + 결과단위: string; + 출처: string; + 소유?: string; + 입력: LogicInput[]; + 중간: NamedFormula[]; + 호표?: HoLine[]; + 결과?: { 식: string }; + 덧줄?: NamedFormula[]; + 끝수?: string | null; + 비고?: string; + [extra: string]: unknown; +} + +export interface LogicSummary { + file: string; + book: string; + chapter: string; + 열쇠: string; + 이름: string; + 결과단위: string; + 출처: string; + blocked: boolean; + reasons: string[]; +} + +export interface ElementBrief { + ref: string; + file?: string; + 이름?: string; + 규격?: string; + 단위?: unknown; + 값?: unknown; + 값칸?: Record | null; +} + +export interface LogicOne { + file: string; + version: string; + logic: LogicRow; + blocked: boolean; + reasons: string[]; + prices: Record; +} + +export interface CalcLine { + 이름: string; + 단위: string; + 수량: number; + 단가: number; + 금액: number; + 비목: Record; +} +export type CalcAnswer = + | { + ok: true; + lines?: CalcLine[]; + sums?: Record; + result?: unknown; + middle: Record; + } + | { ok: false; reason: string }; + +export interface LogicFile { + file: string; + book: string; + chapter: string; + version: string; +} + +export interface SaveChange { + op: "edit" | "add" | "delete"; + key?: string; + row?: LogicRow; +} +export interface SaveFile { + file: string; + version: string; + changes: SaveChange[]; +} + +/** 서버가 준 몸과 상태 번호 — 409·422 는 몸(`detail`)을 화면이 풀어 보임 */ +export class ApiError extends Error { + constructor( + public status: number, + public detail: unknown, + ) { + super(typeof detail === "string" ? detail : JSON.stringify(detail)); + } +} + +async function request(path: string, body?: unknown): Promise { + const response = await fetch(`${API_BASE_URL}/m01${path}`, { + method: body === undefined ? "GET" : "POST", + credentials: "include", + headers: { "Content-Type": "application/json" }, + body: body === undefined ? undefined : JSON.stringify(body), + }); + const data = (await response.json().catch(() => ({}))) as { detail?: unknown } & T; + if (!response.ok) throw new ApiError(response.status, data.detail ?? response.statusText); + return data; +} + +const query = (params: Record): string => new URLSearchParams(params).toString(); + +export const fetchLogics = (): Promise => + request<{ logics: LogicSummary[] }>("/logics").then((d) => d.logics); + +export const fetchLogic = (book: string, key: string): Promise => + request(`/logic?${query({ book, key })}`); + +export const fetchLogicFiles = (): Promise => + request<{ files: LogicFile[] }>(`/groups/${encodeURIComponent("로직")}/files`).then( + (d) => d.files, + ); + +export const searchElements = ( + group: string, + q: string, +): Promise<{ total: number; items: ElementBrief[] }> => + request(`/elements?${query({ group, q, limit: "100" })}`); + +export const runCalc = (body: { + book: string; + key: string; + inputs: Record; + row?: LogicRow; + file?: string; +}): Promise => request("/calc", body); + +export const saveFiles = ( + files: SaveFile[], +): Promise<{ files: { file: string; version: string }[] }> => request("/save", { files }); diff --git a/M01_MasterData/M01_MasterData_UI_Logic_Calc.ts b/M01_MasterData/M01_MasterData_UI_Logic_Calc.ts new file mode 100644 index 00000000..56bcb9b8 --- /dev/null +++ b/M01_MasterData/M01_MasterData_UI_Logic_Calc.ts @@ -0,0 +1,164 @@ +/* ============================================================================= + * M01_MasterData_UI_Logic_Calc.ts + * 시험 계산 — 받을 값을 넣고 [계산] → 줄별 금액 · 비목 합 · 멈춘 까닭(엔진 글 그대로) + * 고친 로직은 저장 전 줄(`row`)을 같이 보내 메모리에서 셈(`POST /calc`) — 파일에 안 씀 + * ========================================================================== */ + +import { createButton, el, showToast } from "@ui/ui_template_elements"; +import { + runCalc, + type CalcAnswer, + type CalcLine, + type LogicRow, +} from "./M01_MasterData_UI_Logic_Api"; +import { formatNumber } from "./M01_MasterData_UI_Logic_Edit"; +import { tx } from "./M01_MasterData_UI_Logic_Text"; + +export interface CalcContext { + book: string; + /** 저장된 열쇠 — 새 로직은 null */ + savedKey: string | null; + file: string; + row: LogicRow; + dirty: () => boolean; + /** 로직마다 넣은 값 — 다시 그려도 남음 */ + values: Record; + onLines: (lines: CalcLine[] | null) => void; +} + +const SUMS = ["노무비", "재료비", "경비", "계"]; + +export function buildCalc(host: HTMLElement, ctx: CalcContext): void { + const fields = (ctx.row.입력 ?? []).map((spec) => { + const name = spec.이름; + let control: HTMLInputElement | HTMLSelectElement; + if (spec.고르기?.length) { + control = el("select", { className: "m01-logic__input" }); + for (const option of ["", ...spec.고르기]) { + control.append(el("option", { text: option, attrs: { value: option } })); + } + } else { + control = el("input", { + className: "m01-logic__input", + attrs: { type: "text", inputmode: "decimal" }, + }); + if (spec.범위) control.placeholder = `${spec.범위[0]} ∼ ${spec.범위[1]}`; + } + control.value = ctx.values[name] ?? ""; + control.addEventListener("input", () => (ctx.values[name] = control.value)); + control.addEventListener("change", () => (ctx.values[name] = control.value)); + const label = spec.단위 ? `${name} (${spec.단위})` : name; + return el("label", { + className: "m01-logic__field", + children: [el("span", { text: label }), control], + }); + }); + const out = el("div", { className: "m01-logic__calc-out" }); + const run = async (): Promise => { + const inputs: Record = {}; + for (const spec of ctx.row.입력 ?? []) { + const raw = (ctx.values[spec.이름] ?? "").trim(); + if (raw === "") continue; // 빈 칸은 안 보냄 — 엔진이 「입력 없음」 으로 멈춤 + inputs[spec.이름] = spec.고르기?.length || Number.isNaN(Number(raw)) ? raw : Number(raw); + } + const draft = ctx.dirty() || ctx.savedKey === null; + try { + const answer = await runCalc({ + book: ctx.book, + key: ctx.savedKey ?? ctx.row.열쇠, + inputs, + ...(draft ? { row: ctx.row, file: ctx.file } : {}), + }); + ctx.onLines(answer.ok ? (answer.lines ?? null) : null); + out.replaceChildren(...answerView(answer, draft)); + } catch (error) { + showToast(error instanceof Error ? error.message : tx("Load_Failed"), "error"); + } + }; + host.replaceChildren( + el("h3", { text: tx("Calc_Title") }), + ...(fields.length + ? fields + : [el("p", { className: "m01-logic__muted", text: tx("Calc_NoInputs") })]), + createButton({ label: tx("Calc_Run"), onClick: () => void run() }), + out, + ); +} + +function answerView(answer: CalcAnswer, draft: boolean): HTMLElement[] { + const note = draft ? [el("p", { className: "m01-logic__muted", text: tx("Calc_Draft") })] : []; + if (!answer.ok) { + return [ + ...note, + el("div", { + className: "m01-logic__reasons", + children: [el("strong", { text: tx("Calc_Stopped") }), el("div", { text: answer.reason })], + }), + ]; + } + const parts: HTMLElement[] = [...note]; + if (answer.lines) { + const rows = answer.lines.map((line) => + el("tr", { + children: [ + el("td", { text: line.이름 }), + el("td", { text: `${formatNumber(line.수량)} ${line.단위}` }), + el("td", { className: "m01-logic__money", text: formatNumber(line.금액) }), + ], + }), + ); + parts.push( + el("table", { + className: "m01-logic__grid", + children: [ + el("thead", { + children: [ + el("tr", { + children: [tx("Head_Name"), tx("Ho_Qty"), tx("Ho_Amount")].map((h) => + el("th", { text: h }), + ), + }), + ], + }), + el("tbody", { children: rows }), + ], + }), + ); + } + if (answer.sums) { + parts.push( + el("dl", { + className: "m01-logic__sums", + children: SUMS.flatMap((k) => [ + el("dt", { text: k === "계" ? tx("Calc_Sum") : k }), + el("dd", { className: "m01-logic__money", text: formatNumber(answer.sums?.[k] ?? 0) }), + ]), + }), + ); + } + if (answer.result !== undefined) { + parts.push( + el("dl", { + className: "m01-logic__sums", + children: [ + el("dt", { text: tx("Calc_Result") }), + el("dd", { text: formatNumber(answer.result) }), + ], + }), + ); + } + const middle = Object.entries(answer.middle ?? {}); + if (middle.length) { + parts.push( + el("h4", { text: tx("Middle_Title") }), + el("dl", { + className: "m01-logic__sums", + children: middle.flatMap(([k, v]) => [ + el("dt", { text: k }), + el("dd", { text: formatNumber(v) }), + ]), + }), + ); + } + return parts; +} diff --git a/M01_MasterData/M01_MasterData_UI_Logic_Edit.ts b/M01_MasterData/M01_MasterData_UI_Logic_Edit.ts new file mode 100644 index 00000000..38fd879f --- /dev/null +++ b/M01_MasterData/M01_MasterData_UI_Logic_Edit.ts @@ -0,0 +1,423 @@ +/* ============================================================================= + * M01_MasterData_UI_Logic_Edit.ts + * 로직 한 줄 고치기 — 실무 일위대가표(호표) 모양 + * 머리(이름·결과단위·출처·소유) · 설계에서 받을 값 · 호표 줄 · 중간 값 · 결과 식 · 덧줄 · 끝수 + * + * 칸을 고치면 `row` 를 그 자리에서 바꾸고 `onChange` 만 부름(다시 그리지 않음). + * 줄 더하기·지우기 · 요소 고르기처럼 모양이 바뀔 때만 `rerender`. + * ========================================================================== */ + +import { createButton, el } from "@ui/ui_template_elements"; +import type { + CalcLine, + ElementBrief, + HoLine, + LogicInput, + LogicRow, + NamedFormula, +} from "./M01_MasterData_UI_Logic_Api"; +import { tx } from "./M01_MasterData_UI_Logic_Text"; + +export type PickMode = "element" | "table"; +export type PickDone = (item: ElementBrief, column?: string) => void; + +export interface EditContext { + row: LogicRow; + file: string; + isNew: boolean; + files: string[]; + reasons: string[]; + prices: Record; + /** 마지막 시험 계산의 줄 — 호표 차례와 같음(덧줄은 뒤에 붙음) */ + lines: CalcLine[] | null; + onChange: () => void; + onFile: (file: string) => void; + onPick: (mode: PickMode, group: string, done: PickDone) => void; +} + +const KINDS = ["인력", "재료", "기계", "로직"]; +const COSTS = ["노무비", "재료비", "경비"]; +const COST_OF: Record = { 인력: "노무비", 재료: "재료비", 기계: "경비" }; + +export function formatNumber(value: unknown): string { + if (typeof value === "number") return value.toLocaleString("ko-KR", { maximumFractionDigits: 4 }); + if (value === null || value === undefined) return ""; + return typeof value === "object" ? JSON.stringify(value) : String(value); +} + +function textBox(value: unknown, onInput: (v: string) => void, className = ""): HTMLInputElement { + const input = el("input", { + className: `m01-logic__input ${className}`, + attrs: { type: "text" }, + }); + input.value = value === null || value === undefined ? "" : String(value); + input.addEventListener("input", () => onInput(input.value)); + return input; +} + +function choice( + options: string[], + value: string | undefined, + onPick: (v: string) => void, +): HTMLSelectElement { + const select = el("select", { className: "m01-logic__input" }); + for (const option of value && !options.includes(value) ? [value, ...options] : options) { + select.append(el("option", { text: option, attrs: { value: option } })); + } + select.value = value ?? options[0]; + select.addEventListener("change", () => onPick(select.value)); + return select; +} + +function dropButton(onClick: () => void): HTMLButtonElement { + const button = el("button", { + className: "m01-logic__drop", + text: "×", + attrs: { type: "button", title: tx("DeleteRow") }, + }); + button.addEventListener("click", onClick); + return button; +} + +function section(title: string, body: HTMLElement, onAdd?: () => void): HTMLElement { + const head = el("div", { + className: "m01-logic__section-head", + children: [el("h3", { text: title })], + }); + if (onAdd) head.append(createButton({ label: tx("AddRow"), variant: "ghost", onClick: onAdd })); + return el("section", { className: "m01-logic__section", children: [head, body] }); +} + +function grid(headers: string[], rows: HTMLElement[][], className: string): HTMLElement { + const table = el("table", { className: `m01-logic__grid ${className}` }); + table.append( + el("thead", { children: [el("tr", { children: headers.map((h) => el("th", { text: h })) })] }), + ); + const body = el("tbody"); + for (const cells of rows) + body.append(el("tr", { children: cells.map((c) => el("td", { children: [c] })) })); + table.append(body); + return el("div", { className: "m01-logic__scroll", children: [table] }); +} + +export function qtyKind(qty: string): string { + const text = qty.trim(); + if (/^-?\d+(\.\d+)?$/.test(text)) return tx("Ho_QtyNumber"); + if (text.startsWith("찾기(")) return tx("Ho_QtyTable"); + return tx("Ho_QtyFormula"); +} + +export function buildEditor(host: HTMLElement, ctx: EditContext): void { + const rerender = (): void => { + ctx.onChange(); + buildEditor(host, ctx); + }; + const row = ctx.row; + const set = (patch: () => void): void => { + patch(); + ctx.onChange(); + }; + host.innerHTML = ""; + host.append(head(ctx, set, rerender)); + if (ctx.reasons.length) { + host.append( + el("div", { + className: "m01-logic__reasons", + children: [ + el("strong", { text: tx("Head_Blocked") }), + ...ctx.reasons.map((r) => el("div", { text: r })), + ], + }), + ); + } + host.append(inputsSection(row, set, rerender)); + const money = !("결과" in row) && (row.결과단위 ?? "").startsWith("원"); + if (money) host.append(hoSection(ctx, set, rerender)); + host.append(middleSection(row, set, rerender)); + if (!money) { + const formula = textBox(row.결과?.식 ?? "", (v) => + set(() => { + row.결과 = { 식: v }; + }), + ); + host.append(section(tx("Result_Title"), formula)); + } else { + host.append(extraSection(row, set, rerender)); + const rounding = textBox(row.끝수 ?? "", (v) => + set(() => { + row.끝수 = v.trim() ? v : null; + }), + ); + host.append(section(tx("Rounding"), rounding)); + } +} + +function field(label: string, control: HTMLElement, wide = false): HTMLElement { + return el("label", { + className: `m01-logic__field${wide ? " m01-logic__field--wide" : ""}`, + children: [el("span", { text: label }), control], + }); +} + +function head(ctx: EditContext, set: (p: () => void) => void, rerender: () => void): HTMLElement { + const row = ctx.row; + const file = ctx.isNew + ? choice(ctx.files, ctx.file, (v) => ctx.onFile(v)) + : el("span", { className: "m01-logic__file", text: ctx.file }); + const unit = textBox(row.결과단위, (v) => set(() => (row.결과단위 = v))); + unit.addEventListener("change", rerender); // 돈 로직 ↔ 돈 아닌 로직 칸이 바뀜 + const note = el("textarea", { className: "m01-logic__input m01-logic__note" }); + note.value = row.비고 ?? ""; + note.addEventListener("input", () => + set(() => { + if (note.value.trim()) row.비고 = note.value; + else delete row.비고; + }), + ); + return el("div", { + className: "m01-logic__head", + children: [ + field(tx("Head_File"), file, true), + field( + tx("Head_Key"), + textBox(row.열쇠, (v) => set(() => (row.열쇠 = v))), + ), + field( + tx("Head_Name"), + textBox(row.이름, (v) => set(() => (row.이름 = v))), + ), + field(tx("Head_Unit"), unit), + field( + tx("Head_Source"), + textBox(row.출처, (v) => set(() => (row.출처 = v))), + ), + field( + tx("Head_Owner"), + choice(["공용", "개인"], row.소유, (v) => set(() => (row.소유 = v))), + ), + field(tx("Head_Note"), note, true), + ], + }); +} + +function inputsSection( + row: LogicRow, + set: (p: () => void) => void, + rerender: () => void, +): HTMLElement { + const list = row.입력 ?? []; + const rows = list.map((spec: LogicInput, i) => { + const low = textBox(spec.범위?.[0] ?? "", () => range(), "m01-logic__num"); + const high = textBox(spec.범위?.[1] ?? "", () => range(), "m01-logic__num"); + const range = (): void => + set(() => { + if (low.value.trim() === "" && high.value.trim() === "") delete spec.범위; + else spec.범위 = [Number(low.value), Number(high.value)]; + }); + return [ + textBox(spec.이름, (v) => set(() => (spec.이름 = v))), + textBox(spec.단위 ?? "", (v) => + set(() => { + if (v.trim()) spec.단위 = v; + else delete spec.단위; + }), + ), + textBox((spec.고르기 ?? []).join(", "), (v) => + set(() => { + const items = v + .split(",") + .map((x) => x.trim()) + .filter(Boolean); + if (items.length) spec.고르기 = items; + else delete spec.고르기; + }), + ), + el("div", { + className: "m01-logic__range", + children: [low, el("span", { text: "∼" }), high], + }), + dropButton(() => { + list.splice(i, 1); + rerender(); + }), + ]; + }); + const headers = [ + tx("Head_Name"), + tx("Inputs_Unit"), + tx("Inputs_Choices"), + tx("Inputs_Range"), + "", + ]; + return section(tx("Inputs_Title"), grid(headers, rows, "m01-logic__grid--inputs"), () => { + (row.입력 ??= []).push({ 이름: "" }); + rerender(); + }); +} + +function priceCell(ctx: EditContext, item: HoLine, i: number): HTMLElement { + const line = ctx.lines?.[i]; + if (line) return el("span", { className: "m01-logic__money", text: formatNumber(line.단가) }); + if (item.종류 === "로직" || item.요소.includes("{")) { + return el("span", { className: "m01-logic__muted", text: tx("Ho_PriceLater") }); + } + const brief = ctx.prices[item.요소]; + if (brief === undefined) return el("span", { className: "m01-logic__muted", text: "" }); + if (brief === null) return el("span", { className: "m01-logic__bad", text: tx("Ho_Missing") }); + return el("span", { className: "m01-logic__money", text: formatNumber(brief.값) }); +} + +function hoSection( + ctx: EditContext, + set: (p: () => void) => void, + rerender: () => void, +): HTMLElement { + const list = ctx.row.호표 ?? []; + const rows = list.map((item: HoLine, i) => { + const element = textBox(item.요소, (v) => set(() => (item.요소 = v)), "m01-logic__ref"); + const pick = createButton({ + label: tx("Ho_Pick"), + variant: "ghost", + onClick: () => + ctx.onPick("element", item.종류, (found) => { + const [group, book] = found.ref.split(":"); + const key = found.ref.slice(group.length + book.length + 2); + item.요소 = group === "로직" ? `로직(${book}:${key})` : found.ref; + if (KINDS.includes(group)) item.종류 = group; + item.이름 = found.이름 ?? item.이름; + if (found.규격) item.규격 = found.규격; + else delete item.규격; + if (!item.비목 && COST_OF[item.종류]) item.비목 = COST_OF[item.종류]; + if (group !== "로직") ctx.prices[found.ref] = found; + rerender(); + }), + }); + const brief = ctx.prices[item.요소]; + const spec = item.규격 ?? brief?.규격 ?? ""; + const qty = textBox(item.수량, (v) => { + set(() => (item.수량 = v)); + tag.textContent = qtyKind(v); + }); + const tag = el("span", { className: "m01-logic__tag", text: qtyKind(item.수량) }); + const table = createButton({ + label: tx("Ho_PickTable"), + variant: "ghost", + onClick: () => + ctx.onPick("table", "소요량", (found, column) => { + const ref = found.ref; + item.수량 = `찾기(${ref})${column ? `.${column}` : ""}`; + rerender(); + }), + }); + const cost = + item.종류 === "로직" && !item.비목 + ? choice(["", ...COSTS], "", (v) => set(() => (item.비목 = v || undefined))) + : choice(COSTS, item.비목, (v) => set(() => (item.비목 = v))); + return [ + choice(KINDS, item.종류, (v) => { + item.종류 = v; + rerender(); + }), + el("div", { className: "m01-logic__pair", children: [element, pick] }), + el("div", { + className: "m01-logic__stack", + children: [ + textBox(item.이름 ?? "", (v) => set(() => (item.이름 = v))), + el("span", { className: "m01-logic__muted", text: spec }), + ], + }), + textBox(item.단위 ?? "", (v) => set(() => (item.단위 = v)), "m01-logic__unit"), + el("div", { className: "m01-logic__pair", children: [tag, qty, table] }), + priceCell(ctx, item, i), + el("span", { className: "m01-logic__money", text: formatNumber(ctx.lines?.[i]?.금액 ?? "") }), + cost, + dropButton(() => { + list.splice(i, 1); + rerender(); + }), + ]; + }); + const headers = [ + tx("Ho_Kind"), + tx("Ho_Element"), + tx("Ho_Name"), + tx("Ho_Unit"), + tx("Ho_Qty"), + tx("Ho_Price"), + tx("Ho_Amount"), + tx("Ho_Cost"), + "", + ]; + return section(tx("Ho_Title"), grid(headers, rows, "m01-logic__grid--ho"), () => { + (ctx.row.호표 ??= []).push({ + 종류: "인력", + 요소: "", + 이름: "", + 단위: "인", + 수량: "", + 비목: "노무비", + }); + rerender(); + }); +} + +function formulaRows( + list: NamedFormula[], + set: (p: () => void) => void, + rerender: () => void, + withCost: boolean, +): HTMLElement[][] { + return list.map((item, i) => { + const cells: HTMLElement[] = [ + textBox(item.이름, (v) => set(() => (item.이름 = v))), + textBox(item.식, (v) => set(() => (item.식 = v)), "m01-logic__formula"), + ]; + if (withCost) { + cells.push( + choice(COSTS, item.비목, (v) => set(() => (item.비목 = v))), + textBox(item.출처 ?? "", (v) => set(() => (item.출처 = v))), + ); + } + cells.push( + dropButton(() => { + list.splice(i, 1); + rerender(); + }), + ); + return cells; + }); +} + +function middleSection( + row: LogicRow, + set: (p: () => void) => void, + rerender: () => void, +): HTMLElement { + const list = row.중간 ?? []; + const table = grid( + [tx("Head_Name"), tx("Formula"), ""], + formulaRows(list, set, rerender, false), + "", + ); + return section(tx("Middle_Title"), table, () => { + (row.중간 ??= []).push({ 이름: "", 식: "" }); + rerender(); + }); +} + +function extraSection( + row: LogicRow, + set: (p: () => void) => void, + rerender: () => void, +): HTMLElement { + const list = row.덧줄 ?? []; + const headers = [tx("Head_Name"), tx("Formula"), tx("Ho_Cost"), tx("Head_Source"), ""]; + return section( + tx("Extra_Title"), + grid(headers, formulaRows(list, set, rerender, true), ""), + () => { + (row.덧줄 ??= []).push({ 이름: "", 식: "", 비목: "재료비", 출처: "" }); + rerender(); + }, + ); +} diff --git a/M01_MasterData/M01_MasterData_UI_Logic_List.ts b/M01_MasterData/M01_MasterData_UI_Logic_List.ts new file mode 100644 index 00000000..738436e0 --- /dev/null +++ b/M01_MasterData/M01_MasterData_UI_Logic_List.ts @@ -0,0 +1,155 @@ +/* ============================================================================= + * M01_MasterData_UI_Logic_List.ts + * 왼쪽 로직 목록 — 원문 · 장 · 이름 찾기 · 막힘만 · 막힘(⛔)·고침(●) 표시 + * 거르기는 화면에서(목록은 한 번 받음 · 391 줄 남짓) + * ========================================================================== */ + +import { el } from "@ui/ui_template_elements"; +import type { LogicSummary } from "./M01_MasterData_UI_Logic_Api"; +import { tx } from "./M01_MasterData_UI_Logic_Text"; + +export type ListMark = "edited" | "new" | "deleted"; + +export interface ListItem { + id: string; + book: string; + chapter: string; + key: string; + name: string; + blocked: boolean; + reasons: string[]; +} + +export interface ListHandle { + root: HTMLElement; + setItems: (items: LogicSummary[]) => void; + /** 저장 안 한 새 로직도 목록 맨 위에 */ + setMarks: (marks: Map, extra: ListItem[]) => void; + setActive: (id: string | null) => void; +} + +export const logicId = (book: string, key: string): string => `${book}\n${key}`; + +export function buildList(onOpen: (item: ListItem) => void): ListHandle { + let items: ListItem[] = []; + let extra: ListItem[] = []; + let marks = new Map(); + let active: string | null = null; + const book = el("select", { className: "m01-logic__input" }); + const chapter = el("select", { className: "m01-logic__input" }); + const search = el("input", { + className: "m01-logic__input", + attrs: { type: "search", placeholder: tx("List_Search") }, + }); + const blockedOnly = el("input", { attrs: { type: "checkbox" } }); + const count = el("span", { className: "m01-logic__muted" }); + const list = el("ul", { className: "m01-logic__list" }); + + const options = (select: HTMLSelectElement, all: string, values: string[]): void => { + const keep = select.value; + select.replaceChildren( + el("option", { text: all, attrs: { value: "" } }), + ...values.map((v) => el("option", { text: v, attrs: { value: v } })), + ); + select.value = values.includes(keep) ? keep : ""; + }; + const chapters = (): void => + options(chapter, tx("List_AllChapters"), [ + ...new Set(items.filter((x) => !book.value || x.book === book.value).map((x) => x.chapter)), + ]); + + const draw = (): void => { + const q = search.value.trim().toLowerCase(); + const shown = [...extra, ...items].filter( + (x) => + (!book.value || x.book === book.value) && + (!chapter.value || x.chapter === chapter.value) && + (!blockedOnly.checked || x.blocked) && + (!q || x.key.toLowerCase().includes(q) || x.name.toLowerCase().includes(q)), + ); + count.textContent = tx("List_Count", { n: shown.length }); + list.replaceChildren(...shown.slice(0, 500).map(line)); + }; + const line = (item: ListItem): HTMLElement => { + const mark = marks.get(item.id); + const badges: HTMLElement[] = []; + if (item.blocked) { + badges.push( + el("span", { + className: "m01-logic__badge m01-logic__badge--blocked", + text: `⛔ ${tx("List_Blocked")}`, + attrs: { title: item.reasons.join("\n") }, + }), + ); + } + if (mark) { + const label = { edited: "List_Edited", new: "List_New", deleted: "List_Deleted" } as const; + badges.push(el("span", { className: "m01-logic__badge", text: `● ${tx(label[mark])}` })); + } + const button = el("button", { + className: `m01-logic__item${item.id === active ? " is-active" : ""}`, + attrs: { type: "button", title: item.key }, + children: [ + el("span", { className: "m01-logic__muted", text: `${item.book} ${item.chapter}` }), + el("span", { text: item.name || item.key }), + el("span", { className: "m01-logic__badges", children: badges }), + ], + }); + button.addEventListener("click", () => onOpen(item)); + return el("li", { children: [button] }); + }; + + book.addEventListener("change", () => { + chapters(); + draw(); + }); + chapter.addEventListener("change", draw); + search.addEventListener("input", draw); + blockedOnly.addEventListener("change", draw); + + const root = el("aside", { + className: "m01-logic__side", + children: [ + el("div", { + className: "m01-logic__filters", + children: [ + book, + chapter, + search, + el("label", { + className: "m01-logic__check", + children: [blockedOnly, el("span", { text: tx("List_BlockedOnly") })], + }), + count, + ], + }), + list, + ], + }); + return { + root, + setItems: (logics) => { + items = logics.map((x) => ({ + id: logicId(x.book, x.열쇠), + book: x.book, + chapter: x.chapter, + key: x.열쇠, + name: x.이름, + blocked: x.blocked, + reasons: x.reasons, + })); + options(book, tx("List_AllBooks"), [...new Set(items.map((x) => x.book))]); + chapters(); + draw(); + }, + setMarks: (next, more) => { + marks = next; + extra = more; + draw(); + }, + setActive: (id) => { + active = id; + draw(); + }, + }; +} diff --git a/M01_MasterData/M01_MasterData_UI_Logic_Page.ts b/M01_MasterData/M01_MasterData_UI_Logic_Page.ts new file mode 100644 index 00000000..78ba6bc9 --- /dev/null +++ b/M01_MasterData/M01_MasterData_UI_Logic_Page.ts @@ -0,0 +1,360 @@ +/* ============================================================================= + * M01_MasterData_UI_Logic_Page.ts + * 관리자 화면 — 로직 칸. 왼쪽 목록 / 가운데 일위대가표(호표) 고치기 / 오른쪽 시험 계산 + * 진입: 공용 진입 파일이 `mountM01Logic(host)` 한 줄로 붙임(요소 칸은 sub_laptop_3 몫) + * + * 데이터 흐름(CLAUDE.md 5장) — 고친 것은 캐시(sessionStorage)에 쌓고 [저장] 한 번에 `POST /save`. + * 409 = 그 사이 파일이 바뀜 · 422 = 검사 걸림(아무것도 안 씀) — 까닭은 서버 글 그대로 보임. + * ========================================================================== */ + +import { + createButton, + el, + hideLoadingOverlay, + showConfirmDialog, + showLoadingOverlay, + showToast, +} from "@ui/ui_template_elements"; +import { + ApiError, + fetchLogic, + fetchLogicFiles, + fetchLogics, + saveFiles, + type CalcLine, + type ElementBrief, + type LogicFile, + type LogicRow, + type SaveFile, +} from "./M01_MasterData_UI_Logic_Api"; +import { buildCalc } from "./M01_MasterData_UI_Logic_Calc"; +import { buildEditor } from "./M01_MasterData_UI_Logic_Edit"; +import { buildList, logicId, type ListItem, type ListMark } from "./M01_MasterData_UI_Logic_List"; +import { openPicker } from "./M01_MasterData_UI_Logic_Pick"; +import { tx } from "./M01_MasterData_UI_Logic_Text"; +import "./M01_MasterData_UI_Logic_Style.css"; + +/** 저장 안 한 로직 하나 — origKey null = 새 로직 · row null = 지움 */ +interface Draft { + book: string; + file: string; + version: string; + origKey: string | null; + row: LogicRow | null; +} + +interface Opened extends Draft { + id: string; + row: LogicRow | null; + original: string | null; + prices: Record; + reasons: string[]; + lines: CalcLine[] | null; + values: Record; +} + +const CACHE_KEY = "m01_logic_drafts"; +const clone = (v: T): T => JSON.parse(JSON.stringify(v)) as T; + +function loadDrafts(): Record { + try { + return JSON.parse(sessionStorage.getItem(CACHE_KEY) ?? "{}") as Record; + } catch { + return {}; + } +} + +export async function mountM01Logic(host: HTMLElement): Promise { + let drafts = loadDrafts(); + let files: LogicFile[] = []; + let opened: Opened | null = null; + let calcInputs = ""; + + const editor = el("div", { className: "m01-logic__editor" }); + const errors = el("div", { className: "m01-logic__reasons", attrs: { hidden: "" } }); + const calc = el("aside", { className: "m01-logic__calc" }); + const pending = el("span", { className: "m01-logic__muted" }); + const list = buildList((item) => void open(item.id, item.book, item.key)); + + const persist = (): void => { + try { + sessionStorage.setItem(CACHE_KEY, JSON.stringify(drafts)); + } catch { + /* 캐시가 막혀도 화면 안의 고친 것은 남음 */ + } + const marks = new Map(); + const extra: ListItem[] = []; + for (const [id, d] of Object.entries(drafts)) { + marks.set(id, d.origKey === null ? "new" : d.row === null ? "deleted" : "edited"); + if (d.origKey === null && d.row) { + extra.push({ + id, + book: d.book, + chapter: "", + key: d.row.열쇠, + name: d.row.이름, + blocked: false, + reasons: [], + }); + } + } + list.setMarks(marks, extra); + const n = Object.keys(drafts).length; + pending.textContent = n ? tx("Bar_Pending", { n }) : ""; + saveButton.disabled = discardButton.disabled = n === 0; + }; + + const touch = (): void => { + if (!opened?.row) return; + const now = JSON.stringify(opened.row); + if (opened.origKey !== null && now === opened.original) delete drafts[opened.id]; + else drafts[opened.id] = pick(opened, clone(opened.row)); + persist(); + const inputs = JSON.stringify(opened.row.입력 ?? []); + if (inputs !== calcInputs) drawCalc(); + }; + + const pick = (o: Opened, row: LogicRow | null): Draft => ({ + book: o.book, + file: o.file, + version: o.version, + origKey: o.origKey, + row, + }); + + const drawCalc = (): void => { + if (!opened?.row) { + calc.replaceChildren(); + return; + } + const current = opened; + calcInputs = JSON.stringify(current.row?.입력 ?? []); + buildCalc(calc, { + book: current.book, + savedKey: current.origKey, + file: current.file, + row: current.row as LogicRow, + dirty: () => current.id in drafts, + values: current.values, + onLines: (lines) => { + current.lines = lines; + drawEditor(); + }, + }); + }; + + const drawEditor = (): void => { + list.setActive(opened?.id ?? null); + if (!opened) { + editor.replaceChildren(el("p", { className: "m01-logic__empty", text: tx("Empty") })); + return; + } + if (!opened.row) { + editor.replaceChildren( + el("p", { className: "m01-logic__empty", text: `● ${tx("List_Deleted")}` }), + ); + return; + } + const current = opened; + buildEditor(editor, { + row: current.row as LogicRow, + file: current.file, + isNew: current.origKey === null, + files: files.map((f) => f.file), + reasons: current.reasons, + prices: current.prices, + lines: current.lines, + onChange: touch, + onFile: (file) => { + const f = files.find((x) => x.file === file); + if (!f) return; + Object.assign(current, { file: f.file, book: f.book, version: f.version }); + touch(); + }, + onPick: openPicker, + }); + }; + + const show = (next: Opened | null): void => { + opened = next; + errors.hidden = true; + drawEditor(); + drawCalc(); + }; + + const open = async (id: string, book: string, key: string): Promise => { + const draft = drafts[id]; + if (draft?.origKey === null) { + show({ ...draft, id, original: null, prices: {}, reasons: [], lines: null, values: {} }); + return; + } + try { + const one = await fetchLogic(book, key); + show({ + id, + book, + file: draft?.file ?? one.file, + version: draft?.version ?? one.version, + origKey: key, + row: draft ? (draft.row === null ? null : clone(draft.row)) : clone(one.logic), + original: JSON.stringify(one.logic), + prices: one.prices, + reasons: one.reasons, + lines: null, + values: {}, + }); + } catch (error) { + showToast(error instanceof Error ? error.message : tx("Load_Failed"), "error"); + } + }; + + const reload = async (): Promise => { + const [logics, logicFiles] = await Promise.all([fetchLogics(), fetchLogicFiles()]); + files = logicFiles; + list.setItems(logics); + persist(); + }; + + const onNew = (): void => { + const f = files.find((x) => x.file === opened?.file) ?? files[0]; + if (!f) return; + const id = `new:${Date.now()}`; + const row: LogicRow = { + 열쇠: `${tx("New_Key")} ${Object.keys(drafts).length + 1}`, + 이름: "", + 결과단위: "원/", + 출처: "", + 소유: "공용", + 입력: [], + 중간: [], + 호표: [], + 덧줄: [], + 끝수: null, + }; + const next: Opened = { + id, + book: f.book, + file: f.file, + version: f.version, + origKey: null, + row, + original: null, + prices: {}, + reasons: [], + lines: null, + values: {}, + }; + drafts[id] = pick(next, clone(row)); + persist(); + show(next); + }; + + const onDelete = async (): Promise => { + if (!opened?.row) return; + if (!(await showConfirmDialog(tx("Confirm_Delete", { v: opened.row.열쇠 }), tx("Bar_Delete")))) + return; + if (opened.origKey === null) { + delete drafts[opened.id]; + persist(); + show(null); + return; + } + drafts[opened.id] = pick(opened, null); + opened.row = null; + persist(); + show(opened); + }; + + const onDiscard = async (): Promise => { + if (!(await showConfirmDialog(tx("Confirm_Discard"), tx("Bar_Discard")))) return; + drafts = {}; + persist(); + const was = opened; + if (was && was.origKey !== null) + await open(logicId(was.book, was.origKey), was.book, was.origKey); + else show(null); + }; + + const onSave = async (): Promise => { + const byFile = new Map(); + for (const d of Object.values(drafts)) { + const part = byFile.get(d.file) ?? { file: d.file, version: d.version, changes: [] }; + if (d.origKey === null) { + if (d.row) part.changes.push({ op: "add", row: d.row }); + } else if (d.row === null) part.changes.push({ op: "delete", key: d.origKey }); + else part.changes.push({ op: "edit", key: d.origKey, row: d.row }); + byFile.set(d.file, part); + } + if (!byFile.size) { + showToast(tx("Save_Nothing"), "info"); + return; + } + showLoadingOverlay(); + try { + await saveFiles([...byFile.values()]); + const was = opened; + drafts = {}; + await reload(); + showToast(tx("Save_Done"), "success"); + if (was?.row) await open(logicId(was.book, was.row.열쇠), was.book, was.row.열쇠); + else show(null); + } catch (error) { + failed(error); + } finally { + hideLoadingOverlay(); + } + }; + + const failed = (error: unknown): void => { + const detail = + error instanceof ApiError ? (error.detail as { stale?: string[]; errors?: string[] }) : null; + if (error instanceof ApiError && error.status === 409) { + showToast(tx("Save_Stale", { v: (detail?.stale ?? []).join(", ") }), "error"); + } else if (error instanceof ApiError && error.status === 422) { + errors.replaceChildren( + el("strong", { text: tx("Save_Errors") }), + ...(detail?.errors ?? []).map((x) => el("div", { text: x })), + ); + errors.hidden = false; + } else { + showToast(error instanceof Error ? error.message : tx("Save_Failed"), "error"); + } + }; + + const saveButton = createButton({ label: tx("Bar_Save"), onClick: () => void onSave() }); + const discardButton = createButton({ + label: tx("Bar_Discard"), + variant: "ghost", + onClick: () => void onDiscard(), + }); + const bar = el("div", { + className: "m01-logic__bar", + children: [ + el("h2", { text: tx("Title") }), + pending, + createButton({ label: tx("Bar_New"), variant: "ghost", onClick: onNew }), + createButton({ label: tx("Bar_Delete"), variant: "danger", onClick: () => void onDelete() }), + discardButton, + saveButton, + ], + }); + host.replaceChildren( + el("div", { + className: "m01-logic", + children: [ + list.root, + el("main", { className: "m01-logic__main", children: [bar, errors, editor] }), + calc, + ], + }), + ); + show(null); + showLoadingOverlay(); + try { + await reload(); + } catch (error) { + showToast(error instanceof Error ? error.message : tx("Load_Failed"), "error"); + } finally { + hideLoadingOverlay(); + } +} diff --git a/M01_MasterData/M01_MasterData_UI_Logic_Pick.ts b/M01_MasterData/M01_MasterData_UI_Logic_Pick.ts new file mode 100644 index 00000000..a49d6f7e --- /dev/null +++ b/M01_MasterData/M01_MasterData_UI_Logic_Pick.ts @@ -0,0 +1,109 @@ +/* ============================================================================= + * M01_MasterData_UI_Logic_Pick.ts + * 요소 찾기 창 — 그룹 전체에서 이름·열쇠로 찾아 호표 줄에 넣음(`GET /elements`) + * 표 고르기(소요량·계수)는 값칸 단추를 눌러 `찾기(…).칸` 으로 수량에 넣음 + * ========================================================================== */ + +import { createButton, el, showToast } from "@ui/ui_template_elements"; +import { searchElements, type ElementBrief } from "./M01_MasterData_UI_Logic_Api"; +import { formatNumber, type PickDone, type PickMode } from "./M01_MasterData_UI_Logic_Edit"; +import { tx } from "./M01_MasterData_UI_Logic_Text"; + +const GROUPS: Record = { + element: ["인력", "재료", "기계", "로직"], + table: ["소요량", "계수"], +}; + +export function openPicker(mode: PickMode, group: string, done: PickDone): void { + const groups = GROUPS[mode]; + const select = el("select", { className: "m01-logic__input" }); + for (const g of groups) select.append(el("option", { text: g, attrs: { value: g } })); + select.value = groups.includes(group) ? group : groups[0]; + const search = el("input", { + className: "m01-logic__input", + attrs: { type: "search", placeholder: tx("Pick_Search") }, + }); + const count = el("span", { className: "m01-logic__muted" }); + const list = el("div", { className: "m01-logic__pick-list" }); + const close = (): void => backdrop.remove(); + const dialog = el("div", { + className: "m01-logic__pick", + attrs: { role: "dialog", "aria-label": tx("Pick_Title") }, + children: [ + el("div", { + className: "m01-logic__section-head", + children: [ + el("h3", { text: tx("Pick_Title") }), + createButton({ label: tx("Pick_Close"), variant: "ghost", onClick: close }), + ], + }), + el("div", { className: "m01-logic__pick-bar", children: [select, search, count] }), + list, + ], + }); + const backdrop = el("div", { className: "m01-logic__backdrop", children: [dialog] }); + backdrop.addEventListener("click", (ev) => ev.target === backdrop && close()); + backdrop.addEventListener("keydown", (ev) => ev.key === "Escape" && close()); + + const choose = (item: ElementBrief, column?: string): void => { + close(); + done(item, column); + }; + let seq = 0; + const load = async (): Promise => { + const mine = ++seq; + try { + const found = await searchElements(select.value, search.value.trim()); + if (mine !== seq) return; // 최신 응답만 + count.textContent = tx("Pick_Total", { n: found.total }); + list.replaceChildren(...found.items.map((item) => itemRow(item, mode, choose))); + } catch (error) { + showToast(error instanceof Error ? error.message : tx("Load_Failed"), "error"); + } + }; + let timer = 0; + search.addEventListener("input", () => { + window.clearTimeout(timer); + timer = window.setTimeout(load, 250); + }); + select.addEventListener("change", load); + document.body.append(backdrop); + search.focus(); + void load(); +} + +function itemRow( + item: ElementBrief, + mode: PickMode, + choose: (item: ElementBrief, column?: string) => void, +): HTMLElement { + const text = el("div", { + className: "m01-logic__stack", + children: [ + el("strong", { text: `${item.이름 ?? ""} ${item.규격 ?? ""}`.trim() }), + el("span", { className: "m01-logic__muted", text: item.ref }), + ], + }); + if (mode === "table") { + const columns = Object.keys(item.값칸 ?? {}); + const chips = columns.map((column) => + createButton({ label: column, variant: "pill", onClick: () => choose(item, column) }), + ); + return el("div", { + className: "m01-logic__pick-row", + children: [text, el("div", { className: "m01-logic__chips", children: chips })], + }); + } + const unit = typeof item.단위 === "string" ? item.단위 : ""; + const value = typeof item.값 === "object" && item.값 !== null ? "{…}" : formatNumber(item.값); + const row = el("button", { + className: "m01-logic__pick-row m01-logic__pick-row--button", + attrs: { type: "button" }, + children: [ + text, + el("span", { className: "m01-logic__money", text: `${value} ${unit}`.trim() }), + ], + }); + row.addEventListener("click", () => choose(item)); + return row; +} diff --git a/M01_MasterData/M01_MasterData_UI_Logic_Style.css b/M01_MasterData/M01_MasterData_UI_Logic_Style.css new file mode 100644 index 00000000..0bbf5961 --- /dev/null +++ b/M01_MasterData/M01_MasterData_UI_Logic_Style.css @@ -0,0 +1,388 @@ +/* M01 로직 칸 — 왼쪽 목록 / 가운데 일위대가표 / 오른쪽 시험 계산 */ +.m01-logic [hidden] { + display: none !important; +} + +.m01-logic { + display: grid; + grid-template-columns: 240px minmax(0, 1fr) 280px; + gap: var(--spacing-12); + height: 100%; + min-height: 0; + padding: var(--spacing-12); + box-sizing: border-box; + color: var(--color-text-body); + font-size: var(--text-body-sm); +} + +.m01-logic__side, +.m01-logic__main, +.m01-logic__calc { + display: flex; + flex-direction: column; + gap: var(--spacing-8); + min-height: 0; + overflow: auto; +} + +.m01-logic__side, +.m01-logic__calc { + padding: var(--spacing-8); + border-radius: var(--radius-cards); + background: var(--color-surface); +} + +.m01-logic__filters { + display: flex; + flex-direction: column; + gap: var(--spacing-4); +} + +.m01-logic__check { + display: flex; + align-items: center; + gap: var(--spacing-4); +} + +.m01-logic__list { + margin: 0; + padding: 0; + list-style: none; + overflow: auto; +} + +.m01-logic__item { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 2px; + width: 100%; + padding: var(--spacing-4) var(--spacing-8); + border: 0; + border-radius: var(--radius-buttons); + background: none; + color: inherit; + font: inherit; + text-align: left; + cursor: pointer; +} + +.m01-logic__item:hover { + background: var(--color-paper); +} + +.m01-logic__item.is-active { + background: var(--color-mist-violet); + color: var(--color-accent); +} + +.m01-logic__badges { + display: flex; + gap: var(--spacing-4); +} + +.m01-logic__badge { + font-size: var(--text-caption); + color: var(--color-warning); +} + +.m01-logic__badge--blocked { + color: var(--color-danger); +} + +.m01-logic__bar { + display: flex; + align-items: center; + gap: var(--spacing-8); + flex-wrap: wrap; +} + +.m01-logic__bar h2 { + margin: 0 auto 0 0; + font-size: 18px; + color: var(--color-text); +} + +.m01-logic__empty { + color: var(--color-text-muted); +} + +.m01-logic__head { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); + gap: var(--spacing-8); +} + +.m01-logic__field { + display: flex; + flex-direction: column; + gap: 2px; + color: var(--color-text-secondary); + font-size: var(--text-caption); +} + +.m01-logic__field--wide { + grid-column: 1 / -1; +} + +.m01-logic__file { + color: var(--color-text-body); + font-size: var(--text-body-sm); +} + +.m01-logic__input { + box-sizing: border-box; + width: 100%; + min-width: 0; + padding: 3px 6px; + border: 1px solid var(--color-border); + border-radius: var(--radius-sm); + background: var(--color-canvas); + color: var(--color-text-body); + font: inherit; + font-size: var(--text-body-sm); +} + +.m01-logic__note { + min-height: 48px; + resize: vertical; +} + +.m01-logic__section { + display: flex; + flex-direction: column; + gap: var(--spacing-4); +} + +.m01-logic__section-head { + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--spacing-8); +} + +.m01-logic__section-head h3, +.m01-logic__calc h3 { + margin: 0; + font-size: var(--text-body-sm); + color: var(--color-text); +} + +.m01-logic__grid { + width: 100%; + border-collapse: collapse; +} + +.m01-logic__grid th, +.m01-logic__grid td { + padding: 2px 4px; + border-bottom: 1px solid var(--color-border); + vertical-align: top; + text-align: left; +} + +.m01-logic__grid th { + color: var(--color-text-secondary); + font-size: var(--text-caption); + font-weight: 600; +} + +.m01-logic__grid th, +.m01-logic__grid .ui-btn { + white-space: nowrap; +} + +.m01-logic__scroll { + overflow-x: auto; +} + +.m01-logic__grid--ho { + min-width: 1124px; + table-layout: fixed; +} + +.m01-logic__grid--ho th:nth-child(1) { + width: 76px; +} + +.m01-logic__grid--ho th:nth-child(2) { + width: 220px; +} + +.m01-logic__grid--ho th:nth-child(3) { + width: 150px; +} + +.m01-logic__grid--ho th:nth-child(4) { + width: 56px; +} + +.m01-logic__grid--ho th:nth-child(5) { + width: 300px; +} + +.m01-logic__grid--ho th:nth-child(6), +.m01-logic__grid--ho th:nth-child(7) { + width: 100px; +} + +.m01-logic__grid--ho th:nth-child(8) { + width: 90px; +} + +.m01-logic__grid--ho th:nth-child(9) { + width: 32px; +} + +.m01-logic__pair { + display: flex; + align-items: center; + gap: var(--spacing-4); +} + +.m01-logic__stack { + display: flex; + flex-direction: column; + gap: 2px; + min-width: 0; +} + +.m01-logic__range { + display: flex; + align-items: center; + gap: 2px; +} + +.m01-logic__num { + width: 64px; +} + +.m01-logic__tag { + flex: none; + padding: 0 6px; + border-radius: var(--radius-pills); + background: var(--color-mist-violet); + color: var(--color-accent); + font-size: var(--text-caption); +} + +.m01-logic__money { + display: block; + text-align: right; + font-variant-numeric: tabular-nums; + white-space: nowrap; +} + +.m01-logic__muted { + color: var(--color-text-muted); + font-size: var(--text-caption); +} + +.m01-logic__bad { + color: var(--color-danger); + font-size: var(--text-caption); +} + +.m01-logic__drop { + border: 0; + background: none; + color: var(--color-text-muted); + font-size: 16px; + cursor: pointer; +} + +.m01-logic__drop:hover { + color: var(--color-danger); +} + +.m01-logic__reasons { + padding: var(--spacing-8); + border-left: 3px solid var(--color-danger); + border-radius: var(--radius-sm); + background: var(--color-canvas); + color: var(--color-danger); +} + +.m01-logic__sums { + display: grid; + grid-template-columns: auto 1fr; + gap: 2px var(--spacing-8); + margin: 0; +} + +.m01-logic__sums dt { + color: var(--color-text-secondary); +} + +.m01-logic__sums dd { + margin: 0; + text-align: right; +} + +.m01-logic__calc-out { + display: flex; + flex-direction: column; + gap: var(--spacing-8); +} + +.m01-logic__backdrop { + position: fixed; + inset: 0; + z-index: 1000; + display: flex; + align-items: center; + justify-content: center; + background: color-mix(in srgb, var(--color-ink) 30%, transparent); +} + +.m01-logic__pick { + display: flex; + flex-direction: column; + gap: var(--spacing-8); + width: min(720px, 92vw); + max-height: 80vh; + padding: var(--spacing-16); + border-radius: var(--radius-xl); + background: var(--color-surface-raised); + font-size: var(--text-body-sm); +} + +.m01-logic__pick-bar { + display: grid; + grid-template-columns: 120px 1fr auto; + align-items: center; + gap: var(--spacing-8); +} + +.m01-logic__pick-list { + overflow: auto; +} + +.m01-logic__pick-row { + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--spacing-8); + width: 100%; + padding: var(--spacing-4) var(--spacing-8); + border: 0; + border-bottom: 1px solid var(--color-border); + background: none; + color: inherit; + font: inherit; + text-align: left; +} + +.m01-logic__pick-row--button { + cursor: pointer; +} + +.m01-logic__pick-row--button:hover { + background: var(--color-paper); +} + +.m01-logic__chips { + display: flex; + flex-wrap: wrap; + gap: var(--spacing-4); +} diff --git a/M01_MasterData/M01_MasterData_UI_Logic_Text.ts b/M01_MasterData/M01_MasterData_UI_Logic_Text.ts new file mode 100644 index 00000000..05020d41 --- /dev/null +++ b/M01_MasterData/M01_MasterData_UI_Logic_Text.ts @@ -0,0 +1,99 @@ +/* ============================================================================= + * M01_MasterData_UI_Logic_Text.ts + * 로직 화면 글자 — [한국어, 영어] · 공용 사전과 같은 모양 · 창끼리 공용 사전 줄이 겹치지 않게 따로 둠 + * ========================================================================== */ + +import { currentLanguageIndex } from "@ui/ui_template_locale"; + +const TEXT = { + Title: ["일위대가 로직", "Unit-cost logic"], + List_Search: ["이름 찾기", "Search name"], + List_AllBooks: ["원문 모두", "All sources"], + List_AllChapters: ["장 모두", "All chapters"], + List_BlockedOnly: ["막힘만", "Blocked only"], + List_Count: ["{n} 개", "{n} items"], + List_Blocked: ["막힘", "Blocked"], + List_Edited: ["고침", "Edited"], + List_New: ["새것", "New"], + List_Deleted: ["지움", "Deleted"], + Bar_New: ["로직 새로 만들기", "New logic"], + Bar_Delete: ["로직 지우기", "Delete logic"], + Bar_Save: ["저장", "Save"], + Bar_Discard: ["고친 것 버리기", "Discard edits"], + Bar_Pending: ["저장 안 한 로직 {n} 개", "{n} unsaved logics"], + Empty: ["왼쪽 목록에서 로직을 고르세요", "Pick a logic from the list"], + Head_File: ["파일", "File"], + Head_Key: ["열쇠", "Key"], + Head_Name: ["이름", "Name"], + Head_Unit: ["결과단위", "Result unit"], + Head_Source: ["출처", "Source"], + Head_Owner: ["소유", "Owner"], + Head_Note: ["비고", "Note"], + Head_Blocked: ["막힌 까닭", "Why blocked"], + Inputs_Title: ["설계에서 받을 값", "Values from design"], + Inputs_Unit: ["단위", "Unit"], + Inputs_Choices: ["고르기(쉼표로)", "Choices (comma)"], + Inputs_Range: ["범위", "Range"], + Ho_Title: ["호표", "Unit-cost lines"], + Ho_Kind: ["종류", "Kind"], + Ho_Element: ["요소", "Element"], + Ho_Name: ["이름·규격", "Name · spec"], + Ho_Unit: ["단위", "Unit"], + Ho_Qty: ["수량", "Qty"], + Ho_Price: ["단가", "Unit price"], + Ho_Amount: ["금액", "Amount"], + Ho_Cost: ["비목", "Cost item"], + Ho_Pick: ["찾기", "Find"], + Ho_PickTable: ["표", "Table"], + Ho_QtyNumber: ["수", "Number"], + Ho_QtyTable: ["표 찾기", "Table lookup"], + Ho_QtyFormula: ["식", "Formula"], + Ho_PriceLater: ["계산 때", "At calc"], + Ho_Missing: ["없는 요소", "Missing element"], + Middle_Title: ["중간 값", "Intermediate values"], + Result_Title: ["결과 식(돈 아닌 로직)", "Result formula (non-money)"], + Extra_Title: ["덧줄", "Extra lines"], + Rounding: ["끝수", "Rounding"], + Formula: ["식", "Formula"], + AddRow: ["줄 더하기", "Add line"], + DeleteRow: ["줄 지우기", "Delete line"], + Calc_Title: ["시험 계산", "Test calculation"], + Calc_Run: ["계산", "Calculate"], + Calc_NoInputs: ["받을 값 없음", "No inputs"], + Calc_Draft: ["고친 줄로 계산(저장 전)", "Using unsaved edits"], + Calc_Stopped: ["멈춤", "Stopped"], + Calc_Result: ["결과", "Result"], + Calc_Sum: ["계", "Total"], + Pick_Title: ["요소 찾기", "Find element"], + Pick_Search: ["이름·열쇠", "Name · key"], + Pick_Total: ["{n} 개 중 앞 100 개", "first 100 of {n}"], + Pick_Close: ["닫기", "Close"], + Save_Done: ["저장했음", "Saved"], + Save_Stale: [ + "그 사이 파일이 바뀜 — 고친 것을 버리고 다시 여세요: {v}", + "Files changed meanwhile — discard and reopen: {v}", + ], + Save_Errors: ["검사에 걸려 저장 안 함", "Check failed — nothing saved"], + Save_Failed: ["저장 못 함", "Save failed"], + Save_Nothing: ["고친 것 없음", "Nothing to save"], + Load_Failed: ["불러오지 못함", "Load failed"], + Confirm_Delete: [ + "로직 「{v}」 을 지울까요? [저장] 때 파일에서 빠짐", + "Delete logic “{v}”? Removed on save", + ], + Confirm_Discard: ["고친 것을 모두 버릴까요?", "Discard all edits?"], + Confirm_Leave: [ + "저장 안 한 로직이 있음 — 다른 로직을 열어도 고친 것은 남음", + "Unsaved logics stay in the draft", + ], + New_Key: ["새 로직", "New logic"], +} as const satisfies Record; + +export type TextKey = keyof typeof TEXT; + +/** 공용 `t()` 와 같은 뜻 — `{n}`·`{v}` 는 채움 */ +export function tx(key: TextKey, fill: Record = {}): string { + const entry = TEXT[key]; + const text: string = entry[currentLanguageIndex as 0 | 1] ?? entry[0]; + return text.replace(/\{(\w+)\}/g, (m, k: string) => (k in fill ? String(fill[k]) : m)); +} diff --git a/resources/master_data/_화면_계약.md b/resources/master_data/_화면_계약.md index aa0d76eb..90c3c2ab 100644 --- a/resources/master_data/_화면_계약.md +++ b/resources/master_data/_화면_계약.md @@ -21,21 +21,24 @@ | `GET /tables` | `file` · `q` | `{file, version, tables: [{열쇠, 이름, 기준, 출처, 조건, 값칸, count}]}` | | `GET /table` | `file` · `key` | `{file, version, table: {표 하나 통째}}` | | `GET /logics` | `book` · `chapter` · `q` · `blocked`(0/1) | `{logics: [{file, book, chapter, 열쇠, 이름, 결과단위, 출처, blocked, reasons}]}` | -| `GET /logic` | `book` · `key` | `{file, version, logic: {로직 한 줄 통째}, blocked, reasons}` | +| `GET /logic` | `book` · `key` | `{file, version, logic: {로직 한 줄 통째}, blocked, reasons, prices: {요소: 요약 \| null}}` | +| `GET /elements` | `group` · `q` · `limit`(50 · 200까지) | `{total, items: [{ref, file, 이름, 규격, 단위, 값, 값칸}]}` | - `rows` 는 요소·로직 파일은 `줄`, 표형 파일(소요량·계수)은 `표` 를 줄로 봄. - `q` = 이름 찾기 — `열쇠`·`이름` 에 든 글(대소문자 무시). - `chapter` = 파일 이름의 장(`공통3장` · `13장` · `01장`) · 없으면 "". - `blocked` = 로직 검사(`check_master.py 로직`)에 걸림 · `reasons` = 걸린 까닭 글. +- `prices` = 호표 `요소` → `{ref, 이름, 규격, 단위, 값}`(단가 자동 칸) · 없는 요소는 `null` · `{이름}` 이 낀 열쇠·하위 로직 줄은 빠짐(계산 때 정해짐). +- `elements` = 요소 찾기 창 — 그룹 전체에서 `q` 찾기 · `ref` = 식에 넣는 `그룹:원문:열쇠` · 표형 그룹은 `값칸` 이 옴. ## 3. 시험 계산 -`POST /calc` 받음 `{book, key, inputs: {이름: 값}}` +`POST /calc` 받음 `{book, key, inputs: {이름: 값}, row?, file?}` - 됨 — `{ok: true, lines: [{이름, 단위, 수량, 단가, 금액, 비목: {비목: 금액}}], sums: {노무비, 재료비, 경비, 계}, middle: {이름: 값}}` - 돈 아닌 로직 — `{ok: true, result, middle}` - 멈춤 — `{ok: false, reason}` (200). 까닭 = 엔진 글 그대로(「입력 「돌」 없음」 · 「값 없음 — 관리자가 채울 값」 …). -- 계산은 저장된 파일로만 — 화면 캐시의 고친 값은 [저장] 뒤에 반영. +- `row` 없음 = 저장된 파일로 계산 · `row` 있음 = 그 로직만 고친 줄로 바꿔(없던 로직이면 `file` 에 더해) 메모리에서 계산 — 파일에 안 씀. 요소 값은 늘 저장된 파일. ## 4. 저장 diff --git a/resources/tester/test_m01_api.py b/resources/tester/test_m01_api.py index 35c73fdc..dc7621d6 100644 --- a/resources/tester/test_m01_api.py +++ b/resources/tester/test_m01_api.py @@ -163,6 +163,28 @@ def test_더함_지움_로직_파일도_같은_길(client: TestClient) -> None: ) +def test_단가_자동_요소_찾기_저장전_시험계산(client: TestClient) -> None: + one = _get(client, "/api/m01/logic", book=LOGIC_BOOK, key=LOGIC_KEY) + labor = one["prices"]["인력:건설노임:1016"] + assert labor["이름"] == "화약취급공" and labor["값"] > 0 + found = _get(client, "/api/m01/elements", group="인력", q="보통인부") + assert "인력:건설노임:1002" in [x["ref"] for x in found["items"]] + tables = _get(client, "/api/m01/elements", group="소요량", q="암발파", limit=5) + assert tables["items"] and all(x["값칸"] for x in tables["items"]) + raw = (store.FOLDER / one["file"]).read_bytes() + before = _calc(client)["sums"]["계"] + half = {**one["logic"], "호표": one["logic"]["호표"][:1]} # 보통인부 줄 뺌 + res = client.post( + "/api/m01/calc", json={"book": LOGIC_BOOK, "key": LOGIC_KEY, "inputs": {}, "row": half} + ) + lines = res.json()["lines"] + assert [x["이름"] for x in lines] == ["화약취급공"] and res.json()["sums"]["계"] < before + new = {**half, "열쇠": "새 로직"} + body = {"book": LOGIC_BOOK, "key": "새 로직", "inputs": {}, "row": new, "file": one["file"]} + assert client.post("/api/m01/calc", json=body).json()["ok"] is True + assert (store.FOLDER / one["file"]).read_bytes() == raw # 시험 계산은 안 씀 + + def test_쓰기_모양은_읽은_값과_같음() -> None: for name in ("소요량_건설품셈_기계설비13장.json", "로직_건설품셈_토목2장.json", LABOR): data = json.loads((REAL / name).read_text(encoding="utf-8"), parse_float=Decimal)