fix(B08): 씨앗뿜어붙이기 밑수 ㎡ 추가 + 시공량 모양을 밑수로 안 받게 막음
⚠ 아홉 중 여덟째 — FP-05-24 는 원문 L2769·L2794 절 머리 아래 「(㎡당)」인데 「단위:」 글자 없이 **괄호만** 있어 마스터가 못 읽던 자리(원문 열어 확인). ⚠ 그리고 매핑 밑수 칸은 **사람이 손으로 적는 자리**라, 품셈에 섞여 있는 「(㎥/1대, 1일)」 같은 **시공량**을 적을 수 있음 — 그것은 밑수의 **역수**라 받으면 그 공종이 조용히 뒤집힌 단위를 가짐. `is_quantity_unit()` 으로 좁게 막음 (나눗셈·쉼표가 있거나 「일당·조·인」이면 안 받음). 애매하면 안 받는 쪽 — 안 받으면 대조가 없을 뿐이고, 잘못 받으면 틀린 단위로 검사를 통과시킴. 시험 741 통과 (B05 코리도 1건 기존 깨짐, 무관). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -148,6 +148,26 @@ def _latest_dataset_path(directory: Path | None = None) -> Path | None:
|
|||||||
return files[-1] if files else None
|
return files[-1] if files else None
|
||||||
|
|
||||||
|
|
||||||
|
#: ⚠ **공종 수량 단위가 아닌 것** — 품셈 절 머리에 섞여 있는 모양들이다(2026-09-08 B09 전수).
|
||||||
|
#: `(㎥/1대, 1일)` 는 **시공량**이라 「1대가 하루에 몇 ㎥」이고, 밑수(「1㎥ 에 얼마」)의
|
||||||
|
#: **역수**다. 그대로 밑수로 받으면 그 공종이 조용히 뒤집힌 단위를 갖는다.
|
||||||
|
#: `(일당)`·`(조)`·`(인)` 은 **품의 단위**이지 공종 단위가 아니다.
|
||||||
|
NON_QUANTITY_UNITS = frozenset({"일당", "조", "인", "일", "대", "인당"})
|
||||||
|
|
||||||
|
|
||||||
|
def is_quantity_unit(unit: str) -> bool:
|
||||||
|
"""그 글자가 **공종 수량의 밑수 단위**로 쓸 수 있는가.
|
||||||
|
|
||||||
|
⚠ **좁게 본다** — 애매하면 안 받는다. 안 받으면 대조가 없을 뿐이고, 잘못 받으면
|
||||||
|
**틀린 단위로 검사를 통과시킨다**(그쪽이 더 나쁘다).
|
||||||
|
"""
|
||||||
|
text = str(unit or "").strip()
|
||||||
|
if not text or text in NON_QUANTITY_UNITS:
|
||||||
|
return False
|
||||||
|
# 「㎥/1대, 1일」처럼 나눗셈·쉼표가 있으면 시공량이거나 밑수가 둘이다.
|
||||||
|
return "/" not in text and "," not in text
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class WorkItemMapping:
|
class WorkItemMapping:
|
||||||
"""수량 줄 → 공종 마스터 코드. 못 찾으면 `None` 을 돌려주고 부른 쪽이 목록에 남긴다."""
|
"""수량 줄 → 공종 마스터 코드. 못 찾으면 `None` 을 돌려주고 부른 쪽이 목록에 남긴다."""
|
||||||
@@ -173,7 +193,7 @@ class WorkItemMapping:
|
|||||||
found: dict[str, str] = {}
|
found: dict[str, str] = {}
|
||||||
for row in (*self.earthwork, *self.haul, *self.structure):
|
for row in (*self.earthwork, *self.haul, *self.structure):
|
||||||
code, unit = row.get("work_item_code"), row.get("basis_unit")
|
code, unit = row.get("work_item_code"), row.get("basis_unit")
|
||||||
if code and unit:
|
if code and unit and is_quantity_unit(str(unit)):
|
||||||
found[str(code)] = str(unit)
|
found[str(code)] = str(unit)
|
||||||
return found
|
return found
|
||||||
|
|
||||||
|
|||||||
@@ -101,7 +101,9 @@
|
|||||||
{
|
{
|
||||||
"group": "초류종자살포",
|
"group": "초류종자살포",
|
||||||
"work_item_code": "FP-05-24",
|
"work_item_code": "FP-05-24",
|
||||||
"master_name": "씨앗뿜어붙이기"
|
"master_name": "씨앗뿜어붙이기",
|
||||||
|
"basis_unit": "㎡",
|
||||||
|
"basis_source": "산림사업 표준품셈(고시 2025-82) 원문 L2769·L2794 — 5-24-1·5-24-2 절 머리 바로 아래 「(㎡당)」. ⚠ 「단위:」 글자 없이 **괄호만** 적힌 모양이라 마스터가 못 읽은 자리(2026-09-08 원문 대조)."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"group": "되메우기",
|
"group": "되메우기",
|
||||||
|
|||||||
Reference in New Issue
Block a user