diff --git a/Z01_MasterData/Z01_MasterData_Api_Fetch.ts b/Z01_MasterData/Z01_MasterData_Api_Fetch.ts index 1fffe9fd..b4da3fc7 100644 --- a/Z01_MasterData/Z01_MasterData_Api_Fetch.ts +++ b/Z01_MasterData/Z01_MasterData_Api_Fetch.ts @@ -2,12 +2,17 @@ * Z01_MasterData_Api_Fetch.ts * 마스터 데이터 읽기 — 서버 `Z01_MasterData_Router.py`(랩탑 메인) · 시스템 관리자만 * - * 응답 모양은 PLAN 1-0 계약(2026-09-18 브레인) — 정본은 DB · 고치기는 [저장] 한 번에 보냄 - * (칸 나갈 때 즉시 저장하던 옛 길 `PUT …/{row_id}`·`/overrides*` 는 서버에서 지워짐). + * 응답 모양은 2026-09-15 브레인이 못박은 약속 그대로. 읽기 전용 — 고치기는 다음 차례. * ========================================================================== */ import { API_BASE_URL } from "@config/config_frontend"; -import type { MasterColumn, ServedKind, SortOrder, TableMeta } from "./Z01_MasterData_UI_Cells"; +import type { + MasterColumn, + OverrideState, + ServedKind, + SortOrder, + TableMeta, +} from "./Z01_MasterData_UI_Cells"; export interface MasterTable { id: string; @@ -33,16 +38,11 @@ export interface MasterGroup { files: MasterFile[]; } -/** - * 기초단가 표만 editable·locked·formula·revision 을 실음 — 트리 표는 읽기 전용이라 안 옴. - * 기초단가 줄은 `@id`(= DB row_key) · `changed_columns`(초기값과 다른 칸) · `is_added`(관리자가 넣은 줄)를 실음. - */ +/** 기초단가 표만 editable·locked·formula 를 실음 — 트리 표는 읽기 전용이라 안 옴. */ export interface MasterRows extends TableMeta { columns: MasterColumn[]; rows: Record[]; total: number; - /** 판 번호 — [저장] 때 그대로 돌려보내 낡은 판이면 409 */ - revision?: number; } export interface RowsQuery { @@ -65,34 +65,17 @@ export function fetchBaseKinds(): Promise { return request<{ kinds: ServedKind[] }>("/master-data/base-prices").then((data) => data.kinds); } -/** 실패 응답 — `status` 409 = 낡은 판(다른 곳에서 먼저 저장함). */ -export class ApiError extends Error { - constructor( - message: string, - readonly status: number, - ) { - super(message); - } -} - async function request(path: string, init: RequestInit = {}): Promise { const response = await fetch(`${API_BASE_URL}${path}`, { credentials: "include", headers: { "Content-Type": "application/json" }, ...init, }); - const data = (await response.json().catch(() => ({}))) as { detail?: unknown } & T; - if (!response.ok) { - // 검사 실패(422)는 detail 이 목록으로 옴 — 글자로 펴서 보임(「[object Object]」 금지). - const detail = typeof data.detail === "string" ? data.detail : JSON.stringify(data.detail); - throw new ApiError(detail ?? "Request failed", response.status); - } + const data = (await response.json()) as { detail?: string } & T; + if (!response.ok) throw new Error(data.detail ?? "Request failed"); return data; } -const send = (method: string, path: string, body: unknown): Promise => - request(path, { method, body: JSON.stringify(body) }); - const pageParams = (query: RowsQuery): Record => ({ page: String(query.page), size: String(query.size), @@ -110,142 +93,37 @@ export function fetchBasePrices(kind: BasePriceKind, query: RowsQuery): Promise< return request(`/master-data/base-prices/${kind}?${params}`); } -/** 기초단가 [저장] 한 번 — 전부 아니면 전무 · edits 500 상한 · 낡은 판이면 409. */ -export interface BaseSave { - base_revision: number; - edits: { row_key: string; column: string; value: unknown }[]; - added: { data: Record }[]; - deleted: string[]; +export interface OverrideItem { + kind: BasePriceKind; + row_id: string; + row_label: string; + column: string; + column_label: string; + original: unknown; + current?: unknown; + value: unknown; + unit?: string; + state: OverrideState; } -export function saveBasePrices(kind: BasePriceKind, body: BaseSave): Promise { - return send("PUT", `/master-data/base-prices/${kind}`, body); +/** 고친 것 모아 보기 — 서버가 source_changed → orphan → edited 차례로 정렬하고 쪽도 나눠 줌. */ +export function fetchOverrides( + query: Pick, +): Promise<{ items: OverrideItem[]; total: number }> { + const params = new URLSearchParams({ page: String(query.page), size: String(query.size) }); + return request(`/master-data/overrides?${params}`); } -/** 고른 줄을 초기값(seed)으로 — 관리자가 넣은 줄은 지워짐. 바로 저장됨. */ -export function resetBasePrices(kind: BasePriceKind, rowKeys: string[]): Promise { - return send("POST", `/master-data/base-prices/${kind}/reset`, { row_keys: rowKeys }); -} - -/* ── 공종 마스터(PLAN 1-0) ── */ - -export type WorkItemAxis = "forest" | "const"; -/** 주입 때 한 번 판정 · `reviewed` 는 관리자만 찍음 */ -export type WorkItemStatus = "auto_ok" | "partial" | "needs_input" | "not_item" | "reviewed"; -export type ResourceKind = "labor" | "machine" | "material" | "etc"; - -export interface WorkItemListRow { - work_item_key: string; - number: string; - path_name: string; - status: WorkItemStatus; - row_count: number; -} - -export interface WorkItemList { - items: WorkItemListRow[]; - total: number; - /** 상태별 개수(검색·상태 거르기 전 그 축 전체) */ - counts: Partial>; -} - -export interface WorkItemListQuery { - axis: WorkItemAxis; - status: WorkItemStatus | ""; - q: string; - page: number; - size: number; -} - -export function fetchWorkItems(query: WorkItemListQuery): Promise { - const params = new URLSearchParams({ - axis: query.axis, - q: query.q, - page: String(query.page), - size: String(query.size), +/** 칸 고치기 — 값 null = 덮개에서 그 칸을 빼 원래 값으로 되돌림. 응답은 고친 뒤 그 줄. */ +export function saveBasePrice( + kind: BasePriceKind, + rowId: string, + values: Record, +): Promise> { + return request(`/master-data/base-prices/${kind}/${encodeURIComponent(rowId)}`, { + method: "PUT", + body: JSON.stringify({ values }), }); - if (query.status) params.set("status", query.status); - return request(`/master-data/work-items?${params}`); -} - -/** 머리 중 관리자가 고치는 칸 — PUT 에 이것만 보냄 */ -export interface WorkItemHead { - name: string; - basis_quantity: number | null; - basis_unit: string | null; - status: WorkItemStatus; -} - -export interface WorkItemItem extends WorkItemHead { - work_item_key: string; - axis: WorkItemAxis; - code: string | null; - number: string; - path_name: string; - parent_key: string | null; - parent_mode: string | null; - edition: string | null; - revision: number; - /** 머리 중 초기값과 다른 칸(저장된 고침) */ - changed_columns?: string[]; -} - -/** 구성 줄 — id 없으면 새 줄 · resource_key 없으면 기초단가와 못 맞춘 줄(raw_cell 에 원문과 까닭) */ -export interface WorkItemRow { - id?: number; - variant: string; - resource_kind: ResourceKind; - resource_key: string | null; - resource_name: string; - resource_spec: string; - amount: number | null; - amount_unit: string; - alternative_amount: number | null; - group_ratio_pct: number | null; - raw_cell: string | null; - pum_table_id: string | null; - /** GET 만 — 관리자가 넣은 줄 · 초기값과 다른 칸 */ - is_added?: boolean; - changed_columns?: string[]; -} - -/** 품셈 원문 표 한 벌 — condition_note = 머리 글자 · raw_row = 원문 칸(읽기 전용) */ -export interface WorkItemSource { - pum_table_id: string; - section?: string | null; - pum_form?: string | null; - condition_note?: unknown; - raw_row?: unknown; -} - -export interface WorkItemDetail { - item: WorkItemItem; - rows: WorkItemRow[]; - source: WorkItemSource[]; - notes: unknown[]; -} - -/** 공종 [저장] — rows 는 전체 줄(id 있으면 수정 · 없으면 추가 · 빠지면 삭제) · 낡은 판이면 409 */ -export interface WorkItemSave { - base_revision: number; - item: WorkItemHead; - rows: WorkItemRow[]; -} - -const workItemPath = (key: string) => `/master-data/work-items/${encodeURIComponent(key)}`; - -export function fetchWorkItem(key: string): Promise { - return request(workItemPath(key)); -} - -/** 응답은 새 GET 모양 그대로(다시 안 불러도 됨) · 모양 오류 422 · 낡은 판 409. */ -export function saveWorkItem(key: string, body: WorkItemSave): Promise { - return send("PUT", workItemPath(key), body); -} - -/** 머리·줄을 초기값(seed)으로 — 관리자가 넣은 줄은 지워짐. 바로 저장됨 · 응답은 새 GET 모양. */ -export function resetWorkItem(key: string): Promise { - return send("POST", `${workItemPath(key)}/reset`, {}); } export async function fetchMasterTree(): Promise { diff --git a/Z01_MasterData/Z01_MasterData_BasePrices.py b/Z01_MasterData/Z01_MasterData_BasePrices.py index 0ccb5576..9a3d7342 100644 --- a/Z01_MasterData/Z01_MasterData_BasePrices.py +++ b/Z01_MasterData/Z01_MasterData_BasePrices.py @@ -1,20 +1,16 @@ """Z01 기초단가 다섯 — 노임·기계·자재·유가·요율을 kind 마다 **한 표**로(2026-09-15 사용자 지시 · 브레인 계약). 표 수준(한 번): columns · total · editable · locked{열: 왜 못 고치나} · formula{열: 식} · notice(요율만) -줄 수준: `@id`(자료 제 열쇠) · `changed_columns`(초기값과 다른 칸) · `is_added`(관리자 추가 줄) · `@formula`(계산값 줄) +줄 수준(해당할 때만): `@id`(자료 제 열쇠) · `@overrides`(고친 줄) · `@formula`(계산값 줄) `@id` — 줄 차례가 아니라 자료 열쇠(브레인 승인): 노임 `{dataset_id}/{occupation_code}` · 기계 machine_code · 자재 item_code · 유가 `{scope}/{변수}[/{sido_code}]`(원본 값 그대로 · 열 이름은 이름표 것) · 요율 `{변수}[/{목록}/{구간칸=값;…}]`(구간 칸 이름 차례 · 값·식 칸 뺌) -정본 = DB `master_base_price`(2026-09-18 PLAN 1-0 · `Z01_MasterData_Repository_BasePrices`) — 파일 원본(`base_rows`)은 - 초기값 1회 주입(`Z01_MasterData_Seed`)의 재료 · 공종 축 둘만 아직 파일 읽기. +원본 파일 자리는 이름표 파일이 가리키는 곳(`Z01_MasterData_Tables`) — 원본은 읽기만, 고친 값은 덮개(`Z01_MasterData_Overrides`). """ from __future__ import annotations -import asyncio import json -import math import re -import uuid from datetime import date from decimal import Decimal from functools import lru_cache @@ -23,7 +19,7 @@ from typing import Any from Z01_MasterData import Z01_MasterData_BasePrices_Machine as machine from Z01_MasterData import Z01_MasterData_BasePrices_Tables as base_tables -from Z01_MasterData import Z01_MasterData_Repository_BasePrices as repo +from Z01_MasterData import Z01_MasterData_Overrides as overrides from Z01_MasterData import Z01_MasterData_Tables as tables from Z01_MasterData import Z01_MasterData_WorkItems as work_items @@ -32,7 +28,7 @@ KINDS = ("labor", "machine", "material", "oil", "rate", *base_tables.SPEC, *work SOURCES_DIR = ( tables.RESOURCES / "data_master_sources" ) # 출처표(데스크탑 서브) — 어디서 받고 최신이 무엇인지 -_KEY = "자료 열쇠 — 바꾸면 다른 표가 이 줄을 못 찾음" +_KEY = "자료 열쇠 — 바꾸면 덮개·다른 표가 이 줄을 못 찾음" _SOURCE = "공표 원문 칸 — 원본 갱신으로만 바뀜" _RATE_EDITABLE = ( "rate_percent", @@ -43,14 +39,14 @@ _RATE_EDITABLE = ( "manager_thresholds.default_estimated_amount_krw", "manager_thresholds.civil_main_work_estimated_amount_krw", ) -#: ⚠ **지금 상태를 먼저** — 고친 값을 읽는 곳이 Z01 밖에 0(2026-09-17 서브 훑기 · 브레인 「없으면 없다고」). +#: ⚠ **지금 상태를 먼저** — 덮개를 읽는 곳이 Z01 밖에 0(2026-09-17 서브 훑기 · 브레인 「없으면 없다고」). #: 뒤 문장은 프로젝트 복사(요구 14)가 붙으면 참이 되는 약속이라 지우지 않고 「그 길이 붙으면」으로 둠. _SCOPE_NOTICE = ( "⚠ **아직 어디에도 안 쓰임** — 고친 값은 마스터에만 쌓임 · 프로젝트로 옮기는 길(프로젝트 복사)이 아직 없음." " 그 길이 붙으면: 여기서 고친 값은 **새로 만드는 프로젝트부터** 쓰임 — 이미 만든 프로젝트 금액은 안 바뀜" "(프로젝트는 만들 때 뜬 사본을 봄)" ) -_RATE_NOTICE = "법이 정한 값 — 고시가 바뀔 때만 고칠 것(구간 칸은 규칙이라 못 고침)" +_RATE_NOTICE = "법이 정한 값 — 고치면 원본 갱신 때 구간 이름이 바뀌어 고친 값이 주인을 잃기 쉬움(주인 없음으로 남음)" def _source(file_id: str) -> Path: @@ -281,7 +277,7 @@ def merge_same_rows(rows: list[dict[str, Any]]) -> list[dict[str, Any]]: def base_rows(kind: str) -> list[dict[str, Any]]: - """파일 원본 줄 — 초기값 주입의 재료 · 기계는 입력 칸까지(계산 칸은 읽을 때 셈).""" + """덮개 얹기 전 원본 줄 — 기계는 입력 칸까지(계산 칸은 덮개를 얹은 뒤 셈).""" if kind == "machine": doc, name = _doc("mach_base") return machine.base_rows(name, edition_of(doc)) @@ -294,67 +290,33 @@ def base_rows(kind: str) -> list[dict[str, Any]]: return _BUILDERS[kind]() -def _machine_inputs(labor: list[dict[str, Any]], oil: list[dict[str, Any]]) -> machine.Inputs: - """기계가 끌어 쓰는 밑값 — DB 의 노임(건설)·전국평균 유가 + 그 판들의 기준일(빈 값 줄은 뺌).""" - labor = [r for r in labor if r.get("source") == "labor_const" and r.get("occupation_code")] +def _machine_inputs() -> machine.Inputs: + """기계가 끌어 쓰는 밑값 — **덮개를 얹은** 노임(건설)·전국평균 유가 + 그 판들의 기준일.""" + labor = [r for r in overrides.overlay("labor", _labor()) if r["source"] == "labor_const"] oil = [ - r - for r in oil - if r["@id"] == f"national_average/{r.get('fuel')}" and r.get("price_krw_per_l") is not None + r for r in overrides.overlay("oil", _oil()) if r["@id"] == f"national_average/{r['fuel']}" ] return machine.Inputs( wages={ str(r["occupation_code"]): None - if r.get("daily_wage_krw") is None + if r["daily_wage_krw"] is None else Decimal(str(r["daily_wage_krw"])) for r in labor }, - wage_date=labor[0].get("effective_date") if labor else None, + wage_date=labor[0]["effective_date"] if labor else None, oil={r["fuel"]: Decimal(str(r["price_krw_per_l"])) for r in oil}, - oil_dates={r["fuel"]: r.get("date") or r.get("effective_date") for r in oil}, + oil_dates={r["fuel"]: r.get("date") or r["effective_date"] for r in oil}, operating_date=edition_of(_doc("pum_const")[0]), ) -def same(a: Any, b: Any) -> bool: - """값 비교 — 215907 과 215907.0 은 같음 · None 은 None 과만 같음.""" - if a is None or b is None: - return a is None and b is None - if isinstance(a, (int, float)) and isinstance(b, (int, float)): - return Decimal(str(a)) == Decimal(str(b)) - return a == b - - -def _row(record: dict[str, Any]) -> dict[str, Any]: - """DB 한 줄 → 표 줄. `@data` = 저장된 값 그대로(쓸 때 여기에 고친 칸만 얹음 · 기계 계산 칸이 섞이지 않게).""" - data, seed = record["data"], record["seed"] - changed = [] - if seed is not None: - changed = [ - c - for c in dict.fromkeys([*seed, *data]) - if not c.startswith("@") and not same(data.get(c), seed.get(c)) - ] - row = {"@id": record["row_key"], **data} - row.update( - {"@id": record["row_key"], "@data": data, "@added": seed is None, "@changed": changed} - ) - return row - - -async def _stored(kind: str) -> list[dict[str, Any]]: - return [_row(r) for r in await repo.load(kind)] - - -async def rows(kind: str) -> list[dict[str, Any]]: - """DB 정본 줄(공종 축 둘만 파일) — 기계는 DB 노임·유가로 시간당 단가를 읽을 때마다 셈(식은 코드 · 브레인).""" - if kind in work_items.KINDS: - return work_items.base_rows(kind) - if kind != "machine": - return await _stored(kind) - out, labor, oil = await asyncio.gather(_stored("machine"), _stored("labor"), _stored("oil")) - inputs = _machine_inputs(labor, oil) - return [machine.compute(r, inputs) for r in out] +def rows(kind: str) -> list[dict[str, Any]]: + """덮개를 얹은 줄 — 기계는 그 위에서 시간당 단가를 다시 셈.""" + out = overrides.overlay(kind, base_rows(kind)) + if kind == "machine": + inputs = _machine_inputs() + out = [machine.compute(r, inputs) for r in out] + return out def _columns(kind: str, all_rows: list[dict[str, Any]]) -> list[str]: @@ -484,26 +446,45 @@ def group_label(group: str) -> str: return named.get("name_ko") or group -async def kinds() -> list[dict[str, Any]]: +def kinds() -> list[dict[str, Any]]: """화면이 상자를 세울 목록 — **서버가 냄**(화면이 제 코드에 들면 새 kind 가 조용히 안 뜸). - 갈래 · 갈래 한글 이름 · kind · 한글 이름(이름표) · 줄 수(DB · 공종 축은 파일). + 갈래 · 갈래 한글 이름 · kind · 한글 이름(이름표) · 줄 수. """ - counted = await repo.counts() return [ { "group": kind_group(kind), "group_label": group_label(kind_group(kind)), "kind": kind, "label": kind_label(kind), - "rows": len(work_items.base_rows(kind)) - if kind in work_items.KINDS - else counted.get(kind, 0), + "rows": len(rows(kind)), } for kind in KINDS ] +def row_label(kind: str, row: dict[str, Any] | None) -> str: + if row is None: + return "" + if kind == "labor": + return str(row.get("occupation_name") or "") + if kind in work_items.KINDS: + return str(row.get("name") or "") + if kind == "machine": + return f"{row.get('machine_name') or ''} {row.get('specification') or ''}".strip() + if kind == "material": + return str(row.get("specification") or row.get("classification_name") or "") + if kind == "oil": + return f"{row.get('source_product_name') or row.get('fuel')} {row.get('region_name') or '전국평균'}" + if kind in base_tables.SPEC: # 기초데이터 아홉 — 축 칸을 이어 사람이 읽을 한 줄로 + return " · ".join(str(row[c]) for c in row.get("@axis", ()) if row.get(c) is not None) + named = (tables.load_labels().get("value_overrides") or {}).get( + f"rates::variables/{row['variable']}" + ) or {} + bracket = row["@id"].split("/", 2)[2].replace(";", " · ") if row["part"] else "" + return f"{named.get('name_ko') or row['variable']} {bracket}".strip() + + def column_meta(kind: str, key: str) -> dict[str, Any]: """열 이름 — 이름표 `merged_tables[kind]` → `columns[열key]` → 영문 key(이름은 이름표에만 · 브레인 ②).""" labels = tables.load_labels() @@ -520,12 +501,27 @@ def column_meta(kind: str, key: str) -> dict[str, Any]: } -_INNER = ("@source", "@axis", "@data", "@added", "@changed") +#: 뜻 칸에서 뺄 자리 — 판·공표 날짜는 갱신 때마다 바뀌어 「뜻 바뀜」과 구별이 안 됨 +_NOT_MEANING = ("effective_date", "date", "notice_datetime") + + +def meaning_of(kind: str, row: dict[str, Any], editable: list[str]) -> dict[str, Any]: + """그 줄의 **값이 아닌 글자 칸**(이름·규격·단위·인도조건 …) — 이름표가 숨김 아니라 한 열만. + + 갱신으로 같은 코드에 다른 기준이 붙으면(노임 국가유산직종 개편 · 자재 KS 개정) 값만으로는 못 잡음. + """ + out = {} + for key, value in row.items(): + if key.startswith("@") or key in editable or key in _NOT_MEANING or key.endswith("_date"): + continue + if isinstance(value, str) and value.strip() and not column_meta(kind, key)["hidden"]: + out[key] = value + return out def public(row: dict[str, Any]) -> dict[str, Any]: - """내보낼 줄 — 안쪽 칸(`@source`·`@axis`·`@data`…)은 뺌.""" - return {k: v for k, v in row.items() if k not in _INNER} + """내보낼 줄 — 안쪽 칸(`@source`·`@axis`)은 뺌.""" + return {k: v for k, v in row.items() if k not in ("@source", "@axis")} #: 찾기만 같게 보는 글자 — 원문이 물결표·가운뎃점을 여러 벌로 씀(∼ 26 · ~ 8 · ․ · ㆍ) · 자간 공백(「굴 삭 기」). @@ -542,7 +538,6 @@ def fold(text: str) -> str: def table( kind: str, - all_rows: list[dict[str, Any]], page: int = 1, size: int = tables.DEFAULT_PAGE_SIZE, q: str = "", @@ -550,7 +545,7 @@ def table( desc: bool = False, filters: dict[str, str] | None = None, ) -> dict[str, Any]: - """한 표 한 쪽 — `all_rows` 는 `rows(kind)` 가 준 전체(DB 읽기와 셈을 떼어 둠).""" + all_rows = rows(kind) columns = _columns(kind, all_rows) needle = fold(q) hits = ( @@ -574,14 +569,7 @@ def table( "columns": [column_meta(kind, c) for c in columns], # 못 고치는 칸(계산값)도 **세우기는 됨** — 화면은 이 목록으로 눌릴 제목을 가림 "sortable": list(columns), - "rows": [ - { - **public(r), - "changed_columns": r.get("@changed", []), - "is_added": r.get("@added", False), - } - for r in hits[start : start + size] - ], + "rows": [public(r) for r in hits[start : start + size]], "total": len(hits), **spec(kind, columns), "notice": notice(kind), @@ -590,84 +578,49 @@ def table( } -class SaveError(ValueError): - """[저장] 을 막는 까닭 — 하나라도 있으면 아무것도 안 씀(전부 아니면 전무).""" - - def __init__(self, status: int, message: str) -> None: - super().__init__(message) - self.status = status - - -def check_value(value: Any) -> str | None: - """값 칸에 넣을 수 있나 — 막는 까닭(없으면 None). null 은 빈 값(미공표 노임처럼).""" - if value is None: - return None - if isinstance(value, bool) or not isinstance(value, (int, float)): - return "숫자만 넣을 수 있음" - if not math.isfinite(value) or value < 0: - return "0 이상 유한한 수만 넣을 수 있음" - return None - - -def _axis_of(kind: str) -> dict[str, tuple[str, ...]]: - """줄마다 축 칸 — 파일 원본에서(표 모양이라 값 고치기로 안 바뀜 · 주입 data 에 `@axis` 가 없어도 섬).""" - if kind not in base_tables.SPEC: - return {} - return {r["@id"]: tuple(r.get("@axis") or ()) for r in base_rows(kind)} - - -def _cell_problem( - row: dict[str, Any], column: str, value: Any, info: dict[str, Any], axis: dict, fillable: set -) -> str | None: - """한 칸 고치기를 막는 까닭 — 추가 줄은 저장 칸이면 글자 칸도(이름·규격을 사람이 넣은 줄).""" - if row["@added"]: - if column not in fillable: - return f"못 고치는 칸 {column} — {info['locked'].get(column) or '이 표에 없는 칸'}" - elif column in axis.get(row["@id"], ()): - return f"못 고치는 칸 {column} — {_KEY}" - elif column not in info["editable"] or column not in row: - return f"못 고치는 칸 {column} — {info['locked'].get(column) or '이 줄에 없는 칸'}" - if column in info["editable"]: - problem = check_value(value) - return f"{column}: {problem}" if problem else None - if isinstance(value, (dict, list)): - return f"{column}: 글자나 숫자만 넣을 수 있음" - return None - - -def plan_save( - kind: str, - shown: list[dict[str, Any]], - edits: list[dict[str, Any]], - added: list[dict[str, Any]], - deleted: list[str], -) -> tuple[dict[str, dict[str, Any]], dict[str, dict[str, Any]], list[str]]: - """[저장] 한 번 — 다 맞춰 본 뒤 쓸 것만: (고친 줄 data · 새 줄 data · 지울 줄). 막히면 SaveError. - - `shown` = `rows(kind)`(기계는 계산 칸까지 붙은 것) — 쓰는 값은 그 줄 `@data` 에 고친 칸만 얹음. - 새 줄 열쇠 = `added/{난수}`(브레인 계약에 열쇠 규칙이 없어 서버가 줌 · 응답으로 알림). - """ - by_key = {r["@id"]: r for r in shown} - info = spec(kind, _columns(kind, shown)) - axis = _axis_of(kind) - fillable = {c for r in shown for c in r["@data"] if not c.startswith("@")} # 계산 칸 제외 - changed: dict[str, dict[str, Any]] = {} - for edit in edits: - row = by_key.get(edit["row_key"]) - if row is None: - raise SaveError(404, f"없는 줄: {edit['row_key']}") - problem = _cell_problem(row, edit["column"], edit["value"], info, axis, fillable) +def edit(kind: str, row_id: str, values: dict[str, Any], by: Any) -> tuple[int, dict[str, Any]]: + """고치기 — (상태 코드, 고친 뒤 그 줄 또는 막은 까닭).""" + base = next((r for r in base_rows(kind) if r["@id"] == row_id), None) + if base is None: + return 404, {"message": f"없는 줄: {row_id}"} + info = spec(kind, _columns(kind, rows(kind))) + for column, value in values.items(): + if column in (base.get("@axis") or ()): + return 400, {"message": f"못 고치는 칸 {column} — {_KEY}"} + if column not in info["editable"] or column not in base: + reason = info["locked"].get(column) or "이 줄에 없는 칸" + return 400, {"message": f"못 고치는 칸 {column} — {reason}"} + problem = overrides.check_value(value) if problem: - raise SaveError(400, problem) - changed.setdefault(row["@id"], dict(row["@data"]))[edit["column"]] = edit["value"] - new: dict[str, dict[str, Any]] = {} - for data in added: - for column, value in data.items(): - problem = _cell_problem({"@added": True}, column, value, info, axis, fillable) - if problem: - raise SaveError(400, problem) - new[f"added/{uuid.uuid4().hex[:12]}"] = dict(data) - missing = [key for key in deleted if key not in by_key] - if missing: - raise SaveError(404, f"없는 줄: {', '.join(missing)}") - return changed, new, list(dict.fromkeys(deleted)) + return 400, {"message": f"{column}: {problem}"} + overrides.write(kind, base, values, by, meaning_of(kind, base, info["editable"])) + return 200, public(next(r for r in rows(kind) if r["@id"] == row_id)) + + +def override_items( + kind: str = "", state: str = "", page: int = 1, size: int = tables.DEFAULT_PAGE_SIZE +) -> dict[str, Any]: + """모아 보기 — 서버가 정렬(원본 바뀜 → 주인 없음 → 고쳐짐) · 거름(kind·state) · 쪽 · kind 별 state 수.""" + out = [] + counts: dict[str, dict[str, int]] = {} + for each in KINDS: # 수는 늘 다섯 다 셈 — 거름은 줄에만 + base = base_rows(each) + by_id = {r["@id"]: r for r in base} + for item in overrides.items(each, base): + counts.setdefault(each, {}).setdefault(item["state"], 0) + counts[each][item["state"]] += 1 + if (kind and each != kind) or (state and item["state"] != state): + continue + item["row_label"] = row_label(each, by_id.get(item["row_id"])) + meta = column_meta(each, item["column"]) + item["column_label"] = meta["label"] + item["unit"] = meta["unit"] + out.append(item) + out.sort(key=lambda i: overrides.STATE_ORDER.index(i["state"])) + size = max(1, min(size, tables.MAX_PAGE_SIZE)) + start = (max(page, 1) - 1) * size + return {"items": out[start : start + size], "total": len(out), "counts": counts} + + +def clear_overrides(kind: str, state: str) -> int: + return overrides.clear(kind, state, base_rows(kind)) diff --git a/Z01_MasterData/Z01_MasterData_BasePrices_Machine.py b/Z01_MasterData/Z01_MasterData_BasePrices_Machine.py index e0308862..350a84c8 100644 --- a/Z01_MasterData/Z01_MasterData_BasePrices_Machine.py +++ b/Z01_MasterData/Z01_MasterData_BasePrices_Machine.py @@ -1,7 +1,7 @@ """Z01 기초단가 — 기계 한 표: 기종 한 줄 + 시간당 단가(계산값) · 산출근거(2026-09-15 브레인 계약). 기계단가는 취득가 613 · 손료계수 387 · 운전경비(연료·잡재료·조종원 — 건설품셈 8-4) · 노임 · 유가가 계산으로 물림. - 고치는 칸 = 취득가 · 손료계수(이 표) — 노임·유가는 그 표에서 고치고 여기는 **DB 의 지금 값**을 끌어 씀 + 고치는 칸 = 취득가 · 손료계수(이 표) — 노임·유가는 그 표에서 고치고 여기는 **덮개 얹은 값**을 끌어 씀 계산 칸 = 손료 · 연료 · 조종원 · 시간당 단가 — editable 에서 빼고 locked 에 까닭 ⚠ 셈은 B09 함수를 그대로 부름(`load_machine_catalog` · `load_operating_records` · `hourly_machine_cost`) — 식을 두 벌로 안 둠. `hourly_cost_of`(B09) 와 같은 값인지 `test_z01_base_prices.py` 가 대조. 반만 선 값(연료·조종원 빠짐)은 시간당 단가를 안 냄. @@ -9,14 +9,13 @@ from __future__ import annotations -from dataclasses import dataclass +from dataclasses import dataclass, replace from decimal import Decimal from functools import lru_cache from typing import Any from B09_Estimation.B09_Estimation_MachineCost import ( OPERATOR_WAGE_FORMULA, - MachineSpec, hourly_machine_cost, load_machine_catalog, ) @@ -41,7 +40,7 @@ _FORMULA = { _LOCKED_COMPUTED = "계산값 — 밑값(취득가·손료계수는 이 표 · 노임·유가는 그 표)을 고치면 따라 바뀜" _LOCKED_OPERATING = "건설품셈 8-4 운전경비표(로직)에서 옴 — 기초단가가 아님" _LOCKED = { - "machine_code": "자료 열쇠 — 바꾸면 다른 표가 이 줄을 못 찾음", + "machine_code": "자료 열쇠 — 바꾸면 덮개·다른 표가 이 줄을 못 찾음", "machine_name": "공표 원문 칸 — 원본 갱신으로만 바뀜", "specification": "공표 원문 칸 — 원본 갱신으로만 바뀜", "economic_life_hours": "공표 원문 칸 — 원본 갱신으로만 바뀜", @@ -51,8 +50,8 @@ _LOCKED = { "misc_material_percent": _LOCKED_OPERATING, "operator_occupation_code": _LOCKED_OPERATING, "operator_person_per_day": _LOCKED_OPERATING, - "fuel_price_krw_per_l": "유가 표에서 고침 — 여기는 전국평균을 끌어 씀", - "operator_daily_wage_krw": "노임 표에서 고침 — 여기는 건설 노임을 끌어 씀", + "fuel_price_krw_per_l": "유가 표에서 고침 — 여기는 덮개 얹은 전국평균을 끌어 씀", + "operator_daily_wage_krw": "노임 표에서 고침 — 여기는 덮개 얹은 건설 노임을 끌어 씀", "hourly_note": "계산이 왜 안 섰는지 — 밑값이 비면 섬", "effective_date": "원본 판 기준일 — 원본 갱신으로만 바뀜", "operating_effective_date": "운전경비 원단위가 나온 건설품셈 판 기준일", @@ -76,7 +75,7 @@ def _fmt(value: Decimal | int | float) -> str: @dataclass(frozen=True) class Inputs: - """기계 셈이 다른 표에서 끌어 오는 값 — DB 지금 값 · 판 기준일과 함께.""" + """기계 셈이 다른 표에서 끌어 오는 값 — 덮개를 얹은 뒤 · 판 기준일과 함께.""" wages: dict[str, Decimal | None] wage_date: str | None @@ -124,13 +123,10 @@ def base_rows(source_name: str, effective_date: str | None) -> list[dict[str, An def compute(row: dict[str, Any], inputs: Inputs) -> dict[str, Any]: - """DB 줄 → 시간당 단가 칸을 붙인 새 줄. B09 `hourly_cost_of` 와 같은 길. - - 기종 제원은 줄 값에서(카탈로그 아님) — 관리자가 추가한 줄도 섬 · 운전경비 원단위는 코드로 찾아 없으면 빈칸. - """ - _, records = _inputs() + """덮개 얹은 줄 → 시간당 단가 칸을 붙인 새 줄. B09 `hourly_cost_of` 와 같은 길.""" + catalog, records = _inputs() code = row["@id"] - coef = row.get("loss_coefficient_per_hour") + coef = row["loss_coefficient_per_hour"] record = records.get(code) out = { **row, @@ -141,17 +137,13 @@ def compute(row: dict[str, Any], inputs: Inputs) -> dict[str, Any]: "operator_wage_date": None, **dict.fromkeys(COMPUTED), } - if coef is None or row.get("price_thousand_krw") is None: - out["hourly_note"] = f"{'손료계수' if coef is None else '취득가'} 없음 — 시간당 단가 안 섬" + if coef is None: + out["hourly_note"] = "손료계수 없음 — 시간당 단가 안 섬" return out - spec = MachineSpec( - machine_code=code, - name=str(row.get("machine_name") or ""), - specification=str(row.get("specification") or ""), + spec = replace( + catalog.machines[code], price_thousand_krw=Decimal(str(row["price_thousand_krw"])), loss_coefficient_per_hour=Decimal(str(coef)), - economic_life_hours=row.get("economic_life_hours"), - annual_standard_hours=row.get("annual_standard_hours"), ) liters = fuel_price = wage = None if record is not None: diff --git a/Z01_MasterData/Z01_MasterData_BasePrices_Tables.py b/Z01_MasterData/Z01_MasterData_BasePrices_Tables.py index a0f55798..a89bdf7f 100644 --- a/Z01_MasterData/Z01_MasterData_BasePrices_Tables.py +++ b/Z01_MasterData/Z01_MasterData_BasePrices_Tables.py @@ -4,7 +4,7 @@ 태움 — 토량환산 · 자재 할증 · 거푸집 전용 · 철근 갈래 · 목재 갈래 · 돌쌓기 경사·뒷길이·돌 종류·갈래 안 태움 — 이음표(`type_map`·`form_map`·`bond.codes`) · 품셈 원문 표(coef `surcharge_*`) · 글·방침 · 구조물 실측(울진 한 현장 관찰값) · 기슭막이 교본값(값과 글이 한 줄에 섞임) -⚠ 축 칸(`@axis`)은 못 고침 — 그 칸이 `@id` 를 이루므로 바꾸면 다른 표가 줄을 못 찾음. +⚠ 축 칸(`@axis`)은 못 고침 — 그 칸이 `@id` 를 이루므로 바꾸면 덮개가 줄을 못 찾음. ⚠ 원문 중복(coef 「암괴…점토」 두 줄)은 **값이 같을 때만** 한 줄로 합침 — 갈리면 `DuplicateRowError`(브레인 조건). """ diff --git a/Z01_MasterData/Z01_MasterData_Overrides.py b/Z01_MasterData/Z01_MasterData_Overrides.py new file mode 100644 index 00000000..9cdc5a8e --- /dev/null +++ b/Z01_MasterData/Z01_MasterData_Overrides.py @@ -0,0 +1,202 @@ +"""Z01 기초단가 덮개 — 사람이 고친 값만 담는 층(2026-09-15 브레인 틀 · 사용자 지시 「기초단가를 고칠 수 있게」). + + 원본 resources/data_*/… 읽기만 — 주기 갱신은 이 파일을 통째로 갈아끼움 + 덮개 resources/data_master_override/{kind}.json 고친 것만 — 주기가 달라 kind 마다 한 파일 + 읽기 원본 줄 위에 덮개를 얹음 · 줄 수준 `@overrides[열] = {original, value, state, current}` + +state 셋(판정은 **여기 한 곳** — 화면이 따로 재지 않음): + edited 고쳐짐 — 원본 그대로(덮개를 쓸 때 본 원본 = 지금 원본) + source_changed 고쳐짐 — 원본이 바뀜 · ⚠ 덮개 값을 그대로 씀(자동으로 원본을 쓰면 금액이 말없이 바뀜 — 사람이 정함) + orphan 주인 없음 — 갱신으로 그 줄·칸이 사라짐 · 버리지 않고 모아 보기에 남김 +되돌리기(「새 원본 값으로 받기」 도 같음) = 값 null → 그 칸을 덮개에서 뺌. +""" + +from __future__ import annotations + +import json +import math +import threading +from datetime import datetime +from decimal import Decimal +from pathlib import Path +from typing import Any + +from common_util.common_util_json import atomic_write_json + +OVERRIDE_DIR = Path(__file__).resolve().parent.parent / "resources" / "data_master_override" +EDITED, SOURCE_CHANGED, ORPHAN = "edited", "source_changed", "orphan" +#: ⚠ 넷째 — 값이 아니라 **줄의 뜻**이 바뀜(같은 코드에 다른 기준: 노임 문화재→국가유산 · 자재 KS 개정 규격). +#: 값이 틀린 것보다 **다른 물건에 값이 붙은 것**이 더 나쁨 → 맨 위(브레인 2026-09-16). +MEANING_CHANGED = "meaning_changed" +STATE_ORDER = (MEANING_CHANGED, SOURCE_CHANGED, ORPHAN, EDITED) # 모아 보기 차례 — 센 것이 맨 위 +_LOCK = threading.Lock() # ponytail: 한 프로세스 잠금 — 서버를 여럿 띄우면 파일 잠금이 필요 + + +def _path(kind: str) -> Path: + return OVERRIDE_DIR / f"{kind}.json" + + +def load(kind: str) -> dict[str, dict[str, dict[str, Any]]]: + """`@id` → 열 → {value, original, source, at, by}. 파일이 없으면 빈 덮개.""" + path = _path(kind) + if not path.is_file(): + return {} + return json.loads(path.read_text(encoding="utf-8")).get("overrides") or {} + + +def same(a: Any, b: Any) -> bool: + """값 비교 — 215907 과 215907.0 은 같음 · None 은 None 과만 같음.""" + if a is None or b is None: + return a is None and b is None + if isinstance(a, (int, float)) and isinstance(b, (int, float)): + return Decimal(str(a)) == Decimal(str(b)) + return a == b + + +def check_value(value: Any) -> str | None: + """넣을 수 있는 값인가 — 막는 까닭(없으면 None). null 은 되돌리기라 통과.""" + if value is None: + return None + if isinstance(value, bool) or not isinstance(value, (int, float)): + return "숫자만 넣을 수 있음" + if not math.isfinite(value) or value < 0: + return "0 이상 유한한 수만 넣을 수 있음" + return None + + +#: 이름 칸이 여럿인 자료가 있어(자재 품명·규격·단위·인도조건) **서버가 한 줄로 합침** — 화면이 합치면 판정이 두 벌. +_JOIN = " · " + + +def meaning_line(entry: dict[str, Any], row: dict[str, Any] | None) -> tuple[str, str]: + """(고칠 때 그 줄 · 지금 그 줄) 한 줄씩 — 달라진 데가 없으면 빈 둘.""" + stored = entry.get("meaning") or {} + keys = [k for k in stored if row is not None and k in row] + if not keys or all(row[k] == stored[k] for k in keys): + return "", "" + return ( + _JOIN.join(str(stored[k]) for k in keys), + _JOIN.join(str(row[k]) for k in keys), + ) + + +def mark(entry: dict[str, Any], current: Any, row: dict[str, Any] | None = None) -> dict[str, Any]: + original, value = entry.get("original"), entry.get("value") + was, now = meaning_line(entry, row) + if was: + state = MEANING_CHANGED + else: + state = EDITED if same(original, current) else SOURCE_CHANGED + out = {"original": original, "value": value, "state": state, "current": current} + if was: # ⚠ meaning_changed 인데 비어 오면 서버 버그 — 늘 함께 나감 + out["was"], out["now"] = was, now + return out + + +def overlay(kind: str, rows: list[dict[str, Any]]) -> list[dict[str, Any]]: + """원본 줄(바꾸지 않음) 위에 덮개를 얹은 **새 줄들**.""" + store = load(kind) + out = [] + for row in rows: + entries = store.get(row["@id"]) + if not entries: + out.append(row) + continue + row = dict(row) + marks = {} + for column, entry in entries.items(): + if column not in row: + continue # 주인 없는 칸 — 모아 보기에만 + marks[column] = mark(entry, row[column], row) + row[column] = entry.get("value") + if marks: + row["@overrides"] = marks + out.append(row) + return out + + +def write( + kind: str, + base_row: dict[str, Any], + values: dict[str, Any], + by: Any, + meaning: dict[str, Any] | None = None, +) -> None: + """고친 값을 덮개에 씀 — null 이거나 지금 원본과 같으면 그 칸을 뺌. 원본은 안 건드림.""" + row_id = base_row["@id"] + with _LOCK: + store = load(kind) + entries = dict(store.get(row_id) or {}) + for column, value in values.items(): + current = base_row.get(column) + if value is None or same(value, current): + entries.pop(column, None) + continue + entries[column] = { + "value": value, + "original": current, # 이 값을 보고 고침 — 갱신 뒤 원본과 달라지면 source_changed + "source": base_row.get("@source", ""), + # 값이 아닌 글자 칸 — 갱신으로 **줄의 뜻**이 바뀌면 이것으로 잡음 + "meaning": meaning or {}, + "at": datetime.now().astimezone().isoformat(timespec="seconds"), + "by": by, + } + if entries: + store[row_id] = entries + else: + store.pop(row_id, None) + _save(kind, store) + + +def _save(kind: str, store: dict[str, dict[str, dict[str, Any]]]) -> None: + atomic_write_json( + _path(kind), + { + "schema_version": "1.0", + "kind": kind, + "note": "사람이 고친 기초단가만 — 원본 파일은 그대로 · Z01 마스터 데이터 화면이 씀", + "overrides": store, + }, + ) + + +def clear(kind: str, state: str, base_rows: list[dict[str, Any]]) -> int: + """한 kind 의 그 state 덮개를 한꺼번에 뺌 — 품목 퇴출로 여럿이 주인을 잃는 갱신 뒤(브레인 ②). 뺀 수.""" + with _LOCK: + doomed = {(i["row_id"], i["column"]) for i in items(kind, base_rows) if i["state"] == state} + if not doomed: + return 0 + store = load(kind) + for row_id, column in doomed: + store[row_id].pop(column, None) + if not store[row_id]: + del store[row_id] + _save(kind, store) + return len(doomed) + + +def items(kind: str, base_rows: list[dict[str, Any]]) -> list[dict[str, Any]]: + """모아 보기 한 kind 몫 — 주인 없는 것까지 · 차례는 부르는 쪽이 STATE_ORDER 로.""" + by_id = {r["@id"]: r for r in base_rows} + out = [] + for row_id, entries in load(kind).items(): + row = by_id.get(row_id) + for column, entry in entries.items(): + if row is None or column not in row: + current, marked = None, {"state": ORPHAN} + else: + current = row[column] + marked = mark(entry, current, row) + out.append( + { + "kind": kind, + "row_id": row_id, + "column": column, + "original": entry.get("original"), + "current": current, + "value": entry.get("value"), + "state": marked["state"], + **({"was": marked["was"], "now": marked["now"]} if "was" in marked else {}), + } + ) + return out diff --git a/Z01_MasterData/Z01_MasterData_Repository_BasePrices.py b/Z01_MasterData/Z01_MasterData_Repository_BasePrices.py deleted file mode 100644 index a3013799..00000000 --- a/Z01_MasterData/Z01_MasterData_Repository_BasePrices.py +++ /dev/null @@ -1,168 +0,0 @@ -"""Z01 기초단가 저장소 — `master_base_price` · `master_revision` (020 · PLAN 1-0 계약 · 2026-09-18). - -정본 = DB. 줄 = (kind, row_key) 한 줄 · `data` 는 지금 값 한 줄 전체 · `seed` 는 주입 때 초기값(관리자 추가 줄은 NULL). -판번호 = `master_revision.revision`(scope `base:{kind}`) — 쓸 때마다 +1 · 읽어 간 판과 다르면 안 씀(409). -⚠ 여기는 SQL 만 — 무엇을 고칠 수 있나·값 검사는 `Z01_MasterData_BasePrices` 가 함. -""" - -from __future__ import annotations - -import json -from typing import Any - -import aiomysql - -from config.config_db import get_db_pool - - -class RevisionConflict(Exception): - """읽어 간 판번호가 지금 판과 다름 — 그 사이 누가 저장함.""" - - -class UnknownRows(LookupError): - """없는 줄 열쇠 — 되돌릴 줄을 못 찾음.""" - - -def _scope(kind: str) -> str: - return f"base:{kind}" - - -def _json(text: Any) -> Any: - return json.loads(text) if isinstance(text, (str, bytes)) else text - - -def _dump(data: dict[str, Any]) -> str: - return json.dumps(data, ensure_ascii=False, default=str) - - -async def load(kind: str) -> list[dict[str, Any]]: - """지운 줄 뺀 전부 — 넣은 차례(id) 그대로. {row_key, data, seed}.""" - pool = get_db_pool() - async with pool.acquire() as connection, connection.cursor(aiomysql.DictCursor) as cursor: - await cursor.execute( - """SELECT row_key, data, seed FROM master_base_price - WHERE kind = %s AND is_deleted = 0 ORDER BY id""", - (kind,), - ) - return [ - {"row_key": r["row_key"], "data": _json(r["data"]), "seed": _json(r["seed"])} - for r in await cursor.fetchall() - ] - - -async def revision(kind: str) -> int: - pool = get_db_pool() - async with pool.acquire() as connection, connection.cursor() as cursor: - await cursor.execute( - "SELECT revision FROM master_revision WHERE scope = %s", (_scope(kind),) - ) - row = await cursor.fetchone() - return int(row[0]) if row else 0 - - -async def counts() -> dict[str, int]: - """kind 마다 줄 수(지운 줄 뺌) — 표 목록 한 번에.""" - pool = get_db_pool() - async with pool.acquire() as connection, connection.cursor() as cursor: - await cursor.execute( - "SELECT kind, COUNT(*) FROM master_base_price WHERE is_deleted = 0 GROUP BY kind" - ) - return {kind: int(n) for kind, n in await cursor.fetchall()} - - -async def _lock_revision(cursor: Any, kind: str) -> int: - """판번호 줄을 잠그고 읽음 — 없으면 0 으로 세움(같은 kind 쓰기는 여기서 한 줄로 섬).""" - await cursor.execute( - "INSERT IGNORE INTO master_revision (scope, revision) VALUES (%s, 0)", (_scope(kind),) - ) - await cursor.execute( - "SELECT revision FROM master_revision WHERE scope = %s FOR UPDATE", (_scope(kind),) - ) - return int((await cursor.fetchone())[0]) - - -async def _bump(cursor: Any, kind: str) -> None: - await cursor.execute( - "UPDATE master_revision SET revision = revision + 1 WHERE scope = %s", (_scope(kind),) - ) - - -async def save( - kind: str, - base_revision: int, - changed: dict[str, dict[str, Any]], - added: dict[str, dict[str, Any]], - deleted: list[str], - by: int | None, -) -> int: - """한 트랜잭션 — 판이 맞을 때만 고친 줄·새 줄·지운 줄을 한꺼번에(전부 아니면 전무). 새 판번호.""" - pool = get_db_pool() - async with pool.acquire() as connection, connection.cursor() as cursor: - try: - await connection.begin() - current = await _lock_revision(cursor, kind) - if current != base_revision: - raise RevisionConflict(current) - for row_key, data in changed.items(): - await cursor.execute( - """UPDATE master_base_price - SET data = %s, updated_by = %s, updated_at = CURRENT_TIMESTAMP - WHERE kind = %s AND row_key = %s AND is_deleted = 0""", - (_dump(data), by, kind, row_key), - ) - for row_key, data in added.items(): - await cursor.execute( - """INSERT INTO master_base_price - (kind, row_key, data, seed, edition, is_deleted, updated_by, updated_at) - VALUES (%s, %s, %s, NULL, %s, 0, %s, CURRENT_TIMESTAMP)""", - (kind, row_key, _dump(data), str(data.get("effective_date") or ""), by), - ) - for row_key in deleted: - await cursor.execute( - """UPDATE master_base_price - SET is_deleted = 1, updated_by = %s, updated_at = CURRENT_TIMESTAMP - WHERE kind = %s AND row_key = %s""", - (by, kind, row_key), - ) - await _bump(cursor, kind) - await connection.commit() - return current + 1 - except Exception: - await connection.rollback() - raise - - -async def reset(kind: str, row_keys: list[str], by: int | None) -> int: - """고른 줄을 초기값으로 — 주입 줄은 data := seed(지운 줄도 되살림) · 추가 줄(seed NULL)은 지움. 새 판번호.""" - keys = list(dict.fromkeys(row_keys)) - marks = ", ".join(["%s"] * len(keys)) - pool = get_db_pool() - async with pool.acquire() as connection, connection.cursor() as cursor: - try: - await connection.begin() - current = await _lock_revision(cursor, kind) - await cursor.execute( - f"SELECT row_key FROM master_base_price WHERE kind = %s AND row_key IN ({marks})", - (kind, *keys), - ) - missing = set(keys) - {r[0] for r in await cursor.fetchall()} - if missing: - raise UnknownRows(sorted(missing)) - await cursor.execute( - f"""UPDATE master_base_price - SET data = seed, is_deleted = 0, updated_by = %s, updated_at = CURRENT_TIMESTAMP - WHERE kind = %s AND seed IS NOT NULL AND row_key IN ({marks})""", - (by, kind, *keys), - ) - await cursor.execute( - f"""UPDATE master_base_price - SET is_deleted = 1, updated_by = %s, updated_at = CURRENT_TIMESTAMP - WHERE kind = %s AND seed IS NULL AND row_key IN ({marks})""", - (by, kind, *keys), - ) - await _bump(cursor, kind) - await connection.commit() - return current + 1 - except Exception: - await connection.rollback() - raise diff --git a/Z01_MasterData/Z01_MasterData_Repository_WorkItems.py b/Z01_MasterData/Z01_MasterData_Repository_WorkItems.py deleted file mode 100644 index 11f0658a..00000000 --- a/Z01_MasterData/Z01_MasterData_Repository_WorkItems.py +++ /dev/null @@ -1,181 +0,0 @@ -"""Z01 공종 저장소 — `master_work_item`·`master_work_item_row`·`master_revision` 읽기·쓰기(SQL 만). - -무엇을 쓸지는 `Z01_MasterData_WorkItems` 순수 함수(`plan_rows`·`reset_plan`)가 정함 · -여기는 받은 대로 씀. -표 모양 = `db_management/020_master_cost.sql`(PLAN 1-0 계약). 트랜잭션은 부르는 쪽(라우터)이 엶. -""" - -from __future__ import annotations - -import json -from typing import Any - -import aiomysql - -HEAD_COLUMNS = ( - "id, axis, work_item_key, code, number, name, path_name, parent_key, parent_mode, " - "basis_quantity, basis_unit, status, notes, source, seed, edition, sort_order, " - "updated_by, updated_at" -) -ROW_COLUMNS = ( - "id, variant, resource_kind, resource_key, resource_name, resource_spec, amount, " - "amount_unit, alternative_amount, group_ratio_pct, raw_cell, pum_table_id, seed, " - "sort_order, is_deleted" -) -_JSON = ("notes", "source", "seed") - - -def _parsed(row: dict[str, Any]) -> dict[str, Any]: - """JSON 칸은 MariaDB 가 글자로 돌려줌 — 풀어서 씀.""" - for key in _JSON: - if isinstance(row.get(key), (str, bytes)): - row[key] = json.loads(row[key]) - return row - - -def _like(q: str) -> str: - return "%" + q.replace("\\", "\\\\").replace("%", "\\%").replace("_", "\\_") + "%" - - -async def list_items( - connection: aiomysql.Connection, *, axis: str, status: str, q: str, page: int, size: int -) -> dict[str, Any]: - """목록 한 쪽 + 상태별 개수(상태 거르기 전 · 탭 숫자용). total 은 개수에서 셈(질의 하나 덜).""" - where, params = ["1"], [] - if axis: - where.append("w.axis = %s") - params.append(axis) - if q: - where.append("(w.work_item_key LIKE %s OR w.number LIKE %s OR w.path_name LIKE %s)") - params += [_like(q)] * 3 - picked, picked_params = list(where), list(params) - if status: - picked.append("w.status = %s") - picked_params.append(status) - async with connection.cursor(aiomysql.DictCursor) as cursor: - await cursor.execute( - "SELECT w.status, COUNT(*) AS n FROM master_work_item w " - f"WHERE {' AND '.join(where)} GROUP BY w.status", - params, - ) - counts = {row["status"]: int(row["n"]) for row in await cursor.fetchall()} - await cursor.execute( - "SELECT w.work_item_key, w.axis, w.number, w.name, w.path_name, w.status, " - "(SELECT COUNT(*) FROM master_work_item_row r " - " WHERE r.work_item_id = w.id AND r.is_deleted = 0) AS row_count " - f"FROM master_work_item w WHERE {' AND '.join(picked)} " - "ORDER BY w.axis, w.sort_order, w.id LIMIT %s OFFSET %s", - [*picked_params, size, (page - 1) * size], - ) - items = list(await cursor.fetchall()) - total = counts.get(status, 0) if status else sum(counts.values()) - return {"items": items, "total": total, "counts": counts} - - -async def fetch_item( - connection: aiomysql.Connection, key: str, *, lock: bool = False -) -> dict[str, Any] | None: - async with connection.cursor(aiomysql.DictCursor) as cursor: - await cursor.execute( - f"SELECT {HEAD_COLUMNS} FROM master_work_item WHERE work_item_key = %s" - + (" FOR UPDATE" if lock else ""), - (key,), - ) - row = await cursor.fetchone() - return _parsed(row) if row else None - - -async def fetch_rows( - connection: aiomysql.Connection, item_id: int, *, with_deleted: bool = False -) -> list[dict[str, Any]]: - """구성 줄 — 기본은 살아 있는 줄만 · [초기값으로] 는 숨긴 줄까지.""" - async with connection.cursor(aiomysql.DictCursor) as cursor: - await cursor.execute( - f"SELECT {ROW_COLUMNS} FROM master_work_item_row WHERE work_item_id = %s" - + ("" if with_deleted else " AND is_deleted = 0") - + " ORDER BY sort_order, id", - (item_id,), - ) - return [_parsed(row) for row in await cursor.fetchall()] - - -async def revision(connection: aiomysql.Connection, scope: str, *, lock: bool = False) -> int: - """지금 revision(없으면 0). lock 이면 줄을 만들어 잡음 — 같은 공종 저장이 줄 서게.""" - async with connection.cursor() as cursor: - if lock: - await cursor.execute( - "INSERT IGNORE INTO master_revision (scope, revision) VALUES (%s, 0)", (scope,) - ) - await cursor.execute( - "SELECT revision FROM master_revision WHERE scope = %s" - + (" FOR UPDATE" if lock else ""), - (scope,), - ) - row = await cursor.fetchone() - return int(row[0]) if row else 0 - - -async def bump_revision(connection: aiomysql.Connection, scope: str) -> None: - async with connection.cursor() as cursor: - await cursor.execute( - "INSERT INTO master_revision (scope, revision) VALUES (%s, 1) " - "ON DUPLICATE KEY UPDATE revision = revision + 1", - (scope,), - ) - - -async def known_resource_keys(connection: aiomysql.Connection, keys: set[str]) -> set[str]: - """그중 기초단가(`master_base_price.row_key`)에 실재하는 열쇠.""" - if not keys: - return set() - marks = ", ".join(["%s"] * len(keys)) - async with connection.cursor() as cursor: - await cursor.execute( - "SELECT DISTINCT row_key FROM master_base_price " - f"WHERE is_deleted = 0 AND row_key IN ({marks})", - list(keys), - ) - return {row[0] for row in await cursor.fetchall()} - - -async def write( - connection: aiomysql.Connection, - item_id: int, - head: dict[str, Any], - plan: dict[str, list[Any]], - by: Any, -) -> None: - """머리 칸 + 줄 쓰기(`plan_rows`·`reset_plan` 모양). - - 칸 이름은 순수 함수의 고정 목록에서만 옴(요청 글자가 SQL 에 안 들어감). - """ - async with connection.cursor() as cursor: - sets = "".join(f"{field} = %s, " for field in head) - await cursor.execute( - f"UPDATE master_work_item SET {sets}updated_by = %s, updated_at = NOW() WHERE id = %s", - [*head.values(), by, item_id], - ) - for row in plan["updates"]: # 줄마다 칸이 다를 수 있음(seed 에 있는 칸만) — 한 공종 수십 줄 - values = {k: v for k, v in row.items() if k != "id"} - sets = "".join(f"{field} = %s, " for field in values) - await cursor.execute( - f"UPDATE master_work_item_row SET {sets}is_deleted = 0 " - "WHERE id = %s AND work_item_id = %s", - [*values.values(), row["id"], item_id], - ) - if plan["inserts"]: - fields = list(plan["inserts"][0]) - await cursor.executemany( - f"INSERT INTO master_work_item_row (work_item_id, {', '.join(fields)}) " - f"VALUES (%s, {', '.join(['%s'] * len(fields))})", - [[item_id, *(row[f] for f in fields)] for row in plan["inserts"]], - ) - for ids, sql in ( - (plan["hide"], "UPDATE master_work_item_row SET is_deleted = 1"), - (plan["drop"], "DELETE FROM master_work_item_row"), - ): - if ids: - await cursor.execute( - f"{sql} WHERE work_item_id = %s AND id IN ({', '.join(['%s'] * len(ids))})", - [item_id, *ids], - ) diff --git a/Z01_MasterData/Z01_MasterData_Router.py b/Z01_MasterData/Z01_MasterData_Router.py index d47be921..294d1337 100644 --- a/Z01_MasterData/Z01_MasterData_Router.py +++ b/Z01_MasterData/Z01_MasterData_Router.py @@ -1,69 +1,32 @@ -"""Z01 마스터 데이터 라우터 — 읽기 + 기초단가 DB 정본 일괄 저장(2026-09-18 PLAN 1-0 계약). +"""Z01 마스터 데이터 라우터 — 읽기 + 기초단가 고치기(2026-09-15 브레인). - GET /api/master-data/tree 갈래 → 파일 → 표 - GET /api/master-data/rows?file=&table=&page=&size=&q= 표 줄(쪽 나누기 · 검색) - GET /api/master-data/base-prices 표 목록(갈래·kind·이름·줄 수 · 공종 축 산림·건설 포함) - GET /api/master-data/base-prices/{kind}?page=&size=&q=&sort=&desc=[&거르기=값] 한 표 + revision · 줄마다 changed_columns · is_added - PUT /api/master-data/base-prices/{kind} {base_revision, edits, added, deleted} → 409 · 전부 아니면 전무 - POST /api/master-data/base-prices/{kind}/reset {row_keys} → 초기값으로(추가 줄은 지움) + GET /api/master-data/tree 갈래 → 파일 → 표 + GET /api/master-data/rows?file=&table=&page=&size=&q= 표 줄(쪽 나누기 · 검색) + GET /api/master-data/base-prices 표 목록(갈래·kind·이름·줄 수 · 공종 축 산림·건설 포함) + GET /api/master-data/base-prices/{kind}?page=&size=&q=&sort=&desc=[&거르기=값] 한 표(기초단가 다섯 · 품셈 기준 열 · 공종 축 둘) + PUT /api/master-data/base-prices/{kind}/{row_id} {values:{열:값}} → 덮개에만 씀 · null = 되돌리기 + GET /api/master-data/overrides 고친 것·원본 바뀐 것·주인 없는 것(서버 정렬) ⚠ 권한은 등록하는 쪽(`main.py` · 랩탑 서브)이 `dependencies=[verify_session, require_system_admin]` 로 붙임. -⚠ 자동저장 없음 — 화면은 [저장] 에서만 PUT(지침 5장). """ from __future__ import annotations -import asyncio -from typing import Any +from typing import Any, Literal from fastapi import APIRouter, Depends, HTTPException, Request from fastapi.responses import JSONResponse -from pydantic import BaseModel, ConfigDict, Field -from starlette.concurrency import run_in_threadpool +from pydantic import BaseModel from common_util.common_util_auth import verify_session from Z01_MasterData import Z01_MasterData_BasePrices as base_prices -from Z01_MasterData import Z01_MasterData_Repository_BasePrices as repo from Z01_MasterData import Z01_MasterData_Tables as tables from Z01_MasterData import Z01_MasterData_WorkItems as work_items router = APIRouter(prefix="/api/master-data", tags=["Z01 MasterData"]) -_STALE = "그 사이 누가 이 표를 저장했습니다 — 표를 다시 불러와 고칠 것." - -class CellEdit(BaseModel): - model_config = ConfigDict(extra="forbid") - - row_key: str = Field(min_length=1, max_length=190) - column: str = Field(min_length=1, max_length=100) - value: Any = None - - -class AddedRow(BaseModel): - model_config = ConfigDict(extra="forbid") - - data: dict[str, Any] = Field(min_length=1) - - -class BasePriceSave(BaseModel): - """[저장] 한 번 — 읽어 간 판번호와 함께 고친 칸·새 줄·지운 줄.""" - - model_config = ConfigDict(extra="forbid") - - base_revision: int = Field(ge=0) - edits: list[CellEdit] = Field(default_factory=list, max_length=500) - added: list[AddedRow] = Field(default_factory=list, max_length=500) - deleted: list[str] = Field(default_factory=list, max_length=500) - - -class BasePriceReset(BaseModel): - model_config = ConfigDict(extra="forbid") - - row_keys: list[str] = Field(min_length=1, max_length=10000) - - -def _error(status: int, message: str) -> JSONResponse: - return JSONResponse(status_code=status, content={"status": "error", "message": message}) +class BasePriceEdit(BaseModel): + values: dict[str, Any] @router.get("/tree") @@ -87,19 +50,14 @@ def _kind(kind: str) -> str: return kind -def _db_kind(kind: str) -> str | None: - """고칠 수 있는 표(DB 정본) — 공종 축은 여기서 안 고침(`/work-items` 몫).""" - return kind if kind in base_prices.KINDS and kind not in work_items.KINDS else None - - @router.get("/base-prices") -async def get_base_price_kinds() -> dict: +def get_base_price_kinds() -> dict: """어떤 표가 있나 — 갈래·kind·한글 이름·줄 수. 화면이 목록을 제 코드에 들지 않게 서버가 냄.""" - return {"status": "success", "kinds": await base_prices.kinds()} + return {"kinds": base_prices.kinds()} @router.get("/base-prices/{kind}") -async def get_base_prices( +def get_base_prices( kind: str, request: Request, page: int = 1, @@ -108,71 +66,39 @@ async def get_base_prices( sort: str = "", desc: int = 0, ) -> dict: - kind = _kind(kind) # 거르기 — 표가 준 `filters` 의 key 만 받음(공종 축 부문·줄 구실) picked = {k: v for k, v in request.query_params.items() if k in work_items.FILTER_KEYS} - if _db_kind(kind): - all_rows, revision = await asyncio.gather(base_prices.rows(kind), repo.revision(kind)) - else: - all_rows, revision = await base_prices.rows(kind), 0 try: - table = await run_in_threadpool( - base_prices.table, - kind, - all_rows, - page=page, - size=size, - q=q, - sort=sort, - desc=bool(desc), - filters=picked, + return base_prices.table( + _kind(kind), page=page, size=size, q=q, sort=sort, desc=bool(desc), filters=picked ) except base_prices.SortError as error: raise HTTPException(status_code=400, detail=str(error)) from error - return {"status": "success", "revision": revision, **table} -@router.put("/base-prices/{kind}") -async def put_base_prices( - kind: str, body: BasePriceSave, session: dict = Depends(verify_session) +@router.put("/base-prices/{kind}/{row_id:path}") +def put_base_price( + kind: str, row_id: str, body: BasePriceEdit, session: dict = Depends(verify_session) ) -> JSONResponse: - """고친 칸·새 줄·지운 줄을 한 번에 — 다 맞춰 본 뒤 한 트랜잭션(하나라도 틀리면 아무것도 안 씀).""" - if not _db_kind(kind): - return _error(404 if kind not in base_prices.KINDS else 400, f"고칠 수 없는 표: {kind}") - if await repo.revision(kind) != body.base_revision: - return _error(409, _STALE) - try: - changed, added, deleted = base_prices.plan_save( - kind, - await base_prices.rows(kind), - [edit.model_dump() for edit in body.edits], - [row.data for row in body.added], - body.deleted, - ) - except base_prices.SaveError as error: - return _error(error.status, str(error)) - if not (changed or added or deleted): - return JSONResponse( - content={"status": "success", "revision": body.base_revision, "added": []} - ) - try: - revision = await repo.save( - kind, body.base_revision, changed, added, deleted, session.get("user_id") - ) - except repo.RevisionConflict: - return _error(409, _STALE) - return JSONResponse(content={"status": "success", "revision": revision, "added": list(added)}) + status, payload = base_prices.edit(_kind(kind), row_id, body.values, session.get("user_id")) + if status != 200: + raise HTTPException(status_code=status, detail=payload["message"]) + return JSONResponse(content=payload) -@router.post("/base-prices/{kind}/reset") -async def reset_base_prices( - kind: str, body: BasePriceReset, session: dict = Depends(verify_session) -) -> JSONResponse: - """고른 줄을 초기값으로 — 주입 줄은 data := seed · 추가 줄은 지움. 판번호 +1.""" - if not _db_kind(kind): - return _error(404 if kind not in base_prices.KINDS else 400, f"고칠 수 없는 표: {kind}") - try: - revision = await repo.reset(kind, body.row_keys, session.get("user_id")) - except repo.UnknownRows as error: - return _error(404, f"없는 줄: {', '.join(error.args[0])}") - return JSONResponse(content={"status": "success", "revision": revision}) +@router.get("/overrides") +def get_overrides( + kind: str = "", state: str = "", page: int = 1, size: int = tables.DEFAULT_PAGE_SIZE +) -> dict: + return base_prices.override_items(kind and _kind(kind), state, page=page, size=size) + + +class OverrideClear(BaseModel): + kind: str + state: Literal["edited", "source_changed", "orphan"] + + +@router.post("/overrides/clear") +def clear_overrides(body: OverrideClear, _session: dict = Depends(verify_session)) -> dict: + """한 kind 의 그 state 덮개를 한꺼번에 뺌 — kind·state 둘 다 있어야 함(통째로 비우기 막음).""" + return {"removed": base_prices.clear_overrides(_kind(body.kind), body.state)} diff --git a/Z01_MasterData/Z01_MasterData_Router_WorkItems.py b/Z01_MasterData/Z01_MasterData_Router_WorkItems.py deleted file mode 100644 index dfbac857..00000000 --- a/Z01_MasterData/Z01_MasterData_Router_WorkItems.py +++ /dev/null @@ -1,152 +0,0 @@ -"""Z01 공종 편집 라우터 — 공종 머리·구성 줄을 관리자가 고치고 메움(2026-09-18 PLAN 1-0 계약). - - GET /api/master-data/work-items?axis&status&q&page&size 목록 + 상태별 개수 - GET /api/master-data/work-items/{key} 머리(+revision)·구성 줄·원문 표·[주] - PUT /api/master-data/work-items/{key} 전체 줄 보내기 - → 409(낡은 revision) · 422(검사) - POST /api/master-data/work-items/{key}/reset 머리·줄을 초기값으로(추가 줄 삭제) -쓰기는 한 트랜잭션(전부 아니면 전무) · 응답은 새 GET 모양 그대로(화면이 다시 안 불러도 됨). -⚠ 권한은 등록하는 쪽(`main.py`)이 시스템 관리자 전용 묶음으로 붙임. -""" - -from __future__ import annotations - -from decimal import Decimal -from typing import Any, Literal - -from fastapi import APIRouter, Depends, HTTPException -from pydantic import BaseModel, ConfigDict, Field - -from common_util.common_util_auth import verify_session -from config.config_db import get_db_pool -from Z01_MasterData import Z01_MasterData_Repository_WorkItems as repo -from Z01_MasterData import Z01_MasterData_Tables as tables -from Z01_MasterData import Z01_MasterData_WorkItems as work_items - -router = APIRouter(prefix="/api/master-data", tags=["Z01 MasterData WorkItems"]) - -Status = Literal[work_items.STATUSES] # 튜플을 펼침 — 상태 이름은 한 곳(`STATUSES`) -MAX_ROWS = 500 - - -class _Strict(BaseModel): - model_config = ConfigDict(extra="forbid") - - -class ItemHead(_Strict): - name: str = Field(min_length=1) - basis_quantity: Decimal | None = Field(default=None, ge=0) - basis_unit: str | None = None - status: Status - - -class ItemRow(_Strict): - id: int | None = None # 있으면 수정 · 없으면 추가 - variant: str = "" - resource_kind: Literal["labor", "machine", "material", "etc"] - resource_key: str | None = Field(default=None, min_length=1) # 못 맞춘 줄은 null(빈 글자 금지) - resource_name: str = "" - resource_spec: str = "" - amount: Decimal | None = Field(default=None, ge=0) - amount_unit: str = "" - alternative_amount: Decimal | None = Field(default=None, ge=0) - group_ratio_pct: Decimal | None = Field(default=None, ge=0) - raw_cell: str | None = None - pum_table_id: str = "" - - -class WorkItemSave(_Strict): - base_revision: int - item: ItemHead - rows: list[ItemRow] = Field(max_length=MAX_ROWS) # 전체 줄 — 빠진 줄은 삭제 - - -@router.get("/work-items") -async def list_work_items( - axis: Literal["", "forest", "const"] = "", - status: Status | Literal[""] = "", - q: str = "", - page: int = 1, - size: int = tables.DEFAULT_PAGE_SIZE, -) -> dict[str, Any]: - page, size = max(page, 1), max(1, min(size, tables.MAX_PAGE_SIZE)) - async with get_db_pool().acquire() as connection: - found = await repo.list_items( - connection, axis=axis, status=status, q=q.strip(), page=page, size=size - ) - counts = {s: found["counts"].get(s, 0) for s in work_items.STATUSES} - return {"status": "success", **found, "counts": counts, "page": page, "size": size} - - -async def _detail(connection: Any, key: str) -> dict[str, Any]: - head = await repo.fetch_item(connection, key) - if head is None: - raise HTTPException(status_code=404, detail=f"없는 공종: {key}") - rows = await repo.fetch_rows(connection, head["id"]) - revision = await repo.revision(connection, work_items.revision_scope(key)) - return {"status": "success", **work_items.detail(head, rows, revision)} - - -@router.get("/work-items/{key}") -async def get_work_item(key: str) -> dict[str, Any]: - async with get_db_pool().acquire() as connection: - return await _detail(connection, key) - - -async def _locked(connection: Any, key: str) -> tuple[dict[str, Any], int]: - """공종 머리 + revision 을 잡음(같은 공종 저장이 줄 섬).""" - head = await repo.fetch_item(connection, key, lock=True) - if head is None: - raise HTTPException(status_code=404, detail=f"없는 공종: {key}") - return head, await repo.revision(connection, work_items.revision_scope(key), lock=True) - - -@router.put("/work-items/{key}") -async def put_work_item( - key: str, body: WorkItemSave, session: dict = Depends(verify_session) -) -> dict[str, Any]: - rows = [row.model_dump() for row in body.rows] - async with get_db_pool().acquire() as connection: - await connection.begin() - try: - head, current = await _locked(connection, key) - if current != body.base_revision: - raise HTTPException( - status_code=409, - detail="다른 곳에서 먼저 고쳤음 — 다시 불러올 것" - f"(지금 {current} · 보낸 {body.base_revision})", - ) - existing = await repo.fetch_rows(connection, head["id"]) - known = await repo.known_resource_keys( - connection, {row["resource_key"] for row in rows if row["resource_key"]} - ) - errors = work_items.check_rows(rows, {row["id"] for row in existing}, known) - if errors: - raise HTTPException(status_code=422, detail="\n".join(errors)) - plan = work_items.plan_rows(existing, rows) - await repo.write( - connection, head["id"], body.item.model_dump(), plan, session.get("user_id") - ) - await repo.bump_revision(connection, work_items.revision_scope(key)) - await connection.commit() - except BaseException: - await connection.rollback() - raise - return await _detail(connection, key) - - -@router.post("/work-items/{key}/reset") -async def reset_work_item(key: str, session: dict = Depends(verify_session)) -> dict[str, Any]: - async with get_db_pool().acquire() as connection: - await connection.begin() - try: - head, _current = await _locked(connection, key) - rows = await repo.fetch_rows(connection, head["id"], with_deleted=True) - plan = work_items.reset_plan(head, rows) - await repo.write(connection, head["id"], plan["head"], plan, session.get("user_id")) - await repo.bump_revision(connection, work_items.revision_scope(key)) - await connection.commit() - except BaseException: - await connection.rollback() - raise - return await _detail(connection, key) diff --git a/Z01_MasterData/Z01_MasterData_UI_Draft.ts b/Z01_MasterData/Z01_MasterData_UI_Draft.ts deleted file mode 100644 index 60412835..00000000 --- a/Z01_MasterData/Z01_MasterData_UI_Draft.ts +++ /dev/null @@ -1,263 +0,0 @@ -/* ============================================================================= - * Z01_MasterData_UI_Draft.ts - * 고친 것 초안 — [저장] 전까지 이 탭(sessionStorage)에만 둠 · 판(revision)이 다르면 버림 - * - * 본보기 `B08_Quantity_UI_StructureSummary.ts` 의 Draft · 열쇠 `z01-draft:{scope}` - * (scope = `base:{kind}` · `work_item:{key}`) — PLAN 1-0 계약 · 자동저장 금지(CLAUDE.md 5장). - * 런타임 import 없음 — 시험(`test_z01_master_draft.py`)이 그대로 돌림. - * ========================================================================== */ - -import type { - BaseSave, - WorkItemDetail, - WorkItemHead, - WorkItemRow, - WorkItemSave, -} from "./Z01_MasterData_Api_Fetch"; - -const PREFIX = "z01-draft:"; - -/** 저장소의 초안 — 판이 다르거나 못 읽으면 null(낡은 판 초안은 지움). */ -export function readDraft(scope: string, revision: number): T | null { - try { - const raw = sessionStorage.getItem(PREFIX + scope); - const saved = JSON.parse(raw ?? "null") as { revision: number; body: T } | null; - if (saved?.revision === revision) return saved.body; - if (saved) sessionStorage.removeItem(PREFIX + scope); - } catch { - // 캐시를 못 읽으면 빈 초안 — 정본은 그대로. - } - return null; -} - -/** body null = 지움. */ -export function writeDraft(scope: string, revision: number, body: unknown): void { - try { - if (body === null) sessionStorage.removeItem(PREFIX + scope); - else sessionStorage.setItem(PREFIX + scope, JSON.stringify({ revision, body })); - } catch { - // 저장소가 막혀도 화면 초안은 살아 있음. - } -} - -export function hasDraft(scope: string): boolean { - try { - return sessionStorage.getItem(PREFIX + scope) !== null; - } catch { - return false; - } -} - -/** 값이 같은가 — null·undefined 는 같게 봄. */ -export function same(a: unknown, b: unknown): boolean { - return JSON.stringify(a ?? null) === JSON.stringify(b ?? null); -} - -/* ── 기초단가 — 칸 고침 · 줄 추가 · 줄 삭제 ── */ - -type Edit = BaseSave["edits"][number]; -export interface AddedRow { - /** 화면 안 임시 이름 — 서버에 안 감 */ - tmp: string; - data: Record; -} -interface BaseBody { - edits: Edit[]; - added: AddedRow[]; - deleted: string[]; -} - -export class BaseDraft { - readonly edits = new Map(); - added: AddedRow[] = []; - readonly deleted = new Set(); - onChange: () => void = () => undefined; - - constructor( - readonly scope: string, - readonly revision: number, - ) { - const saved = readDraft(scope, revision); - for (const edit of saved?.edits ?? []) this.edits.set(`${edit.row_key}|${edit.column}`, edit); - this.added = saved?.added ?? []; - for (const key of saved?.deleted ?? []) this.deleted.add(key); - } - - get count(): number { - return this.edits.size + this.added.length + this.deleted.size; - } - - edit(rowKey: string, column: string): Edit | undefined { - return this.edits.get(`${rowKey}|${column}`); - } - - /** 서버 값과 같아지면 고침에서 뺌. */ - setEdit(rowKey: string, column: string, value: unknown, stored: unknown): void { - const slot = `${rowKey}|${column}`; - if (same(value, stored)) this.edits.delete(slot); - else this.edits.set(slot, { row_key: rowKey, column, value }); - this.persist(); - } - - addRow(): AddedRow { - const row = { tmp: `new-${Date.now()}-${this.added.length}`, data: {} }; - this.added.push(row); - this.persist(); - return row; - } - - /** 빈 값(null)이면 그 칸을 뺌 — 서버가 기본값을 씀. */ - setAdded(tmp: string, column: string, value: unknown): void { - const row = this.added.find((each) => each.tmp === tmp); - if (!row) return; - if (value === null || value === "") delete row.data[column]; - else row.data[column] = value; - this.persist(); - } - - removeAdded(tmp: string): void { - this.added = this.added.filter((each) => each.tmp !== tmp); - this.persist(); - } - - toggleDelete(rowKey: string): void { - if (!this.deleted.delete(rowKey)) this.deleted.add(rowKey); - this.persist(); - } - - clear(): void { - this.edits.clear(); - this.added = []; - this.deleted.clear(); - this.persist(); - } - - /** 보낼 몸 — 지울 줄의 칸 고침은 안 보냄. */ - payload(): BaseSave { - return { - base_revision: this.revision, - edits: [...this.edits.values()].filter((edit) => !this.deleted.has(edit.row_key)), - added: this.added.map((row) => ({ data: row.data })), - deleted: [...this.deleted], - }; - } - - private persist(): void { - const body: BaseBody = { - edits: [...this.edits.values()], - added: this.added, - deleted: [...this.deleted], - }; - writeDraft(this.scope, this.revision, this.count ? body : null); - this.onChange(); - } -} - -/* ── 공종 — 머리 + 전체 줄(PUT 이 전체 줄을 받음) ── */ - -/** 화면 줄 — tmp = 저장 전 새 줄 · deleted = [저장] 때 뺄 줄(줄은 그대로 보이며 줄 그음) */ -export type DraftRow = WorkItemRow & { tmp?: string; deleted?: boolean }; - -export interface WorkItemBody { - item: WorkItemHead; - rows: DraftRow[]; -} - -export const HEAD_FIELDS = ["name", "basis_quantity", "basis_unit", "status"] as const; - -/** - * 줄에서 PUT 으로 보내는 칸 — 서버 요청 모델이 모르는 칸(is_added·changed_columns·sort_order)은 - * 422(extra=forbid). 차례는 보낸 차례가 곧 sort_order. - */ -export const ROW_FIELDS = [ - "variant", - "resource_kind", - "resource_key", - "resource_name", - "resource_spec", - "amount", - "amount_unit", - "alternative_amount", - "group_ratio_pct", - "raw_cell", - "pum_table_id", -] as const; -/** 글자 칸 — 서버가 null 을 안 받음(빈 글자로) */ -const TEXT_FIELDS = new Set([ - "variant", - "resource_name", - "resource_spec", - "amount_unit", - "pum_table_id", -]); - -/** 서버 값 그대로의 초안(고친 것 없음). */ -export function freshBody(detail: WorkItemDetail): WorkItemBody { - const item = Object.fromEntries( - HEAD_FIELDS.map((field) => [field, detail.item[field]]), - ) as unknown as WorkItemHead; - return { item, rows: detail.rows.map((row) => ({ ...row })) }; -} - -/** 보낼 줄 — id + 계약 칸만 · 글자 칸 null 은 빈 글자 · 빈 열쇠는 null(못 맞춘 줄). */ -function rowPayload(row: DraftRow): WorkItemRow { - const out: Record = row.id === undefined ? {} : { id: row.id }; - for (const field of ROW_FIELDS) { - const value = row[field]; - out[field] = TEXT_FIELDS.has(field) ? (value ?? "") : value === "" ? null : (value ?? null); - } - return out as unknown as WorkItemRow; -} - -/** 보낼 몸 — 지울 줄은 빼고(빠지면 삭제) · 화면 표시 칸(tmp·deleted)과 GET 전용 칸은 뗌. */ -export function workItemPayload(revision: number, body: WorkItemBody): WorkItemSave { - return { - base_revision: revision, - item: { ...body.item }, - rows: body.rows.filter((row) => !row.deleted).map(rowPayload), - }; -} - -export function isDirty(detail: WorkItemDetail, body: WorkItemBody): boolean { - const base = detail.item.revision; - return !same(workItemPayload(base, body), workItemPayload(base, freshBody(detail))); -} - -/** 서버 값과 다른 칸 — 새 줄은 「added」(줄째 새것). */ -export function changedFields(row: DraftRow, saved: WorkItemRow[]): Set | "added" { - const original = row.id === undefined ? undefined : saved.find((each) => each.id === row.id); - if (!original) return "added"; - return new Set(ROW_FIELDS.filter((key) => !same(row[key], original[key]))); -} - -/** 갈래별로 묶음 — 처음 나온 차례 그대로 · 줄 번호(rows 안 자리)만 담음. */ -export function groupByVariant(rows: DraftRow[]): { variant: string; indexes: number[] }[] { - const groups: { variant: string; indexes: number[] }[] = []; - rows.forEach((row, index) => { - const group = groups.find((each) => each.variant === row.variant); - if (group) group.indexes.push(index); - else groups.push({ variant: row.variant, indexes: [index] }); - }); - return groups; -} - -/** 새 줄 — 그 갈래 마지막 줄 바로 뒤에 넣음(보낸 차례가 sort_order 라 갈래가 흩어지지 않게). */ -export function addRow(body: WorkItemBody, variant: string, tmp: string): DraftRow { - const row: DraftRow = { - tmp, - variant, - resource_kind: "material", - resource_key: null, - resource_name: "", - resource_spec: "", - amount: null, - amount_unit: "", - alternative_amount: null, - group_ratio_pct: null, - raw_cell: null, - pum_table_id: "", - }; - const last = body.rows.map((each) => each.variant).lastIndexOf(variant); - body.rows.splice(last === -1 ? body.rows.length : last + 1, 0, row); - return row; -} diff --git a/Z01_MasterData/Z01_MasterData_UI_Page.ts b/Z01_MasterData/Z01_MasterData_UI_Page.ts index 8cfa43bf..021e9198 100644 --- a/Z01_MasterData/Z01_MasterData_UI_Page.ts +++ b/Z01_MasterData/Z01_MasterData_UI_Page.ts @@ -15,9 +15,8 @@ import { navigateTo } from "../A00_Common/router"; import { fetchSessionUser } from "../A06_Login/A06_Login_Api_Fetch"; import { fetchBaseKinds, fetchMasterTree, type MasterGroup } from "./Z01_MasterData_Api_Fetch"; import type { ServedKind } from "./Z01_MasterData_UI_Cells"; -import { buildRowsView, type RowsView } from "./Z01_MasterData_UI_Rows"; +import { buildRowsView } from "./Z01_MasterData_UI_Rows"; import { buildSidePanel } from "./Z01_MasterData_UI_Side"; -import { buildWorkItemView } from "./Z01_MasterData_UI_WorkItem"; import "./Z01_MasterData_UI_Style.css"; export async function renderZ01MasterData(root: HTMLElement): Promise { @@ -42,32 +41,12 @@ export async function renderZ01MasterData(root: HTMLElement): Promise { } function buildPage(groups: MasterGroup[], kinds: ServedKind[]): HTMLElement { - // 오른쪽은 표 보기 · 공종 편집 둘 중 하나 — 왼쪽에서 누른 쪽만 보임. - const rows = buildRowsView(); - const items = buildWorkItemView(); - items.root.hidden = true; - const swap = (showRows: boolean): void => { - rows.root.hidden = !showRows; - items.root.hidden = showRows; - }; - const view: RowsView = { - root: rows.root, - show: (source) => { - swap(true); - rows.show(source); - }, - }; + const view = buildRowsView(); const layout = el("div", { className: "ui-workflow-layout z01-master" }); - const main = el("main", { - className: "ui-workflow-layout__main", - children: [rows.root, items.root], - }); + const main = el("main", { className: "ui-workflow-layout__main", children: [view.root] }); const overlays = createWorkflowOverlays({ title: L("Z01_MasterData_Title"), - optionsContent: buildSidePanel(groups, kinds, view, (axis) => { - swap(false); - items.show(axis); - }), + optionsContent: buildSidePanel(groups, kinds, view), showProjectName: false, onOptionsOpenChange: (isOpen) => layout.classList.toggle("is-options-open", isOpen), }); diff --git a/Z01_MasterData/Z01_MasterData_UI_Rows.ts b/Z01_MasterData/Z01_MasterData_UI_Rows.ts index 1735ed17..7309885c 100644 --- a/Z01_MasterData/Z01_MasterData_UI_Rows.ts +++ b/Z01_MasterData/Z01_MasterData_UI_Rows.ts @@ -1,11 +1,10 @@ /* ============================================================================= * Z01_MasterData_UI_Rows.ts - * 우측 표 보기 — 고른 표(트리 표 · 기초단가)의 줄을 쪽 나누기·검색으로 그리고, 기초단가는 고침 + * 우측 표 보기 — 고른 표(트리 표 · 기초단가)의 줄을 쪽 나누기·검색으로 그리고, 기초단가는 칸을 고침 * - * 한 길로 두 가지를 그림 — 트리 표는 읽기 전용, 기초단가는 `edit` 이 있어 고침. - * 칸을 누르면 표 위 「칸 설명」 줄에 고칠 수 있는지 · 못 고치는 까닭 · 산출근거가 섬 + * 한 길로 두 가지를 그림 — 트리 표는 읽기 전용, 기초단가는 `save` 가 있어 editable 칸을 고침. + * 칸을 누르면 표 위 「칸 설명」 줄에 고칠 수 있는지 · 못 고치는 까닭 · 원래 값 · 산출근거가 섬 * (2026-09-15 브레인 — 계산으로 나오는 칸은 못 고치고 왜 못 고치는지 옆에 보일 것). - * ⚠ 자동저장 금지 — 고친 칸·추가 줄·삭제 줄은 초안(`BaseDraft`)에 쌓고 [저장] 한 번에 보냄(PLAN 1-0). * ========================================================================== */ import { @@ -13,22 +12,14 @@ import { createInputField, createSelectField, el, - hideLoadingOverlay, showConfirmDialog, - showLoadingOverlay, showToast, } from "@ui/ui_template_elements"; import { t as L } from "@ui/ui_template_locale"; -import { - ApiError, - type BaseSave, - type MasterRows, - type RowsQuery, -} from "./Z01_MasterData_Api_Fetch"; +import type { MasterRows, RowsQuery } from "./Z01_MasterData_Api_Fetch"; import { boldSegments, cellInfo, - cellText, clampPage, columnTitle, filterValue, @@ -41,29 +32,24 @@ import { rowCells, shownColumns, valueWithUnit, + type CellInfo, type MasterColumn, type SortOrder, } from "./Z01_MasterData_UI_Cells"; -import { BaseDraft, type AddedRow } from "./Z01_MasterData_UI_Draft"; const PAGE_SIZE = 50; const SEARCH_DELAY_MS = 300; type Row = Record; -type LocaleKey = Parameters[0]; export interface RowsSource { title: string; key: string; - /** false 면 검색 칸을 숨김 — 서버에 검색이 없는 표 */ + /** false 면 검색 칸을 숨김 — 서버에 검색이 없는 표(고친 것 모아 보기) */ searchable?: boolean; load: (query: RowsQuery) => Promise; - /** 있으면 기초단가 — 초안에 쌓고 [저장] 한 번에 보냄 · [초기값으로]는 바로 저장 */ - edit?: { - scope: string; - save: (body: BaseSave) => Promise; - reset: (rowKeys: string[]) => Promise; - }; + /** 있으면 editable 칸을 고침 — 응답은 고친 뒤 그 줄 */ + save?: (rowId: string, values: Row) => Promise; } export interface RowsView { @@ -72,15 +58,36 @@ export interface RowsView { } /** 사전 문구의 {value} 자리에 값을 넣음. */ -function fill(key: LocaleKey, value: string): string { +function fill(key: Parameters[0], value: string): string { return L(key).replace("{value}", value); } -/** 고른 칸 — 서버 줄은 row_key(`@id`) · 저장 전 새 줄은 tmp. */ -interface Picked { - row: string; - added: boolean; - column: string; +/** + * 뜻이 바뀐 줄의 옛 이름·지금 이름 — 서버가 합쳐 한 줄로 줌(자재는 품명·규격·인도조건이 이어 붙어 옴). + * 화면은 쪼개거나 다시 합치지 않음. 안 오면 버그로 드러냄. + */ +function meaningNames(info: CellInfo): string { + if (!info.was || !info.now) return L("Z01_MasterData_State_MeaningMissing"); + return `${fill("Z01_MasterData_State_Was", info.was)} / ${fill("Z01_MasterData_State_Now", info.now)}`; +} + +/** 덮개 판정 한 줄 — 서버 state 그대로 · state 가 없으면 버그로 드러냄. */ +function stateText(info: CellInfo, column: MasterColumn): string { + const original = valueWithUnit(info.original, column.unit); + switch (info.state) { + case "meaning_changed": + // 값이 틀린 것보다 나쁨 — 같은 번호에 딴 물건이 앉음. 옛 이름·지금 이름을 나란히. + // ⚠ 이름이 안 오면 물음표로 때우지 않고 버그로 드러냄 — 물음표는 「원래 그런가 보다」로 넘김. + return `${L("Z01_MasterData_State_MeaningChanged")} — ${meaningNames(info)} · ${fill("Z01_MasterData_Edit_OriginalWas", original)}`; + case "source_changed": + return `${fill("Z01_MasterData_State_SourceChanged", valueWithUnit(info.current, column.unit))} (${fill("Z01_MasterData_Edit_OriginalWas", original)})`; + case "orphan": + return L("Z01_MasterData_State_Orphan"); + case "missing": + return L("Z01_MasterData_State_Missing"); + default: + return fill("Z01_MasterData_State_Edited", original); + } } export function buildRowsView(): RowsView { @@ -93,10 +100,7 @@ export function buildRowsView(): RowsView { }; let showHidden = false; let last: MasterRows | null = null; - let picked: Picked | null = null; - let draft: BaseDraft | null = null; - /** 409 를 받음 — 다른 곳에서 먼저 저장해 이 초안은 저장 못 함(조용히 버리지 않고 알림) */ - let stale = false; + let selected: { index: number; key: string } | null = null; let searchTimer = 0; const fetchLatest = latestOnly((from: RowsSource, query: RowsQuery) => from.load(query)); @@ -149,26 +153,12 @@ export function buildRowsView(): RowsView { className: "z01-master__pager", children: [first, prev, pageInput, pageInfo, next, end], }); - // 기초단가 고치기 — [저장]·[고친 것 버리기]·[줄 추가]·[줄 삭제]·[초기값으로] - const action = (key: LocaleKey, onClick: () => void, variant: "filled" | "ghost" = "ghost") => - createButton({ label: L(key), variant, onClick }); - const saveButton = action("Z01_MasterData_Save", () => void save(), "filled"); - const discardButton = action("Z01_MasterData_Discard", discard); - const addButton = action("Z01_MasterData_AddRow", addRow); - const deleteButton = action("Z01_MasterData_DeleteRow", toggleDelete); - const resetButton = action("Z01_MasterData_Reset", () => void reset()); - const draftStatus = el("span", { className: "z01-master__draft-status" }); - const actions = el("div", { - className: "z01-master__toolbar", - children: [saveButton, discardButton, addButton, deleteButton, resetButton, draftStatus], - }); const root = el("section", { className: "z01-master__panel", children: [ el("div", { children: [title, titleKey] }), notice, banner, - actions, toolbar, detail, grid, @@ -180,13 +170,6 @@ export function buildRowsView(): RowsView { detail.hidden = true; notice.hidden = true; banner.hidden = true; - actions.hidden = true; - // 저장 안 한 고침이 조용히 사라지지 않게 — 나갈 때 물음(자동저장은 안 만듦, CLAUDE.md 5장). - window.addEventListener("beforeunload", (event) => { - if (!draft?.count || !root.isConnected) return; - event.preventDefault(); - event.returnValue = L("Z01_MasterData_Unsaved"); - }); function goTo(page: number): void { const pages = pageCount(last?.total ?? 0, PAGE_SIZE); @@ -221,65 +204,15 @@ export function buildRowsView(): RowsView { if (!data) return; grid.classList.remove("is-loading"); last = data; - const edit = source.edit; - if (edit && data.revision !== undefined) { - // 고친 것이 남은 초안은 쪽을 넘겨도 지킴 — 그새 판이 바뀌었으면 stale 로 알림(조용히 안 버림). - if (draft?.scope !== edit.scope || !draft.count) { - draft = new BaseDraft(edit.scope, data.revision); - draft.onChange = drawActions; - } - stale = draft.revision !== data.revision; - } - picked = null; + selected = null; detail.hidden = true; draw(); } - const rowKey = (row: Row, index: number): string => - row["@id"] == null ? `#${index}` : String(row["@id"]); - - const changedColumns = (row: Row): string[] => - Array.isArray(row.changed_columns) ? (row.changed_columns as string[]) : []; - - /** 고른 서버 줄 — 저장 전 새 줄·열쇠 없는 줄이면 없음. */ - function pickedRow(): Row | undefined { - if (!picked || picked.added) return undefined; - const key = picked.row; - return last?.rows.find((row) => row["@id"] != null && String(row["@id"]) === key); - } - - /** 새 줄에 적은 글자를 수로 읽을지 — 같은 열 다른 줄 값의 꼴을 따름(코드 칸이 수로 바뀌지 않게). */ - const sample = (column: string): unknown => - last?.rows.find((row) => row[column] != null)?.[column]; - - function drawActions(): void { - // 서버가 판(revision)을 준 표만 고침 — 안 주는 표(공종 축 등 DB 밖)는 단추를 안 세움. - actions.hidden = !draft; - const count = draft?.count ?? 0; - const row = pickedRow(); - saveButton.disabled = count === 0 || stale; - discardButton.disabled = count === 0 && !stale; - addButton.disabled = !draft || stale; - deleteButton.disabled = !draft || !(picked?.added || row); - const undo = Boolean(row && draft?.deleted.has(String(row["@id"]))); - deleteButton.querySelector(".ui-btn__label")!.textContent = L( - undo ? "Z01_MasterData_UndeleteRow" : "Z01_MasterData_DeleteRow", - ); - // 초기값으로는 바로 저장 — 저장 안 한 초안이 있으면 판이 갈려 초안이 버려지니 먼저 저장·버리게 함. - resetButton.disabled = !row || count > 0 || !(changedColumns(row).length || row.is_added); - resetButton.title = count > 0 ? L("Z01_MasterData_ResetBlocked") : ""; - draftStatus.classList.toggle("is-warning", stale); - draftStatus.textContent = stale - ? L("Z01_MasterData_Draft_Stale") - : count && draft - ? `${L("Z01_MasterData_Draft_Edits")} ${draft.edits.size} · ${L("Z01_MasterData_Draft_Added")} ${draft.added.length} · ${L("Z01_MasterData_Draft_Deleted")} ${draft.deleted.size} — ${L("Z01_MasterData_Draft_Pending")}` - : L("Z01_MasterData_Draft_None"); - } - function headCell(meta: MasterRows, column: MasterColumn): HTMLElement { const th = el("th", { children: [el("span", { text: columnTitle(column) })] }); const marks: [string, string][] = []; - if (source?.edit && meta.editable?.includes(column.key)) { + if (source?.save && meta.editable?.includes(column.key)) { marks.push(["✎", L("Z01_MasterData_Edit_Can")]); } const reason = meta.locked?.[column.key]; @@ -353,11 +286,39 @@ export function buildRowsView(): RowsView { const columns = shownColumns(meta.columns, showHidden); const headRow = el("tr", { children: columns.map((column) => headCell(meta, column)) }); const body = el("tbody"); - // 저장 전 새 줄은 어느 쪽에서나 맨 위 — 쪽을 넘겨도 안 사라짐. - for (const added of draft?.added ?? []) body.append(addedRow(meta, columns, added)); - meta.rows.forEach((row, index) => body.append(serverRow(meta, columns, row, index))); + meta.rows.forEach((row, index) => { + const texts = rowCells(row, columns); + const tr = el("tr"); + columns.forEach((column, i) => { + const info = cellInfo(meta, row, column.key); + const td = el("td", { text: texts[i], attrs: { title: texts[i] } }); + if (info.state) { + // 원본이 바뀐 칸은 줄째 또렷이 — 흐리면 옛 값이 조용히 계속 쓰임(2026-09-15 브레인). + td.classList.add("is-overridden", `is-${info.state.replaceAll("_", "-")}`); + if (info.state !== "edited") { + // 뜻 바뀜은 값 어긋남보다 나쁨 — 표시부터 더 세게(2026-09-16 브레인). + td.textContent = `${info.state === "meaning_changed" ? "⛔" : "⚠"} ${texts[i]}`; + tr.classList.add(info.state === "meaning_changed" ? "has-danger" : "has-warning"); + } + td.title = stateText(info, column); + } + const canEdit = Boolean(source?.save) && info.editable && row["@id"] != null; + if (canEdit) td.classList.add("is-editable"); + if (selected?.index === index && selected.key === column.key) + td.classList.add("is-selected"); + td.addEventListener("click", () => { + if (td.querySelector("input")) return; + grid.querySelector("td.is-selected")?.classList.remove("is-selected"); + selectCell(index, column); + td.classList.add("is-selected"); + if (canEdit) startEdit(td, index, column); + }); + tr.append(td); + }); + body.append(tr); + }); grid.replaceChildren( - body.children.length + meta.rows.length ? el("table", { className: "z01-master__grid", children: [el("thead", { children: [headRow] }), body], @@ -370,100 +331,25 @@ export function buildRowsView(): RowsView { pageInfo.textContent = `/ ${pages.toLocaleString("ko-KR")} ${L("Z01_MasterData_Page")} · ${meta.total.toLocaleString("ko-KR")} ${L("Z01_MasterData_Rows")}`; first.disabled = prev.disabled = state.page <= 1; next.disabled = end.disabled = state.page >= pages; - drawActions(); - } - - const isPicked = (row: string, added: boolean, column: string): boolean => - picked?.row === row && picked.added === added && picked.column === column; - - function serverRow(meta: MasterRows, columns: MasterColumn[], row: Row, index: number) { - const key = rowKey(row, index); - const texts = rowCells(row, columns); - const changed = changedColumns(row); - const deleted = draft?.deleted.has(key) ?? false; - const tr = el("tr"); - if (row.is_added) tr.classList.add("is-added"); - if (deleted) tr.classList.add("is-deleted"); - columns.forEach((column, i) => { - const info = cellInfo(meta, row, column.key); - const stored = row[column.key]; - const pending = draft?.edit(key, column.key); - const text = pending ? cellText(pending.value, column.unit) : texts[i]; - const td = el("td", { text, attrs: { title: text } }); - // 고친 칸 표시 — 저장 전(초안) · 저장했고 초기값과 다름(서버 changed_columns) - if (pending) td.classList.add("is-draft"); - else if (changed.includes(column.key)) td.classList.add("is-changed"); - const canEdit = Boolean(draft) && info.editable && row["@id"] != null && !deleted; - if (canEdit) td.classList.add("is-editable"); - if (isPicked(key, false, column.key)) td.classList.add("is-selected"); - td.addEventListener("click", () => { - if (td.querySelector("input")) return; - pick(td, { row: key, added: false, column: column.key }); - if (!canEdit) return; - startEdit(td, pending ? pending.value : stored, stored ?? sample(column.key), (value) => - draft?.setEdit(key, column.key, value, stored), - ); - }); - tr.append(td); - }); - return tr; - } - - function addedRow(meta: MasterRows, columns: MasterColumn[], added: AddedRow) { - const tr = el("tr", { className: "is-new", attrs: { title: L("Z01_MasterData_Row_New") } }); - for (const column of columns) { - const value = added.data[column.key]; - const td = el("td", { text: cellText(value, column.unit) }); - // 새 줄은 식으로 나오는 칸만 빼고 다 채움 — 열쇠·이름도 사람이 넣어야 줄이 섬. - const canEdit = !meta.formula?.[column.key]; - if (canEdit) td.classList.add("is-editable"); - if (isPicked(added.tmp, true, column.key)) td.classList.add("is-selected"); - td.addEventListener("click", () => { - if (td.querySelector("input")) return; - pick(td, { row: added.tmp, added: true, column: column.key }); - if (!canEdit) return; - startEdit( - td, - value, - sample(column.key), - (next) => draft?.setAdded(added.tmp, column.key, next), - true, - ); - }); - tr.append(td); - } - return tr; - } - - function pick(td: HTMLElement, next: Picked): void { - grid.querySelector("td.is-selected")?.classList.remove("is-selected"); - td.classList.add("is-selected"); - picked = next; - showDetail(); - drawActions(); } /** - * 칸 설명 줄 — 고칠 수 있나 · 못 고치는 까닭 · 저장 전 고침 · 초기값과 다름 · 식과 값 넣은 식. - * `failure` = 방금 고침이 안 들어간 까닭 — 토스트만 뜨고 사라지면 사람은 들어간 줄 앎(브레인 ③). + * 칸 설명 줄 — 고칠 수 있나 · 못 고치는 까닭 · 원래 값(되돌리기) · 식과 값 넣은 식. + * `failure` = 방금 저장이 안 된 까닭 — 토스트만 뜨고 사라지면 사람은 저장된 줄 앎(브레인 ③). */ - function showDetail(failure?: string): void { - const at = picked; - const column = last?.columns.find((each) => each.key === at?.column); - if (!last || !at || !column) return; - const row = at.added - ? (draft?.added.find((each) => each.tmp === at.row)?.data ?? {}) - : (pickedRow() ?? last.rows[Number(at.row.slice(1))] ?? {}); + function selectCell(index: number, column: MasterColumn, failure?: string): void { + if (!last) return; + selected = { index, key: column.key }; + const row = last.rows[index]; const info = cellInfo(last, row, column.key); const lines: HTMLElement[] = [el("strong", { text: columnTitle(column) })]; - const line = (text: string, warn = false) => { - const span = el("span", { className: "z01-master__detail-line", text }); - span.classList.toggle("is-warning", warn); - return span; - }; - if (failure) lines.push(line(fill("Z01_MasterData_Edit_NotSaved", failure), true)); - if (at.added) lines.push(line(L("Z01_MasterData_Row_New"))); - else if (source?.edit) { + const line = (text: string) => el("span", { className: "z01-master__detail-line", text }); + if (failure) { + const failed = line(fill("Z01_MasterData_Edit_NotSaved", failure)); + failed.classList.add("is-warning"); + lines.push(failed); + } + if (source?.save) { lines.push( line( info.editable @@ -471,14 +357,30 @@ export function buildRowsView(): RowsView { : `${L("Z01_MasterData_Edit_Locked")} — ${info.reason ?? L("Z01_MasterData_Edit_NotListed")}`, ), ); - const pending = draft?.edit(at.row, column.key); - if (pending) { - const value = valueWithUnit(pending.value, column.unit); - lines.push(line(fill("Z01_MasterData_Cell_Draft", value))); + } + if (info.state) { + const stateLine = line(stateText(info, column)); + if (info.state !== "edited") stateLine.classList.add("is-warning"); + lines.push(stateLine); + // 단추 글자에 무엇으로 바뀌는지 값을 넣음 — 안 보이고 누르면 금액이 말없이 바뀜(브레인). + // 뜻이 바뀐 줄에서 「새 원본 값으로 받기」는 위험 — 글자를 가르고 한 번 더 물음(브레인 ③). + const target = + info.state === "meaning_changed" + ? fill("Z01_MasterData_Edit_DropOnMeaning", valueWithUnit(info.current, column.unit)) + : info.state === "source_changed" + ? fill("Z01_MasterData_Edit_TakeSource", valueWithUnit(info.current, column.unit)) + : info.state === "orphan" + ? null + : fill("Z01_MasterData_Edit_RevertTo", valueWithUnit(info.original, column.unit)); + if (target && source?.save) { + lines.push( + createButton({ + label: target, + variant: info.state === "meaning_changed" ? "danger" : "ghost", + onClick: () => void drop(index, column, info), + }), + ); } - if (changedColumns(row).includes(column.key)) - lines.push(line(L("Z01_MasterData_Cell_Changed"))); - if (row.is_added) lines.push(line(L("Z01_MasterData_Row_Added"))); } if (info.rule) lines.push(line(`${L("Z01_MasterData_Formula")} ${info.rule}`)); if (info.filled) lines.push(line(info.filled)); @@ -486,38 +388,31 @@ export function buildRowsView(): RowsView { detail.hidden = false; } - /** - * 칸 고치기 — Enter·칸 나감 = 초안에 넣음(서버엔 안 감) · Esc = 그대로. - * `typeOf` = 수로 읽을지 가르는 본보기 값 · `allowEmpty` = 비우면 칸을 뺌(새 줄). - */ - function startEdit( - td: HTMLElement, - current: unknown, - typeOf: unknown, - apply: (value: unknown) => void, - allowEmpty = false, - ): void { + function startEdit(td: HTMLElement, index: number, column: MasterColumn): void { + if (!last) return; + const current = last.rows[index][column.key]; const input = el("input", { className: "ui-input z01-master__cell-input" }); input.value = current == null ? "" : String(current); td.replaceChildren(input); input.focus(); input.select(); let finished = false; - const finish = (keep: boolean): void => { + const finish = (save: boolean): void => { if (finished) return; finished = true; - const empty = allowEmpty && input.value.trim() === ""; - const value = !keep ? current : empty ? null : parseCellInput(input.value, typeOf); + const value = save ? parseCellInput(input.value, current) : current; if (value === undefined) { const why = fill("Z01_MasterData_Edit_Invalid", input.value); showToast(why, "error"); draw(); - showDetail(why); + selectCell(index, column, why); return; } - if (keep) apply(value); - draw(); - showDetail(); + if (value === current) { + draw(); + return; + } + void commit(index, column, value); }; input.addEventListener("keydown", (event) => { if (event.key === "Enter") finish(true); @@ -526,87 +421,59 @@ export function buildRowsView(): RowsView { input.addEventListener("blur", () => finish(true)); } - function addRow(): void { - draft?.addRow(); - draw(); - } - - function toggleDelete(): void { - if (!draft || !picked) return; - if (picked.added) { - draft.removeAdded(picked.row); - picked = null; - detail.hidden = true; - } else if (pickedRow()) { - draft.toggleDelete(picked.row); + /** 고침 버리기 — 뜻이 바뀐 줄은 한 번 더 묻고(딴 물건에 값이 붙은 자리라 되돌리기와 뜻이 다름). */ + async function drop(index: number, column: MasterColumn, info: CellInfo): Promise { + if (info.state === "meaning_changed") { + const ok = await showConfirmDialog( + `${meaningNames(info)}\n${L("Z01_MasterData_Edit_MeaningConfirm")}`, + L("Z01_MasterData_Edit_DropConfirm"), + ); + if (!ok) return; } - draw(); + await commit(index, column, null); } - function discard(): void { - draft?.clear(); - stale = false; - void load(); - } - - /** [저장] — 초안 한 벌을 보냄. 409 면 초안을 지키고 알림(다른 곳에서 먼저 저장함). */ - async function save(): Promise { - const edit = source?.edit; - const active = draft; - if (!edit || !active?.count) return; - showLoadingOverlay(); + /** 저장 — null 은 덮개에서 그 칸을 빼 원래 값으로 되돌림. */ + async function commit(index: number, column: MasterColumn, value: unknown): Promise { + const from = source; + const table = last; + const rowId = table?.rows[index]["@id"]; + if (!from?.save || !table || rowId == null) return; try { - await edit.save(active.payload()); - active.clear(); - showToast(L("Z01_MasterData_Saved"), "success"); - void load(); + const updated = await from.save(String(rowId), { [column.key]: value }); + if (from !== source || table !== last) return; + table.rows[index] = updated; + draw(); + selectCell(index, column); + showToast( + L(value === null ? "Z01_MasterData_Edit_Reverted" : "Z01_MasterData_Edit_Saved"), + "success", + ); } catch (error) { - if (error instanceof ApiError && error.status === 409) stale = true; - showToast(error instanceof Error ? error.message : L("Z01_MasterData_Edit_Failed"), "error"); - drawActions(); - } finally { - hideLoadingOverlay(); + const why = error instanceof Error ? error.message : L("Z01_MasterData_Edit_Failed"); + showToast(why, "error"); + if (from !== source || table !== last) return; + draw(); + selectCell(index, column, why); } } - /** [초기값으로] — 고른 줄을 seed 로(추가한 줄은 지워짐) · 바로 저장이라 한 번 물음. */ - async function reset(): Promise { - const edit = source?.edit; - const row = pickedRow(); - if (!edit || !row || draft?.count) return; - const ok = await showConfirmDialog(L("Z01_MasterData_ResetConfirm"), L("Z01_MasterData_Reset")); - if (!ok) return; - showLoadingOverlay(); - try { - await edit.reset([String(row["@id"])]); - showToast(L("Z01_MasterData_ResetDone"), "success"); - void load(); - } catch (error) { - showToast(error instanceof Error ? error.message : L("Z01_MasterData_Edit_Failed"), "error"); - } finally { - hideLoadingOverlay(); - } - } - - function show(next: RowsSource): void { - source = next; + function show(picked: RowsSource): void { + source = picked; state.page = 1; state.sort = null; state.filters = {}; filterBox.replaceChildren(); - title.textContent = next.title; - titleKey.textContent = next.key; + title.textContent = picked.title; + titleKey.textContent = picked.key; notice.hidden = true; banner.hidden = true; - search.root.hidden = next.searchable === false; + search.root.hidden = picked.searchable === false; toolbar.hidden = false; pager.hidden = false; detail.hidden = true; last = null; - picked = null; - draft = null; - stale = false; - actions.hidden = true; + selected = null; grid.replaceChildren(); void load(); } diff --git a/Z01_MasterData/Z01_MasterData_UI_Side.ts b/Z01_MasterData/Z01_MasterData_UI_Side.ts index 3a3f6860..0e958c6d 100644 --- a/Z01_MasterData/Z01_MasterData_UI_Side.ts +++ b/Z01_MasterData/Z01_MasterData_UI_Side.ts @@ -12,22 +12,25 @@ import { t as L } from "@ui/ui_template_locale"; import { fetchBasePrices, fetchMasterRows, - resetBasePrices, - saveBasePrices, + fetchOverrides, type MasterGroup, + type MasterRows, + type RowsQuery, + saveBasePrice, VALUES_TABLE_ID, - type WorkItemAxis, } from "./Z01_MasterData_Api_Fetch"; -import { groupKinds, type ServedKind } from "./Z01_MasterData_UI_Cells"; +import { + groupKinds, + valueWithUnit, + type OverrideState, + type ServedKind, +} from "./Z01_MasterData_UI_Cells"; import type { RowsView } from "./Z01_MasterData_UI_Rows"; -const AXES: WorkItemAxis[] = ["forest", "const"]; - export function buildSidePanel( groups: MasterGroup[], kinds: ServedKind[], view: RowsView, - openWorkItems: (axis: WorkItemAxis) => void, ): HTMLElement { const panel = el("div", { className: "z01-master__side" }); const activate = (button: HTMLElement): void => { @@ -56,32 +59,29 @@ export function buildSidePanel( title: `${box.label} › ${served.label}`, key: `base-prices/${served.kind}`, load: (query) => fetchBasePrices(served.kind, query), - edit: { - scope: `base:${served.kind}`, - save: (body) => saveBasePrices(served.kind, body), - reset: (rowKeys) => resetBasePrices(served.kind, rowKeys), - }, + save: (rowId, values) => saveBasePrice(served.kind, rowId, values), }); }); grid.append(button); } return { label: box.label, grid }; }); - - // 공종 편집 — 구성 줄을 고치고 「입력 필요」 공종을 메움(PLAN 1-4). - const workGrid = el("div", { className: "z01-master__base-grid" }); - for (const axis of AXES) { - const button = el("button", { - className: "z01-master__base", - attrs: { type: "button" }, - text: L(axis === "forest" ? "Z01_WorkItem_Axis_Forest" : "Z01_WorkItem_Axis_Const"), + const overridesButton = el("button", { + className: "z01-master__base z01-master__base--wide", + attrs: { type: "button" }, + text: L("Z01_MasterData_Overrides"), + }); + overridesButton.addEventListener("click", () => { + activate(overridesButton); + view.show({ + title: L("Z01_MasterData_Overrides"), + key: "overrides", + searchable: false, + // 갈래 이름도 서버 것 — 목록 줄의 kind 를 표 이름으로 바꿔 보임. + load: (query) => loadOverrides(query, new Map(kinds.map((k) => [k.kind, k.label]))), }); - button.addEventListener("click", () => { - activate(button); - openWorkItems(axis); - }); - workGrid.append(button); - } + }); + boxes[0]?.grid.append(overridesButton); const tree = el("nav", { className: "z01-master__tree" }); for (const group of groups) { @@ -132,13 +132,54 @@ export function buildSidePanel( panel.append( ...boxes.map((box) => section(box.label, box.grid)), - section(L("Z01_WorkItem_Title"), workGrid), section(L("Z01_MasterData_Tree"), tree), ); attachCollapsible(panel); return panel; } +const STATE_LABEL: Record[0]> = { + meaning_changed: "Z01_MasterData_List_MeaningChanged", + source_changed: "Z01_MasterData_List_SourceChanged", + orphan: "Z01_MasterData_List_Orphan", + edited: "Z01_MasterData_List_Edited", +}; + +/** + * 고친 것 목록을 표 한 벌로 — 정렬(원본 바뀜 → 주인 없음 → 고쳐짐)과 쪽 나눔은 서버가 함. + * 화면이 다시 줄 세우면 맨 위가 그 쪽 안에서만 맨 위가 됨(2026-09-15 브레인 ②). 서버에 검색이 없어 검색 칸은 숨김. + */ +async function loadOverrides( + query: RowsQuery, + kindLabels: Map, +): Promise { + const { items, total } = await fetchOverrides(query); + const column = (key: string, label: Parameters[0]) => ({ key, label: L(label) }); + return { + columns: [ + column("state", "Z01_MasterData_List_State"), + column("kind", "Z01_MasterData_List_Kind"), + column("row_label", "Z01_MasterData_List_Row"), + column("column_label", "Z01_MasterData_List_Column"), + column("value", "Z01_MasterData_List_Value"), + column("original", "Z01_MasterData_List_Original"), + column("current", "Z01_MasterData_List_Current"), + ], + rows: items.map((item) => ({ + ...item, + value: valueWithUnit(item.value, item.unit), + original: valueWithUnit(item.original, item.unit), + ...(Object.hasOwn(item, "current") + ? { current: valueWithUnit(item.current, item.unit) } + : {}), + // state 가 안 오면 때우지 않고 드러냄(서버 버그). + state: L(STATE_LABEL[item.state] ?? "Z01_MasterData_State_Missing"), + kind: kindLabels.get(item.kind) ?? item.kind, + })), + total, + }; +} + function section(title: string, body: HTMLElement): HTMLElement { return el("section", { className: "z01-master__section ui-collapsible ui-sidebar-section", diff --git a/Z01_MasterData/Z01_MasterData_UI_Style.css b/Z01_MasterData/Z01_MasterData_UI_Style.css index 24640741..b62321c4 100644 --- a/Z01_MasterData/Z01_MasterData_UI_Style.css +++ b/Z01_MasterData/Z01_MasterData_UI_Style.css @@ -315,204 +315,3 @@ width: 6em; text-align: right; } - -/* ── 고치기 — 저장 전 초안 · 저장된 고침(초기값과 다름) · 새 줄 · 지울 줄 (PLAN 1-4) ── */ -.z01-master__grid td.is-draft, -.z01-wi__field.is-draft { - background: color-mix(in srgb, var(--color-warning) 24%, var(--color-canvas)); - font-weight: var(--font-weight-bold); -} - -.z01-master__grid td.is-changed, -.z01-wi__field.is-changed { - background: var(--color-mist-violet); - color: var(--color-accent); -} - -.z01-master__grid tr.is-new td { - background: color-mix(in srgb, var(--color-success) 12%, var(--color-canvas)); -} - -.z01-master__grid tr.is-added td:first-child { - box-shadow: inset 4px 0 0 var(--color-success); -} - -.z01-master__grid tr.is-deleted td { - color: var(--color-text-muted); - text-decoration: line-through; -} - -.z01-master__draft-status { - color: var(--color-text-secondary); - font-size: var(--text-body-sm); -} - -.z01-master__draft-status.is-warning { - color: var(--color-danger); - font-weight: var(--font-weight-bold); -} - -/* ── 공종 편집 — 왼쪽 목록 / 오른쪽 머리·구성 줄·원문 ── */ -.z01-master__panel.z01-wi { - display: grid; - grid-template-columns: minmax(200px, 260px) minmax(0, 1fr); - align-items: start; - gap: var(--spacing-16); -} - -.z01-wi__side { - display: flex; - flex-direction: column; - gap: var(--spacing-8); - position: sticky; - top: 0; -} - -.z01-wi__list { - display: flex; - flex-direction: column; - max-height: calc(100vh - 260px); - overflow: auto; - border: 1px solid var(--color-border); - border-radius: var(--radius-cards); -} - -.z01-wi__list.is-loading { - opacity: 0.5; -} - -.z01-wi__item { - display: grid; - grid-template-columns: minmax(0, 1fr) auto auto; - align-items: center; - gap: var(--spacing-4) var(--spacing-8); - padding: var(--spacing-4) var(--spacing-8); - border: 0; - border-bottom: 1px solid var(--color-border); - background: transparent; - color: var(--color-text-body); - font: inherit; - font-size: var(--text-body-sm); - text-align: left; - cursor: pointer; -} - -.z01-wi__item:hover { - background: var(--color-paper); -} - -.z01-wi__item.is-active { - background: var(--color-mist-violet); - color: var(--color-accent); -} - -.z01-wi__item-name { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.z01-wi__status { - color: var(--color-text-secondary); - font-size: var(--text-caption); -} - -.z01-wi__status.is-needs-input, -.z01-wi__status.is-partial, -.z01-wi__unmatched { - color: var(--color-danger); - font-weight: var(--font-weight-bold); -} - -.z01-wi__status.is-reviewed { - color: var(--color-success); -} - -.z01-wi__editor { - display: flex; - flex-direction: column; - gap: var(--spacing-12); - min-width: 0; -} - -.z01-wi__head { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); - gap: var(--spacing-8) var(--spacing-16); - padding: var(--spacing-8) var(--spacing-12); - border: 1px solid var(--color-border); - border-radius: var(--radius-cards); - background: var(--color-surface); - font-size: var(--text-body-sm); -} - -.z01-wi__head:empty { - display: none; -} - -.z01-wi__field { - display: flex; - flex-direction: column; - gap: 2px; - padding: 2px var(--spacing-4); - border-radius: var(--radius-sm); -} - -.z01-wi__label { - color: var(--color-text-secondary); - font-size: var(--text-caption); -} - -.z01-wi__heading { - margin: 0; - color: var(--color-text); - font-size: var(--text-body); -} - -.z01-wi__variant { - margin: var(--spacing-8) 0 var(--spacing-4); - color: var(--color-text-secondary); - font-size: var(--text-body-sm); -} - -.z01-wi__grid td { - padding: 2px var(--spacing-4); -} - -.z01-wi__grid input, -.z01-wi__grid select { - min-width: 4em; - padding: 2px var(--spacing-4); - font-size: 12px; -} - -.z01-wi__grid select { - min-width: 6em; -} - -.z01-wi__grid input[type="number"] { - width: 6em; -} - -.z01-wi__finder { - display: flex; - flex-direction: column; - gap: var(--spacing-8); - padding: var(--spacing-8) var(--spacing-12); - border: 2px solid var(--color-accent); - border-radius: var(--radius-cards); - background: var(--color-surface); -} - -.z01-wi__found { - display: flex; - flex-direction: column; - max-height: 240px; - overflow: auto; -} - -.z01-wi__notes { - margin: 0; - padding-left: 1.2em; - font-size: var(--text-body-sm); -} diff --git a/Z01_MasterData/Z01_MasterData_UI_WorkItem.ts b/Z01_MasterData/Z01_MasterData_UI_WorkItem.ts deleted file mode 100644 index 51ee3e9f..00000000 --- a/Z01_MasterData/Z01_MasterData_UI_WorkItem.ts +++ /dev/null @@ -1,409 +0,0 @@ -/* ============================================================================= - * Z01_MasterData_UI_WorkItem.ts - * 공종 편집 — 왼쪽 목록(상태·검색) / 머리 / 구성 줄 표 / 품셈 원문 표+[주] (PLAN 1-4) - * - * 자동 추출이 못 읽은 공종(「입력 필요」·「일부 못 맞춤」)을 관리자가 화면에서 메움. - * ⚠ 자동저장 금지 — 고친 것은 초안(sessionStorage `z01-draft:work_item:{key}`)에 쌓고 - * [저장] 한 번에 머리 + 전체 줄을 보냄 · 판(revision)이 다르면 409 → 초안을 지키고 알림. - * [초기값으로]·[검수 완료]도 서버에 바로 씀 — 화면을 잠그는 오버레이는 이 셋에만(CLAUDE.md 5장). - * ========================================================================== */ - -import { - createButton, - createInputField, - createSelectField, - el, - hideLoadingOverlay, - showConfirmDialog, - showLoadingOverlay, - showToast, -} from "@ui/ui_template_elements"; -import { t as L } from "@ui/ui_template_locale"; -import { - ApiError, - fetchWorkItem, - fetchWorkItems, - resetWorkItem, - saveWorkItem, - type WorkItemAxis, - type WorkItemDetail, - type WorkItemHead, - type WorkItemList, - type WorkItemListRow, - type WorkItemStatus, -} from "./Z01_MasterData_Api_Fetch"; -import { latestOnly, pageCount } from "./Z01_MasterData_UI_Cells"; -import { - freshBody, - hasDraft, - isDirty, - readDraft, - same, - workItemPayload, - writeDraft, - type WorkItemBody, -} from "./Z01_MasterData_UI_Draft"; -import { renderSource, renderWorkRows } from "./Z01_MasterData_UI_WorkItem_Rows"; - -type LocaleKey = Parameters[0]; - -const PAGE_SIZE = 50; -const SEARCH_DELAY_MS = 300; - -/** 목록 차례 — 메울 것부터 */ -const STATUSES: WorkItemStatus[] = ["needs_input", "partial", "auto_ok", "not_item", "reviewed"]; -const STATUS_LABEL: Record = { - needs_input: "Z01_WorkItem_Status_NeedsInput", - partial: "Z01_WorkItem_Status_Partial", - auto_ok: "Z01_WorkItem_Status_AutoOk", - not_item: "Z01_WorkItem_Status_NotItem", - reviewed: "Z01_WorkItem_Status_Reviewed", -}; - -const scopeOf = (key: string): string => `work_item:${key}`; - -export interface WorkItemView { - root: HTMLElement; - show: (axis: WorkItemAxis) => void; -} - -export function buildWorkItemView(): WorkItemView { - const list = { - axis: "forest" as WorkItemAxis, - status: "" as WorkItemStatus | "", - q: "", - page: 1, - }; - let listData: WorkItemList | null = null; - let detail: WorkItemDetail | null = null; - let body: WorkItemBody | null = null; - /** 409 를 받음 — 다른 곳에서 먼저 저장해 이 초안은 저장 못 함 */ - let stale = false; - let searchTimer = 0; - const fetchList = latestOnly(fetchWorkItems); - const fetchOne = latestOnly(fetchWorkItem); - - // ── 왼쪽 목록 ── - const statusBox = el("div"); - const search = createInputField({ - type: "search", - placeholder: L("Z01_MasterData_Search"), - onInput: (value) => { - window.clearTimeout(searchTimer); - searchTimer = window.setTimeout(() => { - list.q = value.trim(); - list.page = 1; - void loadList(); - }, SEARCH_DELAY_MS); - }, - }); - const listBox = el("div", { className: "z01-wi__list" }); - const pageInfo = el("span"); - const prev = createButton({ - label: L("Z01_MasterData_Prev"), - variant: "ghost", - onClick: () => { - list.page -= 1; - void loadList(); - }, - }); - const next = createButton({ - label: L("Z01_MasterData_Next"), - variant: "ghost", - onClick: () => { - list.page += 1; - void loadList(); - }, - }); - const side = el("aside", { - className: "z01-wi__side", - children: [ - statusBox, - search.root, - listBox, - el("div", { className: "z01-master__pager", children: [prev, pageInfo, next] }), - ], - }); - - // ── 오른쪽 편집 ── - const title = el("h2", { className: "z01-master__title", text: L("Z01_WorkItem_Pick") }); - const titleKey = el("span", { className: "z01-master__key" }); - const action = (key: LocaleKey, onClick: () => void, variant: "filled" | "ghost" = "ghost") => - createButton({ label: L(key), variant, onClick }); - const saveButton = action("Z01_MasterData_Save", () => void save(), "filled"); - const discardButton = action("Z01_MasterData_Discard", discard); - const resetButton = action("Z01_MasterData_Reset", () => void reset()); - const reviewButton = action("Z01_WorkItem_Review", () => void save("reviewed")); - const draftStatus = el("span", { className: "z01-master__draft-status" }); - const actions = el("div", { - className: "z01-master__toolbar", - children: [saveButton, discardButton, resetButton, reviewButton, draftStatus], - }); - const head = el("div", { className: "z01-wi__head" }); - const rowsBox = el("div"); - const sourceBox = el("div"); - const editor = el("section", { - className: "z01-wi__editor", - children: [el("div", { children: [title, titleKey] }), actions, head, rowsBox, sourceBox], - }); - actions.hidden = true; - const root = el("section", { className: "z01-master__panel z01-wi", children: [side, editor] }); - // 저장 안 한 고침이 조용히 사라지지 않게 — 나갈 때 물음. - window.addEventListener("beforeunload", (event) => { - if (!detail || !body || !isDirty(detail, body) || !root.isConnected) return; - event.preventDefault(); - event.returnValue = L("Z01_MasterData_Unsaved"); - }); - - async function loadList(): Promise { - listBox.classList.add("is-loading"); - let data: WorkItemList | undefined; - try { - data = await fetchList({ ...list, size: PAGE_SIZE }); - } catch (error) { - listBox.classList.remove("is-loading"); - showToast(error instanceof Error ? error.message : L("Z01_MasterData_LoadFailed"), "error"); - return; - } - if (!data) return; - listBox.classList.remove("is-loading"); - listData = data; - drawList(); - } - - function drawList(): void { - if (!listData) return; - const counts = listData.counts ?? {}; - const all = STATUSES.reduce((sum, status) => sum + (counts[status] ?? 0), 0); - statusBox.replaceChildren( - createSelectField({ - label: L("Z01_WorkItem_Status"), - options: [ - { value: "", text: `${L("Z01_WorkItem_Status_All")} (${all.toLocaleString("ko-KR")})` }, - ...STATUSES.map((status) => ({ - value: status, - text: `${L(STATUS_LABEL[status])} (${(counts[status] ?? 0).toLocaleString("ko-KR")})`, - })), - ], - value: list.status, - onChange: (value) => { - list.status = value as WorkItemStatus | ""; - list.page = 1; - void loadList(); - }, - }).root, - ); - listBox.replaceChildren( - ...(listData.items.length - ? listData.items.map(itemButton) - : [el("p", { className: "z01-master__note", text: L("Z01_MasterData_NoRows") })]), - ); - const pages = pageCount(listData.total, PAGE_SIZE); - pageInfo.textContent = `${list.page} / ${pages} · ${listData.total.toLocaleString("ko-KR")}`; - prev.disabled = list.page <= 1; - next.disabled = list.page >= pages; - } - - function itemButton(row: WorkItemListRow): HTMLElement { - // 저장 안 한 초안이 남은 공종은 ✎ — 다른 공종으로 넘어가도 초안은 탭에 남음. - const pending = hasDraft(scopeOf(row.work_item_key)) ? "✎ " : ""; - const button = el("button", { - className: "z01-wi__item", - attrs: { type: "button", title: `${row.work_item_key} · ${row.path_name}` }, - children: [ - el("span", { className: "z01-wi__item-name", text: `${row.number} ${row.path_name}` }), - el("span", { - className: `z01-wi__status is-${row.status.replace("_", "-")}`, - text: L(STATUS_LABEL[row.status]), - }), - el("span", { className: "z01-master__key", text: `${pending}${row.row_count}` }), - ], - }); - button.classList.toggle("is-active", detail?.item.work_item_key === row.work_item_key); - button.addEventListener("click", () => void open(row.work_item_key)); - return button; - } - - async function open(key: string): Promise { - let data: WorkItemDetail | undefined; - try { - data = await fetchOne(key); - } catch (error) { - showToast(error instanceof Error ? error.message : L("Z01_MasterData_LoadFailed"), "error"); - return; - } - if (data) take(data); - } - - /** 받은 상세를 폄 — 같은 판 초안이 탭에 있으면 이어서. 저장·초기값 응답도 같은 모양이라 여기로. */ - function take(data: WorkItemDetail): void { - detail = data; - stale = false; - const key = data.item.work_item_key; - body = readDraft(scopeOf(key), data.item.revision) ?? freshBody(data); - drawEditor(); - drawList(); - } - - function drawEditor(): void { - if (!detail || !body) return; - const item = detail.item; - title.textContent = `${item.number} ${item.path_name}`; - titleKey.textContent = item.work_item_key; - actions.hidden = false; - head.replaceChildren(...headFields(detail, body)); - rowsBox.replaceChildren( - renderWorkRows(body, detail, (rebuild) => { - touched(); - if (rebuild) drawEditor(); - }), - ); - sourceBox.replaceChildren(renderSource(detail)); - drawActions(); - } - - /** 고침마다 — 초안을 탭에 두고(같아지면 지움) 단추·상태 글자를 맞춤. */ - function touched(): void { - if (!detail || !body) return; - const dirty = isDirty(detail, body); - writeDraft(scopeOf(detail.item.work_item_key), detail.item.revision, dirty ? body : null); - drawActions(); - drawList(); // 목록의 ✎ 표시를 맞춤 - } - - function drawActions(): void { - const dirty = Boolean(detail && body && isDirty(detail, body)); - saveButton.disabled = !dirty || stale; - discardButton.disabled = !dirty && !stale; - // 초기값으로는 바로 저장 — 저장 안 한 초안이 있으면 먼저 저장·버리게 함. - resetButton.disabled = dirty; - resetButton.title = dirty ? L("Z01_MasterData_ResetBlocked") : ""; - reviewButton.disabled = stale || (!dirty && detail?.item.status === "reviewed"); - draftStatus.classList.toggle("is-warning", stale); - draftStatus.textContent = stale - ? L("Z01_MasterData_Draft_Stale") - : L(dirty ? "Z01_WorkItem_Dirty" : "Z01_MasterData_Draft_None"); - } - - /** [저장] — status 를 주면 그 상태로 찍어 저장([검수 완료]). */ - async function save(status?: WorkItemStatus): Promise { - if (!detail || !body) return; - const key = detail.item.work_item_key; - const payload = workItemPayload(detail.item.revision, body); - if (status) payload.item.status = status; - showLoadingOverlay(); - try { - const saved = await saveWorkItem(key, payload); - writeDraft(scopeOf(key), detail.item.revision, null); - showToast(L("Z01_MasterData_Saved"), "success"); - take(saved); - void loadList(); - } catch (error) { - if (error instanceof ApiError && error.status === 409) stale = true; - showToast(error instanceof Error ? error.message : L("Z01_MasterData_Edit_Failed"), "error"); - drawActions(); - } finally { - hideLoadingOverlay(); - } - } - - function discard(): void { - if (!detail) return; - writeDraft(scopeOf(detail.item.work_item_key), detail.item.revision, null); - void open(detail.item.work_item_key); - } - - async function reset(): Promise { - if (!detail || (body && isDirty(detail, body))) return; - const key = detail.item.work_item_key; - const ok = await showConfirmDialog(L("Z01_WorkItem_ResetConfirm"), L("Z01_MasterData_Reset")); - if (!ok) return; - showLoadingOverlay(); - try { - const restored = await resetWorkItem(key); - showToast(L("Z01_MasterData_ResetDone"), "success"); - take(restored); - void loadList(); - } catch (error) { - showToast(error instanceof Error ? error.message : L("Z01_MasterData_Edit_Failed"), "error"); - } finally { - hideLoadingOverlay(); - } - } - - /** 머리 — 열쇠·번호·경로·상위·판은 읽기만 · 이름·기준 수량·기준 단위·상태는 고침. */ - function headFields(shown: WorkItemDetail, draft: WorkItemBody): HTMLElement[] { - const item = shown.item; - const field = (label: LocaleKey, control: HTMLElement | string) => - el("label", { - className: "z01-wi__field", - children: [el("span", { className: "z01-wi__label", text: L(label) }), control], - }); - const readOnly = (label: LocaleKey, value: unknown) => - field(label, value == null || value === "" ? "—" : String(value)); - const editable = ( - label: LocaleKey, - key: K, - control: HTMLInputElement | HTMLSelectElement, - read: (raw: string) => WorkItemHead[K], - ) => { - const wrap = field(label, control); - // 저장 전 고침(초안) · 저장했고 초기값과 다름(서버 changed_columns) - const mark = () => { - const pending = !same(draft.item[key], item[key]); - wrap.classList.toggle("is-draft", pending); - wrap.classList.toggle( - "is-changed", - !pending && Boolean(item.changed_columns?.includes(key)), - ); - }; - control.value = draft.item[key] == null ? "" : String(draft.item[key]); - control.addEventListener("change", () => { - draft.item[key] = read(control.value.trim()); - mark(); - touched(); - }); - mark(); - return wrap; - }; - const input = (type: "text" | "number") => - el("input", { - className: "ui-input", - attrs: type === "number" ? { type, min: "0", step: "any" } : { type }, - }); - const status = el("select", { className: "ui-select" }); - for (const each of STATUSES) status.append(new Option(L(STATUS_LABEL[each]), each)); - return [ - readOnly("Z01_WorkItem_Key", item.work_item_key), - readOnly("Z01_WorkItem_Number", item.number), - readOnly( - "Z01_WorkItem_Parent", - [item.parent_key, item.parent_mode].filter(Boolean).join(" · "), - ), - readOnly("Z01_WorkItem_Edition", item.edition), - editable("Z01_WorkItem_Name", "name", input("text"), (raw) => raw), - editable("Z01_WorkItem_BasisQuantity", "basis_quantity", input("number"), (raw) => - raw === "" ? null : Number(raw), - ), - editable("Z01_WorkItem_BasisUnit", "basis_unit", input("text"), (raw) => raw || null), - editable("Z01_WorkItem_Status", "status", status, (raw) => raw as WorkItemStatus), - ]; - } - - function show(axis: WorkItemAxis): void { - Object.assign(list, { axis, status: "", q: "", page: 1 }); - search.input.value = ""; - detail = null; - body = null; - stale = false; - title.textContent = L("Z01_WorkItem_Pick"); - titleKey.textContent = ""; - actions.hidden = true; - head.replaceChildren(); - rowsBox.replaceChildren(); - sourceBox.replaceChildren(); - void loadList(); - } - - return { root, show }; -} diff --git a/Z01_MasterData/Z01_MasterData_UI_WorkItem_Rows.ts b/Z01_MasterData/Z01_MasterData_UI_WorkItem_Rows.ts deleted file mode 100644 index 121ae081..00000000 --- a/Z01_MasterData/Z01_MasterData_UI_WorkItem_Rows.ts +++ /dev/null @@ -1,374 +0,0 @@ -/* ============================================================================= - * Z01_MasterData_UI_WorkItem_Rows.ts - * 공종 편집 아래쪽 — 구성 줄 표(갈래별) · 자원 찾기(기초단가 검색) · 품셈 원문 표 + [주](읽기 전용) - * - * 칸을 고치면 초안(`WorkItemBody`)만 바꿈 — 서버엔 [저장] 때 전체 줄을 한 번에 보냄(PLAN 1-0). - * 못 맞춘 줄(resource_key 없음)은 또렷이 — 자원 찾기로 기초단가 줄을 골라 이음. - * ========================================================================== */ - -import { createButton, el, showToast } from "@ui/ui_template_elements"; -import { t as L } from "@ui/ui_template_locale"; -import { - fetchBasePrices, - type ResourceKind, - type WorkItemDetail, - type WorkItemRow, -} from "./Z01_MasterData_Api_Fetch"; -import { cellText, latestOnly } from "./Z01_MasterData_UI_Cells"; -import { - addRow, - changedFields, - groupByVariant, - type DraftRow, - type WorkItemBody, -} from "./Z01_MasterData_UI_Draft"; - -type LocaleKey = Parameters[0]; - -const KIND_LABEL: Record = { - labor: "Z01_WorkItem_Kind_Labor", - machine: "Z01_WorkItem_Kind_Machine", - material: "Z01_WorkItem_Kind_Material", - etc: "Z01_WorkItem_Kind_Etc", -}; - -/** - * 자원 찾기 — resource_kind 가 기초단가 kind 이름과 같음(노임·기계·자재 · 기타는 기초단가에 없음). - * 이름·규격 칸은 서버 `row_label` 과 같은 칸을 씀. - */ -type Findable = Exclude; -const FINDABLE: Record = { - labor: { name: "occupation_name" }, - machine: { name: "machine_name", spec: "specification" }, - material: { name: "classification_name", spec: "specification" }, -}; -const FIND_SIZE = 20; -const SEARCH_DELAY_MS = 300; - -const COLUMNS: LocaleKey[] = [ - "Z01_WorkItem_Col_Kind", - "Z01_WorkItem_Col_Resource", - "Z01_WorkItem_Col_Spec", - "Z01_WorkItem_Col_Key", - "Z01_WorkItem_Col_Amount", - "Z01_WorkItem_Col_Unit", - "Z01_WorkItem_Col_Alt", - "Z01_WorkItem_Col_Ratio", - "Z01_WorkItem_Col_Raw", - "Z01_WorkItem_Col_Table", - "Z01_WorkItem_Col_Delete", -]; - -let tmpSeq = 0; -const tmpId = (): string => `new-${Date.now()}-${++tmpSeq}`; - -/** rebuild = 줄 수·갈래·자원이 바뀜(다시 그림) · false = 칸 값만 바뀜(초점 지킴) */ -export type RowsChanged = (rebuild: boolean) => void; - -export function renderWorkRows( - body: WorkItemBody, - detail: WorkItemDetail, - changed: RowsChanged, -): HTMLElement { - const finder = buildFinder(() => changed(true)); - const box = el("div", { - className: "z01-wi__rows", - children: [el("h3", { className: "z01-wi__heading", text: L("Z01_WorkItem_Rows") })], - }); - const groups = groupByVariant(body.rows); - // 줄이 하나도 없는 공종(입력 필요) — 갈래 없는 빈 묶음 하나로 [줄 추가] 를 세움. - if (!groups.length) groups.push({ variant: "", indexes: [] }); - for (const group of groups) box.append(variantBlock(group.variant, group.indexes)); - - const variantInput = el("input", { - className: "ui-input", - attrs: { placeholder: L("Z01_WorkItem_VariantName") }, - }); - const addVariant = createButton({ - label: L("Z01_WorkItem_AddVariant"), - variant: "ghost", - onClick: () => { - const name = variantInput.value.trim(); - if (!name) return; - addRow(body, name, tmpId()); - changed(true); - }, - }); - box.append( - el("div", { className: "z01-master__toolbar", children: [variantInput, addVariant] }), - finder.root, - ); - return box; - - function variantBlock(variant: string, indexes: number[]): HTMLElement { - const head = el("tr", { children: COLUMNS.map((key) => el("th", { text: L(key) })) }); - const table = el("table", { - className: "z01-master__grid z01-wi__grid", - children: [ - el("thead", { children: [head] }), - el("tbody", { children: indexes.map((index) => rowLine(body.rows[index])) }), - ], - }); - const add = createButton({ - label: L("Z01_MasterData_AddRow"), - variant: "ghost", - onClick: () => { - addRow(body, variant, tmpId()); - changed(true); - }, - }); - return el("div", { - className: "z01-wi__group", - children: [ - el("h4", { className: "z01-wi__variant", text: variant || L("Z01_WorkItem_NoVariant") }), - el("div", { className: "z01-master__grid-wrap", children: [table] }), - add, - ], - }); - } - - function rowLine(row: DraftRow): HTMLElement { - const tr = el("tr"); - const cells: [keyof WorkItemRow, HTMLElement][] = []; - // 고친 칸 표시 — 저장 전(초안 · 새 줄은 줄째) · 저장했고 초기값과 다름(서버 changed_columns) - const saved = row.changed_columns ?? []; - tr.classList.toggle("is-added", Boolean(row.is_added)); - const mark = (): void => { - const diff = changedFields(row, detail.rows); - tr.classList.toggle("is-new", diff === "added"); - tr.classList.toggle("is-deleted", Boolean(row.deleted)); - for (const [field, td] of cells) { - const draft = diff !== "added" && diff.has(field); - td.classList.toggle("is-draft", draft); - td.classList.toggle("is-changed", !draft && saved.includes(field)); - } - }; - const cell = (field: keyof WorkItemRow, ...children: (HTMLElement | string)[]) => { - const td = el("td", { children }); - cells.push([field, td]); - tr.append(td); - return td; - }; - const set = (field: keyof WorkItemRow, value: unknown): void => { - (row as unknown as Record)[field] = value; - mark(); - changed(false); - }; - const text = (field: "resource_name" | "resource_spec" | "amount_unit") => { - const input = el("input", { className: "ui-input" }); - input.value = row[field] ?? ""; - input.addEventListener("change", () => set(field, input.value.trim())); - return input; - }; - const number = ( - field: "amount" | "alternative_amount" | "group_ratio_pct", - ): HTMLInputElement => { - const input = el("input", { - className: "ui-input", - attrs: { type: "number", min: "0", step: "any" }, - }); - input.value = row[field] == null ? "" : String(row[field]); - input.addEventListener("change", () => { - const raw = input.value.trim(); - set(field, raw === "" ? null : Number(raw)); - }); - return input; - }; - - const kind = el("select", { className: "ui-select" }); - for (const each of Object.keys(KIND_LABEL) as ResourceKind[]) { - kind.append(new Option(L(KIND_LABEL[each]), each)); - } - kind.value = row.resource_kind; - // 종류가 바뀌면 이은 열쇠는 다른 표의 것 — 풀어 두고 다시 찾게 함. - kind.addEventListener("change", () => { - row.resource_kind = kind.value as ResourceKind; - row.resource_key = null; - changed(true); - }); - cell("resource_kind", kind); - cell("resource_name", text("resource_name")); - cell("resource_spec", text("resource_spec")); - const key = row.resource_key - ? el("span", { text: row.resource_key }) - : el("span", { className: "z01-wi__unmatched", text: L("Z01_WorkItem_Unmatched") }); - const find = createButton({ - label: L("Z01_WorkItem_Find"), - variant: "ghost", - disabled: row.resource_kind === "etc", - onClick: () => finder.open(row), - }); - cell("resource_key", key, find); - cell("amount", number("amount")); - cell("amount_unit", text("amount_unit")); - cell("alternative_amount", number("alternative_amount")); - cell("group_ratio_pct", number("group_ratio_pct")); - cell( - "raw_cell", - el("span", { text: row.raw_cell ?? "", attrs: { title: row.raw_cell ?? "" } }), - ); - cell("pum_table_id", row.pum_table_id ?? ""); - const drop = createButton({ - label: L(row.deleted ? "Z01_MasterData_UndeleteRow" : "Z01_MasterData_DeleteRow"), - variant: "ghost", - onClick: () => { - // 새 줄은 바로 뺌 · 서버 줄은 줄 긋고 [저장] 때 뺌(되살릴 수 있게) - if (row.id === undefined) body.rows.splice(body.rows.indexOf(row), 1); - else row.deleted = !row.deleted; - changed(true); - }, - }); - tr.append(el("td", { children: [drop] })); - mark(); - return tr; - } -} - -/** 자원 찾기 상자 — 기초단가 검색 API 로 찾아 한 줄을 고르면 그 줄에 열쇠·이름·규격을 넣음. */ -function buildFinder(picked: () => void): { root: HTMLElement; open: (row: DraftRow) => void } { - let target: DraftRow | null = null; - let timer = 0; - const search = latestOnly(fetchBasePrices); - const title = el("strong"); - const kind = el("select", { className: "ui-select" }); - for (const each of Object.keys(FINDABLE) as Findable[]) { - kind.append(new Option(L(KIND_LABEL[each]), each)); - } - const input = el("input", { - className: "ui-input", - attrs: { type: "search", placeholder: L("Z01_MasterData_Search") }, - }); - const results = el("div", { className: "z01-wi__found" }); - const close = createButton({ - label: L("Z01_WorkItem_FindClose"), - variant: "ghost", - onClick: () => { - root.hidden = true; - }, - }); - const root = el("div", { - className: "z01-wi__finder", - children: [ - title, - el("div", { className: "z01-master__toolbar", children: [kind, input, close] }), - results, - ], - }); - root.hidden = true; - kind.addEventListener("change", () => void run()); - input.addEventListener("input", () => { - window.clearTimeout(timer); - timer = window.setTimeout(() => void run(), SEARCH_DELAY_MS); - }); - - async function run(): Promise { - const from = kind.value as Findable; - let data; - try { - data = await search(from, { page: 1, size: FIND_SIZE, q: input.value.trim() }); - } catch (error) { - showToast(error instanceof Error ? error.message : L("Z01_MasterData_LoadFailed"), "error"); - return; - } - if (!data) return; - const fields = FINDABLE[from]; - results.replaceChildren( - ...(data.rows.length - ? data.rows.map((row) => { - const name = cellText(row[fields.name]); - const spec = fields.spec ? cellText(row[fields.spec]) : ""; - const button = el("button", { - className: "z01-wi__item", - attrs: { type: "button" }, - children: [ - el("span", { className: "z01-wi__item-name", text: `${name} ${spec}`.trim() }), - el("span", { className: "z01-master__key", text: cellText(row["@id"]) }), - ], - }); - button.addEventListener("click", () => { - if (!target) return; - target.resource_kind = from; - target.resource_key = String(row["@id"]); - target.resource_name = name; - target.resource_spec = spec; - root.hidden = true; - picked(); - }); - return button; - }) - : [el("p", { className: "z01-master__note", text: L("Z01_WorkItem_FindNone") })]), - ); - } - - function open(row: DraftRow): void { - target = row; - kind.value = row.resource_kind === "etc" ? "material" : row.resource_kind; - input.value = row.resource_name; - title.textContent = `${L("Z01_WorkItem_FindTitle")} — ${row.resource_name || row.raw_cell || ""}`; - results.replaceChildren(); - root.hidden = false; - root.scrollIntoView({ block: "nearest" }); - void run(); - } - - return { root, open }; -} - -/** 품셈 원문 표 + [주] — 읽기 전용(값을 고칠 때 옆에 두고 봄). */ -export function renderSource(detail: WorkItemDetail): HTMLElement { - const box = el("div", { - className: "z01-wi__source", - children: [el("h3", { className: "z01-wi__heading", text: L("Z01_WorkItem_Source") })], - }); - if (!detail.source.length) { - box.append(el("p", { className: "z01-master__note", text: L("Z01_WorkItem_NoSource") })); - } - for (const table of detail.source) { - const caption = [table.pum_table_id, table.section, table.pum_form].filter(Boolean).join(" · "); - const heads = cells(table.condition_note); - const rows = Array.isArray(table.raw_row) ? (table.raw_row as unknown[]) : []; - const grid = el("table", { className: "z01-master__grid" }); - if (heads.length) { - grid.append( - el("thead", { - children: [el("tr", { children: heads.map((h) => el("th", { text: h })) })], - }), - ); - } - grid.append( - el("tbody", { - children: rows.map((row) => - el("tr", { - children: cells(row).map((c) => el("td", { text: c, attrs: { title: c } })), - }), - ), - }), - ); - box.append( - el("h4", { className: "z01-wi__variant", text: caption }), - el("div", { className: "z01-master__grid-wrap", children: [grid] }), - ); - } - const notes = detail.notes ?? []; - if (notes.length) { - box.append( - el("h4", { className: "z01-wi__variant", text: L("Z01_WorkItem_Notes") }), - el("ul", { - className: "z01-wi__notes", - children: notes.map((note) => el("li", { text: noteText(note) })), - }), - ); - } - return box; -} - -/** 원문 칸 — 목록이면 칸마다 · 글자 하나면 한 칸. */ -function cells(value: unknown): string[] { - if (Array.isArray(value)) return value.map((each) => cellText(each)); - return value == null ? [] : [cellText(value)]; -} - -function noteText(note: unknown): string { - if (note && typeof note === "object" && "text" in note) return cellText(note.text); - return cellText(note); -} diff --git a/Z01_MasterData/Z01_MasterData_WorkItems.py b/Z01_MasterData/Z01_MasterData_WorkItems.py index c62360a5..23c8d85b 100644 --- a/Z01_MasterData/Z01_MasterData_WorkItems.py +++ b/Z01_MasterData/Z01_MasterData_WorkItems.py @@ -7,15 +7,11 @@ — 빠지면 발파암(절취 0.1 + 깍기 0.9 + 집토 1) 금액이 틀어짐. `@id` = 불변 열쇠(FW-·CW-) — 없는 줄은 목차 코드로 서고 알림에 드러냄. ⚠ 읽기만 — 고칠 칸 없음(원문 값 풀기 8-7 뒤). 원본 `work_item_code`(FP-)는 B08·B09 가 씀 — 안 건드림. - -공종 편집(DB 정본 · 2026-09-18 PLAN 1-0) — 맨 아래 「공종 편집」 절. `master_work_item`·`_row` 를 -고치는 규칙만 순수 함수로(DB 없이 시험) · SQL 은 `Z01_MasterData_Repository_WorkItems`. """ from __future__ import annotations import json -from decimal import Decimal from functools import lru_cache from pathlib import Path from typing import Any @@ -296,131 +292,3 @@ def extra(kind: str) -> dict[str, Any]: "units": len(rows), }, } - - -# ── 공종 편집 — DB 표 `master_work_item`·`master_work_item_row` 를 고치는 규칙(PLAN 1-0 계약) ── - -STATUSES = ("auto_ok", "partial", "needs_input", "not_item", "reviewed") -#: 관리자가 고치는 칸 — [초기값으로] 도 이 칸만 seed 에서 되살림 -HEAD_FIELDS = ("name", "basis_quantity", "basis_unit", "status") -ROW_FIELDS = ( - "variant", - "resource_kind", - "resource_key", - "resource_name", - "resource_spec", - "amount", - "amount_unit", - "alternative_amount", - "group_ratio_pct", - "raw_cell", - "pum_table_id", -) -_HIDDEN = ("id", "work_item_id", "seed", "source", "notes", "is_deleted") - - -def revision_scope(key: str) -> str: - return f"work_item:{key}" - - -def _same(a: Any, b: Any) -> bool: - """칸 값이 같은가 — 숫자는 값으로(DB `1.500000` = 요청 `1.5` = seed `1.5`) · 빈 글자 = NULL.""" - numbers = (int, float, Decimal) - if isinstance(a, numbers) and isinstance(b, numbers): - return Decimal(str(a)) == Decimal(str(b)) - return (None if a == "" else a) == (None if b == "" else b) - - -def changed_columns(current: dict[str, Any], seed: dict[str, Any] | None, fields) -> list[str]: - """초기값과 다른 칸 — 관리자 추가 줄(seed 없음)은 빈 목록(`is_added` 로 드러남).""" - if seed is None: - return [] - return [f for f in fields if f in seed and not _same(current.get(f), seed[f])] - - -def detail(head: dict[str, Any], rows: list[dict[str, Any]], revision: int) -> dict[str, Any]: - """GET 응답 — 머리(+revision) · 구성 줄 · 원문 표 · [주]. seed 는 안 내보내고 고친 칸 이름만.""" - seed = head.get("seed") - return { - "item": { - **{k: v for k, v in head.items() if k not in _HIDDEN}, - "revision": revision, - "changed_columns": changed_columns(head, seed, HEAD_FIELDS), - }, - "rows": [ - { - **{k: v for k, v in row.items() if k not in _HIDDEN or k == "id"}, - "is_added": row.get("seed") is None, - "changed_columns": changed_columns(row, row.get("seed"), ROW_FIELDS), - } - for row in rows - ], - "source": head.get("source") or [], - "notes": head.get("notes") or [], - } - - -def check_rows( - rows: list[dict[str, Any]], existing_ids: set[int], known_keys: set[str] -) -> list[str]: - """[저장] 서버 검사 중 DB 와 맞춰 볼 것 — 모양(숫자 ≥0 · 종류 · 모르는 칸)은 요청 모델이 봄.""" - errors, seen = [], set() - for number, row in enumerate(rows, 1): - row_id = row.get("id") - if row_id is not None: - if row_id not in existing_ids: - errors.append(f"{number}번째 줄: 이 공종에 없는 줄(id {row_id})") - elif row_id in seen: - errors.append(f"{number}번째 줄: 같은 줄(id {row_id})이 두 번 옴") - seen.add(row_id) - key = row.get("resource_key") - if key is not None and key not in known_keys: - errors.append(f"{number}번째 줄: 기초단가에 없는 자원 열쇠 {key}") - return errors - - -def plan_rows( - existing: list[dict[str, Any]], incoming: list[dict[str, Any]] -) -> dict[str, list[Any]]: - """전체 줄 보내기 → 쓸 것. existing = 지금 살아 있는 줄 · incoming 순서 = sort_order. - - id 있음 → 수정(바뀐 줄만) · id 없음 → 추가 · 빠진 줄 → 초기값 줄은 숨김(`is_deleted` · - [초기값으로] 가 살림) · 관리자 추가 줄은 지움. - """ - by_id = {row["id"]: row for row in existing} - updates, inserts = [], [] - for order, row in enumerate(incoming): - values = {f: row.get(f) for f in ROW_FIELDS} | {"sort_order": order} - old = by_id.get(row.get("id")) - if old is None: - inserts.append(values) - elif any(not _same(old.get(f), v) for f, v in values.items()): - updates.append({"id": old["id"], **values}) - kept = {row.get("id") for row in incoming} - gone = [row for row in existing if row["id"] not in kept] - return { - "updates": updates, - "inserts": inserts, - "hide": [row["id"] for row in gone if row.get("seed") is not None], - "drop": [row["id"] for row in gone if row.get("seed") is None], - } - - -def reset_plan(head: dict[str, Any], rows: list[dict[str, Any]]) -> dict[str, Any]: - """[초기값으로] — 머리·줄을 seed 로(seed 에 있는 칸만) · 숨긴 초기값 줄도 살림 · 추가 줄은 지움. - - rows = 숨긴 줄까지 전부. 쓰기 모양은 `plan_rows` 와 같음(+ `head`). - """ - seed = head.get("seed") or {} - restore = (*ROW_FIELDS, "sort_order") - return { - "head": {f: seed[f] for f in HEAD_FIELDS if f in seed}, - "updates": [ - {"id": row["id"], **{f: row["seed"][f] for f in restore if f in row["seed"]}} - for row in rows - if row.get("seed") is not None - ], - "inserts": [], - "hide": [], - "drop": [row["id"] for row in rows if row.get("seed") is None], - } diff --git a/main.py b/main.py index 3d48f738..85f2344a 100644 --- a/main.py +++ b/main.py @@ -76,7 +76,6 @@ 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 Z01_MasterData.Z01_MasterData_Router_WorkItems import router as z01_work_items_router from common_util.common_util_audit import note_api_call, record_call_burst from common_util.common_util_auth import ( require_company, @@ -660,7 +659,6 @@ 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(z01_work_items_router, dependencies=system_admin_only) # 개발 전용 잠금 해제 — 다른 라우터와 **같은 보호**를 받는다(로그인·회사·프로젝트 접근). # 그 위에 서버가 환경까지 한 번 더 본다. app.include_router(dev_unlock_router, dependencies=protected_with_company) diff --git a/resources/knowledge/original/_pipeline/pum_md_tool.py b/resources/knowledge/original/_pipeline/pum_md_tool.py index bf75c103..42b5d5f3 100644 --- a/resources/knowledge/original/_pipeline/pum_md_tool.py +++ b/resources/knowledge/original/_pipeline/pum_md_tool.py @@ -19,6 +19,7 @@ import difflib import hashlib import re import sys +import unicodedata from dataclasses import dataclass from pathlib import Path @@ -29,7 +30,8 @@ from resources.tester.test_const_pdf_coverage import _NUM, _page_rows # noqa: E COST = ROOT / "resources/knowledge/original/원가계산" -#: 책마다 — PDF · 차례 쪽(PDF 쪽 번호) · 인쇄 1쪽이 놓인 PDF 쪽 · 머리 「문서」 칸 · 새 md 뿌리 +#: 책마다 — PDF · 차례 쪽(PDF 쪽 번호) · 인쇄 1쪽이 놓인 PDF 쪽 · 머리 「문서」 칸 · 새 md 뿌리 · +#: 차례 모양(block = 번호·이름·쪽이 줄마다 · inline = 한 줄에) · 절 머리 번호 뒤 마침표 · 쪽 꼬리(맨 아래 줄) BOOKS = { "산림": { "pdf": COST / "산림_표준품셈/첨부/(산림청고시 제2025-82호) 산림사업 표준품셈.pdf", @@ -37,6 +39,21 @@ BOOKS = { "first_body": 13, "doc": "산림사업 표준품셈(산림청고시 제2025-82호)", "out": COST / "산림_표준품셈/본문", + "toc_layout": "block", + "dot": True, + "footer": re.compile(r"^-\s*\d+\s*-$"), # 「- 123 -」 + }, + "건설": { + "pdf": COST / "건설공사_표준품셈/2026년_건설공사_표준품셈.pdf", + "toc": (3, 51), + "first_body": 57, + "doc": "2026 건설공사 표준품셈", + "out": COST / "건설공사_표준품셈/본문", + "toc_layout": "inline", + "dot": False, # 「1-5 기타」 + "footer": re.compile( + r"^\d+\s+\S+부문$|^제\s*\d+\s*장.*\s\d+$" + ), # 「30 공통부문」·「제1장 적용기준 31」 }, } @@ -72,15 +89,15 @@ class Entry: page: int # 인쇄 쪽 -def toc_entries(doc, first: int, last: int) -> list[Entry]: - """차례 쪽(PDF first~last)의 줄 — 번호 줄 · 이름 줄(점선) · 쪽 줄이 차례로 옴.""" - lines = [ - line - for number in range(first - 1, last) - for line in doc[number].get_text().splitlines() - if line.strip() not in _TOC_SKIP +def toc_entries(doc, book: dict) -> list[Entry]: + """차례 쪽의 줄 → 차례 줄 목록(건설은 부문 줄 `공통부문` 도 끼움 · 쪽 0).""" + first, last = book["toc"] + raw = [ + line for number in range(first - 1, last) for line in doc[number].get_text().splitlines() ] - return parse_toc(lines) + if book["toc_layout"] == "inline": + return parse_toc_inline(raw) + return parse_toc([line for line in raw if line.strip() not in _TOC_SKIP]) def parse_toc(raw: list[str]) -> list[Entry]: @@ -102,6 +119,31 @@ def parse_toc(raw: list[str]) -> list[Entry]: return out +_INLINE = re.compile(r"^(\d+-\d+(?:-\d+)*)\s*(.*?)\s*[·․…]{3,}\s*(\d+)\s*$") +_DIVISION = re.compile(r"^\S+부문$") + + +def parse_toc_inline(raw: list[str]) -> list[Entry]: + """건설 차례 — 절·항은 「1-1 일반사항····3」 한 줄 · 장은 「제1장 / 적용기준 / 3」 · 부문은 「공통부문」 한 줄.""" + lines = [line.strip() for line in raw if line.strip()] + out, i = [], 0 + while i < len(lines): + line = lines[i] + if found := _INLINE.match(line): + out.append(Entry(found[1], found[2], int(found[3]))) + elif re.fullmatch(r"제\d+장", line): + out.append(Entry(line, lines[i + 1], int(lines[i + 2]))) + i += 2 + elif _DIVISION.match(line): + out.append(Entry(line, "", 0)) + elif not ( + line.replace(" ", "") == "목차" or line.isdigit() + ): # 쪽 머리 「목차」 · 차례 쪽 번호 + raise ValueError(f"차례 모양이 다름: {line!r}") + i += 1 + return out + + #: 가운뎃점 여러 벌 — 차례는 「보수․복구」(U+2024) · 본문은 「보수·복구」(U+00B7). 맞대기에서만 같게 봄. _DOTS = str.maketrans({"․": "·", "ㆍ": "·", "・": "·", "‧": "·"}) @@ -122,13 +164,13 @@ def locate(doc, marker: str, first_pdf: int, slack: int = 3) -> tuple[int, int]: raise ValueError(f"표지를 못 찾음: {marker} (PDF {first_pdf}~{first_pdf + slack})") -def heading_pattern(ident: str) -> re.Pattern: +def heading_pattern(ident: str, dot: bool = True) -> re.Pattern: """본문 머리 줄 — **번호로** 찾음. 차례 이름에 오타가 있어서(「면벅」=면벽 · 「조림」=조립 …).""" if ident.startswith("제"): return re.compile(r"^제\s*" + ident[1:-1] + r"\s*장(?!\d)") if ident.startswith("부록"): - return re.compile(r"^\[?" + re.escape(ident) + r"\]?(?!\d)") - return re.compile(r"^" + re.escape(ident) + r"\.(?!\d)") + return re.compile(r"^\[?부록\s*" + ident[2:] + r"\]?(?!\d)") # 「[부록 1]」 + return re.compile(r"^" + re.escape(ident) + (r"\." if dot else "") + r"(?![\d-])") #: 글자 사이 빈칸으로 볼 틈(글자 크기 대비) — 본문 머리 실측: 빈칸 7.7pt · 붙은 글자 0.7pt(14pt 글꼴) @@ -154,19 +196,40 @@ def visual_text(page, row: str) -> str: return row -def find_heading(doc, ident: str, first_pdf: int, slack: int = 3) -> tuple[int, int, str]: +def find_heading( + doc, ident: str, first_pdf: int, slack: int = 3, dot: bool = True +) -> tuple[int, int, str]: """(PDF 쪽, 쪽 안 줄 차례, 머리 글자) — 머리 글자는 PDF 그대로(번호 뒤 마침표 포함) · 띄어쓰기는 쪽 그림대로.""" - pattern = heading_pattern(ident) + pattern = heading_pattern(ident, dot) for number in range(first_pdf, min(first_pdf + slack, doc.page_count) + 1): for index, row in enumerate(_page_rows(doc[number - 1])): if pattern.match(row.strip()): - return number, index, visual_text(doc[number - 1], row.strip()) + title = visual_text(doc[number - 1], row.strip()) + cut = pattern.match(title).end() + lead, name = title[:cut].strip(), title[cut:].strip() + return number, index, f"{lead} {join_spaced(name)}".strip() raise ValueError(f"머리를 못 찾음: {ident} (PDF {first_pdf}~{first_pdf + slack})") -def name_of(ident: str, title: str) -> str: +def join_spaced(name: str) -> str: + """자간을 벌려 찍은 이름은 붙임(「측 량」 → 「측량」 · 규칙 3장) — 이름 전체가 한 글자씩일 때만.""" + parts = name.split(" ") + if len(parts) > 1 and all(len(p) == 1 and "가" <= p <= "힣" for p in parts): + return "".join(parts) + return name + + +def name_of(ident: str, title: str, dot: bool = True) -> str: """머리 글자에서 번호를 뗀 이름(「9-5. 발파암」 → 「발파암」).""" - return title[heading_pattern(ident).match(title).end() :].strip() + return title[heading_pattern(ident, dot).match(title).end() :].strip() + + +#: 파일 이름에서 뗄 개정 표지 — 「수치지도 작성('21, '22, '24, '26년 보완)」(머리 글자에는 남김) +_REVISION = re.compile(r"\s*\([^()]*(?:보완|신설|개정|삭제)[^()]*\)\s*$") + + +def file_label(ident: str, title: str, dot: bool = True) -> str: + return safe(_REVISION.sub("", name_of(ident, title, dot))) def claimed_elsewhere(root: Path) -> set[str]: @@ -231,87 +294,149 @@ def read_head(path: Path) -> dict[str, str]: raise ValueError(f"머리 끝 없음: {path}") -_SLOT = re.compile(r"제(\d+)장_[^/]*/(\d+-\d+)_") +#: 자리 — (부문 폴더) / 장 번호 / 절(·항) 번호. 이름이 달라도 번호가 같으면 같은 자리 +_SLOT = re.compile(r"(?:([^/]+)/)?제(\d+)장_[^/]*/(\d+-\d+(?:-\d+)?)_") +#: 한 파일 쪽 상한 — 넘는 절은 항(N-N-N) 단위로 쪼갬(규칙 1장) +_MAX_PAGES = 40 + + +def _body_rows(page, footer: re.Pattern) -> list[str]: + """쪽의 줄 — 맨 아래 쪽 꼬리(쪽 번호 · 장 이름)와 이어짐 표지 「→」 는 뺌.""" + rows = [row.strip() for row in _page_rows(page)] + if rows and footer.match(rows[-1]): + rows = rows[:-1] + return [row for row in rows if row != "→"] + + +def _blank(page, footer: re.Pattern) -> bool: + return len(re.sub(r"\s", "", "".join(_body_rows(page, footer)))) < _EMPTY_PAGE_CHARS + + +def _span_of(doc, book: dict, entry: Entry, following: Entry | None, cover: str = ""): + """(시작 PDF 쪽, 머리 글자, 끝 PDF 쪽, 끝표지) — 끝은 다음 머리 앞 · 부문 표지 앞 · 뒤 빈 쪽 뺌.""" + offset, dot, footer = book["first_body"] - 1, book["dot"], book["footer"] + start, _, title = find_heading(doc, entry.ident, entry.page + offset, dot=dot) + if following is None: # 문서 맨 끝 + end, marker = doc.page_count, "끝" + else: # 장 마지막 절이면 다음 장 제목 · 부록 앞이면 부록 제목 + nxt, at, marker = find_heading(doc, following.ident, following.page + offset, dot=dot) + end = nxt - 1 if at == 0 else nxt + for page in range(nxt - 1, start, -1) if cover else (): # 다음 부문 표지 쪽 앞에서 끊음 + if any(r.strip() == cover for r in _page_rows(doc[page - 1])[:3]): + end = page - 1 + break + while end > start and _blank(doc[end - 1], footer): + end -= 1 + return start, title, max(end, start), marker def plan(book_name: str) -> list[Path]: - """장마다 `0-00_장머리.md` + 절마다 빈 파일(머리만 · 상태 대기). + """장마다 `0-00_장머리.md` + 절마다 빈 파일(머리만 · 상태 대기) · 40쪽 넘는 절은 `N-NN-00_절머리.md` + 항마다. **이미 있는 자리는 안 건드림** — 이 폴더에 있거나 다른 창 브랜치에 있는 장·절(이름이 달라도 번호로 봄). + 건설은 부문 폴더(`01_공통부문`) 아래 · 부문마다 장 번호가 1부터. """ import pymupdf book = BOOKS[book_name] - out = book["out"] + out, dot, footer = book["out"], book["dot"], book["footer"] offset = book["first_body"] - 1 # 인쇄 쪽 + offset = PDF 쪽 have = claimed_elsewhere(out) | {p.relative_to(out).as_posix() for p in out.rglob("*.md")} - taken = {f"{int(m[1])}/{m[2]}" for m in map(_SLOT.match, have) if m} - folders = {int(m[1]): rel.split("/")[0] for rel in have if (m := _SLOT.match(rel))} + taken = {f"{m[1] or ''}/{int(m[2])}/{m[3]}" for m in map(_SLOT.match, have) if m} + folders = { + (m[1] or "", int(m[2])): rel.split("/")[-2] for rel in have if (m := _SLOT.match(rel)) + } written = [] + + def write(division, chapter_no, slot, file_name, start, title, end, marker, doc) -> None: + if f"{division}/{chapter_no}/{slot}" in taken: + return + # 그림 쪽 — 글자층 없이 그림만 있는 쪽이 끼면 받아쓰기는 그림 기준 + drawn = any( + _blank(doc[p - 1], footer) and doc[p - 1].get_images() for p in range(start, end + 1) + ) + path = out / division / folders[(division, chapter_no)] / file_name + path.parent.mkdir(parents=True, exist_ok=True) + values = {"문서": book["doc"], "절": title, "시작표지": title, "끝표지": marker} + values |= {"PDF쪽": _span(start, end), "인쇄쪽": _span(start - offset, end - offset)} + values |= {"상태": "대기", "원천": "그림" if drawn else "글자층"} + path.write_text(head_text(values), encoding="utf-8") + written.append(path) + with pymupdf.open(book["pdf"]) as doc: - entries = toc_entries(doc, *book["toc"]) - # 경계가 되는 차례 줄 — 장 · 절 · 부록N(항은 절 안 · 머리 없는 「부록」 묶음 줄은 뺌) - bounds = [e for e in entries if e.ident != "부록" and e.ident.count("-") < 2] - chapter_no = None + entries = toc_entries(doc, book) + # 경계가 되는 차례 줄 — 부문 · 장 · 절 · 부록N(항은 절 안 · 머리 없는 「부록」 묶음 줄은 뺌) + at = [i for i, e in enumerate(entries) if e.ident != "부록" and e.ident.count("-") < 2] + bounds = [entries[i] for i in at] + division, divisions, chapter_no = "", 0, None for n, entry in enumerate(bounds): + if _DIVISION.match(entry.ident): + divisions += 1 + division, chapter_no = f"{divisions:02d}_{entry.ident}", None + continue if entry.ident.startswith("부록"): continue - start_pdf, _, title = find_heading(doc, entry.ident, entry.page + offset) - following = bounds[n + 1] if n + 1 < len(bounds) else None - if following is None: # 문서 맨 끝 절 - end_pdf, end_marker = doc.page_count, "끝" - else: # 장 마지막 절이면 다음 장 제목 · 부록 앞이면 부록 제목 - next_pdf, at, end_marker = find_heading( - doc, following.ident, following.page + offset - ) - end_pdf = max(next_pdf - 1 if at == 0 else next_pdf, start_pdf) + j = next( + (k for k in range(n + 1, len(bounds)) if not _DIVISION.match(bounds[k].ident)), None + ) + following = bounds[j] if j is not None else None + cover = bounds[j - 1].ident if j is not None and j - 1 > n else "" # 사이에 낀 부문 + start, title, end, marker = _span_of(doc, book, entry, following, cover) if entry.ident.startswith("제"): chapter_no = int(entry.ident[1:-1]) folders.setdefault( - chapter_no, f"제{chapter_no:02d}장_{safe(name_of(entry.ident, title))}" + (division, chapter_no), + f"제{chapter_no:02d}장_{file_label(entry.ident, title, dot)}", + ) + write( + division, chapter_no, "0-00", "0-00_장머리.md", start, title, end, marker, doc ) - slot, file_name = "0-00", "0-00_장머리.md" - else: - major, minor = entry.ident.split("-") - slot = f"{major}-{int(minor):02d}" - file_name = f"{slot}_{safe(name_of(entry.ident, title))}.md" - if chapter_no is None or f"{chapter_no}/{slot}" in taken: continue - empty = any( - len(re.sub(r"\s", "", doc[p - 1].get_text())) < _EMPTY_PAGE_CHARS - for p in range(start_pdf, end_pdf + 1) - ) - path = out / folders[chapter_no] / file_name - path.parent.mkdir(parents=True, exist_ok=True) - path.write_text( - head_text( - { - "문서": book["doc"], - "절": title, - "PDF쪽": _span(start_pdf, end_pdf), - "인쇄쪽": _span(start_pdf - offset, end_pdf - offset), - "시작표지": title, - "끝표지": end_marker, - "상태": "대기", - "원천": "그림" if empty else "글자층", - } - ), - encoding="utf-8", - ) - written.append(path) + if chapter_no is None: + continue + major, minor = entry.ident.split("-") + slot = f"{major}-{int(minor):02d}" + region = entries[at[n] + 1 : at[n + 1] if n + 1 < len(at) else len(entries)] + items = [e for e in region if e.ident.rsplit("-", 1)[0] == entry.ident] + if end - start + 1 <= _MAX_PAGES or not items: + name = f"{slot}_{file_label(entry.ident, title, dot)}.md" + write(division, chapter_no, slot, name, start, title, end, marker, doc) + continue + # 40쪽 넘는 절 — 절머리(절 제목 ~ 첫 항 앞) + 항마다 + head_end = _span_of(doc, book, entry, items[0]) + write(division, chapter_no, f"{slot}-00", f"{slot}-00_절머리.md", *head_end, doc) + for k, item in enumerate(items): + piece = _span_of( + doc, book, item, items[k + 1] if k + 1 < len(items) else following, cover + ) + if k + 1 == len(items): # 마지막 항은 절 끝까지 + piece = (piece[0], piece[1], end, marker) + item_slot = f"{slot}-{int(item.ident.rsplit('-', 1)[1]):02d}" + name = f"{item_slot}_{file_label(item.ident, piece[1], dot)}.md" + write(division, chapter_no, item_slot, name, *piece, doc) return written # ── check ────────────────────────────────────────────────────────────── -#: 쪽 번호 줄(「- 123 -」) — 절 글자에서 뺌 -_PAGE_NO = re.compile(r"^-\s*\d+\s*-$") #: md 문법 — 글자 대조·수 대조에서 뺌(원문 글자가 아님) _COMMENT = re.compile(r"", re.S) +_REPEATED = re.compile(r"") _IMAGE = re.compile(r"!\[[^\]]*\]\([^)]*\)") _TABLE_RULE = re.compile(r"^\s*\|?\s*:?-{3,}:?\s*(\|\s*:?-{3,}:?\s*)*\|?\s*$") #: 막음표 — 원문 글자가 md 문법으로 읽히지 않게 앞에 `\` 를 붙인 것(`\*` `\-` `\#` `\>` `\|` …) _ESCAPED = re.compile(r"\\([\\`*_{}\[\]()#+\-.!|>~^])") _HOLD = "\x00" +#: 글자층 밖 — PDF 글자층의 사용자 영역 글리프(U+E000–F8FF)는 뜻 없는 코드(식의 「(m³)」·분수선). +#: ①② 에서 빼고 개수·쪽을 기계검사 칸에 드러냄(③ 이 그림으로 봄). md 에서 그 자리를 받아쓴 글자는 +#: `` 로 감싸면 ①② 에서 빼고 「받아씀 N자」로 드러냄. +_PUA = re.compile("[\ue000-\uf8ff]") +_OFF_OPEN, _OFF_CLOSE = "\x01", "\x02" +_OFF_MARK = re.compile(r"") + + +def _same_han(ch: str) -> str: + """호환 한자(U+F900–FAFF) → 통합 한자(率 U+F9DB → 率 U+7387). ⚠ NFKC 통째로는 안 씀 — ㎥·①·㎡ 가 풀림.""" + return unicodedata.normalize("NFKC", ch) if "\uf900" <= ch <= "\ufaff" else ch def book_of(path: Path) -> dict: @@ -330,7 +455,12 @@ def split_head(text: str) -> tuple[str, str]: def md_lines(body: str) -> list[tuple[int, str]]: - """몸의 (줄 번호, 원문 글자) — 주석 · 그림 · 표 구분 줄 · md 문법 글자를 뺌. 줄 번호는 몸 기준 1부터.""" + """몸의 (줄 번호, 원문 글자) — 주석 · 그림 · 표 구분 줄 · md 문법 글자를 뺌. 줄 번호는 몸 기준 1부터. + + `` 는 셈 — 쪽을 넘은 표가 PDF 에서 되풀이한 머리 줄(md 표에서는 뺌 · 규칙 4-5). + """ + body = _REPEATED.sub(r"\1", body) + body = _OFF_MARK.sub(lambda m: _OFF_CLOSE if m.group(1) else _OFF_OPEN, body) body = _COMMENT.sub(lambda m: "\n" * m.group(0).count("\n"), body) out = [] for number, line in enumerate(body.split("\n"), start=1): @@ -348,8 +478,8 @@ def md_lines(body: str) -> list[tuple[int, str]]: return out -def pdf_lines(doc, head: dict[str, str]) -> list[tuple[int, str]]: - """그 절 PDF 글자층의 (PDF 쪽, 줄) — 시작표지 줄부터 끝표지 줄 앞까지 · 쪽 번호 줄 뺌.""" +def pdf_lines(doc, head: dict[str, str], footer: re.Pattern) -> list[tuple[int, str]]: + """그 절 PDF 글자층의 (PDF 쪽, 줄) — 시작표지 줄부터 끝표지 줄 앞까지 · 머리 PDF쪽 밖은 안 봄 · 쪽 꼬리 뺌.""" first, _, last = head["PDF쪽"].partition("~") first, last = int(first), int(last or first) start_page, start_row = locate(doc, head["시작표지"], first, slack=0) @@ -360,21 +490,43 @@ def pdf_lines(doc, head: dict[str, str]) -> list[tuple[int, str]]: except ValueError: pass out = [] - for number in range(start_page, min(end_page, doc.page_count) + 1): - for index, row in enumerate(_page_rows(doc[number - 1])): + for number in range(start_page, min(end_page, last) + 1): + rows = [row.strip() for row in _page_rows(doc[number - 1])] + if rows and footer.match(rows[-1]): + rows[-1] = "" # 쪽 꼬리 + for index, row in enumerate(rows): if (number, index) < (start_page, start_row) or (number, index) >= (end_page, end_row): continue - if not _PAGE_NO.match(row.strip()): - out.append((number, row)) + if not row or row == "→": # 이어짐 표지 + continue + out.append((number, row)) return out +def _split_off(lines: list[tuple[int, str]]) -> tuple[list[tuple[int, str]], list[tuple[int, str]]]: + """(셀 줄, 글자층 밖 줄) — PDF 는 사용자 영역 글리프 · md 는 `글자층 밖` 으로 감싼 글자를 떼어 냄.""" + kept, off, inside = [], [], False + for at, line in lines: + keep, gone = [], [] + for ch in line: + if ch in (_OFF_OPEN, _OFF_CLOSE): + inside = ch == _OFF_OPEN + elif inside or _PUA.match(ch): + gone.append(ch) + else: + keep.append(ch) + kept.append((at, "".join(keep))) + if "".join(gone).strip(): + off.append((at, "".join(gone))) + return kept, off + + def _tight(lines: list[tuple[int, str]]) -> tuple[str, list[int]]: - """공백 뗀 글자 줄 + 글자마다 어디서 왔나(쪽 또는 md 줄).""" + """공백 뗀 글자 줄 + 글자마다 어디서 왔나(쪽 또는 md 줄) · 호환 한자는 통합 한자로.""" text, where = [], [] for at, line in lines: for ch in re.sub(r"\s", "", line): - text.append(ch) + text.append(_same_han(ch)) where.append(at) return "".join(text), where @@ -389,7 +541,9 @@ def _numbers(lines: list[tuple[int, str]]) -> tuple[collections.Counter, dict[st def compare(pdf: list[tuple[int, str]], md: list[tuple[int, str]]) -> dict: - """① 수(갯수까지) ② 글자(공백 뗌 · 갯수까지) — 양방향.""" + """① 수(갯수까지) ② 글자(공백 뗌 · 갯수까지) — 양방향. 글자층 밖(사용자 영역 글리프 · 감싼 받아쓰기)은 빼고 따로 셈.""" + pdf, pdf_off = _split_off(pdf) + md, md_off = _split_off(md) pdf_n, pdf_at = _numbers(pdf) md_n, md_at = _numbers(md) pdf_t, pdf_where = _tight(pdf) @@ -418,6 +572,11 @@ def compare(pdf: list[tuple[int, str]], md: list[tuple[int, str]]) -> dict: "char_missing": missing_c, "char_extra": extra_c, "spots": spots, + "off_pdf": ( + sum(len(re.sub(r"\s", "", t)) for _, t in pdf_off), + sorted({a for a, _ in pdf_off}), + ), + "off_md": sum(len(re.sub(r"\s", "", t)) for _, t in md_off), } @@ -429,9 +588,14 @@ def verdict(result: dict) -> str: sum(result["char_extra"].values()), ) word = "통과" if not any(counts) else "불통" - return ( + line = ( f"{word} · ①수 결손 {counts[0]} 허구 {counts[1]} · ②글자 빠짐 {counts[2]} 더함 {counts[3]}" ) + glyphs, pages = result.get("off_pdf", (0, [])) + if glyphs or result.get("off_md"): # ③ 이 그림으로 그 식을 꼭 보게 + where = f"({', '.join(map(str, pages))}쪽)" if pages else "" + line += f" · 글자층 밖 글리프 {glyphs}개{where} · 받아씀 {result.get('off_md', 0)}자" + return line def fingerprint(text: str) -> str: @@ -452,8 +616,9 @@ def check_file(path: Path) -> tuple[dict, str]: import pymupdf _, body = split_head(path.read_text(encoding="utf-8").replace("\r\n", "\n")) - with pymupdf.open(book_of(path)["pdf"]) as doc: - result = compare(pdf_lines(doc, read_head(path)), md_lines(body)) + book = book_of(path) + with pymupdf.open(book["pdf"]) as doc: + result = compare(pdf_lines(doc, read_head(path), book["footer"]), md_lines(body)) return result, verdict(result) @@ -510,7 +675,7 @@ def status() -> str: for name, book in BOOKS.items(): by_chapter: dict[str, collections.Counter] = {} for path in sorted(book["out"].rglob("*.md")): - chapter = path.relative_to(book["out"]).parts[0] + chapter = path.parent.relative_to(book["out"]).as_posix() by_chapter.setdefault(chapter, collections.Counter())[ read_head(path).get("상태", "") ] += 1 diff --git a/resources/knowledge/original/원가계산/_품셈md_작성규칙.md b/resources/knowledge/original/원가계산/_품셈md_작성규칙.md index 7f4c3904..22dc2f45 100644 --- a/resources/knowledge/original/원가계산/_품셈md_작성규칙.md +++ b/resources/knowledge/original/원가계산/_품셈md_작성규칙.md @@ -63,7 +63,7 @@ PDF쪽: 135~136 3. 머리가 두 단 이상이면 **윗머리를 md 머리 줄로, 아랫머리는 몸 첫 줄(들)로** 적고 주석을 담. 윗머리를 아랫머리마다 되풀이해 펼치지 않음. `` 4. 빈 칸은 빈 칸. `〃` · `-` · `·` 는 그대로 적음(위 값으로 채우지 않음). -5. 한 표가 쪽을 넘어가면 **한 표로 이음.** 넘어간 쪽에서 되풀이된 머리 줄은 뺌. +5. 한 표가 쪽을 넘어가면 **한 표로 이음.** 넘어간 쪽에서 되풀이된 머리 줄은 뺌. 뺀 자리(넘어간 첫 줄 앞)에 `` 로 그 글자를 적음 — 기계검사가 그 글자를 PDF 의 되풀이 머리와 맞대 셈. 6. 표가 너무 넓어 PDF 가 두 표로 나눠 찍었으면 PDF 대로 두 표. ## 5. 그림 @@ -80,6 +80,9 @@ PDF쪽: 135~136 | ② 글자 대조 | 도구 | PDF 글자(공백 뗌)가 md 에 빠짐없이 있고 md 에 없는 글자가 더해지지 않음 | | ③ 자리 대조 | **작성하지 않은 다른 창** | 쪽 그림을 보며 표마다 수가 제 줄·제 칸에 있는지 · 병합 · 머리 · 밑수 · [주] | +- ①② 대조에서 빼는 것 — PDF 쪽: 쪽 맨 아래 꼬리(「- 51 -」 · 「30 공통부문」 · 「제1장 적용기준 31」) · 쪽 끝 이어짐 표지 「→」 / md 쪽: 머리 · `` · 그림 링크 · 표 문법(`|` · 구분 줄 · `
`) · 제목 `#` · 인용 `>` · 첨자 표시 `^` `_` (막음표 `\` 뒤 글자는 원문으로 셈). +- 글자층 밖 — PDF 글자층의 사용자 영역 글리프(U+E000–F8FF · 식의 「(m³)」·분수선)는 ①② 에서 빼고 기계검사 칸에 「글자층 밖 글리프 N개(쪽)」로 적음. 그 자리를 그림 보고 받아쓴 md 글자는 `(m^3)` 로 감쌈(①② 에서 빠지고 「받아씀 N자」로 드러남) — **이 칸이 뜬 파일은 ③ 이 그림으로 그 식을 꼭 봄.** 사용자 영역 글리프 자리 말고는 감싸지 않음. +- 호환 한자(U+F900–FAFF · 率 U+F9DB)는 ② 에서 통합 한자(率 U+7387)와 같게 봄. 다른 글자(㎥·①·㎡ 등)는 그대로 견줌. - ①②가 0 이어도 칸이 뒤바뀐 것은 못 잡음 → ③ 없이는 `확정` 아님. - ③에서 고칠 곳이 나오면 검증 창이 고치지 않고 **작성 창에 돌려보냄**(줄 번호 + PDF 쪽 + 무엇이 다른지). - `확정` 뒤 파일이 바뀌면 시험이 빨강. 고치려면 상태를 `작성중` 으로 되돌리고 ①②③ 다시. diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제01장_적용기준/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제01장_적용기준/0-00_장머리.md new file mode 100644 index 00000000..973f7c32 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제01장_적용기준/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제1장 적용기준 +PDF쪽: 59 +인쇄쪽: 3 +시작표지: 제1장 적용기준 +끝표지: 1-1 일반사항 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제01장_적용기준/1-01_일반사항.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제01장_적용기준/1-01_일반사항.md new file mode 100644 index 00000000..b6fa9cf4 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제01장_적용기준/1-01_일반사항.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 1-1 일반사항 +PDF쪽: 59 +인쇄쪽: 3 +시작표지: 1-1 일반사항 +끝표지: 1-2 설계 및 수량 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제01장_적용기준/1-02_설계_및_수량.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제01장_적용기준/1-02_설계_및_수량.md new file mode 100644 index 00000000..a2a99caf --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제01장_적용기준/1-02_설계_및_수량.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 1-2 설계 및 수량 +PDF쪽: 59~75 +인쇄쪽: 3~19 +시작표지: 1-2 설계 및 수량 +끝표지: 1-3 재료 및 노임의 할증 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제01장_적용기준/1-03_재료_및_노임의_할증.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제01장_적용기준/1-03_재료_및_노임의_할증.md new file mode 100644 index 00000000..469016fd --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제01장_적용기준/1-03_재료_및_노임의_할증.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 1-3 재료 및 노임의 할증 +PDF쪽: 76~79 +인쇄쪽: 20~23 +시작표지: 1-3 재료 및 노임의 할증 +끝표지: 1-4 품의 할증('97, '01, '03, '11, '14, '15, '16, '17년 보완) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제01장_적용기준/1-04_품의_할증.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제01장_적용기준/1-04_품의_할증.md new file mode 100644 index 00000000..0f530897 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제01장_적용기준/1-04_품의_할증.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 1-4 품의 할증('97, '01, '03, '11, '14, '15, '16, '17년 보완) +PDF쪽: 79~86 +인쇄쪽: 23~30 +시작표지: 1-4 품의 할증('97, '01, '03, '11, '14, '15, '16, '17년 보완) +끝표지: 1-5 기타 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제01장_적용기준/1-05_기타.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제01장_적용기준/1-05_기타.md new file mode 100644 index 00000000..92c8bd08 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제01장_적용기준/1-05_기타.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 1-5 기타 +PDF쪽: 87~89 +인쇄쪽: 31~33 +시작표지: 1-5 기타 +끝표지: 제2장 가설공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/0-00_장머리.md new file mode 100644 index 00000000..5596278e --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제2장 가설공사 +PDF쪽: 91 +인쇄쪽: 35 +시작표지: 제2장 가설공사 +끝표지: 2-1 가설물의 한도 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/2-01_가설물의_한도.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/2-01_가설물의_한도.md new file mode 100644 index 00000000..1fb3ea49 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/2-01_가설물의_한도.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 2-1 가설물의 한도 +PDF쪽: 91~93 +인쇄쪽: 35~37 +시작표지: 2-1 가설물의 한도 +끝표지: 2-2 손율 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/2-02_손율.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/2-02_손율.md new file mode 100644 index 00000000..e761261a --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/2-02_손율.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 2-2 손율 +PDF쪽: 94~96 +인쇄쪽: 38~40 +시작표지: 2-2 손율 +끝표지: 2-3 가설건축물 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/2-03_가설건축물.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/2-03_가설건축물.md new file mode 100644 index 00000000..bc416811 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/2-03_가설건축물.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 2-3 가설건축물 +PDF쪽: 97 +인쇄쪽: 41 +시작표지: 2-3 가설건축물 +끝표지: 2-4 가설울타리 및 가설방음벽('09, '10, '17, '26년 보완) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/2-04_가설울타리_및_가설방음벽.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/2-04_가설울타리_및_가설방음벽.md new file mode 100644 index 00000000..984c1855 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/2-04_가설울타리_및_가설방음벽.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 2-4 가설울타리 및 가설방음벽('09, '10, '17, '26년 보완) +PDF쪽: 97~99 +인쇄쪽: 41~43 +시작표지: 2-4 가설울타리 및 가설방음벽('09, '10, '17, '26년 보완) +끝표지: 2-5 규준틀 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/2-05_규준틀.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/2-05_규준틀.md new file mode 100644 index 00000000..83ee281a --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/2-05_규준틀.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 2-5 규준틀 +PDF쪽: 99~100 +인쇄쪽: 43~44 +시작표지: 2-5 규준틀 +끝표지: 2-6 동바리 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/2-06_동바리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/2-06_동바리.md new file mode 100644 index 00000000..637a09fa --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/2-06_동바리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 2-6 동바리 +PDF쪽: 101~103 +인쇄쪽: 45~47 +시작표지: 2-6 동바리 +끝표지: 2-7 비계 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/2-07_비계.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/2-07_비계.md new file mode 100644 index 00000000..4e0029fe --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/2-07_비계.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 2-7 비계 +PDF쪽: 103~106 +인쇄쪽: 47~50 +시작표지: 2-7 비계 +끝표지: 2-8 추락재해 및 낙하물방지시설 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/2-08_추락재해_및_낙하물방지시설.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/2-08_추락재해_및_낙하물방지시설.md new file mode 100644 index 00000000..01eaf23e --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/2-08_추락재해_및_낙하물방지시설.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 2-8 추락재해 및 낙하물방지시설 +PDF쪽: 106~112 +인쇄쪽: 50~56 +시작표지: 2-8 추락재해 및 낙하물방지시설 +끝표지: 2-9 통행안전시설 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/2-09_통행안전시설.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/2-09_통행안전시설.md new file mode 100644 index 00000000..25c447c5 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/2-09_통행안전시설.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 2-9 통행안전시설 +PDF쪽: 112~114 +인쇄쪽: 56~58 +시작표지: 2-9 통행안전시설 +끝표지: 2-10 피해방지시설 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/2-10_피해방지시설.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/2-10_피해방지시설.md new file mode 100644 index 00000000..7344cd82 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/2-10_피해방지시설.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 2-10 피해방지시설 +PDF쪽: 115~117 +인쇄쪽: 59~61 +시작표지: 2-10 피해방지시설 +끝표지: 2-11 현장관리 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/2-11_현장관리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/2-11_현장관리.md new file mode 100644 index 00000000..6f2213f8 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/2-11_현장관리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 2-11 현장관리 +PDF쪽: 117~119 +인쇄쪽: 61~63 +시작표지: 2-11 현장관리 +끝표지: 2-12 공통장비 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/2-12_공통장비.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/2-12_공통장비.md new file mode 100644 index 00000000..d8a19e2a --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제02장_가설공사/2-12_공통장비.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 2-12 공통장비 +PDF쪽: 120~122 +인쇄쪽: 64~66 +시작표지: 2-12 공통장비 +끝표지: 제3장 토공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제03장_토공사/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제03장_토공사/0-00_장머리.md new file mode 100644 index 00000000..a8a30904 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제03장_토공사/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제3장 토공사 +PDF쪽: 123 +인쇄쪽: 67 +시작표지: 제3장 토공사 +끝표지: 3-1 공통사항 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제03장_토공사/3-01_공통사항.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제03장_토공사/3-01_공통사항.md new file mode 100644 index 00000000..818b8e73 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제03장_토공사/3-01_공통사항.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 3-1 공통사항 +PDF쪽: 123 +인쇄쪽: 67 +시작표지: 3-1 공통사항 +끝표지: 3-2 굴착 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제03장_토공사/3-02_굴착.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제03장_토공사/3-02_굴착.md new file mode 100644 index 00000000..4bfa7384 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제03장_토공사/3-02_굴착.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 3-2 굴착 +PDF쪽: 123~126 +인쇄쪽: 67~70 +시작표지: 3-2 굴착 +끝표지: 3-3 암발파 및 파쇄 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제03장_토공사/3-03_암발파_및_파쇄.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제03장_토공사/3-03_암발파_및_파쇄.md new file mode 100644 index 00000000..cf5fe87a --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제03장_토공사/3-03_암발파_및_파쇄.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 3-3 암발파 및 파쇄 +PDF쪽: 126~130 +인쇄쪽: 70~74 +시작표지: 3-3 암발파 및 파쇄 +끝표지: 3-4 쌓기 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제03장_토공사/3-04_쌓기.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제03장_토공사/3-04_쌓기.md new file mode 100644 index 00000000..e0aef71e --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제03장_토공사/3-04_쌓기.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 3-4 쌓기 +PDF쪽: 130~133 +인쇄쪽: 74~77 +시작표지: 3-4 쌓기 +끝표지: 3-5 절토부대공 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제03장_토공사/3-05_절토부대공.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제03장_토공사/3-05_절토부대공.md new file mode 100644 index 00000000..2a65c4aa --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제03장_토공사/3-05_절토부대공.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 3-5 절토부대공 +PDF쪽: 133~134 +인쇄쪽: 77~78 +시작표지: 3-5 절토부대공 +끝표지: 3-6 성토부대공 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제03장_토공사/3-06_성토부대공.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제03장_토공사/3-06_성토부대공.md new file mode 100644 index 00000000..62e8fd0d --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제03장_토공사/3-06_성토부대공.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 3-6 성토부대공 +PDF쪽: 134 +인쇄쪽: 78 +시작표지: 3-6 성토부대공 +끝표지: 3-7 비탈면 보호공 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제03장_토공사/3-07_비탈면_보호공.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제03장_토공사/3-07_비탈면_보호공.md new file mode 100644 index 00000000..9fa10b54 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제03장_토공사/3-07_비탈면_보호공.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 3-7 비탈면 보호공 +PDF쪽: 134~138 +인쇄쪽: 78~82 +시작표지: 3-7 비탈면 보호공 +끝표지: 3-8 보강토 옹벽 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제03장_토공사/3-08_보강토_옹벽.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제03장_토공사/3-08_보강토_옹벽.md new file mode 100644 index 00000000..84115caa --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제03장_토공사/3-08_보강토_옹벽.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 3-8 보강토 옹벽 +PDF쪽: 138~139 +인쇄쪽: 82~83 +시작표지: 3-8 보강토 옹벽 +끝표지: 3-9 벌개제근 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제03장_토공사/3-09_벌개제근.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제03장_토공사/3-09_벌개제근.md new file mode 100644 index 00000000..4c41f1ef --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제03장_토공사/3-09_벌개제근.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 3-9 벌개제근 +PDF쪽: 140 +인쇄쪽: 84 +시작표지: 3-9 벌개제근 +끝표지: 3-10 개간 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제03장_토공사/3-10_개간.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제03장_토공사/3-10_개간.md new file mode 100644 index 00000000..e959953d --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제03장_토공사/3-10_개간.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 3-10 개간 +PDF쪽: 141 +인쇄쪽: 85 +시작표지: 3-10 개간 +끝표지: 3-11 스마트 토공 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제03장_토공사/3-11_스마트_토공.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제03장_토공사/3-11_스마트_토공.md new file mode 100644 index 00000000..a8fcf2d5 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제03장_토공사/3-11_스마트_토공.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 3-11 스마트 토공 +PDF쪽: 141~146 +인쇄쪽: 85~90 +시작표지: 3-11 스마트 토공 +끝표지: 제4장 조경공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제04장_조경공사/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제04장_조경공사/0-00_장머리.md new file mode 100644 index 00000000..fc26c85a --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제04장_조경공사/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제4장 조경공사 +PDF쪽: 147 +인쇄쪽: 91 +시작표지: 제4장 조경공사 +끝표지: 4-1 잔디 및 초화류 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제04장_조경공사/4-01_잔디_및_초화류.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제04장_조경공사/4-01_잔디_및_초화류.md new file mode 100644 index 00000000..63b77022 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제04장_조경공사/4-01_잔디_및_초화류.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 4-1 잔디 및 초화류 +PDF쪽: 147~148 +인쇄쪽: 91~92 +시작표지: 4-1 잔디 및 초화류 +끝표지: 4-2 관목 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제04장_조경공사/4-02_관목.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제04장_조경공사/4-02_관목.md new file mode 100644 index 00000000..f761f71e --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제04장_조경공사/4-02_관목.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 4-2 관목 +PDF쪽: 149~150 +인쇄쪽: 93~94 +시작표지: 4-2 관목 +끝표지: 4-3 교목 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제04장_조경공사/4-03_교목.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제04장_조경공사/4-03_교목.md new file mode 100644 index 00000000..06a11592 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제04장_조경공사/4-03_교목.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 4-3 교목 +PDF쪽: 150~152 +인쇄쪽: 94~96 +시작표지: 4-3 교목 +끝표지: 4-4 조경시설물 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제04장_조경공사/4-04_조경시설물.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제04장_조경공사/4-04_조경시설물.md new file mode 100644 index 00000000..e68945b2 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제04장_조경공사/4-04_조경시설물.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 4-4 조경시설물 +PDF쪽: 153~154 +인쇄쪽: 97~98 +시작표지: 4-4 조경시설물 +끝표지: 제5장 기초공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제05장_기초공사/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제05장_기초공사/0-00_장머리.md new file mode 100644 index 00000000..3a94bdc0 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제05장_기초공사/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제5장 기초공사 +PDF쪽: 155 +인쇄쪽: 99 +시작표지: 제5장 기초공사 +끝표지: 5-1 흙막이 및 물막이 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제05장_기초공사/5-01_흙막이_및_물막이.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제05장_기초공사/5-01_흙막이_및_물막이.md new file mode 100644 index 00000000..2c4283ea --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제05장_기초공사/5-01_흙막이_및_물막이.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 5-1 흙막이 및 물막이 +PDF쪽: 155~165 +인쇄쪽: 99~109 +시작표지: 5-1 흙막이 및 물막이 +끝표지: 5-2 연약지반처리 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제05장_기초공사/5-02_연약지반처리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제05장_기초공사/5-02_연약지반처리.md new file mode 100644 index 00000000..5cb881be --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제05장_기초공사/5-02_연약지반처리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 5-2 연약지반처리 +PDF쪽: 165~172 +인쇄쪽: 109~116 +시작표지: 5-2 연약지반처리 +끝표지: 5-3 말뚝 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제05장_기초공사/5-03_말뚝.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제05장_기초공사/5-03_말뚝.md new file mode 100644 index 00000000..74e5d1b9 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제05장_기초공사/5-03_말뚝.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 5-3 말뚝 +PDF쪽: 172~183 +인쇄쪽: 116~127 +시작표지: 5-3 말뚝 +끝표지: 5-4 차수 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제05장_기초공사/5-04_차수.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제05장_기초공사/5-04_차수.md new file mode 100644 index 00000000..544997bf --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제05장_기초공사/5-04_차수.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 5-4 차수 +PDF쪽: 183~184 +인쇄쪽: 127~128 +시작표지: 5-4 차수 +끝표지: 제6장 철근콘크리트공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제06장_철근콘크리트공사/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제06장_철근콘크리트공사/0-00_장머리.md new file mode 100644 index 00000000..4c213892 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제06장_철근콘크리트공사/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제6장 철근콘크리트공사 +PDF쪽: 185 +인쇄쪽: 129 +시작표지: 제6장 철근콘크리트공사 +끝표지: 6-1 콘크리트('25년 보완) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제06장_철근콘크리트공사/6-01_콘크리트.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제06장_철근콘크리트공사/6-01_콘크리트.md new file mode 100644 index 00000000..36b6f6fd --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제06장_철근콘크리트공사/6-01_콘크리트.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 6-1 콘크리트('25년 보완) +PDF쪽: 185~188 +인쇄쪽: 129~132 +시작표지: 6-1 콘크리트('25년 보완) +끝표지: 6-2 철근 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제06장_철근콘크리트공사/6-02_철근.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제06장_철근콘크리트공사/6-02_철근.md new file mode 100644 index 00000000..e8ce8f5d --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제06장_철근콘크리트공사/6-02_철근.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 6-2 철근 +PDF쪽: 189~191 +인쇄쪽: 133~135 +시작표지: 6-2 철근 +끝표지: 6-3 거푸집 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제06장_철근콘크리트공사/6-03_거푸집.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제06장_철근콘크리트공사/6-03_거푸집.md new file mode 100644 index 00000000..8dc0d6b0 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제06장_철근콘크리트공사/6-03_거푸집.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 6-3 거푸집 +PDF쪽: 191~199 +인쇄쪽: 135~143 +시작표지: 6-3 거푸집 +끝표지: 6-4 포스트텐션(Post Tension) 구조물 제작 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제06장_철근콘크리트공사/6-04_포스트텐션(Post_Tension)_구조물_제작.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제06장_철근콘크리트공사/6-04_포스트텐션(Post_Tension)_구조물_제작.md new file mode 100644 index 00000000..027fa8cc --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제06장_철근콘크리트공사/6-04_포스트텐션(Post_Tension)_구조물_제작.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 6-4 포스트텐션(Post Tension) 구조물 제작 +PDF쪽: 200~205 +인쇄쪽: 144~149 +시작표지: 6-4 포스트텐션(Post Tension) 구조물 제작 +끝표지: 6-5 교량 가설공 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제06장_철근콘크리트공사/6-05_교량_가설공.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제06장_철근콘크리트공사/6-05_교량_가설공.md new file mode 100644 index 00000000..06f812ed --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제06장_철근콘크리트공사/6-05_교량_가설공.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 6-5 교량 가설공 +PDF쪽: 205~206 +인쇄쪽: 149~150 +시작표지: 6-5 교량 가설공 +끝표지: 6-6 교량 부대공 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제06장_철근콘크리트공사/6-06_교량_부대공.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제06장_철근콘크리트공사/6-06_교량_부대공.md new file mode 100644 index 00000000..489f7661 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제06장_철근콘크리트공사/6-06_교량_부대공.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 6-6 교량 부대공 +PDF쪽: 206~211 +인쇄쪽: 150~155 +시작표지: 6-6 교량 부대공 +끝표지: 6-7 조립식 구조물 설치공 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제06장_철근콘크리트공사/6-07_조립식_구조물_설치공.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제06장_철근콘크리트공사/6-07_조립식_구조물_설치공.md new file mode 100644 index 00000000..f693c947 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제06장_철근콘크리트공사/6-07_조립식_구조물_설치공.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 6-7 조립식 구조물 설치공 +PDF쪽: 211~214 +인쇄쪽: 155~158 +시작표지: 6-7 조립식 구조물 설치공 +끝표지: 제7장 돌공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제07장_돌공사/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제07장_돌공사/0-00_장머리.md new file mode 100644 index 00000000..7a7e2bb1 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제07장_돌공사/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제7장 돌공사 +PDF쪽: 215 +인쇄쪽: 159 +시작표지: 제7장 돌공사 +끝표지: 7-1 돌쌓기 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제07장_돌공사/7-01_돌쌓기.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제07장_돌공사/7-01_돌쌓기.md new file mode 100644 index 00000000..5ad6ce36 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제07장_돌공사/7-01_돌쌓기.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 7-1 돌쌓기 +PDF쪽: 215 +인쇄쪽: 159 +시작표지: 7-1 돌쌓기 +끝표지: 7-2 돌붙임 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제07장_돌공사/7-02_돌붙임.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제07장_돌공사/7-02_돌붙임.md new file mode 100644 index 00000000..242a259a --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제07장_돌공사/7-02_돌붙임.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 7-2 돌붙임 +PDF쪽: 216 +인쇄쪽: 160 +시작표지: 7-2 돌붙임 +끝표지: 7-3 전석쌓기 및 깔기 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제07장_돌공사/7-03_전석쌓기_및_깔기.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제07장_돌공사/7-03_전석쌓기_및_깔기.md new file mode 100644 index 00000000..d536694f --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제07장_돌공사/7-03_전석쌓기_및_깔기.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 7-3 전석쌓기 및 깔기 +PDF쪽: 216~217 +인쇄쪽: 160~161 +시작표지: 7-3 전석쌓기 및 깔기 +끝표지: 7-4 석재판 붙임 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제07장_돌공사/7-04_석재판_붙임.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제07장_돌공사/7-04_석재판_붙임.md new file mode 100644 index 00000000..79716f37 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제07장_돌공사/7-04_석재판_붙임.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 7-4 석재판 붙임 +PDF쪽: 217~218 +인쇄쪽: 161~162 +시작표지: 7-4 석재판 붙임 +끝표지: 제8장 건설기계 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/0-00_장머리.md new file mode 100644 index 00000000..f088ff0a --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제8장 건설기계 +PDF쪽: 219 +인쇄쪽: 163 +시작표지: 제8장 건설기계 +끝표지: 8-1 적용기준 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-01_적용기준.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-01_적용기준.md new file mode 100644 index 00000000..c924cb5d --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-01_적용기준.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-1 적용기준 +PDF쪽: 219~224 +인쇄쪽: 163~168 +시작표지: 8-1 적용기준 +끝표지: 8-2 시공능력 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-00_절머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-00_절머리.md new file mode 100644 index 00000000..9e9a08f8 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-00_절머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-2 시공능력 +PDF쪽: 224 +인쇄쪽: 168 +시작표지: 8-2 시공능력 +끝표지: 8-2-1 불도저('25년 보완) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-01_불도저.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-01_불도저.md new file mode 100644 index 00000000..e73d3446 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-01_불도저.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-2-1 불도저('25년 보완) +PDF쪽: 224~226 +인쇄쪽: 168~170 +시작표지: 8-2-1 불도저('25년 보완) +끝표지: 8-2-2 리퍼(유압식)('25년 보완) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-02_리퍼(유압식).md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-02_리퍼(유압식).md new file mode 100644 index 00000000..18af3553 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-02_리퍼(유압식).md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-2-2 리퍼(유압식)('25년 보완) +PDF쪽: 226~227 +인쇄쪽: 170~171 +시작표지: 8-2-2 리퍼(유압식)('25년 보완) +끝표지: 8-2-3 굴착기('04, '07, '09, '25년 보완) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-03_굴착기.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-03_굴착기.md new file mode 100644 index 00000000..c2cb082b --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-03_굴착기.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-2-3 굴착기('04, '07, '09, '25년 보완) +PDF쪽: 227~229 +인쇄쪽: 171~173 +시작표지: 8-2-3 굴착기('04, '07, '09, '25년 보완) +끝표지: 8-2-4 트랜처 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-04_트랜처.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-04_트랜처.md new file mode 100644 index 00000000..166aa567 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-04_트랜처.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-2-4 트랜처 +PDF쪽: 229~230 +인쇄쪽: 173~174 +시작표지: 8-2-4 트랜처 +끝표지: 8-2-5 로더('07, '20년 보완) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-05_로더.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-05_로더.md new file mode 100644 index 00000000..e08f36ca --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-05_로더.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-2-5 로더('07, '20년 보완) +PDF쪽: 230~232 +인쇄쪽: 174~176 +시작표지: 8-2-5 로더('07, '20년 보완) +끝표지: 8-2-6 모터 스크레이퍼 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-06_모터_스크레이퍼.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-06_모터_스크레이퍼.md new file mode 100644 index 00000000..aabf0536 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-06_모터_스크레이퍼.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-2-6 모터 스크레이퍼 +PDF쪽: 232~233 +인쇄쪽: 176~177 +시작표지: 8-2-6 모터 스크레이퍼 +끝표지: 8-2-7 모터 그레이더('25년 보완) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-07_모터_그레이더.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-07_모터_그레이더.md new file mode 100644 index 00000000..3e67311e --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-07_모터_그레이더.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-2-7 모터 그레이더('25년 보완) +PDF쪽: 234~235 +인쇄쪽: 178~179 +시작표지: 8-2-7 모터 그레이더('25년 보완) +끝표지: 8-2-8 덤프트럭('17년 보완) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-08_덤프트럭.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-08_덤프트럭.md new file mode 100644 index 00000000..c16f5c3b --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-08_덤프트럭.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-2-8 덤프트럭('17년 보완) +PDF쪽: 235~237 +인쇄쪽: 179~181 +시작표지: 8-2-8 덤프트럭('17년 보완) +끝표지: 8-2-9 롤러('04, '17, '25년 보완) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-09_롤러.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-09_롤러.md new file mode 100644 index 00000000..6dc3bf17 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-09_롤러.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-2-9 롤러('04, '17, '25년 보완) +PDF쪽: 238~240 +인쇄쪽: 182~184 +시작표지: 8-2-9 롤러('04, '17, '25년 보완) +끝표지: 8-2-10 아스팔트 플랜트 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-10_아스팔트_플랜트.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-10_아스팔트_플랜트.md new file mode 100644 index 00000000..46867fd3 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-10_아스팔트_플랜트.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-2-10 아스팔트 플랜트 +PDF쪽: 241 +인쇄쪽: 185 +시작표지: 8-2-10 아스팔트 플랜트 +끝표지: 8-2-11 스테이빌라이저(노상안정기) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-11_스테이빌라이저(노상안정기).md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-11_스테이빌라이저(노상안정기).md new file mode 100644 index 00000000..08219871 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-11_스테이빌라이저(노상안정기).md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-2-11 스테이빌라이저(노상안정기) +PDF쪽: 241~242 +인쇄쪽: 185~186 +시작표지: 8-2-11 스테이빌라이저(노상안정기) +끝표지: 8-2-12 크러셔 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-12_크러셔.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-12_크러셔.md new file mode 100644 index 00000000..50ec3397 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-12_크러셔.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-2-12 크러셔 +PDF쪽: 242~248 +인쇄쪽: 186~192 +시작표지: 8-2-12 크러셔 +끝표지: 8-2-13 대형브레이커('14, '17, '25년 보완) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-13_대형브레이커.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-13_대형브레이커.md new file mode 100644 index 00000000..c77da16b --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-13_대형브레이커.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-2-13 대형브레이커('14, '17, '25년 보완) +PDF쪽: 248~249 +인쇄쪽: 192~193 +시작표지: 8-2-13 대형브레이커('14, '17, '25년 보완) +끝표지: 8-2-14 압쇄기(콘크리트 소할용)('04년 신설) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-14_압쇄기(콘크리트_소할용).md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-14_압쇄기(콘크리트_소할용).md new file mode 100644 index 00000000..d3b91775 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-14_압쇄기(콘크리트_소할용).md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-2-14 압쇄기(콘크리트 소할용)('04년 신설) +PDF쪽: 249 +인쇄쪽: 193 +시작표지: 8-2-14 압쇄기(콘크리트 소할용)('04년 신설) +끝표지: 8-2-15 법면다짐기 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-15_법면다짐기.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-15_법면다짐기.md new file mode 100644 index 00000000..de3e79b5 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-15_법면다짐기.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-2-15 법면다짐기 +PDF쪽: 250 +인쇄쪽: 194 +시작표지: 8-2-15 법면다짐기 +끝표지: 8-2-16 골재세척설비('01년 신설) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-16_골재세척설비.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-16_골재세척설비.md new file mode 100644 index 00000000..57a48ae0 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-16_골재세척설비.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-2-16 골재세척설비('01년 신설) +PDF쪽: 250 +인쇄쪽: 194 +시작표지: 8-2-16 골재세척설비('01년 신설) +끝표지: 8-2-17 콘크리트 믹서 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-17_콘크리트_믹서.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-17_콘크리트_믹서.md new file mode 100644 index 00000000..81bb01a3 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-17_콘크리트_믹서.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-2-17 콘크리트 믹서 +PDF쪽: 250 +인쇄쪽: 194 +시작표지: 8-2-17 콘크리트 믹서 +끝표지: 8-2-18 콘크리트 배치플랜트(강제 혼합식)('00, '02, '11년 보완) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-18_콘크리트_배치플랜트(강제_혼합식).md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-18_콘크리트_배치플랜트(강제_혼합식).md new file mode 100644 index 00000000..2a1a5adc --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-18_콘크리트_배치플랜트(강제_혼합식).md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-2-18 콘크리트 배치플랜트(강제 혼합식)('00, '02, '11년 보완) +PDF쪽: 250~251 +인쇄쪽: 194~195 +시작표지: 8-2-18 콘크리트 배치플랜트(강제 혼합식)('00, '02, '11년 보완) +끝표지: 8-2-19 콘크리트 운반 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-19_콘크리트_운반.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-19_콘크리트_운반.md new file mode 100644 index 00000000..f9421703 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-19_콘크리트_운반.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-2-19 콘크리트 운반 +PDF쪽: 251~252 +인쇄쪽: 195~196 +시작표지: 8-2-19 콘크리트 운반 +끝표지: 8-2-20 기관차 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-20_기관차.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-20_기관차.md new file mode 100644 index 00000000..b3125668 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-20_기관차.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-2-20 기관차 +PDF쪽: 252~253 +인쇄쪽: 196~197 +시작표지: 8-2-20 기관차 +끝표지: 8-2-21 경운기 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-21_경운기.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-21_경운기.md new file mode 100644 index 00000000..dc67a6ca --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-21_경운기.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-2-21 경운기 +PDF쪽: 253 +인쇄쪽: 197 +시작표지: 8-2-21 경운기 +끝표지: 8-2-22  디젤 파일 해머 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-22__디젤_파일_해머.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-22__디젤_파일_해머.md new file mode 100644 index 00000000..28de2791 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-22__디젤_파일_해머.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-2-22  디젤 파일 해머 +PDF쪽: 254~258 +인쇄쪽: 198~202 +시작표지: 8-2-22  디젤 파일 해머 +끝표지: 8-2-23 유압 파일 해머 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-23_유압_파일_해머.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-23_유압_파일_해머.md new file mode 100644 index 00000000..1cf476d0 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-23_유압_파일_해머.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-2-23 유압 파일 해머 +PDF쪽: 258~262 +인쇄쪽: 202~206 +시작표지: 8-2-23 유압 파일 해머 +끝표지: 8-2-24 진동파일 해머('96, '26년 보완) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-24_진동파일_해머.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-24_진동파일_해머.md new file mode 100644 index 00000000..d4ebe298 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-24_진동파일_해머.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-2-24 진동파일 해머('96, '26년 보완) +PDF쪽: 262~266 +인쇄쪽: 206~210 +시작표지: 8-2-24 진동파일 해머('96, '26년 보완) +끝표지: 8-2-25 진동파일해머(워터제트 병용 압입공) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-25_진동파일해머(워터제트_병용_압입공).md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-25_진동파일해머(워터제트_병용_압입공).md new file mode 100644 index 00000000..6006c907 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-25_진동파일해머(워터제트_병용_압입공).md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-2-25 진동파일해머(워터제트 병용 압입공) +PDF쪽: 267~270 +인쇄쪽: 211~214 +시작표지: 8-2-25 진동파일해머(워터제트 병용 압입공) +끝표지: 8-2-26 유압식 압입 인발기(유압식 압입 인발공) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-26_유압식_압입_인발기(유압식_압입_인발공).md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-26_유압식_압입_인발기(유압식_압입_인발공).md new file mode 100644 index 00000000..1e9c2d23 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-26_유압식_압입_인발기(유압식_압입_인발공).md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-2-26 유압식 압입 인발기(유압식 압입 인발공) +PDF쪽: 270~272 +인쇄쪽: 214~216 +시작표지: 8-2-26 유압식 압입 인발기(유압식 압입 인발공) +끝표지: 8-2-27 수중펌프 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-27_수중펌프.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-27_수중펌프.md new file mode 100644 index 00000000..5fe69d85 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-27_수중펌프.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-2-27 수중펌프 +PDF쪽: 272~273 +인쇄쪽: 216~217 +시작표지: 8-2-27 수중펌프 +끝표지: 8-2-28 터널전단면 굴착기(TBM) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-28_터널전단면_굴착기(TBM).md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-28_터널전단면_굴착기(TBM).md new file mode 100644 index 00000000..5b6bdd59 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-28_터널전단면_굴착기(TBM).md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-2-28 터널전단면 굴착기(TBM) +PDF쪽: 273~274 +인쇄쪽: 217~218 +시작표지: 8-2-28 터널전단면 굴착기(TBM) +끝표지: 8-2-29 펌프식 준설선('10, '11년 보완) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-29_펌프식_준설선.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-29_펌프식_준설선.md new file mode 100644 index 00000000..43164821 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-29_펌프식_준설선.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-2-29 펌프식 준설선('10, '11년 보완) +PDF쪽: 274~279 +인쇄쪽: 218~223 +시작표지: 8-2-29 펌프식 준설선('10, '11년 보완) +끝표지: 8-2-30 그래브 준설선('10, '11년 보완) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-30_그래브_준설선.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-30_그래브_준설선.md new file mode 100644 index 00000000..1cdb92b7 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-30_그래브_준설선.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-2-30 그래브 준설선('10, '11년 보완) +PDF쪽: 279~282 +인쇄쪽: 223~226 +시작표지: 8-2-30 그래브 준설선('10, '11년 보완) +끝표지: 8-2-31 쇄암선(중추식)('11년 보완) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-31_쇄암선(중추식).md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-31_쇄암선(중추식).md new file mode 100644 index 00000000..3a871f49 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-31_쇄암선(중추식).md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-2-31 쇄암선(중추식)('11년 보완) +PDF쪽: 282~283 +인쇄쪽: 226~227 +시작표지: 8-2-31 쇄암선(중추식)('11년 보완) +끝표지: 8-2-32 이동식 임목파쇄기('07년 신설, '11년 보완) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-32_이동식_임목파쇄기.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-32_이동식_임목파쇄기.md new file mode 100644 index 00000000..ee4a8f73 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-32_이동식_임목파쇄기.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-2-32 이동식 임목파쇄기('07년 신설, '11년 보완) +PDF쪽: 283~284 +인쇄쪽: 227~228 +시작표지: 8-2-32 이동식 임목파쇄기('07년 신설, '11년 보완) +끝표지: 8-2-33 하천골재채취선('05년 신설) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-33_하천골재채취선.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-33_하천골재채취선.md new file mode 100644 index 00000000..e3fed34d --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-02-33_하천골재채취선.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-2-33 하천골재채취선('05년 신설) +PDF쪽: 284~285 +인쇄쪽: 228~229 +시작표지: 8-2-33 하천골재채취선('05년 신설) +끝표지: 8-3 기계손료 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-03-00_절머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-03-00_절머리.md new file mode 100644 index 00000000..004ebcfe --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-03-00_절머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-3 기계손료 +PDF쪽: 285 +인쇄쪽: 229 +시작표지: 8-3 기계손료 +끝표지: 8-3-1 [00]토공기계('19년 보완) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-03-01_[00]토공기계.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-03-01_[00]토공기계.md new file mode 100644 index 00000000..0023ca7d --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-03-01_[00]토공기계.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-3-1 [00]토공기계('19년 보완) +PDF쪽: 285~290 +인쇄쪽: 229~234 +시작표지: 8-3-1 [00]토공기계('19년 보완) +끝표지: 8-3-2 [10]다짐기계 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-03-02_[10]다짐기계.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-03-02_[10]다짐기계.md new file mode 100644 index 00000000..63617501 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-03-02_[10]다짐기계.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-3-2 [10]다짐기계 +PDF쪽: 290~292 +인쇄쪽: 234~236 +시작표지: 8-3-2 [10]다짐기계 +끝표지: 8-3-3 [20]운반 및 하역기계 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-03-03_[20]운반_및_하역기계.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-03-03_[20]운반_및_하역기계.md new file mode 100644 index 00000000..a3c9ce6d --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-03-03_[20]운반_및_하역기계.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-3-3 [20]운반 및 하역기계 +PDF쪽: 292~296 +인쇄쪽: 236~240 +시작표지: 8-3-3 [20]운반 및 하역기계 +끝표지: 8-3-4 [30]포장기계 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-03-04_[30]포장기계.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-03-04_[30]포장기계.md new file mode 100644 index 00000000..becb905b --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-03-04_[30]포장기계.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-3-4 [30]포장기계 +PDF쪽: 296~299 +인쇄쪽: 240~243 +시작표지: 8-3-4 [30]포장기계 +끝표지: 8-3-5 [40]콘크리트기계 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-03-05_[40]콘크리트기계.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-03-05_[40]콘크리트기계.md new file mode 100644 index 00000000..0db87f14 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-03-05_[40]콘크리트기계.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-3-5 [40]콘크리트기계 +PDF쪽: 299~301 +인쇄쪽: 243~245 +시작표지: 8-3-5 [40]콘크리트기계 +끝표지: 8-3-6 [50]골재생산기계 등 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-03-06_[50]골재생산기계_등.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-03-06_[50]골재생산기계_등.md new file mode 100644 index 00000000..229041c9 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-03-06_[50]골재생산기계_등.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-3-6 [50]골재생산기계 등 +PDF쪽: 302~310 +인쇄쪽: 246~254 +시작표지: 8-3-6 [50]골재생산기계 등 +끝표지: 8-3-7 [60]기초공사용 기계 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-03-07_[60]기초공사용_기계.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-03-07_[60]기초공사용_기계.md new file mode 100644 index 00000000..6210cbcc --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-03-07_[60]기초공사용_기계.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-3-7 [60]기초공사용 기계 +PDF쪽: 311~315 +인쇄쪽: 255~259 +시작표지: 8-3-7 [60]기초공사용 기계 +끝표지: 8-3-8 [70]기타기계 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-03-08_[70]기타기계.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-03-08_[70]기타기계.md new file mode 100644 index 00000000..a452be08 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-03-08_[70]기타기계.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-3-8 [70]기타기계 +PDF쪽: 316~325 +인쇄쪽: 260~269 +시작표지: 8-3-8 [70]기타기계 +끝표지: 8-3-9 [80]스마트 건설장비 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-03-09_[80]스마트_건설장비.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-03-09_[80]스마트_건설장비.md new file mode 100644 index 00000000..87fa155f --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-03-09_[80]스마트_건설장비.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-3-9 [80]스마트 건설장비 +PDF쪽: 325~326 +인쇄쪽: 269~270 +시작표지: 8-3-9 [80]스마트 건설장비 +끝표지: 8-3-10 [90]해상장비 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-03-10_[90]해상장비.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-03-10_[90]해상장비.md new file mode 100644 index 00000000..c22cf10e --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-03-10_[90]해상장비.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-3-10 [90]해상장비 +PDF쪽: 326~330 +인쇄쪽: 270~274 +시작표지: 8-3-10 [90]해상장비 +끝표지: 8-4 운전경비 산정('08, '09, '10, '11, '12, '13, '14, '15, '16, '17년 보완) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-04_운전경비_산정.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-04_운전경비_산정.md new file mode 100644 index 00000000..6908a99f --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-04_운전경비_산정.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-4 운전경비 산정('08, '09, '10, '11, '12, '13, '14, '15, '16, '17년 보완) +PDF쪽: 331~343 +인쇄쪽: 275~287 +시작표지: 8-4 운전경비 산정('08, '09, '10, '11, '12, '13, '14, '15, '16, '17년 보완) +끝표지: 8-5 기계가격 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-05_기계가격.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-05_기계가격.md new file mode 100644 index 00000000..7d1d59d0 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/01_공통부문/제08장_건설기계/8-05_기계가격.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-5 기계가격 +PDF쪽: 343~360 +인쇄쪽: 287~304 +시작표지: 8-5 기계가격 +끝표지: 제1장 도로포장공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제01장_도로포장공사/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제01장_도로포장공사/0-00_장머리.md new file mode 100644 index 00000000..9f5e1214 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제01장_도로포장공사/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제1장 도로포장공사 +PDF쪽: 363 +인쇄쪽: 307 +시작표지: 제1장 도로포장공사 +끝표지: 1-1 공통사항 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제01장_도로포장공사/1-01_공통사항.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제01장_도로포장공사/1-01_공통사항.md new file mode 100644 index 00000000..eb4870a0 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제01장_도로포장공사/1-01_공통사항.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 1-1 공통사항 +PDF쪽: 363 +인쇄쪽: 307 +시작표지: 1-1 공통사항 +끝표지: 1-2 동상방지층('08년 신설, '17, '21년 보완) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제01장_도로포장공사/1-02_동상방지층.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제01장_도로포장공사/1-02_동상방지층.md new file mode 100644 index 00000000..1444cb08 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제01장_도로포장공사/1-02_동상방지층.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 1-2 동상방지층('08년 신설, '17, '21년 보완) +PDF쪽: 363~364 +인쇄쪽: 307~308 +시작표지: 1-2 동상방지층('08년 신설, '17, '21년 보완) +끝표지: 1-3 보조기층('08년 신설, '17, '21년 보완) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제01장_도로포장공사/1-03_보조기층.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제01장_도로포장공사/1-03_보조기층.md new file mode 100644 index 00000000..ccd51bf1 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제01장_도로포장공사/1-03_보조기층.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 1-3 보조기층('08년 신설, '17, '21년 보완) +PDF쪽: 364~365 +인쇄쪽: 308~309 +시작표지: 1-3 보조기층('08년 신설, '17, '21년 보완) +끝표지: 1-4 입도조정기층('08년 신설, '17, '21년 보완) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제01장_도로포장공사/1-04_입도조정기층.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제01장_도로포장공사/1-04_입도조정기층.md new file mode 100644 index 00000000..1cf1357c --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제01장_도로포장공사/1-04_입도조정기층.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 1-4 입도조정기층('08년 신설, '17, '21년 보완) +PDF쪽: 365~366 +인쇄쪽: 309~310 +시작표지: 1-4 입도조정기층('08년 신설, '17, '21년 보완) +끝표지: 1-5 아스콘 포장('08년 신설, '17, '21년 보완) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제01장_도로포장공사/1-05_아스콘_포장.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제01장_도로포장공사/1-05_아스콘_포장.md new file mode 100644 index 00000000..508e590b --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제01장_도로포장공사/1-05_아스콘_포장.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 1-5 아스콘 포장('08년 신설, '17, '21년 보완) +PDF쪽: 366~370 +인쇄쪽: 310~314 +시작표지: 1-5 아스콘 포장('08년 신설, '17, '21년 보완) +끝표지: 1-6 콘크리트 포장('08년 신설, '17, '21년 보완) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제01장_도로포장공사/1-06_콘크리트_포장.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제01장_도로포장공사/1-06_콘크리트_포장.md new file mode 100644 index 00000000..b27c9f1d --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제01장_도로포장공사/1-06_콘크리트_포장.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 1-6 콘크리트 포장('08년 신설, '17, '21년 보완) +PDF쪽: 371~373 +인쇄쪽: 315~317 +시작표지: 1-6 콘크리트 포장('08년 신설, '17, '21년 보완) +끝표지: 1-7 저속도로포장('08년 신설) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제01장_도로포장공사/1-07_저속도로포장.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제01장_도로포장공사/1-07_저속도로포장.md new file mode 100644 index 00000000..3208d5fb --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제01장_도로포장공사/1-07_저속도로포장.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 1-7 저속도로포장('08년 신설) +PDF쪽: 374~376 +인쇄쪽: 318~320 +시작표지: 1-7 저속도로포장('08년 신설) +끝표지: 1-8 교통시설공 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제01장_도로포장공사/1-08_교통시설공.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제01장_도로포장공사/1-08_교통시설공.md new file mode 100644 index 00000000..279502c0 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제01장_도로포장공사/1-08_교통시설공.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 1-8 교통시설공 +PDF쪽: 376~383 +인쇄쪽: 320~327 +시작표지: 1-8 교통시설공 +끝표지: 1-9 부대공 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제01장_도로포장공사/1-09_부대공.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제01장_도로포장공사/1-09_부대공.md new file mode 100644 index 00000000..9d38581d --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제01장_도로포장공사/1-09_부대공.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 1-9 부대공 +PDF쪽: 384~387 +인쇄쪽: 328~331 +시작표지: 1-9 부대공 +끝표지: 제2장 하천공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제02장_하천공사/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제02장_하천공사/0-00_장머리.md new file mode 100644 index 00000000..a30c6975 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제02장_하천공사/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제2장 하천공사 +PDF쪽: 389 +인쇄쪽: 333 +시작표지: 제2장 하천공사 +끝표지: 2-1 사석 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제02장_하천공사/2-01_사석.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제02장_하천공사/2-01_사석.md new file mode 100644 index 00000000..6b5ef9b0 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제02장_하천공사/2-01_사석.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 2-1 사석 +PDF쪽: 389 +인쇄쪽: 333 +시작표지: 2-1 사석 +끝표지: 2-2 돌망태 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제02장_하천공사/2-02_돌망태.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제02장_하천공사/2-02_돌망태.md new file mode 100644 index 00000000..0750da55 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제02장_하천공사/2-02_돌망태.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 2-2 돌망태 +PDF쪽: 389~390 +인쇄쪽: 333~334 +시작표지: 2-2 돌망태 +끝표지: 2-3 하천호안공 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제02장_하천공사/2-03_하천호안공.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제02장_하천공사/2-03_하천호안공.md new file mode 100644 index 00000000..6a12f958 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제02장_하천공사/2-03_하천호안공.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 2-3 하천호안공 +PDF쪽: 390~391 +인쇄쪽: 334~335 +시작표지: 2-3 하천호안공 +끝표지: 제3장 터널공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제03장_터널공사/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제03장_터널공사/0-00_장머리.md new file mode 100644 index 00000000..f03e1904 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제03장_터널공사/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제3장 터널공사 +PDF쪽: 393 +인쇄쪽: 337 +시작표지: 제3장 터널공사 +끝표지: 3-1 공통사항 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제03장_터널공사/3-01_공통사항.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제03장_터널공사/3-01_공통사항.md new file mode 100644 index 00000000..97a54890 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제03장_터널공사/3-01_공통사항.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 3-1 공통사항 +PDF쪽: 393~394 +인쇄쪽: 337~338 +시작표지: 3-1 공통사항 +끝표지: 3-2 터널굴착 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제03장_터널공사/3-02_터널굴착.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제03장_터널공사/3-02_터널굴착.md new file mode 100644 index 00000000..51f8a004 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제03장_터널공사/3-02_터널굴착.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 3-2 터널굴착 +PDF쪽: 394~398 +인쇄쪽: 338~342 +시작표지: 3-2 터널굴착 +끝표지: 3-3 현장 타설 콘크리트 라이닝 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제03장_터널공사/3-03_현장_타설_콘크리트_라이닝.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제03장_터널공사/3-03_현장_타설_콘크리트_라이닝.md new file mode 100644 index 00000000..cab22e09 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제03장_터널공사/3-03_현장_타설_콘크리트_라이닝.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 3-3 현장 타설 콘크리트 라이닝 +PDF쪽: 398 +인쇄쪽: 342 +시작표지: 3-3 현장 타설 콘크리트 라이닝 +끝표지: 3-4 부대공 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제03장_터널공사/3-04_부대공.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제03장_터널공사/3-04_부대공.md new file mode 100644 index 00000000..3f6f3a9e --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제03장_터널공사/3-04_부대공.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 3-4 부대공 +PDF쪽: 399 +인쇄쪽: 343 +시작표지: 3-4 부대공 +끝표지: 제4장 궤도공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제04장_궤도공사/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제04장_궤도공사/0-00_장머리.md new file mode 100644 index 00000000..80219138 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제04장_궤도공사/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제4장 궤도공사 +PDF쪽: 401 +인쇄쪽: 345 +시작표지: 제4장 궤도공사 +끝표지: 4-1 공통공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제04장_궤도공사/4-01_공통공사.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제04장_궤도공사/4-01_공통공사.md new file mode 100644 index 00000000..89ebbbb7 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제04장_궤도공사/4-01_공통공사.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 4-1 공통공사 +PDF쪽: 401 +인쇄쪽: 345 +시작표지: 4-1 공통공사 +끝표지: 4-2 자갈궤도 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제04장_궤도공사/4-02_자갈궤도.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제04장_궤도공사/4-02_자갈궤도.md new file mode 100644 index 00000000..d0ed2e06 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제04장_궤도공사/4-02_자갈궤도.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 4-2 자갈궤도 +PDF쪽: 401~402 +인쇄쪽: 345~346 +시작표지: 4-2 자갈궤도 +끝표지: 4-3 콘크리트 궤도 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제04장_궤도공사/4-03_콘크리트_궤도.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제04장_궤도공사/4-03_콘크리트_궤도.md new file mode 100644 index 00000000..d1e1f4d9 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제04장_궤도공사/4-03_콘크리트_궤도.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 4-3 콘크리트 궤도 +PDF쪽: 402~403 +인쇄쪽: 346~347 +시작표지: 4-3 콘크리트 궤도 +끝표지: 4-4 분기기 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제04장_궤도공사/4-04_분기기.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제04장_궤도공사/4-04_분기기.md new file mode 100644 index 00000000..f39cf7d1 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제04장_궤도공사/4-04_분기기.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 4-4 분기기 +PDF쪽: 404 +인쇄쪽: 348 +시작표지: 4-4 분기기 +끝표지: 4-5 궤도용접 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제04장_궤도공사/4-05_궤도용접.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제04장_궤도공사/4-05_궤도용접.md new file mode 100644 index 00000000..7e28ee25 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제04장_궤도공사/4-05_궤도용접.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 4-5 궤도용접 +PDF쪽: 405~406 +인쇄쪽: 349~350 +시작표지: 4-5 궤도용접 +끝표지: 4-6 부대공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제04장_궤도공사/4-06_부대공사.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제04장_궤도공사/4-06_부대공사.md new file mode 100644 index 00000000..6da7d1cb --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제04장_궤도공사/4-06_부대공사.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 4-6 부대공사 +PDF쪽: 407~409 +인쇄쪽: 351~353 +시작표지: 4-6 부대공사 +끝표지: 제5장 강구조공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제05장_강구조공사/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제05장_강구조공사/0-00_장머리.md new file mode 100644 index 00000000..62fb8745 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제05장_강구조공사/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제5장 강구조공사 +PDF쪽: 411 +인쇄쪽: 355 +시작표지: 제5장 강구조공사 +끝표지: 5-1 강교제작(공장제작) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제05장_강구조공사/5-01_강교제작(공장제작).md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제05장_강구조공사/5-01_강교제작(공장제작).md new file mode 100644 index 00000000..32bc570e --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제05장_강구조공사/5-01_강교제작(공장제작).md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 5-1 강교제작(공장제작) +PDF쪽: 411~414 +인쇄쪽: 355~358 +시작표지: 5-1 강교제작(공장제작) +끝표지: 5-2 강교도장 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제05장_강구조공사/5-02_강교도장.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제05장_강구조공사/5-02_강교도장.md new file mode 100644 index 00000000..863a069b --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제05장_강구조공사/5-02_강교도장.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 5-2 강교도장 +PDF쪽: 414~416 +인쇄쪽: 358~360 +시작표지: 5-2 강교도장 +끝표지: 5-3 강재거더 가설 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제05장_강구조공사/5-03_강재거더_가설.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제05장_강구조공사/5-03_강재거더_가설.md new file mode 100644 index 00000000..fd50818a --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제05장_강구조공사/5-03_강재거더_가설.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 5-3 강재거더 가설 +PDF쪽: 416~418 +인쇄쪽: 360~362 +시작표지: 5-3 강재거더 가설 +끝표지: 제6장 관부설 및 접합공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제06장_관부설_및_접합공사/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제06장_관부설_및_접합공사/0-00_장머리.md new file mode 100644 index 00000000..701331d3 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제06장_관부설_및_접합공사/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제6장 관부설 및 접합공사 +PDF쪽: 419 +인쇄쪽: 363 +시작표지: 제6장 관부설 및 접합공사 +끝표지: 6-1 공통사항 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제06장_관부설_및_접합공사/6-01_공통사항.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제06장_관부설_및_접합공사/6-01_공통사항.md new file mode 100644 index 00000000..cff3af12 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제06장_관부설_및_접합공사/6-01_공통사항.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 6-1 공통사항 +PDF쪽: 419 +인쇄쪽: 363 +시작표지: 6-1 공통사항 +끝표지: 6-2 주철관 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제06장_관부설_및_접합공사/6-02_주철관.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제06장_관부설_및_접합공사/6-02_주철관.md new file mode 100644 index 00000000..56ddf407 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제06장_관부설_및_접합공사/6-02_주철관.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 6-2 주철관 +PDF쪽: 420~422 +인쇄쪽: 364~366 +시작표지: 6-2 주철관 +끝표지: 6-3 강관 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제06장_관부설_및_접합공사/6-03_강관.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제06장_관부설_및_접합공사/6-03_강관.md new file mode 100644 index 00000000..15d79088 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제06장_관부설_및_접합공사/6-03_강관.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 6-3 강관 +PDF쪽: 422~425 +인쇄쪽: 366~369 +시작표지: 6-3 강관 +끝표지: 6-4 P.V.C관('10, '11, '18년 보완) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제06장_관부설_및_접합공사/6-04_P.V.C관.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제06장_관부설_및_접합공사/6-04_P.V.C관.md new file mode 100644 index 00000000..1e8f2ea9 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제06장_관부설_및_접합공사/6-04_P.V.C관.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 6-4 P.V.C관('10, '11, '18년 보완) +PDF쪽: 425~426 +인쇄쪽: 369~370 +시작표지: 6-4 P.V.C관('10, '11, '18년 보완) +끝표지: 6-5 P.E관('10, '11, '18년 보완) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제06장_관부설_및_접합공사/6-05_P.E관.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제06장_관부설_및_접합공사/6-05_P.E관.md new file mode 100644 index 00000000..7c454b97 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제06장_관부설_및_접합공사/6-05_P.E관.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 6-5 P.E관('10, '11, '18년 보완) +PDF쪽: 426~427 +인쇄쪽: 370~371 +시작표지: 6-5 P.E관('10, '11, '18년 보완) +끝표지: 6-6 원심력 철근콘크리트관('10, '18년 보완) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제06장_관부설_및_접합공사/6-06_원심력_철근콘크리트관.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제06장_관부설_및_접합공사/6-06_원심력_철근콘크리트관.md new file mode 100644 index 00000000..ce264afb --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제06장_관부설_및_접합공사/6-06_원심력_철근콘크리트관.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 6-6 원심력 철근콘크리트관('10, '18년 보완) +PDF쪽: 428~430 +인쇄쪽: 372~374 +시작표지: 6-6 원심력 철근콘크리트관('10, '18년 보완) +끝표지: 6-7 기타관 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제06장_관부설_및_접합공사/6-07_기타관.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제06장_관부설_및_접합공사/6-07_기타관.md new file mode 100644 index 00000000..cf1b967c --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제06장_관부설_및_접합공사/6-07_기타관.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 6-7 기타관 +PDF쪽: 430~435 +인쇄쪽: 374~379 +시작표지: 6-7 기타관 +끝표지: 6-8 밸브 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제06장_관부설_및_접합공사/6-08_밸브.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제06장_관부설_및_접합공사/6-08_밸브.md new file mode 100644 index 00000000..3b5ecb9f --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제06장_관부설_및_접합공사/6-08_밸브.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 6-8 밸브 +PDF쪽: 435~441 +인쇄쪽: 379~385 +시작표지: 6-8 밸브 +끝표지: 제7장 항만공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제07장_항만공사/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제07장_항만공사/0-00_장머리.md new file mode 100644 index 00000000..3663bb9f --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제07장_항만공사/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제7장 항만공사 +PDF쪽: 443 +인쇄쪽: 387 +시작표지: 제7장 항만공사 +끝표지: 7-1 설계기준 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제07장_항만공사/7-01_설계기준.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제07장_항만공사/7-01_설계기준.md new file mode 100644 index 00000000..fa0720d4 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제07장_항만공사/7-01_설계기준.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 7-1 설계기준 +PDF쪽: 443~445 +인쇄쪽: 387~389 +시작표지: 7-1 설계기준 +끝표지: 7-2 사석 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제07장_항만공사/7-02_사석.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제07장_항만공사/7-02_사석.md new file mode 100644 index 00000000..5da9a910 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제07장_항만공사/7-02_사석.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 7-2 사석 +PDF쪽: 445~447 +인쇄쪽: 389~391 +시작표지: 7-2 사석 +끝표지: 7-3 블록 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제07장_항만공사/7-03_블록.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제07장_항만공사/7-03_블록.md new file mode 100644 index 00000000..63100c5c --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제07장_항만공사/7-03_블록.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 7-3 블록 +PDF쪽: 448~449 +인쇄쪽: 392~393 +시작표지: 7-3 블록 +끝표지: 7-4 준설 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제07장_항만공사/7-04_준설.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제07장_항만공사/7-04_준설.md new file mode 100644 index 00000000..c2c7718c --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제07장_항만공사/7-04_준설.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 7-4 준설 +PDF쪽: 449~452 +인쇄쪽: 393~396 +시작표지: 7-4 준설 +끝표지: 제8장 지반조사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제08장_지반조사/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제08장_지반조사/0-00_장머리.md new file mode 100644 index 00000000..3bf2b307 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제08장_지반조사/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제8장 지반조사 +PDF쪽: 453 +인쇄쪽: 397 +시작표지: 제8장 지반조사 +끝표지: 8-1 보링 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제08장_지반조사/8-01_보링.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제08장_지반조사/8-01_보링.md new file mode 100644 index 00000000..a36c7e48 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제08장_지반조사/8-01_보링.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-1 보링 +PDF쪽: 453~454 +인쇄쪽: 397~398 +시작표지: 8-1 보링 +끝표지: 8-2 시험 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제08장_지반조사/8-02_시험.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제08장_지반조사/8-02_시험.md new file mode 100644 index 00000000..d82c4152 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제08장_지반조사/8-02_시험.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-2 시험 +PDF쪽: 454~456 +인쇄쪽: 398~400 +시작표지: 8-2 시험 +끝표지: 8-3 물리탐사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제08장_지반조사/8-03_물리탐사.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제08장_지반조사/8-03_물리탐사.md new file mode 100644 index 00000000..edc51938 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제08장_지반조사/8-03_물리탐사.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-3 물리탐사 +PDF쪽: 457 +인쇄쪽: 401 +시작표지: 8-3 물리탐사 +끝표지: 8-4 대구경 보링(지하수개발) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제08장_지반조사/8-04_대구경_보링(지하수개발).md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제08장_지반조사/8-04_대구경_보링(지하수개발).md new file mode 100644 index 00000000..ce0ec515 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제08장_지반조사/8-04_대구경_보링(지하수개발).md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-4 대구경 보링(지하수개발) +PDF쪽: 458~461 +인쇄쪽: 402~405 +시작표지: 8-4 대구경 보링(지하수개발) +끝표지: 제9장 측량 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/0-00_장머리.md new file mode 100644 index 00000000..3ac9a077 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제9장 측량 +PDF쪽: 463 +인쇄쪽: 407 +시작표지: 제9장 측량 +끝표지: 9-1 기준점 측량 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-01_기준점_측량.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-01_기준점_측량.md new file mode 100644 index 00000000..73e23966 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-01_기준점_측량.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 9-1 기준점 측량 +PDF쪽: 463~469 +인쇄쪽: 407~413 +시작표지: 9-1 기준점 측량 +끝표지: 9-2 수준측량 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-02_수준측량.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-02_수준측량.md new file mode 100644 index 00000000..6294bc6b --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-02_수준측량.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 9-2 수준측량 +PDF쪽: 470~487 +인쇄쪽: 414~431 +시작표지: 9-2 수준측량 +끝표지: 9-3 지형 및 토지측량 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-03_지형_및_토지측량.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-03_지형_및_토지측량.md new file mode 100644 index 00000000..c0d154ee --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-03_지형_및_토지측량.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 9-3 지형 및 토지측량 +PDF쪽: 488~509 +인쇄쪽: 432~453 +시작표지: 9-3 지형 및 토지측량 +끝표지: 9-4 노선측량 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-04_노선측량.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-04_노선측량.md new file mode 100644 index 00000000..e30bcc42 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-04_노선측량.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 9-4 노선측량 +PDF쪽: 509~519 +인쇄쪽: 453~463 +시작표지: 9-4 노선측량 +끝표지: 9-5 지도제작 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-05-00_절머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-05-00_절머리.md new file mode 100644 index 00000000..375553f3 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-05-00_절머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 9-5 지도제작 +PDF쪽: 520 +인쇄쪽: 464 +시작표지: 9-5 지도제작 +끝표지: 9-5-1 항공사진촬영('10, '21, '26년 보완) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-05-01_항공사진촬영.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-05-01_항공사진촬영.md new file mode 100644 index 00000000..820f9849 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-05-01_항공사진촬영.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 9-5-1 항공사진촬영('10, '21, '26년 보완) +PDF쪽: 520~528 +인쇄쪽: 464~472 +시작표지: 9-5-1 항공사진촬영('10, '21, '26년 보완) +끝표지: 9-5-2 대공표지('21, '26년 보완) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-05-02_대공표지.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-05-02_대공표지.md new file mode 100644 index 00000000..5698adaa --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-05-02_대공표지.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 9-5-2 대공표지('21, '26년 보완) +PDF쪽: 528 +인쇄쪽: 472 +시작표지: 9-5-2 대공표지('21, '26년 보완) +끝표지: 9-5-3 사진 기준점 측량('21, '26년 보완) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-05-03_사진_기준점_측량.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-05-03_사진_기준점_측량.md new file mode 100644 index 00000000..afcc1d8b --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-05-03_사진_기준점_측량.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 9-5-3 사진 기준점 측량('21, '26년 보완) +PDF쪽: 529 +인쇄쪽: 473 +시작표지: 9-5-3 사진 기준점 측량('21, '26년 보완) +끝표지: 9-5-4 수치지도 작성('21, '22, '24, '26년 보완) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-05-04_수치지도_작성.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-05-04_수치지도_작성.md new file mode 100644 index 00000000..4fcfd733 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-05-04_수치지도_작성.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 9-5-4 수치지도 작성('21, '22, '24, '26년 보완) +PDF쪽: 529~568 +인쇄쪽: 473~512 +시작표지: 9-5-4 수치지도 작성('21, '22, '24, '26년 보완) +끝표지: 9-5-5 건물 및 지상물체 항공사진 「판독작업」 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-05-05_건물_및_지상물체_항공사진_「판독작업」.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-05-05_건물_및_지상물체_항공사진_「판독작업」.md new file mode 100644 index 00000000..96623e9d --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-05-05_건물_및_지상물체_항공사진_「판독작업」.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 9-5-5 건물 및 지상물체 항공사진 「판독작업」 +PDF쪽: 568~569 +인쇄쪽: 512~513 +시작표지: 9-5-5 건물 및 지상물체 항공사진 「판독작업」 +끝표지: 9-5-6 지도제작(기본도) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-05-06_지도제작(기본도).md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-05-06_지도제작(기본도).md new file mode 100644 index 00000000..40d96132 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-05-06_지도제작(기본도).md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 9-5-6 지도제작(기본도) +PDF쪽: 569~571 +인쇄쪽: 513~515 +시작표지: 9-5-6 지도제작(기본도) +끝표지: 9-5-7 토지이용 현황도 제작 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-05-07_토지이용_현황도_제작.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-05-07_토지이용_현황도_제작.md new file mode 100644 index 00000000..930473f8 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-05-07_토지이용_현황도_제작.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 9-5-7 토지이용 현황도 제작 +PDF쪽: 571 +인쇄쪽: 515 +시작표지: 9-5-7 토지이용 현황도 제작 +끝표지: 9-5-8 상각비 산정 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-05-08_상각비_산정.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-05-08_상각비_산정.md new file mode 100644 index 00000000..4e44c01a --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-05-08_상각비_산정.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 9-5-8 상각비 산정 +PDF쪽: 572 +인쇄쪽: 516 +시작표지: 9-5-8 상각비 산정 +끝표지: 9-5-9 정밀도로지도 구축('19년 신설, '20년 보완) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-05-09_정밀도로지도_구축.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-05-09_정밀도로지도_구축.md new file mode 100644 index 00000000..91668550 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-05-09_정밀도로지도_구축.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 9-5-9 정밀도로지도 구축('19년 신설, '20년 보완) +PDF쪽: 572~573 +인쇄쪽: 516~517 +시작표지: 9-5-9 정밀도로지도 구축('19년 신설, '20년 보완) +끝표지: 9-5-10 무인비행장치 측량('20년 신설, '26년 보완) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-05-10_무인비행장치_측량.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-05-10_무인비행장치_측량.md new file mode 100644 index 00000000..9d9e6b1f --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-05-10_무인비행장치_측량.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 9-5-10 무인비행장치 측량('20년 신설, '26년 보완) +PDF쪽: 574~576 +인쇄쪽: 518~520 +시작표지: 9-5-10 무인비행장치 측량('20년 신설, '26년 보완) +끝표지: 9-6 지적기준점측량 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-06_지적기준점측량.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-06_지적기준점측량.md new file mode 100644 index 00000000..15cb48db --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-06_지적기준점측량.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 9-6 지적기준점측량 +PDF쪽: 577~581 +인쇄쪽: 521~525 +시작표지: 9-6 지적기준점측량 +끝표지: 9-7 신규등록측량 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-07_신규등록측량.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-07_신규등록측량.md new file mode 100644 index 00000000..c6ee47a2 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-07_신규등록측량.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 9-7 신규등록측량 +PDF쪽: 581~587 +인쇄쪽: 525~531 +시작표지: 9-7 신규등록측량 +끝표지: 9-8 등록전환 측량 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-08_등록전환_측량.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-08_등록전환_측량.md new file mode 100644 index 00000000..965dd36a --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-08_등록전환_측량.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 9-8 등록전환 측량 +PDF쪽: 587~590 +인쇄쪽: 531~534 +시작표지: 9-8 등록전환 측량 +끝표지: 9-9 분할측량 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-09_분할측량.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-09_분할측량.md new file mode 100644 index 00000000..992cd6fb --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-09_분할측량.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 9-9 분할측량 +PDF쪽: 590~593 +인쇄쪽: 534~537 +시작표지: 9-9 분할측량 +끝표지: 9-10 축척변경 측량 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-10_축척변경_측량.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-10_축척변경_측량.md new file mode 100644 index 00000000..bae520e6 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-10_축척변경_측량.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 9-10 축척변경 측량 +PDF쪽: 594~596 +인쇄쪽: 538~540 +시작표지: 9-10 축척변경 측량 +끝표지: 9-11 지적확정측량 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-11_지적확정측량.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-11_지적확정측량.md new file mode 100644 index 00000000..28a3522f --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-11_지적확정측량.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 9-11 지적확정측량 +PDF쪽: 597~601 +인쇄쪽: 541~545 +시작표지: 9-11 지적확정측량 +끝표지: 9-12 예정지적좌표도 작성업무 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-12_예정지적좌표도_작성업무.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-12_예정지적좌표도_작성업무.md new file mode 100644 index 00000000..b074ca3c --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-12_예정지적좌표도_작성업무.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 9-12 예정지적좌표도 작성업무 +PDF쪽: 602 +인쇄쪽: 546 +시작표지: 9-12 예정지적좌표도 작성업무 +끝표지: 9-13 지적재조사측량 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-13_지적재조사측량.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-13_지적재조사측량.md new file mode 100644 index 00000000..6a12961c --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-13_지적재조사측량.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 9-13 지적재조사측량 +PDF쪽: 603~604 +인쇄쪽: 547~548 +시작표지: 9-13 지적재조사측량 +끝표지: 9-14 경계복원 측량 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-14_경계복원_측량.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-14_경계복원_측량.md new file mode 100644 index 00000000..1a5edbdf --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-14_경계복원_측량.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 9-14 경계복원 측량 +PDF쪽: 604~607 +인쇄쪽: 548~551 +시작표지: 9-14 경계복원 측량 +끝표지: 9-15 지적현황 측량 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-15_지적현황_측량.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-15_지적현황_측량.md new file mode 100644 index 00000000..e3c5bd38 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-15_지적현황_측량.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 9-15 지적현황 측량 +PDF쪽: 607~611 +인쇄쪽: 551~555 +시작표지: 9-15 지적현황 측량 +끝표지: 9-16 도시계획선명시 측량 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-16_도시계획선명시_측량.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-16_도시계획선명시_측량.md new file mode 100644 index 00000000..28f0b4b3 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-16_도시계획선명시_측량.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 9-16 도시계획선명시 측량 +PDF쪽: 612~614 +인쇄쪽: 556~558 +시작표지: 9-16 도시계획선명시 측량 +끝표지: 9-17 도면작성 및 조서작성 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-17_도면작성_및_조서작성.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-17_도면작성_및_조서작성.md new file mode 100644 index 00000000..acd5eada --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-17_도면작성_및_조서작성.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 9-17 도면작성 및 조서작성 +PDF쪽: 615~618 +인쇄쪽: 559~562 +시작표지: 9-17 도면작성 및 조서작성 +끝표지: 9-18 자료정비('26년 신설) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-18_자료정비.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-18_자료정비.md new file mode 100644 index 00000000..91aa7126 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/02_토목부문/제09장_측량/9-18_자료정비.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 9-18 자료정비('26년 신설) +PDF쪽: 618~622 +인쇄쪽: 562~566 +시작표지: 9-18 자료정비('26년 신설) +끝표지: 제1장 철골공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제01장_철골공사/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제01장_철골공사/0-00_장머리.md new file mode 100644 index 00000000..db39cbe5 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제01장_철골공사/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제1장 철골공사 +PDF쪽: 625 +인쇄쪽: 569 +시작표지: 제1장 철골공사 +끝표지: 1-1 철골 가공 조립(공장생산) +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제01장_철골공사/1-01_철골_가공_조립(공장생산).md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제01장_철골공사/1-01_철골_가공_조립(공장생산).md new file mode 100644 index 00000000..8f4b3103 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제01장_철골공사/1-01_철골_가공_조립(공장생산).md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 1-1 철골 가공 조립(공장생산) +PDF쪽: 625~626 +인쇄쪽: 569~570 +시작표지: 1-1 철골 가공 조립(공장생산) +끝표지: 1-2 철골 세우기 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제01장_철골공사/1-02_철골_세우기.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제01장_철골공사/1-02_철골_세우기.md new file mode 100644 index 00000000..0ab6a590 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제01장_철골공사/1-02_철골_세우기.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 1-2 철골 세우기 +PDF쪽: 627~630 +인쇄쪽: 571~574 +시작표지: 1-2 철골 세우기 +끝표지: 1-3 데크플레이트 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제01장_철골공사/1-03_데크플레이트.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제01장_철골공사/1-03_데크플레이트.md new file mode 100644 index 00000000..d7fb40a8 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제01장_철골공사/1-03_데크플레이트.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 1-3 데크플레이트 +PDF쪽: 631 +인쇄쪽: 575 +시작표지: 1-3 데크플레이트 +끝표지: 1-4 부대공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제01장_철골공사/1-04_부대공사.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제01장_철골공사/1-04_부대공사.md new file mode 100644 index 00000000..fcbec529 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제01장_철골공사/1-04_부대공사.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 1-4 부대공사 +PDF쪽: 632~633 +인쇄쪽: 576~577 +시작표지: 1-4 부대공사 +끝표지: 제2장 조적공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제02장_조적공사/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제02장_조적공사/0-00_장머리.md new file mode 100644 index 00000000..d94fcf68 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제02장_조적공사/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제2장 조적공사 +PDF쪽: 635 +인쇄쪽: 579 +시작표지: 제2장 조적공사 +끝표지: 2-1 벽돌 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제02장_조적공사/2-01_벽돌.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제02장_조적공사/2-01_벽돌.md new file mode 100644 index 00000000..e20cadb8 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제02장_조적공사/2-01_벽돌.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 2-1 벽돌 +PDF쪽: 635~637 +인쇄쪽: 579~581 +시작표지: 2-1 벽돌 +끝표지: 2-2 블록 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제02장_조적공사/2-02_블록.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제02장_조적공사/2-02_블록.md new file mode 100644 index 00000000..2f6317d4 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제02장_조적공사/2-02_블록.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 2-2 블록 +PDF쪽: 638~639 +인쇄쪽: 582~583 +시작표지: 2-2 블록 +끝표지: 2-3 ALC +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제02장_조적공사/2-03_ALC.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제02장_조적공사/2-03_ALC.md new file mode 100644 index 00000000..1a2f0b1b --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제02장_조적공사/2-03_ALC.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 2-3 ALC +PDF쪽: 639~640 +인쇄쪽: 583~584 +시작표지: 2-3 ALC +끝표지: 제3장 타일공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제03장_타일공사/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제03장_타일공사/0-00_장머리.md new file mode 100644 index 00000000..02e2bfc6 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제03장_타일공사/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제3장 타일공사 +PDF쪽: 641 +인쇄쪽: 585 +시작표지: 제3장 타일공사 +끝표지: 3-1 공통공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제03장_타일공사/3-01_공통공사.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제03장_타일공사/3-01_공통공사.md new file mode 100644 index 00000000..e251fc32 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제03장_타일공사/3-01_공통공사.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 3-1 공통공사 +PDF쪽: 641 +인쇄쪽: 585 +시작표지: 3-1 공통공사 +끝표지: 3-2 타일 붙임 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제03장_타일공사/3-02_타일_붙임.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제03장_타일공사/3-02_타일_붙임.md new file mode 100644 index 00000000..4b437273 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제03장_타일공사/3-02_타일_붙임.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 3-2 타일 붙임 +PDF쪽: 641~643 +인쇄쪽: 585~587 +시작표지: 3-2 타일 붙임 +끝표지: 제4장 목공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제04장_목공사/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제04장_목공사/0-00_장머리.md new file mode 100644 index 00000000..e1b65bc3 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제04장_목공사/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제4장 목공사 +PDF쪽: 645 +인쇄쪽: 589 +시작표지: 제4장 목공사 +끝표지: 4-1 구조목공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제04장_목공사/4-01_구조목공사.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제04장_목공사/4-01_구조목공사.md new file mode 100644 index 00000000..d9567a4f --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제04장_목공사/4-01_구조목공사.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 4-1 구조목공사 +PDF쪽: 645 +인쇄쪽: 589 +시작표지: 4-1 구조목공사 +끝표지: 4-2 수장목공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제04장_목공사/4-02_수장목공사.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제04장_목공사/4-02_수장목공사.md new file mode 100644 index 00000000..b963e9d3 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제04장_목공사/4-02_수장목공사.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 4-2 수장목공사 +PDF쪽: 646~647 +인쇄쪽: 590~591 +시작표지: 4-2 수장목공사 +끝표지: 4-3 부대목공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제04장_목공사/4-03_부대목공사.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제04장_목공사/4-03_부대목공사.md new file mode 100644 index 00000000..e8256918 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제04장_목공사/4-03_부대목공사.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 4-3 부대목공사 +PDF쪽: 647~648 +인쇄쪽: 591~592 +시작표지: 4-3 부대목공사 +끝표지: 제5장 수장공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제05장_수장공사/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제05장_수장공사/0-00_장머리.md new file mode 100644 index 00000000..06492825 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제05장_수장공사/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제5장 수장공사 +PDF쪽: 649 +인쇄쪽: 593 +시작표지: 제5장 수장공사 +끝표지: 5-1 바닥 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제05장_수장공사/5-01_바닥.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제05장_수장공사/5-01_바닥.md new file mode 100644 index 00000000..b4ee4aa0 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제05장_수장공사/5-01_바닥.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 5-1 바닥 +PDF쪽: 649~650 +인쇄쪽: 593~594 +시작표지: 5-1 바닥 +끝표지: 5-2 천장 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제05장_수장공사/5-02_천장.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제05장_수장공사/5-02_천장.md new file mode 100644 index 00000000..e11ba785 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제05장_수장공사/5-02_천장.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 5-2 천장 +PDF쪽: 650~651 +인쇄쪽: 594~595 +시작표지: 5-2 천장 +끝표지: 5-3 벽 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제05장_수장공사/5-03_벽.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제05장_수장공사/5-03_벽.md new file mode 100644 index 00000000..cf413d0e --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제05장_수장공사/5-03_벽.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 5-3 벽 +PDF쪽: 651~654 +인쇄쪽: 595~598 +시작표지: 5-3 벽 +끝표지: 5-4 단열 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제05장_수장공사/5-04_단열.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제05장_수장공사/5-04_단열.md new file mode 100644 index 00000000..2235ae86 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제05장_수장공사/5-04_단열.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 5-4 단열 +PDF쪽: 654~658 +인쇄쪽: 598~602 +시작표지: 5-4 단열 +끝표지: 제6장 방수공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제06장_방수공사/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제06장_방수공사/0-00_장머리.md new file mode 100644 index 00000000..e29f4074 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제06장_방수공사/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제6장 방수공사 +PDF쪽: 659 +인쇄쪽: 603 +시작표지: 제6장 방수공사 +끝표지: 6-1 공통공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제06장_방수공사/6-01_공통공사.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제06장_방수공사/6-01_공통공사.md new file mode 100644 index 00000000..131179c5 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제06장_방수공사/6-01_공통공사.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 6-1 공통공사 +PDF쪽: 659~660 +인쇄쪽: 603~604 +시작표지: 6-1 공통공사 +끝표지: 6-2 도막방수 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제06장_방수공사/6-02_도막방수.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제06장_방수공사/6-02_도막방수.md new file mode 100644 index 00000000..16949ca5 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제06장_방수공사/6-02_도막방수.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 6-2 도막방수 +PDF쪽: 660 +인쇄쪽: 604 +시작표지: 6-2 도막방수 +끝표지: 6-3 시트 방수 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제06장_방수공사/6-03_시트_방수.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제06장_방수공사/6-03_시트_방수.md new file mode 100644 index 00000000..d6b9e468 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제06장_방수공사/6-03_시트_방수.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 6-3 시트 방수 +PDF쪽: 661 +인쇄쪽: 605 +시작표지: 6-3 시트 방수 +끝표지: 6-4 시멘트 모르타르계 방수 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제06장_방수공사/6-04_시멘트_모르타르계_방수.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제06장_방수공사/6-04_시멘트_모르타르계_방수.md new file mode 100644 index 00000000..d046a894 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제06장_방수공사/6-04_시멘트_모르타르계_방수.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 6-4 시멘트 모르타르계 방수 +PDF쪽: 662~663 +인쇄쪽: 606~607 +시작표지: 6-4 시멘트 모르타르계 방수 +끝표지: 6-5 기타방수 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제06장_방수공사/6-05_기타방수.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제06장_방수공사/6-05_기타방수.md new file mode 100644 index 00000000..b1b1b14c --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제06장_방수공사/6-05_기타방수.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 6-5 기타방수 +PDF쪽: 663~664 +인쇄쪽: 607~608 +시작표지: 6-5 기타방수 +끝표지: 6-6 부대공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제06장_방수공사/6-06_부대공사.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제06장_방수공사/6-06_부대공사.md new file mode 100644 index 00000000..651c566c --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제06장_방수공사/6-06_부대공사.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 6-6 부대공사 +PDF쪽: 664~665 +인쇄쪽: 608~609 +시작표지: 6-6 부대공사 +끝표지: 제7장 지붕 및 홈통공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제07장_지붕_및_홈통공사/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제07장_지붕_및_홈통공사/0-00_장머리.md new file mode 100644 index 00000000..86a12edd --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제07장_지붕_및_홈통공사/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제7장 지붕 및 홈통공사 +PDF쪽: 667 +인쇄쪽: 611 +시작표지: 제7장 지붕 및 홈통공사 +끝표지: 7-1 지붕 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제07장_지붕_및_홈통공사/7-01_지붕.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제07장_지붕_및_홈통공사/7-01_지붕.md new file mode 100644 index 00000000..4db1e0e6 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제07장_지붕_및_홈통공사/7-01_지붕.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 7-1 지붕 +PDF쪽: 667~669 +인쇄쪽: 611~613 +시작표지: 7-1 지붕 +끝표지: 7-2 홈통 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제07장_지붕_및_홈통공사/7-02_홈통.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제07장_지붕_및_홈통공사/7-02_홈통.md new file mode 100644 index 00000000..9b7d6e8b --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제07장_지붕_및_홈통공사/7-02_홈통.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 7-2 홈통 +PDF쪽: 669~671 +인쇄쪽: 613~615 +시작표지: 7-2 홈통 +끝표지: 7-3 드레인 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제07장_지붕_및_홈통공사/7-03_드레인.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제07장_지붕_및_홈통공사/7-03_드레인.md new file mode 100644 index 00000000..48c8d1cd --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제07장_지붕_및_홈통공사/7-03_드레인.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 7-3 드레인 +PDF쪽: 671 +인쇄쪽: 615 +시작표지: 7-3 드레인 +끝표지: 제8장 금속공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제08장_금속공사/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제08장_금속공사/0-00_장머리.md new file mode 100644 index 00000000..a77e0420 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제08장_금속공사/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제8장 금속공사 +PDF쪽: 673 +인쇄쪽: 617 +시작표지: 제8장 금속공사 +끝표지: 8-1 제품 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제08장_금속공사/8-01_제품.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제08장_금속공사/8-01_제품.md new file mode 100644 index 00000000..b385448a --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제08장_금속공사/8-01_제품.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-1 제품 +PDF쪽: 673~674 +인쇄쪽: 617~618 +시작표지: 8-1 제품 +끝표지: 8-2 시설물 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제08장_금속공사/8-02_시설물.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제08장_금속공사/8-02_시설물.md new file mode 100644 index 00000000..b9b2aac8 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제08장_금속공사/8-02_시설물.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-2 시설물 +PDF쪽: 675~677 +인쇄쪽: 619~621 +시작표지: 8-2 시설물 +끝표지: 8-3 기타공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제08장_금속공사/8-03_기타공사.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제08장_금속공사/8-03_기타공사.md new file mode 100644 index 00000000..af1720be --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제08장_금속공사/8-03_기타공사.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-3 기타공사 +PDF쪽: 677~678 +인쇄쪽: 621~622 +시작표지: 8-3 기타공사 +끝표지: 제9장 미장공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제09장_미장공사/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제09장_미장공사/0-00_장머리.md new file mode 100644 index 00000000..19977c60 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제09장_미장공사/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제9장 미장공사 +PDF쪽: 679 +인쇄쪽: 623 +시작표지: 제9장 미장공사 +끝표지: 9-1 모르타르 바름 및 타설 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제09장_미장공사/9-01_모르타르_바름_및_타설.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제09장_미장공사/9-01_모르타르_바름_및_타설.md new file mode 100644 index 00000000..6479782c --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제09장_미장공사/9-01_모르타르_바름_및_타설.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 9-1 모르타르 바름 및 타설 +PDF쪽: 679~681 +인쇄쪽: 623~625 +시작표지: 9-1 모르타르 바름 및 타설 +끝표지: 9-2 콘크리트면 마무리 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제09장_미장공사/9-02_콘크리트면_마무리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제09장_미장공사/9-02_콘크리트면_마무리.md new file mode 100644 index 00000000..d7865f9d --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제09장_미장공사/9-02_콘크리트면_마무리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 9-2 콘크리트면 마무리 +PDF쪽: 681~682 +인쇄쪽: 625~626 +시작표지: 9-2 콘크리트면 마무리 +끝표지: 9-3 충전 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제09장_미장공사/9-03_충전.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제09장_미장공사/9-03_충전.md new file mode 100644 index 00000000..c5c21a88 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제09장_미장공사/9-03_충전.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 9-3 충전 +PDF쪽: 682~683 +인쇄쪽: 626~627 +시작표지: 9-3 충전 +끝표지: 제10장 창호 및 유리공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제10장_창호_및_유리공사/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제10장_창호_및_유리공사/0-00_장머리.md new file mode 100644 index 00000000..f3bbaff4 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제10장_창호_및_유리공사/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제10장 창호 및 유리공사 +PDF쪽: 685 +인쇄쪽: 629 +시작표지: 제10장 창호 및 유리공사 +끝표지: 10-1 창호 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제10장_창호_및_유리공사/10-01_창호.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제10장_창호_및_유리공사/10-01_창호.md new file mode 100644 index 00000000..3d70ae41 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제10장_창호_및_유리공사/10-01_창호.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 10-1 창호 +PDF쪽: 685~687 +인쇄쪽: 629~631 +시작표지: 10-1 창호 +끝표지: 10-2 부속자재 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제10장_창호_및_유리공사/10-02_부속자재.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제10장_창호_및_유리공사/10-02_부속자재.md new file mode 100644 index 00000000..a15074a3 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제10장_창호_및_유리공사/10-02_부속자재.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 10-2 부속자재 +PDF쪽: 687~688 +인쇄쪽: 631~632 +시작표지: 10-2 부속자재 +끝표지: 10-3 유리 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제10장_창호_및_유리공사/10-03_유리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제10장_창호_및_유리공사/10-03_유리.md new file mode 100644 index 00000000..d5bec222 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제10장_창호_및_유리공사/10-03_유리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 10-3 유리 +PDF쪽: 688~689 +인쇄쪽: 632~633 +시작표지: 10-3 유리 +끝표지: 제11장 칠공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제11장_칠공사/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제11장_칠공사/0-00_장머리.md new file mode 100644 index 00000000..fecd1211 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제11장_칠공사/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제11장 칠공사 +PDF쪽: 691 +인쇄쪽: 635 +시작표지: 제11장 칠공사 +끝표지: 11-1 공통공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제11장_칠공사/11-01_공통공사.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제11장_칠공사/11-01_공통공사.md new file mode 100644 index 00000000..e9258506 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제11장_칠공사/11-01_공통공사.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 11-1 공통공사 +PDF쪽: 691~692 +인쇄쪽: 635~636 +시작표지: 11-1 공통공사 +끝표지: 11-2 페인트 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제11장_칠공사/11-02_페인트.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제11장_칠공사/11-02_페인트.md new file mode 100644 index 00000000..61801a65 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제11장_칠공사/11-02_페인트.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 11-2 페인트 +PDF쪽: 693~696 +인쇄쪽: 637~640 +시작표지: 11-2 페인트 +끝표지: 11-3 스프레이 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제11장_칠공사/11-03_스프레이.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제11장_칠공사/11-03_스프레이.md new file mode 100644 index 00000000..a1e71251 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/03_건축부문/제11장_칠공사/11-03_스프레이.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 11-3 스프레이 +PDF쪽: 696~697 +인쇄쪽: 640~641 +시작표지: 11-3 스프레이 +끝표지: 제1장 배관공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제01장_배관공사/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제01장_배관공사/0-00_장머리.md new file mode 100644 index 00000000..6f86b088 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제01장_배관공사/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제1장 배관공사 +PDF쪽: 701 +인쇄쪽: 645 +시작표지: 제1장 배관공사 +끝표지: 1-1 강관 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제01장_배관공사/1-01_강관.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제01장_배관공사/1-01_강관.md new file mode 100644 index 00000000..99784db6 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제01장_배관공사/1-01_강관.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 1-1 강관 +PDF쪽: 701~703 +인쇄쪽: 645~647 +시작표지: 1-1 강관 +끝표지: 1-2 동관 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제01장_배관공사/1-02_동관.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제01장_배관공사/1-02_동관.md new file mode 100644 index 00000000..b4a37ebc --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제01장_배관공사/1-02_동관.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 1-2 동관 +PDF쪽: 704~705 +인쇄쪽: 648~649 +시작표지: 1-2 동관 +끝표지: 1-3 스테인리스 강관 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제01장_배관공사/1-03_스테인리스_강관.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제01장_배관공사/1-03_스테인리스_강관.md new file mode 100644 index 00000000..e1fe9221 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제01장_배관공사/1-03_스테인리스_강관.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 1-3 스테인리스 강관 +PDF쪽: 706~709 +인쇄쪽: 650~653 +시작표지: 1-3 스테인리스 강관 +끝표지: 1-4 주철관 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제01장_배관공사/1-04_주철관.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제01장_배관공사/1-04_주철관.md new file mode 100644 index 00000000..dff311c4 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제01장_배관공사/1-04_주철관.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 1-4 주철관 +PDF쪽: 710 +인쇄쪽: 654 +시작표지: 1-4 주철관 +끝표지: 1-5 경질관 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제01장_배관공사/1-05_경질관.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제01장_배관공사/1-05_경질관.md new file mode 100644 index 00000000..a281887c --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제01장_배관공사/1-05_경질관.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 1-5 경질관 +PDF쪽: 711~712 +인쇄쪽: 655~656 +시작표지: 1-5 경질관 +끝표지: 1-6 연질관 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제01장_배관공사/1-06_연질관.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제01장_배관공사/1-06_연질관.md new file mode 100644 index 00000000..93909482 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제01장_배관공사/1-06_연질관.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 1-6 연질관 +PDF쪽: 712~713 +인쇄쪽: 656~657 +시작표지: 1-6 연질관 +끝표지: 제2장 덕트공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제02장_덕트공사/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제02장_덕트공사/0-00_장머리.md new file mode 100644 index 00000000..c9e3e298 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제02장_덕트공사/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제2장 덕트공사 +PDF쪽: 715 +인쇄쪽: 659 +시작표지: 제2장 덕트공사 +끝표지: 2-1 덕트 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제02장_덕트공사/2-01_덕트.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제02장_덕트공사/2-01_덕트.md new file mode 100644 index 00000000..2ac19785 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제02장_덕트공사/2-01_덕트.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 2-1 덕트 +PDF쪽: 715~717 +인쇄쪽: 659~661 +시작표지: 2-1 덕트 +끝표지: 2-2 덕트기구 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제02장_덕트공사/2-02_덕트기구.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제02장_덕트공사/2-02_덕트기구.md new file mode 100644 index 00000000..92a45e73 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제02장_덕트공사/2-02_덕트기구.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 2-2 덕트기구 +PDF쪽: 717~719 +인쇄쪽: 661~663 +시작표지: 2-2 덕트기구 +끝표지: 제3장 보온공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제03장_보온공사/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제03장_보온공사/0-00_장머리.md new file mode 100644 index 00000000..2483167e --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제03장_보온공사/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제3장 보온공사 +PDF쪽: 721 +인쇄쪽: 665 +시작표지: 제3장 보온공사 +끝표지: 3-1 배관보온 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제03장_보온공사/3-01_배관보온.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제03장_보온공사/3-01_배관보온.md new file mode 100644 index 00000000..883aa100 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제03장_보온공사/3-01_배관보온.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 3-1 배관보온 +PDF쪽: 721~722 +인쇄쪽: 665~666 +시작표지: 3-1 배관보온 +끝표지: 3-2 밸브보온 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제03장_보온공사/3-02_밸브보온.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제03장_보온공사/3-02_밸브보온.md new file mode 100644 index 00000000..df5e6ba9 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제03장_보온공사/3-02_밸브보온.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 3-2 밸브보온 +PDF쪽: 722~723 +인쇄쪽: 666~667 +시작표지: 3-2 밸브보온 +끝표지: 3-3 덕트보온 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제03장_보온공사/3-03_덕트보온.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제03장_보온공사/3-03_덕트보온.md new file mode 100644 index 00000000..bcdda40c --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제03장_보온공사/3-03_덕트보온.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 3-3 덕트보온 +PDF쪽: 724 +인쇄쪽: 668 +시작표지: 3-3 덕트보온 +끝표지: 3-4 발열선 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제03장_보온공사/3-04_발열선.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제03장_보온공사/3-04_발열선.md new file mode 100644 index 00000000..ed900614 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제03장_보온공사/3-04_발열선.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 3-4 발열선 +PDF쪽: 724~725 +인쇄쪽: 668~669 +시작표지: 3-4 발열선 +끝표지: 제4장 펌프 및 공기설비공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제04장_펌프_및_공기설비공사/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제04장_펌프_및_공기설비공사/0-00_장머리.md new file mode 100644 index 00000000..404ec0c6 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제04장_펌프_및_공기설비공사/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제4장 펌프 및 공기설비공사 +PDF쪽: 727 +인쇄쪽: 671 +시작표지: 제4장 펌프 및 공기설비공사 +끝표지: 4-1 펌프 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제04장_펌프_및_공기설비공사/4-01_펌프.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제04장_펌프_및_공기설비공사/4-01_펌프.md new file mode 100644 index 00000000..54c5e1ee --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제04장_펌프_및_공기설비공사/4-01_펌프.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 4-1 펌프 +PDF쪽: 727~728 +인쇄쪽: 671~672 +시작표지: 4-1 펌프 +끝표지: 4-2 송풍기 및 환풍기 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제04장_펌프_및_공기설비공사/4-02_송풍기_및_환풍기.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제04장_펌프_및_공기설비공사/4-02_송풍기_및_환풍기.md new file mode 100644 index 00000000..e6dac35f --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제04장_펌프_및_공기설비공사/4-02_송풍기_및_환풍기.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 4-2 송풍기 및 환풍기 +PDF쪽: 728~729 +인쇄쪽: 672~673 +시작표지: 4-2 송풍기 및 환풍기 +끝표지: 제5장 밸브설비공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제05장_밸브설비공사/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제05장_밸브설비공사/0-00_장머리.md new file mode 100644 index 00000000..544b4c18 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제05장_밸브설비공사/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제5장 밸브설비공사 +PDF쪽: 731 +인쇄쪽: 675 +시작표지: 제5장 밸브설비공사 +끝표지: 5-1 밸브 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제05장_밸브설비공사/5-01_밸브.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제05장_밸브설비공사/5-01_밸브.md new file mode 100644 index 00000000..e7ac95be --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제05장_밸브설비공사/5-01_밸브.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 5-1 밸브 +PDF쪽: 731 +인쇄쪽: 675 +시작표지: 5-1 밸브 +끝표지: 5-2 증기트랩 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제05장_밸브설비공사/5-02_증기트랩.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제05장_밸브설비공사/5-02_증기트랩.md new file mode 100644 index 00000000..0be218ce --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제05장_밸브설비공사/5-02_증기트랩.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 5-2 증기트랩 +PDF쪽: 731~732 +인쇄쪽: 675~676 +시작표지: 5-2 증기트랩 +끝표지: 5-3 플랙시블 이음 및 팽창이음 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제05장_밸브설비공사/5-03_플랙시블_이음_및_팽창이음.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제05장_밸브설비공사/5-03_플랙시블_이음_및_팽창이음.md new file mode 100644 index 00000000..cc8a26a1 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제05장_밸브설비공사/5-03_플랙시블_이음_및_팽창이음.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 5-3 플랙시블 이음 및 팽창이음 +PDF쪽: 732~733 +인쇄쪽: 676~677 +시작표지: 5-3 플랙시블 이음 및 팽창이음 +끝표지: 5-4 수격방지기 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제05장_밸브설비공사/5-04_수격방지기.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제05장_밸브설비공사/5-04_수격방지기.md new file mode 100644 index 00000000..5bc5cba5 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제05장_밸브설비공사/5-04_수격방지기.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 5-4 수격방지기 +PDF쪽: 733 +인쇄쪽: 677 +시작표지: 5-4 수격방지기 +끝표지: 제6장 측정기기공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제06장_측정기기공사/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제06장_측정기기공사/0-00_장머리.md new file mode 100644 index 00000000..fd61338b --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제06장_측정기기공사/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제6장 측정기기공사 +PDF쪽: 735 +인쇄쪽: 679 +시작표지: 제6장 측정기기공사 +끝표지: 6-1 유량계 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제06장_측정기기공사/6-01_유량계.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제06장_측정기기공사/6-01_유량계.md new file mode 100644 index 00000000..ae10a4e0 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제06장_측정기기공사/6-01_유량계.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 6-1 유량계 +PDF쪽: 735~736 +인쇄쪽: 679~680 +시작표지: 6-1 유량계 +끝표지: 6-2 적산열량계 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제06장_측정기기공사/6-02_적산열량계.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제06장_측정기기공사/6-02_적산열량계.md new file mode 100644 index 00000000..828895b8 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제06장_측정기기공사/6-02_적산열량계.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 6-2 적산열량계 +PDF쪽: 736~737 +인쇄쪽: 680~681 +시작표지: 6-2 적산열량계 +끝표지: 제7장 위생기구설비공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제07장_위생기구설비공사/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제07장_위생기구설비공사/0-00_장머리.md new file mode 100644 index 00000000..169b64c7 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제07장_위생기구설비공사/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제7장 위생기구설비공사 +PDF쪽: 739 +인쇄쪽: 683 +시작표지: 제7장 위생기구설비공사 +끝표지: 7-1 위생기구류 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제07장_위생기구설비공사/7-01_위생기구류.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제07장_위생기구설비공사/7-01_위생기구류.md new file mode 100644 index 00000000..d4fe315c --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제07장_위생기구설비공사/7-01_위생기구류.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 7-1 위생기구류 +PDF쪽: 739~740 +인쇄쪽: 683~684 +시작표지: 7-1 위생기구류 +끝표지: 7-2 수전 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제07장_위생기구설비공사/7-02_수전.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제07장_위생기구설비공사/7-02_수전.md new file mode 100644 index 00000000..e6bccffa --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제07장_위생기구설비공사/7-02_수전.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 7-2 수전 +PDF쪽: 741~742 +인쇄쪽: 685~686 +시작표지: 7-2 수전 +끝표지: 7-3 욕실 부착물 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제07장_위생기구설비공사/7-03_욕실_부착물.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제07장_위생기구설비공사/7-03_욕실_부착물.md new file mode 100644 index 00000000..c9c73ea0 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제07장_위생기구설비공사/7-03_욕실_부착물.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 7-3 욕실 부착물 +PDF쪽: 742~743 +인쇄쪽: 686~687 +시작표지: 7-3 욕실 부착물 +끝표지: 제8장 공기조화설비공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제08장_공기조화설비공사/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제08장_공기조화설비공사/0-00_장머리.md new file mode 100644 index 00000000..8d1709a0 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제08장_공기조화설비공사/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제8장 공기조화설비공사 +PDF쪽: 745 +인쇄쪽: 689 +시작표지: 제8장 공기조화설비공사 +끝표지: 8-1 냉동기 및 냉각탑 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제08장_공기조화설비공사/8-01_냉동기_및_냉각탑.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제08장_공기조화설비공사/8-01_냉동기_및_냉각탑.md new file mode 100644 index 00000000..52cb0d3a --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제08장_공기조화설비공사/8-01_냉동기_및_냉각탑.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-1 냉동기 및 냉각탑 +PDF쪽: 745~748 +인쇄쪽: 689~692 +시작표지: 8-1 냉동기 및 냉각탑 +끝표지: 8-2 공기조화기 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제08장_공기조화설비공사/8-02_공기조화기.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제08장_공기조화설비공사/8-02_공기조화기.md new file mode 100644 index 00000000..76c42bb6 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제08장_공기조화설비공사/8-02_공기조화기.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-2 공기조화기 +PDF쪽: 749~752 +인쇄쪽: 693~696 +시작표지: 8-2 공기조화기 +끝표지: 8-3 보일러 및 방열기 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제08장_공기조화설비공사/8-03_보일러_및_방열기.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제08장_공기조화설비공사/8-03_보일러_및_방열기.md new file mode 100644 index 00000000..ed62f78f --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제08장_공기조화설비공사/8-03_보일러_및_방열기.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-3 보일러 및 방열기 +PDF쪽: 752~754 +인쇄쪽: 696~698 +시작표지: 8-3 보일러 및 방열기 +끝표지: 8-4 온수기 및 온수분배기 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제08장_공기조화설비공사/8-04_온수기_및_온수분배기.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제08장_공기조화설비공사/8-04_온수기_및_온수분배기.md new file mode 100644 index 00000000..0f8c8530 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제08장_공기조화설비공사/8-04_온수기_및_온수분배기.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-4 온수기 및 온수분배기 +PDF쪽: 754~755 +인쇄쪽: 698~699 +시작표지: 8-4 온수기 및 온수분배기 +끝표지: 8-5 탱크 및 헤더 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제08장_공기조화설비공사/8-05_탱크_및_헤더.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제08장_공기조화설비공사/8-05_탱크_및_헤더.md new file mode 100644 index 00000000..edd2140b --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제08장_공기조화설비공사/8-05_탱크_및_헤더.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-5 탱크 및 헤더 +PDF쪽: 755 +인쇄쪽: 699 +시작표지: 8-5 탱크 및 헤더 +끝표지: 8-6 부수장비 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제08장_공기조화설비공사/8-06_부수장비.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제08장_공기조화설비공사/8-06_부수장비.md new file mode 100644 index 00000000..1387c5ab --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제08장_공기조화설비공사/8-06_부수장비.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 8-6 부수장비 +PDF쪽: 756 +인쇄쪽: 700 +시작표지: 8-6 부수장비 +끝표지: 제9장 기타공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제09장_기타공사/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제09장_기타공사/0-00_장머리.md new file mode 100644 index 00000000..4164c06a --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제09장_기타공사/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제9장 기타공사 +PDF쪽: 757 +인쇄쪽: 701 +시작표지: 제9장 기타공사 +끝표지: 9-1 지지금구 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제09장_기타공사/9-01_지지금구.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제09장_기타공사/9-01_지지금구.md new file mode 100644 index 00000000..8195b3ed --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제09장_기타공사/9-01_지지금구.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 9-1 지지금구 +PDF쪽: 757~758 +인쇄쪽: 701~702 +시작표지: 9-1 지지금구 +끝표지: 9-2 도장 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제09장_기타공사/9-02_도장.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제09장_기타공사/9-02_도장.md new file mode 100644 index 00000000..200330cc --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제09장_기타공사/9-02_도장.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 9-2 도장 +PDF쪽: 758~759 +인쇄쪽: 702~703 +시작표지: 9-2 도장 +끝표지: 9-3 슬리브 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제09장_기타공사/9-03_슬리브.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제09장_기타공사/9-03_슬리브.md new file mode 100644 index 00000000..68d4b371 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제09장_기타공사/9-03_슬리브.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 9-3 슬리브 +PDF쪽: 759~760 +인쇄쪽: 703~704 +시작표지: 9-3 슬리브 +끝표지: 9-4 배관관리 및 시험 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제09장_기타공사/9-04_배관관리_및_시험.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제09장_기타공사/9-04_배관관리_및_시험.md new file mode 100644 index 00000000..9427346e --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제09장_기타공사/9-04_배관관리_및_시험.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 9-4 배관관리 및 시험 +PDF쪽: 760~761 +인쇄쪽: 704~705 +시작표지: 9-4 배관관리 및 시험 +끝표지: 9-5 시운전 및 조정 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제09장_기타공사/9-05_시운전_및_조정.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제09장_기타공사/9-05_시운전_및_조정.md new file mode 100644 index 00000000..7fb7d831 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제09장_기타공사/9-05_시운전_및_조정.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 9-5 시운전 및 조정 +PDF쪽: 761 +인쇄쪽: 705 +시작표지: 9-5 시운전 및 조정 +끝표지: 제10장 소방설비공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제10장_소방설비공사/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제10장_소방설비공사/0-00_장머리.md new file mode 100644 index 00000000..192ed206 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제10장_소방설비공사/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제10장 소방설비공사 +PDF쪽: 763 +인쇄쪽: 707 +시작표지: 제10장 소방설비공사 +끝표지: 10-1 소화함 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제10장_소방설비공사/10-01_소화함.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제10장_소방설비공사/10-01_소화함.md new file mode 100644 index 00000000..049cbe39 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제10장_소방설비공사/10-01_소화함.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 10-1 소화함 +PDF쪽: 763 +인쇄쪽: 707 +시작표지: 10-1 소화함 +끝표지: 10-2 소방밸브 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제10장_소방설비공사/10-02_소방밸브.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제10장_소방설비공사/10-02_소방밸브.md new file mode 100644 index 00000000..a73fe7cf --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제10장_소방설비공사/10-02_소방밸브.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 10-2 소방밸브 +PDF쪽: 763~764 +인쇄쪽: 707~708 +시작표지: 10-2 소방밸브 +끝표지: 10-3 옥외소화전 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제10장_소방설비공사/10-03_옥외소화전.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제10장_소방설비공사/10-03_옥외소화전.md new file mode 100644 index 00000000..7f9bb6f5 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제10장_소방설비공사/10-03_옥외소화전.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 10-3 옥외소화전 +PDF쪽: 764~765 +인쇄쪽: 708~709 +시작표지: 10-3 옥외소화전 +끝표지: 10-4 송수구 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제10장_소방설비공사/10-04_송수구.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제10장_소방설비공사/10-04_송수구.md new file mode 100644 index 00000000..db521301 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제10장_소방설비공사/10-04_송수구.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 10-4 송수구 +PDF쪽: 765 +인쇄쪽: 709 +시작표지: 10-4 송수구 +끝표지: 10-5 탱크 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제10장_소방설비공사/10-05_탱크.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제10장_소방설비공사/10-05_탱크.md new file mode 100644 index 00000000..55a0d4dc --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제10장_소방설비공사/10-05_탱크.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 10-5 탱크 +PDF쪽: 765~766 +인쇄쪽: 709~710 +시작표지: 10-5 탱크 +끝표지: 10-6 소방용 유량계 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제10장_소방설비공사/10-06_소방용_유량계.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제10장_소방설비공사/10-06_소방용_유량계.md new file mode 100644 index 00000000..93494f27 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제10장_소방설비공사/10-06_소방용_유량계.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 10-6 소방용 유량계 +PDF쪽: 766 +인쇄쪽: 710 +시작표지: 10-6 소방용 유량계 +끝표지: 10-7 소화용 헤드 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제10장_소방설비공사/10-07_소화용_헤드.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제10장_소방설비공사/10-07_소화용_헤드.md new file mode 100644 index 00000000..14c392f9 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제10장_소방설비공사/10-07_소화용_헤드.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 10-7 소화용 헤드 +PDF쪽: 766 +인쇄쪽: 710 +시작표지: 10-7 소화용 헤드 +끝표지: 10-8 소화기 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제10장_소방설비공사/10-08_소화기.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제10장_소방설비공사/10-08_소화기.md new file mode 100644 index 00000000..15065378 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제10장_소방설비공사/10-08_소화기.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 10-8 소화기 +PDF쪽: 767~768 +인쇄쪽: 711~712 +시작표지: 10-8 소화기 +끝표지: 10-9 피난기구 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제10장_소방설비공사/10-09_피난기구.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제10장_소방설비공사/10-09_피난기구.md new file mode 100644 index 00000000..a5fa783c --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제10장_소방설비공사/10-09_피난기구.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 10-9 피난기구 +PDF쪽: 768 +인쇄쪽: 712 +시작표지: 10-9 피난기구 +끝표지: 제11장 가스설비공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제11장_가스설비공사/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제11장_가스설비공사/0-00_장머리.md new file mode 100644 index 00000000..33867be0 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제11장_가스설비공사/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제11장 가스설비공사 +PDF쪽: 769 +인쇄쪽: 713 +시작표지: 제11장 가스설비공사 +끝표지: 11-1 강관 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제11장_가스설비공사/11-01_강관.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제11장_가스설비공사/11-01_강관.md new file mode 100644 index 00000000..fce273dd --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제11장_가스설비공사/11-01_강관.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 11-1 강관 +PDF쪽: 769~770 +인쇄쪽: 713~714 +시작표지: 11-1 강관 +끝표지: 11-2 PE관 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제11장_가스설비공사/11-02_PE관.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제11장_가스설비공사/11-02_PE관.md new file mode 100644 index 00000000..4a6da0ce --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제11장_가스설비공사/11-02_PE관.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 11-2 PE관 +PDF쪽: 770~771 +인쇄쪽: 714~715 +시작표지: 11-2 PE관 +끝표지: 11-3 부속기기 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제11장_가스설비공사/11-03_부속기기.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제11장_가스설비공사/11-03_부속기기.md new file mode 100644 index 00000000..32728dae --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제11장_가스설비공사/11-03_부속기기.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 11-3 부속기기 +PDF쪽: 771~772 +인쇄쪽: 715~716 +시작표지: 11-3 부속기기 +끝표지: 제12장 자동제어설비공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제12장_자동제어설비공사/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제12장_자동제어설비공사/0-00_장머리.md new file mode 100644 index 00000000..3fda4992 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제12장_자동제어설비공사/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제12장 자동제어설비공사 +PDF쪽: 773 +인쇄쪽: 717 +시작표지: 제12장 자동제어설비공사 +끝표지: 12-1 계기반 및 함류 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제12장_자동제어설비공사/12-01_계기반_및_함류.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제12장_자동제어설비공사/12-01_계기반_및_함류.md new file mode 100644 index 00000000..3422333e --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제12장_자동제어설비공사/12-01_계기반_및_함류.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 12-1 계기반 및 함류 +PDF쪽: 773~774 +인쇄쪽: 717~718 +시작표지: 12-1 계기반 및 함류 +끝표지: 12-2 자동제어기기 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제12장_자동제어설비공사/12-02_자동제어기기.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제12장_자동제어설비공사/12-02_자동제어기기.md new file mode 100644 index 00000000..49561046 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제12장_자동제어설비공사/12-02_자동제어기기.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 12-2 자동제어기기 +PDF쪽: 775~777 +인쇄쪽: 719~721 +시작표지: 12-2 자동제어기기 +끝표지: 12-3 전선배선 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제12장_자동제어설비공사/12-03_전선배선.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제12장_자동제어설비공사/12-03_전선배선.md new file mode 100644 index 00000000..5f3115ca --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제12장_자동제어설비공사/12-03_전선배선.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 12-3 전선배선 +PDF쪽: 777~778 +인쇄쪽: 721~722 +시작표지: 12-3 전선배선 +끝표지: 제13장 플랜트설비공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제13장_플랜트설비공사/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제13장_플랜트설비공사/0-00_장머리.md new file mode 100644 index 00000000..76eb6cf7 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제13장_플랜트설비공사/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제13장 플랜트설비공사 +PDF쪽: 779 +인쇄쪽: 723 +시작표지: 제13장 플랜트설비공사 +끝표지: 13-1 플랜트 배관 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제13장_플랜트설비공사/13-01_플랜트_배관.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제13장_플랜트설비공사/13-01_플랜트_배관.md new file mode 100644 index 00000000..230749f5 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제13장_플랜트설비공사/13-01_플랜트_배관.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 13-1 플랜트 배관 +PDF쪽: 779~798 +인쇄쪽: 723~742 +시작표지: 13-1 플랜트 배관 +끝표지: 13-2 플랜트 용접 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제13장_플랜트설비공사/13-02_플랜트_용접.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제13장_플랜트설비공사/13-02_플랜트_용접.md new file mode 100644 index 00000000..0a3548e2 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제13장_플랜트설비공사/13-02_플랜트_용접.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 13-2 플랜트 용접 +PDF쪽: 799~812 +인쇄쪽: 743~756 +시작표지: 13-2 플랜트 용접 +끝표지: 13-3 배관 및 기기보온 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제13장_플랜트설비공사/13-03_배관_및_기기보온.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제13장_플랜트설비공사/13-03_배관_및_기기보온.md new file mode 100644 index 00000000..ae0b6dbd --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제13장_플랜트설비공사/13-03_배관_및_기기보온.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 13-3 배관 및 기기보온 +PDF쪽: 813~820 +인쇄쪽: 757~764 +시작표지: 13-3 배관 및 기기보온 +끝표지: 13-4 강재 제작 설치 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제13장_플랜트설비공사/13-04_강재_제작_설치.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제13장_플랜트설비공사/13-04_강재_제작_설치.md new file mode 100644 index 00000000..8917b150 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제13장_플랜트설비공사/13-04_강재_제작_설치.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 13-4 강재 제작 설치 +PDF쪽: 820~826 +인쇄쪽: 764~770 +시작표지: 13-4 강재 제작 설치 +끝표지: 13-5 화력발전 기계설비 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제13장_플랜트설비공사/13-05_화력발전_기계설비.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제13장_플랜트설비공사/13-05_화력발전_기계설비.md new file mode 100644 index 00000000..7a9cd98f --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제13장_플랜트설비공사/13-05_화력발전_기계설비.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 13-5 화력발전 기계설비 +PDF쪽: 826~845 +인쇄쪽: 770~789 +시작표지: 13-5 화력발전 기계설비 +끝표지: 13-6 수력발전 기계설비 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제13장_플랜트설비공사/13-06_수력발전_기계설비.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제13장_플랜트설비공사/13-06_수력발전_기계설비.md new file mode 100644 index 00000000..59ac3cd2 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제13장_플랜트설비공사/13-06_수력발전_기계설비.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 13-6 수력발전 기계설비 +PDF쪽: 846~879 +인쇄쪽: 790~823 +시작표지: 13-6 수력발전 기계설비 +끝표지: 13-7 제철기계설비 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제13장_플랜트설비공사/13-07_제철기계설비.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제13장_플랜트설비공사/13-07_제철기계설비.md new file mode 100644 index 00000000..bf8ad877 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제13장_플랜트설비공사/13-07_제철기계설비.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 13-7 제철기계설비 +PDF쪽: 879~890 +인쇄쪽: 823~834 +시작표지: 13-7 제철기계설비 +끝표지: 13-8 쓰레기소각 기계설비 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제13장_플랜트설비공사/13-08_쓰레기소각_기계설비.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제13장_플랜트설비공사/13-08_쓰레기소각_기계설비.md new file mode 100644 index 00000000..2ed5c35d --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제13장_플랜트설비공사/13-08_쓰레기소각_기계설비.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 13-8 쓰레기소각 기계설비 +PDF쪽: 890~898 +인쇄쪽: 834~842 +시작표지: 13-8 쓰레기소각 기계설비 +끝표지: 13-9 하수처리 기계설비 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제13장_플랜트설비공사/13-09_하수처리_기계설비.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제13장_플랜트설비공사/13-09_하수처리_기계설비.md new file mode 100644 index 00000000..7d6b9e5e --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제13장_플랜트설비공사/13-09_하수처리_기계설비.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 13-9 하수처리 기계설비 +PDF쪽: 899~900 +인쇄쪽: 843~844 +시작표지: 13-9 하수처리 기계설비 +끝표지: 13-10 운반기계설비 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제13장_플랜트설비공사/13-10_운반기계설비.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제13장_플랜트설비공사/13-10_운반기계설비.md new file mode 100644 index 00000000..dab4f9a9 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제13장_플랜트설비공사/13-10_운반기계설비.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 13-10 운반기계설비 +PDF쪽: 901~905 +인쇄쪽: 845~849 +시작표지: 13-10 운반기계설비 +끝표지: 13-11 기타 기계설비 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제13장_플랜트설비공사/13-11_기타_기계설비.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제13장_플랜트설비공사/13-11_기타_기계설비.md new file mode 100644 index 00000000..88a32623 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문/제13장_플랜트설비공사/13-11_기타_기계설비.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 13-11 기타 기계설비 +PDF쪽: 906~910 +인쇄쪽: 850~854 +시작표지: 13-11 기타 기계설비 +끝표지: 제1장 공통 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제01장_공통/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제01장_공통/0-00_장머리.md new file mode 100644 index 00000000..54315c05 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제01장_공통/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제1장 공통 +PDF쪽: 913 +인쇄쪽: 857 +시작표지: 제1장 공통 +끝표지: 1-1 토공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제01장_공통/1-01_토공사.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제01장_공통/1-01_토공사.md new file mode 100644 index 00000000..bb17090b --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제01장_공통/1-01_토공사.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 1-1 토공사 +PDF쪽: 913~914 +인쇄쪽: 857~858 +시작표지: 1-1 토공사 +끝표지: 1-2 조경공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제01장_공통/1-02_조경공사.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제01장_공통/1-02_조경공사.md new file mode 100644 index 00000000..4c666f79 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제01장_공통/1-02_조경공사.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 1-2 조경공사 +PDF쪽: 915~923 +인쇄쪽: 859~867 +시작표지: 1-2 조경공사 +끝표지: 1-3 철근콘크리트공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제01장_공통/1-03_철근콘크리트공사.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제01장_공통/1-03_철근콘크리트공사.md new file mode 100644 index 00000000..5275f32d --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제01장_공통/1-03_철근콘크리트공사.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 1-3 철근콘크리트공사 +PDF쪽: 923~928 +인쇄쪽: 867~872 +시작표지: 1-3 철근콘크리트공사 +끝표지: 제2장 토목 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제02장_토목/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제02장_토목/0-00_장머리.md new file mode 100644 index 00000000..8755808e --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제02장_토목/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제2장 토목 +PDF쪽: 929 +인쇄쪽: 873 +시작표지: 제2장 토목 +끝표지: 2-1 도로포장공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제02장_토목/2-01_도로포장공사.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제02장_토목/2-01_도로포장공사.md new file mode 100644 index 00000000..7cd92df2 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제02장_토목/2-01_도로포장공사.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 2-1 도로포장공사 +PDF쪽: 929~949 +인쇄쪽: 873~893 +시작표지: 2-1 도로포장공사 +끝표지: 2-2 궤도공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제02장_토목/2-02_궤도공사.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제02장_토목/2-02_궤도공사.md new file mode 100644 index 00000000..b61ee404 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제02장_토목/2-02_궤도공사.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 2-2 궤도공사 +PDF쪽: 950~957 +인쇄쪽: 894~901 +시작표지: 2-2 궤도공사 +끝표지: 2-3 교량공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제02장_토목/2-03_교량공사.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제02장_토목/2-03_교량공사.md new file mode 100644 index 00000000..ede10cdc --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제02장_토목/2-03_교량공사.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 2-3 교량공사 +PDF쪽: 958 +인쇄쪽: 902 +시작표지: 2-3 교량공사 +끝표지: 2-4 관부설 및 접합 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제02장_토목/2-04_관부설_및_접합.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제02장_토목/2-04_관부설_및_접합.md new file mode 100644 index 00000000..1c2b725c --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제02장_토목/2-04_관부설_및_접합.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 2-4 관부설 및 접합 +PDF쪽: 959~965 +인쇄쪽: 903~909 +시작표지: 2-4 관부설 및 접합 +끝표지: 제3장 건축 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제03장_건축/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제03장_건축/0-00_장머리.md new file mode 100644 index 00000000..447578b3 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제03장_건축/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제3장 건축 +PDF쪽: 967 +인쇄쪽: 911 +시작표지: 제3장 건축 +끝표지: 3-1 구조물 철거공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제03장_건축/3-01_구조물_철거공사.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제03장_건축/3-01_구조물_철거공사.md new file mode 100644 index 00000000..e2094a83 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제03장_건축/3-01_구조물_철거공사.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 3-1 구조물 철거공사 +PDF쪽: 967~969 +인쇄쪽: 911~913 +시작표지: 3-1 구조물 철거공사 +끝표지: 3-2 해체공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제03장_건축/3-02_해체공사.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제03장_건축/3-02_해체공사.md new file mode 100644 index 00000000..3069de01 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제03장_건축/3-02_해체공사.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 3-2 해체공사 +PDF쪽: 970~973 +인쇄쪽: 914~917 +시작표지: 3-2 해체공사 +끝표지: 3-3 칠공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제03장_건축/3-03_칠공사.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제03장_건축/3-03_칠공사.md new file mode 100644 index 00000000..3cca714a --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제03장_건축/3-03_칠공사.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 3-3 칠공사 +PDF쪽: 974 +인쇄쪽: 918 +시작표지: 3-3 칠공사 +끝표지: 3-4 수선 및 보수공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제03장_건축/3-04_수선_및_보수공사.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제03장_건축/3-04_수선_및_보수공사.md new file mode 100644 index 00000000..cab6c2bf --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제03장_건축/3-04_수선_및_보수공사.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 3-4 수선 및 보수공사 +PDF쪽: 975~976 +인쇄쪽: 919~920 +시작표지: 3-4 수선 및 보수공사 +끝표지: 제4장 기계설비 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제04장_기계설비/0-00_장머리.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제04장_기계설비/0-00_장머리.md new file mode 100644 index 00000000..8c8c9428 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제04장_기계설비/0-00_장머리.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 제4장 기계설비 +PDF쪽: 977 +인쇄쪽: 921 +시작표지: 제4장 기계설비 +끝표지: 4-1 일반기계설비 해체 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제04장_기계설비/4-01_일반기계설비_해체.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제04장_기계설비/4-01_일반기계설비_해체.md new file mode 100644 index 00000000..b9504b6f --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제04장_기계설비/4-01_일반기계설비_해체.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 4-1 일반기계설비 해체 +PDF쪽: 977~980 +인쇄쪽: 921~924 +시작표지: 4-1 일반기계설비 해체 +끝표지: 4-2 자동제어설비 해체 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제04장_기계설비/4-02_자동제어설비_해체.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제04장_기계설비/4-02_자동제어설비_해체.md new file mode 100644 index 00000000..ec5df8f3 --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제04장_기계설비/4-02_자동제어설비_해체.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 4-2 자동제어설비 해체 +PDF쪽: 980 +인쇄쪽: 924 +시작표지: 4-2 자동제어설비 해체 +끝표지: 4-3 수선 및 보수공사 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제04장_기계설비/4-03_수선_및_보수공사.md b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제04장_기계설비/4-03_수선_및_보수공사.md new file mode 100644 index 00000000..4741d10f --- /dev/null +++ b/resources/knowledge/original/원가계산/건설공사_표준품셈/본문/05_유지관리부문/제04장_기계설비/4-03_수선_및_보수공사.md @@ -0,0 +1,14 @@ +--- +문서: 2026 건설공사 표준품셈 +절: 4-3 수선 및 보수공사 +PDF쪽: 981~982 +인쇄쪽: 925~926 +시작표지: 4-3 수선 및 보수공사 +끝표지: 끝 +상태: 대기 +작성: +검증: +원천: 글자층 +기계검사: +확정지문: +--- diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제04장_나무베기/0-00_장머리.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제04장_나무베기/0-00_장머리.md index f2922273..23a4ad61 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제04장_나무베기/0-00_장머리.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제04장_나무베기/0-00_장머리.md @@ -9,8 +9,8 @@ PDF쪽: 59 작성: sub_laptop_2 검증: sub_laptop_4 원천: 글자층 -기계검사: -확정지문: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 +확정지문: fbdbe6b20a46e4b2e13049ea9e1f67217067aa0d96dc72c5f7af70524d90e4bc --- # 제4장 나무베기 diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제04장_나무베기/4-01_수확베기.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제04장_나무베기/4-01_수확베기.md index 12dd17f1..29750e53 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제04장_나무베기/4-01_수확베기.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제04장_나무베기/4-01_수확베기.md @@ -9,8 +9,8 @@ PDF쪽: 59~60 작성: sub_laptop_2 검증: sub_laptop_4 원천: 글자층 -기계검사: -확정지문: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 +확정지문: 42e5913184910eec3871b39ebe1ec0e2945b84f077f966cc7130364b851afcd6 --- ## 4-1. 수확베기 diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제04장_나무베기/4-02_단목베기.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제04장_나무베기/4-02_단목베기.md index 70855587..c7c45320 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제04장_나무베기/4-02_단목베기.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제04장_나무베기/4-02_단목베기.md @@ -9,8 +9,8 @@ PDF쪽: 60~61 작성: sub_laptop_2 검증: sub_laptop_4 원천: 글자층 -기계검사: -확정지문: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 +확정지문: 85020bb50007c820312ff9ccda26f7c2762ec65a4bbf3933db7813350ad36e24 --- ## 4-2. 단목베기 diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제04장_나무베기/4-03_위험목_베기.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제04장_나무베기/4-03_위험목_베기.md index 36d8a21c..91f60b09 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제04장_나무베기/4-03_위험목_베기.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제04장_나무베기/4-03_위험목_베기.md @@ -9,8 +9,8 @@ PDF쪽: 62 작성: sub_laptop_3 검증: sub_laptop_2 원천: 글자층 -기계검사: -확정지문: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 +확정지문: 27d8303eca7909aa51685e66102e37c0c54b2ed9996babc980c80cecc2099a1d --- ## 4-3. 위험목 베기 diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제04장_나무베기/4-04_가지정리.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제04장_나무베기/4-04_가지정리.md index 5b5b27d3..de508c53 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제04장_나무베기/4-04_가지정리.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제04장_나무베기/4-04_가지정리.md @@ -9,8 +9,8 @@ PDF쪽: 62 작성: sub_laptop_3 검증: sub_laptop_2 원천: 글자층 -기계검사: -확정지문: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 +확정지문: 7fa9da3e0c195fc5612d3f3eb4af3dc518a3f1a8121c58e57242844082ec0674 --- ## 4-4. 가지정리 diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제04장_나무베기/4-05_벌도_위험목_점검.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제04장_나무베기/4-05_벌도_위험목_점검.md index 418868be..be4a5d4b 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제04장_나무베기/4-05_벌도_위험목_점검.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제04장_나무베기/4-05_벌도_위험목_점검.md @@ -9,8 +9,8 @@ PDF쪽: 63 작성: sub_laptop_4 검증: sub_laptop_3 원천: 글자층 -기계검사: -확정지문: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 +확정지문: 857b8d9dd43c0e7114529ac964bc02c5a8c45d8f14080ece48d4e9eb3602a9b9 --- ## 4-5. 벌도 위험목 점검 diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제04장_나무베기/4-06_벌목부_작업안전_보조.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제04장_나무베기/4-06_벌목부_작업안전_보조.md index 564131f0..6470a6f2 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제04장_나무베기/4-06_벌목부_작업안전_보조.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제04장_나무베기/4-06_벌목부_작업안전_보조.md @@ -9,8 +9,8 @@ PDF쪽: 63 작성: sub_laptop_4 검증: sub_laptop_3 원천: 글자층 -기계검사: -확정지문: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 +확정지문: f920d4aa3a93ed51c6ef4e524dfe3adf88c4ef3a0611656724179bbd6f2fd60e --- ## 4-6. 벌목부 작업안전 보조 @@ -24,7 +24,5 @@ PDF쪽: 63 ② 벌목 시 벌목부 4인당 보통인부 1인을 추가하며 4인을 초과할 시 해당 인력에 대한 안전 벌목 보조를 추가하여야 한다. > 【투입인원 산출】 -> > 벌목부 투입인원 3명 - 안전 벌목 보조 1명, 벌목부 투입인원 4명 - 안전 벌목 보조 1명 -> > 벌목부 투입인원 5명 - 안전 벌목 보조 2명, 벌목부 투입인원 6명 - 안전 벌목 보조 2명 diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/0-00_장머리.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/0-00_장머리.md index cb4af6b4..c8679992 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/0-00_장머리.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/0-00_장머리.md @@ -9,7 +9,7 @@ PDF쪽: 64 작성: sub_laptop_4 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-01_굴취작업.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-01_굴취작업.md index 5cc72615..e5c09133 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-01_굴취작업.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-01_굴취작업.md @@ -5,12 +5,12 @@ PDF쪽: 64~66 인쇄쪽: 52~54 시작표지: 5-1. 굴취작업 끝표지: 5-2. 뿌리돌림 -상태: 검증대기 +상태: 확정 작성: sub_laptop_4 -검증: +검증: sub_laptop_3 원천: 글자층 -기계검사: -확정지문: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 +확정지문: 5df7616cea2cf66fa738d38c91f65b1dd3feb5754d1fa9e9729a5705bf8f503b --- ## 5-1. 굴취작업 diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-02_뿌리돌림.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-02_뿌리돌림.md index fcf8b0f4..d78f53a4 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-02_뿌리돌림.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-02_뿌리돌림.md @@ -5,12 +5,12 @@ PDF쪽: 66 인쇄쪽: 54 시작표지: 5-2. 뿌리돌림 끝표지: 5-3. 식재작업 -상태: 검증대기 +상태: 확정 작성: sub_laptop_3 -검증: +검증: sub_laptop_2 원천: 글자층 -기계검사: -확정지문: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 +확정지문: 4ede1cc3c7d68c896251119d911f5e25d11d8e37ca49d770957e6000b8c5d9a0 --- ## 5-2. 뿌리돌림 diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-03_식재작업.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-03_식재작업.md index a8972344..3a2fe53b 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-03_식재작업.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-03_식재작업.md @@ -5,12 +5,12 @@ PDF쪽: 67~70 인쇄쪽: 55~58 시작표지: 5-3. 식재작업 끝표지: 5-4. 파종조림 -상태: 검증대기 +상태: 확정 작성: sub_laptop_3 -검증: +검증: sub_laptop_2 원천: 글자층 -기계검사: -확정지문: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 +확정지문: 6541e5f25b814c90097a26817d329e0467a638f6239c329d9ed40765fa6cd085 --- ## 5-3. 식재작업 @@ -44,13 +44,14 @@ PDF쪽: 67~70 | 백합나무 | 1-0(노), 1-1(노) | | | | 가시나무류 | 2-0(용) | | | | ※ 위 표에서 ‘노’는 ‘노지묘’이고, ‘용’은 ‘용기묘’이다.
※ 그 밖의 수종은 수종별 간장(최소 간장을 말한다) 및 근원경을 기준으로 아래와 같이 적용하되, 활엽수 삽목묘ㆍ접목묘 대묘는 이를 중묘로 본다. | | | | - + | 구분 | 침엽수 | 활엽수 | |---|---|---| | 소묘 | 간장 20cm미만 | 간장 30cm미만 | | 중묘 | 간장 20cm이상 40cm미만 또는
간장 40cm이상이고 근원경 8mm미만 | 간장 30cm이상 60cm미만 또는
간장 60cm이상이고 근원경 11mm미만 | | 대묘 | 간장 40cm이상이고 근원경 8mm이상 | 간장 60cm이상이고 근원경 11mm이상 | + ④ 묘목의 가격은 「산림자원의 조성 및 관리에 관한 법률 시행령」 제16조 규정에 따라 본 품과 별도로 적용한다. @@ -114,11 +115,12 @@ PDF쪽: 67~70 | 4.1 ∼ 4.5 | 0.33 | 0.23 | 0.16 | 0.09 | 0.35 | | 4.6 ∼ 5.0 | 0.38 | 0.27 | 0.17 | 0.10 | 0.40 | | 비고 | - 지주목을 세우지 않을 때는 다음의 요율을 감한다. | | | | | - + | 인력시공시 | 기계시공시 | |---|---| | 인력품의 10% | 인력품의 20% | + [주] ① 본 품은 흉고 또는 근원직경을 추정하기 어려운 수종에 적용한다. @@ -152,11 +154,12 @@ PDF쪽: 67~70 | 45 ∼ 49(54 ∼ 59) | 1.24 | 0.43 | 1.75 | 0.66 | | 50(60) | 1.33 | 0.45 | 1.85 | 0.70 | | 비고 | - 지주목을 세우지 않을 때는 다음의 요율을 감한다. | | | | - + | 인력시공시 | 기계시공시 | |---|---| | 인력품의 10% | 인력품의 20% | + [주] ① 본 품은 교목류 수종에 적용한다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-04_파종조림.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-04_파종조림.md index fa1ce5a8..88c80aec 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-04_파종조림.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-04_파종조림.md @@ -5,12 +5,12 @@ PDF쪽: 71 인쇄쪽: 59 시작표지: 5-4. 파종조림 끝표지: 5-5. 천연하종갱신 -상태: 검증대기 +상태: 확정 작성: sub_laptop_3 -검증: +검증: sub_laptop_2 원천: 글자층 -기계검사: -확정지문: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 +확정지문: 284f6e12592515da344095c383712d4026401b847de6e0f258c398e40dde24e2 --- ## 5-4. 파종조림 diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-05_천연하종갱신.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-05_천연하종갱신.md index 2e634e95..53d355d3 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-05_천연하종갱신.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-05_천연하종갱신.md @@ -5,12 +5,12 @@ PDF쪽: 71 인쇄쪽: 59 시작표지: 5-5. 천연하종갱신 끝표지: 5-6. 움싹갱신 -상태: 검증대기 +상태: 확정 작성: sub_laptop_3 -검증: +검증: sub_laptop_2 원천: 글자층 -기계검사: -확정지문: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 +확정지문: 447fc1d3bbb1a5ee6f39cfebae9101a13a3270db18e99515ed75ae5013bcb9f1 --- ## 5-5. 천연하종갱신 diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-06_움싹갱신.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-06_움싹갱신.md index 9726d426..28a8300a 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-06_움싹갱신.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-06_움싹갱신.md @@ -5,12 +5,12 @@ PDF쪽: 71 인쇄쪽: 59 시작표지: 5-6. 움싹갱신 끝표지: 5-7. 생태보완조림 -상태: 검증대기 +상태: 확정 작성: sub_laptop_3 -검증: +검증: sub_laptop_2 원천: 글자층 -기계검사: -확정지문: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 +확정지문: 465b8f13616950fbb9d3d8ddc1f4bb5dab0dfca99c8a8c7fd43840f2747455e0 --- ## 5-6. 움싹갱신 diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-07_생태보완조림.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-07_생태보완조림.md index e55fab68..377a5d68 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-07_생태보완조림.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-07_생태보완조림.md @@ -5,10 +5,30 @@ PDF쪽: 72 인쇄쪽: 60 시작표지: 5-7. 생태보완조림 끝표지: 5-8. 큰나무 공익조림 -상태: 대기 -작성: -검증: +상태: 확정 +작성: sub_laptop_3 +검증: sub_laptop_2 원천: 글자층 -기계검사: -확정지문: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 +확정지문: bfb34878bffb35fcc896d78e7a30203a35d67d9e29532877a8a5621a85006e4b --- + +## 5-7. 생태보완조림 + +(인/ha당) + +| 구분 | 내용 | 소요인력(인/ha) | 인력구분 | +|---|---|---|---| +| 움싹본수조절 | 그루터기 900본 기준 | 4.15 | 특별인부 30%
보통인부 70% | +| 치수이식 | 치수 100본 기준 | 0.50 | | +| 보완조림 | 현장 여건에 맞게 적용 | 묘목규격에 따라 차등적용 | | + + +[주] +① 움싹본수조절이란, 움싹갱신지에서 한 그루터기의 지하부 또는 지표근처에서 발생한 충실한 맹아를 1∼3본(신갈나무, 갈참나무 등은 2∼3본, 상수리나무, 굴참나무 등은 1∼2본) 남기고 나머지는 제거하는 작업(가지정리 및 수형조절 작업을 포함한다)을 말하며, 움싹갱신 2∼3년 후 생장휴지기인 11월 이후부터 이듬해 5월 이전까지 실시한다. +② 치수이식이란, 천연 발생한 우량한 어린나무를 솎아 주변 공간에 옮겨 심는 작업을 말한다. +③ 보완조림이란, 움싹이나 천연 발생한 어린나무 등을 조절하고 공간이 생기는 경우에 천연 발생한 어린나무의 수종과 크기가 같거나 유사한 묘목을 인공 식재하여 어린나무가 균일하게 생육하도록 보완하는 작업을 말한다. +④ 보완조림은 "5-3-1. 나무식재" 품을 적용하되, 보식과 같이 기본품에 0.05인/100당을 가산할 수 있다. + +⑤ 예정지정리가 필요한 경우에는 "3-5. 예정지 정리작업"을 적용한다. +⑥ 할인․할증은 산지경사(1-4-5), 작업장까지 이동거리(1-4-6), 토양상태(1-4-10)를 반영한다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-08_큰나무_공익조림.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-08_큰나무_공익조림.md index f7c43b97..6ee9f832 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-08_큰나무_공익조림.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-08_큰나무_공익조림.md @@ -5,10 +5,24 @@ PDF쪽: 72 인쇄쪽: 60 시작표지: 5-8. 큰나무 공익조림 끝표지: 5-9. 해안조림 -상태: 대기 -작성: -검증: +상태: 확정 +작성: sub_laptop_3 +검증: sub_laptop_2 원천: 글자층 -기계검사: -확정지문: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 +확정지문: 2c8a9451d7623f92a6bd800435be82b13f3ec5c520eec8cd1593cb1c84d26f0f --- + +## 5-8. 큰나무 공익조림 + +(인/1본당) + +| 구분 | 규격 | 소요인력
(인/본) | 인력구분 | +|---|---|---|---| +| 큰나무 식재 | R2㎝(h1.0∼1.5m)이상 | 0.16 | 특별인부 30%
보통인부 70% | + +[주] +① 본 품은 재료 소운반, 터파기, 나무세우기, 묻기, 물주기, 지주대세우기, 뒷정리를 포함한다. +② 묘목, 지주대 등 재료비는 별도로 계상한다. +③ 지주목을 세우지 않을 경우에는 인력품의 10%를 감한다. +④ 예정지정리가 필요한 경우에는 "3-5. 예정지 정리작업"을 적용한다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-09_해안조림.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-09_해안조림.md index d0f8c5cd..43dff196 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-09_해안조림.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-09_해안조림.md @@ -5,10 +5,28 @@ PDF쪽: 72~73 인쇄쪽: 60~61 시작표지: 5-9. 해안조림 끝표지: 5-10. 사방조림 -상태: 대기 -작성: -검증: +상태: 확정 +작성: sub_laptop_3 +검증: sub_laptop_2 원천: 글자층 -기계검사: -확정지문: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 +확정지문: 2cae871e79fe55f362824d23fe3dcea2ea770e8d432cc4fbf40663722ee3a65d --- + +## 5-9. 해안조림 + +(인/100본당) + +| 구분 | 식혈 | 식재 | 비고 | +|---|---|---|---| +| 보통인부 | 0.47 | 0.17 | | + +[주] +① 식혈의 크기 깊이 30㎝, 직경 30㎝를 기준으로 하는 품이다. +② 필요시 비료와 객토는 별도 계상하여야 한다. +③ 땅고르기와 뿌리자르기품은 포함되어 있다. +④ 묘목의 크기는 대묘를 기준으로 한 것이다. +⑤ 지주목 및 수분증발 방지 볏짚은 필요 시 별도 계상한다. + +> 【 해안조림 수종】 +> 해안조림에 적당한 수종은 양분과 수분에 대한 요구가 적고 온도의 급격한 변화와 강한 바람(해풍)에 잘 견디는 수종이다. 또한 생장이 왕성하며 낙엽, 낙지 등에 의하여 지력을 증진시킬 수 있는 수종이 적당하며, 일반적으로 식재되는 수종으로는 해송, 소나무, 섬향나무, 노간주나무, 보리장나무, 순비기나무, 자귀나무, 사시나무, 떡갈나무, 해당화, 아까시나무, 팽나무 등이 있는데, 이중에 3~4년생의 해송과 아까시나무 등이 가장 많이 심어지고 있다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-10_사방조림.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-10_사방조림.md index 3712e125..f2f684cd 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-10_사방조림.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-10_사방조림.md @@ -5,10 +5,30 @@ PDF쪽: 73 인쇄쪽: 61 시작표지: 5-10. 사방조림 끝표지: 5-11. 사초심기 -상태: 대기 -작성: -검증: +상태: 확정 +작성: sub_laptop_3 +검증: sub_laptop_2 원천: 글자층 -기계검사: -확정지문: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 +확정지문: 93ef014ccf79bc3d4e9d0124c0cc7c3d1b588982d3991faeb6b56ebb1a7d709c --- + +## 5-10. 사방조림 + +(㏊당) + +| 명칭 | 규격 | 수량 | 단위 | 비고 | +|---|---|---|---|---| +| 묘목 | 1~0 | 4,000 | 본 | 묘목 : 1년생
본수 : 4,000본 | +| 요소 | 46% | | kg | | +| 인산 | 20% | | kg | | +| 운반비 | | 72.4 | kg | 별도 계상, 운반조견표 참조 | +| 특별인부 | | 1.33 | 인 | | +| 보통인부 | | 20 | 인 | | + +[주] +① 사방조림은 황폐된 산지비탈면이나 각종 훼손지에 묘목을 식재하여 식생ㆍ숲을 조성, 녹화하는 녹화공종이다. +② 나무심기 구덩이는 20㎝ 이상 파고 식재함을 원칙으로 하며 객토가 필요할 경우 별도 계상한다. +③ 식재 수종에 따라 식재본수는 조정 가능하며 사방수종 외 식재 시 조림사업 품셈을 적용한다. +④ 비료와 객토의 운반은 조견표에 의한다. +⑤ 식재 시기는 남부지방은 2월 하순~3월 하순, 중부지방은 3월 중순~4월 상순이 좋다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-11_사초심기.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-11_사초심기.md index a1dea961..89280fd7 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-11_사초심기.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-11_사초심기.md @@ -5,12 +5,12 @@ PDF쪽: 73~74 인쇄쪽: 61~62 시작표지: 5-11. 사초심기 끝표지: 5-12. 떼붙임(재배잔디) -상태: 검증대기 +상태: 확정 작성: sub_laptop_2 -검증: +검증: sub_laptop_4 원천: 글자층 -기계검사: -확정지문: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 +확정지문: 5a7ced17f934551f6835b729efbbca64c49255527dd30e659b36398a5247f64b --- ## 5-11. 사초심기 diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-12_떼붙임(재배잔디).md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-12_떼붙임(재배잔디).md index 587dc089..d5d1b57a 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-12_떼붙임(재배잔디).md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-12_떼붙임(재배잔디).md @@ -5,12 +5,12 @@ PDF쪽: 74 인쇄쪽: 62 시작표지: 5-12. 떼붙임(재배잔디) 끝표지: 5-13. 떼심기 -상태: 검증대기 +상태: 확정 작성: sub_laptop_2 -검증: +검증: sub_laptop_4 원천: 글자층 -기계검사: -확정지문: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 +확정지문: 3caa9728cf251862784010b5d354a8ee32b3760c0515c559ca27a3c412b0d507 --- ## 5-12. 떼붙임(재배잔디) diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-13_떼심기.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-13_떼심기.md index aece0bab..0f624db4 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-13_떼심기.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-13_떼심기.md @@ -5,12 +5,12 @@ PDF쪽: 74~75 인쇄쪽: 62~63 시작표지: 5-13. 떼심기 끝표지: 5-14. 새심기 -상태: 검증대기 +상태: 확정 작성: sub_laptop_2 -검증: +검증: sub_laptop_4 원천: 글자층 -기계검사: -확정지문: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 +확정지문: 704e86bbc40d9419027ff16381efc4d172de112f650c8d3f4e7cd715ede7400b --- ## 5-13. 떼심기 diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-14_새심기.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-14_새심기.md index 2bb90380..a6ae68b8 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-14_새심기.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-14_새심기.md @@ -5,12 +5,12 @@ PDF쪽: 75 인쇄쪽: 63 시작표지: 5-14. 새심기 끝표지: 5-15. 바자얽기 -상태: 검증대기 +상태: 확정 작성: sub_laptop_2 -검증: +검증: sub_laptop_4 원천: 글자층 -기계검사: -확정지문: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 +확정지문: 8bbd0471eac31be61aa7c441112992e0b972a0f530c84bf9cce9077d398775b6 --- ## 5-14. 새심기 diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-15_바자얽기.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-15_바자얽기.md index 18b15554..ce30eaf2 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-15_바자얽기.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-15_바자얽기.md @@ -5,12 +5,12 @@ PDF쪽: 75~76 인쇄쪽: 63~64 시작표지: 5-15. 바자얽기 끝표지: 5-16. 선떼붙이기공 -상태: 검증대기 +상태: 확정 작성: sub_laptop_2 -검증: +검증: sub_laptop_4 원천: 글자층 -기계검사: -확정지문: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 +확정지문: ad33c43714431682f3a1295ca6c8ba8627ee39e0eeac60800cb34aefc9b18930 --- ## 5-15. 바자얽기 diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-16_선떼붙이기공.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-16_선떼붙이기공.md index 0aa35af7..36dd05af 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-16_선떼붙이기공.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-16_선떼붙이기공.md @@ -5,12 +5,12 @@ PDF쪽: 76 인쇄쪽: 64 시작표지: 5-16. 선떼붙이기공 끝표지: 5-17. 조공 -상태: 검증대기 +상태: 확정 작성: sub_laptop_2 -검증: +검증: sub_laptop_4 원천: 글자층 -기계검사: -확정지문: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 +확정지문: f591ab94c6fa59fa75432d7d8534c7c032dd3ecbcdfba07ed9e6cb0067b99248 --- ## 5-16. 선떼붙이기공 diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-17_조공.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-17_조공.md index c183c409..3be8bf0d 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-17_조공.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-17_조공.md @@ -5,12 +5,12 @@ PDF쪽: 77 인쇄쪽: 65 시작표지: 5-17. 조공 끝표지: 5-18. 씨뿌리기(줄) -상태: 검증대기 +상태: 확정 작성: sub_laptop_2 -검증: +검증: sub_laptop_4 원천: 글자층 -기계검사: -확정지문: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 +확정지문: b52381a9a84d85323dd601db56f4f1f77abf6eabf16805620f16f233bfeb6236 --- ## 5-17. 조공 diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-18_씨뿌리기(줄).md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-18_씨뿌리기(줄).md index 267fad7a..621e43b9 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-18_씨뿌리기(줄).md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-18_씨뿌리기(줄).md @@ -5,12 +5,12 @@ PDF쪽: 77~78 인쇄쪽: 65~66 시작표지: 5-18. 씨뿌리기(줄) 끝표지: 5-19. 표토 절취 및 정지 -상태: 검증대기 +상태: 확정 작성: sub_laptop_2 -검증: +검증: sub_laptop_4 원천: 글자층 -기계검사: -확정지문: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 +확정지문: 2e152984431398dec1dd5ff1c02d276f748d53271e56f83d2f71979b63670f52 --- ## 5-18. 씨뿌리기(줄) diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-19_표토_절취_및_정지.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-19_표토_절취_및_정지.md index c6f73be8..37b53aed 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-19_표토_절취_및_정지.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-19_표토_절취_및_정지.md @@ -5,12 +5,12 @@ PDF쪽: 78 인쇄쪽: 66 시작표지: 5-19. 표토 절취 및 정지 끝표지: 5-20. 표토관리 -상태: 검증대기 +상태: 확정 작성: sub_laptop_2 -검증: +검증: sub_laptop_4 원천: 글자층 -기계검사: -확정지문: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 +확정지문: 461a24d9a252d751166c753b3c08153e6390c1c98192616a86a4d3497ee711c8 --- ## 5-19. 표토 절취 및 정지 diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-20_표토관리.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-20_표토관리.md index efaee126..c732be29 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-20_표토관리.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-20_표토관리.md @@ -5,12 +5,12 @@ PDF쪽: 78 인쇄쪽: 66 시작표지: 5-20. 표토관리 끝표지: 5-21. 표토이식 -상태: 검증대기 +상태: 확정 작성: sub_laptop_2 -검증: +검증: sub_laptop_4 원천: 글자층 -기계검사: -확정지문: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 +확정지문: 1b2ce1aaae7b7e38d580415e4205305671d3eb1baa432b6588edfd9008cef188 --- ## 5-20. 표토관리 diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-21_표토이식.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-21_표토이식.md index 96cb2781..e7e53eb5 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-21_표토이식.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-21_표토이식.md @@ -5,10 +5,28 @@ PDF쪽: 79 인쇄쪽: 67 시작표지: 5-21. 표토이식 끝표지: 5-22. 평떼 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_4 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 5-21. 표토이식 + +(인/㎡) + +| 구분 | 보통인부(인) | 비고 | +|---|---|---| +| 채취 | 0.34 | | +| 운반 | 0.26 | | +| 붙이기 | 0.47 | | + +[주] +① 사방사업에서 기존 표토를 채취하여 보관한 후 이식하여 주변 식생과 조화를 이루게 하는 지역에 적용한다. +② 채취품은 1.2m 이하의 관목류와 초본류를 채취하는데 사용되며 그 이상은 별도 품을 적용한다. +③ 표토의 두께는 0.2m를 기준으로 한다. 그 이상은 장비와 병용하여 사용한다. +④ 운반 30m를 기준으로 한 품이며 그 이상은 무게(떼 무게 적용)를 감안한 소운반을 별도 계상한다. +⑤ 붙이기 품에는 복토 및 식재지 면고르기, 잡관목 제거품은 포함되어 있지 않다. +⑥ 표토의 채취 시 채취지역을 분산시켜 자연식생의 훼손을 최소화한다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-22_평떼.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-22_평떼.md index 39647bbb..66591a83 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-22_평떼.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-22_평떼.md @@ -5,10 +5,54 @@ PDF쪽: 79~80 인쇄쪽: 67~68 시작표지: 5-22. 평떼 끝표지: 5-23. 줄떼 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_4 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 5-22. 평떼 + +### 5-22-1. 떼 구입 및 운반 : 별도 계상 + +\- 규격 및 소요 매수 : 0.3×0.3, 11매/㎡ + +### 5-22-2. 평떼 붙임 + +(㎡당) + +| 구분 | 단위 | 적용 | 비고 | +|---|---|---|---| +| 조경공 | 인 | 0.0099 | | +| 보통인부 | 인 | 0.0231 | | + +### 5-22-3. 떼꽂이 제작 및 설치 + +(㎡당) + +| 구분 | 단위 | 적용 | 비고 | +|---|---|---|---| +| 보통인부 | 인 | 0.011 | 1일1인 1,000개,
㎡당 3.3개 기준 | + +[주] +평떼(보통인부 0.06인)품에는 떼꽂이 제작 및 설치가 포함되어 있어 비교ㆍ검토 후 적용한다. + +### 5-22-4. 평떼 시비 + +(일당) + +| 구분 | 규격 | 단위 | 수량 | 시공량(㎡) | +|---|---|---|---|---| +| 조경공 | | 인 | 2 | 22,500 | +| 보통인부 | | | 1 | | +| 트럭 | 2.5ton | 대 | 1 | | + + +[주] +① 본 품은 화학비료의 살포가 300~700kg/10,000㎡인 경우 기준이다. +② 현장조건, 살포조건에 따라 살포량이 다를 때는 본 품의 20%범위 내에서 증감할 수 있다. +③ 비료량은 별도 계상한다. +④ 「건설공사 표준품셈 유지관리부문, 1-2-5 관목 전정(2025)」 참고한다. + diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-23_줄떼.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-23_줄떼.md index 7766c8bc..281f7449 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-23_줄떼.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-23_줄떼.md @@ -5,10 +5,33 @@ PDF쪽: 80 인쇄쪽: 68 시작표지: 5-23. 줄떼 끝표지: 5-24. 씨앗뿜어붙이기 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_4 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 5-23. 줄떼 + +### 5-23-1. 떼 구입 및 운반 : 별도 계상 + +\- 규격 및 소요 매수 : 0.3×0.3(30㎝ 간격), 3.33매/㎡ + +### 5-23-2. 떼붙임 + +(㎡당) + +| 구분 | 단위 | 적용 | 비고 | +|---|---|---|---| +| 조경공 | 인 | 0.0084 | | +| 보통인부 | 인 | 0.0196 | | + +### 5-23-3. 떼꽂이 제작 및 설치 + +(㎡당) + +| 구분 | 단위 | 적용 | 비고 | +|---|---|---|---| +| 보통인부 | 인 | 0.0033 | 1일1인 1,000개,
㎡당 3.3개 기준 | diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-24_씨앗뿜어붙이기.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-24_씨앗뿜어붙이기.md index 9db9e15e..aa1ccb64 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-24_씨앗뿜어붙이기.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-24_씨앗뿜어붙이기.md @@ -5,10 +5,113 @@ PDF쪽: 81~83 인쇄쪽: 69~71 시작표지: 5-24. 씨앗뿜어붙이기 끝표지: 5-25. 거적덮기 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_4 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 5-24. 씨앗뿜어붙이기 + +### 5-24-1. 뿜어붙이기-기계/일반 + +(㎡당) + +| 구분 | | 규격 | 단위 | 적용수량 | 비고 | +|---|---|---|---|---|---| +| 자재 | 종자 | | kg | 0.025 | | +| | 비료 | 복합비료 | kg | 0.1 | | +| | 피복제 | 화이버 | kg | 0.18 | | +| | 침식안정제 | 합성접착제 | kg | 0.1 | | +| | 색소 | 색소 | kg | 0.002 | | +| 장비 | 종자살포기 | 2,500-3,000ℓ | 시간 | 0.0024 | | +| | 트럭 | 4.5ton | 시간 | 0.0024 | | +| | 물탱크 | 5,500ℓ | 시간 | 0.0036 | | +| 인력 | 조경공 | | 인 | 0.0007 | | +| | 보통인부 | | 인 | 0.0004 | | + + +[주] +① 씨앗의 배합은「도로비탈면 녹화공사의 설계및 시공 지침(2009)」 2.7 종자배합설계에 의한다. +② 외래종은 생태계에 미치는 영향을 고려하여 신중히 결정한다. +③ 배합 비율은 환경(비탈면 방향, 고도 등) 및 공사시기(계절) 등을 종합적으로 고려하여 판단한다. +④ 비탈면 구간은 살수차에 의한 살수가 불가능하나 살수차에 의한 관수의 인력품을 적용한다. +⑤ 「건설공사 표준품셈 공통부문, 4-1-2 초류종자 살포(2025)」참조한다. +⑥ 시드스프레이(seed spray) 공법이라 칭한다. +⑦ 물주기(인력) 필요시 보통인부 0.0005인 적용한다. 「건설공사 표준품셈 유지관리부문, 1-2-8 인력관수(2025)「」, 「건설공사 표준품셈 유지관리부문, 1-2-9 살수차관수(2025)」 참조한다. + + +### 5-24-2. 뿜어붙이기-기계/마사토 + +(㎡당) + +| 구분 | | 규격 | 단위 | 적용수량 | 비고 | +|---|---|---|---|---|---| +| 자재 | 종자 | | kg | 0.025 | | +| | 비료 | 복합비료 | kg | 0.1 | | +| | 피복제 | 화이버 | kg | 0.18 | | +| | 침식안정제 | 합성접착제 | kg | 0.1 | | +| | 색소 | 색소 | kg | 0.002 | | +| 장비 | 종자살포기 | 2,500-3,000ℓ | 시간 | 0.0024 | | +| | 트럭 | 4.5ton | 시간 | 0.0024 | | +| | 물탱크 | 5,500ℓ | 시간 | 0.0036 | | +| 인력 | 조경공 | 뿜어붙이기인력 | 인 | 0.0007 | | +| | 보통인부 | 뿜어붙이기인력 | 인 | 0.0004 | | + + +[주] +① 물주기(인력) 필요시 보통인부 0.0005인 적용한다. +② 골파기 : 1.0m간격/10㎡(3×3.33), A=0.3m/줄×2줄×3.33m=2.0㎡ +보통인부 0.02인×A=0.04인 + + +<자연경관복원형 적용지역 종자배합비율 조견표> + +| 복원목표 | 식생구분 | 종자배합비율(%) | +|---|---|---| +| 초본 위주형 | 관목류 | 20~40 | +| | 초본, 야생화류 | 40~80 | +| | 외래초종(양잔디류) | 0~10 | +| | 합계 | 100 | +| 초본ㆍ관목
혼합형 | 관목류 | 30~50 | +| | 초본, 야생화류 | 45~70 | +| | 외래초종(양잔디류) | 0~5 | +| | 합계 | 100 | +| 목본 군락형 | 교목류, 아교목류, 관목류 | 40~70 | +| | 초본, 야생화류 | 30~70 | +| | 외래초종(양잔디류) | 0 | +| | 합계 | 100 | + + +<기타 적용지역 종자배합비율 조견표> + +| 복원목표 | 식생구분 | 종자배합비율(%) | +|---|---|---| +| 초본 위주형 | 관목류 | 10∼40 | +| | 초본, 야생화류 | 40∼80 | +| | 외래초종(양잔디류) | 10∼20 | +| | 합계 | 100 | +| 초본·관목
혼합형 | 관목류, 아교목류 | 30∼50 | +| | 초본, 야생화류 | 40∼70 | +| | 외래초종(양잔디류) | 5∼15 | +| | 합계 | 100 | +| 목본 군락형 | 교목류, 아교목류, 관목류 | 35∼60 | +| | 초본, 야생화류 | 35∼65 | +| | 외래초종(양잔디류) | 3∼10 | +| | 합계 | 100 | + + + +[주] +① 「도로비탈면 녹화공사의 설계및 시공 지침 2.7 종자배합설계(2009)」 참조한다. +② 기타 적용지역이란 자연경관복원형의 복원목표가 적용되지 않는 지역을 말한다. +③ 해안생태계지역에서는 해안에 적합한 종자배합을 하고, 외래도입초종이 10%를 상회하지 않도록 한다. + +> 【적용 시 참고사항】 +> 가. 난지형초종인 weeping lovegrass 사용을 최대한 억제하며, 싸리와 낭아초는 20% 이하의 비율로 배합하여 지나치게 우점하지 않도록 한다. +> 나. 숫자는 중량배합비율을 의미하며 종자배합 시 외래초종의 중량배합비율을 우선 정한 다음 초본, 야생화류, 관목류 등 전체 종자 배합량의 합이 100이 되도록 정한다. +> 다. 복원목표가 자연경관 복원형인 경우 녹화식물은 그늘사초, 큰기름새, 대사초, 참억새, 새, 솔새, 개솔새, 양지꽃, 노루오줌, 구절초, 참취, 큰까치수영, 뚝갈 등의 초본류와 생강나무, 진달래, 철쭉, 개옻나무, 붉나무, 국수나무, 산초나무, 쥐똥나무, 개암나무, 호랑버들, 병꽃나무, 찔레나무, 산딸기, 복분자딸기, 노린재나무, 호랑버들, 소나무 등의 목본류가 비탈면 녹화용 자생종(재래초본, 재래목본)으로 사용될 수 있으며, 이들 외에도 부록에서 제시된 식물들을 추가로 사용할 수 있다. +> 라. 녹화용 식물은 현지에 서식하는 식물을 주로 활용하고, 중국산인 경우 산지를 확인하여 우리나라 기후 및 풍토와 유사한 지역인지를 확인한다. +> 마. 목본 군락형의 경우 교목류와 아교목류는 비탈면 상부의 토심이 깊고 경사도가 완만하고 비탈면 안정에 영향이 없으며 시거에 지장이 없는 구간에 적용이 가능하며, 성장 후 키가 낮은 식물을 우선 적용할 수 있다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-25_거적덮기.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-25_거적덮기.md index 5c4f0696..2bc75bb6 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-25_거적덮기.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-25_거적덮기.md @@ -5,10 +5,25 @@ PDF쪽: 83 인쇄쪽: 71 시작표지: 5-25. 거적덮기 끝표지: 5-26. 흙갈이 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_4 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 5-25. 거적덮기 + +(㎡당) + +| 구분 | | 단위 | 수량 | 비고 | +|---|---|---|---|---| +| 자재 | 거적 | ㎡ | 1.1 | | +| 인력 | 조경공 | 인 | 0.002 | | +| | 보통인부 | 인 | 0.0007 | | + + +[주] +① 거적덮기에 필요한 앙카핀, 착지핀, 고정판, 고정끈 등 주자재에 부속된 자재는 별도 계상한다. +② 「건설공사 표준품셈 공통부문, 4-1-4 거적덮기(2025)」 참조한다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-26_흙갈이.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-26_흙갈이.md index 1c122293..a6ec94ff 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-26_흙갈이.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-26_흙갈이.md @@ -5,10 +5,55 @@ PDF쪽: 83~84 인쇄쪽: 71~72 시작표지: 5-26. 흙갈이 끝표지: 5-27. 식재면 관리 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_4 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 5-26. 흙갈이 + +### 5-26-1. 막갈이 + +(인/992㎡당) + +| 토성 | 막갈이깊이(cm) | | | | | +|---|---|---|---|---|---| +| | 9 | 12 | 15 | 18 | 21 | +| 사토 | 5 | 7 | 9 | 11 | 13 | +| 양토 | 6 | 8 | 11 | 13 | 15 | +| 식토 | 8 | 11 | 13 | 15 | 18 | + + +[주] +① 본 품은 답압된 토양의 구조적 개량을 위해 적용한다. +② 면고르기는 포함되어 있지 않다. + +### 5-26-2. 흙부수기 + +(인/992㎡당) + +| 토성 | 막갈이깊이(cm) | | | | | +|---|---|---|---|---|---| +| | 9 | 12 | 15 | 18 | 21 | +| 사토 | 3 | 4 | 5 | 6 | 7 | +| 양토 | 4 | 5 | 6 | 7 | 8 | +| 식토 | 5 | 6 | 7 | 8 | 9 | + + +[주] +본 품은 고르기를 포함한 것이다. + +### 5-26-3. 돌자갈치우기 + +(인/992㎡당) + +| 토성 | 경토깊이(cm) | | | +|---|---|---|---| +| | 10% 이내 | 10∼30% | 30% 이상 | +| 개답 | 2 | 6 | 17 | +| 개전 | 0.5 | 3.5 | 6.5 | + + diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-27_식재면_관리.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-27_식재면_관리.md index c67bdf04..109fabb1 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-27_식재면_관리.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-27_식재면_관리.md @@ -5,10 +5,25 @@ PDF쪽: 84 인쇄쪽: 72 시작표지: 5-27. 식재면 관리 끝표지: 5-28. 비탈덮기 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_4 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 5-27. 식재면 관리 + +(인/10㎡당) + +| 구분 | 수량 | 비고 | +|---|---|---| +| 조경공 | 0.01 | | +| 보통인부 | 0.08 | | + +[주] +① 본 품은 흙 쌓기가 발생한 지역을 그 대상으로 한다. +② 본 품은 부토 및 면고르기가 완료된 상태에서 인력으로 잔돌제거 등 식재면을 정비하는 기준이다. +③ 본 품은 식재면고르기가 필요한 공종에 별도 계상한다. +④ 매토종자 이용 시 토양의 단면구조 보전 여부에 따라, 단면구조를 보전하지 않을 경우 토공을, 단면구조를 보전할 경우 다음의 표토관리 품과 운반공을 조합하여 반영한다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-28_비탈덮기.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-28_비탈덮기.md index d4c55cd6..375625ad 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-28_비탈덮기.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-28_비탈덮기.md @@ -5,10 +5,42 @@ PDF쪽: 84~85 인쇄쪽: 72~73 시작표지: 5-28. 비탈덮기 끝표지: 5-29. 복사이식 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_4 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 5-28. 비탈덮기 + +### 5-28-1. 짚망 + +(인/100㎡당) + +| 구분 | 수량 | 비고 | +|---|---|---| +| 특별인부 | 0.19 | | +| 보통인부 | 0.06 | | + +[주] +① 본품은 성토 또는 절토사면에 짚, 망, 거적, 섶 등을 덮어 설치하는 기준이다. +② 재료량은 설계수량에 따라 별도 계상한다. + +### 5-28-2. 방초매트 및 야자섬유매트 포장 + +(일당) + +| 구분 | 단위 | 수량 | 시공량(㎡) | | +|---|---|---|---|---| +| | | | 폭 1.5m 이하 | 폭 2.0m 이하 | +| 조경공 | 인 | 2 | 90 | 130 | +| 보통인부 | 인 | 1 | | | + + +[주] +① 본 품은 설치 위치의 토공사가 완료된 상태에서 야자섬유 매트로 포장하는 기준이다 + +② 매트 포장면 정리, 야자섬유 매트 및 고정핀 설치, 매트 연결 및 고정, 마무리 작업을 포함한다. +③ 설치 위치의 토공 작업은 필요시 별도 계상한다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-29_복사이식.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-29_복사이식.md index 9be96618..bac6c58f 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-29_복사이식.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-29_복사이식.md @@ -5,10 +5,32 @@ PDF쪽: 85 인쇄쪽: 73 시작표지: 5-29. 복사이식 끝표지: 5-30. 표시봉설치 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_4 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 5-29. 복사이식 + +| 구분 | 적용 | 비고 | +|---|---|---| +| K(버킷계수) | 0.9 | | +| f(체적환산계수) | 1/1.3 | | +| E(작업효율) | 0.70 | | +| Cm(1회 사이클시간) | 20(135°)sec | | + + +[주] +① 교목부터 초본 전체와 토양까지 단기간 내 이식하여 복원하는 기업이다. + +② 복사이식 들어내기 및 되메우기에 반영한다. +③ 무한궤도형 굴착기(1.0㎥) 적용한다. 0.2㎥ 또는 0.4㎥ 용량의 굴착기를 사용하는 경우에는 「건설공사 표준품셈 공통부문. 8-2-3 굴착기(2025)」를 참조하여 적용계수를 달리 적용하도록 한다. +④ Q1=3,600×q×K×f×E/Cm=㎥/시간 +⑤ Q=Q1*T=㎥/시간 +여기서 Q1 : 시간당 작업량(㎥/hr) +Q : 시간당 작업량(㎥/hr) +T : 표토두께(m) + diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-30_표시봉설치.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-30_표시봉설치.md index 3a615efd..bd6aac60 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-30_표시봉설치.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-30_표시봉설치.md @@ -5,10 +5,23 @@ PDF쪽: 85 인쇄쪽: 73 시작표지: 5-30. 표시봉설치 끝표지: 5-31. 지주목설치 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_4 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 5-30. 표시봉설치 + +(1,000본당) + +| 구분 | 규격 | 소요인력 | 인력구분 | +|---|---|---|---| +| 표시봉 설치 | 길이 1.0m 이상 | 0.70 | 보통인부 | + +[주] +① 본 품은 표시봉 소운반과 설치비를 포함한다. +② 표시봉은 길이 1.0m 이상의 대나무 등 친환경 소재를 사용하며, 상부 쪽에 친환경성 흰색 수성페인트를 0.5m 이상 표시한다. +③ 표시봉의 가격은 시장가격을 조사하여 적용한다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-31_지주목설치.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-31_지주목설치.md index 79063b71..1cb9b9bc 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-31_지주목설치.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-31_지주목설치.md @@ -5,10 +5,23 @@ PDF쪽: 86 인쇄쪽: 74 시작표지: 5-31. 지주목설치 끝표지: 5-32. 대절작업 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_4 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 5-31. 지주목설치 + +(1,000본당) + +| 구분 | 규격 | 소요인력 | 인력구분 | +|---|---|---|---| +| 지주목 설치 | 길이 1.0m 이상 | 1.00 | 보통인부 | + +[주] +① 본 품은 지주목 소운반과 설치비를 포함한다. +② 지주목은 대묘식재만 적용하며, 묘목 1본당 지주목 1개를 적용한다. +③ 지주목은 길이 1.0m 이상의 목재로 0.3m 이상 땅속에 박히도록 설치하여야 한다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-32_대절작업.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-32_대절작업.md index 9c9f36e1..97e95cb2 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-32_대절작업.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-32_대절작업.md @@ -5,10 +5,22 @@ PDF쪽: 86 인쇄쪽: 74 시작표지: 5-32. 대절작업 끝표지: 5-33. 묘목 가식작업 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_4 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 5-32. 대절작업 + +(1,000본당) + +| 구분 | 사용도구 | 소요인력 | 인력구분 | +|---|---|---|---| +| 대절 | 전정가위 | 0.50 | 특별인부 | + +[주] +① 초두부 고사방지를 위하여 식재 후 지상부 줄기에서 눈(芽)이 1~2개 남겨질 수 있도록 지상부에서 3~5㎝ 정도 위치를 전정가위로 잘라주는 것을 말한다. +② 백합나무, 오동나무 등 조림목을 대상으로 실시한다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-33_묘목_가식작업.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-33_묘목_가식작업.md index d05c01aa..a99a2051 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-33_묘목_가식작업.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-33_묘목_가식작업.md @@ -5,10 +5,24 @@ PDF쪽: 86 인쇄쪽: 74 시작표지: 5-33. 묘목 가식작업 끝표지: 5-34. 묘목 소운반 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_4 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 5-33. 묘목 가식작업 + +(1,000본당) + +| 구분 | 소요인력 | 인력구분 | +|---|---|---| +| 소묘, 중묘 | 0.20 | 보통인부 | +| 대묘 | 0.30 | | + + +[주] +본 품은 가식장 준비, 차광망 설치와 물주기를 포함한다 + diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-34_묘목_소운반.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-34_묘목_소운반.md index 8825ab7e..a6a7f89e 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-34_묘목_소운반.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제05장_식재_및_녹화/5-34_묘목_소운반.md @@ -5,10 +5,69 @@ PDF쪽: 86~88 인쇄쪽: 74~76 시작표지: 5-34. 묘목 소운반 끝표지: 제6장 생육보조 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_4 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 5-34. 묘목 소운반 + +(1,000본당) + +| 구분 | 소요인력 | 인력구분 | +|---|---|---| +| 소묘 | 0.15 | 보통인부 | +| 중묘 | 0.20 | | +| 대묘 | 3.40 | | + + +[주] +① 묘목 소운반이란, 묘목을 가식장 또는 차량에서 식재지점까지 운반하는 것을 말한다. +② 대묘 중 용기묘 대묘의 경우 본 품의 50%를 계상한다. +③ 묘목의 대운반비는 2개 이상의 견적을 받아 적용하거나, 다음 자료를 참고하여 소운반비와 별도로 산출한다. + +<묘목의 규격별, 차량별 적재량 : ((사)한국양묘협회 제공자료)> + +| 규격 | 수종 및 묘령(형태) | 적재량 | | 비고 | +|---|---|---|---|---| +| | | 2.5톤 차량 | 5.0톤 차량 | | +| 소묘 | 소나무 1-1(노지묘) | 110곤포 | 200곤포 | 500본/곤포 | +| 중묘 | 편백 2-0(용기묘) | 150박스 | 300박스 | 100본/박스 | +| 대묘 | 해송 1-1-2(노지묘) | 1,800본 | 3,000본 | 분뜨기묘 1본 | +| | 소 2-2 (용기묘) | 300곤포 | 800곤포 | 10본/곤포 | +| ※ 묘목 1,000본당 무게
- 소나무 노지묘 1-1 (45㎏)
- 낙엽송, 편백 용기묘 2-0 (200㎏)
- 상수리 용기묘 1-0 (200㎏) | | | | | + + +> 【대운반비 단가산출 예시】 +> (1) 10ha에 식재할 소묘 30,000본을 100㎞ 운반할 경우의 대운반비 산출 +> ∙ 화물차별 묘목 적재량은 양묘협회에서 제공해 준 자료 활용. 차량 2.5톤에 적재할 수 있는 소묘 수량은 55,000본. +> ∙ 화물차 운송비는 거리별 구역화물 고시금액(2009년) 적용, 2.5톤 화물차 100㎞ 운송비는 91,810원. +> ∙ 소묘 1,000본당 대운반비를 산출하면 +> \- 차량 소요대수는 30,000본/55,000본 = 0.55대 +> \- 소묘 30,000본 운송비 : 91,810원 × 0.55대 = 50,495원. +> \- 소묘 1,000본당 대운반비 : 50,495원×(1,000본/30,000본) = 1,683원 +> (2) 20ha에 식재할 용기묘(편백2-0) 60,000본을 80㎞ 운반할 경우의 대운반비 산출 +> ∙ 차량 2.5톤에 적재할 수 있는 용기묘 수량은 15,000본. 5.0톤에 적재할 수 있는 용기묘 수량은 30,000본. +> ∙ 2.5톤 화물차 80㎞ 운송비는 84,620원. 5.0톤 화물차 80㎞ 운송비는 115,890원. +> ∙ 용기묘 운반차량은 5.0톤으로 결정 +> ∙ 용기묘 1,000본당 대운반비를 산출하면; +> \- 차량 소요대수는 60,000본/30,000본 = 2.0대(5톤 화물차) +> \- 용기묘 60,000본 운송비 : 115,890원 × 2대 = 231,780원. +> \- 용기묘 1,000본당 대운반비 : 231,780원×(1,000본/60,000본) = 3,863원 +> (3) 10ha에 식재할 대묘(해송 1-1-2 분뜨기묘) 15,000본을 80㎞ 운반할 경우의 대운반비 산출 +> ∙ 차량 2.5톤에 적재할 수 있는 대묘 수량은 1,800본. 5.0톤에 적재할 수 있는 대묘 수량은 3,000본. +> ∙ 2.5톤 화물차 80㎞ 운송비는 84,620원. 5.0톤 화물차 80㎞ 운송비는 115,890원. +> ∙ 대묘 운반차량은 5.0톤으로 할 경우, 대묘 1,000본당 대운반비를 산출하면 +> \- 차량 소요대수는 15,000본/3,000본 = 5.0대(5톤 화물차) +> \- 대묘 15,000본 운송비 : 115,890원 × 5대 = 579,450원. +> \- 대묘 1,000본당 대운반비 : 579,450원×(1,000본/15,000본) = 38,630원 +> ∙ 대묘 운반차량은 2.5톤으로 할 경우, 대묘 1,000본당 대운반비를 산출하면 +> \- 차량 소요대수는 15,000본/1,800본 = 8.33대(2.5톤 화물차) +> \- 대묘 15,000본 운송비 : 84,620원 × 8.33대 = 704,885원. +> \- 대묘 1,000본당 대운반비 : 704,885원×(1,000본/15,000본) = 46,992원 +> ※ 상기와 같은 대묘 운반은 5.0톤으로 적용함이 타당함. +> (4) 묘목본수는 본으로 하고 차량대수는 소수점 셋째자리에서 반올림하여 둘째자리까지 계산한다. +> (5) 운송비 및 대운반비 등 비용은 1원단위 미만 절사한다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제06장_생육보조/0-00_장머리.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제06장_생육보조/0-00_장머리.md index 4beb01f0..06472b35 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제06장_생육보조/0-00_장머리.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제06장_생육보조/0-00_장머리.md @@ -5,10 +5,12 @@ PDF쪽: 89 인쇄쪽: 77 시작표지: 제6장 생육보조 끝표지: 6-1. 비료주기 -상태: 대기 -작성: -검증: +상태: 확정 +작성: sub_laptop_2 +검증: sub_laptop_3 원천: 글자층 -기계검사: -확정지문: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 +확정지문: 44f502fa15156827e1c9387af746538dc145441e308bc1057ea655b14bf45089 --- + +# 제6장 생육보조 diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제06장_생육보조/6-01_비료주기.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제06장_생육보조/6-01_비료주기.md index 5e67ae03..df243463 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제06장_생육보조/6-01_비료주기.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제06장_생육보조/6-01_비료주기.md @@ -5,10 +5,25 @@ PDF쪽: 89 인쇄쪽: 77 시작표지: 6-1. 비료주기 끝표지: 6-2. 풀베기 -상태: 대기 -작성: -검증: +상태: 확정 +작성: sub_laptop_2 +검증: sub_laptop_3 원천: 글자층 -기계검사: -확정지문: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 +확정지문: 6ac38dbf0b60eaab002995d8a3ea71ee9f5e0897af1e90771c7d6d2286bdd8f5 --- + +## 6-1. 비료주기 + +| 구분 | 소요인력
(인/100kg) | 인력구분 | +|---|---|---| +| 인공림(10년이하 조림지) | 3.5 | 보통인부 | +| 인공림(10년초과 성림지) | 4.5 | | +| 천연림 | 4.5 | | + + +[주] +① 환상시비(4방향 또는 원형으로 약 5cm 파고 시비)는 10%, 수평구시비(등고선 방향으로 약 5cm 수평으로 골을 파고 시비)는 5%를 할증한다. +② 토양의 돌함량이 30%이상이고, 나무뿌리가 밀하게 분포할 경우 15%, 돌함량이 10~30%이고, 나무뿌리가 보통정도로 분포할 경우 10%를 할증한다. +③ 비료주기 전 풀베기를 실시하지 않은 곳은 10%를 할증한다. +④ 할인․할증은 경사도(1-4-5), 작업장까지 이동거리(1-4-6), 토양상태(1-4-10)를 반영한다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제06장_생육보조/6-02_풀베기.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제06장_생육보조/6-02_풀베기.md index 52cff3bd..9522af75 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제06장_생육보조/6-02_풀베기.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제06장_생육보조/6-02_풀베기.md @@ -5,10 +5,62 @@ PDF쪽: 89~90 인쇄쪽: 77~78 시작표지: 6-2. 풀베기 끝표지: 6-3. 맹아제거 -상태: 대기 -작성: -검증: +상태: 확정 +작성: sub_laptop_2 +검증: sub_laptop_3 원천: 글자층 -기계검사: -확정지문: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 +확정지문: 16ce413b0cc3f2437929effb3d59083ac165491be49306e36bc45db88707c9ed --- + +## 6-2. 풀베기 + +### 6-2-1. 둘레베기 + +(1ha당, 100본당) + +| 사용도구 | 단위 | 소요인력 | 인력구성 | +|---|---|---|---| +| 낫 | 인/100본 | 0.18 | 보통인부 | + +[주] +① 본 공정은 조림목을 중심으로 반경 50㎝ 이내에 있는 모든 식생을 낫으로 제거하는 작업이다. +② 조림목 본수는 표준지로 조사한 조림목의 생육본수를 적용한다. 이때 조림목이 고사한 경우, 당초 식재 위치 주변에 자연적으로 발생한 천연치수(침엽수종은 조림목과 생장속도가 유사한 침엽수, 활엽수종은 종자 또는 뿌리에서 발생한 교목성 경제수종에 한함)를 조림목본수에 포함시킬 수 있다. +③ 할인․할증은 경사도(1-4-5), 집단화정도(1-4-3)를 반영한다. + +### 6-2-2. 줄베기 + +| 공법 | | 사용도구 | 단위 | 소요인력 | 인력구분 | +|---|---|---|---|---|---| +| 묘목찾기 | | 낫 | 인/100본 | 0.07 | 보통인부 | +| 줄베기 | 1,500본 미만 | 예취기 | 인/ha | 1.50 | 특별인부 | +| | 1,500본 이상
3,000본 미만 | 예취기 | 인/ha | 2.00 | 특별인부 | +| | 3,000본 이상 | 예취기 | 인/ha | 2.50 | 특별인부 | + + +[주] +① 묘목찾기는 예취기 작업으로 인한 묘목의 피해를 방지하기 위하여 낫으로 묘목 주변 반경 20cm 내외의 식생을 제거하여 예취기 작업자가 조림목 위치를 파악할 수 있게 하는 작업이다. +② 묘목찾기 본수는 조림목 본수를 적용하고 조림목본수 산정은 둘레베기를 참고한다. +③ 줄베기는 낫으로 묘목찾기 실행 후 식재열을 따라 폭 1m내의 모든 식생을 예취기로 제거하는 작업이다. +④ 줄베기작업 품은 묘목찾기와 줄베기 품을 합하여 적용한다. +⑤ 묘목찾기 공정이 반영된 경우 동일한 할증률(경사도 및 집단화 정도)을 적용한다. +⑥ 할인․할증은 조림 후 경과연수(1-4-2), 집단화정도(1-4-3), 경사도(1-4-5)를 반영한다. + +### 6-2-3. 모두베기 + +| 공법 | | 사용도구 | 단위 | 소요인력 | 인력구분 | +|---|---|---|---|---|---| +| 묘목찾기 | | 낫 | 인/100본 | 0.07 | 보통인부 | +| 모두베기 | 조림 당해 연도
(전년도 추기조림 포함) | 예취기 | 인/ha | 3.50 | 특별인부 | +| | 조림 2년차 | 예취기 | 인/ha | 4.00 | 특별인부 | +| | 조림 3년차 이상 | 예취기 | 인/ha | 5.00 | 특별인부 | + + +[주] +① 묘목찾기는 예취기작업으로 인한 묘목의 피해를 방지하기 위하여 낫으로 묘목 주변 반경 20cm 내외의 식생을 제거하여 예취기 작업자가 조림목 위치를 파악할 수 있게 하는 작업이다. +② 묘목찾기 본수는 조림목 본수를 적용하고 조림목 본수 산정은 둘레베기 참고한다. +③ 모두베기는 묘목찾기 작업 실행 후 남아있는 식생을 예취기로 모두 제거하는 작업이다. +④ 수확 또는 수종갱신을 위한 벌채 후 해당년도에 식재하지 아니하는 지역은 조림경과년수 대신 벌채경과년수를 적용할 수 있다. +⑤ 모두베기작업 품은 묘목찾기와 세가지 유형 중 한 가지 유형의 모두베기 품을 합하여 적용한다. +⑥ 묘목찾기 공정이 반영된 경우 동일한 할증률(경사도 및 집단화 정도)을 적용한다. +⑦ 할인․할증은 집단화정도(1-4-3), 경사도(1-4-5)를 반영한다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제06장_생육보조/6-03_맹아제거.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제06장_생육보조/6-03_맹아제거.md index a6d1ddf2..673e2de8 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제06장_생육보조/6-03_맹아제거.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제06장_생육보조/6-03_맹아제거.md @@ -5,10 +5,24 @@ PDF쪽: 91 인쇄쪽: 79 시작표지: 6-3. 맹아제거 끝표지: 6-4. 덩굴제거 -상태: 대기 -작성: -검증: +상태: 확정 +작성: sub_laptop_2 +검증: sub_laptop_3 원천: 글자층 -기계검사: -확정지문: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 +확정지문: e93d5f33a41bc9dc94f16d151fc8cf6cf422f57509f5b1146ff4818ad04976e9 --- + +## 6-3. 맹아제거 + +| 사용도구 | 단위 | 소요인력 | 인력구성 | +|---|---|---|---| +| 괭이, 도끼 등 | 인/100본 | 0.20 | 보통인부 | + +[주] +① 맹아제거는 벌도목의 근주에서 올라오는 맹아를 괭이나 도끼 등 도구를 이용하여 벌근에서 떼어내는 작업이다. +② 맹아본수는 근주에서 올라오는 근원경 1㎝ 이상의 교목·아교목성 맹아만 적용하고 대상면적은 현장을 확인하여 구분한다. +③ 본 품은 당해연도 조림지(추기조림은 전년도) 풀베기작업에만 적용한다. +④ 본 품은 독립적으로 적용하거나 둘레베기 또는 줄베기에 중복 적용할 수 있으나 모두베기에는 중복하여 적용할 수 없다. +⑤ 백합나무 순따기 작업은 본 품을 적용한다. +⑥ 할인․할증은 집단화정도(1-4-3), 경사도(1-4-5)를 반영한다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제06장_생육보조/6-04_덩굴제거.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제06장_생육보조/6-04_덩굴제거.md index a6e6fe85..6737659b 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제06장_생육보조/6-04_덩굴제거.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제06장_생육보조/6-04_덩굴제거.md @@ -5,10 +5,101 @@ PDF쪽: 91~93 인쇄쪽: 79~81 시작표지: 6-4. 덩굴제거 끝표지: 6-5. 어린나무 가꾸기 -상태: 대기 -작성: -검증: +상태: 확정 +작성: sub_laptop_2 +검증: sub_laptop_3 원천: 글자층 -기계검사: -확정지문: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 +확정지문: c608f788558f19ad6b01c809475524b58b67ce0e8c6322dc92b7cdb62ba8cb3b --- + +## 6-4. 덩굴제거 + +> 【덩굴류제거 대상지 유형】 +> ∙ 유형1 : 풀베기 단계의 조림지 +> ∙ 유형2 : 풀베기 단계가 경과한 조림지 +> ∙ 유형3 : 휴경지, 나지, 도로사면 등 덩굴류 전면적이 피복된 지역(피복도 50% 이상) +> ∙ 유형4 : 농로, 임도변 또는 경작지와 연접부, 계곡부에서 발생한 덩굴이 큰 나무를 타고 올라가 있는 지역 + +### 6-4-1. 덩굴걷기 + +| 구분 | 사용도구 | 단위 | 소요인력 | 인력구분 | +|---|---|---|---|---| +| 기계작업 | 예취기 | 인/ha | 3.30 | 특별인부 | + +[주] +① 본 공정은 예취기로 1ha의 지상부 덩굴을 모두 제거하는 작업이다. +② 본 공정은 덩굴로 전면적이 피복된 지역(유형3)과 큰나무 피해지(유형4)에 적용한다. +③ 할인․할증은 작업시기(1-4-1), 집단화정도(1-4-3), 경사도(1-4-5), 덩굴피복도(1-4-11)를 반영한다. + +### 6-4-2. 덩굴 약제 살포처리 + +| 구분 | 사용도구 | 단위 | 소요인력 | 인력구분 | +|---|---|---|---|---| +| 약제살포 | 배부식분무기 | 인/ha | 1.00 | 특별인부 | +| 작업보조 | | 인/ha | 1.50 | 보통인부 | + +[주] +① 본 공정은 배부식분무기를 사용하여 배합된 액체형 약제를 덩굴류에 살포하는 작업임. 본 품에는 약제 배합, 살포 및 뒷정리가 포함된다. +② 본 품은 모든 덩굴류에 적용한다. +③ 할인․할증은 작업시기(1-4-1), 집단화정도(1-4-3), 경사도(1-4-5)를 반영한다. + +### 6-4-3. 소금처리 + +| 구분 | 주두부 직경 | 단위 | 소요인력 | 인력구분 | +|---|---|---|---|---| +| 소금 처리 | 2㎝ 미만 | 인/100본 | 0.20 | 보통인부 | +| | 2 ~ 6㎝미만 | 인/100본 | 0.40 | | +| | 6 ~ 8㎝미만 | 인/100본 | 0.50 | | +| | 8㎝ 이상 | 인/100본 | 0.60 | | +| 덩굴 제거지점 표시 | | 인/100본 | 0.05 | 보통인부 | + + +[주] +① 본 공정은 대상지 유형1과 유형2의 칡덩굴 분포지에만 적용한다. +② 본 공정은 칡덩굴 주두부 찾기, 주두부 자르기, 소금처리, 뒷정리와 덩굴 제거지점 표시가 포함된 품이다. +\- 주두부 찾기 : 주두부를 자를 수 있도록 주변을 정리하거나 흙을 파는 작업 +\- 주두부 자르기 : 손톱 또는 낫으로 주두부의 50% 이상을 평활하게 절단하는 작업 +\- 소금처리 : 주두부 절단면 높이로 흙을 덮고 소금을 주두부 절단면에 고루 닿도록 처리하는 작업 +\- 뒷정리 : 소금이 보이지 않도록 흙을 덮는 작업 +③ 덩굴 제거지점 표시는 상단부에 적색 페인트를 칠한 나무젓가락으로 하며 칡덩굴 주두부당 1개를 표시한다. +④ 할인․할증은 작업시기(1-4-1), 집단화정도(1-4-3), 경사도(1-4-5), 하층식생(1-4-7)를 반영한다. + +### 6-4-4. 뿌리제거 + +| 구분 | 주두부 직경 | 단위 | 소요인력 | 인력구분 | +|---|---|---|---|---| +| 뿌리 고살 | 1㎝ 미만 | 인/100본 | 0.40 | 보통인부 | +| | 1 ~ 4㎝ | 인/100본 | 0.80 | | +| | 4㎝ 초과 | 인/100본 | 1.20 | | +| 덩굴 제거지점 표시 | | 인/100본 | 0.05 | 보통인부 | + + +[주] +① 본 공정은 뿌리굴취, 글리포세이트 면봉처리, 비닐랩 밀봉에 적용한다. +② 본 공정은 대상지 유형1과 유형2의 칡덩굴 분포지에만 적용한다. +③ 본 공정은 칡덩굴을 인력으로 걷기, 주두부 찾기, 구덩이파기, 주근과 뿌리를 자르거나 굴취하여 수량 확인이 가능하도록 장소에 모아놓는 작업(뿌리굴취) 또는 주근을 자른 후 글리포세이트 면봉처리와 비닐랩 밀봉처리까지 작업을 포함함 +④ 글리포세이트 면봉처리 또는 비닐랩 밀봉처리는 직경 1㎝이상인 뿌리를 대상으로 한다. +⑤ 덩굴제거 수량은 주두부를 기준으로 함. 한 개의 주두부에 여러 개의 뿌리가 달려 있을 경우에도 수량은 한 개로 셈한다. +⑥ 당해연도에 종자로부터 발생한 칡덩굴과 당해연도 발달한 줄기에서 독립하여 발생한 칡덩굴은 주두부 직경 1㎝ 미만 적용한다. +⑦ 덩굴 제거지점 표시는 상단부에 적색 페인트를 칠한 나무젓가락으로 하며 칡덩굴 주두부당 1개 표시한다. +⑧ 덩굴 제거지점 표시는 글리포세이트 면봉처리와 비닐랩 밀봉처리의 경우만 적용하며 뿌리굴취에는 적용하지 아니한다. +⑨ 할인․할증은 작업시기(1-4-1), 집단화정도(1-4-3), 경사도(1-4-5), 하층식생(1-4-7), 토양조건(1-4-10)을 반영한다. + +> 【덩굴 피복도를 뿌리제거 본수로 환산 적용】 +> 가. 대상지 +> (1) 덩굴로 피복되어 있는 지역(유형3)과 큰나무 피해지(유형4) 중에서 뿌리제거작업이 꼭 필요한 칡덩굴 본포지역에 한하여 적용한다. +> (2) 지상부 덩굴걷기(기계작업)는 별도로 적용할 수 있다. +> 나. 환산방법 +> (1) 덩굴 피복도 조사결과를 아래 조건표에 대입하여 덩굴 본수로 환산한다. +> (2) 뿌리제거 소요인력은 유형1, 유형2의 뿌리제거와 동일하게 적용한다. +> <덩굴피복도와 덩굴본수 환산표> + +| 덩굴 피복도(%) | 할인ㆍ할증율 | 환산계수 | 덩굴본수(본/ha) | +|---|---|---|---| +| 80% 이상 | 1.50 | 1.00 | 1,600 | +| 60∼80% | 1.20 | 0.80 | 1,300 | +| 40∼60% | 1.00 | 0.67 | 1,100 | +| 20∼40% | 0.80 | 0.53 | 900 | +| 20%이하 | 0.50 | 0.33 | 500 | + diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제06장_생육보조/6-05_어린나무_가꾸기.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제06장_생육보조/6-05_어린나무_가꾸기.md index 6ee1baf7..d1882144 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제06장_생육보조/6-05_어린나무_가꾸기.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제06장_생육보조/6-05_어린나무_가꾸기.md @@ -5,10 +5,44 @@ PDF쪽: 94 인쇄쪽: 82 시작표지: 6-5. 어린나무 가꾸기 끝표지: 6-6. 가지치기 및 수형교정 -상태: 대기 -작성: -검증: +상태: 확정 +작성: sub_laptop_2 +검증: sub_laptop_3 원천: 글자층 -기계검사: -확정지문: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 +확정지문: ad86a58db9e56663ac23f1791984f933bddb07328471decaf2a1ef27cc3a84ca --- + +## 6-5. 어린나무 가꾸기 + +| 인력구분 | 대상지 유형 | 단위 | 소요인력 | 비고 | +|---|---|---|---|---| +| 특별인부
(체인톱 사용) | 치수림 단계 | 인/ha | 3.00 | | +| | 유령림 단계 | 인/ha | 4.00 | | +| 보통인부 (작업 보조) | | 인/ha | 2.00 | | + + +[주] +① 체인톱 사용인부는 제거대상목 제거 및 토막내기를 담당하고 보조인부는 제거산물을 지면으로 낮추는 작업과 재료운반 등의 업무를 담당한다. +② 사업지 내 작업자 이동이 곤란할 경우, 소작업로를 본 품에 추가하여 적용한다. +③ 사업지에 덩굴류 제거가 필요한 경우, 덩굴걷기 품을 본 품에 추가하여 적용한다. +④ 천연림보육(유령림 단계)은 유령림단계 품을 적용한다. +⑤ 할인․할증은 작업시기(1-4-1), 집단화정도(1-4-3), 경사도(1-4-5), 제거대상피복도(1-4-12)를 반영한다. + +> 【소요인력 산출】 +> 1\. 소작업로 품을 추가할 경우 공정별 소요인력(인/ha) 산출 +> 가. 치수림단계 : 특별인부 3.0인 + 보통인부 2.0인 +> 나. 유령림단계 : 특별인부 4.0인 + 보통인부 2.0인 +> 다. 소작업로설치 : 소작업로 간격 20m일 경우, ha당 소작업로 길이는 1,000m +> 1.0㎞/ha × (2.0인/1.0㎞) = 2.0인/ha = 특별인부 1.0인, 보통인부 1.0인 +> 2\. 어린나무가꾸기 + 소작업로 설치 ha당 산출인력 +> 가. 치수림단계 : 특별인부 4.0인 + 보통인부 3.0인 +> 나. 유령림단계 : 특별인부 5.0인 + 보통인부 3.0인 +> 3\. 치수림단계 어린나무가꾸기 10ha, 소작업로 설치 20m 간격, 덩굴걷기 1ha 실시하는 사업지의 소요인력 산출 +> 가. 어린나무가꾸기 산출인력 : 특별인부 3인 × 10ha = 30.0인 +> 보통인부 2인 × 10ha = 20.0인 +> 나. 20m간격 설치시 소작업로 길이는 ((100m/20m) × 100m) × 10ha = 5㎞ +> 다. 소작업로 설치 산출인력 : 특별인부 1.0인 × 5㎞ = 5.0인 +> 보통인부 1.0인 × 5㎞ = 5.0인 +> 라. 덩굴걷기 산출인력 : 특별인부 3.3인/ha +> 마. 총 산출인력은 특별인부 : 38.3인, 보통인부 25.0인 diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제06장_생육보조/6-06_가지치기_및_수형교정.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제06장_생육보조/6-06_가지치기_및_수형교정.md index c67530c8..23da1f04 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제06장_생육보조/6-06_가지치기_및_수형교정.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제06장_생육보조/6-06_가지치기_및_수형교정.md @@ -5,10 +5,39 @@ PDF쪽: 95 인쇄쪽: 83 시작표지: 6-6. 가지치기 및 수형교정 끝표지: 6-7. 토양개량 및 치환 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_2 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 6-6. 가지치기 및 수형교정 + +(인/100본당) + +| 가지치기 높이 | 소나무
낙엽송 | 잣나무,리기다
(기타침엽수) | 편백 | 활엽수 | 인력구분 | +|---|---|---|---|---|---| +| 0~0.5m | 0.1 | 0.1 | 0.2 | 0.1 | 보통인부 | +| 0.5~1m | 0.2 | 0.3 | 0.3 | 0.1 | | +| 0~1m | 0.3 | 0.4 | 0.5 | 0.2 | | +| 0~2m | 0.6 | 0.8 | 1.0 | 0.3 | | +| 0~4m | 1.4 | 1.8 | 2.2 | 0.7 | | +| 2~4m | 0.8 | 1.0 | 1.2 | 0.4 | | +| 4~6m | 1.0 | 1.2 | 1.4 | 0.5 | | + + +[주] +① 본 공정은 손톱, 고지톱 등으로 입목의 생가지와 죽은가지를 제거하는 작업으로 솎아베기, 어린나무가꾸기 공정과 합하여 적용하거나 독립적으로 적용한다. +② 가지치기 대상 구간이 본 품에 없는 경우는 중간품을 산출하여 적용한다. + +> 【소요인력 산출 예시】소나무 가지치기를 1∼3m 실시하는 경우 +> ((0.6인(0∼2m)+1.4인(0∼4m))/2)-0.3인(0∼1m) = 0.7인/100본 + +③ 활엽수 수형교정을 하는 경우에는 본 품을 적용한다. + +> 【소요인력 산출 예시】활엽수 수형교정 구간이 1∼2m 일 경우, 수형교정 품은 활엽수 가지치기 품 +> (0.3인 - 0.2인 = 0.1인/100본)을 적용 + +④ 할인․할증은 집단화정도(1-4-3), 경사도(1-4-5), 장애물의 정도(1-4-8)를 반영한다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제06장_생육보조/6-07_토양개량_및_치환.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제06장_생육보조/6-07_토양개량_및_치환.md index af8a32cf..877a79c5 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제06장_생육보조/6-07_토양개량_및_치환.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제06장_생육보조/6-07_토양개량_및_치환.md @@ -5,10 +5,56 @@ PDF쪽: 95~96 인쇄쪽: 83~84 시작표지: 6-7. 토양개량 및 치환 끝표지: 6-8. 목재칩 포설 -상태: 대기 -작성: -검증: +상태: 확정 +작성: sub_laptop_2 +검증: sub_laptop_3 원천: 글자층 -기계검사: -확정지문: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 +확정지문: e572b656c64a76b1c9d105941545bab650f4faa8417720ee74527778e4551e96 --- + +## 6-7. 토양개량 및 치환 + +### 6-7-1. 교목 시비 + +(인/10주당) + +| 구분 | 수량(근원직경 ㎝) | | | | | +|---|---|---|---|---|---| +| | 11미만 | 11∼21 미만 | 21∼31 미만 | 31∼41 미만 | 41∼51 미만 | +| 특별인부 | 0.29 | 0.37 | 0.44 | 0.51 | 0.58 | +| 보통인부 | 0.09 | 0.11 | 0.13 | 0.16 | 0.18 | + + +[주] +① 본 품은 교목의 환상시비를 기준한 품이다. +② 본 품은 터파기, 비료포설, 되메우기 작업을 포함한다. +③ 비료의 종류, 수량은 토양상태, 수종, 수세 등을 고려하여 결정한다. + +### 6-7-2. 관목 시비 + +(인/100㎡당) + +| 명칭 | 수량 | 비고 | +|---|---|---| +| 특별인부 | 0.3 | | +| 보통인부 | 0.8 | | + +[주] +① 본 품은 관목군식에 적용한다. +② 비료의 종류, 수량은 토양상태, 수종, 수세 등을 고려하여 결정한다. + +### 6-7-3. 초본류 시비 + +(10,000㎡당) + +| 명칭 | 단위 | 수량 | +|---|---|---| +| 특별인부 | 인 | 0.4 | +| 보통인부 | 인 | 1.4 | +| 트럭(2.5t) | 시간 | 2.6 | + +[주] +① 본 품은 화학비료의 살포가 300∼700㎏/10,000㎡인 때를 표준으로 한다. 다만, 현장조건, 살포조건에 따라 살포량이 다를 때는 본 품의 20% 범위 내에서 증감할 수 있다. +② 비료량은 별도 계상한다. +③ 차량진입이 불가한 지역은 기계장비를 제외하고 인력운반 품을 가산할 수 있으며, 인력품은 운반량과 평균 운반거리를 감안하여 작업량을 산정한다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제06장_생육보조/6-08_목재칩_포설.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제06장_생육보조/6-08_목재칩_포설.md index 32c50bb2..f25d9e03 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제06장_생육보조/6-08_목재칩_포설.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제06장_생육보조/6-08_목재칩_포설.md @@ -5,10 +5,24 @@ PDF쪽: 96 인쇄쪽: 84 시작표지: 6-8. 목재칩 포설 끝표지: 제7장 집재 및 운재 -상태: 대기 -작성: -검증: +상태: 확정 +작성: sub_laptop_2 +검증: sub_laptop_3 원천: 글자층 -기계검사: -확정지문: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 +확정지문: 831fcb49a6bcadcc5da18457be02811e13cc133fe8a278f1fb3d5c9145b0a50e --- + +## 6-8. 목재칩 포설 + +(㎡당) + +| 구분 | 규격 | 단위 | 수량 | +|---|---|---|---| +| 우드칩 | 분쇄목 T10cm 기준 | ㎥ | 0.11 | +| 보통인부 | - | 인 | 0.02 | +| 소운반 | L20m 리어카 기준 | Ton | 0.11 | + +[주] +① 피복(멀칭)재료는 퇴비, 짚, 분쇄목 등을 사용하며 피복두께는 10cm를 기준으로 한다. +② 토공사의 면고르기가 완료된 토공면에 수목식재와 식재면 고르기 후 피복작업을 시행한다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/0-00_장머리.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/0-00_장머리.md index a7f98cfc..b0a7a157 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/0-00_장머리.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/0-00_장머리.md @@ -5,10 +5,12 @@ PDF쪽: 97 인쇄쪽: 85 시작표지: 제7장 집재 및 운재 끝표지: 7-1. 인력집재 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_3 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +# 제7장 집재 및 운재 diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-01_인력집재.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-01_인력집재.md index b940f37b..2444e698 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-01_인력집재.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-01_인력집재.md @@ -5,10 +5,79 @@ PDF쪽: 97~98 인쇄쪽: 85~86 시작표지: 7-1. 인력집재 끝표지: 7-2. 수라집재 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_3 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 7-1. 인력집재 + +### 7-1-1. 수확 + +#### 1. 천연림 모두베기 + +| 구분 | 어려움
(15˚ 미만) | 중
(30˚ 초과) | 쉬움
(15˚~30˚) | +|---|---|---|---| +| | ㎥ | ㎥ | ㎥ | +| 100m이하 | 1.9 | 3.1 | 4.3 | +| 200m이하 | 1.4 | 2.3 | 3.3 | +| 300m이하 | 1.1 | 1.9 | 2.5 | + +[주] +ha당 원목재적 150㎥까지의 경우이며, 초과 시 “인공림 모두베기”를 적용한다. + +#### 2. 인공림 모두베기 + +| 경사 | 어려움(15˚ 미만) | | 중(30˚ 초과) | | 쉬움(15˚ ~30˚) | | +|---|---|---|---|---|---|---| +| ha당원목재적
평균거리 | 50㎥미만 | 50㎥이상 | 50㎥미만 | 50㎥이상 | 50㎥미만 | 50㎥이상 | +| | ㎥ | ㎥ | ㎥ | ㎥ | ㎥ | ㎥ | +| 100m이하 | 1.8 | 2.0 | 2.9 | 3.3 | 4.1 | 4.6 | +| 200m이하 | 1.3 | 1.5 | 2.1 | 2.4 | 3.0 | 3.4 | +| 300m이하 | 1.0 | 1.1 | 1.8 | 1.9 | 2.4 | 2.7 | + + +#### 3. 골라베기 + +| 경사 | 어려움(15˚미만) | | | 중(30˚초과) | | | 쉬움(15˚~30˚) | | | +|---|---|---|---|---|---|---|---|---|---| +| ha당원목재적
평균거리 | 15㎥
이하 | 15∼
30㎥ | 30㎥
초과 | 15㎥
미만 | 15∼
30㎥ | 30㎥
초과 | 15㎥
이하 | 15∼
30㎥ | 30㎥
초과 | +| | ㎥ | ㎥ | ㎥ | ㎥ | ㎥ | ㎥ | ㎥ | ㎥ | ㎥ | +| 100m이하 | 1.3 | 1.5 | 1.8 | 2.1 | 2.5 | 2.9 | 2.9 | 3.5 | 4.1 | +| 200m이하 | 1.0 | 1.1 | 1.8 | 1.5 | 1.8 | 2.1 | 2.1 | 2.5 | 2.9 | +| 300m이하 | 0.8 | 0.9 | 1.0 | 1.3 | 1.5 | 1.7 | 1.7 | 2.1 | 2.3 | + + + +[주] +경사도는 1개 기번 전임지의 평균경사도다. + +### 7-1-2. 숲가꾸기, 병해충방제 + +(㎥/1인, 1일) + +| 집재
거리 | 구분 | 간벌재의 직경(cm) | | | | | | | | 적용인부 | +|---|---|---|---|---|---|---|---|---|---|---| +| | | 8 | 10 | 12 | 14 | 16 | 18 | 20 | 22이상 | | +| 10m이하 | 숲가꾸기 | 2.02 | 2.84 | 3.51 | 4.08 | 4.82 | 5.81 | 6.95 | | 보통인부 | +| | 병해충방제 | 2.65 | 4.00 | 5.00 | 5.70 | 6.65 | 8.00 | 9.50 | 11.00 | | +| 20m이하 | 숲가꾸기 | 1.40 | 1.89 | 2.32 | 2.76 | 3.36 | 3.88 | 4.53 | | | +| | 병해충방제 | 1.75 | 2.50 | 3.10 | 3.65 | 4.45 | 5.00 | 5.70 | 6.35 | | +| 30m이하 | 숲가꾸기 | 1.10 | 1.49 | 1.84 | 2.27 | 2.71 | 3.06 | 3.51 | | | +| | 병해충방제 | 1.40 | 2.00 | 2.50 | 3.10 | 3.65 | 4.00 | 4.45 | 5.05 | | +| 40m이하 | 숲가꾸기 | 0.88 | 1.18 | 1.45 | 1.72 | 2.09 | 2.36 | 2.80 | | | +| | 병해충방제 | 1.15 | 1.60 | 2.00 | 2.35 | 2.85 | 3.10 | 3.65 | 4.25 | | +| 50m이하 | 숲가꾸기 | 0.74 | 0.99 | 1.22 | 1.47 | 1.76 | 1.94 | 2.30 | | | +| | 병해충방제 | 1.00 | 1.40 | 1.75 | 2.10 | 2.50 | 2.65 | 3.10 | 3.70 | | + + +[주] +① 본 품은 인력으로 원목(수간부)을 집재장까지 집재하는데 소요되는 품이며, 숲가꾸기는 간벌재 평균직경이 20㎝ 이하인 경우만 적용한다. +② 집재거리는 평균 집재거리(집재구간 최대거리의 1/2)를 적용한다. +③ 간벌재의 직경은 표준지조사 결과의 제거목 평균직경을 적용한다. +④ 산불예방 숲가꾸기 등 재해우려구역의 가지와 자투리나무 등 간벌목을 전량 수집할 경우는 제거목의 입목재적과 가지재적을 합산한 수량을 적용. 이 경우도 간벌재의 직경은 제거목 평균직경을 적용한다. +③ 할인․할증은 경사도(1-4-5), 장애물의 정도(1-4-8)를 반영한다. 다만 소나무재선충병방제 작업에만 장애물의 정도(1-4-8), 집재방향(1-4-14)을 반영한다. + diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-02_수라집재.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-02_수라집재.md index 638014e8..0f9007c3 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-02_수라집재.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-02_수라집재.md @@ -5,10 +5,32 @@ PDF쪽: 98 인쇄쪽: 86 시작표지: 7-2. 수라집재 끝표지: 7-3. 아키야윈치(임업용 윈치) 집재 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_3 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 7-2. 수라집재 + +(단위 : ㎥) + +| 집재거리 | ha당 집재재적 | | | | | 소요인력 | +|---|---|---|---|---|---|---| +| | 20이하㎥ | 21~30㎥ | 31~40㎥ | 41~50㎥ | 50초과㎥ | | +| 0~100m | 1.94 | 2.20 | 2.39 | 2.56 | 2.70 | 특별인부 | +| 0~150m | 1.64 | 1.91 | 2.12 | 2.29 | 2.45 | | +| 0~200m | 1.42 | 1.68 | 1.89 | 2.07 | 2.23 | | +| 0~250m | 1.24 | 1.50 | 1.70 | 1.88 | 2.04 | | + + +[주] +① 본 품은 설치․해체공정이 포함되었으며 산지경사가 20~65%일 경우 적용 가능하다. +② 산림병해충 및 소나무재선충병 방제 산물의 수집량은 34%를 가산하여 산출한다. + +> 【수집량 산출 예시】집재거리 200m이하, ha당 집재재적 21~30㎥인 경우 수집량 1.68㎥+(1.68㎥×34%)=2.25㎥ + +③ 할인․할증은 경사도(1-4-5), 횡단운반거리(1-4-15)를 반영한다 + diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-03_아키야윈치(임업용_윈치)_집재.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-03_아키야윈치(임업용_윈치)_집재.md index e859f2e0..f2b935c0 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-03_아키야윈치(임업용_윈치)_집재.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-03_아키야윈치(임업용_윈치)_집재.md @@ -5,10 +5,22 @@ PDF쪽: 99 인쇄쪽: 87 시작표지: 7-3. 아키야윈치(임업용 윈치) 집재 끝표지: 7-4. 소형가선 집재(2드럼 윈치) -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_3 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 7-3. 아키야윈치(임업용 윈치) 집재 + +(㎥/1대, 1일) + +| 집재거리 | 수집량 | 소요인력 | +|---|---|---| +| 50m 내외 | 8 | 2인 1조(특별인부 1인, 보통인부 1인) | + +[주] +① 집재거리는 최대거리를 적용한다. +② 할인․할증은 경사도(1-4-5), 장애물의 정도(1-4-8)를 반영하되 다만, 산림병해충방제 및 소나무재선충병방제에는 방제 대상목 평균경급(1-4-18)를 추가 반영한다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-04_소형가선_집재(2드럼_윈치).md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-04_소형가선_집재(2드럼_윈치).md index 71e3b341..d1ea0967 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-04_소형가선_집재(2드럼_윈치).md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-04_소형가선_집재(2드럼_윈치).md @@ -5,10 +5,58 @@ PDF쪽: 99~100 인쇄쪽: 87~88 시작표지: 7-4. 소형가선 집재(2드럼 윈치) 끝표지: 7-5. 트랙터부착형 집재(지면끌기) -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_3 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 7-4. 소형가선 집재(2드럼 윈치) + +### 7-4-1. 수확 + +(㎥/1대, 1일) + +| 본당재적
(㎥) | 집재거리(m) | | | | 인력구분 | +|---|---|---|---|---|---| +| | 50이하 | 51-100 | 101-150 | 151이상 | | +| 0.1 | 23.32 | 16.13 | 12.33 | 10.99 | 3인1조
(건설기계운전기사1명
특별인부1명
보통인부1명) | +| 0.2 | 36.60 | 25.47 | 19.53 | 17.42 | | +| 0.3 | 43.10 | 30.17 | 23.20 | 20.72 | | +| 0.4 | 45.83 | 32.26 | 24.89 | 22.24 | | +| 0.5 | 47.60 | 33.68 | 26.06 | 23.32 | | +| 0.6 | 51.01 | 36.28 | 28.15 | 25.22 | | +| 0.7 | 58.48 | 41.80 | 32.53 | 29.16 | | +| 0.8 | 65.69 | 47.19 | 36.82 | 33.04 | | +| 0.9 | 72.66 | 52.44 | 41.03 | 36.86 | | +| 1.0 | 79.39 | 57.57 | 45.16 | 40.61 | | + + +[주] +① 작업선까지의 횡단운반을 포함한 집재 작업 품(가선설치ㆍ해체 품이 포함)이다. +② 본당재적은 임내에 버리는 나무를 제외한 수집대상목의 본당 평균재적이다. +③ 집재량은 집재구간별 면적을 산출하여 면적비율대로 차등적용한다. +④ 임업용 동력집재기(소형가선집재형)은 2드럼케이블을 포함한다. +⑤ 할인․할증은 경사도(1-4-5), 집재방향(1-4-14), 측방집재거리(1-4-15)를 적용한다. + +### 7-4-2. 숲가꾸기, 산림병해충방제 + +(㎥/1대, 1일) + +| 구분 | 집재거리 | | | | | 소요인력 | +|---|---|---|---|---|---|---| +| | 20m이하 | 40m이하 | 60m이하 | 80m이하 | 100m이하 | | +| 집재량 | 11.19 | 10.54 | 9.95 | 9.44 | 8.96 | 3인 1조
(특별인부 1인, 보통인부 2인) | + + +[주] +① 본 품은 가선설치․해체공정이 포함하며 집재거리는 최대거리를 적용한다. +② 평균 경급이 20~26cm인 경우에는 총 소요인력의 10%를 할증한다. +③ 산림병해충 및 소나무재선충병 방제 산물의 수집량은 33%를 가산하여 산출한다. + +> 【수집량 산출 예시】집재거리 40m 이하, 경균경급이 24cm인 경우 수집량 10.54㎥+(10.54㎥×33%)=14.02㎥ + + +④ 할인․할증은 경사도(1-4-5), 장애물의 정도(1-4-8)를 반영하되, 다만, 산림병해충방제 및 소나무재선충병방제에는 방제 대상목 평균경급(1-4-18)를 추가 반영한다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-05_트랙터부착형_집재(지면끌기).md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-05_트랙터부착형_집재(지면끌기).md index 6399c4e5..0fc35579 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-05_트랙터부착형_집재(지면끌기).md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-05_트랙터부착형_집재(지면끌기).md @@ -5,10 +5,62 @@ PDF쪽: 100~101 인쇄쪽: 88~89 시작표지: 7-5. 트랙터부착형 집재(지면끌기) 끝표지: 7-6. 스윙야더 집재 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_3 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 7-5. 트랙터부착형 집재(지면끌기) + +### 7-5-1. 수확 + +(㎥/1대, 1일) + +| 본당재적
(㎥) | 집재거리(m) | | | | 인력구분 | +|---|---|---|---|---|---| +| | 30이하 | 31-50 | 51-70 | 71이상 | | +| 0.1 | 25.95 | 18.46 | 15.00 | 13.60 | 3인1조
(건설기계운전기사1명
특별인부1명
보통인부1명) | +| 0.2 | 40.63 | 29.09 | 23.70 | 21.51 | | +| 0.3 | 47.75 | 34.39 | 28.10 | 25.53 | | +| 0.4 | 50.68 | 36.71 | 30.07 | 27.35 | | +| 0.5 | 52.54 | 38.26 | 31.43 | 28.62 | | +| 0.6 | 56.20 | 41.14 | 33.88 | 30.88 | | +| 0.7 | 64.31 | 47.32 | 39.07 | 35.65 | | +| 0.8 | 72.11 | 53.33 | 44.14 | 40.31 | | +| 0.9 | 79.63 | 59.18 | 49.09 | 44.88 | | +| 1.0 | 86.88 | 64.86 | 53.93 | 49.36 | | + + +[주] +① 본당재적은 임내에 버리는 나무를 제외한 수집대상목의 본당 평균재적이다. +② 집재량은 집재구간별 면적을 산출하여 면적비율대로 차등적용한다. +③ 임업용 동력집재기(트랙터부착형)는 파미르윈치류 등을 포함한다 + +④ 할인․할증은 경사도(1-4-5), 집재방향(1-4-14)를 적용한다. + +### 7-5-2. 숲가꾸기, 병해충방제 + +(㎥/1대, 1일) + +| 집재거리 | 본당 평균재적 | | | 인력구분 | +|---|---|---|---|---| +| | 0.1∼0.2㎥ | 0.3∼0.4㎥ | 0.5㎥ 이상 | | +| 0∼40m | 20.07 | 20.69 | 21.33 | 3인 1조
(건설기계운전기사 1명,
특별인부 1명,
보통인부 1명) | +| 0∼60m | 17.61 | 18.15 | 18.71 | | +| 0∼80m | 15.45 | 15.92 | 16.42 | | +| 0∼100m | 13.55 | 13.97 | 14.40 | | +| 0∼120m | 10.96 | 11.87 | 12.78 | | + + +[주] +① 본 품은 지면끌기 방식으로 집재하는 작업에 소요되는 품으로 파르마윈치, 로깅부기, 타이푼집재기, 우드피싱집재기 등에 적용한다. +② 집재거리는 최대거리를 적용하며, 집재 재적은 소반별 ha당 평균 집재 재적(㎥)을 적용한다. +③ 본당 평균재적은 소반별 총 집재량(㎥)÷집재목 총본수(본)로 산출한다. +④ 소나무재선충병 방제 산물의 수집량은 2%를 가산하여 산출한다. + +> 【수집량 산출 예시】집재거리 70m, 본당 평균재적 0.3~0.4㎥인 경우 수집량 15.92㎥+(15.92㎥×2%)=16.03㎥ + +⑤ 할인․할증은 경사도(1-4-5), 집재방향(1-4-14)를 반영한다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-06_스윙야더_집재.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-06_스윙야더_집재.md index 1488f5ce..56afb3f4 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-06_스윙야더_집재.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-06_스윙야더_집재.md @@ -5,10 +5,24 @@ PDF쪽: 101 인쇄쪽: 89 시작표지: 7-6. 스윙야더 집재 끝표지: 7-7. HAM200 집재(춘천․스마트) -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_3 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 7-6. 스윙야더 집재 + +(㎥/1대, 1일) + +| 집재거리(m) | | 인력구분 | +|---|---|---| +| 60m 이하 | 90m 이하 | | +| 26㎥ | 17㎥ | 3인1조
(건설기계운전기사 1명
특별인부 1명, 보통인부 1명) | + + +[주] +① 작업선까지의 횡단운반을 포함한 집재 작업 품(가선설치ㆍ해체 품이 포함)이다. +② 할인․할증은 경사도(1-4-5), 집재방향(1-4-14), 측방집재거리(1-4-15)를 반영한다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-07_HAM200_집재(춘천․스마트).md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-07_HAM200_집재(춘천․스마트).md index 67a9714f..a3e80d8a 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-07_HAM200_집재(춘천․스마트).md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-07_HAM200_집재(춘천․스마트).md @@ -5,10 +5,64 @@ PDF쪽: 102~103 인쇄쪽: 90~91 시작표지: 7-7. HAM200 집재(춘천․스마트) 끝표지: 7-8. 타워야더(RME 300T) -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_3 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 7-7. HAM200 집재(춘천․스마트) + +### 7-7-1. 수확 + +(㎥/1대, 1일) + +| 본당재적
(㎥) | 집재거리(m) | | | | 인력구분 | +|---|---|---|---|---|---| +| | 50이하 | 51-100 | 101-150 | 151이상 | | +| 0.1 | 23.32 | 16.13 | 12.33 | 10.99 | 3인1조
(건설기계
운전기사1명
특별인부1명
보통인부1명) | +| 0.2 | 36.60 | 25.47 | 19.53 | 17.42 | | +| 0.3 | 43.10 | 30.17 | 23.20 | 20.72 | | +| 0.4 | 45.83 | 32.26 | 24.89 | 22.24 | | +| 0.5 | 47.60 | 33.68 | 26.06 | 23.32 | | +| 0.6 | 51.01 | 36.28 | 28.15 | 25.22 | | +| 0.7 | 58.48 | 41.80 | 32.53 | 29.16 | | +| 0.8 | 65.69 | 47.19 | 36.82 | 33.04 | | +| 0.9 | 72.66 | 52.44 | 41.03 | 36.86 | | +| 1.0 | 79.39 | 57.57 | 45.16 | 40.61 | | + + +[주] +① HAM200, 춘천집재기, 스마트집재기 등에 적용한다. +② 작업선까지의 횡단운반을 포함한 집재 작업 품(가선설치ㆍ해체 품이 포함)이다. +③ 본당재적은 임내에 버리는 나무를 제외한 수집대상목의 본당 평균재적이다. +④ 집재량은 집재구간별 면적을 산출하여 면적비율대로 차등적용한다. +⑤ 할인․할증은 경사도(1-4-5), 집재방향(1-4-14), 측방집재거리(1-4-15)를 반영한다. + +### 7-7-2. 숲가꾸기, 병해충방제 + +(㎥/1대, 1일) + +| 집재재적
(㎥/ha) | 집재거리 | | | 소요인력 | +|---|---|---|---|---| +| | 100m 이하 | 150m 이하 | 200m 이하 | | +| 0∼20㎥ | 11.55 | 10.30 | 9.51 | 3인 1조
(건설기계운전기사 1명,
특별인부 1명,
보통인부 1명) | +| 21∼40㎥ | 13.11 | 11.49 | 10.53 | | +| 41∼60㎥ | 13.59 | 11.87 | 10.86 | | +| 61∼80㎥ | 13.83 | 12.06 | 11.02 | | +| 81∼100㎥ | 13.97 | 12.17 | 11.12 | | + + +[주] +① 본 품은 소형 가선을 설치하고 집재하는 작업에 소요되는 품으로 HAM200, 스마트집재기, 멀티집재기 등에 적용한다. +② 본 품은 가선설치·해체공정과 작업선까지의 횡단운반(측방집재)을 포함한 품이다. +③ 집재재적은 소반별 ha당 평균 집재 재적(㎥)을 적용한다. +④ 집재거리는 최대거리를 적용한다. +⑤ 대상면적은 가선설치길이 200m, 측방집재거리 25m(좌우 50m)를 기준으로 1ha로 산정한다. +⑥ 소나무재선충병 방제 산물의 수집량은 27%를 가산하여 산출한다. + +> 【수집량 산출 예시】ha당 집재재적 41~60㎥, 집재거리 150m이하인 경우 수집량 11.87㎥+(11.87㎥×27%)=15.07㎥ + +⑦ 할인․할증은 경사도(1-4-5), 집재방향(1-4-14), 측방집재거리(1-4-15)를 반영한다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-08_타워야더(RME_300T).md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-08_타워야더(RME_300T).md index b800d836..f409b056 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-08_타워야더(RME_300T).md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-08_타워야더(RME_300T).md @@ -5,10 +5,65 @@ PDF쪽: 103~104 인쇄쪽: 91~92 시작표지: 7-8. 타워야더(RME 300T) 끝표지: 7-9. 부착형 타워(K-301, HAM300) 집재 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_3 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 7-8. 타워야더(RME 300T) + +### 7-8-1. 가선설치 + +(조) + +| 집재방식 | 작업로(가선)의 길이 | | | | | | 소요인력 | +|---|---|---|---|---|---|---|---| +| | 120m
이하 | 160m
이하 | 200m
이하 | 240m
이하 | 280m
이하 | 280m
초과 | | +| 상향집재 | 0.6 | 0.6 | 0.8 | 0.9 | 0.9 | 1.1 | 3인 1조
(특별인부 2명
보통인부 1명) | +| 하향집재 | 0.7 | 0.8 | 0.9 | 1.1 | 1.1 | 1.4 | | + + +[주] +소요인력은 가선 1회당(노선별) 설치 소요인력이다. + +### 7-8-2. 가선해체 + +(조) + +| 집재방식 | 작업로(가선)의 길이 | | | | | | 소요인력 | +|---|---|---|---|---|---|---|---| +| | 120m
이하 | 160m
이하 | 200m
이하 | 240m
이하 | 280m
이하 | 280m
초과 | | +| 상향집재 | 0.3 | 0.3 | 0.4 | 0.5 | 0.5 | 0.6 | 3인 1조
(특별인부 2명
보통인부 1명) | +| 하향집재 | 0.4 | 0.4 | 0.5 | 0.6 | 0.6 | 0.7 | | + + +[주] +소요인력은 가선 1회당(노선별) 해체 소요인력이다. + +### 7-8-3. 집재 소요인력 + +(㎥/1대, 일) + +| 본당재적
(㎥) | 집재거리(m) | | | | 인력구분 | +|---|---|---|---|---|---| +| | 100m이하 | 150m이하 | 200m이하 | 250m이하 | | +| 0.1 | 19.20 | 17.45 | 16.00 | 14.77 | 4인1조
(건설기계
운전기사1명
특별인부2명
보통인부1명) | +| 0.2 | 30.24 | 27.53 | 25.26 | 23.34 | | +| 0.3 | 35.72 | 32.57 | 29.92 | 27.68 | | +| 0.4 | 38.11 | 34.79 | 32.00 | 29.63 | | +| 0.5 | 39.70 | 36.29 | 33.42 | 30.97 | | +| 0.6 | 42.67 | 39.05 | 36.00 | 33.39 | | +| 0.7 | 49.05 | 44.95 | 41.48 | 38.51 | | +| 0.8 | 55.25 | 50.69 | 46.83 | 43.51 | | +| 0.9 | 61.28 | 56.29 | 52.05 | 48.40 | | +| 1.0 | 67.13 | 61.74 | 57.14 | 53.19 | | + + +[주] +① 작업선까지의 횡단운반을 포함한 집재 작업 품이다. +② 본당재적은 임내에 버리는 나무를 제외한 수집 대상목의 본당 평균재적이다. +③ 집재량은 집재구간별 면적을 산출하여 면적비율대로 차등 적용한다. +④ 할인․할증은 경사도(1-4-5), 집재방향(1-4-14), 측방집재거리(1-4-15)를 반영한다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-09_부착형_타워(K-301,_HAM300)_집재.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-09_부착형_타워(K-301,_HAM300)_집재.md index f1d2dde6..b9f2e62f 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-09_부착형_타워(K-301,_HAM300)_집재.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-09_부착형_타워(K-301,_HAM300)_집재.md @@ -5,10 +5,67 @@ PDF쪽: 104~105 인쇄쪽: 92~93 시작표지: 7-9. 부착형 타워(K-301, HAM300) 집재 끝표지: 7-10. 굴착기 우드그랩 산지집재-병해충방제 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_3 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 7-9. 부착형 타워(K-301, HAM300) 집재 + +### 7-9-1. 수확 + +(㎥/1대, 일) + +| 집재재적
(㎥/ha) | 집재거리 | | | | 소요인력 | +|---|---|---|---|---|---| +| | 100m 이하 | 150m 이하 | 200m 이하 | 250m 이하 | | +| 0~20㎥ | 18.76 | 17.53 | 17.11 | 16.70 | 4인1조
(건설기계운전기사 1명
특별인부 2명
보통인부 1명) | +| 21~40㎥ | 25.37 | 23.16 | 22.44 | 21.74 | | +| 41~60㎥ | 28.75 | 25.95 | 25.04 | 24.17 | | +| 61~80㎥ | 30.80 | 27.60 | 26.58 | 25.60 | | +| 81~100㎥ | 32.18 | 28.70 | 27.60 | 26.54 | | + + +[주] +① 작업선까지의 횡단운반을 포함한 집재 작업 품(가선설치ㆍ해체 품이 포함)이다. +② 1일 작업시간 8시간을 기준한 것이며, 1회 집재재적은 0.48㎥을 기준으로 한다. +③ 할인․할증은 경사도(1-4-5), 집재방향(1-4-14), 측방집재거리(1-4-15)를 반영한다. + +### 7-9-2. 숲가꾸기, 소나무재선충병방제 + +(㎥/1대, 일) + +| 집재재적
(㎥/ha) | 집재거리 | | | | 소요인력 | +|---|---|---|---|---|---| +| | 100m 이하 | 150m 이하 | 200m 이하 | 250m 이하 | | +| 0~20㎥ | 17.14 | 16.02 | 14.66 | 13.54 | 4인1조
(건설기계운전기사 1명
특별인부 2명
보통인부 1명) | +| 21~40㎥ | 20.56 | 19.18 | 17.53 | 16.17 | | +| 41~60㎥ | 22.09 | 20.60 | 18.82 | 17.37 | | +| 61~80㎥ | 22.96 | 21.40 | 19.55 | 18.05 | | +| 81~100㎥ | 23.51 | 21.91 | 20.02 | 18.48 | | + + +[주] +① 숲가꾸기 및 소나무재선충병방제에 적용한다. +② 작업선까지의 횡단운반을 포함한 집재 작업 품이다. 집재 재적은 소반별 ha당 평균 집재 재적(㎥)을 적용하며, 집재거리는 최대거리를 적용한다. +③ 대상 면적은 산출 시 가선설치길이 200m, 측방집재거리 25m(좌우 50m)를 기준으로 작업면적을 1.0ha 이상으로 산정한다. +④ 소나무재선충병 방제 산물의 수집량에 대하여는 아래 비율(%)을 가산하여 산출한다. + +> 【수집량 산출 예시】노선별 집재재적 41~60㎥, 집재거리 200m인 경우 수집량 18.82㎥+(18.82㎥×34%)=25.03㎥ + +(단위 : %) + +| 노선별
집재재적(㎥/ha) | 집재거리 | | | | +|---|---|---|---|---| +| | 100m 이하 | 150m 이하 | 200m 이하 | 250m 이하 | +| 0~20㎥ | 17 | 19 | 23 | 27 | +| 21~40㎥ | 23 | 25 | 30 | 34 | +| 41~60㎥ | 26 | 28 | 33 | 37 | +| 61~80㎥ | 27 | 30 | 35 | 39 | +| 81~100㎥ | 28 | 31 | 36 | 40 | + + +⑤ 할인․할증은 경사도(1-4-5), 집재방향(1-4-14), 측방집재거리(1-4-15)를 반영한다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-10_굴착기_우드그랩_산지집재-병해충방제.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-10_굴착기_우드그랩_산지집재-병해충방제.md index ffea6c5b..0dbdf566 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-10_굴착기_우드그랩_산지집재-병해충방제.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-10_굴착기_우드그랩_산지집재-병해충방제.md @@ -5,10 +5,28 @@ PDF쪽: 106 인쇄쪽: 94 시작표지: 7-10. 굴착기 우드그랩 산지집재-병해충방제 끝표지: 7-11. 동력상하차기(우드그래플) 집재-수확 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_3 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 7-10. 굴착기 우드그랩 산지집재-병해충방제 + +(단위 : ㎥) + +| 구분 | ha당 평균 작업량 | | | 적용인부 | +|---|---|---|---|---| +| | 20㎥ 미만 | 20∼40㎥ | 40㎥ 초과 | | +| 작업량 | 27.49 | 33.77 | 40.89 | 건설기계운전기사 1명
보통인부 1인 | + + +[주] +① 원목의 직경(말구 평균직경)을 ha당 작업량으로 변환한 것이다. +② 원목의 길이별 산술평균값 적용한다. +③ 단목베기를 완료한 원목을 산지에서 높은 곳에서 낮은 곳으로 이동하며 집적하는 공정으로, 집재거리 40m를 기준으로 한다. +④ 보통인부는 굴착기 작업방해물을 제거하는 작업 품이다. +⑤ 횡단경사 40% 이하에 적용하며, 굴착기 이동거리는 50m를 초과할 수 없다. +⑥ 할인․할증은 경사도(1-4-5), 주행노면의 상태(1-4-13)를 반영한다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-11_동력상하차기(우드그래플)_집재-수확.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-11_동력상하차기(우드그래플)_집재-수확.md index 02ef2bc9..8040bd0c 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-11_동력상하차기(우드그래플)_집재-수확.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-11_동력상하차기(우드그래플)_집재-수확.md @@ -5,10 +5,56 @@ PDF쪽: 106~107 인쇄쪽: 94~95 시작표지: 7-11. 동력상하차기(우드그래플) 집재-수확 끝표지: 7-12. 동력상하차기(우드그래플) 집적 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_3 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 7-11. 동력상하차기(우드그래플) 집재-수확 + +(㎥/1대, 1일) + +| 집재
재적
(㎥/ha) | 최대집재거리 : 40m 이하 | | | | | 소요
인력 | +|---|---|---|---|---|---|---| +| | 원목의 길이 | | | | | | +| | 1.2m | 1.8m | 2.1m | 2.7m | 3.6m | | +| 41∼60 | 22.03 | 29.13 | 32.09 | 37.11 | 39.98 | 건설기계
운전기사
1인 | +| 61∼80 | 24.17 | 32.47 | 35.99 | 42.09 | 45.65 | | +| 81이상 | 25.68 | 34.89 | 38.87 | 45.85 | 49.97 | | + + +| 집재
재적
(㎥/ha) | 최대집재거리 : 80m 이하 | | | | | 소요
인력 | +|---|---|---|---|---|---|---| +| | 원목의 길이 | | | | | | +| | 1.2m | 1.8m | 2.1m | 2.7m | 3.6m | | +| 41∼60 | 16.22 | 22.10 | 24.65 | 29.13 | 31.78 | 건설기계
운전기사
1인 | +| 61∼80 | 17.38 | 24.01 | 26.94 | 32.19 | 35.36 | | +| 81이상 | 18.16 | 25.34 | 28.56 | 34.40 | 37.96 | | + + +[주] +① 임업용 굴착기(우드그래플)이 임내를 주행하여 산물을 수집하는 산지 경사도는 15°∼25° 이하의 벌채지 집재 작업량이다. +② 본 품에는 벌채지의 재해방지 및 산불예방을 위한 산물정리비가 반영된 것으로 본다. +③ 잔존목 본 수가 100본 이상 130본 이하(잔존목간 거리 10~8.8m)인 경우 10%, 71본 이상 100본 미만(잔존목간 거리 12~10m)인 경우 5%를 할증한다. +④ 할인․할증은 경사도(1-4-5), 주행 장애물 상태(1-4-13)를 반영한다. + +(대/ton) + +| 구분 | 소요인력 | | +|---|---|---| +| 원목집재와 동시에 부산물
수집시 | 0.03 | 건설기계
운전기사 1인 | + +[주] +① 부산물 동시수집은 벌채 산물 중 원목 규격에 못 미치거나 수집이 어려워 이용이 원활하지 않은 산물을 수집하여 에너지용 등으로 활용하기 위함으로, 우드그래플의 원목 수집과 동시에 부산물을 소운반이 가능하도록 임도ㆍ작업로변까지 집재하는 공정을 말한다. +② 우드그래플을 이용한 부산물 동시수집 시 가산품의 적용기준은 ha당 부산물(미이용 산림바이오매스) 산출중량을 기준으로 한다. +③ 0.03대/ton 소요인력을 기준으로 ha당 부산물(미이용 산림바이오매스) 산출중량에 따라 산출중량을 곱하여 우드그래플 집재 품에 가산하여 적용한다. + +> 【산출 예시】부산물이 35톤/ha 경우 : 0.03대/ton × 35톤/ha +> 1.05인을 임업용 굴착기(우드그래플) 원목집재 소요인력에 가산하여 적용한다 + + +④ 토질, 하층식생, 돌, 도랑, 커브길, 구배 등으로 주행이 매우 힘들 경우 10%, 다소 힘들 경우 5%를 할증한다. +⑤ 잔존목 본 수가 100본 이상 130본 이하(잔존목간 거리 10~8.8m)인 경우 10%, 71본 이상 100본 미만(잔존목간 거리 12~10m)인 경우 5%를 할증한다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-12_동력상하차기(우드그래플)_집적.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-12_동력상하차기(우드그래플)_집적.md index 7dab46b8..491bce4d 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-12_동력상하차기(우드그래플)_집적.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-12_동력상하차기(우드그래플)_집적.md @@ -5,10 +5,35 @@ PDF쪽: 107~108 인쇄쪽: 95~96 시작표지: 7-12. 동력상하차기(우드그래플) 집적 끝표지: 7-13. 검척 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_3 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 7-12. 동력상하차기(우드그래플) 집적 + +(㎥/1대, 1일) + +| 원목(생산재)
의 길이 | 원목의 직경(말구 평균직경) | | | | | | 소요인력 | +|---|---|---|---|---|---|---|---| +| | 9㎝ 이하 | 10∼15㎝ | 16∼20㎝ | 21∼25㎝ | 26∼30㎝ | 30㎝초과 | | +| 1.8m | 25.39 | 28.21 | 31.35 | 34.48 | 37.93 | 41.73 | 1인 1조
(건설기계
운전기사 1명) | +| 2.1m | 27.17 | 30.19 | 33.55 | 36.89 | 40.59 | 44.65 | | +| 2.7m | 29.42 | 32.63 | 36.32 | 39.94 | 43.94 | 48.33 | | +| 3.6m | 33.44 | 37.16 | 41.29 | 45.41 | 49.96 | 54.95 | | + + +[주] +① 집재장(임도변 포함), 중토장에서 굴착기를 이용한 원목을 집적하거나, 생산재를 품등별로 구분하여 쌓아놓는 품이며. 굴삭기 우드그랩 집적작업을 말한다. + +② 원목(생산재)의 길이는 1.8m, 2.1m, 2.7m, 3.6m를 기준으로 하되, 장재는 응용하여 적용한다. +③ 검척하지 아니하는 원목은 생산재 평균직경을 적용한다. +④ 소나무재선충병방제 산물의 집적량은 77%를 가산하여 산출한다. + +> 【수집량 산출 예시】원목의 직경 26~30㎝, 원목의 길이 2.7m인 경우 집재량 43.94㎥+(43.94㎥×77%)=77.77㎥ + +⑤ 품은 임업용 굴착기(우드그래플)를 기준으로 한다. +⑥ 생산재를 중량으로 매각하고 생산과 동시에 반출하는 경우는 집적작업을 생략할 수 있다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-13_검척.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-13_검척.md index 3118e932..150071fa 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-13_검척.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-13_검척.md @@ -5,10 +5,42 @@ PDF쪽: 108 인쇄쪽: 96 시작표지: 7-13. 검척 끝표지: 7-14. 원목 운반-수확 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_3 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 7-13. 검척 + +| 구분 | 소요인력(인/100㎥당) | 인력구분 | +|---|---|---| +| 생산목 검척 | 0.67 | 초급기술자 | + +[주] +① 검척은 초급기술자 2인 1조로 1일 300㎥ 검척을 기준으로 하고, 보드재와 같이 중량매각을 하는 경우에는 검척을 생략할 수 있다. +② 1ha당 150㎥ 생산을 기준으로 하여 소요인력 적용하고 추후 정산한다. +③ 평균 말구직경이 12cm 미만인 경우 30%, 12cm 이상 16cm 미만인 경우 15%, 24cm 이상 28cm 미만인 경우 -15%, 28cm 이상인 경우 -30%를 할인․할증한다. +④ 평균경급은 경급별 조사개수에 따라 가중치 평균법으로 산출하여 적용한다. +⑤ 층적 측정으로 원목 생산량을 산출하는 경우는 검척 품의 10% 적용한다. + +> 【검척조사서의 평균 말구직경 산출예시】 + +| 재장 | 말구직경 | 낙엽송(개수) | 경급×개수 | +|---|---|---|---| +| 2.1m | 6 | 2 | 12 | +| | 8 | 11 | 88 | +| | 10 | 33 | 330 | +| | 12 | 350 | 4,200 | +| | 14 | 200 | 2,800 | +| | 16 | 100 | 1,600 | +| | 18 | 261 | 4,698 | +| | 20 | 153 | 3,060 | +| | 22 | 66 | 1,452 | +| | 합계 | 1,176 | 18,240 | + + +> ∙ 평균 말구직경 = (말구직경×개수)의 합계 ÷ 조사개수 합 = 18,240 ÷ 1,176 = 15.51cm +> ∙ 산출된 평균 말구직경은 15.51cm로 12cm이상∼16cm미만의 범위이므로 적용 할인ㆍ할증률은 +15%임 diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-14_원목_운반-수확.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-14_원목_운반-수확.md index 2dd6735e..d1d7420d 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-14_원목_운반-수확.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-14_원목_운반-수확.md @@ -5,10 +5,29 @@ PDF쪽: 109 인쇄쪽: 97 시작표지: 7-14. 원목 운반-수확 끝표지: 7-15. 초소형 포워더 운재 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_3 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 7-14. 원목 운반-수확 + +| 종별 | 공정 | | | | | | | +|---|---|---|---|---|---|---|---| +| | 1회 적재량 | | | | | 1인 1일공정 | | +| | 용재 (원목) | | 신재
(활잡) | 목탄 | 운반 | 상하차 | | +| | 침엽수
(포플러과
포함) | 활엽수
(포플러과
제외) | | | | 침 | 활 | +| | ㎥ | ㎥ | ㎥ | kg | 연km | ㎥ | ㎥ | +| 저나르기 | 0.06∼0.07 | 0.05 | 0.05 | 40∼60 | 16∼24 | | | +| 트럭 | 4.8∼6.0 | 4.0∼6.0 | 4.0∼5.0 | 3,000∼4,000 | | 5 | 4 | +| 집재 | | | | | 3∼5㎥ | | | +| 뗏목 | | | | | 20∼30㎥ | | | +| 토장 집재 | | | | | 5∼10㎥ | | | + + +[주] +수라집재의 경우 ‘숲가꾸기 설계·감리 및 시행지침’의 품셈을 사용할 수 있다 + diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-15_초소형_포워더_운재.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-15_초소형_포워더_운재.md index 28100d1d..b2dfddf7 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-15_초소형_포워더_운재.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-15_초소형_포워더_운재.md @@ -5,10 +5,52 @@ PDF쪽: 109~110 인쇄쪽: 97~98 시작표지: 7-15. 초소형 포워더 운재 끝표지: 7-16. 소형 포워더 운재 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_3 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 7-15. 초소형 포워더 운재 + +### 7-15-1. 수확 + +(㎥/1대, 1일) + +| 구분 | 주행거리(m이하) | | | | | | | | | | | 인력구분 | +|---|---|---|---|---|---|---|---|---|---|---|---|---| +| | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | 1000 | 1200 | | +| 회수 | 10.4 | 9.97 | 9.51 | 9.06 | 8.60 | 8.14 | 7.69 | 7.22 | 6.77 | 6.31 | 5.85 | 건설기계
운전기사1명 | +| 운반량 | 33.78 | 32.3 | 30.82 | 29.34 | 27.86 | 26.38 | 24.90 | 23.42 | 21.94 | 20.46 | 18.98 | | + + +[주] +① 초소형 포워더는 3.0톤 미만의 장비에 적용하고, 주행거리는 최대거리를 적용한다. +② 초소형 포워더 운재 공정량은 자체 부착 크레인(임내차 등)을 활용한 상차시간을 포함하며, 임업용굴착기(우드그래플)를 이용한 별도 집적의 경우 우드그래플 집적 품셈을 별도로 계상한다. +③ 할인․할증은 주행 장애물 상태(1-4-13)를 반영한다. + +### 7-15-2 숲가꾸기, 병해충방제 + + +(㎥/1대, 1일) + +| 구분 | 운반거리(㎞ 이하) | | | | | | | | | | 인력구분 | +|---|---|---|---|---|---|---|---|---|---|---|---| +| | 0.5 | 1.0 | 1.5 | 2.0 | 2.5 | 3.0 | 3.5 | 4.0 | 4.5 | 5.0 | | +| 작업회수 | 8.6 | 6.3 | 5.0 | 4.1 | 3.5 | 3.1 | 2.7 | 2.4 | 2.2 | 2.0 | 건설기계운전기사
1인 | +| 운재량 | 27.86 | 20.46 | 16.17 | 13.37 | 11.39 | 9.93 | 8.79 | 7.89 | 7.16 | 6.55 | | + + +[주] +① 운재량은 3.0톤 미만의 소형 포워더 1대가 1일 실행하는 작업량이다. +② 운재작업에 모로오카 무한궤도형 임내차나 소형 덤프트럭을 사용하고자 할 경우에는 7-15-1를 적용하되 50% 감하여 적용. 즉, 주행거리별 운재량 × 0.5로 운재품 산출. 단, 모로오카 무한궤도형 임내차는 ‘소형 포워더 운재(7-16)’, 소형 덤프트럭은 ‘소형트럭 운재(7-17)’ 적용하고 소요재료와 기계손료도 동일하게 적용한다. + +> 【소요인력 산출 예시】(산출예시) 운반거리 500m, 운재량 30㎥인 경우, 운재 소요인력 +> \- 소형 포워더(3.0톤 미만) : 30㎥ ÷ 27.86㎥/인 = 1.08인 +> \- 모로오카 임내차(3.0톤∼10.0톤) : (30㎥ ÷ (94.48㎥×0.5)/인) = 0.64인 +> \- 소형 덤프트럭(2.5톤이하) : (30㎥ ÷ (32.00㎥×0.5)/인) = 1.88인 + +⑤ 할인․할증은 주행 장애물상태(1-4-13)를 반영한다. + diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-16_소형_포워더_운재.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-16_소형_포워더_운재.md index 19e5b0d5..8fad3b02 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-16_소형_포워더_운재.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-16_소형_포워더_운재.md @@ -5,10 +5,26 @@ PDF쪽: 110 인쇄쪽: 98 시작표지: 7-16. 소형 포워더 운재 끝표지: 7-17. 소형트럭 운재 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_3 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 7-16. 소형 포워더 운재 + +(㎥/1대, 1일) + +| 구분 | 주행거리(m이하) | | | | | | | | | | | 인력구분 | +|---|---|---|---|---|---|---|---|---|---|---|---|---| +| | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | 1000 | 1200 | | +| 회수 | 22.97 | 19.20 | 16.50 | 14.46 | 12.87 | 11.60 | 10.55 | 9.68 | 8.94 | 8.31 | 7.28 | 건설기계
운전기사
1명 | +| 운반량 | 168.59 | 140.95 | 121.10 | 106.15 | 94.48 | 85.13 | 77.46 | 71.06 | 65.63 | 60.98 | 53.40 | | + + +[주] +① 주행거리는 최대거리를 적용한다. +② 적용장비는 소형 포워더(3.0톤 이상~10.0톤 미만)를 기준으로 한다. +③ 할인․할증은 주행 장애물 상태(1-4-13)를 반영한다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-17_소형트럭_운재.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-17_소형트럭_운재.md index ac8191d3..47f72c73 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-17_소형트럭_운재.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-17_소형트럭_운재.md @@ -5,10 +5,26 @@ PDF쪽: 110 인쇄쪽: 98 시작표지: 7-17. 소형트럭 운재 끝표지: 7-18. 지조운반(포워더 활용) -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_3 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 7-17. 소형트럭 운재 + +(㎥/1대, 1일) + +| 구분 | 운반거리(m이하) | | | | | | | | | | 인력구분 | +|---|---|---|---|---|---|---|---|---|---|---|---| +| | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | 1000 | | +| 회수 | 23.8 | 20.5 | 18.0 | 16.1 | 14.5 | 13.3 | 12.2 | 11.3 | 10.5 | 9.8 | 건설기계
운전기사
1명 | +| 운반량 | 52.28 | 45.13 | 39.70 | 35.44 | 32.00 | 29.17 | 26.80 | 24.79 | 23.06 | 21.55 | | + + +[주] +① 소형트럭 운재는 단목의 경우만 적용하고, 임업용 굴착기 상차, 자체 하차 기준이다. +② 소형트럭은 2.5톤 이하의 운반차량을 포함한다. +③ 할인․할증은 주행 장애물 상태(1-4-13)를 반영한다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-18_지조운반(포워더_활용).md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-18_지조운반(포워더_활용).md index c8d0bac1..54b846cc 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-18_지조운반(포워더_활용).md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제07장_집재_및_운재/7-18_지조운반(포워더_활용).md @@ -5,10 +5,28 @@ PDF쪽: 111 인쇄쪽: 99 시작표지: 7-18. 지조운반(포워더 활용) 끝표지: 제8장 방제 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_3 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 7-18. 지조운반(포워더 활용) + +(㎥/1대, 1일) + +| 구분 | 운반거리(m이하) | | | | | | | | | | 인력구분 | +|---|---|---|---|---|---|---|---|---|---|---|---| +| | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | 1000 | | +| 회수 | 22.9 | 17.1 | 13.7 | 11.4 | 9.8 | 8.6 | 7.6 | 6.9 | 6.2 | 5.7 | 건설기계
운전기사
1명 | +| 운반량 | 91.4 | 68.6 | 54.9 | 45.7 | 39.2 | 34.3 | 30.5 | 27.4 | 24.9 | 22.8 | | + + +[주] +① 주행속도 : 공주행 2km/시간, 적재주행 1km/시간 기준이다. +② 1회 운반량 4㎥ 기준으로 하며, 적용장비는 초소형 포워더를 기준으로 한다. +③ 소요재료 및 기계손료는 소형 포워더운재와 동일하게 적용한다. +③ 할인․할증은 주행 장애물 상태(1-4-13)를 반영한다. + diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제09장_토공/0-00_장머리.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제09장_토공/0-00_장머리.md index 5b419afc..efb78951 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제09장_토공/0-00_장머리.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제09장_토공/0-00_장머리.md @@ -5,10 +5,12 @@ PDF쪽: 133 인쇄쪽: 121 시작표지: 제9장 토공 끝표지: 9-1. 굴착 -상태: 대기 -작성: +상태: 검증대기 +작성: main_desktop_1 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +# 제9장 토공 diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제09장_토공/9-01_굴착.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제09장_토공/9-01_굴착.md index a7b3a544..d1105c2d 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제09장_토공/9-01_굴착.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제09장_토공/9-01_굴착.md @@ -5,10 +5,18 @@ PDF쪽: 133 인쇄쪽: 121 시작표지: 9-1. 굴착 끝표지: 9-2. 노선 굴진 보조원 -상태: 대기 -작성: +상태: 검증대기 +작성: main_desktop_1 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 9-1. 굴착 + +1\. 굴착작업은 작업조건, 굴착량 등에 따라 기계굴착과 인력굴착의 공사비를 비교 검토하여 적정 선정하여야 한다. + +2\. 공사비 비교 시 기계굴착이 비경제적인 협소지역이나 넓은 지역이라도 굴착기계를 투입할 수 없는 특수한 여건의 지역은 인력으로 설계할 수 있다. + +3\. 인력굴착의 경우 굴착기계를 투입시공할 수 없는 협소한 지역으로 원지반으로부터 깊이 20㎝ 이상의 굴착은 터파기로 보고, 그 외의 경우는 절취로 본다. 발파의 경우, 절취와 터파기 개념도 이에 준한다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제09장_토공/9-02_노선_굴진_보조원.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제09장_토공/9-02_노선_굴진_보조원.md index 7b0edbce..56b7a58f 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제09장_토공/9-02_노선_굴진_보조원.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제09장_토공/9-02_노선_굴진_보조원.md @@ -5,10 +5,20 @@ PDF쪽: 133 인쇄쪽: 121 시작표지: 9-2. 노선 굴진 보조원 끝표지: 9-3. 토사깍기 -상태: 대기 -작성: +상태: 검증대기 +작성: main_desktop_1 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 9-2. 노선 굴진 보조원 + +1\. 건설기계운전사의 시야에서 확인하기 어려운 위험요소를 파악하여, 작업 통제를 보조할 인력으로 암반의 분포, 용출수, 지장목, 절토부 붕괴 등 위험요소를 파악하고 전파하는 역할을 수행한다. + +2\. 임도 굴진 작업 시 적용한다. + +| 구분 | 횡단경사 60% 미만 | 횡단경사 60% 이상 | +|---|---|---| +| 특별인부 | 5인/km | 10인/km | diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제09장_토공/9-03_토사깍기.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제09장_토공/9-03_토사깍기.md index 73405c46..4782a1ae 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제09장_토공/9-03_토사깍기.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제09장_토공/9-03_토사깍기.md @@ -5,10 +5,49 @@ PDF쪽: 133~134 인쇄쪽: 121~122 시작표지: 9-3. 토사깍기 끝표지: 9-4. 암절취 -상태: 대기 -작성: +상태: 검증대기 +작성: main_desktop_1 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 9-3. 토사깍기 + +### 9-3-1. 인력 + +(단위: ㎥당) + +| 종류
직종 | 보통토사 | 경질토사, 고사점토
및 자갈섞인 점토 | 호박돌 섞인
토사 | 비고 | +|---|---|---|---|---| +| 보통인부(인) | 0.16 | 0.22 | 0.39 | 대량일 때는 토질조사에
의하여 분류할 것 | + + +[주] +① 본 품은 자연상태를 기준으로 한 것이다. +② 절취한 흙을 던질 때는 수평으로 3m, 수직으로 2m를 기준으로 한다. 따라서 평거리 3m 이상은 2단 던지기 또는 운반으로 계상해야 한다. +③ 작업시간에 제한을 받는 유조하천 등에 있어서는 실정에 따라 계상할 수 있다. +④ 화강암 풍화토(진사)에 대하여는 현지실정에 따라 별도 계상할 수 있다. + +### 9-3-2. 기계 + +| 구분 | 적용 | 비고 | +|---|---|---| +| K | 0.9 | | +| f | 1/1.30 | | +| E | 0.55∼0.45 | | +| ㎝(sec) | 20(135°) | | + +[주] +① 장비는 무한궤도 굴착기(0.7㎥)를 적용한다. +② Q=3600×q×k×f×E/㎝= ㎥/hr +\- 여기서 Q : 시간당 작업량(㎥/hr) +\- q : 버킷용량(㎥) +\- f : 체적환산계수 +\- E : 작업효율 +\- K : 버킷계수 +\- ㎝: 1회 싸이클 시간(초) +③ 작업효율(E)은 자연상태의 토질(사질토+점성토)이고 현장조건이 불량(공간협소, 추락위험)한 조건을 적용한다. +④ 체적환산계수는 f=1/L=1/1.30=0.77 적용한다. +⑤ 소규모공사(10,000㎥미만, 0.4㎥적용)이나 암절취 깎기를 고려하여 0.7㎥ 적용한다.(동일장소에 2가지 이상의 유사 건설기계를 사용하는 것은 비효율적임) diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제09장_토공/9-04_암절취.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제09장_토공/9-04_암절취.md index d83330d9..07f44f2f 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제09장_토공/9-04_암절취.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제09장_토공/9-04_암절취.md @@ -5,10 +5,38 @@ PDF쪽: 134 인쇄쪽: 122 시작표지: 9-4. 암절취 끝표지: 9-5. 발파암 -상태: 대기 -작성: +상태: 검증대기 +작성: main_desktop_1 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 9-4. 암절취 + +### 9-4-1. 암파쇄 + +| 적용기계 | 암의 종류 | 작업능력(㎥/hr) | 치즐소모량(본/hr) | 비고 | +|---|---|---|---|---| +| 대형브레이커+
유압식백호우
(무한궤도,0.7㎥) | 연암 | 5.0 | 0.006 | | +| | 보통암 | 3.4 | 0.02 | | +| | 경암 | 2.6 | 0.03 | | + + +[주] +① Q(시간당 작업량 ㎥/hr) =(5.0+3.4+2.6)/3= ㎥/시간 +② 적용토질은 현장여건을 감안하여 비율을 달리 할 수 있다. + +### 9-4-2. 집토 + +| 구분 | 적용 | 비고 | +|---|---|---| +| K | 0.55 | | +| f | 1/1.40 | | +| E | 0.35 | | +| ㎝(sec) | 20(135°) | | + +[주] +① 장비는 무한궤도 굴착기(0.7㎥)를 적용한다. +② Q=3600×q×k×f×E/㎝= ㎥/시간, 암질에 따라 적용한다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제09장_토공/9-05_발파암.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제09장_토공/9-05_발파암.md index df61ae08..87adcc0c 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제09장_토공/9-05_발파암.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제09장_토공/9-05_발파암.md @@ -5,10 +5,53 @@ PDF쪽: 135 인쇄쪽: 123 시작표지: 9-5. 발파암 끝표지: 9-6. 발파암 소할 -상태: 대기 -작성: +상태: 검증대기 +작성: main_desktop_1 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 9-5. 발파암 + +### 9-5-1. 육상, 암석 절취(발파 10%) + +(단위: ㎥당) + +| 구분 | | 규격 | 단위 | 수량 | 비고 | +|---|---|---|---|---|---| +| 자재 | 폭약 | | kg | 0.35 | 잡재료비:주재료의 5% | +| | 뇌관 | | 개 | 1.0 | | +| | 비트 | | 개 | 0.008 | | +| 인력 | 화약공 | | 인 | 0.041 | | +| | 착암공 | | 인 | 0.041 | | +| | 보통인부 | | 인 | 0.103 | | +| 장비 | 착암기 | 2.7㎥/min | hr | 0.203 | | +| | 공기압축기 | 10.3㎥/min | hr | 0.074 | | + + +### 9-5-2. 깎기(90%) + +| 암의 종류 | 작업능력(㎥/hr) | 치즐소모량(본/hr) | 비고 | +|---|---|---|---| +| 연암 | 5.0 | 0.006 | | +| 보통암 | 3.4 | 0.02 | | +| 경암 | 2.6 | 0.03 | | + +[주] +장비는 대형브레이커와 무한궤도 굴착기(0.7㎥)를 적용한다. + +### 9-5-3. 집토 + +| 구분 | 적용 | 비고 | +|---|---|---| +| K | 0.55 | | +| f | 1/1.625 | | +| E | 0.35 | | +| ㎝(sec) | 20(135°) | | + +[주] +① 장비는 무한궤도 굴착기(0.7㎥)를 적용한다. +② Q=3600×q×k×f×E/㎝= ㎥/시간 +③ 발파구간의 평균 횡단경사 80% 이상으로 굴진을 위한 발파시 인건비의 20%를 가산한다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제09장_토공/9-06_발파암_소할.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제09장_토공/9-06_발파암_소할.md index 02c61221..481364a3 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제09장_토공/9-06_발파암_소할.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제09장_토공/9-06_발파암_소할.md @@ -5,10 +5,29 @@ PDF쪽: 136 인쇄쪽: 124 시작표지: 9-6. 발파암 소할 끝표지: 9-7. 무근콘크리트 깨기 -상태: 대기 -작성: +상태: 검증대기 +작성: main_desktop_1 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 9-6. 발파암 소할 + +### 9-6-1. 기계소할(15%) + +(단위: ㎥당) + +| 적용기계 | 작업능력(㎥/hr) | 치즐소모량(본/hr) | +|---|---|---| +| 대형브레이커+유압식백호우
(무한궤도,0.7㎥) | 10.0
(9+11)/2 | 0.025 | + +[주] +① Q=(9+11)/2=10㎥/시간 +② Q1=10×0.15 +\- 여기서 Q : 시간당 작업량(㎥/hr) +\- Q1 : 소할 적용 작업량(㎥) +③ 발파된 암을 노체 재료로 사용하거나 적재하기 위해 일정한 크기 이하로 파쇄하기 위한 비용으로 물량의 15% 범위 내에서 별도 가산할 수 있다. + +※ 「건설공사 표준품셈 공통부문, 3-3-6 암발파(대규모발파 TVPE-Ⅵ) [주]⑦, ⑧(2025)」 참조 diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/0-00_장머리.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/0-00_장머리.md index c16f5cc7..ec411b49 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/0-00_장머리.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/0-00_장머리.md @@ -5,10 +5,12 @@ PDF쪽: 192 인쇄쪽: 180 시작표지: 제13장 구조물 끝표지: 13-1. 석재 및 골재의 분류 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_1 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +# 제13장 구조물 diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-01_석재_및_골재의_분류.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-01_석재_및_골재의_분류.md index 2555ffa2..16bcd096 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-01_석재_및_골재의_분류.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-01_석재_및_골재의_분류.md @@ -5,10 +5,14 @@ PDF쪽: 192 인쇄쪽: 180 시작표지: 13-1. 석재 및 골재의 분류 끝표지: 13-2. 채집 및 세척 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_1 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 13-1. 석재 및 골재의 분류 + +제1장 적용기준, 1-2-3. 토질, 2. 토질 및 암의 분류를 참조한다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-02_채집_및_세척.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-02_채집_및_세척.md index c127b3c8..ebb643ea 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-02_채집_및_세척.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-02_채집_및_세척.md @@ -5,10 +5,85 @@ PDF쪽: 192~193 인쇄쪽: 180~181 시작표지: 13-2. 채집 및 세척 끝표지: 13-3. 기초다짐 및 뒷채움 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_1 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 13-2. 채집 및 세척 + +### 13-2-1. 모래, 자갈, 약돌 채집 + +(단위: 인/㎥당) + +| 명칭 | 친모래 | 자갈 | 자갈 | 조약돌 | 막자갈 | 비고 | +|---|---|---|---|---|---|---| +| 규격 | | 25mm까지 | 40mm까지 | 150mm내외 | | | +| 보통인부(인) | 0.5 | 1.44 | 1.0 | 0.6 | 0.3 | | + +[주] +① 석산 및 골재원에서 골재채집은 품질, 양, 거리 등을 고려하고, 경제성을 비교 검토하여 작업방법(기계 또는 인력채집)을 결정한다. +② 기계채집 시 기계경비는 별도 계상하며 선별기 보조원은 보통인부(2∼3인/대당) 품을 계상할 수 있다. +③ 인력채집 시는 다음 품을 적용한다. +④ 석재 세척 시 유해물질의 함유한도를 초과할 경우에는 보통인부 0.2인을 할증할 수 있다. + +### 13-2-2. 막돌 채집 + +(단위: ㎥당) + +| 구분 | | 막돌 | 비고 | +|---|---|---|---| +| 보통인부 | ㎡당 | 0.17 | 현지의 조건에 따라 전석의 소할(小割)을
필요로 할 경우에는 ㎥당 할석공
0.2인을 할증한다. | +| | ㎥당 | 0.64 | | + + +### 13-2-3. 큰돌 채집 + +(단위: 100개당) + +| 명칭 | 규격 | 단위 | 수량 | 비고 | +|---|---|---|---|---| +| 작업반장 | | 인 | 2.6 | | +| 굴착기 | 굴착기 유압식
(평적 0.6㎥) | 시간
(h) | 13.4 | 굴삭 · 석재 채취 기계 | +| 집게 장치 | 1m 급 | 시간
(h) | 13.4 | 큰돌 선별 · 짐싣는 기계
(스톤그랩) | + +| (회전식 돌집게)
굴착기 운전 | 굴착기 유압식
(평적 0.6㎥) | | | | +| 제 잡비 비율 | | % | 6 | | + + +[주] +① 본 품은 굴삭, 채취, 짐싣기, 세척, 선별작업을 포함한다. +② 본 품은 큰돌(직경 40㎝이상~100㎝이하, 뒷길이 60~120㎝)을 기계로 현지 채취하는 경우에 적용하며 돌 규격에 따른 뒷길이 기준은 다음과 같다. + +| 명칭 | 단위 | 규격(직경) | | | +|---|---|---|---|---| +| | | 40㎝이상∼60㎝미만 | 60㎝이상∼80㎝미만 | 80㎝이상∼100㎝이하 | +| 뒷길이 | ㎝ | 60 ~ 75 | 75 ~ 95 | 95 ~ 120 | + + +③ 돌의 구입 운반에서 돌의 공극률은 23%를 적용한다. +④ 임도에서는 직경 60㎝ 이상의 큰돌의 사용은 가급적 최소화한다. +⑤ 제잡비는 고압세척기 손료, 전력에 관계되는 경비 등의 비용으로, 노무비의 합계액에 위 품의 비율을 곱한 금액을 상한으로 계상한다. +⑥ 기계에 의한 파쇄작업이나 화약류에 의한 발파작업이 필요한 경우는 별도 계상한다. +⑦ 채취에 따른 20m 정도의 소운반을 포함하지만, 운반거리가 20m를 초과시는 운반비를 별도 계상한다. +⑧ 굴착기 부착용 회전식 돌집게는 실거래가격을 적용하고, 양 날개의 티스 소모 경비율은 0.002(소모율) × 개당가격 × 6(티스갯수) 일반굴착기를 적용한다. +⑨ 큰돌 채집시 작업의 난이도를 감안하여 큰돌 규격별로 적용을 다르게 한다(40㎝이상~60㎝미만 본품의 75%, 60㎝이상~80㎝미만은 본품의 100%, 80㎝이상~100㎝이하는 본품의 125%를 적용한다). +⑩ 공사 시 발생하는 큰 돌에 대해서는 본 품의 50%를 적용한다. +⑪ 0.2㎥ 또는 0.4㎥ 용량의 굴착기를 사용하는 경우에는「건설공사 표준품셈 공통부문, 8-2-3 굴착기(2025)」를 참조하여 적용계수를 달리 적용하도록 한다. + +### 13-2-4. 야면석 채집(인력) + +(단위: 인 당) + +| 뒷길이(㎝) | | 25 | 35 | 45 | 55 | 60 | +|---|---|---|---|---|---|---| +| 인부 | ㎡당 | 0.11 | 0.17 | 0.22 | 0.28 | 0.36 | +| | ㎥당 | 0.60 | 0.64 | 0.67 | 0.70 | 0.80 | + + +[주] +① 복원사업지의 특성상 전석의 소할(小割)을 필요로 할 경우에는 ㎥당 할석공 0.2인을 할증한다. +② 기계화 시공이 가능한 지역은 상기 품을 적용하지 않는다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-03_기초다짐_및_뒷채움.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-03_기초다짐_및_뒷채움.md index 1aa234b4..ca94190a 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-03_기초다짐_및_뒷채움.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-03_기초다짐_및_뒷채움.md @@ -5,10 +5,43 @@ PDF쪽: 194 인쇄쪽: 182 시작표지: 13-3. 기초다짐 및 뒷채움 끝표지: 13-4. 돌쌓기 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_1 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 13-3. 기초다짐 및 뒷채움 + +### 13-3-1. 인력 + +(단위: ㎥당) + +| 종별 | 보통인부(인) | 비고 | +|---|---|---| +| 모래 기초다짐 | | | +| 두께 3㎝ | 0.5 | 10㎡당 0.15인 | +| 두께 6㎝ | 0.4 | 10㎡당 0.24인 | +| 자갈 기초다짐 지름 1~3㎝ | 0.5 | | +| 조약돌 기초다짐 지름 9~15㎝ | 0.5-0.7 | | +| 돌쌓기 뒤채움 지름 9~15㎝ | 0.5-0.8 | | + +[주] +본 품에는 소운반 및 고르기가 포함되어 있다. + +### 13-3-2. 기계 + +(단위: ㎥당) + +| 종별 | 규격 | 보통인부 | 굴착기(0.2㎥) | 살수차(5,500ℓ) | 플레이트콤팩트
(1.54ton) | +|---|---|---|---|---|---| +| | (mm) | (인) | (hr) | (hr) | (hr) | +| 기초다짐
뒷채움 | 75미만 | 0.019 | 0.076 | 0.019 | 0.115 | +| | 75이상 | 0.022 | 0.087 | 0.022 | 0.132 | + + +[주] +① 본 품에는 소운반 및 고르기가 포함되어 있다. +② 투입장비는 작업여건에 따라 조합하여 적용할 수 있다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-04_돌쌓기.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-04_돌쌓기.md index 95527a59..ea4da94b 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-04_돌쌓기.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-04_돌쌓기.md @@ -5,10 +5,221 @@ PDF쪽: 195~199 인쇄쪽: 183~187 시작표지: 13-4. 돌쌓기 끝표지: 13-5. 돌붙임 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_1 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 13-4. 돌쌓기 + +### 13-4-1. 메쌓기(인력) + +(단위: 인/㎡당) + +| 뒷길이
(㎝) | 견치돌 | | | | 깬돌 | | | | 깬잡석 | | | | 호박돌 및
야면석 | | +|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---| +| | 골쌓기 | | 켜쌓기 | | 골쌓기 | | 켜쌓기 | | 골쌓기 | | 켜쌓기 | | | | +| | 석공
(인) | 보통인부
(인) | 석공
(인) | 보통인부
(인) | 석공
(인) | 보통인부
(인) | 석공
(인) | 보통인부
(인) | 석공
(인) | 보통인부
(인) | 석공
(인) | 보통인부
(인) | 석공
(인) | 보통인부
(인) | +| 25 | - | - | - | - | - | - | - | - | 0.15 | 0.12 | 0.13 | 0.10 | 0.10 | 0.10 | +| 30 | - | - | - | - | 0.26 | 0.21 | 0.23 | 0.18 | 0.22 | 0.18 | 0.20 | 0.16 | 0.13 | 0.11 | +| 35 | 0.50 | 0.40 | 0.55 | 0.44 | 0.30 | 0.24 | 0.27 | 0.22 | 0.25 | 0.20 | 0.23 | 0.18 | 0.16 | 0.14 | +| 45 | 0.60 | 0.48 | 0.66 | 0.53 | 0.36 | 0.29 | 0.32 | 0.25 | 0.30 | 0.24 | 0.27 | 0.22 | 0.24 | 0.21 | +| 55 | 0.72 | 0.58 | 0.80 | 0.64 | 0.43 | 0.34 | 0.39 | 0.31 | 0.36 | 0.29 | 0.33 | 0.26 | 0.32 | 0.29 | +| 60 | 0.86 | 0.69 | 0.95 | 0.76 | 0.52 | 0.42 | 0.47 | 0.37 | 0.43 | 0.34 | 0.39 | 0.31 | 0.37 | 0.33 | +| 75 | - | - | - | - | 0.68 | 0.54 | 0.61 | 0.49 | 0.56 | 0.45 | 0.51 | 0.41 | - | - | + + +[주] +① 본 품에는 기초 및 뒤채움 품이 포함되지 않았으며 고임돌품은 포함되어 있다. +② 본 품에는 비계 및 규준틀 손료가 포함되어 있다. +③ 본 품은 높이 3m까지 적용하며 이를 초과할 때에는 다음 표에 따라 품을 계상할 수 있다. +④ 뒤채움 품(조약돌)은 ‘13-3. 기초다짐 및 뒤채움’ 항을 적용한다. + +<높이에 대한 증가율표> + +| 높이(m) | 3 ∼ 4까지 | 4 ∼ 5.5까지 | 5.5∼7.5까지 | 7.5초과 | +|---|---|---|---|---| +| 증가율(%) | 30 | 40 | 60 | 80 ∼ 100 | + +<돌쌓기의 개수 및 중량의 표준> + +(단위: ㎡당) + +| 종별
뒷길이 | 단위 | 견치돌 | 깬돌 및 깬잡석 | 야면석 | +|---|---|---|---|---| +| 25㎝(17×17) | 개 | 32 | 33 | - | +| | ㎏ | 192 | 132 | - | +| 30㎝(20×20) | 개 | 23 | 24 | 28 | +| | ㎏ | 368 | 264 | 420 | +| 35㎝(25×25) | 개 | 16 | 17 | 23 | +| | ㎏ | 480 | 340 | 575 | +| 45㎝(30×30) | 개 | 11 | 12 | 16 | +| | ㎏ | 627 | 480 | 880 | +| 55㎝(35×35) | 개 | 8 | 9 | 11 | +| | ㎏ | 752 | 504 | 1,100 | +| 60㎝(40×40) | 개 | 6 | 6 | - | +| | ㎏ | 822 | 540 | - | +| 75㎝(50×50) | 개 | 4 | 4 | - | +| | ㎏ | 1,028 | 560 | - | + + +[주] +본 기준은 인력 돌쌓기 및 돌붙임에 적용한다. + +### 13-4-2. 메쌓기(장비) + +(단위: ㎡당) + +| 명칭 | 규격 | 단위 | 수량(뒷길이) | | | +|---|---|---|---|---|---| +| | | | 35cm 이하 | 55cm 이하 | 75cm 이하 | +| 석공 | | 인 | 0.10 | 0.09 | 0.08 | +| 보통인부 | | 〃 | 0.05 | 0.04 | 0.03 | +| 굴착기+
부착용 집게 | 0.6㎥ | 시간 | 0.39 | 0.37 | 0.35 | + + +[주] +① 본 품은 기계화시공이 가능한 사업지에 대해서 이 품을 적용한다. +② 본 품은 잡석을 채움재로 사용하는 깬돌 및 깬 잡석의 돌쌓기 기준이다. +③ 경사도가 1:1보다 급한 경우이며, 높이 3m 이하 기준이다. +④ 규준틀 설치, 돌쌓기, 잡석 채움, 배수 파이프 설치 작업을 포함한다. +⑤ 뒤채움 품(조약돌)은 12-3. 기초다짐 및 뒤채움을 적용한다. + +⑥ 굴착기 규격은 작업 여건(작업 범위, 위치 등)에 따라 변경할 수 있다. +⑦ 재료량은 설계수량을 적용한다 + + +### 13-4-3. 고임돌 소요량 + +(단위: ㎥/㎡당) + +| 뒷길이
종별 | 25㎝ | 30㎝ | 35㎝ | 45㎝ | 55㎝ | 60㎝ | 75㎝ | +|---|---|---|---|---|---|---|---| +| 야면석(㎥) | 0.06 | 0.07 | 0.09 | 0.11 | 0.14 | 0.15 | - | +| 깬잡석(㎥) | 0.09 | 0.11 | 0.13 | 0.16 | 0.19 | 0.21 | 0.26 | +| 깬돌(㎥) | - | 0.10 | 0.12 | 0.15 | 0.18 | 0.20 | 0.25 | +| 견치돌(㎥) | - | - | 0.12 | 0.15 | 0.18 | 0.20 | 0.25 | + + +### 13-4-4. 찰쌓기(인력) + +(단위: 인/㎡당) + +| 뒷길이
(㎝) | 견치돌 | | | | 깬돌 | | | | 깬잡석 | | | | 호박돌 및
야면석 | | +|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---| +| | 골쌓기 | | 켜쌓기 | | 골쌓기 | | 켜쌓기 | | 골쌓기 | | 켜쌓기 | | | | +| | 석공
(인) | 보통인부
(인) | 석공
(인) | 보통인부
(인) | 석공
(인) | 보통인부
(인) | 석공
(인) | 보통인부
(인) | 석공
(인) | 보통인부
(인) | 석공
(인) | 보통인부
(인) | 석공
(인) | 보통인부
(인) | +| 25 | - | - | - | - | - | - | - | - | 0.12 | 0.12 | 0.10 | 0.10 | 0.08 | 0.10 | +| 30 | - | - | - | - | 0.21 | 0.21 | 0.18 | 0.18 | 0.18 | 0.18 | 0.16 | 0.16 | 0.09 | 0.11 | +| 35 | 0.40 | 0.40 | 0.44 | 0.44 | 0.24 | 0.24 | 0.22 | 0.22 | 0.20 | 0.20 | 0.18 | 0.18 | 0.11 | 0.14 | +| 45 | 0.48 | 0.48 | 0.53 | 0.53 | 0.29 | 0.29 | 0.25 | 0.25 | 0.24 | 0.24 | 0.22 | 0.22 | 0.17 | 0.21 | +| 55 | 0.58 | 0.58 | 0.58 | 0.64 | 0.34 | 0.34 | 0.31 | 0.31 | 0.29 | 0.29 | 0.26 | 0.26 | 0.23 | 0.29 | +| 60 | 0.69 | 0.69 | 0.69 | 0.76 | 0.42 | 0.42 | 0.37 | 0.37 | 0.34 | 0.34 | 0.31 | 0.31 | 0.26 | 0.33 | +| 75 | - | - | - | - | 0.54 | 0.54 | 0.49 | 0.49 | 0.45 | 0.45 | 0.41 | 0.41 | - | - | + + +[주] +① 찰쌓기용 콘크리트 소요량은 아래와 같이 계상한다. + +<찰쌓기 및 찰붙임의 채움 콘크리트 소요량> + +(단위: ㎥/㎡당) + +| 뒷길이
종별 | 25㎝ | 30㎝ | 35㎝ | 45㎝ | 55㎝ | 60㎝ | 75㎝ | 비고 | +|---|---|---|---|---|---|---|---|---| +| 야면석(㎥) | 0.08 | 0.10 | 0.12 | 0.15 | 0.18 | 0.20 | 0.25 | 뒷길이
33.3% | +| 호박돌(㎥) | 0.08 | 0.10 | 0.12 | 0.15 | 0.18 | 0.20 | 0.25 | 〃 | +| 깬잡석(㎥) | 0.11 | 0.14 | 0.16 | 0.20 | 0.25 | 0.27 | 0.34 | 뒷길이
45% | +| 깬돌(㎥) | 0.11 | 0.14 | 0.16 | 0.20 | 0.25 | 0.27 | 0.34 | 〃 | +| 견치돌(㎥) | 0.11 | 0.14 | 0.16 | 0.20 | 0.25 | 0.27 | 0.34 | 〃 | + + +② 돌쌓기의 기초(조약돌, 콘크리트, 말뚝(杭)은 지반 상태에 따라 별도로 계상할 수 있다. +③ 뒤채움 품(조약돌)은 “기초다짐 및 뒤채움” 항을 적용한다. +④ 줄눈메꿈 모르타르는 0.009㎥를 계상한다. +⑤ 2~3㎡당 1개소 이상의 물구멍을 설치한다. +⑥ 경사도가 1:1보다 완만한 경우를 돌붙임이라 하고 경사도가 1:1보다 급한 경우를 돌쌓기라고 한다. +⑦ 물구멍은 지름 3~6㎝의 파이프를 콘크리트 뒷면까지 설치한다. +⑧ 돌쌓기의 밑돌은 될 수록 큰 돌을 사용하여야 한다. +⑨ 성토의 경우 뒤채움 조약돌의 두께 + +| 직고(直高) | ∼1.5m | ∼3.0m | ∼5.0m | ∼7.0m | +|---|---|---|---|---| +| 상부의 두께(㎝) | 20~40 | 20~40 | 20~40 | 20~40 | +| 하부의 두께(㎝) | 30~60 | 45~75 | 60~100 | 80~140 | + +\- 절토의 경우(다져진 상태) 뒤채움 조약돌의 두께는 상·하부의 두께를 같이 30∼40㎝로 한다. +\- 직고는 천단으로부터 기준 한다. + +⑩ 뒷길이 표준 + +| 높이단위
공종별 | 돌쌓기 높이(m) | | | | | 돌붙이기 | +|---|---|---|---|---|---|---| +| | ∼1.5 | ∼3 | ∼5 | ∼7 | 7이상 | | +| 메쌓기(㎝) | 25~35 | 36~45 | 36~60 | 45~75 | 75이상 | 25~60 | +| 찰쌓기(㎝) | 25~35 | 30~35 | 35~45 | 35~55 | 45~60 | 20~40 | + + +\- 높은 메쌓기는 밑으로 내려갈수록 뒷길이를 길게 하는 것이 원칙이다. +\- 높이는 첨단으로부터 기준 한다. +\- 특수한 조건에서는 본 기준과 달리 적용할 수 있다. + +⑪ 돌쌓기의 표준경사는 특수한 경우를 제외하고는 쌓기 높이의 최대치를 취하고 표준 뒷길이 상부에서부터 적용한다. + +<표준경사> + +| 직고(直高)(m) | | ∼1.5 | ∼3 | ∼5 | ∼7 | 7이상 | +|---|---|---|---|---|---|---| +| 메쌓기 | 성토 | 1:0.30 | 1:0.35 | 1:0.40 | 1:0.45 | 1:0.50 | +| | 절토 | 1:0.25 | 1:0.30 | 1:0.35 | 1:0.40 | 1:0.45 | +| 찰쌓기 | 성토 | 1:0.25 | 1:0.30 | 1:0.35 | 1:0.40 | 1:0.45 | +| | 절토 | 1:0.20 | 1:0.25 | 1:0.30 | 1:0.35 | 1:0.40 | + + +\- 돌쌓기는 높이 3m 이상이면 전부 또는 하부를 찰쌓기로 한다. +\- 특수한 조건에는 본 기준을 변경할 수 있다. + +※ 예 : 쌓기높이 6m의 경우 + +![쌓기높이 6m 의 돌쌓기 예 — 메쌓기(성토) · 메쌓기(절토) · 높이별 뒷길이 · 찰쌓기(성토) 단면](pic/13-04_1.png) + + +### 13-4-5. 찰쌓기(장비) + +(단위: ㎡당) + +| 명칭 | 규격 | 단위 | 수량(뒷길이) | | | +|---|---|---|---|---|---| +| | | | 35cm 이하 | 55cm 이하 | 75cm 이하 | +| 석공 | | 인 | 0.09 | 0.08 | 0.07 | +| 보통인부 | | 〃 | 0.05 | 0.04 | 0.03 | +| 굴착기+부착용 집게 | 0.6㎥ | 시간 | 0.31 | 0.30 | 0.28 | + + +[주] +① 본품은 기계화시공이 가능한 사업지에 대해서 이 품을 적용한다. +② 본 품은 콘크리트를 채움재로 사용하는 깬돌 및 깬 잡석의 돌쌓기 기준이다. +③ 경사도가 1:1보다 급한 경우이며, 높이 3m 이하 기준이다. +④ 규준틀 설치, 돌쌓기, 콘크리트 채움, 배수 파이프 설치, 줄눈 메꿈 작업을 포함한다. +⑤ 뒤채움 품(조약돌)은 “13-3. 기초다짐 및 뒤채움”항을 적용한다. +⑥ 굴착기 규격은 작업 여건(작업 범위, 위치 등)에 따라 변경할 수 있다. +⑦ 찰쌓기용 콘크리트 소요량은 13-4-3. [주]①를 적용한다. +⑧ 재료량은 설계수량을 적용한다. + +### 13-4-6. 밑돌 및 천단 돌쌓기 + +(단위: 인/m당) + +| 돌의 뒷길이 | 석공(인) | 비고 | +|---|---|---| +| 25㎝ | 0.05 | | +| 30㎝ | 0.08 | | +| 35㎝ | 0.09 | | + +[주] +① 본 품은 돌쌓기 기초, 천단돌쌓기 작업에서 석공이 돌을 다듬어 면을 맞추어 쌓는 경우에 적용한다. +② 돌쌓기 작업시 밑돌과 천단돌을 오각으로 면을 고르게 쌓을 경우 돌 뒷길이에 따른 석공품을 가산한다. +③ 돌쌓기의 높이는 3m 이하에 적용한다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-05_돌붙임.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-05_돌붙임.md index 21f92670..b71f0ee5 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-05_돌붙임.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-05_돌붙임.md @@ -5,8 +5,8 @@ PDF쪽: 199~200 인쇄쪽: 187~188 시작표지: 13-5. 돌붙임 끝표지: 13-6. 큰돌쌓기 -상태: 대기 -작성: +상태: 작성중 +작성: sub_laptop_1 검증: 원천: 글자층 기계검사: diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-06_큰돌쌓기.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-06_큰돌쌓기.md index a7fd9f66..7a527379 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-06_큰돌쌓기.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-06_큰돌쌓기.md @@ -5,8 +5,8 @@ PDF쪽: 201~202 인쇄쪽: 189~190 시작표지: 13-6. 큰돌쌓기 끝표지: 13-7. 큰돌붙이기 -상태: 대기 -작성: +상태: 작성중 +작성: sub_laptop_1 검증: 원천: 글자층 기계검사: diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-07_큰돌붙이기.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-07_큰돌붙이기.md index 15147c5e..d653876c 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-07_큰돌붙이기.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-07_큰돌붙이기.md @@ -5,8 +5,8 @@ PDF쪽: 203~204 인쇄쪽: 191~192 시작표지: 13-7. 큰돌붙이기 끝표지: 13-8. 막돌쌓기 -상태: 대기 -작성: +상태: 작성중 +작성: sub_laptop_1 검증: 원천: 글자층 기계검사: diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-08_막돌쌓기.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-08_막돌쌓기.md index f5918d54..37b3fc20 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-08_막돌쌓기.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-08_막돌쌓기.md @@ -5,8 +5,8 @@ PDF쪽: 204 인쇄쪽: 192 시작표지: 13-8. 막돌쌓기 끝표지: 13-9. 서식지 조성 돌쌓기 및 놓기 -상태: 대기 -작성: +상태: 작성중 +작성: sub_laptop_1 검증: 원천: 글자층 기계검사: diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-09_서식지_조성_돌쌓기_및_놓기.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-09_서식지_조성_돌쌓기_및_놓기.md index e0ff189b..7f5c8007 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-09_서식지_조성_돌쌓기_및_놓기.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-09_서식지_조성_돌쌓기_및_놓기.md @@ -5,8 +5,8 @@ PDF쪽: 204 인쇄쪽: 192 시작표지: 13-9. 서식지 조성 돌쌓기 및 놓기 끝표지: 13-10. 말뚝박기공 -상태: 대기 -작성: +상태: 작성중 +작성: sub_laptop_1 검증: 원천: 글자층 기계검사: diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-10_말뚝박기공.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-10_말뚝박기공.md index c0cbe632..e5ba4fcc 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-10_말뚝박기공.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-10_말뚝박기공.md @@ -5,8 +5,8 @@ PDF쪽: 205~207 인쇄쪽: 193~195 시작표지: 13-10. 말뚝박기공 끝표지: 13-11. 돌망태 -상태: 대기 -작성: +상태: 작성중 +작성: sub_laptop_1 검증: 원천: 글자층 기계검사: diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-11_돌망태.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-11_돌망태.md index 276d6a2c..e5a04116 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-11_돌망태.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-11_돌망태.md @@ -5,8 +5,8 @@ PDF쪽: 208~210 인쇄쪽: 196~198 시작표지: 13-11. 돌망태 끝표지: 13-12. 비탈다듬기 -상태: 대기 -작성: +상태: 작성중 +작성: sub_laptop_1 검증: 원천: 글자층 기계검사: diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-12_비탈다듬기.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-12_비탈다듬기.md index f2fdd6f8..b736b5a5 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-12_비탈다듬기.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-12_비탈다듬기.md @@ -5,8 +5,8 @@ PDF쪽: 210~211 인쇄쪽: 198~199 시작표지: 13-12. 비탈다듬기 끝표지: 13-13. 흙막이 -상태: 대기 -작성: +상태: 작성중 +작성: sub_laptop_1 검증: 원천: 글자층 기계검사: diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-13_흙막이.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-13_흙막이.md index 9591c608..eaf1d3a7 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-13_흙막이.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-13_흙막이.md @@ -5,8 +5,8 @@ PDF쪽: 211~212 인쇄쪽: 199~200 시작표지: 13-13. 흙막이 끝표지: 13-14. 식생토낭 및 포트 -상태: 대기 -작성: +상태: 작성중 +작성: sub_laptop_1 검증: 원천: 글자층 기계검사: diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-14_식생토낭_및_포트.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-14_식생토낭_및_포트.md index b3430e00..c1a6db9c 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-14_식생토낭_및_포트.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-14_식생토낭_및_포트.md @@ -5,8 +5,8 @@ PDF쪽: 212~213 인쇄쪽: 200~201 시작표지: 13-14. 식생토낭 및 포트 끝표지: 13-15. 목재공 -상태: 대기 -작성: +상태: 작성중 +작성: sub_laptop_1 검증: 원천: 글자층 기계검사: diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-15_목재공.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-15_목재공.md index ba9e7dd8..dd720680 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-15_목재공.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-15_목재공.md @@ -5,8 +5,8 @@ PDF쪽: 213~214 인쇄쪽: 201~202 시작표지: 13-15. 목재공 끝표지: 13-16. 매트부설 -상태: 대기 -작성: +상태: 작성중 +작성: sub_laptop_1 검증: 원천: 글자층 기계검사: diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-16_매트부설.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-16_매트부설.md index 92b0c896..7fb7f081 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-16_매트부설.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-16_매트부설.md @@ -5,8 +5,8 @@ PDF쪽: 214 인쇄쪽: 202 시작표지: 13-16. 매트부설 끝표지: 제14장 부대공 -상태: 대기 -작성: +상태: 작성중 +작성: sub_laptop_1 검증: 원천: 글자층 기계검사: diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/pic/13-04_1.png b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/pic/13-04_1.png new file mode 100644 index 00000000..ee1eec70 Binary files /dev/null and b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/pic/13-04_1.png differ diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제14장_부대공/0-00_장머리.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제14장_부대공/0-00_장머리.md index fcd20402..d11ee1d5 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제14장_부대공/0-00_장머리.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제14장_부대공/0-00_장머리.md @@ -5,10 +5,12 @@ PDF쪽: 215 인쇄쪽: 203 시작표지: 제14장 부대공 끝표지: 14-1. 입목뿌리 밑막이 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_1 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +# 제14장 부대공 diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제14장_부대공/14-01_입목뿌리_밑막이.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제14장_부대공/14-01_입목뿌리_밑막이.md index 5803d688..eb762d10 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제14장_부대공/14-01_입목뿌리_밑막이.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제14장_부대공/14-01_입목뿌리_밑막이.md @@ -5,10 +5,23 @@ PDF쪽: 215 인쇄쪽: 203 시작표지: 14-1. 입목뿌리 밑막이 끝표지: 14-2. 근주이식 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_1 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 14-1. 입목뿌리 밑막이 + +(단위: 10본당) + +| 장비 | 단위 | 수량 | 비고 | +|---|---|---|---| +| 0.8㎥ 굴착기(우드그랩 부착) | h | 0.17 | 장비이동거리 50m이내 기준 | +| 보통인부 | h | 0.5 | | + + +[주] +입목뿌리 밑막이란 성토비탈면의 하부에 기존지장목의 근주를 밑막이 형태로 쌓는 것을 말한다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제14장_부대공/14-02_근주이식.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제14장_부대공/14-02_근주이식.md index c4db30ef..d2a7918d 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제14장_부대공/14-02_근주이식.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제14장_부대공/14-02_근주이식.md @@ -5,10 +5,25 @@ PDF쪽: 215 인쇄쪽: 203 시작표지: 14-2. 근주이식 끝표지: [부록 1]할인․할증 적용 공종표 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_1 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 14-2. 근주이식 + +(단위: 10본당) + +| 장비 | 단위 | 수량 | 비고 | +|---|---|---|---| +| 0.8㎥ 굴착기 | h | 0.25 | 장비 이동거리 50m이내 기준 | +| 보통인부 | h | 0.66 | | + + +[주] +① 본 품은 맹아발생이 가능한 수종의 살아 있는 근주를 이식하는 데에 적용한다. +② 적용 대상 근주의 규격은 근원직경 10㎝∼30㎝ 사이를 기준으로 하며, 평균 근원직경은 20㎝이다. +③ 0.2㎥ 또는 0.4㎥ 용량의 굴착기를 사용하는 경우에는 「건설공사 표준품셈 공통부문, 8-2-3 굴착기(2025)」를 참조하여 적용계수를 달리 적용하도록 한다. diff --git a/resources/tester/helper_z01_fake_repo.py b/resources/tester/helper_z01_fake_repo.py deleted file mode 100644 index f20f5ddd..00000000 --- a/resources/tester/helper_z01_fake_repo.py +++ /dev/null @@ -1,92 +0,0 @@ -"""Z01 기초단가 저장소 가짜 — DB 없이 API 시험(PLAN 1-2 · 2026-09-18). - -`install(monkeypatch)` 가 `Z01_MasterData_Repository_BasePrices` 의 함수 다섯을 바꿔 끼움. -주입 = 파일 원본 줄(`base_rows`) 그대로 · ⚠ '@' 칸(`@axis`·`@source`)은 **빼고** 담음 — -주입기가 안쪽 칸을 빼도 서버가 서는지 함께 잼. 판번호 규칙(다르면 409 · 쓰면 +1)은 진짜와 같게. -""" - -from __future__ import annotations - -from typing import Any - -import pytest - -from Z01_MasterData import Z01_MasterData_BasePrices as base_prices -from Z01_MasterData import Z01_MasterData_Repository_BasePrices as repo -from Z01_MasterData import Z01_MasterData_WorkItems as work_items - - -class FakeRepo: - def __init__(self) -> None: - self.tables: dict[str, list[dict[str, Any]]] = {} - self.revisions: dict[str, int] = {} - self.saved_by: list[Any] = [] - - def table(self, kind: str) -> list[dict[str, Any]]: - if kind not in self.tables: - self.tables[kind] = [] - for row in base_prices.base_rows(kind): - data = {k: v for k, v in row.items() if not k.startswith("@")} - self.tables[kind].append( - {"row_key": row["@id"], "data": data, "seed": dict(data), "deleted": False} - ) - return self.tables[kind] - - def by_key(self, kind: str) -> dict[str, dict[str, Any]]: - return {r["row_key"]: r for r in self.table(kind)} - - async def load(self, kind: str) -> list[dict[str, Any]]: - return [ - {"row_key": r["row_key"], "data": dict(r["data"]), "seed": r["seed"]} - for r in self.table(kind) - if not r["deleted"] - ] - - async def revision(self, kind: str) -> int: - return self.revisions.get(kind, 0) - - async def counts(self) -> dict[str, int]: - return { - kind: sum(not r["deleted"] for r in self.table(kind)) - for kind in base_prices.KINDS - if kind not in work_items.KINDS - } - - async def save(self, kind, base_revision, changed, added, deleted, by) -> int: - current = self.revisions.get(kind, 0) - if current != base_revision: - raise repo.RevisionConflict(current) - rows = self.by_key(kind) - for key, data in changed.items(): - if not rows[key]["deleted"]: - rows[key]["data"] = dict(data) - for key, data in added.items(): - self.table(kind).append( - {"row_key": key, "data": dict(data), "seed": None, "deleted": False} - ) - for key in deleted: - rows[key]["deleted"] = True - self.revisions[kind] = current + 1 - self.saved_by.append(by) - return current + 1 - - async def reset(self, kind, row_keys, by) -> int: - rows = self.by_key(kind) - missing = sorted(set(row_keys) - set(rows)) - if missing: - raise repo.UnknownRows(missing) - for key in row_keys: - row = rows[key] - if row["seed"] is None: - row["deleted"] = True - else: - row["data"], row["deleted"] = dict(row["seed"]), False - self.revisions[kind] = self.revisions.get(kind, 0) + 1 - return self.revisions[kind] - - -def install(monkeypatch: pytest.MonkeyPatch) -> FakeRepo: - fake = FakeRepo() - for name in ("load", "revision", "counts", "save", "reset"): - monkeypatch.setattr(repo, name, getattr(fake, name)) - return fake diff --git a/resources/tester/test_master_labels_base_prices.py b/resources/tester/test_master_labels_base_prices.py index a67fae7f..67ec9b59 100644 --- a/resources/tester/test_master_labels_base_prices.py +++ b/resources/tester/test_master_labels_base_prices.py @@ -10,12 +10,10 @@ from __future__ import annotations -import asyncio import json from pathlib import Path import pytest -from helper_z01_fake_repo import install from Z01_MasterData import Z01_MasterData_BasePrices as base_prices @@ -30,13 +28,11 @@ def labels() -> dict: @pytest.fixture(scope="module") def shown() -> dict[str, list[dict]]: - """서버가 실제로 내보내는 열 — 이름표 파일이 아니라 **응답**을 잰다(DB 는 파일을 주입한 가짜).""" + """서버가 실제로 내보내는 열 — 이름표 파일이 아니라 **응답**을 잰다.""" out = {} - with pytest.MonkeyPatch.context() as patch: - install(patch) - for kind in base_prices.KINDS: - columns = base_prices._columns(kind, asyncio.run(base_prices.rows(kind))) - out[kind] = [base_prices.column_meta(kind, c) for c in columns] + for kind in base_prices.KINDS: + columns = base_prices._columns(kind, base_prices.rows(kind)) + out[kind] = [base_prices.column_meta(kind, c) for c in columns] return out @@ -103,8 +99,8 @@ def test_요율_축이_한_칸으로_안_합쳐졌다(shown): def test_요율_줄_열쇠에_축이_살아_있다(): - """`@id` 가 `{변수}[/{목록}/{축=값;…}]` 꼴 — 축이 죽으면 주입 열쇠(row_key)가 흔들린다.""" - rows = base_prices.base_rows("rate") + """`@id` 가 `{변수}[/{목록}/{축=값;…}]` 꼴 — 축이 죽으면 고친 값이 주인을 잃는다.""" + rows = base_prices.rows("rate") multi = [r for r in rows if "/" in str(r["@id"])] assert multi, "축이 든 줄 열쇠가 하나도 없다" assert any("=" in str(r["@id"]) for r in multi) @@ -113,7 +109,7 @@ def test_요율_줄_열쇠에_축이_살아_있다(): def test_기계_시간당_단가는_계산값으로_잠긴다(shown): """밑값만 고칠 수 있다 — 판정은 서버 `spec()` 한 곳(이름표가 따로 안 정한다).""" - meta = base_prices.table("machine", base_prices.base_rows("machine"), page=1, size=1) + meta = base_prices.table("machine", page=1, size=1) assert set(meta["formula"]) == { "hourly_loss_krw", "hourly_fuel_krw", @@ -159,15 +155,15 @@ def test_단위가_붙어야_할_열에_단위가_있다(shown): def test_줄_열쇠가_서버_축과_같다(labels): - """⭐ 줄을 붙드는 끈 — 파일 원본이 줄마다 `@axis` 로 내는 축이 곧 열쇠(주입 row_key)다. + """⭐ 덮개가 줄을 붙드는 끈 — 서버가 줄마다 `@axis` 로 내는 축이 곧 열쇠다. - 이름표가 축을 빠뜨리면 새 판 주입 때 같은 줄을 못 알아본다. + 이름표가 축을 빠뜨리면 고친 값이 갱신 뒤 주인을 잃는다. """ declared = {r["table"]: set(r["key"]) for r in labels["row_keys"]} bad = [] for kind in base_prices.KINDS: axes = set() - for row in base_prices.base_rows(kind): + for row in base_prices.rows(kind): axes |= set(row.get("@axis") or ()) if not axes: # 다섯 표는 `@id` 한 칸이라 축을 안 낸다 continue @@ -178,13 +174,13 @@ def test_줄_열쇠가_서버_축과_같다(labels): def test_구간_이름은_원문_표기_그대로다(): - """⚠ `~1.5`·`7이상` 을 예쁘게 고치면 줄 열쇠가 바뀌어 주입한 줄을 못 알아본다.""" + """⚠ `~1.5`·`7이상` 을 예쁘게 고치면 줄 열쇠가 바뀌어 덮개가 주인을 잃는다.""" for kind in ("masonry_slope", "masonry_back_length"): - brackets = {str(r.get("height_bracket")) for r in base_prices.base_rows(kind)} + brackets = {str(r.get("height_bracket")) for r in base_prices.rows(kind)} assert brackets == {"~1.5", "~3", "~5", "~7", "7이상"}, (kind, sorted(brackets)) classes = { str(r.get("class")) - for r in base_prices.base_rows("masonry_class") + for r in base_prices.rows("masonry_class") if r.get("table") == "boulder_diameter" } assert classes == {"40~60", "60~80", "80~100"}, sorted(classes) @@ -202,13 +198,13 @@ def test_축_칸은_못_고친다(): """축을 고치면 줄이 다른 줄이 된다 — 서버가 잠가야 한다.""" bad = [] for kind in base_prices.KINDS: - rows = base_prices.base_rows(kind) + rows = base_prices.rows(kind) axes = set() for row in rows: axes |= set(row.get("@axis") or ()) if not axes: continue - meta = base_prices.table(kind, rows, page=1, size=1) + meta = base_prices.table(kind, page=1, size=1) for axis in axes: if axis in meta["editable"] and f"{kind}/{axis}" not in AXIS_ALSO_VALUE: bad.append(f"{kind}/{axis} 가 고칠 수 있는 칸으로 섰다") @@ -232,11 +228,10 @@ def test_기초단가_상자_이름이_이름표에_있다(labels): assert named["pumsem_basis"]["name_ko"] == "품셈 기준" -def test_상자마다_kind_가_있다(monkeypatch): +def test_상자마다_kind_가_있다(): """빈 상자가 서면 화면에 이름만 뜨고 아무것도 안 열린다.""" - install(monkeypatch) counted: dict[str, int] = {} - for entry in asyncio.run(base_prices.kinds()): + for entry in base_prices.kinds(): counted[entry["group"]] = counted.get(entry["group"], 0) + 1 assert entry["label"] != entry["kind"], f"{entry['kind']} 이름이 영문 그대로다" assert entry["rows"] > 0, entry["kind"] diff --git a/resources/tester/test_pum_md_tool.py b/resources/tester/test_pum_md_tool.py index 8832e50f..2cbbc60a 100644 --- a/resources/tester/test_pum_md_tool.py +++ b/resources/tester/test_pum_md_tool.py @@ -64,7 +64,7 @@ def test_forest_toc_counts(): pymupdf = pytest.importorskip("pymupdf") book = tool.BOOKS["산림"] with pymupdf.open(book["pdf"]) as doc: - entries = tool.toc_entries(doc, *book["toc"]) + entries = tool.toc_entries(doc, book) assert sum(e.ident.startswith("제") for e in entries) == 14 assert sum(e.ident.count("-") == 1 for e in entries) == 189 @@ -121,3 +121,65 @@ def test_fingerprint_ignores_line_endings_and_tool_fields(): assert tool.fingerprint(text) == tool.fingerprint(same) assert tool.fingerprint(text) != tool.fingerprint(text.replace("본문", "본문!")) assert "확정지문: abc" in tool.set_head(text, "확정지문", "abc") + + +def test_join_spaced_and_file_label(): + assert tool.join_spaced("측 량") == "측량" # 자간 벌림 + assert tool.join_spaced("설계 및 수량") == "설계 및 수량" + label = tool.file_label("9-5-4", "9-5-4 수치지도 작성('21, '22, '24, '26년 보완)", dot=False) + assert label == "수치지도_작성" # 개정 표지는 파일 이름에서만 뗌 + + +def test_const_toc_counts(): + """건설 차례 — 5부문 · 45장(PDF 3~51쪽) · 부문마다 장 번호가 1부터.""" + pymupdf = pytest.importorskip("pymupdf") + book = tool.BOOKS["건설"] + with pymupdf.open(book["pdf"]) as doc: + entries = tool.toc_entries(doc, book) + assert tool.find_heading(doc, "1-5", 87, dot=False)[2] == "1-5 기타" + assert [e.ident for e in entries if e.ident.endswith("부문")] == [ + "공통부문", + "토목부문", + "건축부문", + "기계설비부문", + "유지관리부문", + ] + assert sum(e.ident.startswith("제") for e in entries) == 45 + + +def test_repeated_head_comment_counts_and_footer_dropped(): + """쪽을 넘은 표의 되풀이 머리 — md 표에선 빼고 `` 로 적으면 셈(규칙 4-5) · 쪽 꼬리는 뺌.""" + pymupdf = pytest.importorskip("pymupdf") + doc = pymupdf.open() + for lines in (["9-5. A", "NAME QTY", "X 1.0", "- 1 -"], ["NAME QTY", "Y 2.0", "- 2 -"]): + page = doc.new_page() + for n, text in enumerate(lines): + page.insert_text((72, 72 + 30 * n), text) + head = {"PDF쪽": "1~2", "시작표지": "9-5. A", "끝표지": "끝"} + pdf = tool.pdf_lines(doc, head, tool.BOOKS["산림"]["footer"]) + assert [row for _, row in pdf] == ["9-5. A", "NAME QTY", "X 1.0", "NAME QTY", "Y 2.0"] + md = "\n".join( + [ + "## 9-5. A", + "", + "| NAME | QTY |", + "|---|---|", + "| X | 1.0 |", + "", + "| Y | 2.0 |", + ] + ) + assert tool.verdict(tool.compare(pdf, tool.md_lines(md))).startswith("통과") + + +def test_off_layer_glyphs_and_compat_han(): + """사용자 영역 글리프는 ①② 에서 빼고 드러냄 · md 는 감싼 받아쓰기를 뺌 · 호환 한자는 통합 한자로(NFKC 통째 아님).""" + pdf = [(21, "체적 V \ue001\ue002 = 1.5"), (21, "공극\uf9db ㎥ ①")] + md = tool.md_lines("체적 V (m^3) = 1.5\n공극率 ㎥ ①") + result = tool.compare(pdf, md) + line = tool.verdict(result) + assert line.startswith("통과"), line + assert "글자층 밖 글리프 2개(21쪽) · 받아씀 4자" in line # 「(m3)」 네 자 + # 감싸지 않으면 받아쓴 글자가 더함으로 뜸 + bare = tool.compare(pdf, tool.md_lines("체적 V (m^3) = 1.5\n공극率 ㎥ ①")) + assert tool.verdict(bare).startswith("불통") diff --git a/resources/tester/test_z01_base_prices.py b/resources/tester/test_z01_base_prices.py index 1af960b9..911b90fc 100644 --- a/resources/tester/test_z01_base_prices.py +++ b/resources/tester/test_z01_base_prices.py @@ -1,27 +1,23 @@ -"""Z01 기초단가 다섯(노임·기계·자재·유가·요율) — DB 정본 + [저장] 일괄 저장(2026-09-18 PLAN 1-0 · 1-2). +"""Z01 기초단가 다섯(노임·기계·자재·유가·요율) — 고칠 수 있게 · 2026-09-15 브레인 계약(사용자 지시). -틀: 정본 = DB `master_base_price`(data = 지금 값 · seed = 초기값) · 원본 파일 `resources/data_*` 는 **주입 재료로 읽기만** · -[저장] 한 번 = {base_revision, edits, added, deleted} → 판이 다르면 409 · 하나라도 틀리면 아무것도 안 씀 · -줄마다 changed_columns(초기값과 다른 칸)·is_added(관리자 추가 줄) · [초기값으로] = data := seed(추가 줄은 지움). +틀(브레인 못박음): 원본 `resources/data_*` 는 **읽기만** · 고친 값은 덮개 +`resources/data_master_override/{kind}.json`(주기가 달라 kind 마다 한 파일)에만 · 읽을 때 원본 위에 얹음 · +덮개 줄마다 original(원래 값)·source(원본 파일) — 원본이 바뀌면 「원본 바뀜」 · 줄이 사라지면 「주인 없음」(버리지 않음) · 기계 시간당 단가는 계산값 — editable 에서 빼고 왜 못 고치나(locked) · 밑값(취득가·손료계수·노임·유가)을 고치면 따라 바뀜. -DB 는 `helper_z01_fake_repo` 가짜로 — 저장소 SQL 흐름(잠금·되돌림)은 맨 아래 가짜 커넥션으로 잼. """ from __future__ import annotations -import asyncio import hashlib import json from decimal import Decimal from pathlib import Path -from types import SimpleNamespace import pytest from fastapi import FastAPI from fastapi.testclient import TestClient -from helper_z01_fake_repo import FakeRepo, install -from Z01_MasterData import Z01_MasterData_Repository_BasePrices as repo +from Z01_MasterData import Z01_MasterData_Overrides as overrides from Z01_MasterData import Z01_MasterData_Router as router_module ROOT = Path(__file__).resolve().parents[2] @@ -40,12 +36,14 @@ SOURCES = [ @pytest.fixture -def fake(monkeypatch: pytest.MonkeyPatch) -> FakeRepo: - return install(monkeypatch) +def store(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> Path: + folder = tmp_path / "data_master_override" + monkeypatch.setattr(overrides, "OVERRIDE_DIR", folder) + return folder @pytest.fixture -def client(fake: FakeRepo) -> TestClient: +def client(store: Path) -> TestClient: from common_util.common_util_auth import verify_session app = FastAPI() @@ -65,20 +63,8 @@ def _row(client: TestClient, kind: str, row_id: str) -> dict: return next(r for r in rows if r["@id"] == row_id) -def _save(client: TestClient, kind: str, edits=(), added=(), deleted=(), base=None): - if base is None: - base = _get(client, kind, size=1)["revision"] - body = { - "base_revision": base, - "edits": [{"row_key": k, "column": c, "value": v} for k, c, v in edits], - "added": [{"data": d} for d in added], - "deleted": list(deleted), - } - return client.put(f"/api/master-data/base-prices/{kind}", json=body) - - -def _edit(client: TestClient, kind: str, row_id: str, column: str, value): - return _save(client, kind, edits=[(row_id, column, value)]) +def _put(client: TestClient, kind: str, row_id: str, values: dict): + return client.put(f"/api/master-data/base-prices/{kind}/{row_id}", json={"values": values}) def _sha(path: Path) -> str: @@ -95,15 +81,13 @@ def test_다섯_표는_제_열쇠와_고칠_칸을_냄(client: TestClient) -> No for kind, (total, editable) in expected.items(): table = _get(client, kind, size=500) assert table["total"] == total and table["editable"] == editable, kind - assert table["status"] == "success" and table["revision"] == 0, kind ids = [r["@id"] for r in _get(client, kind, size=500)["rows"]] assert len(ids) == len(set(ids)), kind - # 안 고친 줄 — 고친 칸 없음 · 추가 줄 아님 · 안쪽 칸(@data 따위)은 안 나감 - assert all(r["changed_columns"] == [] and r["is_added"] is False for r in table["rows"]) - assert not {k for r in table["rows"] for k in r if k in ("@data", "@added", "@changed")} + assert all("@overrides" not in r for r in table["rows"]), ( + kind + ) # 안 고친 줄엔 칸 자체가 없음 columns = {c["key"] for c in table["columns"]} assert not {k for k in columns if k.startswith("@")}, kind # 줄 수준 칸은 열 목록 밖 - assert not columns & {"changed_columns", "is_added"}, kind assert set(table["locked"]) <= columns and not set(table["locked"]) & set(editable), kind assert _row(client, "labor", "labor_const/1001")["daily_wage_krw"] == 215907 assert _row(client, "labor", "labor_mfg/1")["occupation_name"] == "CAD설계사(기계)" @@ -132,8 +116,8 @@ def test_기계는_시간당_단가를_계산값으로_잠그고_산출근거를 "hourly_total_krw" in row["@formula"] and f"{int(row['hourly_total_krw']):,}" in row["@formula"]["hourly_total_krw"] ) - res = _edit(client, "machine", "0101-0007", "hourly_total_krw", 1) - assert res.status_code == 400 and table["locked"]["hourly_total_krw"] in res.json()["message"] + res = _put(client, "machine", "0101-0007", {"hourly_total_krw": 1}) + assert res.status_code == 400 and table["locked"]["hourly_total_krw"] in res.text def test_기계_계산값은_B09_시간당_사용료와_같음(client: TestClient) -> None: @@ -162,23 +146,38 @@ def test_기계_계산값은_B09_시간당_사용료와_같음(client: TestClien assert checked >= 5 -def test_저장은_DB_에만_쓰고_원본_파일은_안_건드림(client: TestClient, fake: FakeRepo) -> None: +def test_고친_값은_덮개에만_쓰고_원본은_안_건드림(client: TestClient, store: Path) -> None: before = {p: _sha(p) for p in SOURCES} - res = _save( - client, - "labor", - edits=[("labor_const/1001", "daily_wage_krw", 230000)], - base=0, - ) + res = _put(client, "labor", "labor_const/1001", {"daily_wage_krw": 230000}) assert res.status_code == 200, res.text - assert res.json() == {"status": "success", "revision": 1, "added": []} - row = _row(client, "labor", "labor_const/1001") - assert row["daily_wage_krw"] == 230000 and row["changed_columns"] == ["daily_wage_krw"] - stored = fake.by_key("labor")["labor_const/1001"] - assert stored["data"]["daily_wage_krw"] == 230000 and stored["seed"]["daily_wage_krw"] == 215907 - assert fake.saved_by == [42] # 누가 고쳤나 - assert _get(client, "labor", size=1)["revision"] == 1 - assert _get(client, "oil", size=1)["revision"] == 0 # 판번호는 표마다 + row = res.json() + assert row["daily_wage_krw"] == 230000 + assert row["@overrides"] == { + "daily_wage_krw": { + "original": 215907, + "value": 230000, + "state": overrides.EDITED, + "current": 215907, + } + } + assert ( + _row(client, "labor", "labor_const/1001")["@overrides"]["daily_wage_krw"]["value"] == 230000 + ) + assert ( + _put(client, "oil", "national_average/oil_diesel", {"price_krw_per_l": 1900}).status_code + == 200 + ) + assert sorted(p.name for p in store.iterdir()) == [ + "labor.json", + "oil.json", + ] # kind 마다 한 파일 + saved = json.loads((store / "labor.json").read_text(encoding="utf-8")) + entry = saved["overrides"]["labor_const/1001"]["daily_wage_krw"] + assert ( + entry["original"] == 215907 + and entry["source"] == "labor_const_2026-01-01.json" + and entry["by"] == 42 + ) assert {p: _sha(p) for p in SOURCES} == before @@ -186,113 +185,139 @@ def test_밑값을_고치면_기계_계산값이_따라_바뀜(client: TestClien base = _row(client, "machine", "0101-0007") operator = base["operator_occupation_code"] wage = _row(client, "labor", f"labor_const/{operator}")["daily_wage_krw"] - assert _edit( - client, "labor", f"labor_const/{operator}", "daily_wage_krw", wage + 80000 - ).is_success - assert _edit(client, "oil", "national_average/oil_diesel", "price_krw_per_l", 2000).is_success - price = base["price_thousand_krw"] - assert _edit(client, "machine", "0101-0007", "price_thousand_krw", price * 2).is_success + _put(client, "labor", f"labor_const/{operator}", {"daily_wage_krw": wage + 80000}) + _put(client, "oil", "national_average/oil_diesel", {"price_krw_per_l": 2000}) + _put(client, "machine", "0101-0007", {"price_thousand_krw": base["price_thousand_krw"] * 2}) after = _row(client, "machine", "0101-0007") assert after["hourly_operator_krw"] > base["hourly_operator_krw"] assert after["hourly_fuel_krw"] > base["hourly_fuel_krw"] assert after["hourly_loss_krw"] == pytest.approx(base["hourly_loss_krw"] * 2) - # 노임·유가 고친 칸은 그 표 줄에 서고 기계 줄은 계산만 바뀜 - assert after["changed_columns"] == ["price_thousand_krw"] + price = base["price_thousand_krw"] + assert after["@overrides"] == { + "price_thousand_krw": { + "original": price, + "value": price * 2, + "state": overrides.EDITED, + "current": price, + } + } # 노임·유가 덮개는 그 표 줄에 서고 기계 줄은 계산만 바뀜 -def test_계산_칸은_DB_에_안_씀(client: TestClient, fake: FakeRepo) -> None: - """기계 줄을 고쳐도 저장 값은 입력 칸만 — 계산 칸이 굳어 들어가면 노임을 고쳐도 안 따라옴.""" - _edit(client, "machine", "0101-0007", "loss_coefficient_per_hour", 0.001) - data = fake.by_key("machine")["0101-0007"]["data"] - assert data["loss_coefficient_per_hour"] == 0.001 - assert not {"hourly_total_krw", "hourly_note", "fuel_price_krw_per_l"} & set(data) +def test_null_은_되돌리기_같은_값도_덮개를_안_남김(client: TestClient, store: Path) -> None: + _put(client, "material", "10023392", {"price_krw": 30}) + reverted = _put(client, "material", "10023392", {"price_krw": None}).json() + assert reverted["price_krw"] == 22 and "@overrides" not in reverted + assert _put(client, "material", "10023392", {"price_krw": 22}).status_code == 200 + saved = json.loads((store / "material.json").read_text(encoding="utf-8")) + assert saved["overrides"] == {} -def test_하나라도_틀리면_아무것도_안_씀(client: TestClient, fake: FakeRepo) -> None: - good = ("labor_const/1001", "daily_wage_krw", 230000) - for bad, status in ( - (("labor_const/1002", "occupation_name", "x"), 400), # 잠긴 칸 - (("labor_const/1002", "daily_wage_krw", -1), 400), # 나쁜 값 - (("labor_const/0000", "daily_wage_krw", 1), 404), # 없는 줄 - ): - res = _save(client, "labor", edits=[good, bad]) - assert res.status_code == status, (bad, res.text) - assert res.json()["status"] == "error" - res = _save(client, "labor", edits=[good], deleted=["labor_const/0000"]) - assert res.status_code == 404 - assert fake.revisions == {} and fake.saved_by == [] - assert _row(client, "labor", "labor_const/1001")["daily_wage_krw"] == 215907 - - -def test_낡은_판으로_저장하면_409( - client: TestClient, fake: FakeRepo, monkeypatch: pytest.MonkeyPatch +def test_원본이_바뀐_덮개는_덮개_값을_쓰고_세게_드러냄_주인_없는_덮개도_남김( + client: TestClient, store: Path ) -> None: - assert _save( - client, "labor", edits=[("labor_const/1001", "daily_wage_krw", 1)], base=0 - ).is_success - stale = _save(client, "labor", edits=[("labor_const/1002", "daily_wage_krw", 2)], base=0) - assert stale.status_code == 409 and "다시 불러와" in stale.json()["message"] - assert _row(client, "labor", "labor_const/1002")["changed_columns"] == [] - # 앞 검사를 지난 뒤 트랜잭션 안에서 판이 갈려도 409(저장소가 잠그고 다시 봄) - - async def old_revision(kind: str) -> int: - return 0 - - monkeypatch.setattr(repo, "revision", old_revision) - raced = _save(client, "labor", edits=[("labor_const/1002", "daily_wage_krw", 2)], base=0) - assert raced.status_code == 409 and fake.revisions["labor"] == 1 - - -def test_줄_추가_고치기_지우기(client: TestClient, fake: FakeRepo) -> None: - data = {"specification": "ZZ시험 규격, 특수", "unit": "개", "price_krw": 1234} - res = _save(client, "material", added=[data]) - assert res.status_code == 200, res.text - (key,) = res.json()["added"] - assert key.startswith("added/") and res.json()["revision"] == 1 - table = _get(client, "material", size=1, page=7000) - assert table["total"] == 7000 - row = table["rows"][0] # 추가 줄은 맨 끝(넣은 차례) - assert (row["@id"], row["is_added"], row["changed_columns"]) == (key, True, []) - assert row["price_krw"] == 1234 and row["specification"] == "ZZ시험 규격, 특수" - assert _get(client, "material", q="ZZ시험")["total"] == 1 - # 추가 줄은 글자 칸도 고침(사람이 넣은 이름) · 원래 줄의 글자 칸은 못 고침 - assert _edit(client, "material", key, "specification", "시험 규격, 고침").is_success - assert _edit(client, "material", "10023392", "specification", "x").status_code == 400 - for bad in ({"없는칸": 1}, {"price_krw": "비쌈"}, {"price_krw": -5}, {"unit": {"a": 1}}): - assert _save(client, "material", added=[bad]).status_code == 400, bad - assert _save(client, "material", added=[{}]).status_code == 422 # 빈 줄 - gone = _save(client, "material", deleted=[key, "10023392"]) - assert gone.status_code == 200 - ids = {r["@id"] for r in _get(client, "material", q="육각볼트", size=500)["rows"]} - assert "10023392" not in ids and _get(client, "material", size=1)["total"] == 6998 - assert fake.by_key("material")["10023392"]["deleted"] is True # 지운 표시만(되살릴 수 있게) - - -def test_초기값으로_되돌리기(client: TestClient, fake: FakeRepo) -> None: - _edit(client, "labor", "labor_const/1001", "daily_wage_krw", 230000) - added = _save(client, "labor", added=[{"occupation_name": "시험 직종", "daily_wage_krw": 1}]) - (key,) = added.json()["added"] - _save(client, "labor", deleted=["labor_const/1002"]) - res = client.post( - "/api/master-data/base-prices/labor/reset", - json={"row_keys": ["labor_const/1001", key, "labor_const/1002"]}, + store.mkdir() + (store / "labor.json").write_text( + json.dumps( + { + "schema_version": "1.0", + "kind": "labor", + "overrides": { + "labor_const/1001": { + "daily_wage_krw": { + "value": 199000, + "original": 200000, + "source": "labor_const_2025-07-01.json", + } + }, + "labor_const/9999": { + "daily_wage_krw": { + "value": 1, + "original": 1, + "source": "labor_const_2025-07-01.json", + } + }, + }, + } + ), + encoding="utf-8", ) - assert res.status_code == 200 and res.json() == {"status": "success", "revision": 4} - back = _row(client, "labor", "labor_const/1001") - assert back["daily_wage_krw"] == 215907 and back["changed_columns"] == [] - assert _row(client, "labor", "labor_const/1002")["daily_wage_krw"] # 지운 줄도 되살림 - assert _get(client, "labor", size=1)["total"] == 261 # 추가 줄은 지움 - missing = client.post( - "/api/master-data/base-prices/labor/reset", json={"row_keys": ["labor_const/0000"]} + # 브레인 ③ — 자동으로 원본을 쓰면 금액이 말없이 바뀜 → 사람이 고친 값 유지 · 갈렸다는 것만 또렷이 + row = _row(client, "labor", "labor_const/1001") + assert row["daily_wage_krw"] == 199000 + mark = row["@overrides"]["daily_wage_krw"] + assert mark == { + "original": 200000, + "value": 199000, + "state": overrides.SOURCE_CHANGED, + "current": 215907, + } + _put(client, "labor", "labor_const/1002", {"daily_wage_krw": 170000}) + listed = client.get("/api/master-data/overrides").json() + assert [ + (i["row_id"], i["state"]) for i in listed["items"] + ] == [ # 서버가 정렬 — 원본 바뀜이 맨 위 + ("labor_const/1001", overrides.SOURCE_CHANGED), + ("labor_const/9999", overrides.ORPHAN), + ("labor_const/1002", overrides.EDITED), + ] + first = listed["items"][0] + assert set(first) == { + "kind", + "row_id", + "row_label", + "column", + "column_label", + "original", + "current", + "value", + "state", + "unit", + } + assert first["row_label"] == "작업반장" and ( + first["original"], + first["current"], + first["value"], + ) == (200000, 215907, 199000) + assert listed["items"][1]["current"] is None + saved = json.loads((store / "labor.json").read_text(encoding="utf-8"))["overrides"] + assert "labor_const/9999" in saved # 다른 줄을 고쳐도 주인 없는 덮개는 안 지움 + # 같은 값을 다시 넣으면 「지금 원본을 보고 고침」 으로 굳음 · null 이면 새 원본 값으로 받기 + kept = _put(client, "labor", "labor_const/1001", {"daily_wage_krw": 199000}).json() + assert kept["@overrides"]["daily_wage_krw"] == { + "original": 215907, + "value": 199000, + "state": overrides.EDITED, + "current": 215907, + } + taken = _put(client, "labor", "labor_const/1001", {"daily_wage_krw": None}).json() + assert taken["daily_wage_krw"] == 215907 and "@overrides" not in taken + + +def test_빈_칸에_새로_넣은_값도_덮개_원본에_값이_생기면_원본_바뀜( + client: TestClient, store: Path +) -> None: + blank = next(r for r in _get(client, "labor", size=500)["rows"] if r["daily_wage_krw"] is None) + row = _put(client, "labor", blank["@id"], {"daily_wage_krw": 150000}).json() + assert row["@overrides"]["daily_wage_krw"] == { + "original": None, + "value": 150000, + "state": overrides.EDITED, + "current": None, + } + saved = json.loads((store / "labor.json").read_text(encoding="utf-8")) + saved["overrides"][blank["@id"]]["daily_wage_krw"]["original"] = ( + 140000 # 옛 판엔 값이 있었다고 치면 + ) + (store / "labor.json").write_text(json.dumps(saved), encoding="utf-8") + assert ( + _row(client, "labor", blank["@id"])["@overrides"]["daily_wage_krw"]["state"] + == overrides.SOURCE_CHANGED ) - assert missing.status_code == 404 and "labor_const/0000" in missing.json()["message"] - empty = client.post("/api/master-data/base-prices/labor/reset", json={"row_keys": []}) - assert empty.status_code == 422 # 통째로 되돌리기 막음 def test_요율_표는_법정값_경고를_실음(client: TestClient) -> None: rate = _get(client, "rate", size=1) - assert any("법이 정한 값" in line and "고시" in line for line in rate["notice"]) + assert any("갱신" in line and "주인" in line for line in rate["notice"]) for kind in ("labor", "machine", "material", "oil", "rate"): # 브레인 ③ — 문구는 서버가 한 벌로 notice = _get(client, kind, size=1)["notice"] assert any("새로 만드는 프로젝트" in line and "이미 만든" in line for line in notice), kind @@ -300,18 +325,16 @@ def test_요율_표는_법정값_경고를_실음(client: TestClient) -> None: def test_막는_자리(client: TestClient) -> None: - assert _save(client, "wage", base=0).status_code == 404 - assert _save(client, "work_item_forest", base=0).status_code == 400 # 공종은 /work-items 몫 - locked = _edit(client, "labor", "labor_const/1001", "hours_per_day", 9) # 숫자여도 잠긴 칸 - assert locked.status_code == 400 and "공표 원문" in locked.json()["message"] + assert _put(client, "wage", "x", {"daily_wage_krw": 1}).status_code == 404 + assert _put(client, "labor", "labor_const/0000", {"daily_wage_krw": 1}).status_code == 404 + assert _put(client, "labor", "labor_const/1001", {"occupation_name": "x"}).status_code == 400 + locked = _put(client, "labor", "labor_const/1001", {"hours_per_day": 9}) # 숫자여도 잠긴 칸 + assert locked.status_code == 400 and "공표 원문" in locked.text for bad in (True, -1, "220000", float("nan")): - body = { - "base_revision": 0, - "edits": [{"row_key": "labor_const/1001", "column": "daily_wage_krw", "value": bad}], - } + body = json.dumps({"values": {"daily_wage_krw": bad}}).encode() res = client.put( - "/api/master-data/base-prices/labor", - content=json.dumps(body).encode(), + "/api/master-data/base-prices/labor/labor_const/1001", + content=body, headers={"content-type": "application/json"}, ) assert res.status_code in (400, 422), bad @@ -321,20 +344,9 @@ def test_막는_자리(client: TestClient) -> None: if r["@id"].startswith("rate_performance_guarantee_fee/brackets/") ) assert ( - _edit(client, "rate", fee["@id"], "rate_percent", 1).status_code == 400 - ) # 그 줄엔 요율 칸 없음 + _put(client, "rate", fee["@id"], {"rate_percent": 1}).status_code == 400 + ) # 그 줄엔 요율 칸이 없음 assert Decimal(str(_row(client, "rate", "rate_sanjae")["rate_percent"])) == Decimal("3.56") - many = [("labor_const/1001", "daily_wage_krw", 1)] * 501 - assert _save(client, "labor", edits=many).status_code == 422 # 한 번에 500 칸까지 - extra = client.put( - "/api/master-data/base-prices/labor", json={"base_revision": 0, "values": {}} - ) - assert extra.status_code == 422 # 모르는 칸은 거절(옛 모양으로 보내면 조용히 무시 안 함) - old = client.put( - "/api/master-data/base-prices/labor/labor_const/1001", json={"values": {"x": 1}} - ) - assert old.status_code in (404, 405) # 옛 칸 단위 저장은 없어짐 - assert client.get("/api/master-data/overrides").status_code == 404 def test_합친_표는_줄마다_판_기준일을_실음(client: TestClient) -> None: @@ -352,6 +364,61 @@ def test_합친_표는_줄마다_판_기준일을_실음(client: TestClient) -> assert no_record["operating_effective_date"] is None and no_record["hourly_total_krw"] is None +def test_주인_없는_덮개는_모아서_한꺼번에_다룸(client: TestClient, store: Path) -> None: + """브레인 ② — 자재·기계는 품목 퇴출이 상시라 갱신 한 번에 여럿이 주인을 잃음.""" + store.mkdir() + gone = { + f"9999000{i}": {"price_krw": {"value": 1, "original": 1, "source": "old.json"}} + for i in range(3) + } + (store / "material.json").write_text( + json.dumps({"schema_version": "1.0", "kind": "material", "overrides": gone}), + encoding="utf-8", + ) + _put(client, "material", "10023392", {"price_krw": 30}) + _put(client, "labor", "labor_const/1001", {"daily_wage_krw": 230000}) + listed = client.get( + "/api/master-data/overrides", params={"state": overrides.ORPHAN, "kind": "material"} + ).json() + assert listed["total"] == 3 and {i["state"] for i in listed["items"]} == {overrides.ORPHAN} + assert listed["counts"] == { + "material": {overrides.ORPHAN: 3, overrides.EDITED: 1}, + "labor": {overrides.EDITED: 1}, + } + paged = client.get("/api/master-data/overrides", params={"size": 2, "page": 2}).json() + assert paged["total"] == 5 and len(paged["items"]) == 2 + everything = client.get("/api/master-data/overrides").json()[ + "items" + ] # labor 가 kind 차례로 앞이어도 + assert [i["state"] for i in everything] == [overrides.ORPHAN] * 3 + [overrides.EDITED] * 2 + res = client.post( + "/api/master-data/overrides/clear", json={"kind": "material", "state": overrides.ORPHAN} + ) + assert res.status_code == 200 and res.json()["removed"] == 3 + left = client.get("/api/master-data/overrides").json() + assert [(i["kind"], i["state"]) for i in left["items"]] == [ # 같은 state 안은 kind 차례 + ("labor", overrides.EDITED), + ("material", overrides.EDITED), + ] + assert ( + client.post("/api/master-data/overrides/clear", json={"kind": "material"}).status_code + == 422 + ) # 거름 없이 통째로 못 비움 + + +def test_줄은_있는데_칸이_사라진_덮개도_주인_없음(client: TestClient, store: Path) -> None: + rates = _get(client, "rate", size=500)["rows"] + fee = next(r for r in rates if r["@id"].startswith("rate_performance_guarantee_fee/brackets/")) + store.mkdir() + entry = {"rate_percent": {"value": 1, "original": 0.5, "source": "old.json"}} + (store / "rate.json").write_text( + json.dumps({"overrides": {fee["@id"]: entry}}), encoding="utf-8" + ) + items = client.get("/api/master-data/overrides", params={"kind": "rate"}).json()["items"] + assert [(i["row_id"], i["state"]) for i in items] == [(fee["@id"], overrides.ORPHAN)] + assert "@overrides" not in _row(client, "rate", fee["@id"]) # 없는 칸을 새로 만들지 않음 + + SOURCE_KEYS = { "source_id", "name", @@ -409,6 +476,12 @@ def test_우리_판은_출처표_글자가_아니라_파일에서_읽음( assert _get(client, "rate", size=1)["source"] == [] # 출처표가 없으면 빈 목록(모양은 그대로) +def test_모아_보기_항목에_단위(client: TestClient) -> None: + _put(client, "labor", "labor_const/1001", {"daily_wage_krw": 230000}) + (item,) = client.get("/api/master-data/overrides").json()["items"] + assert item["unit"] == "원" and item["column_label"] == "일 노임" + + def test_열_이름은_이름표에서만_옴(client: TestClient) -> None: """브레인 ② — 이름·판정은 한 곳에만. 합친 표 열 이름은 이름표 `merged_tables` 가 정본.""" labels = json.loads( @@ -467,8 +540,8 @@ def test_빈_칸은_어느_쪽으로_세워도_끝(client: TestClient) -> None: assert hourly[0] is not None and hourly[-1] is None # 계산 열도 세워짐 -def test_고친_값으로_세움(client: TestClient) -> None: - _edit(client, "labor", "labor_const/1003", "daily_wage_krw", 9_000_000) +def test_덮개_얹은_값으로_세움(client: TestClient) -> None: + _put(client, "labor", "labor_const/1003", {"daily_wage_krw": 9_000_000}) top = _get(client, "labor", sort="daily_wage_krw", desc=1, size=1)["rows"][0] assert top["@id"] == "labor_const/1003" and top["daily_wage_krw"] == 9_000_000 @@ -478,107 +551,54 @@ def test_sort_가_없으면_원본_차례(client: TestClient) -> None: assert _get(client, "machine", size=1)["rows"][0]["@id"] == "0101-0007" -def test_추가한_기계_줄도_셈이_섬(client: TestClient) -> None: - """카탈로그에 없는 기종 — 제원은 줄 값에서 · 운전경비 원단위가 없으니 손료만 서고 합계는 안 냄.""" - data = { - "machine_name": "시험 굴삭기", - "price_thousand_krw": 100000, - "loss_coefficient_per_hour": 0.0001, - } - (key,) = _save(client, "machine", added=[data]).json()["added"] - row = _get(client, "machine", size=1, page=614)["rows"][0] - assert row["@id"] == key and row["hourly_loss_krw"] == pytest.approx(10000) - assert row["hourly_total_krw"] is None and row["hourly_note"] - assert _save(client, "machine", added=[{"hourly_total_krw": 1}]).status_code == 400 # 계산 칸 +def test_줄의_뜻이_바뀌면_넷째_낱말(client: TestClient, store: Path) -> None: + """브레인 — 같은 코드에 다른 기준이 붙음(노임 3001~ 문화재→국가유산 · 자재 KS 개정 규격). + + 값만 보면 안 잡힘 → 덮개를 쓸 때 **값이 아닌 글자 칸**(이름·규격·단위…)을 함께 적어 두고 견줌. + """ + saved = _put(client, "labor", "labor_const/1001", {"daily_wage_krw": 230000}).json() + assert saved["@overrides"]["daily_wage_krw"]["state"] == overrides.EDITED + entry = json.loads((store / "labor.json").read_text(encoding="utf-8"))["overrides"] + meaning = entry["labor_const/1001"]["daily_wage_krw"]["meaning"] + assert meaning["occupation_name"] == "작업반장" # 이름·규격 같은 글자 칸만 + assert "daily_wage_krw" not in meaning and "hours_per_day" not in meaning # 값 칸은 안 적음 + assert "effective_date" not in meaning # 판 날짜는 갱신마다 바뀜 — 뜻 바뀜과 구별이 안 됨 + _put(client, "oil", "national_average/oil_diesel", {"price_krw_per_l": 1900}) + oil = json.loads((store / "oil.json").read_text(encoding="utf-8"))["overrides"] + assert "date" not in oil["national_average/oil_diesel"]["price_krw_per_l"]["meaning"] + entry["labor_const/1001"]["daily_wage_krw"]["meaning"]["occupation_name"] = "옛 직종 이름" + (store / "labor.json").write_text( + json.dumps({"schema_version": "1.0", "kind": "labor", "overrides": entry}), encoding="utf-8" + ) + mark = _row(client, "labor", "labor_const/1001")["@overrides"]["daily_wage_krw"] + assert mark["state"] == overrides.MEANING_CHANGED # 값은 그대로인데 줄의 뜻이 바뀜 + # 이름 칸이 여럿인 자료가 있어 **서버가 한 줄로 합쳐** 냄(화면이 합치면 판정이 두 벌) + assert mark["was"] == "labor_const · 1001 · 옛 직종 이름 · KRW/day · published" + assert mark["now"] == "labor_const · 1001 · 작업반장 · KRW/day · published" + listed = client.get("/api/master-data/overrides").json() + top = listed["items"][0] + assert top["state"] == overrides.MEANING_CHANGED # 값 틀림보다 더 세게 + assert (top["was"], top["now"]) == (mark["was"], mark["now"]) # 모아 보기에도 같은 둘 + assert overrides.STATE_ORDER[0] == overrides.MEANING_CHANGED + assert all(i.get("was") for i in listed["items"] if i["state"] == overrides.MEANING_CHANGED) -# ── 저장소 SQL 흐름 — 가짜 커넥션(DB 없이) ────────────────────────────── - - -class _Cursor: - def __init__(self, db: SimpleNamespace) -> None: - self.db = db - - async def __aenter__(self): - return self - - async def __aexit__(self, *_): - return False - - async def execute(self, sql: str, params=()) -> None: - self.db.sql.append(" ".join(sql.split())) - - async def fetchone(self): - return (self.db.revision,) - - async def fetchall(self): - return [(key,) for key in self.db.keys] - - -class _Connection: - def __init__(self, db: SimpleNamespace) -> None: - self.db = db - - def cursor(self, *_): - return _Cursor(self.db) - - async def begin(self) -> None: - self.db.log.append("begin") - - async def commit(self) -> None: - self.db.log.append("commit") - - async def rollback(self) -> None: - self.db.log.append("rollback") - - -class _Pool: - def __init__(self, db: SimpleNamespace) -> None: - self.db = db - - def acquire(self): - return self - - async def __aenter__(self): - return _Connection(self.db) - - async def __aexit__(self, *_): - return False - - -def _writes(db: SimpleNamespace) -> list[str]: - return [ - s - for s in db.sql - if s.startswith(("UPDATE master_base_price", "INSERT INTO master_base_price")) - ] - - -def test_저장소는_판을_잠그고_보며_틀리면_되돌림(monkeypatch: pytest.MonkeyPatch) -> None: - db = SimpleNamespace(sql=[], log=[], revision=4, keys=[]) - monkeypatch.setattr(repo, "get_db_pool", lambda: _Pool(db)) - with pytest.raises(repo.RevisionConflict): - asyncio.run(repo.save("labor", 3, {"a": {"x": 1}}, {}, ["b"], 7)) - assert db.log == ["begin", "rollback"] and not _writes(db) - db.sql.clear() - db.log.clear() - assert asyncio.run(repo.save("labor", 4, {"a": {"x": 1}}, {"added/1": {"y": 2}}, ["b"], 7)) == 5 - assert db.log == ["begin", "commit"] - lock = next(i for i, s in enumerate(db.sql) if s.endswith("FOR UPDATE")) - bump = next(i for i, s in enumerate(db.sql) if s.startswith("UPDATE master_revision")) - writes = [db.sql.index(s) for s in _writes(db)] - assert len(writes) == 3 and lock < min(writes) and max(writes) < bump == len(db.sql) - 1 - assert "SET is_deleted = 1" in _writes(db)[-1] # 지우기는 표시만 - - -def test_저장소_되돌리기는_없는_줄이면_아무것도_안_씀(monkeypatch: pytest.MonkeyPatch) -> None: - db = SimpleNamespace(sql=[], log=[], revision=2, keys=["a"]) - monkeypatch.setattr(repo, "get_db_pool", lambda: _Pool(db)) - with pytest.raises(repo.UnknownRows): - asyncio.run(repo.reset("labor", ["a", "없음"], 7)) - assert db.log == ["begin", "rollback"] and not _writes(db) - db.sql.clear() - db.log.clear() - assert asyncio.run(repo.reset("labor", ["a", "a"], 7)) == 3 - assert db.log == ["begin", "commit"] - assert [s.split(" SET ")[1][:13] for s in _writes(db)] == ["data = seed, ", "is_deleted = "] +def test_뜻_칸은_이름표가_가림_옛_덮개는_그대로(client: TestClient, store: Path) -> None: + _put(client, "machine", "0101-0007", {"price_thousand_krw": 80000}) + meaning = json.loads((store / "machine.json").read_text(encoding="utf-8"))["overrides"][ + "0101-0007" + ]["price_thousand_krw"]["meaning"] + assert meaning["machine_name"] == "불도저(무한궤도)" and meaning["specification"] == "7" + assert not [k for k in meaning if k in ("price_thousand_krw", "loss_coefficient_per_hour")] + store.mkdir( + exist_ok=True + ) # 뜻 칸이 없던 옛 덮개 — 그대로 edited 로 둠(없는 것을 지어내지 않음) + (store / "material.json").write_text( + json.dumps( + {"overrides": {"10023392": {"price_krw": {"value": 30, "original": 22, "source": "x"}}}} + ), + encoding="utf-8", + ) + assert ( + _row(client, "material", "10023392")["@overrides"]["price_krw"]["state"] == overrides.EDITED + ) diff --git a/resources/tester/test_z01_base_tables.py b/resources/tester/test_z01_base_tables.py index e0bf710b..88b17725 100644 --- a/resources/tester/test_z01_base_tables.py +++ b/resources/tester/test_z01_base_tables.py @@ -19,9 +19,9 @@ ROOT = Path(__file__).resolve().parents[2] import pytest from fastapi import FastAPI from fastapi.testclient import TestClient -from helper_z01_fake_repo import install from Z01_MasterData import Z01_MasterData_BasePrices as base_prices +from Z01_MasterData import Z01_MasterData_Overrides as overrides from Z01_MasterData import Z01_MasterData_Router as router_module from Z01_MasterData import Z01_MasterData_WorkItems as work_items @@ -40,10 +40,10 @@ NEW_KINDS = ( @pytest.fixture -def client(monkeypatch: pytest.MonkeyPatch) -> TestClient: +def client(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> TestClient: from common_util.common_util_auth import verify_session - install(monkeypatch) # DB 가짜 — 파일 원본을 초기값으로 주입한 모양 + monkeypatch.setattr(overrides, "OVERRIDE_DIR", tmp_path / "data_master_override") app = FastAPI() app.include_router(router_module.router) app.dependency_overrides[verify_session] = lambda: {"user_id": 7, "role": "SYSTEM_ADMIN"} @@ -69,13 +69,13 @@ def test_아홉이_기초단가와_같은_길로_섬(client: TestClient) -> None table = _get(client, kind, size=500) assert table["total"] == len(table["rows"]) > 0, kind ids = _ids(table) - assert len(ids) == len(set(ids)), kind # ⭐ 열쇠가 겹치면 (kind, row_key) 한 줄이 둘을 덮음 + assert len(ids) == len(set(ids)), kind # ⭐ 열쇠가 겹치면 덮개가 엉뚱한 줄에 붙음 assert set(table["editable"]) <= {c["key"] for c in table["columns"]}, kind assert table["editable"] or kind == "rebar_complexity", kind # 철근은 값이 다 계산·글 assert set(table["locked"]) | set(table["editable"]) == set(table["sortable"]), kind axis = {a for r in base_prices.base_rows(kind) for a in r.get("@axis", ())} assert {table["locked"][c] for c in axis if c in table["locked"]} == { - "자료 열쇠 — 바꾸면 다른 표가 이 줄을 못 찾음" + "자료 열쇠 — 바꾸면 덮개·다른 표가 이 줄을 못 찾음" }, kind # 축 칸은 「왜 못 고치나」 가 원문 칸과 달라야 함 assert any("새로 만드는 프로젝트" in line for line in table["notice"]), kind assert table["source"] == [], kind # 출처표엔 아직 이 아홉이 없음 — 빈 목록(모양은 그대로) @@ -165,39 +165,35 @@ def test_아홉의_고칠_칸은_값_칸(client: TestClient) -> None: ) -def _save(client: TestClient, kind: str, row_key: str, column: str, value): - revision = _get(client, kind, size=1)["revision"] - return client.put( - f"/api/master-data/base-prices/{kind}", - json={ - "base_revision": revision, - "edits": [{"row_key": row_key, "column": column, "value": value}], - }, +def test_고치기도_같은_길(client: TestClient, tmp_path: Path) -> None: + res = client.put( + "/api/master-data/base-prices/stone_kind/wedge_stone_m3_per_m2/깬잡석/25", + json={"values": {"m3_per_m2": 0.1}}, ) - - -def test_고치기도_같은_길(client: TestClient) -> None: - res = _save(client, "stone_kind", "wedge_stone_m3_per_m2/깬잡석/25", "m3_per_m2", 0.1) assert res.status_code == 200, res.text - rows = {r["@id"]: r for r in _get(client, "stone_kind", size=500)["rows"]} - row = rows["wedge_stone_m3_per_m2/깬잡석/25"] - assert row["m3_per_m2"] == 0.1 and row["changed_columns"] == ["m3_per_m2"] - assert [k for k, r in rows.items() if r["changed_columns"]] == [ - "wedge_stone_m3_per_m2/깬잡석/25" - ] - blocked = _save(client, "stone_kind", "wedge_stone_m3_per_m2/깬잡석/25", "stone_kind", "딴 돌") + row = res.json() + assert row["m3_per_m2"] == 0.1 + assert row["@overrides"]["m3_per_m2"]["original"] == 0.09 + assert (tmp_path / "data_master_override" / "stone_kind.json").is_file() + listed = client.get("/api/master-data/overrides", params={"kind": "stone_kind"}).json() + assert [i["row_id"] for i in listed["items"]] == ["wedge_stone_m3_per_m2/깬잡석/25"] + blocked = client.put( + "/api/master-data/base-prices/stone_kind/wedge_stone_m3_per_m2/깬잡석/25", + json={"values": {"stone_kind": "딴 돌"}}, + ) assert blocked.status_code == 400 and "자료 열쇠" in blocked.text # 축 칸은 못 고침 - assert not {"@axis", "@source", "@data"} & set(row) # 안쪽 칸은 안 내보냄 + assert "@axis" not in row and "@source" not in row # 안쪽 칸은 안 내보냄 # 같은 칸이 어느 줄에선 값이고 어느 줄에선 축임(사용횟수) — 축인 줄에선 막혀야 함 - # ⚠ 주입 data 에 `@axis` 가 없어도 막힘(축은 파일 원본에서 읽음 · 가짜 주입은 '@' 칸을 뺌) - axis_edit = _save( - client, "formwork_reuse", "reuse_ratio_pct/plywood_material_pct/2", "reuse_count", 3 + axis_edit = client.put( + "/api/master-data/base-prices/formwork_reuse/reuse_ratio_pct/plywood_material_pct/2", + json={"values": {"reuse_count": 3}}, ) assert axis_edit.status_code == 400 and "자료 열쇠" in axis_edit.text - value_edit = _save(client, "formwork_reuse", "reuse_by_class/복잡한 구조", "reuse_count", 3) - assert value_edit.status_code == 200 - reuse = {r["@id"]: r for r in _get(client, "formwork_reuse", size=500)["rows"]} - assert reuse["reuse_by_class/복잡한 구조"]["reuse_count"] == 3 + value_edit = client.put( + "/api/master-data/base-prices/formwork_reuse/reuse_by_class/복잡한 구조", + json={"values": {"reuse_count": 3}}, + ) + assert value_edit.status_code == 200 and value_edit.json()["reuse_count"] == 3 def test_코드에_박혔던_기계_밑값이_마스터로_나옴(client: TestClient) -> None: diff --git a/resources/tester/test_z01_master_draft.py b/resources/tester/test_z01_master_draft.py deleted file mode 100644 index 30135a5f..00000000 --- a/resources/tester/test_z01_master_draft.py +++ /dev/null @@ -1,184 +0,0 @@ -"""Z01 고친 것 초안 — [저장] 전까지 sessionStorage 에만 · 판이 다르면 버림 (PLAN 1-0 · 1-4 · 2026-09-18). - - ① 기초단가 — 서버 값과 같아지면 고침에서 빠짐 · 지울 줄의 칸 고침은 안 보냄 · 새 줄은 data 만 보냄 - ② 같은 판이면 탭을 다시 열어도 초안이 살아남 · 판이 다르면 비고 저장소에서도 지움 - ③ 공종 — 보낼 몸은 지울 줄을 빼고 화면 표시 칸(tmp·deleted)을 뗌(빠지면 삭제 = 전체 줄 보내기) - ④ 고친 것이 없으면 dirty 아님 · 고치면 dirty · 새 줄은 「added」 · 고친 칸만 짚음 - ⑤ 갈래는 처음 나온 차례로 묶음 · 새 줄은 제 갈래 끝 바로 뒤(보낸 차례 = sort_order) - ⑥ 보낼 줄은 id + 계약 칸 열하나만 — GET 전용 칸(sort_order·is_added·changed_columns)이 실리면 422 -TS 를 실제로 돌린다(`test_z01_master_cells` 와 같은 방식). -""" - -from __future__ import annotations - -import json -import subprocess -from pathlib import Path - -PROJECT_ROOT = Path(__file__).resolve().parents[2] -TSC = PROJECT_ROOT / "config" / "node_modules" / "typescript" / "bin" / "tsc" -SOURCE = PROJECT_ROOT / "Z01_MasterData" / "Z01_MasterData_UI_Draft.ts" - -_RUNNER = """ -import { writeFileSync } from "node:fs"; - -// 브라우저 sessionStorage 대역 -const store = new Map(); -globalThis.sessionStorage = { - getItem: (k) => (store.has(k) ? store.get(k) : null), - setItem: (k, v) => store.set(k, String(v)), - removeItem: (k) => store.delete(k), -}; -const { - BaseDraft, addRow, changedFields, freshBody, groupByVariant, isDirty, workItemPayload, -} = await import("./Z01_MasterData_UI_Draft.js"); - -// ① 기초단가 -const base = new BaseDraft("base:labor", 7); -base.setEdit("labor_const/1001", "daily_wage_krw", 250000, 215907); -base.setEdit("labor_const/1002", "daily_wage_krw", 100, 100); // 서버 값과 같음 — 안 쌓임 -base.setEdit("labor_const/1003", "daily_wage_krw", 1, 2); -base.setEdit("labor_const/1003", "daily_wage_krw", 2, 2); // 되돌림 — 빠짐 -base.setEdit("labor_const/9999", "daily_wage_krw", 5, 4); -base.toggleDelete("labor_const/9999"); -const added = base.addRow(); -base.setAdded(added.tmp, "occupation_name", "새 직종"); -base.setAdded(added.tmp, "daily_wage_krw", 300000); -base.setAdded(added.tmp, "daily_wage_krw", null); // 비우면 칸을 뺌 -const payload = base.payload(); -const count = base.count; -const stored = JSON.parse(store.get("z01-draft:base:labor")); - -// ② 같은 판이면 살아남 · 다른 판이면 비고 저장소에서 지움 -const again = new BaseDraft("base:labor", 7); -const restored = again.payload(); -const newer = new BaseDraft("base:labor", 8); -const dropped = { count: newer.count, left: store.has("z01-draft:base:labor") }; -const toggled = new BaseDraft("base:oil", 1); -toggled.toggleDelete("x"); -toggled.toggleDelete("x"); -const emptied = { count: toggled.count, left: store.has("z01-draft:base:oil") }; - -// ③④⑤ 공종 -const row = (id, variant, extra = {}) => ({ - id, variant, resource_kind: "labor", resource_key: "labor_const/1001", resource_name: "보통인부", - resource_spec: "", amount: 0.5, amount_unit: "인", alternative_amount: null, - group_ratio_pct: null, raw_cell: null, pum_table_id: "T-1", - // GET 전용 칸 — PUT 에 실리면 422(extra=forbid) - sort_order: id, is_added: false, changed_columns: [], ...extra, -}); -const detail = { - item: { work_item_key: "FW-00001", axis: "forest", code: null, number: "1-1", name: "벌목", - path_name: "벌목", parent_key: null, parent_mode: null, basis_quantity: 1, - basis_unit: "ha", status: "needs_input", edition: "2026", revision: 3 }, - rows: [row(1, "갑"), row(2, "을"), row(3, "갑")], - source: [], notes: [], -}; -const body = freshBody(detail); -const clean = isDirty(detail, body); -body.rows[0].amount = 0.7; -body.rows[1].deleted = true; -addRow(body, "을", "new-1"); -body.item.status = "reviewed"; -const sent = workItemPayload(detail.item.revision, body); - -writeFileSync(process.argv[2], JSON.stringify({ - payload, count, stored, - restored, dropped, emptied, - clean, - dirty: isDirty(detail, body), - sent, - changed: [...changedFields(body.rows[0], detail.rows)], - addedRow: changedFields(body.rows[2], detail.rows), - untouched: [...changedFields(body.rows[3], detail.rows)], - groups: groupByVariant(body.rows), - freshUntouched: freshBody(detail).rows[0].amount, -})); -""" - - -def test_초안_쌓기와_보낼_몸(tmp_path: Path) -> None: - out = tmp_path / "js" - subprocess.run( # noqa: S603 — 고정 실행 파일 - [ - "node", - str(TSC), - str(SOURCE), - "--outDir", - str(out), - "--module", - "esnext", - "--target", - "es2022", - "--ignoreConfig", - "--noCheck", - "--noResolve", - ], - cwd=str(PROJECT_ROOT), - check=True, - capture_output=True, - ) - (out / "runner.mjs").write_text(_RUNNER, encoding="utf-8") - result = tmp_path / "output.json" - subprocess.run( # noqa: S603 - ["node", str(out / "runner.mjs"), str(result)], - cwd=str(PROJECT_ROOT), - check=True, - capture_output=True, - ) - got = json.loads(result.read_text(encoding="utf-8")) - - # ① 서버 값과 같은 고침은 안 쌓임 · 지울 줄(9999)의 칸 고침은 안 보냄 · 새 줄은 data 만 - assert got["payload"] == { - "base_revision": 7, - "edits": [ - {"row_key": "labor_const/1001", "column": "daily_wage_krw", "value": 250000}, - ], - "added": [{"data": {"occupation_name": "새 직종"}}], - "deleted": ["labor_const/9999"], - } - # 고친 칸 2(1001·9999) + 새 줄 1 + 지울 줄 1 - assert got["count"] == 4 - assert got["stored"]["revision"] == 7 - # ② 같은 판이면 그대로 살아남 · 판이 바뀌면 비고 저장소에서도 지움 · 다 되돌리면 저장소에서 빠짐 - assert got["restored"] == got["payload"] - assert got["dropped"] == {"count": 0, "left": False} - assert got["emptied"] == {"count": 0, "left": False} - # ③ 지울 줄(id 2) 빠짐 · 새 줄은 id 없이 · 화면 표시 칸 없음 · 머리 상태 실림 - assert got["clean"] is False - assert got["dirty"] is True - sent = got["sent"] - assert sent["base_revision"] == 3 - assert sent["item"] == { - "name": "벌목", - "basis_quantity": 1, - "basis_unit": "ha", - "status": "reviewed", - } - assert [r.get("id") for r in sent["rows"]] == [1, None, 3] - # ⑥ id + 계약 칸만(새 줄은 id 없음) · 글자 칸은 null 아닌 빈 글자 - fields = { - "variant", - "resource_kind", - "resource_key", - "resource_name", - "resource_spec", - "amount", - "amount_unit", - "alternative_amount", - "group_ratio_pct", - "raw_cell", - "pum_table_id", - } - assert [set(r) for r in sent["rows"]] == [fields | {"id"}, fields, fields | {"id"}] - assert sent["rows"][1]["variant"] == "을" and sent["rows"][1]["pum_table_id"] == "" - # ④ 고친 칸만 · 새 줄은 줄째 · 안 고친 줄은 빈 목록 · 서버 값(detail)은 안 건드림 - assert got["changed"] == ["amount"] - assert got["addedRow"] == "added" - assert got["untouched"] == [] - assert got["freshUntouched"] == 0.5 - # ⑤ 갈래는 처음 나온 차례(갑 → 을) · 새 줄은 제 갈래로 - assert got["groups"] == [ - {"variant": "갑", "indexes": [0, 3]}, - {"variant": "을", "indexes": [1, 2]}, - ] diff --git a/resources/tester/test_z01_work_item_edit.py b/resources/tester/test_z01_work_item_edit.py deleted file mode 100644 index 040b3475..00000000 --- a/resources/tester/test_z01_work_item_edit.py +++ /dev/null @@ -1,235 +0,0 @@ -"""Z01 공종 편집 — 규칙(순수 함수) · 요청 모델 · 저장 흐름(409·422·전부 아니면 전무) · 등록. - -(2026-09-18 브레인 PLAN 1-0 계약 · sub_laptop_3) DB 없이 — 저장 흐름은 가짜 커넥션·저장소로 훑음. -""" - -from __future__ import annotations - -import importlib -from contextlib import asynccontextmanager -from decimal import Decimal - -import pytest -from fastapi import FastAPI -from fastapi.routing import APIRoute -from fastapi.testclient import TestClient -from pydantic import ValidationError - -from common_util.common_util_auth import require_system_admin, verify_session -from Z01_MasterData import Z01_MasterData_Router_WorkItems as router_module -from Z01_MasterData import Z01_MasterData_WorkItems as work_items - -SEED_ROW = {"resource_kind": "labor", "resource_key": "L-001", "amount": 1.5, "sort_order": 0} - - -def _row(row_id, seed=SEED_ROW, **values): - base = {"id": row_id, "variant": "", "resource_kind": "labor", "resource_key": "L-001"} - return {**base, "amount": Decimal("1.500000"), "sort_order": 0, "seed": seed, **values} - - -# ── 규칙 ── - - -def test_고친_칸은_초기값과_값으로_비교함() -> None: - assert work_items.changed_columns(_row(1), SEED_ROW, work_items.ROW_FIELDS) == [] - changed = _row(1, amount=Decimal("2")) - assert work_items.changed_columns(changed, SEED_ROW, work_items.ROW_FIELDS) == ["amount"] - assert work_items.changed_columns(_row(1, seed=None), None, work_items.ROW_FIELDS) == [] - - -def test_검사는_남의_줄_겹친_줄_없는_자원을_막음() -> None: - rows = [ - {"id": 1, "resource_key": "L-001"}, - {"id": 1, "resource_key": None}, - {"id": 99, "resource_key": None}, - {"id": None, "resource_key": "없는열쇠"}, - ] - errors = work_items.check_rows(rows, existing_ids={1, 2}, known_keys={"L-001"}) - assert len(errors) == 3 - assert "두 번" in errors[0] and "id 99" in errors[1] and "없는열쇠" in errors[2] - assert work_items.check_rows(rows[:1], {1}, {"L-001"}) == [] - - -def test_전체_줄_보내기는_바뀐_줄만_쓰고_빠진_줄은_숨기거나_지움() -> None: - existing = [_row(1), _row(2, sort_order=1), _row(3, seed=None, sort_order=2)] - same = {f: existing[0].get(f) for f in work_items.ROW_FIELDS} | {"id": 1, "amount": 1.5} - new = {"id": None, "resource_kind": "material", "resource_key": None, "amount": None} - plan = work_items.plan_rows(existing, [same, new]) - assert plan["updates"] == [] # 1.500000 = 1.5 · 순서도 그대로 - assert plan["inserts"][0]["resource_kind"] == "material" - assert plan["inserts"][0]["sort_order"] == 1 - assert plan["hide"] == [2] # 초기값 줄 — 숨김(되살릴 수 있게) - assert plan["drop"] == [3] # 관리자 추가 줄 — 지움 - - moved = work_items.plan_rows(existing[:2], [{**same, "id": 2}, same]) - assert [u["id"] for u in moved["updates"]] == [2, 1] # 순서만 바뀌어도 sort_order 를 씀 - - -def test_초기값으로는_seed_칸만_살리고_추가_줄은_지움() -> None: - head = {"id": 7, "name": "고친 이름", "seed": {"name": "원 이름", "status": "partial"}} - rows = [_row(1, amount=Decimal("9")), _row(2, is_deleted=1), _row(3, seed=None)] - plan = work_items.reset_plan(head, rows) - assert plan["head"] == {"name": "원 이름", "status": "partial"} - assert [u["id"] for u in plan["updates"]] == [1, 2] - assert plan["updates"][0]["amount"] == 1.5 - assert plan["drop"] == [3] and plan["inserts"] == [] and plan["hide"] == [] - - -def test_상세는_seed_를_안_내보내고_고친_칸만_알림() -> None: - head = {"id": 7, "work_item_key": "FW-00001", "name": "새", "status": "partial"} - head |= {"seed": {"name": "옛"}, "source": [{"pum_table_id": "T1"}], "notes": ["[주] 1"]} - out = work_items.detail(head, [_row(1), _row(2, seed=None)], revision=4) - assert out["item"]["revision"] == 4 and out["item"]["changed_columns"] == ["name"] - assert "seed" not in out["item"] and "id" not in out["item"] - assert out["source"] == [{"pum_table_id": "T1"}] and out["notes"] == ["[주] 1"] - assert [r["is_added"] for r in out["rows"]] == [False, True] - assert out["rows"][0]["id"] == 1 and "seed" not in out["rows"][0] - - -# ── 요청 모델 ── - - -def _body(**row): - item = {"name": "공종", "status": "reviewed"} - return {"base_revision": 3, "item": item, "rows": [{"resource_kind": "labor", **row}]} - - -@pytest.mark.parametrize( - "row", - [{"amount": -1}, {"resource_key": ""}, {"resource_kind": "oil"}, {"unknown": 1}], -) -def test_요청_모델은_음수_빈열쇠_모르는_종류_모르는_칸을_막음(row) -> None: - with pytest.raises(ValidationError): - router_module.WorkItemSave.model_validate(_body(**row)) - - -# ── 저장 흐름(가짜 커넥션) ── - - -class _Connection: - def __init__(self) -> None: - self.log: list[str] = [] - - async def begin(self) -> None: - self.log.append("begin") - - async def commit(self) -> None: - self.log.append("commit") - - async def rollback(self) -> None: - self.log.append("rollback") - - -@pytest.fixture -def client(monkeypatch): - connection = _Connection() - - class _Pool: - @asynccontextmanager - async def acquire(self): - yield connection - - head = {"id": 7, "work_item_key": "FW-00001", "name": "공종", "status": "partial"} - head |= {"seed": {"name": "공종"}, "source": [], "notes": []} - - async def fetch_item(_c, key, lock=False): - return dict(head) if key == "FW-00001" else None - - async def fetch_rows(_c, _item_id, with_deleted=False): - return [_row(1)] - - async def revision(_c, _scope, lock=False): - return 3 - - async def known_resource_keys(_c, keys): - return keys & {"L-001"} - - async def write(_c, *args): - connection.log.append("write") - - async def bump_revision(_c, _scope): - connection.log.append("bump") - - async def list_items(_c, **picked): - connection.log.append(picked["status"]) - return {"items": [], "total": 2, "counts": {"partial": 2}} - - monkeypatch.setattr(router_module, "get_db_pool", lambda: _Pool()) - for name, fake in { - "list_items": list_items, - "fetch_item": fetch_item, - "fetch_rows": fetch_rows, - "revision": revision, - "known_resource_keys": known_resource_keys, - "write": write, - "bump_revision": bump_revision, - }.items(): - monkeypatch.setattr(router_module.repo, name, fake) - app = FastAPI() - app.include_router(router_module.router) - app.dependency_overrides[verify_session] = lambda: {"user_id": 42} - test_client = TestClient(app) - test_client.log = connection.log - return test_client - - -URL = "/api/master-data/work-items/FW-00001" - - -def test_낡은_revision_은_409_이고_아무것도_안_씀(client) -> None: - response = client.put(URL, json={**_body(id=1, resource_key="L-001"), "base_revision": 2}) - assert response.status_code == 409 - assert client.log == ["begin", "rollback"] - - -def test_없는_자원_열쇠는_422_이고_아무것도_안_씀(client) -> None: - response = client.put(URL, json=_body(resource_key="없는열쇠")) - assert response.status_code == 422 and "없는열쇠" in response.json()["detail"] - assert client.log == ["begin", "rollback"] - - -def test_맞는_저장은_쓰고_revision_올리고_새_상세를_줌(client) -> None: - response = client.put(URL, json=_body(id=1, resource_key="L-001", amount=2)) - assert response.status_code == 200, response.text - assert client.log == ["begin", "write", "bump", "commit"] - assert response.json()["status"] == "success" and response.json()["item"]["revision"] == 3 - - -def test_목록은_상태별_개수를_다_채우고_모르는_상태는_막음(client) -> None: - body = client.get("/api/master-data/work-items?status=").json() - assert body["counts"] == {s: 2 if s == "partial" else 0 for s in work_items.STATUSES} - assert client.get("/api/master-data/work-items?status=needs_input").status_code == 200 - assert client.get("/api/master-data/work-items?status=bogus").status_code == 422 - assert client.log == ["", "needs_input"] - - -def test_초기값으로와_없는_공종(client) -> None: - assert client.post(URL + "/reset").status_code == 200 - assert client.log == ["begin", "write", "bump", "commit"] - assert client.get("/api/master-data/work-items/FW-99999").status_code == 404 - - -# ── 등록 ── - - -def _calls(dependant) -> set: - found = set() - for sub in dependant.dependencies: - found.add(sub.call) - found |= _calls(sub) - return found - - -def test_공종_편집_경로는_시스템_관리자만() -> None: - app = importlib.import_module("main").app - routes = {(r.path, m) for r in app.routes if isinstance(r, APIRoute) for m in r.methods} - wanted = { - ("/api/master-data/work-items", "GET"), - ("/api/master-data/work-items/{key}", "GET"), - ("/api/master-data/work-items/{key}", "PUT"), - ("/api/master-data/work-items/{key}/reset", "POST"), - } - assert wanted <= routes - for route in app.routes: - if isinstance(route, APIRoute) and route.path.startswith("/api/master-data/work-items"): - assert {verify_session, require_system_admin} <= _calls(route.dependant) diff --git a/resources/tester/test_z01_work_items.py b/resources/tester/test_z01_work_items.py index ec12ea20..5bce9ff6 100644 --- a/resources/tester/test_z01_work_items.py +++ b/resources/tester/test_z01_work_items.py @@ -12,17 +12,17 @@ from pathlib import Path import pytest from fastapi import FastAPI from fastapi.testclient import TestClient -from helper_z01_fake_repo import install +from Z01_MasterData import Z01_MasterData_Overrides as overrides from Z01_MasterData import Z01_MasterData_Router as router_module from Z01_MasterData import Z01_MasterData_WorkItems as work_items @pytest.fixture -def client(monkeypatch: pytest.MonkeyPatch) -> TestClient: +def client(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> TestClient: from common_util.common_util_auth import verify_session - install(monkeypatch) # 기초단가 표 목록·줄 수가 DB 를 읽음 — 가짜로 + monkeypatch.setattr(overrides, "OVERRIDE_DIR", tmp_path / "data_master_override") app = FastAPI() app.include_router(router_module.router) app.dependency_overrides[verify_session] = lambda: {"user_id": 7, "role": "SYSTEM_ADMIN"} @@ -131,15 +131,10 @@ def test_불변_열쇠가_오면_id_로_씀_자료_파일은_판_id_로_가림( assert _get(client, "work_item_forest")["total"] == 0 # 산림 파일은 이 폴더에 없음 res = client.put( - "/api/master-data/base-prices/work_item_const", - json={ - "base_revision": 0, - "edits": [{"row_key": "CW-00002#01", "column": "name", "value": "바꿈"}], - }, + "/api/master-data/base-prices/work_item_const/CW-00002%2301", + json={"values": {"name": "바꿈"}}, ) - assert ( - res.status_code == 400 and "고칠 수 없는 표" in res.json()["message"] - ) # 공종은 /work-items 몫 + assert res.status_code == 400 and "공종 축 뼈대" in res.json()["detail"] def test_거르기는_자료에_있는_가름만_서버가_판정(client: TestClient) -> None: diff --git a/ui_template/ui_template_locale_b3.ts b/ui_template/ui_template_locale_b3.ts index fd7cab5e..ccc0850a 100644 --- a/ui_template/ui_template_locale_b3.ts +++ b/ui_template/ui_template_locale_b3.ts @@ -142,105 +142,68 @@ export const ui_locales_b3 = { Z01_MasterData_Title: ["마스터 데이터", "Master Data"], Z01_MasterData_Tree: ["마스터 트리", "Master tree"], /* ⚠ 갈래·표 이름은 사전에 두지 않음 — 서버(이름표)가 줌. 화면이 들면 kind 가 늘 때 빠짐 */ + Z01_MasterData_List_Kind: ["표", "Table"], + Z01_MasterData_Overrides: ["고친 것 모아 보기", "Edited values"], Z01_MasterData_Edit_Can: [ - "고칠 수 있는 칸 — 눌러 고치고 Enter (Esc 취소) · [저장]을 눌러야 반영", - "Editable — click, type, Enter (Esc cancels) · applied on [Save]", + "고칠 수 있는 칸 — 눌러 고치고 Enter 로 저장 (Esc 취소)", + "Editable — click, type, Enter to save (Esc cancels)", ], Z01_MasterData_Edit_Locked: ["못 고치는 칸", "Not editable"], Z01_MasterData_Edit_NotListed: ["고칠 수 있는 칸 목록에 없음", "Not in the editable list"], + Z01_MasterData_Edit_RevertTo: ["원래 값 {value} 으로 되돌리기", "Revert to original {value}"], + Z01_MasterData_Edit_TakeSource: ["새 원본 값 {value} 으로 받기", "Take new source value {value}"], + Z01_MasterData_Edit_OriginalWas: ["고칠 때 원본 {value}", "source when edited {value}"], Z01_MasterData_Edit_Invalid: [ "「{value}」 를 수로 못 읽음", "Cannot read 「{value}」 as a number", ], - Z01_MasterData_Edit_NotSaved: ["⚠ 안 들어감 — {value}", "⚠ Not applied — {value}"], + Z01_MasterData_Edit_NotSaved: ["⚠ 저장 안 됨 — {value}", "⚠ Not saved — {value}"], + Z01_MasterData_Edit_Saved: ["저장했음 — 덮개 파일에 쌓임", "Saved to the override file"], + Z01_MasterData_Edit_Reverted: ["덮개를 뺐음 — 원본 값을 씀", "Override removed — using source"], Z01_MasterData_Edit_Failed: ["저장 못 함", "Save failed"], Z01_MasterData_Formula: ["산출근거", "Basis"], - /* --- Z01 고치기 — [저장] 한 번에 보냄(자동저장 금지 · PLAN 1-0) --- */ - Z01_MasterData_Save: ["저장", "Save"], - Z01_MasterData_Discard: ["고친 것 버리기", "Discard edits"], - Z01_MasterData_AddRow: ["줄 추가", "Add row"], - Z01_MasterData_DeleteRow: ["줄 삭제", "Delete row"], - Z01_MasterData_UndeleteRow: ["삭제 취소", "Undo delete"], - Z01_MasterData_Reset: ["초기값으로", "Reset to initial"], - Z01_MasterData_ResetConfirm: [ - "고른 줄을 초기값으로 되돌림 — 바로 저장됨(관리자가 추가한 줄은 지워짐)", - "Reset the picked row to its initial value — saved at once (admin-added rows are removed)", + Z01_MasterData_State_Edited: ["고쳐짐 — 원래 값 {value}", "Edited — original {value}"], + Z01_MasterData_State_SourceChanged: [ + "⚠ 고친 뒤 원본이 바뀜 — 고친 값을 그대로 씀 · 새 원본 값 {value}", + "⚠ Source changed after edit — edited value still used · new source {value}", ], - Z01_MasterData_ResetBlocked: [ - "저장 안 한 고침이 있음 — 먼저 [저장]하거나 [고친 것 버리기]", - "Unsaved edits — save or discard them first", + Z01_MasterData_State_MeaningChanged: [ + "⛔ 고쳐짐 — 줄의 뜻이 바뀜(같은 번호에 다른 물건)", + "⛔ Edited — the row now means something else (same code, different item)", ], - Z01_MasterData_ResetDone: ["초기값으로 되돌렸음", "Reset to initial value"], - Z01_MasterData_Saved: ["저장했음", "Saved"], - Z01_MasterData_Unsaved: ["저장 안 한 고침이 있음", "There are unsaved edits"], - Z01_MasterData_Draft_Edits: ["고친 칸", "Edited cells"], - Z01_MasterData_Draft_Added: ["추가 줄", "Added rows"], - Z01_MasterData_Draft_Deleted: ["삭제 줄", "Deleted rows"], - Z01_MasterData_Draft_Pending: ["[저장]해야 반영됨", "applied on [Save]"], - Z01_MasterData_Draft_None: ["고친 것 없음", "No edits"], - Z01_MasterData_Draft_Stale: [ - "⚠ 다른 곳에서 먼저 저장됨 — 이 초안은 저장 못 함 · [고친 것 버리기]로 새로 읽을 것", - "⚠ Saved elsewhere first — this draft cannot be saved · discard to reload", + Z01_MasterData_State_MeaningMissing: [ + "⛔ 옛 이름·지금 이름을 서버가 안 줌 — 버그", + "⛔ Server sent no before/after row names — bug", ], - Z01_MasterData_Cell_Draft: ["저장 안 한 고침 — {value}", "Unsaved edit — {value}"], - Z01_MasterData_Cell_Changed: ["초기값과 다름(저장된 고침)", "Differs from the initial value"], - Z01_MasterData_Row_Added: ["관리자가 추가한 줄", "Row added by an admin"], - Z01_MasterData_Row_New: ["새 줄 — 저장 전", "New row — not saved yet"], - /* --- Z01 공종 편집 (PLAN 1-4) --- */ - Z01_WorkItem_Title: ["공종 편집", "Work items"], - Z01_WorkItem_Axis_Forest: ["산림 공종", "Forest"], - Z01_WorkItem_Axis_Const: ["건설 공종", "Construction"], - Z01_WorkItem_Pick: ["왼쪽 목록에서 공종을 고를 것", "Pick a work item from the list"], - Z01_WorkItem_Status: ["상태", "Status"], - Z01_WorkItem_Status_All: ["전부", "All"], - Z01_WorkItem_Status_NeedsInput: ["입력 필요", "Needs input"], - Z01_WorkItem_Status_Partial: ["일부 못 맞춤", "Partly unmatched"], - Z01_WorkItem_Status_AutoOk: ["자동 완료", "Auto OK"], - Z01_WorkItem_Status_NotItem: ["공종 아님", "Not a work item"], - Z01_WorkItem_Status_Reviewed: ["검수 완료", "Reviewed"], - Z01_WorkItem_Review: ["검수 완료", "Mark reviewed"], - Z01_WorkItem_Dirty: [ - "저장 안 한 고침 있음 — [저장]해야 반영됨", - "Unsaved edits — applied on [Save]", + Z01_MasterData_State_Was: ["고칠 때: {value}", "when edited: {value}"], + Z01_MasterData_State_Now: ["지금: {value}", "now: {value}"], + Z01_MasterData_Edit_DropOnMeaning: [ + "고친 값 버리고 지금 줄 값 {value} 쓰기", + "Drop the edit and use the current row value {value}", ], - Z01_WorkItem_ResetConfirm: [ - "이 공종의 머리·구성 줄을 초기값으로 되돌림 — 바로 저장됨(관리자가 추가한 줄은 지워짐)", - "Reset this work item's header and rows — saved at once (admin-added rows are removed)", + Z01_MasterData_Edit_MeaningConfirm: [ + "줄의 뜻이 바뀌었음 — 고친 값을 버리면 지금 줄(다른 물건일 수 있음) 값을 씀. 버릴까?", + "This row now means something else. Dropping the edit uses the current row's value. Continue?", ], - Z01_WorkItem_Key: ["열쇠", "Key"], - Z01_WorkItem_Number: ["번호", "Number"], - Z01_WorkItem_Parent: ["상위 공종", "Parent"], - Z01_WorkItem_Edition: ["판", "Edition"], - Z01_WorkItem_Name: ["이름", "Name"], - Z01_WorkItem_BasisQuantity: ["기준 수량", "Basis quantity"], - Z01_WorkItem_BasisUnit: ["기준 단위", "Basis unit"], - Z01_WorkItem_Rows: ["구성 줄", "Resource rows"], - Z01_WorkItem_NoVariant: ["갈래 없음", "No variant"], - Z01_WorkItem_VariantName: ["새 갈래 이름", "New variant name"], - Z01_WorkItem_AddVariant: ["갈래 추가", "Add variant"], - Z01_WorkItem_Col_Kind: ["종류", "Kind"], - Z01_WorkItem_Col_Resource: ["자원", "Resource"], - Z01_WorkItem_Col_Spec: ["규격", "Spec"], - Z01_WorkItem_Col_Key: ["기초단가 열쇠", "Base price key"], - Z01_WorkItem_Col_Amount: ["수량", "Amount"], - Z01_WorkItem_Col_Unit: ["단위", "Unit"], - Z01_WorkItem_Col_Alt: ["대체 수량", "Alternative"], - Z01_WorkItem_Col_Ratio: ["묶음 비율 %", "Group ratio %"], - Z01_WorkItem_Col_Raw: ["원문 글자", "Source text"], - Z01_WorkItem_Col_Table: ["품셈 표", "Table"], - Z01_WorkItem_Col_Delete: ["", ""], - Z01_WorkItem_Kind_Labor: ["노무", "Labor"], - Z01_WorkItem_Kind_Machine: ["기계", "Machine"], - Z01_WorkItem_Kind_Material: ["자재", "Material"], - Z01_WorkItem_Kind_Etc: ["기타", "Other"], - Z01_WorkItem_Unmatched: ["⚠ 못 맞춤", "⚠ Unmatched"], - Z01_WorkItem_Find: ["찾기", "Find"], - Z01_WorkItem_FindTitle: ["자원 찾기 — 기초단가에서 골라 이음", "Find resource in base prices"], - Z01_WorkItem_FindClose: ["닫기", "Close"], - Z01_WorkItem_FindNone: ["찾은 줄 없음", "Nothing found"], - Z01_WorkItem_Source: ["품셈 원문 (읽기 전용)", "Standard source (read-only)"], - Z01_WorkItem_NoSource: ["원문 표 없음", "No source table"], - Z01_WorkItem_Notes: ["[주]", "[Notes]"], + Z01_MasterData_Edit_DropConfirm: ["고친 값 버리기", "Drop the edit"], + Z01_MasterData_List_MeaningChanged: ["⛔ 뜻 바뀜", "⛔ Meaning changed"], + Z01_MasterData_State_Orphan: [ + "⚠ 주인 없음 — 갱신으로 그 줄이 사라짐", + "⚠ Orphan — the row disappeared on update", + ], + Z01_MasterData_State_Missing: [ + "⚠ 서버가 판정(state)을 안 줌 — 버그", + "⚠ Server sent no state — bug", + ], + Z01_MasterData_List_State: ["상태", "State"], + Z01_MasterData_List_Row: ["줄", "Row"], + Z01_MasterData_List_Column: ["칸", "Column"], + Z01_MasterData_List_Value: ["고친 값", "Edited value"], + Z01_MasterData_List_Original: ["고칠 때 원본", "Source when edited"], + Z01_MasterData_List_Current: ["지금 원본", "Current source"], + Z01_MasterData_List_SourceChanged: ["⚠ 원본 바뀜", "⚠ Source changed"], + Z01_MasterData_List_Orphan: ["⚠ 주인 없음", "⚠ Orphan"], + Z01_MasterData_List_Edited: ["고쳐짐", "Edited"], Z01_MasterData_AdminOnly: ["시스템 관리자만 볼 수 있음", "System administrators only"], Z01_MasterData_LoadFailed: ["마스터 데이터를 못 읽음", "Failed to load master data"], Z01_MasterData_PickTable: ["왼쪽에서 표를 고를 것", "Pick a table on the left"],