From b1de2c0d33033a61be80bf51258a270116c170b1 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Wed, 9 Sep 2026 08:04:17 +0900 Subject: [PATCH] =?UTF-8?q?feat(B08):=20=EB=BF=8C=EB=A6=AC=20=EC=A0=81?= =?UTF-8?q?=EC=9E=AC=C2=B7=EC=9A=B4=EB=B0=98=20=EB=91=90=20=EC=A4=84=20?= =?UTF-8?q?=EC=8B=A0=EC=84=A4=20=E2=80=94=20=ED=92=88=EC=85=88=EC=9D=B4=20?= =?UTF-8?q?=EB=84=A4=20=EB=8B=A8=EA=B3=84=EB=A1=9C=20=EB=91=94=20=EC=9E=90?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 9-20 가. 「벌개·제근 → 뿌리다듬기 → 적재 → 운반」이 시공 과정 표준이고 [주] 가 「제근 후 뿌리다듬기와 적재항목에 적용」이라 두 항목을 줌. 별표2 도 「그 뿌리…를 전량 제거한 후 운반하고 쌓아두어야」로 뒤 단계를 요구 — 우리는 제거 한 줄만 세고 있었음 (표토와 같은 병: 법·품셈이 두 동작을 묶는데 앞 동작만 셈) - 적재는 FP-09-20-02(「10주당」) · ⚠ 운반은 그 장에 공종이 없어 코드를 못 붙임 — 지어내지 않고 사유로 냄 - 둘 다 제근과 같은 밑수(본수)가 서야 값이 남. 대상 면적은 참고값으로 실음 - tmp/tests 3건 추가 Co-Authored-By: Claude Opus 5 (1M context) --- .../B08_Quantity_Engine_Preparation.py | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/B08_Quantity/B08_Quantity_Engine_Preparation.py b/B08_Quantity/B08_Quantity_Engine_Preparation.py index b8a75805..91ca4e08 100644 --- a/B08_Quantity/B08_Quantity_Engine_Preparation.py +++ b/B08_Quantity/B08_Quantity_Engine_Preparation.py @@ -127,6 +127,7 @@ def preparation_rows( # ⚠ 법이 요구하는 **운반·적치** — 제거 물량이 곧 밑수다(별표2). _topsoil_haul_row(topsoil, topsoil_haul_distance_m), _root_removal_row(slope, stand_volume_class), + *_root_steps_rows(slope, stand_volume_class), _batter_frame_row(list(slope_rows)), _level_frame_row(list(slope_rows)), ] @@ -220,6 +221,54 @@ def _root_removal_row(slope: dict[str, float], stand_volume_class: str | None) - } +#: ⚠⚠ **품셈이 네 단계로 두었는데 우리가 한 줄만 세고 있었다**(2026-09-09). +#: 9-20 가. 「벌개·제근 → **뿌리다듬기** → **적재** → **운반**」이 시공 과정 표준이고 +#: [주] 「본 품에서는 제근 후 **뿌리다듬기와 적재항목**에 적용한다」로 두 항목을 준다. +#: 법도 같은 말을 한다 — 별표2 「입목…과 그 뿌리, 표토는 전량 제거한 후 … **운반하고 +#: 쌓아두어야** 한다」. ⇒ 제거만 세면 **적재·운반이 빠진다**(표토에서 이미 겪은 자리). +#: ⚠ 적재는 9-20-2 로 코드가 있고, **운반은 그 장에 공종이 없다** — 10장 계열 어디에 붙는지 +#: 원문이 말하지 않는다. 지어내지 않고 사유로 낸다. +ROOT_STEPS_NOTE = ( + "품셈 9-20 가. 「벌개·제근 → 뿌리다듬기 → 적재 → 운반」 · 별표2 「그 뿌리…를 전량 제거한 후" + " 운반하고 쌓아두어야 한다」 — 제거만 세면 뒤 단계가 빠짐" +) + + +def _root_steps_rows( + slope: dict[str, float], stand_volume_class: str | None +) -> list[dict[str, Any]]: + """뿌리 적재·운반 — **제근과 한 벌로 가는 뒤 단계**. 밑수가 서면 함께 선다.""" + area = float(slope.get("tree_removal_fill", 0.0)) + float(slope.get("tree_removal_cut", 0.0)) + return [ + { + "group": "준비공", + "item": "뿌리 적재", + "unit": "개", + "amount": None, + "status": STATUS_PENDING, + "reason": ( + f"{ROOT_STEPS_NOTE} · 품셈 9-20-2 「(단위: 10주당)」 — **본수가 서야 셈**" + f" (대상 면적 {area:,.1f}㎡ · 제근과 같은 밑수)" + ), + "reference_amount": area, + "work_item_code": "FP-09-20-02", + }, + { + "group": "준비공", + "item": "뿌리 운반", + "unit": "개", + "amount": None, + "status": STATUS_PENDING, + "reason": ( + f"{ROOT_STEPS_NOTE} · ⚠ **9-20 장에 운반 공종이 없음** — 10장 계열 어디에" + " 붙는지 원문이 말하지 않아 공종코드를 못 붙임" + ), + "reference_amount": area, + "work_item_code": None, + }, + ] + + def _topsoil_haul_row(topsoil: dict[str, Any], distance_m: float | None) -> dict[str, Any]: """표토 운반 — 물량은 제거 물량 그대로, 거리는 설계 입력.