From 597bb35458964986c4ace4065134fb5aca70ae15 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Tue, 22 Sep 2026 13:43:06 +0900 Subject: [PATCH] =?UTF-8?q?feat(M01):=20PLAN=207-4b=20=EB=92=A4=20?= =?UTF-8?q?=EC=A0=88=EB=B0=98=20=E2=91=A1=20=E2=80=94=20=EC=95=A0=EB=A7=A4?= =?UTF-8?q?=ED=95=9C=20=ED=9B=84=EB=B3=B4=20=EC=85=8B(=EC=83=89=EC=86=8C?= =?UTF-8?q?=C2=B7=EC=97=90=ED=8F=AD=EC=8B=9C=C2=B7=EB=95=9C=EB=82=A9)=20?= =?UTF-8?q?=EA=B0=92=20=EC=97=86=EC=96=B4=EB=8F=84=20=EC=9D=B4=EC=9D=8C=20?= =?UTF-8?q?=C2=B7=20=EB=B2=84=EB=84=88=C2=B7=ED=93=A8=EC=A6=88=20=EB=91=98?= =?UTF-8?q?=EC=9D=80=20=EB=AA=BB=20=EA=B3=A0=EB=A6=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 사용자 확정(값이 없어도 그냥 넘어감)에 따라 규격·지역이 애매해도 가장 맞는 자재품목 줄로 이음: · 색소(MP000078) → 착색제(M-Green, MT006740) — 후보 1줄뿐이라 그대로 · 에폭시(MP000082) → 주입용 에폭시 습식(MT007705) — 후보 4줄(주입용 습식·건식· 씰링용) 가운데 낙석방지망 앵커 주입에 흔한 습식형 · 땜납(MP000285) → 봉땜납 Sn30%(MT001252) — 후보 둘(Sn10%·Sn30%) 가운데 원문 50:50 에 더 가까운 쪽(정확히는 안 맞음 — 비고에 적음) 버너(MP000209)·퓨즈(MP000214)는 후보가 있어도 물건 자체가 다름 — 버너 후보(개장로용 가스버너, 6~9구용, 915만원)는 산업용 화덕이지 압접가열용 소형버너가 아니고, 퓨즈 후보 다섯(전선퓨즈·통형퓨즈·고리퓨즈)은 모두 전기용이지 테르밋 용접 점화용이 아님 — 못 골라 그대로 둠(비고 그대로). build_로직_재료_고르기.py 다시 돌려 로직 3개 파일에 고르기 조건 3줄 반영. test_자재품목_분류.py — 기대표에 셋 더함(품명과 자재품목 이름이 달라 뿌리-이름 우선 검사에서 스페이셔와 같은 이유로 뺌). typecheck 통과 · 관련 시험 108 통과. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_016WRFJmmhPi4exAzHgPZHMT --- .../master_data/로직_건설품셈_01장_도로포장공사.json | 2 +- .../master_data/로직_건설품셈_04장_조경공사.json | 2 +- .../로직_건설품셈_13장_플랜트설비공사.json | 2 +- resources/master_data/재료_품셈재료.json | 6 +++--- resources/tester/test_자재품목_분류.py | 12 +++++++++--- 5 files changed, 15 insertions(+), 9 deletions(-) diff --git a/resources/master_data/로직_건설품셈_01장_도로포장공사.json b/resources/master_data/로직_건설품셈_01장_도로포장공사.json index 93bbfd93..d19f2ee4 100644 --- a/resources/master_data/로직_건설품셈_01장_도로포장공사.json +++ b/resources/master_data/로직_건설품셈_01장_도로포장공사.json @@ -4296,7 +4296,7 @@ }, { "종류": "재료", - "요소": "MP000082", + "요소": {"구분": "도료·방수·접착", "상세구분": "도료", "규격": "M-Poxy I(습식)", "대표": "MT007705"}, "이름": "에폭시", "단위": "kg", "수량": "만약(방지망 == '포켓식', 찾기(QC000569, 구분='에폭시').수량, 0)", diff --git a/resources/master_data/로직_건설품셈_04장_조경공사.json b/resources/master_data/로직_건설품셈_04장_조경공사.json index 993a0fbb..9c08e885 100644 --- a/resources/master_data/로직_건설품셈_04장_조경공사.json +++ b/resources/master_data/로직_건설품셈_04장_조경공사.json @@ -217,7 +217,7 @@ }, { "종류": "재료", - "요소": "MP000078", + "요소": {"구분": "도료·방수·접착", "상세구분": "접착·혼화", "규격": "색소(M-Green)", "대표": "MT006740"}, "이름": "색소(착색제)", "단위": "㎏", "수량": "찾기(QC000274, 구분='색소').수량 / 100", diff --git a/resources/master_data/로직_건설품셈_13장_플랜트설비공사.json b/resources/master_data/로직_건설품셈_13장_플랜트설비공사.json index c93b4ca5..a8211ff5 100644 --- a/resources/master_data/로직_건설품셈_13장_플랜트설비공사.json +++ b/resources/master_data/로직_건설품셈_13장_플랜트설비공사.json @@ -8423,7 +8423,7 @@ }, { "종류": "재료", - "요소": "MP000285", + "요소": {"구분": "잡재료", "상세구분": "고철·기타금속", "규격": "Sn 30%", "대표": "MT001252"}, "이름": "땜납", "단위": "㎏", "수량": "0.055", diff --git a/resources/master_data/재료_품셈재료.json b/resources/master_data/재료_품셈재료.json index b1bc75d9..85fb6e65 100644 --- a/resources/master_data/재료_품셈재료.json +++ b/resources/master_data/재료_품셈재료.json @@ -86,11 +86,11 @@ { "키": "MP000075", "원문번호": "복합비료", "이름": "비료", "규격": "복합비료", "단위": "㎏", "요구절": ["건설품셈 공통 4-1-3 재료량"], "연결": "MT006489", "고르기": null, "비고": "연결: 복합비료 규격 없는 kg 줄" }, { "키": "MP000076", "원문번호": "피복제", "이름": "피복제", "규격": "화이버/펄프류", "단위": "㎏", "요구절": ["건설품셈 공통 4-1-3 재료량"], "연결": "MT030610", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030610)로 이음 · 값 미확보" }, { "키": "MP000077", "원문번호": "침식방지안정제", "이름": "침식방지안정제", "규격": "합성접착제", "단위": "㎏", "요구절": ["건설품셈 공통 4-1-3 재료량"], "연결": "MT030611", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030611)로 이음 · 값 미확보" }, - { "키": "MP000078", "원문번호": "착색제", "이름": "색소", "규격": "착색제", "단위": "㎏", "요구절": ["건설품셈 공통 4-1-3 재료량"], "연결": null, "고르기": null, "비고": "자재품목 후보 1줄 — 지역·규격 선택 필요 (MT006740) · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" }, + { "키": "MP000078", "원문번호": "착색제", "이름": "색소", "규격": "착색제", "단위": "㎏", "요구절": ["건설품셈 공통 4-1-3 재료량"], "연결": "MT006740", "고르기": null, "비고": "PLAN 7-4b: 후보 1줄(착색제, M-Green)뿐이라 그대로 이음" }, { "키": "MP000079", "원문번호": "차선도색 프라이머", "이름": "프라이머", "규격": "융착식 도료 차선도색용", "단위": "kg", "요구절": ["건설품셈 토목 1-8-9 융착식 도료 수동식 재료", "건설품셈 유지관리 2-1-15 4 자재수량"], "연결": null, "고르기": {"구분": "도료·방수·접착", "상세구분": "도료"}, "비고": "자재품목 후보 19줄 — 지역·규격 선택 필요 (MT003562, MT003588, MT003600 외)" }, { "키": "MP000080", "원문번호": "낙석방지망 철망", "이름": "철망", "규격": "낙석방지망용", "단위": "㎡", "요구절": ["건설품셈 토목 1-9-4 낙석방지망 재료(참고자료)"], "연결": null, "고르기": null, "비고": "자재품목 후보 6줄 — 지역·규격 선택 필요 (MT006697, MT007164, MT007165 외) · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" }, { "키": "MP000081", "원문번호": "결속선", "이름": "결속선", "규격": "", "단위": "m", "요구절": ["건설품셈 토목 1-9-4 낙석방지망 재료(참고자료)"], "연결": null, "고르기": {"구분": "철근·강재", "상세구분": "철선", "대표": "MT000194"}, "비고": "자재품목 후보 1줄 — 지역·규격 선택 필요 (MT007332)" }, - { "키": "MP000082", "원문번호": "에폭시", "이름": "에폭시", "규격": "", "단위": "kg", "요구절": ["건설품셈 토목 1-9-4 낙석방지망 재료(참고자료)"], "연결": null, "고르기": null, "비고": "포켓식만 · 자재품목 후보 4줄 — 지역·규격 선택 필요 (MT007705, MT007706, MT007931 외) · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" }, + { "키": "MP000082", "원문번호": "에폭시", "이름": "에폭시", "규격": "", "단위": "kg", "요구절": ["건설품셈 토목 1-9-4 낙석방지망 재료(참고자료)"], "연결": "MT007705", "고르기": null, "비고": "PLAN 7-4b: 후보 4줄(주입용 습식·건식·씰링용) 가운데 낙석방지망 앵커 주입에 흔한 주입용 습식으로 이음(사용자 확정 — 값 없어도 넘어감)" }, { "키": "MP000083", "원문번호": "에폭시 신구콘크리트 접착제", "이름": "Epoxy 신구-콘크리트 접착제", "규격": "", "단위": "kg", "요구절": ["건설품셈 공통 6-1-5"], "연결": null, "고르기": {"구분": "도료·방수·접착", "상세구분": "접착·혼화"}, "비고": "자재품목에 같은 품명 없음" }, { "키": "MP000084", "원문번호": "에폭시 콘크리트고무 접착제", "이름": "Epoxy-콘크리트 고무 접착제", "규격": "", "단위": "kg", "요구절": ["건설품셈 공통 6-1-5"], "연결": null, "고르기": {"구분": "도료·방수·접착", "상세구분": "접착·혼화"}, "비고": "자재품목에 같은 품명 없음" }, { "키": "MP000085", "원문번호": "폼타이 9.5㎜", "이름": "폼타이(Form Tie)", "규격": "9.5㎜", "단위": "본", "요구절": ["건설품셈 공통 6-3-1 주④"], "연결": null, "고르기": null, "비고": "폼타이 값은 「조」 — 본 환산 안 함 · 고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" }, @@ -293,7 +293,7 @@ { "키": "MP000282", "원문번호": "비닐시트 3m×3m", "이름": "비닐시트", "규격": "3m×3m", "단위": "Sh", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" }, { "키": "MP000283", "원문번호": "방청페인트 DR-80", "이름": "방청페인트", "규격": "DR-80", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": null, "고르기": {"구분": "도료·방수·접착", "상세구분": "도료", "대표": "MT003378"}, "비고": "자재품목 후보 1줄 — 지역·규격 선택 필요 (MT003378)" }, { "키": "MP000284", "원문번호": "페인트 노루표", "이름": "페인트", "규격": "노루표", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": null, "고르기": null, "비고": "자재품목 후보 47줄 — 지역·규격 선택 필요 (MT003366, MT003367, MT003368 외) · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" }, - { "키": "MP000285", "원문번호": "땜납 50 : 50", "이름": "땜납", "규격": "50 : 50", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": null, "고르기": null, "비고": "자재품목 후보 2줄 — 지역·규격 선택 필요 (MT001251, MT001252) · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" }, + { "키": "MP000285", "원문번호": "땜납 50 : 50", "이름": "땜납", "규격": "50 : 50", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": "MT001252", "고르기": null, "비고": "PLAN 7-4b: 봉땜납 후보 둘(Sn10%·Sn30%) — 원문 50:50 과 정확히는 안 맞아 더 가까운 Sn30% 로 이음(사용자 확정 — 값 없어도 넘어감)" }, { "키": "MP000286", "원문번호": "붕사", "이름": "붕사", "규격": "", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": "MT030661", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030661)로 이음 · 값 미확보" }, { "키": "MP000287", "원문번호": "Compound 절연용", "이름": "Compound", "규격": "절연용", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": "MT030662", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030662)로 이음 · 값 미확보" }, { "키": "MP000288", "원문번호": "3-Bond 밀착제 No.2", "이름": "3-Bond", "규격": "밀착제 No.2", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": "MT030663", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030663)로 이음 · 값 미확보" }, diff --git a/resources/tester/test_자재품목_분류.py b/resources/tester/test_자재품목_분류.py index 480b37cc..29fd1253 100644 --- a/resources/tester/test_자재품목_분류.py +++ b/resources/tester/test_자재품목_분류.py @@ -66,7 +66,11 @@ PM = json.loads((MD / "재료_품셈재료.json").read_text(encoding="utf-8"))[" "용접봉": "잡재료", "물": "잡재료", "고철": "잡재료", - # PLAN 7-4b 뒤 절반 — 자재품목에 짝 없던 재료 106종을 새 줄로 만들어 이음(값 미확보) + # PLAN 7-4b 뒤 절반 ② — 후보는 있으나 애매해 어제 뺀 것 가운데 셋(값 없어도 넘어감) + "색소": "도료·방수·접착", + "에폭시": "도료·방수·접착", + "땜납": "잡재료", + # PLAN 7-4b 뒤 절반 ① — 자재품목에 짝 없던 재료 106종을 새 줄로 만들어 이음(값 미확보) "3-Bond": "잡재료", "BASECHANNEL": "건축마감", "Center Punch": "기계·설비", @@ -202,8 +206,10 @@ def test_품셈재료_연결_줄이_제_묶음(): def test_품셈재료_이름과_같은_품명_줄이_한_묶음(): # 「스페이셔(몰탈 블록)」 은 뿌리(「스페이셔」)가 같은 다른 물건(철근 스페이셔, 교량·구조부속)과 # 이름만 겹침 — PLAN 7-4b 뒤 절반이 자재품목 새 줄(시멘트·골재)에 「대표」로 콕 집어 이어 - # 실제로는 안 섞임(test_품셈재료_연결_줄이_제_묶음 이 그 연결을 확인) · 이 뿌리-우선 검사만 뺌 - 제외_뿌리충돌 = {"스페이셔(몰탈 블록)"} + # 실제로는 안 섞임(test_품셈재료_연결_줄이_제_묶음 이 그 연결을 확인) · 이 뿌리-우선 검사만 뺌. + # 색소·에폭시·땜납은 PLAN 7-4b ② — 품셈 이름과 자재품목 이름이 달라(착색제·주입용 에폭시· + # 봉땜납) 대표로 콕 집어 이음 · 뿌리 이름으로는 자재품목에 아예 없어 이 검사 대상 밖. + 제외_뿌리충돌 = {"스페이셔(몰탈 블록)", "색소", "에폭시", "땜납"} idx = collections.defaultdict(list) for x in ROWS: idx[_root(x["이름"])].append(x)