From d9a3106181ab931d72e34139f9952e0ce843688d Mon Sep 17 00:00:00 2001 From: umsangdon Date: Mon, 21 Sep 2026 21:35:50 +0900 Subject: [PATCH] =?UTF-8?q?fix(master):=2013=EC=9E=A5=20=EB=8F=8C=EC=8C=93?= =?UTF-8?q?=EA=B8=B0=C2=B7=EB=8F=8C=EB=B6=99=EC=9E=84=20=EC=B2=AB=20?= =?UTF-8?q?=EA=B3=A0=EB=A5=B4=EA=B8=B0=20=EC=A1=B0=ED=95=A9=EC=9D=84=20?= =?UTF-8?q?=EC=9B=90=EB=AC=B8=EC=97=90=20=EC=9E=88=EB=8A=94=20=EC=A1=B0?= =?UTF-8?q?=ED=95=A9=EC=9C=BC=EB=A1=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 화면은 고르기 첫 값으로 열리는데 13-4-1(뒷길이 25 · 견치돌 · 골쌓기) · 13-5-1(25 · 메붙임 · 깬돌) 이 원문 표에 없어 「맞는 줄 0개」 로 멈추던 것 — 「돌」 고르기 차례만 바꿔 첫 값을 깬잡석으로(값은 안 고침 · 비고에 한 줄). 같은 흠 일괄 조사 53 → 51 · 남은 51 은 설계자가 넣을 수가 비어 1 이 들어간 탓(목록 ref/_첫조합_없는로직.md) · 되풀이 검사 시험 한 건. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01JgUhN55Z3BCYhUJTjwTNfj --- resources/master_data/ref/_첫조합_없는로직.md | 42 +++++++++++++++++++ .../로직_산림품셈_13장_구조물.json | 8 ++-- resources/tester/test_masterdata_check.py | 21 ++++++++++ 3 files changed, 67 insertions(+), 4 deletions(-) create mode 100644 resources/master_data/ref/_첫조합_없는로직.md diff --git a/resources/master_data/ref/_첫조합_없는로직.md b/resources/master_data/ref/_첫조합_없는로직.md new file mode 100644 index 00000000..b8991a62 --- /dev/null +++ b/resources/master_data/ref/_첫조합_없는로직.md @@ -0,0 +1,42 @@ +# 첫 조합으로 열면 「맞는 줄 0개」 인 로직 (2026-09-21) + +첫 조합 = 화면이 처음 보이는 값 — 입력의 「고르기」 첫 값 · 「범위」 위끝 · 빈 칸은 수 1. +로직의 「시험입력」 칸은 일괄 시험 계산만 씀 — 화면은 안 읽음. + +로직 1,354개를 첫 조합으로 돌린 결과 표 찾기가 0 줄인 것 **53 → 51**(둘 고침). + +## 고친 것 — 고르기 첫 값이 원문에 없는 조합 (2줄) + +| 로직 | 첫 조합(옛) | 표 | 고침 | +|---|---|---|---| +| `GF000219` 13-4-1 돌쌓기 메쌓기(인력) | 뒷길이 25 · 견치돌 · 골쌓기 | QF000421 | 「돌」 고르기 차례를 바꿔 첫 값 = 깬잡석 (25 · 깬잡석 · 골쌓기 = 원문 첫 줄) | +| `GF000223` 13-5-1 돌붙임(인력) | 뒷길이 25 · 메붙임 · 깬돌 | QF000432 | 같음 — 첫 값 = 깬잡석 (25 · 깬잡석 = 원문에 있음) | + +- 원문 표는 뒷길이 25 에 깬잡석 · 호박돌만 둠(견치돌은 35 부터 · 깬돌은 30 부터) — 값은 하나도 안 고치고 **고르기 차례만** 바꿈. +- 시험입력 칸이 아니라 고르기 차례를 고른 까닭: 화면은 시험입력을 안 읽어 고쳐도 첫 화면이 그대로 멈춤. +- `GF000223` 은 조합을 고친 뒤에도 「MP000065 틈메우기돌 값 없음」 에서 멈춤 — 재료 채우기 몫(`ref/_없는_재료.md`). + +## 남은 51줄 — 빈 칸(수)이 1 로 채워져 0 줄 + +고르기가 아니라 **설계자가 넣을 수**(규격 ㎜ · 직경 · 연장 따위)가 비어 1 이 들어간 탓. +화면에서 사용자가 실제 값을 넣으면 풀림 — 데이터 흠이 아님. + +| 파일 | 줄 | 걸린 조건(보기) | +|---|---|---| +| 건설품셈 01장 배관공사 | 18 | `규격(㎜)=1` · `관규격(㎜)=1` | +| 건설품셈 04장 펌프·공기설비 | 7 | `규격(㎾이하)=1` | +| 건설품셈 05장 밸브설비 | 6 | `규격(㎜)=1` | +| 건설품셈 06장 측정기기 | 5 | `규격(mm)=1` | +| 산림품셈 13장 구조물(큰돌) | 5 | `직경=1` | +| 건설품셈 05장 기초공사 | 4 | `혼합층연장=1` 이 「토질=혼합층」 을 켬 | +| 건설품셈 03장 보온공사 | 3 | `배관규격(mm)=1` | +| 건설품셈 02장 덕트공사 | 2 | `규격(mm)=1` | +| 산림품셈 07장 집재·운재 | 1 | `최대집재거리=1` · `집재재적=1` | + +건설품셈 05장 기초공사 4줄(`GC000176` · `GC000189` · `GC000191` · `GC000195`)은 수를 넣어도 비트·말뚝직경 조합이 원문에 없는 자리가 있음 — 그 목록은 각 로직 비고의 「원문에 없는 조합」. + +## 다음 + +1. 빈 칸 51줄은 화면에서 「값을 넣어야 계산됨」 안내로 풀림(화면 몫 — 이 창 밖). +2. 고르기 조합이 아예 없는 자리는 로직 비고의 「원문에 없는 조합」 이 이미 적음 — 화면에 그 안내를 띄우는 것이 다음 걸음. +3. 되풀이 검사: `resources/tester/test_masterdata_check.py::test_첫_고르기_조합은_원문에_있는_줄`. diff --git a/resources/master_data/로직_산림품셈_13장_구조물.json b/resources/master_data/로직_산림품셈_13장_구조물.json index efd615a3..0bc3d978 100644 --- a/resources/master_data/로직_산림품셈_13장_구조물.json +++ b/resources/master_data/로직_산림품셈_13장_구조물.json @@ -288,11 +288,11 @@ "결과단위": "원/㎡", "출처": "산림품셈 13-4-1", "소유": "공용", - "비고": "「원문에 없는 조합: 뒷길이=25 · 돌=견치돌 · 쌓기=골쌓기 / 뒷길이=25 · 돌=견치돌 · 쌓기=켜쌓기 / 뒷길이=25 · 돌=깬돌 · 쌓기=골쌓기 / 뒷길이=25 · 돌=깬돌 · 쌓기=켜쌓기 / 뒷길이=30 · 돌=견치돌 · 쌓기=골쌓기 외 5」", + "비고": "고르기 첫 값 = 원문에 있는 조합(뒷길이 25 · 깬잡석 · 골쌓기) · 「원문에 없는 조합: 뒷길이=25 · 돌=견치돌 · 쌓기=골쌓기 / 뒷길이=25 · 돌=견치돌 · 쌓기=켜쌓기 / 뒷길이=25 · 돌=깬돌 · 쌓기=골쌓기 / 뒷길이=25 · 돌=깬돌 · 쌓기=켜쌓기 / 뒷길이=30 · 돌=견치돌 · 쌓기=골쌓기 외 5」", "시험입력": {"높이": 4.0, "돌": "깬잡석"}, "입력": [ { "이름": "뒷길이", "설명": "쌓을 돌의 뒤쪽 길이", "단위": "㎝", "고르기": [25, 30, 35, 45, 55, 60, 75] }, - { "이름": "돌", "설명": "쌓을 돌 종류", "고르기": ["견치돌", "깬돌", "깬잡석", "호박돌 및 야면석"] }, + { "이름": "돌", "설명": "쌓을 돌 종류", "고르기": ["깬잡석", "견치돌", "깬돌", "호박돌 및 야면석"] }, { "이름": "쌓기", "설명": "돌을 어긋나게 쌓는지 줄 맞춰 쌓는지", "고르기": ["골쌓기", "켜쌓기"] }, { "이름": "높이", "설명": "쌓는 벽 높이", "단위": "m" }, { "이름": "초과증가율", "설명": "기준 높이를 넘어 더 드는 품 비율", "단위": "%", "범위": [80, 100] } @@ -677,7 +677,7 @@ "결과단위": "원/㎡", "출처": "산림품셈 13-5-1", "소유": "공용", - "비고": "해석: 채움 콘크리트 = 레디믹스트콘크리트 · 해석: 돌 이름을 채움·고임돌 표 종별로 맞춤(조약돌·호박돌 및 야면석 → 야면석 · 채움은 호박돌) · 줄눈 모르타르는 원문대로 메붙임에도 얹음 · 뒷길이 70 은 찾기 실패 — 원문 표에 70 없음 · 「원문에 없는 조합: 뒷길이=25 · 붙임=메붙임 · 돌=깬돌 / 뒷길이=25 · 붙임=메붙임 · 돌=호박돌 및 야면석 / 뒷길이=25 · 붙임=찰붙임 · 돌=깬돌 / 뒷길이=25 · 붙임=찰붙임 · 돌=조약돌 및 야면석 / 뒷길이=30 · 붙임=메붙임 · 돌=호박돌 및 야면석 외 17」", + "비고": "고르기 첫 값 = 원문에 있는 조합(뒷길이 25 · 메붙임 · 깬잡석) · 해석: 채움 콘크리트 = 레디믹스트콘크리트 · 해석: 돌 이름을 채움·고임돌 표 종별로 맞춤(조약돌·호박돌 및 야면석 → 야면석 · 채움은 호박돌) · 줄눈 모르타르는 원문대로 메붙임에도 얹음 · 뒷길이 70 은 찾기 실패 — 원문 표에 70 없음 · 「원문에 없는 조합: 뒷길이=25 · 붙임=메붙임 · 돌=깬돌 / 뒷길이=25 · 붙임=메붙임 · 돌=호박돌 및 야면석 / 뒷길이=25 · 붙임=찰붙임 · 돌=깬돌 / 뒷길이=25 · 붙임=찰붙임 · 돌=조약돌 및 야면석 / 뒷길이=30 · 붙임=메붙임 · 돌=호박돌 및 야면석 외 17」", "시험입력": {"뒷길이": 30, "붙임": "메붙임", "돌": "깬돌", "굵은골재최대치수": 25, "강도": 18, "슬럼프": "080"}, "입력": [ { @@ -746,8 +746,8 @@ { "이름": "돌", "고르기": [ - "깬돌", "깬잡석", + "깬돌", "조약돌 및 야면석", "호박돌 및 야면석" ] diff --git a/resources/tester/test_masterdata_check.py b/resources/tester/test_masterdata_check.py index b56f4bea..823cd6b3 100644 --- a/resources/tester/test_masterdata_check.py +++ b/resources/tester/test_masterdata_check.py @@ -472,6 +472,27 @@ def test_범위_입력은_막음(whole): ) +def test_첫_고르기_조합은_원문에_있는_줄(whole): + """화면은 고르기 첫 값으로 열림 — 그 조합이 표에 있어야 함(13장 돌쌓기·돌붙임).""" + rows = { + str(row["키"]): row + for data in cm.load(["로직_산림품셈_13장_구조물.json"]).values() + for row in data["줄"] + } + for key in ("GF000219", "GF000223"): # 13-4-1 메쌓기 · 13-5-1 돌붙임 + row = rows[key] + given = { + spec["이름"]: spec["고르기"][0] + if spec.get("고르기") + else (spec["범위"][1] if spec.get("범위") else Decimal(1)) + for spec in row["입력"] + } + try: + mf.run(whole, key, given) + except mf.FormulaError as err: # 다른 막힘(재료 값 없음)은 여기 몫이 아님 + assert "맞는 줄 0개" not in str(err), f"{key} · {err}" + + def test_견본_파일_검사_통과(whole): files = cm.load(SAMPLES) assert len(files) == len(SAMPLES)