From d78f59ba5c9631ffb567973c54a78ea5b8576445 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Tue, 8 Sep 2026 01:11:32 +0900 Subject: [PATCH] =?UTF-8?q?feat(B09):=20=EB=B0=91=EC=88=98=20=EB=B0=98?= =?UTF-8?q?=EC=98=81=20=EC=9E=AC=EC=83=9D=EC=84=B1=20+=20=EB=B0=91?= =?UTF-8?q?=EC=88=98=20=EB=AF=B8=ED=99=95=EB=B3=B4=20=EC=A4=84=20=EC=B0=A8?= =?UTF-8?q?=EB=8B=A8=20+=20=E3=89=A1=20=EB=AC=B4=EB=8C=80=20=EA=B0=80?= =?UTF-8?q?=EB=93=9C=20=EA=B0=80=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit B08 이 밑수(「10㎡당」 같은 기준 수량)를 본문에서 찾아 181표를 채움. 그 위에서 자원 축·일위대가를 다시 냄 - **떼채취 평떼 1,032,408 → 10,324원/㎡** — 100 배 부풀어 있던 것이 교정됨. 「100매당일 것」이라던 의심이 실제로 `100㎡당`이었음 - 기준 미상 122 → 40, 100만원 초과 10 → 2 건. 중앙값 73,989 → 48,961 - 파생물 지문이 새 마스터(`fe454c56…`)로 따라 바뀜 — 낡음 감지 장치가 처음으로 실제 갱신에서 동작 확인됨 밑수 미확보 표(`basis_missing` 144건 → 26 공종) - 1 단위당으로 단정하면 곱셈이 10배·100배 틀리므로 **곱하지 않음**. 내역서에 「밑수를 못 찾은 표입니다 — 곱하지 않았습니다. 원문 4-4. 가지정리」로 뜸 ㉡ 무대 가드 가동 (B08 이 운반을 실물로 내기 시작) - 인계에서 `haul_distance_m`·`haul_equipment` 를 받아 조판에서 실제로 호출 - 무대(20 m 이내)는 줄로 서되 금액 없음. 운반토량 합이 총 절취량을 넘는지도 검사 - 짝 시험 — 무대에 단가가 붙으면 멈추고, **암 운반·덤프 줄은 안 걸림** 검증: pytest 170 통과(신규 3) Co-Authored-By: Claude Opus 5 (1M context) --- .../B09_Estimation_BillOfQuantities.py | 60 ++- B09_Estimation/B09_Estimation_UnitPrice.py | 36 ++ .../resource_axis_2026-01-01.json | 396 +++++++++--------- 3 files changed, 293 insertions(+), 199 deletions(-) diff --git a/B09_Estimation/B09_Estimation_BillOfQuantities.py b/B09_Estimation/B09_Estimation_BillOfQuantities.py index 82725380..5d18cacf 100644 --- a/B09_Estimation/B09_Estimation_BillOfQuantities.py +++ b/B09_Estimation/B09_Estimation_BillOfQuantities.py @@ -23,7 +23,11 @@ from dataclasses import dataclass, field from decimal import Decimal from typing import Any -from B09_Estimation.B09_Estimation_Guards import check_excluded_rows_not_priced +from B09_Estimation.B09_Estimation_Guards import ( + check_excluded_rows_not_priced, + check_free_haul_not_priced, + check_haul_volume_within_cut, +) from B09_Estimation.B09_Estimation_ResourceAxis import load_work_item_master from B09_Estimation.B09_Estimation_Rounding import OutputPlace, round_at from B09_Estimation.B09_Estimation_UnitPrice import UnitPriceBuild, cached_build @@ -49,6 +53,9 @@ class HandoffWorkItem: unit: str quantity: Decimal in_bill: bool + #: 운반 줄에만 있다 — 거리(m)와 수단. 무대(20 m 이내)는 `free_haul` 로 온다. + haul_distance_m: Decimal | None = None + haul_equipment: str | None = None in_bill_reason: str = "" origin: str = "" ground_class: str = "" @@ -181,6 +188,8 @@ def parse_handoff(payload: dict[str, Any]) -> tuple[list[HandoffWorkItem], list[ in_bill_reason=row.get("in_bill_reason") or "", origin=row.get("origin") or "", ground_class=row.get("ground_class") or "", + haul_distance_m=_decimal(row.get("haul_distance_m"), None), + haul_equipment=row.get("haul_equipment"), # ⚠ 있으면 **적기만** 한다 — 곱하기는 B08 한 곳에서만(2026-09-08 이견 ①). application_ratio_pct=_decimal(row.get("application_ratio_pct"), None), ) @@ -327,6 +336,31 @@ def build_bill( # ── 4) 검사 — `in_bill=false` 줄에 금액이 붙지 않았는가 ────────────────────── check_excluded_rows_not_priced(rows=[r.as_dict() for r in result.excluded]) + # ㉡ **무대(20 m 이내)에 단가가 붙지 않았는가** (PLAN 8-7 ㉡). + # 줄 자체는 실무 서식대로 남기되 **금액을 매기지 않는다** — 품에 이미 들어 있다. + # 2026-09-08: B08 이 운반을 실물로 내기 시작해 이 검사가 처음으로 실제로 돈다. + haul_rows = [ + { + "equipment": item.haul_equipment, + "unit_price_krw": _haul_price_of(item, result), + } + for item in work_items + if item.haul_equipment + ] + check_free_haul_not_priced(haul_rows=haul_rows) + + # ㉡ 보조 — 운반토량 합이 총 절취량을 넘지 않는가(같은 흙을 두 번 세지 않았는가). + cut_total = sum( + (item.quantity for item in work_items if "깎기" in item.name or "절취" in item.name), + _ZERO, + ) + haul_total = sum((item.quantity for item in work_items if item.haul_equipment), _ZERO) + if cut_total > 0 and haul_total > 0: + check_haul_volume_within_cut( + haul_volume_total_m3=haul_total, + total_cut_volume_m3=cut_total, + ) + if any(m.surcharge_pct is None for m in materials): result.notes.append( "자재 할증률이 아직 없습니다 — 할증 전 값으로 섰습니다. " @@ -335,6 +369,14 @@ def build_bill( return result +def _haul_price_of(item: HandoffWorkItem, result: BillResult) -> Decimal: + """그 운반 줄에 실제로 붙은 단가. 안 붙었으면 0 — ㉡ 검사에 넘길 값이다.""" + for row in result.rows: + if row.name == item.name and row.unit_price_krw is not None: + return row.unit_price_krw + return _ZERO + + def _excluded_row(item: HandoffWorkItem) -> BillRow: """검산용 줄(`in_bill=false`). **수량만 보이고 단가·금액을 안 붙인다.**""" return BillRow( @@ -413,6 +455,22 @@ def _leaf_row( ) return row + missing_basis = unit_prices.basis_missing.get(node.code) + if missing_basis: + # ⚠ 밑수를 모르는 표다 — 「10㎡당」인지 「1㎡당」인지 모른 채 곱하면 10배·100배 + # 틀린다(떼채취가 실제로 100배였다). **곱하지 않고 드러낸다.** + row.note = f"밑수(기준 수량)를 못 찾은 표입니다 — 곱하지 않았습니다. 원문 {missing_basis}" + result.missing.append( + { + "name": row.name, + "code": node.code, + "unit": row.unit, + "quantity": str(item.quantity), + "reason": "밑수 미확보 — 곱하면 10배·100배 틀림", + } + ) + return row + covered = unit_prices.partial_ratio.get(node.code) if covered is not None: # ⚠ **일부 몫만 선 단가는 안 붙인다.** 「인력(10%)·장비(90%)」 표에서 인력만 diff --git a/B09_Estimation/B09_Estimation_UnitPrice.py b/B09_Estimation/B09_Estimation_UnitPrice.py index 670b79e5..a487376e 100644 --- a/B09_Estimation/B09_Estimation_UnitPrice.py +++ b/B09_Estimation/B09_Estimation_UnitPrice.py @@ -83,6 +83,9 @@ class UnitPriceBuild: cycle_factors: dict[str, CycleFactors] = field(default_factory=dict) #: 공종 하나가 낳은 규격 갈래들 — 「무근구조물」·「철근구조물」·「소형구조물」. variants: dict[str, list[str]] = field(default_factory=dict) + #: 밑수(「10㎡당」)를 못 찾은 표를 쓰는 공종 — **곱하면 안 되는 줄**이다. + #: 1 단위당으로 단정하면 곱셈이 10배·100배 틀린다(B08 `basis_missing` 목록). + basis_missing: dict[str, str] = field(default_factory=dict) #: 계수를 못 세운 표 — **무엇이 없는지**를 들고 있는다. factor_gaps: dict[str, FactorGap] = field(default_factory=dict) @@ -196,6 +199,31 @@ def _add_machine_layers(book: PriceBook, machine_codes: set[str]) -> list[str]: return incomplete +@lru_cache(maxsize=1) +def load_basis_missing( + file_name: str = "basis_missing_2026-01-01.json", +) -> dict[str, str]: + """B08 이 낸 **밑수 못 찾은 표** 목록 — `{표 번호: 절 이름}`. + + 「10㎡당」 같은 기준을 원문에서 못 찾은 표다. 1 단위당으로 단정하면 곱셈이 + 10배·100배 틀리므로(떼채취가 실제로 100배였다) 그 표를 쓰는 공종은 + **금액을 안 만든다**. + """ + import json + import os + + root = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + path = os.path.join(root, "resources", "data_work_item_master", file_name) + if not os.path.exists(path): + return {} + with open(path, encoding="utf-8") as handle: + payload = json.load(handle) + return { + str(item.get("pum_table_id")): str(item.get("section", "")) + for item in payload.get("items", []) + } + + def build_unit_prices(axis: AxisResult | None = None) -> UnitPriceBuild: """자원 축을 일위대가(`B`)로 조립한다. @@ -209,6 +237,7 @@ def build_unit_prices(axis: AxisResult | None = None) -> UnitPriceBuild: names = {w["work_item_code"]: w.get("name", "") for w in master.get("work_items", [])} build = UnitPriceBuild() + missing_basis = load_basis_missing() wages = load_operator_wages() _add_labor_titles(build.book, wages) @@ -237,6 +266,13 @@ def build_unit_prices(axis: AxisResult | None = None) -> UnitPriceBuild: build.skipped.append(work_item_code) continue + # ⚠ 밑수를 못 찾은 표를 쓰면 **곱하면 안 되는 줄**로 표시한다. + for row in rows: + section = missing_basis.get(str(row.pum_table_id)) + if section: + build.basis_missing[work_item_code] = section + break + unit = next((r.amount_unit for r in rows if r.amount_unit), "") base_name = names.get(work_item_code) or work_item_code build.book.add_title( diff --git a/resources/data_cost_resource_axis/resource_axis_2026-01-01.json b/resources/data_cost_resource_axis/resource_axis_2026-01-01.json index 58ad3db3..1b2d76f7 100644 --- a/resources/data_cost_resource_axis/resource_axis_2026-01-01.json +++ b/resources/data_cost_resource_axis/resource_axis_2026-01-01.json @@ -302,8 +302,8 @@ "work_item_code": "FP-05-01-02" }, { - "amount": "3.0", - "amount_unit": "", + "amount": "0.03", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0096", @@ -316,8 +316,8 @@ "work_item_code": "FP-05-01-04" }, { - "amount": "6.0", - "amount_unit": "", + "amount": "0.06", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0096", @@ -485,7 +485,7 @@ }, { "amount": "0.0099", - "amount_unit": "", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0130", @@ -499,7 +499,7 @@ }, { "amount": "0.0231", - "amount_unit": "", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0130", @@ -513,7 +513,7 @@ }, { "amount": "0.011", - "amount_unit": "", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0131", @@ -555,7 +555,7 @@ }, { "amount": "0.0084", - "amount_unit": "", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0133", @@ -569,7 +569,7 @@ }, { "amount": "0.0196", - "amount_unit": "", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0133", @@ -583,7 +583,7 @@ }, { "amount": "0.0033", - "amount_unit": "", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0134", @@ -597,7 +597,7 @@ }, { "amount": "0.0007", - "amount_unit": "", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0135", @@ -611,7 +611,7 @@ }, { "amount": "0.0004", - "amount_unit": "", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0135", @@ -625,7 +625,7 @@ }, { "amount": "0.0007", - "amount_unit": "", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0136", @@ -639,7 +639,7 @@ }, { "amount": "0.0004", - "amount_unit": "", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0136", @@ -653,7 +653,7 @@ }, { "amount": "0.002", - "amount_unit": "", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0139", @@ -667,7 +667,7 @@ }, { "amount": "0.0007", - "amount_unit": "", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0139", @@ -877,7 +877,7 @@ }, { "amount": "1.05", - "amount_unit": "", + "amount_unit": "인", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0230", @@ -891,7 +891,7 @@ }, { "amount": "2.00", - "amount_unit": "", + "amount_unit": "인", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0230", @@ -961,7 +961,7 @@ }, { "amount": "0.16", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0239", @@ -975,7 +975,7 @@ }, { "amount": "0.041", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0243", @@ -989,7 +989,7 @@ }, { "amount": "0.103", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0243", @@ -1031,7 +1031,7 @@ }, { "amount": "0.23", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": "10", "pum_form": "requirement", "pum_table_id": "F0258", @@ -1045,7 +1045,7 @@ }, { "amount": "1.6", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": "10", "pum_form": "requirement", "pum_table_id": "F0259", @@ -1059,7 +1059,7 @@ }, { "amount": "0.8", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0259", @@ -1073,7 +1073,7 @@ }, { "amount": "2.8", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": "10", "pum_form": "requirement", "pum_table_id": "F0260", @@ -1087,7 +1087,7 @@ }, { "amount": "1.266", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0260", @@ -1101,7 +1101,7 @@ }, { "amount": "0.23", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": "10", "pum_form": "requirement", "pum_table_id": "F0261", @@ -1115,7 +1115,7 @@ }, { "amount": "0.31", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": "10", "pum_form": "requirement", "pum_table_id": "F0262", @@ -1129,7 +1129,7 @@ }, { "amount": "0.39", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": "10", "pum_form": "requirement", "pum_table_id": "F0263", @@ -1143,7 +1143,7 @@ }, { "amount": "0.345", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": "10", "pum_form": "requirement", "pum_table_id": "F0264", @@ -1157,7 +1157,7 @@ }, { "amount": "0.465", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": "10", "pum_form": "requirement", "pum_table_id": "F0265", @@ -1171,7 +1171,7 @@ }, { "amount": "0.585", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": "10", "pum_form": "requirement", "pum_table_id": "F0266", @@ -1185,7 +1185,7 @@ }, { "amount": "1.6", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": "10", "pum_form": "requirement", "pum_table_id": "F0267", @@ -1199,7 +1199,7 @@ }, { "amount": "0.8", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0267", @@ -1213,7 +1213,7 @@ }, { "amount": "1.8", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": "10", "pum_form": "requirement", "pum_table_id": "F0268", @@ -1227,7 +1227,7 @@ }, { "amount": "0.9", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0268", @@ -1240,8 +1240,8 @@ "work_item_code": "FP-09-13-08" }, { - "amount": "2.0", - "amount_unit": "", + "amount": "2", + "amount_unit": "㎥", "group_ratio_pct": "10", "pum_form": "requirement", "pum_table_id": "F0269", @@ -1254,8 +1254,8 @@ "work_item_code": "FP-09-13-09" }, { - "amount": "1.0", - "amount_unit": "", + "amount": "1", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0269", @@ -1269,7 +1269,7 @@ }, { "amount": "1.2", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": "10", "pum_form": "requirement", "pum_table_id": "F0270", @@ -1283,7 +1283,7 @@ }, { "amount": "1.35", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": "10", "pum_form": "requirement", "pum_table_id": "F0271", @@ -1297,7 +1297,7 @@ }, { "amount": "1.5", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": "10", "pum_form": "requirement", "pum_table_id": "F0272", @@ -1311,7 +1311,7 @@ }, { "amount": "2.8", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": "10", "pum_form": "requirement", "pum_table_id": "F0273", @@ -1325,7 +1325,7 @@ }, { "amount": "1.266", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0273", @@ -1339,7 +1339,7 @@ }, { "amount": "3.5", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": "10", "pum_form": "requirement", "pum_table_id": "F0274", @@ -1353,7 +1353,7 @@ }, { "amount": "1.566", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0274", @@ -1367,7 +1367,7 @@ }, { "amount": "4.2", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": "10", "pum_form": "requirement", "pum_table_id": "F0275", @@ -1381,7 +1381,7 @@ }, { "amount": "1.866", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0275", @@ -1394,8 +1394,8 @@ "work_item_code": "FP-09-13-15" }, { - "amount": "4.20", - "amount_unit": "", + "amount": "4.2", + "amount_unit": "㎥", "group_ratio_pct": "10", "pum_form": "requirement", "pum_table_id": "F0276", @@ -1409,7 +1409,7 @@ }, { "amount": "1.899", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0276", @@ -1423,7 +1423,7 @@ }, { "amount": "5.25", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": "10", "pum_form": "requirement", "pum_table_id": "F0277", @@ -1437,7 +1437,7 @@ }, { "amount": "2.349", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0277", @@ -1451,7 +1451,7 @@ }, { "amount": "6.3", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": "10", "pum_form": "requirement", "pum_table_id": "F0278", @@ -1465,7 +1465,7 @@ }, { "amount": "2.799", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0278", @@ -1478,8 +1478,8 @@ "work_item_code": "FP-09-13-18" }, { - "amount": "0.10", - "amount_unit": "", + "amount": "0.1", + "amount_unit": "㎥", "group_ratio_pct": "10", "pum_form": "requirement", "pum_table_id": "F0279", @@ -1493,7 +1493,7 @@ }, { "amount": "0.019", - "amount_unit": "", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0290", @@ -1507,7 +1507,7 @@ }, { "amount": "0.0328", - "amount_unit": "", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0291", @@ -1577,7 +1577,7 @@ }, { "amount": "0.5", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0303", @@ -1590,8 +1590,8 @@ "work_item_code": "FP-10-06-02" }, { - "amount": "0.35", - "amount_unit": "", + "amount": "0.0035", + "amount_unit": "m", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0305", @@ -1604,8 +1604,8 @@ "work_item_code": "FP-10-07-01" }, { - "amount": "0.35", - "amount_unit": "", + "amount": "0.0035", + "amount_unit": "m", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0305", @@ -1618,8 +1618,8 @@ "work_item_code": "FP-10-07-01" }, { - "amount": "2.0", - "amount_unit": "", + "amount": "0.02", + "amount_unit": "m", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0306", @@ -1632,8 +1632,8 @@ "work_item_code": "FP-10-07-02" }, { - "amount": "2.0", - "amount_unit": "", + "amount": "0.02", + "amount_unit": "m", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0306", @@ -1646,8 +1646,8 @@ "work_item_code": "FP-10-07-02" }, { - "amount": "6.0", - "amount_unit": "", + "amount": "0.06", + "amount_unit": "m", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0306", @@ -1660,8 +1660,8 @@ "work_item_code": "FP-10-07-02" }, { - "amount": "1.0", - "amount_unit": "", + "amount": "0.01", + "amount_unit": "m", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0307", @@ -1674,8 +1674,8 @@ "work_item_code": "FP-10-07-03" }, { - "amount": "1.0", - "amount_unit": "", + "amount": "0.01", + "amount_unit": "m", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0307", @@ -1688,8 +1688,8 @@ "work_item_code": "FP-10-07-03" }, { - "amount": "3.0", - "amount_unit": "", + "amount": "0.03", + "amount_unit": "m", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0307", @@ -1745,7 +1745,7 @@ }, { "amount": "0.12", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0329", @@ -1759,7 +1759,7 @@ }, { "amount": "0.15", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0329", @@ -1773,7 +1773,7 @@ }, { "amount": "0.14", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0329", @@ -1787,7 +1787,7 @@ }, { "amount": "0.16", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0329", @@ -1801,7 +1801,7 @@ }, { "amount": "0.24", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0329", @@ -1815,7 +1815,7 @@ }, { "amount": "0.30", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0329", @@ -1829,7 +1829,7 @@ }, { "amount": "0.15", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0330", @@ -1843,7 +1843,7 @@ }, { "amount": "0.46", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0330", @@ -1857,7 +1857,7 @@ }, { "amount": "0.17", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0330", @@ -1871,7 +1871,7 @@ }, { "amount": "0.68", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0330", @@ -1885,7 +1885,7 @@ }, { "amount": "0.24", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0330", @@ -1899,7 +1899,7 @@ }, { "amount": "0.94", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0330", @@ -1913,7 +1913,7 @@ }, { "amount": "0.85", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0331", @@ -1927,7 +1927,7 @@ }, { "amount": "0.82", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0331", @@ -1941,7 +1941,7 @@ }, { "amount": "0.87", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0331", @@ -1955,7 +1955,7 @@ }, { "amount": "0.99", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0331", @@ -1969,7 +1969,7 @@ }, { "amount": "1.29", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0331", @@ -1983,7 +1983,7 @@ }, { "amount": "1.36", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0331", @@ -1997,7 +1997,7 @@ }, { "amount": "1.07", - "amount_unit": "", + "amount_unit": "ton", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0335", @@ -2011,7 +2011,7 @@ }, { "amount": "0.35", - "amount_unit": "", + "amount_unit": "ton", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0335", @@ -2025,7 +2025,7 @@ }, { "amount": "1.69", - "amount_unit": "", + "amount_unit": "ton", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0335", @@ -2039,7 +2039,7 @@ }, { "amount": "0.69", - "amount_unit": "", + "amount_unit": "ton", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0335", @@ -2053,7 +2053,7 @@ }, { "amount": "1.24", - "amount_unit": "", + "amount_unit": "ton", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0335", @@ -2067,7 +2067,7 @@ }, { "amount": "0.45", - "amount_unit": "", + "amount_unit": "ton", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0335", @@ -2081,7 +2081,7 @@ }, { "amount": "1.84", - "amount_unit": "", + "amount_unit": "ton", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0335", @@ -2095,7 +2095,7 @@ }, { "amount": "0.75", - "amount_unit": "", + "amount_unit": "ton", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0335", @@ -2109,7 +2109,7 @@ }, { "amount": "1.51", - "amount_unit": "", + "amount_unit": "ton", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0335", @@ -2123,7 +2123,7 @@ }, { "amount": "0.50", - "amount_unit": "", + "amount_unit": "ton", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0335", @@ -2137,7 +2137,7 @@ }, { "amount": "1.92", - "amount_unit": "", + "amount_unit": "ton", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0335", @@ -2151,7 +2151,7 @@ }, { "amount": "0.80", - "amount_unit": "", + "amount_unit": "ton", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0335", @@ -2165,7 +2165,7 @@ }, { "amount": "1.69", - "amount_unit": "", + "amount_unit": "ton", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0335", @@ -2179,7 +2179,7 @@ }, { "amount": "0.60", - "amount_unit": "", + "amount_unit": "ton", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0335", @@ -2193,7 +2193,7 @@ }, { "amount": "2.14", - "amount_unit": "", + "amount_unit": "ton", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0335", @@ -2207,7 +2207,7 @@ }, { "amount": "0.86", - "amount_unit": "", + "amount_unit": "ton", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0335", @@ -2221,7 +2221,7 @@ }, { "amount": "0.22", - "amount_unit": "", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0336", @@ -2235,7 +2235,7 @@ }, { "amount": "0.12", - "amount_unit": "", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0336", @@ -2319,7 +2319,7 @@ }, { "amount": "0.0055", - "amount_unit": "", + "amount_unit": "m", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0345", @@ -2333,7 +2333,7 @@ }, { "amount": "0.0055", - "amount_unit": "", + "amount_unit": "m", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0345", @@ -2347,7 +2347,7 @@ }, { "amount": "0.003", - "amount_unit": "", + "amount_unit": "m", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0345", @@ -2361,7 +2361,7 @@ }, { "amount": "0.13", - "amount_unit": "", + "amount_unit": "m", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0345", @@ -2375,7 +2375,7 @@ }, { "amount": "0.12", - "amount_unit": "", + "amount_unit": "개소", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0348", @@ -2389,7 +2389,7 @@ }, { "amount": "1.23", - "amount_unit": "", + "amount_unit": "개소", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0348", @@ -2403,7 +2403,7 @@ }, { "amount": "0.05", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0363", @@ -2417,7 +2417,7 @@ }, { "amount": "4.2", - "amount_unit": "", + "amount_unit": "ton", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0365", @@ -2431,7 +2431,7 @@ }, { "amount": "2.4", - "amount_unit": "", + "amount_unit": "ton", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0365", @@ -2445,7 +2445,7 @@ }, { "amount": "0.07", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0367", @@ -2459,7 +2459,7 @@ }, { "amount": "0.05", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0367", @@ -2473,7 +2473,7 @@ }, { "amount": "0.034", - "amount_unit": "", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0368", @@ -2487,7 +2487,7 @@ }, { "amount": "0.04", - "amount_unit": "", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0368", @@ -2501,7 +2501,7 @@ }, { "amount": "0.003", - "amount_unit": "", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0370", @@ -2514,8 +2514,8 @@ "work_item_code": "FP-12-23" }, { - "amount": "0.2", - "amount_unit": "", + "amount": "0.002", + "amount_unit": "㎡", "group_ratio_pct": "10", "pum_form": "requirement", "pum_table_id": "F0372", @@ -2528,8 +2528,8 @@ "work_item_code": "FP-12-24-02" }, { - "amount": "4.0", - "amount_unit": "", + "amount": "0.04", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0372", @@ -2543,7 +2543,7 @@ }, { "amount": "1", - "amount_unit": "", + "amount_unit": "개소", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0374", @@ -2556,8 +2556,8 @@ "work_item_code": "FP-12-26" }, { - "amount": "0.2", - "amount_unit": "", + "amount": "0.002", + "amount_unit": "㎡", "group_ratio_pct": "10", "pum_form": "requirement", "pum_table_id": "F0371", @@ -2570,8 +2570,8 @@ "work_item_code": "FP-12-24-01" }, { - "amount": "4.0", - "amount_unit": "", + "amount": "0.04", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0371", @@ -2585,7 +2585,7 @@ }, { "amount": "0.12", - "amount_unit": "", + "amount_unit": "개소", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0378", @@ -2599,7 +2599,7 @@ }, { "amount": "0.004", - "amount_unit": "", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0384", @@ -2613,7 +2613,7 @@ }, { "amount": "3.8", - "amount_unit": "", + "amount_unit": "ton", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0387", @@ -2627,7 +2627,7 @@ }, { "amount": "2.2", - "amount_unit": "", + "amount_unit": "ton", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0387", @@ -2641,7 +2641,7 @@ }, { "amount": "0.05", - "amount_unit": "", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0389", @@ -2655,7 +2655,7 @@ }, { "amount": "0.5", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0397", @@ -2669,7 +2669,7 @@ }, { "amount": "0.17", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0398", @@ -2682,8 +2682,8 @@ "work_item_code": "FP-13-02-02" }, { - "amount": "2.6", - "amount_unit": "", + "amount": "0.026", + "amount_unit": "개", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0399", @@ -2696,8 +2696,8 @@ "work_item_code": "FP-13-02-03" }, { - "amount": "0.05", - "amount_unit": "㎡", + "amount": "0.5", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0402", @@ -2710,8 +2710,8 @@ "work_item_code": "FP-13-03-01" }, { - "amount": "0.04", - "amount_unit": "㎡", + "amount": "0.4", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0402", @@ -2724,8 +2724,8 @@ "work_item_code": "FP-13-03-01" }, { - "amount": "0.05", - "amount_unit": "㎡", + "amount": "0.5", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0402", @@ -2739,7 +2739,7 @@ }, { "amount": "0.05", - "amount_unit": "", + "amount_unit": "m", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0415", @@ -2753,7 +2753,7 @@ }, { "amount": "0.08", - "amount_unit": "", + "amount_unit": "m", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0415", @@ -2767,7 +2767,7 @@ }, { "amount": "0.09", - "amount_unit": "", + "amount_unit": "m", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0415", @@ -2780,8 +2780,8 @@ "work_item_code": "FP-13-04-06" }, { - "amount": "0.83", - "amount_unit": "", + "amount": "0.083", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0419", @@ -2794,8 +2794,8 @@ "work_item_code": "FP-13-06-01" }, { - "amount": "1.04", - "amount_unit": "", + "amount": "0.104", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0419", @@ -2808,8 +2808,8 @@ "work_item_code": "FP-13-06-01" }, { - "amount": "0.83", - "amount_unit": "", + "amount": "0.083", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0420", @@ -2822,8 +2822,8 @@ "work_item_code": "FP-13-06-02" }, { - "amount": "1.30", - "amount_unit": "", + "amount": "0.13", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0420", @@ -2836,8 +2836,8 @@ "work_item_code": "FP-13-06-02" }, { - "amount": "4.80", - "amount_unit": "", + "amount": "0.48", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0420", @@ -2850,8 +2850,8 @@ "work_item_code": "FP-13-06-02" }, { - "amount": "1.19", - "amount_unit": "", + "amount": "0.119", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0421", @@ -2864,8 +2864,8 @@ "work_item_code": "FP-13-06-03" }, { - "amount": "1.86", - "amount_unit": "", + "amount": "0.186", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0421", @@ -2878,8 +2878,8 @@ "work_item_code": "FP-13-06-03" }, { - "amount": "6.86", - "amount_unit": "", + "amount": "0.686", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0421", @@ -2892,8 +2892,8 @@ "work_item_code": "FP-13-06-03" }, { - "amount": "0.58", - "amount_unit": "", + "amount": "0.058", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0422", @@ -2906,8 +2906,8 @@ "work_item_code": "FP-13-07-01" }, { - "amount": "0.58", - "amount_unit": "", + "amount": "0.058", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0422", @@ -2920,8 +2920,8 @@ "work_item_code": "FP-13-07-01" }, { - "amount": "2.40", - "amount_unit": "", + "amount": "0.24", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0422", @@ -2934,8 +2934,8 @@ "work_item_code": "FP-13-07-01" }, { - "amount": "0.58", - "amount_unit": "", + "amount": "0.058", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0423", @@ -2948,8 +2948,8 @@ "work_item_code": "FP-13-07-02" }, { - "amount": "1.01", - "amount_unit": "", + "amount": "0.101", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0423", @@ -2962,8 +2962,8 @@ "work_item_code": "FP-13-07-02" }, { - "amount": "0.09", - "amount_unit": "", + "amount": "0.009", + "amount_unit": "개", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0426", @@ -2976,8 +2976,8 @@ "work_item_code": "FP-13-10-01" }, { - "amount": "0.22", - "amount_unit": "", + "amount": "0.022", + "amount_unit": "개", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0426", @@ -2991,7 +2991,7 @@ }, { "amount": "0.015", - "amount_unit": "", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0432", @@ -3005,7 +3005,7 @@ }, { "amount": "0.005", - "amount_unit": "", + "amount_unit": "㎡", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0434", @@ -3061,7 +3061,7 @@ }, { "amount": "7.274", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0440", @@ -3075,7 +3075,7 @@ }, { "amount": "0.786", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0440", @@ -3089,7 +3089,7 @@ }, { "amount": "16.975", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0440", @@ -3103,7 +3103,7 @@ }, { "amount": "1.848", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0440", @@ -3116,8 +3116,8 @@ "work_item_code": "FP-13-13-01" }, { - "amount": "0.20", - "amount_unit": "", + "amount": "0.2", + "amount_unit": "㎥", "group_ratio_pct": "10", "pum_form": "requirement", "pum_table_id": "F0441", @@ -3131,7 +3131,7 @@ }, { "amount": "2.80", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0443", @@ -3145,7 +3145,7 @@ }, { "amount": "0.80", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0443", @@ -3159,7 +3159,7 @@ }, { "amount": "6.31", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0443", @@ -3173,7 +3173,7 @@ }, { "amount": "1.31", - "amount_unit": "", + "amount_unit": "㎥", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0443", @@ -3229,7 +3229,7 @@ }, { "amount": "0.0027", - "amount_unit": "", + "amount_unit": "m", "group_ratio_pct": null, "pum_form": "requirement", "pum_table_id": "F0445", @@ -3251,7 +3251,7 @@ }, "source_master_file": { "file": "work_item_master_2026-01-01.json", - "sha256": "593653135d5a2871180e7a3921f9238629b275438ef47230412aa21e9bdd80c0" + "sha256": "fe454c56c9dc01ad7dae04a8f90d776d08c5ce33badeadb2606b35234bfce7eb" }, "stats": { "rows": 231,