From 459033786b963f5639146dd3cf0744036f66d0d7 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Thu, 17 Sep 2026 10:16:47 +0900 Subject: [PATCH 1/2] docs(cost): map forest and construction links --- .../01_임도/04_수량분석정보/건설품셈_활용.md | 53 +++++++++++++++++-- 1 file changed, 48 insertions(+), 5 deletions(-) diff --git a/resources/knowledge/technical_info/01_임도/04_수량분석정보/건설품셈_활용.md b/resources/knowledge/technical_info/01_임도/04_수량분석정보/건설품셈_활용.md index 0c878c38..93675c8a 100644 --- a/resources/knowledge/technical_info/01_임도/04_수량분석정보/건설품셈_활용.md +++ b/resources/knowledge/technical_info/01_임도/04_수량분석정보/건설품셈_활용.md @@ -8,8 +8,8 @@ sources: - doc: 산림사업 표준품셈 (산림청고시 제2025-82호) version: 2026-01-01 시행 loc: original/행정규칙/임도 품셈 적용기준 (현 산림사업 표준품셈)/ -status: verified -last_updated: 2026-08-15 +status: draft +last_updated: 2026-09-17 --- 관련 문서: [품셈_적용기준](품셈_적용기준.md) · [수량산출_일반](수량산출_일반.md) · [기계경비_산정](../05_원가정보/기계경비_산정.md) · [원가_기초데이터_원천](../05_원가정보/원가_기초데이터_원천.md) @@ -43,14 +43,57 @@ last_updated: 2026-08-15 | 유지보수 (기존 임도 보수) | [05_유지관리부문](../../../original/원가계산/건설공사_표준품셈/05_유지관리부문/) 4장 | 낮음 | 해체·보수 품 ('22 신설 다수) | | (참고) 건축·기계설비 부문 | 03_건축 11장 · 04_기계설비 13장 | 낮음 | 임도 통상 미사용 — 특수 부대시설 시 참조 | -## 3. 적용 시 주의 +## 3. 두 품셈 연결고리 (2026-09-17 밑그림) + +### 3.1 판정 원칙 + +- 산림품셈 총칙 1-1 제7호는 `본 품셈에 명시되지 않은 품`에 타 부문 표준품셈을 적용하고, 타 부문과 유사한 공종은 산림품셈을 우선하도록 한다(산림 원문 L535). 따라서 이름이 같거나 비슷하다는 이유만으로 자동 연결하지 않는다. +- 아래 **확정**은 산림 원문의 직접 지시 또는 현행 데이터·계산의 출처 기록이 있는 것만 뜻한다. 같은 기능처럼 보여도 절 대 절 대응 근거가 없으면 **미판정**이다. +- 이 표는 연결의 존재를 기록한 것이며, 한쪽 품을 다른 쪽 품으로 통째로 바꿀 수 있다는 뜻이 아니다. + +### 3.2 산림에만 확인된 갈래 + +| 산림품셈 범위 | 건설품셈 대응 | 판정·근거 | +|---|---|---| +| 제2장 조림·제3장 숲가꾸기·제4장 산림병해충방제·제6장 산림경영계획·제7장 수확 | 미판정 | 2026 건설품셈 5부문 45장에 같은 산림사업 공종표는 확인되지 않음. 비슷한 이름의 조경·유지관리 품과 자동 연결하지 않음 | +| 13-13-1 목재틀흙막이 | 미판정 | 산림 원문에 구조·규격별 품이 있으나 2026 건설품셈에서 같은 표를 확인하지 못함 | +| 10-9-1 5t 미만 운반장비의 표준적재량(산악지 사방공사) | 미판정 | 산림 원문 고유 조건의 표. 건설 운반표와 절 대 절 대응 근거 없음 | + +### 3.3 산림에 값이 없어 건설품셈으로 잇는 갈래 + +| 산림 공종·쓰임 | 건설품셈 근거 | 연결 상태 | +|---|---|---| +| 전 공종의 건설기계 손료·운전경비 | 공통 8-1 적용기준, 8-3 기계손료, 8-4 운전경비 산정 | **확정·사용 중** — 기계 기초값·손료·운전경비 층. 산림 원문도 굴삭기·크레인 등에서 건설품셈을 직접 지시(2-2-11, L1720~1723) | +| 모르타르 1:3 배합 | 건축 9-1-1 모르타르 배합(시멘트 510kg, 모래 1.10㎥, 보통인부 0.66인/㎥) | **확정·사용 중** — 산림 13-4 돌쌓기에는 배합 원단위가 없어 `masonry_wet`의 `AX-WK-c0842a0d`가 사용 | +| 재료 할증 중 산림 1-3-1에 없는 재료 | 공통 1-3-1 재료의 할증 | **확정·사용 중** — 산림표가 정본이고 누락 재료만 건설표가 보완함 | +| 12-9-2 산마루 측구의 레미콘 타설 | 공통 6-1-1 레디믹스트콘크리트 타설 | **확정·원문 직접 지시** — 산림 원문 L6325 | +| 12-11-1 VR관 소켓접합 | 토목 6-6, 6-6-1 철근콘크리트관 부설 | **확정·원문 직접 지시** — 산림 원문 L6374 | +| 9-6~9-10 구조물 철거·깨기 | 공통 8-2-13 브레이커, 유지관리 3-1-1~5 철거 | **확정·원문 직접 지시** — 산림 원문 L4795, L4814~4938 | +| 9-11-1 포장 절단 | 토목 1-6-6 포장 절단 | **확정·원문 직접 지시** — 산림 원문 L4957 | +| 13-10-2 강재·콘크리트 말뚝박기 | 공통 8-2-22 디젤파일해머 | **확정·원문 직접 지시** — 산림 원문 L7511. 목재말뚝 품 자체와 혼용하지 않음 | + +그 밖에 산림 원문이 직접 지시한 보완은 지게·경운기 운반(1-2-7, L844), 기계식 비탈면 마무리(9-19-2·3, L5448~5465), 노상 다짐·정지·층따기(9-16-2~9-18, L5340~5403), 쇄석·혼합석 부설의 모터그레이더(11-4, L6080)이다. 각각 지시된 기계 또는 세부 품만 잇고 공종 전체를 치환하지 않는다. + +### 3.4 둘 다 있으나 그대로 잇지 못하는 갈래 + +| 주제 | 산림품셈 | 건설품셈 | 판정 | +|---|---|---|---| +| 뿌리제거 | 9-21: 굴삭기 0.2㎥ 기준 소밀도별 0.80/1.01/1.22hr | 공통 3-9-2: 1,000㎡당 굴삭기+그래플 0.2㎥ 3.76hr | **값·구성 다름** — 현행 계산은 건설표에서 `1,000㎡당` 밑수만 빌리고 품은 산림표를 씀. 0.80과 3.76은 4.7배 차이이므로 절 자동 대응은 미판정 | +| 돌쌓기 | 13-4-4: 석재 종류·찰/메·뒷길이별 ㎡당 품 | 공통 7-1: 작업조 1일 시공량(뒷길이 35/55/75cm, 메 23/26/28㎡·찰 27/30/34㎡) | **표 축·포함범위 다름** — 직접 값 치환 불가. `stone_kind`의 구판 건설품셈 규격별 소요량 fallback은 2026 개정판에서 삭제 검토된 표이므로 현행 연결은 미판정 | +| 운반 | 10-4·10-9: 산림 현장용 운반식·적재량 | 공통 8-1-6(2): 운반거리·속도·왕복시간 | **부분 결합** — 산림의 공종·적재 조건과 건설의 시간 산정층을 함께 쓰며 어느 한쪽으로 대체하지 않음 | +| 토량환산 | 산림 1-3-2 및 임도 토공 표 | 공통 1-3-2·토공 관련 표 | **미판정** — 산림표 안에도 같은 이름처럼 보이는 토질 행이 다른 계수로 중복되어 이름 대응 금지 | +| 재료 할증 | 산림 1-3-1 | 공통 1-3-1 | **부분 결합** — 같은 재료는 산림값 우선, 산림에 없는 재료만 건설값 사용 | + +> **미판정 범위:** 위에 적지 않은 산림 절과 건설 절의 의미 대응, 이름 겹침 5종(단위표준·인력·지수판설치·토질·표면마무리)의 절 대응은 원문 직접 지시나 현행 사용 근거가 없어 연결하지 않았다. + +## 4. 적용 시 주의 - **md 변환 한계**: 장 분할은 표제 탐지 기준 — 장 경계 ±1페이지 겹침 가능, 본문 프로즈 어절 공백 붙음. **수치 인용·검증 시 원본 PDF 대조** (각 장 md 머리 주석 동일). - 원문 표에 가로선이 없는 표는 행 병합 오류 가능성 — 발견 시 원문 PDF 기준으로 복원 (2026-08-14 4-1-1 배관해체 사례). - 단위·수량 기준(C.G.S, 소수 처리)·재료 할증은 [수량산출_일반](수량산출_일반.md), 품 할증 계수는 [품셈_적용기준 §2](품셈_적용기준.md). - 개정 대조: 매년 [개정사항 판](../../../original/원가계산/건설공사_표준품셈/2026년_건설공사_표준품셈_개정사항.md)으로 임도 관련 공종 변경 여부 확인 후 데이터셋 갱신. -## 4. 설계내역서 연결 +## 5. 설계내역서 연결 ``` 공종·수량 (04_수량분석정보 각 문서) @@ -67,6 +110,6 @@ last_updated: 2026-08-15 | 항목 | 출처 | 위치 | |---|---|---| -| 산림품셈 우선·건설품셈 보완 | 산림품셈 1-2, 별표2 | [품셈_적용기준 §1](품셈_적용기준.md) | +| 산림품셈 우선·건설품셈 보완 | 산림품셈 1-1 제7호, 별표2 | [품셈_적용기준 §1](품셈_적용기준.md) | | 부문·장 구성 (5부문 45장) | 2026 건설품셈 목차 | [_meta](../../../original/원가계산/건설공사_표준품셈/_meta.md) | | 2026 개정 임도 직결 공종 (돌쌓기 계열) | 개정사항 판 + ESTX 공지 대조 | [_meta](../../../original/원가계산/건설공사_표준품셈/_meta.md) 참고란 | From 7cb15af1e7b5d86e71fcdaf821dab854480233be Mon Sep 17 00:00:00 2001 From: umsangdon Date: Thu, 17 Sep 2026 10:54:44 +0900 Subject: [PATCH 2/2] =?UTF-8?q?feat(z01):=20=EC=83=81=EC=9E=90=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20=EC=84=9C=EB=B2=84=20group=5Flabel=20?= =?UTF-8?q?=EB=A1=9C=20=E2=80=94=20=EC=95=88=20=EC=98=A4=EB=A9=B4=20group?= =?UTF-8?q?=20=ED=82=A4=20=EA=B7=B8=EB=8C=80=EB=A1=9C(=ED=99=94=EB=A9=B4?= =?UTF-8?q?=EC=97=90=20=ED=95=9C=EA=B8=80=20=EC=9D=B4=EB=A6=84=20=EC=95=88?= =?UTF-8?q?=20=EB=B0=95=EC=9D=8C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 지금 서버가 갈래 키(base_price·pumsem_basis)만 줘 상자 제목이 영문으로 뜨던 자리 - 공종 축(work_item) 상자는 코드 추가 없이 섬 — 가짜 응답으로 확인(산림 358 · 건설 가짜 2,199 · 찾기·끝 쪽) - 시험: 갈래 이름이 오면 그 이름 · 안 오면 키가 드러남 Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_016VBGFXB9AbJBwXP19z75Qq --- Z01_MasterData/Z01_MasterData_UI_Cells.ts | 10 +++++++--- Z01_MasterData/Z01_MasterData_UI_Side.ts | 6 +++--- resources/tester/test_z01_master_cells.py | 19 +++++++++++-------- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/Z01_MasterData/Z01_MasterData_UI_Cells.ts b/Z01_MasterData/Z01_MasterData_UI_Cells.ts index c207aa2d..e0995b09 100644 --- a/Z01_MasterData/Z01_MasterData_UI_Cells.ts +++ b/Z01_MasterData/Z01_MasterData_UI_Cells.ts @@ -88,18 +88,22 @@ export function outdatedBanner(sources?: TableSource[]): string[] { /** 서버가 주는 표 한 벌 — 갈래·kind·한글 이름·줄 수. 화면은 제 목록을 안 가짐(늘면 저절로 섬). */ export interface ServedKind { group: string; + /** 갈래 한글 이름(이름표 `base_price_groups`) — 안 오면 group 키가 그대로 떠 빠진 것이 드러남 */ + group_label?: string; kind: string; label: string; rows: number; } +type KindBox = { group: string; label: string; items: ServedKind[] }; + /** 받은 차례 그대로 갈래별로 묶음 — 갈래 차례도 서버가 낸 순서를 따름. */ -export function groupKinds(kinds: ServedKind[]): { group: string; items: ServedKind[] }[] { - const boxes: { group: string; items: ServedKind[] }[] = []; +export function groupKinds(kinds: ServedKind[]): KindBox[] { + const boxes: KindBox[] = []; for (const kind of kinds) { const box = boxes.find((each) => each.group === kind.group); if (box) box.items.push(kind); - else boxes.push({ group: kind.group, items: [kind] }); + else boxes.push({ group: kind.group, label: kind.group_label ?? kind.group, items: [kind] }); } return boxes; } diff --git a/Z01_MasterData/Z01_MasterData_UI_Side.ts b/Z01_MasterData/Z01_MasterData_UI_Side.ts index d245d1ee..0e958c6d 100644 --- a/Z01_MasterData/Z01_MasterData_UI_Side.ts +++ b/Z01_MasterData/Z01_MasterData_UI_Side.ts @@ -56,7 +56,7 @@ export function buildSidePanel( button.addEventListener("click", () => { activate(button); view.show({ - title: `${box.group} › ${served.label}`, + title: `${box.label} › ${served.label}`, key: `base-prices/${served.kind}`, load: (query) => fetchBasePrices(served.kind, query), save: (rowId, values) => saveBasePrice(served.kind, rowId, values), @@ -64,7 +64,7 @@ export function buildSidePanel( }); grid.append(button); } - return { group: box.group, grid }; + return { label: box.label, grid }; }); const overridesButton = el("button", { className: "z01-master__base z01-master__base--wide", @@ -131,7 +131,7 @@ export function buildSidePanel( } panel.append( - ...boxes.map((box) => section(box.group, box.grid)), + ...boxes.map((box) => section(box.label, box.grid)), section(L("Z01_MasterData_Tree"), tree), ); attachCollapsible(panel); diff --git a/resources/tester/test_z01_master_cells.py b/resources/tester/test_z01_master_cells.py index 28d71e34..be23448e 100644 --- a/resources/tester/test_z01_master_cells.py +++ b/resources/tester/test_z01_master_cells.py @@ -30,14 +30,16 @@ import { // kind 목록은 서버가 줌 — 화면이 제 목록을 들면 kind 가 늘 때마다 빠짐(2026-09-16 브레인) const served = [ - { group: "base_price", kind: "labor", label: "노임", rows: 261 }, - { group: "base_price", kind: "oil", label: "유가", rows: 36 }, - { group: "pumsem_basis", kind: "coef", label: "토량환산계수", rows: 32 }, + { group: "base_price", group_label: "기초단가", kind: "labor", label: "노임", rows: 261 }, + { group: "base_price", group_label: "기초단가", kind: "oil", label: "유가", rows: 36 }, + { group: "pumsem_basis", group_label: "품셈 기준", kind: "coef", label: "토량환산계수", rows: 32 }, // 서버가 새 kind·새 갈래를 더해도 화면이 그대로 세움 - { group: "pumsem_basis", kind: "machine_productivity", label: "기계 작업량", rows: 47 }, + { group: "pumsem_basis", group_label: "품셈 기준", kind: "machine_productivity", label: "기계 작업량", rows: 47 }, + { group: "work_axis", group_label: "공종 축", kind: "forest", label: "산림품셈 기준", rows: 358 }, + // 갈래 이름이 안 오면 키가 그대로 떠 빠진 것이 드러남(때우지 않음) { group: "later_group", kind: "brand_new", label: "새 갈래 것", rows: 3 }, ]; -const grouped = groupKinds(served).map((g) => [g.group, g.items.map((i) => i.kind)]); +const grouped = groupKinds(served).map((g) => [g.label, g.items.map((i) => i.kind)]); // 열 제목 누르기 — 없음 → 오름 → 내림 → 없음(원본 차례) · 다른 열을 누르면 그 열 오름부터 const sorts = [ @@ -323,9 +325,10 @@ def test_칸_글자와_숨김_열(tmp_path: Path) -> None: None, {"key": "item_code", "desc": False}, ] - # 서버 차례 그대로 갈래별로 묶임 · 새 kind·새 갈래도 저절로 섬(화면 목록이 없음) + # 서버 차례 그대로 갈래별로 묶임 · 상자 이름은 서버 group_label · 새 kind·새 갈래도 저절로 섬 assert got["grouped"] == [ - ["base_price", ["labor", "oil"]], - ["pumsem_basis", ["coef", "machine_productivity"]], + ["기초단가", ["labor", "oil"]], + ["품셈 기준", ["coef", "machine_productivity"]], + ["공종 축", ["forest"]], ["later_group", ["brand_new"]], ]