diff --git a/B08_Quantity/B08_Quantity_Build_WorkItemMaster_FormsConst.py b/B08_Quantity/B08_Quantity_Build_WorkItemMaster_FormsConst.py index 5c4fa817..6c230313 100644 --- a/B08_Quantity/B08_Quantity_Build_WorkItemMaster_FormsConst.py +++ b/B08_Quantity/B08_Quantity_Build_WorkItemMaster_FormsConst.py @@ -188,7 +188,19 @@ def judged_const_form(table: dict[str, Any], _twice: bool = False) -> tuple[str, if nums and all(0 < n <= 1 for n in nums): return "coefficient", "현장조건별 값이 모두 1 이하 — 작업효율·계수표" - # ⑰ 머리가 두 단인 표 — **위 단을 버리지 않고 아래 단을 머리에 더해** 한 번 더 본다. + # ⑰ 품 단위가 칸에 적힌 표 — `인/ton`·`인/개소` 는 **그 단위당 사람 몫**이라 소요량 표다 + if found := next((c for c in _cells(table) if _PERSON_PER_RE.search(_squeeze(c))), None): + return "requirement", f"'{_squeeze(found)[:12]}' — 단위당 사람 몫" + + # ⑱ 머리에 이름 칸과 단위 칸이 함께 — 자재 소요량 표(`품명 | 규격 | 단위 | 수량`) + if any(h in ("품명", "명칭", "자재명") for h in headers) and any("단위" in h for h in headers): + return "requirement", "머리에 '품명'+'단위' — 자재 소요량 표" + + # ⑲ 머리에 「사용시간」 — 장비를 몇 시간 쓰는지 적은 **소요량** 표(13-9-1 수중펌프 설치) + if any("사용시간" in h for h in headers): + return "requirement", "머리에 '사용시간' — 장비 소요시간" + + # ⑳ 머리가 두 단인 표 — **위 단을 버리지 않고 아래 단을 머리에 더해** 한 번 더 본다. # ⚠ 평탄화가 아니다(위 단에 밑수·갈래가 든다) · 한 번만 되본다(두 단이 셋이 되진 않는다). if not _twice and (sub := _sub_header_row(table)): merged = { @@ -210,6 +222,8 @@ _TIME_ROW_RE = re.compile(r"시간\(|\(분\)|사이클|주기\(") _AMOUNT_ROW_RE = re.compile(r"사용량|소요량|사용수량") #: 조건별 계수표 머리 — 「현장조건」·「작업조건」·「토질명」으로 갈리고 값이 1 이하인 표(작업효율 E). _CONDITION_RE = re.compile(r"현장조건|작업조건|토질명|토질별작업|시공조건") +#: 「인/ton」·「인/개소」 꼴 — 그 단위당 사람 몫이라 품 표다. +_PERSON_PER_RE = re.compile(r"인/(?:ton|톤|개소|개|매|본|㎡|㎥|m|km|대|조|식)") #: 다짐 기준표 머리 — 두께·횟수·규격을 정한 시방 기준. _COMPACT_RE = re.compile(r"다짐두께|다짐횟수|다짐기계|다짐") diff --git a/resources/data_master_labels/labels_2026-01-01.json b/resources/data_master_labels/labels_2026-01-01.json index ddd4d27b..f0b9d94f 100644 --- a/resources/data_master_labels/labels_2026-01-01.json +++ b/resources/data_master_labels/labels_2026-01-01.json @@ -7284,7 +7284,7 @@ "name_ko": "형태 미판정 표", "summary": "생산량형인지 소요량형인지 못 정한 표.", "shape": "list", - "rows": 166, + "rows": 151, "columns": [ { "key": "pum_table_id", @@ -7340,7 +7340,7 @@ "name_ko": "밑수 미확보 표", "summary": "기준 수량을 못 찾은 표.", "shape": "list", - "rows": 438, + "rows": 448, "columns": [ { "key": "pum_table_id", diff --git a/resources/data_work_item_master/_manifest.json b/resources/data_work_item_master/_manifest.json index 30ff4900..5ac2d200 100644 --- a/resources/data_work_item_master/_manifest.json +++ b/resources/data_work_item_master/_manifest.json @@ -1,7 +1,7 @@ { "schema_version": "1.0", "dataset_id": "data_work_item_master_manifest", - "generated_at": "2026-09-18T14:37:31+09:00", + "generated_at": "2026-09-18T16:51:53+09:00", "built_by": "B08_Quantity/B08_Quantity_Build_WorkItemMaster.py", "source": { "dataset_id": "pum_forest", @@ -12,7 +12,7 @@ "files": [ { "file": "work_item_master_2026-01-01.json", - "sha256": "eba4d71093f730296ff74de519949e8bfb573fea129b45b9be31b763db20307a", + "sha256": "784464a30f59368e90c729ed3fcdf18a564c3a72355504ac2bee31a2c41aa82f", "size_bytes": 1095122 }, { diff --git a/resources/data_work_item_master/_manifest_const.json b/resources/data_work_item_master/_manifest_const.json index cde09ad8..d47394a6 100644 --- a/resources/data_work_item_master/_manifest_const.json +++ b/resources/data_work_item_master/_manifest_const.json @@ -1,7 +1,7 @@ { "schema_version": "1.0", "dataset_id": "data_work_item_master_manifest", - "generated_at": "2026-09-18T14:38:23+09:00", + "generated_at": "2026-09-18T16:52:46+09:00", "built_by": "B08_Quantity/B08_Quantity_Build_WorkItemMaster.py", "source": { "dataset_id": "pum_const", @@ -12,18 +12,18 @@ "files": [ { "file": "const_work_item_master_2026-01-01.json", - "sha256": "717ed8edf3aa8f0ecf38634f28ae0ed8c7f47bffbe3a4ede8af6a279396d9933", - "size_bytes": 4730739 + "sha256": "15ad4b6948ca6e720f8993ab776cf5921b1dc9c75e56e06792bc4f73e0041629", + "size_bytes": 4730145 }, { "file": "const_form_undetermined_2026-01-01.json", - "sha256": "efda17341aa6fbf4b51f7ce84a34de803256cb8f02b0facadfdb3e047c06cf69", - "size_bytes": 99099 + "sha256": "83a0f02edfe4e82ac987639596a054aeb068df2db76833ee51eced78187df366", + "size_bytes": 89561 }, { "file": "const_basis_missing_2026-01-01.json", - "sha256": "1cc0da818a26917bedeeae714ae9b39ea8d64fd38099c0480df0491372e35ea4", - "size_bytes": 115094 + "sha256": "dedd132b16c97fb358f6ce7c39657e8f08b673e1b75ae702123d2e8331276a67", + "size_bytes": 117598 } ] } \ No newline at end of file diff --git a/resources/data_work_item_master/const_basis_missing_2026-01-01.json b/resources/data_work_item_master/const_basis_missing_2026-01-01.json index 55301398..98147ebb 100644 --- a/resources/data_work_item_master/const_basis_missing_2026-01-01.json +++ b/resources/data_work_item_master/const_basis_missing_2026-01-01.json @@ -2433,6 +2433,20 @@ "line": 156, "why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)" }, + { + "pum_table_id": "C1641", + "section": "13-1 플랜트 배관13-1-1 플랜트 배관 설치('92, '03년 보완)", + "pum_form": "requirement", + "line": 163, + "why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)" + }, + { + "pum_table_id": "C1642", + "section": "기계설비부문 제13장 플랜트설비공사", + "pum_form": "requirement", + "line": 8, + "why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)" + }, { "pum_table_id": "C1643", "section": "기계설비부문 제13장 플랜트설비공사", @@ -2447,6 +2461,13 @@ "line": 53, "why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)" }, + { + "pum_table_id": "C1645", + "section": "기계설비부문 제13장 플랜트설비공사", + "pum_form": "requirement", + "line": 67, + "why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)" + }, { "pum_table_id": "C1646", "section": "기계설비부문 제13장 플랜트설비공사", @@ -2454,6 +2475,20 @@ "line": 98, "why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)" }, + { + "pum_table_id": "C1647", + "section": "기계설비부문 제13장 플랜트설비공사", + "pum_form": "requirement", + "line": 126, + "why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)" + }, + { + "pum_table_id": "C1648", + "section": "기계설비부문 제13장 플랜트설비공사", + "pum_form": "requirement", + "line": 142, + "why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)" + }, { "pum_table_id": "C1649", "section": "기계설비부문 제13장 플랜트설비공사", @@ -2468,6 +2503,13 @@ "line": 187, "why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)" }, + { + "pum_table_id": "C1651", + "section": "기계설비부문 제13장 플랜트설비공사", + "pum_form": "requirement", + "line": 200, + "why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)" + }, { "pum_table_id": "C1652", "section": "기계설비부문 제13장 플랜트설비공사", @@ -2475,6 +2517,20 @@ "line": 231, "why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)" }, + { + "pum_table_id": "C1653", + "section": "기계설비부문 제13장 플랜트설비공사", + "pum_form": "requirement", + "line": 256, + "why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)" + }, + { + "pum_table_id": "C1654", + "section": "기계설비부문 제13장 플랜트설비공사", + "pum_form": "requirement", + "line": 275, + "why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)" + }, { "pum_table_id": "C1656", "section": "13-1-2 관만곡(Pipe Bending) 설치", @@ -2916,6 +2972,13 @@ "line": 3434, "why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)" }, + { + "pum_table_id": "C1866", + "section": "84313-9-3 산기장치 설치('04년 신설)", + "pum_form": "requirement", + "line": 3446, + "why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)" + }, { "pum_table_id": "C1867", "section": "13-9-4 오수처리시설 설치('04년 신설)", @@ -2923,6 +2986,13 @@ "line": 3458, "why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)" }, + { + "pum_table_id": "C1868", + "section": "13-9-4 오수처리시설 설치('04년 신설)", + "pum_form": "requirement", + "line": 3471, + "why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)" + }, { "pum_table_id": "C1869", "section": "84413-10 운반기계설비13-10-1 OPEN BELT CONVEYOR 설치('92년 보완)Belt폭과 길이에 따른 Belt Conveyor 설치품은 아래의 산출식에 의한다.", diff --git a/resources/data_work_item_master/const_form_undetermined_2026-01-01.json b/resources/data_work_item_master/const_form_undetermined_2026-01-01.json index 36627cea..9ebe4d04 100644 --- a/resources/data_work_item_master/const_form_undetermined_2026-01-01.json +++ b/resources/data_work_item_master/const_form_undetermined_2026-01-01.json @@ -3614,278 +3614,6 @@ ], "reason": "단위·밑수·직종 표지 없음 · 머리 두 단 · 값 있음 — 아래 단을 이어 봐도 표지가 없음" }, - { - "pum_table_id": "C1641", - "section": "13-1-1 플랜트 배관 설치", - "headers": [ - "배 관 구 분" - ], - "first_rows": [ - [ - "옥 내 배 관", - "", - "", - "옥 외 배 관", - "", - "", - "", - "", - "", - "" - ], - [ - "나 사 식", - "", - "인/ ton", - "용 접 식", - "", - "", - "나 사 식", - "", - "", - "인/ ton" - ] - ], - "reason": "단위·밑수·직종 표지 없음 · 머리 두 단 · 값 있음 — 아래 단을 이어 봐도 표지가 없음" - }, - { - "pum_table_id": "C1642", - "section": "13-1-1 플랜트 배관 설치", - "headers": [ - "배 관 구 분" - ], - "first_rows": [ - [ - "옥 내 배 관", - "", - "", - "옥 외 배 관", - "", - "", - "", - "", - "", - "" - ], - [ - "나 사 식", - "", - "인/ ton", - "용 접 식", - "", - "", - "나 사 식", - "", - "", - "인/ ton" - ] - ], - "reason": "단위·밑수·직종 표지 없음 · 머리 두 단 · 값 있음 — 아래 단을 이어 봐도 표지가 없음" - }, - { - "pum_table_id": "C1645", - "section": "13-1-1 플랜트 배관 설치", - "headers": [ - "배 관 구 분" - ], - "first_rows": [ - [ - "옥 내 배 관", - "", - "", - "옥 외 배 관", - "", - "", - "", - "", - "", - "" - ], - [ - "나 사 식", - "", - "인/ ton", - "용 접 식", - "", - "", - "나 사 식", - "", - "", - "인/ ton" - ] - ], - "reason": "단위·밑수·직종 표지 없음 · 머리 두 단 · 값 있음 — 아래 단을 이어 봐도 표지가 없음" - }, - { - "pum_table_id": "C1647", - "section": "13-1-1 플랜트 배관 설치", - "headers": [ - "배 관 구 분" - ], - "first_rows": [ - [ - "옥 내 배 관", - "", - "", - "옥 외 배 관", - "", - "", - "", - "", - "", - "" - ], - [ - "나 사 식", - "", - "인/ ton", - "용 접 식", - "", - "", - "나 사 식", - "", - "", - "인/ ton" - ] - ], - "reason": "단위·밑수·직종 표지 없음 · 머리 두 단 · 값 있음 — 아래 단을 이어 봐도 표지가 없음" - }, - { - "pum_table_id": "C1648", - "section": "13-1-1 플랜트 배관 설치", - "headers": [ - "배 관 구 분" - ], - "first_rows": [ - [ - "옥 내 배 관", - "", - "", - "옥 외 배 관", - "", - "", - "", - "", - "", - "" - ], - [ - "나 사 식", - "", - "인/ ton", - "용 접 식", - "", - "", - "나 사 식", - "", - "", - "인/ ton" - ] - ], - "reason": "단위·밑수·직종 표지 없음 · 머리 두 단 · 값 있음 — 아래 단을 이어 봐도 표지가 없음" - }, - { - "pum_table_id": "C1651", - "section": "13-1-1 플랜트 배관 설치", - "headers": [ - "배 관 구 분" - ], - "first_rows": [ - [ - "옥 내 배 관", - "", - "", - "옥 외 배 관", - "", - "", - "", - "", - "", - "" - ], - [ - "나 사 식", - "", - "인/ ton", - "용 접 식", - "", - "", - "나 사 식", - "", - "", - "인/ ton" - ] - ], - "reason": "단위·밑수·직종 표지 없음 · 머리 두 단 · 값 있음 — 아래 단을 이어 봐도 표지가 없음" - }, - { - "pum_table_id": "C1653", - "section": "13-1-1 플랜트 배관 설치", - "headers": [ - "배 관 구 분" - ], - "first_rows": [ - [ - "옥 내 배 관", - "", - "", - "옥 외 배 관", - "", - "", - "", - "", - "", - "" - ], - [ - "나 사 식", - "", - "인/ ton", - "용 접 식", - "", - "", - "나 사 식", - "", - "", - "인/ ton" - ] - ], - "reason": "단위·밑수·직종 표지 없음 · 머리 두 단 · 값 있음 — 아래 단을 이어 봐도 표지가 없음" - }, - { - "pum_table_id": "C1654", - "section": "13-1-1 플랜트 배관 설치", - "headers": [ - "배 관 구 분" - ], - "first_rows": [ - [ - "옥 내 배 관", - "", - "", - "옥 외 배 관", - "", - "", - "", - "", - "", - "" - ], - [ - "나 사 식", - "", - "인/ ton", - "용 접 식", - "", - "", - "나 사 식", - "", - "", - "인/ ton" - ] - ], - "reason": "단위·밑수·직종 표지 없음 · 머리 두 단 · 값 있음 — 아래 단을 이어 봐도 표지가 없음" - }, { "pum_table_id": "C1655", "section": "13-1-1 플랜트 배관 설치", @@ -4696,185 +4424,6 @@ ], "reason": "단위·밑수·직종 표지 없음 · 머리 두 단 · 값 있음 — 아래 단을 이어 봐도 표지가 없음" }, - { - "pum_table_id": "C1719", - "section": "13-4-3 STORAGE TANK", - "headers": [ - "품 명", - "규 격", - "단위", - "용 량 별" - ], - "first_rows": [ - [ - "", - "", - "", - "3,000", - "5,000", - "7,000", - "10,000(㎥)" - ], - [ - "S t e e l p l a t e p i p e 〃 C h a n n e l A n g l e 전 기 용 접 봉 〃 〃 모 래 화 목 광 명 단 페 인 트 보 일 유 산 소 아 세 틸 렌 시 너", - "4.5t×4'×8' 6t×5'×20' 16t×5'×20' 14t×5'×20' 12t×5'×20' 10t×5'×20' 8t×5'×20' 11t×5'×20' 9t×5'×20' 7t×5'×20' ø12〃 ø10〃 125×65×6 200×90×5 75×75×9 ø4×440 ø3.2×350 ø2.5×330 외부(1회) 외부(2회)", - "매 〃 〃 〃 〃 〃 〃 매 〃 〃 ㎏ 〃 〃 〃 〃 개 〃 〃 ㎥ ㎏ ℓ 〃 〃 〃 〃 〃", - "103 94 - - - - 10 - - 10 2,920 6,040 2,360 610 4,450 6,790 1,705 48 50 109 134 37 28,728 15,048 37", - "147 97 - - - 12 - 12 12 12 4,250 - 8,780 2,580 740 8,359 9,960 2,660 128 100 140 160 45 43,092 22,572 45", - "220 115 15 15 15 15 15 - - - 11,280 - 14,620 2,350 1,040 11,201 12,989 3,647 170 150 186 213 60 67,830 35,530 60", - "295 149 17 17 17 17 17 - - - 11,280 - 14,620 2,350 1,040 12,834 18,176 4,826 206 200 225 258 73 80,997 42,427 73" - ] - ], - "reason": "단위·밑수·직종 표지 없음 · 값은 있는데 표지가 없음 — 사람이 봐야 함" - }, - { - "pum_table_id": "C1775", - "section": "13-6-3 수문 제작", - "headers": [ - "품 명", - "규 격", - "단 위", - "수 문" - ], - "first_rows": [ - [ - "", - "", - "", - "Tainter", - "Roller" - ], - [ - "산 소 아 세 틸 렌 함 석 용 접 봉 모 래 Nozzle 광 명 단 전 력", - "6,000ℓ입 4,500ℓ입 #31×3'×6' 4ø×350ℓ", - "병 병 매 ㎏ ㎥ 개 ℓ ㎾h", - "3.76 3.23 0.71 24.99 0.262 0.5 2.5 370", - "3.0 2.58 0.62 20.0 0.242 0.5 2.2 310" - ] - ], - "reason": "단위·밑수·직종 표지 없음 · 머리 두 단 · 값 있음 — 아래 단을 이어 봐도 표지가 없음" - }, - { - "pum_table_id": "C1781", - "section": "13-6-4 수문 설치", - "headers": [ - "품 명", - "규 격", - "단 위", - "Tainter", - "Roller" - ], - "first_rows": [ - [ - "산 소 아 세 틸 렌 용 접 봉 코 크 스 광 명 단 페 인 트", - "6,000ℓ입 4,500ℓ입 4ø×350ℓ 에나멜", - "병 병 ㎏ ㎏ ℓ ℓ", - "0.53 0.45 6.2 - 2.5 5.0", - "0.46 0.39 5.4 27 2.2 4.4" - ] - ], - "reason": "단위·밑수·직종 표지 없음 · 머리 두 단 · 값 있음 — 아래 단을 이어 봐도 표지가 없음" - }, - { - "pum_table_id": "C1862", - "section": "13-9-1 수중펌프 설치", - "headers": [ - "장 비 명", - "규 격", - "사용시간(hr)" - ], - "first_rows": [ - [ - "", - "", - "7.5㎾", - "15㎾", - "30㎾" - ], - [ - "크 레 인", - "30톤", - "4", - "4", - "4" - ] - ], - "reason": "단위·밑수·직종 표지 없음 · 머리 두 단 · 값 있음 — 아래 단을 이어 봐도 표지가 없음" - }, - { - "pum_table_id": "C1864", - "section": "13-9-2 모노레일 설치", - "headers": [ - "장 비 명", - "규 격", - "사용시간(hr)" - ], - "first_rows": [ - [ - "트 럭 탑 재 형 크 레 인", - "5톤", - "1.3" - ], - [ - "용 접 기", - "15KVA", - "7.6" - ] - ], - "reason": "단위·밑수·직종 표지 없음 · 값은 있는데 표지가 없음 — 사람이 봐야 함" - }, - { - "pum_table_id": "C1866", - "section": "13-9-3 산기장치 설치", - "headers": [ - "장 비 명", - "규 격", - "단 위", - "사용시간(hr)" - ], - "first_rows": [ - [ - "", - "", - "", - "산기 분기관 제작", - "산기장치 설치" - ], - [ - "알 곤 용 접 기", - "300Amp", - "대/개", - "0.285", - "0.285" - ] - ], - "reason": "단위·밑수·직종 표지 없음 · 머리 두 단 · 값 있음 — 아래 단을 이어 봐도 표지가 없음" - }, - { - "pum_table_id": "C1868", - "section": "13-9-4 오수처리시설 설치", - "headers": [ - "장 비 명", - "규 격", - "단 위", - "사용시간(hr)" - ], - "first_rows": [ - [ - "크 레 인", - "50톤", - "대/조", - "8" - ], - [ - "살 수 차", - "5,500ℓ", - "대/조", - "12" - ] - ], - "reason": "단위·밑수·직종 표지 없음 · 값은 있는데 표지가 없음 — 사람이 봐야 함" - }, { "pum_table_id": "C1890", "section": "13-11-4 가설자재 손료율", diff --git a/resources/data_work_item_master/const_work_item_master_2026-01-01.json b/resources/data_work_item_master/const_work_item_master_2026-01-01.json index bbfb254b..f39267a1 100644 --- a/resources/data_work_item_master/const_work_item_master_2026-01-01.json +++ b/resources/data_work_item_master/const_work_item_master_2026-01-01.json @@ -4,7 +4,7 @@ "effective_date": "2026-01-01", "pum_edition": "2026-01-01", "toc_edition": "2026-01-01", - "generated_at": "2026-09-18T14:38:23+09:00", + "generated_at": "2026-09-18T16:52:46+09:00", "dataset_version": { "dataset_id": "pum_const", "effective_date": "2026-01-01", @@ -38,10 +38,10 @@ "tables_total": 2274, "tables_attached": 2274, "tables_orphan": 0, - "form_undetermined": 166, + "form_undetermined": 151, "basis_found": 713, - "basis_missing": 438, - "basis_absent_in_source": 436, + "basis_missing": 448, + "basis_absent_in_source": 446, "basis_unparsed": 2, "basis_grouped": 69, "axis_roles": { @@ -51,8 +51,8 @@ "empty": 26 }, "keys_newly_issued": 0, - "variant_keys_newly_issued": 0, - "variant_keys": 591, + "variant_keys_newly_issued": 1, + "variant_keys": 592, "toc_duplicate_rows": 0, "toc_corrections": 0 }, @@ -151543,8 +151543,8 @@ "pum_table_id": "C1641", "section": "13-1-1 플랜트 배관 설치", "source_line": 163, - "pum_form": "undetermined", - "form_basis": "단위·밑수·직종 표지 없음 · 머리 두 단 · 값 있음 — 아래 단을 이어 봐도 표지가 없음", + "pum_form": "requirement", + "form_basis": "건설 꼴 — '인/ton' — 단위당 사람 몫", "basis_quantity": null, "basis_unit": null, "basis_source": null, @@ -151664,8 +151664,8 @@ "pum_table_id": "C1642", "section": "13-1-1 플랜트 배관 설치", "source_line": 8, - "pum_form": "undetermined", - "form_basis": "단위·밑수·직종 표지 없음 · 머리 두 단 · 값 있음 — 아래 단을 이어 봐도 표지가 없음", + "pum_form": "requirement", + "form_basis": "건설 꼴 — '인/ton' — 단위당 사람 몫", "basis_quantity": null, "basis_unit": null, "basis_source": null, @@ -152297,8 +152297,8 @@ "pum_table_id": "C1645", "section": "13-1-1 플랜트 배관 설치", "source_line": 67, - "pum_form": "undetermined", - "form_basis": "단위·밑수·직종 표지 없음 · 머리 두 단 · 값 있음 — 아래 단을 이어 봐도 표지가 없음", + "pum_form": "requirement", + "form_basis": "건설 꼴 — '인/ton' — 단위당 사람 몫", "basis_quantity": null, "basis_unit": null, "basis_source": null, @@ -152939,8 +152939,8 @@ "pum_table_id": "C1647", "section": "13-1-1 플랜트 배관 설치", "source_line": 126, - "pum_form": "undetermined", - "form_basis": "단위·밑수·직종 표지 없음 · 머리 두 단 · 값 있음 — 아래 단을 이어 봐도 표지가 없음", + "pum_form": "requirement", + "form_basis": "건설 꼴 — '인/ton' — 단위당 사람 몫", "basis_quantity": null, "basis_unit": null, "basis_source": null, @@ -153096,8 +153096,8 @@ "pum_table_id": "C1648", "section": "13-1-1 플랜트 배관 설치", "source_line": 142, - "pum_form": "undetermined", - "form_basis": "단위·밑수·직종 표지 없음 · 머리 두 단 · 값 있음 — 아래 단을 이어 봐도 표지가 없음", + "pum_form": "requirement", + "form_basis": "건설 꼴 — '인/ton' — 단위당 사람 몫", "basis_quantity": null, "basis_unit": null, "basis_source": null, @@ -153717,8 +153717,8 @@ "pum_table_id": "C1651", "section": "13-1-1 플랜트 배관 설치", "source_line": 200, - "pum_form": "undetermined", - "form_basis": "단위·밑수·직종 표지 없음 · 머리 두 단 · 값 있음 — 아래 단을 이어 봐도 표지가 없음", + "pum_form": "requirement", + "form_basis": "건설 꼴 — '인/ton' — 단위당 사람 몫", "basis_quantity": null, "basis_unit": null, "basis_source": null, @@ -154326,8 +154326,8 @@ "pum_table_id": "C1653", "section": "13-1-1 플랜트 배관 설치", "source_line": 256, - "pum_form": "undetermined", - "form_basis": "단위·밑수·직종 표지 없음 · 머리 두 단 · 값 있음 — 아래 단을 이어 봐도 표지가 없음", + "pum_form": "requirement", + "form_basis": "건설 꼴 — '인/ton' — 단위당 사람 몫", "basis_quantity": null, "basis_unit": null, "basis_source": null, @@ -154519,8 +154519,8 @@ "pum_table_id": "C1654", "section": "13-1-1 플랜트 배관 설치", "source_line": 275, - "pum_form": "undetermined", - "form_basis": "단위·밑수·직종 표지 없음 · 머리 두 단 · 값 있음 — 아래 단을 이어 봐도 표지가 없음", + "pum_form": "requirement", + "form_basis": "건설 꼴 — '인/ton' — 단위당 사람 몫", "basis_quantity": null, "basis_unit": null, "basis_source": null, @@ -165993,8 +165993,8 @@ "pum_table_id": "C1719", "section": "13-4-3 STORAGE TANK", "source_line": 1592, - "pum_form": "undetermined", - "form_basis": "단위·밑수·직종 표지 없음 · 값은 있는데 표지가 없음 — 사람이 봐야 함", + "pum_form": "requirement", + "form_basis": "건설 꼴 — 머리에 '품명'+'단위' — 자재 소요량 표", "basis_quantity": 1.0, "basis_unit": "대", "basis_source": "본문", @@ -171123,8 +171123,8 @@ "pum_table_id": "C1775", "section": "13-6-3 수문 제작", "source_line": 2353, - "pum_form": "undetermined", - "form_basis": "단위·밑수·직종 표지 없음 · 머리 두 단 · 값 있음 — 아래 단을 이어 봐도 표지가 없음", + "pum_form": "requirement", + "form_basis": "건설 꼴 — 머리에 '품명'+'단위' — 자재 소요량 표", "basis_quantity": 1.0, "basis_unit": "ton", "basis_source": "본문", @@ -171649,8 +171649,8 @@ "pum_table_id": "C1781", "section": "13-6-4 수문 설치", "source_line": 2459, - "pum_form": "undetermined", - "form_basis": "단위·밑수·직종 표지 없음 · 머리 두 단 · 값 있음 — 아래 단을 이어 봐도 표지가 없음", + "pum_form": "requirement", + "form_basis": "건설 꼴 — 머리에 '품명'+'단위' — 자재 소요량 표", "basis_quantity": 1.0, "basis_unit": "ton", "basis_source": "본문", @@ -176627,8 +176627,8 @@ "pum_table_id": "C1862", "section": "13-9-1 수중펌프 설치", "source_line": 3403, - "pum_form": "undetermined", - "form_basis": "단위·밑수·직종 표지 없음 · 머리 두 단 · 값 있음 — 아래 단을 이어 봐도 표지가 없음", + "pum_form": "requirement", + "form_basis": "건설 꼴 — 머리에 '사용시간' — 장비 소요시간", "basis_quantity": 1.0, "basis_unit": "대", "basis_source": "본문", @@ -176640,7 +176640,11 @@ "formula_rows": [], "special_glyphs": [], "capacity_formula_here": false, - "variant_key": [], + "variant_key": [ + "7.5㎾", + "15㎾", + "30㎾" + ], "notes": [ "[주] 본 장비는 펌프설치시 기본적인 장비이므로 현장여건, 작업조건 등에 따라 필요한 장비를 별도 계상한다." ], @@ -176767,8 +176771,8 @@ "pum_table_id": "C1864", "section": "13-9-2 모노레일 설치", "source_line": 3425, - "pum_form": "undetermined", - "form_basis": "단위·밑수·직종 표지 없음 · 값은 있는데 표지가 없음 — 사람이 봐야 함", + "pum_form": "requirement", + "form_basis": "건설 꼴 — 머리에 '사용시간' — 장비 소요시간", "basis_quantity": 1.0, "basis_unit": "ton", "basis_source": "본문", @@ -176884,8 +176888,8 @@ "pum_table_id": "C1866", "section": "13-9-3 산기장치 설치", "source_line": 3446, - "pum_form": "undetermined", - "form_basis": "단위·밑수·직종 표지 없음 · 머리 두 단 · 값 있음 — 아래 단을 이어 봐도 표지가 없음", + "pum_form": "requirement", + "form_basis": "건설 꼴 — 머리에 '사용시간' — 장비 소요시간", "basis_quantity": null, "basis_unit": null, "basis_source": null, @@ -176897,7 +176901,10 @@ "formula_rows": [], "special_glyphs": [], "capacity_formula_here": false, - "variant_key": [], + "variant_key": [ + "산기 분기관 제작", + "산기장치 설치" + ], "notes": [ "[주] 본 장비는 산기 분기관 제작 및 산기장치 설치시 일반적인 장비이므로 현장여건, 작업조건 등에 따라 필요한 장비를 별도 계상한다." ], @@ -176942,7 +176949,8 @@ "division": "기계설비부문", "variant_keys": [ "산 기 분 기 관 제 작", - "분기관 및 산기장치 설치" + "분기관 및 산기장치 설치", + "산기장치 설치" ], "work_item_key": "CW-01201", "variants": [ @@ -176955,6 +176963,11 @@ "variant_key": "02", "name": "분기관 및 산기장치 설치", "name_clean": "분기관 및 산기장치 설치" + }, + { + "variant_key": "03", + "name": "산기장치 설치", + "name_clean": "산기장치 설치" } ], "toc_code": "CP-04-13-09-03", @@ -177027,8 +177040,8 @@ "pum_table_id": "C1868", "section": "13-9-4 오수처리시설 설치", "source_line": 3471, - "pum_form": "undetermined", - "form_basis": "단위·밑수·직종 표지 없음 · 값은 있는데 표지가 없음 — 사람이 봐야 함", + "pum_form": "requirement", + "form_basis": "건설 꼴 — 머리에 '사용시간' — 장비 소요시간", "basis_quantity": null, "basis_unit": null, "basis_source": null, diff --git a/resources/data_work_item_master/work_item_keys_const.json b/resources/data_work_item_master/work_item_keys_const.json index a1946493..a53ac2c1 100644 --- a/resources/data_work_item_master/work_item_keys_const.json +++ b/resources/data_work_item_master/work_item_keys_const.json @@ -11997,10 +11997,11 @@ } }, "CW-01201": { - "next_serial": 3, + "next_serial": 4, "slots": { "산기분기관제작": "01", - "분기관및산기장치설치": "02" + "분기관및산기장치설치": "02", + "산기장치설치": "03" } }, "CW-01291": { diff --git a/resources/data_work_item_master/work_item_master_2026-01-01.json b/resources/data_work_item_master/work_item_master_2026-01-01.json index 3ab2d533..e61b0be5 100644 --- a/resources/data_work_item_master/work_item_master_2026-01-01.json +++ b/resources/data_work_item_master/work_item_master_2026-01-01.json @@ -4,7 +4,7 @@ "effective_date": "2026-01-01", "pum_edition": "2026-01-01", "toc_edition": "산림청고시제2025-82호", - "generated_at": "2026-09-18T14:37:31+09:00", + "generated_at": "2026-09-18T16:51:53+09:00", "dataset_version": { "dataset_id": "pum_forest", "effective_date": "2026-01-01", diff --git a/resources/tester/test_z01_work_items.py b/resources/tester/test_z01_work_items.py index 657841b2..5bce9ff6 100644 --- a/resources/tester/test_z01_work_items.py +++ b/resources/tester/test_z01_work_items.py @@ -85,7 +85,7 @@ def test_건설_공종_축도_같은_길(client: TestClient) -> None: # 2026-09-18 랩탑 메인 — 건설 표 모양 판정층으로 미판정 891 → 276 이 되며 품 표가 늘어 줄도 늘었다. # 2026-09-18 합침 — 다른 창이 원문 md 의 뭉친 줄·표를 더 풀어(건설 표 2,202 → 2,270) 공종·줄이 또 늘었다. # 값이 바뀐 것이 아니라 **원문에 있던 표가 더 읽힌 것**이다(직접공사비 5,983,724 그대로). - assert table["stats"] == {"work_items": 1046, "units": 1502} and table["total"] == 1502 + assert table["stats"] == {"work_items": 1046, "units": 1503} and table["total"] == 1503 assert sum(1 for r in table["rows"] if "#" in r["@id"]) > 0 rows = table["rows"] assert all(r["@id"].startswith("CW-") for r in rows)