From 68f1c20e65fb7c4605e3b5feee7f24faa96948f6 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sun, 4 Oct 2026 21:22:09 +0900 Subject: [PATCH] =?UTF-8?q?fix(M01):=20=EC=9E=90=EC=9E=AC=20=C2=B7=20?= =?UTF-8?q?=EC=A7=81=EC=A2=85=20=EA=B3=A0=EB=A5=B4=EA=B8=B0=20=EC=B0=BE?= =?UTF-8?q?=EA=B8=B0=20=E2=80=94=20=EB=82=B1=EB=A7=90=EC=9D=B4=20=ED=82=A4?= =?UTF-8?q?(MT=E2=80=A6)=EC=99=80=20=EA=B0=99=EC=9C=BC=EB=A9=B4=20?= =?UTF-8?q?=EB=A7=9E=EC=9D=8C(39-8=20=C2=B7=20=EC=B0=BE=EA=B8=B0=20?= =?UTF-8?q?=EC=B9=B8=20=EA=B8=80=20=E3=80=8C=EC=9D=B4=EB=A6=84=20=C2=B7=20?= =?UTF-8?q?=EA=B7=9C=EA=B2=A9=20=C2=B7=20=EC=BD=94=EB=93=9C=E3=80=8D=20?= =?UTF-8?q?=EC=99=80=20=EB=A7=9E=EC=B6=A4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 이름 · 규격 낱말 AND · 띄어쓰기는 그대로 · 원본 자료는 읽기만 - M02 일위대가 [자재 추가] · M01 자재 고르기가 같은 길(/api/m01/pick) Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01NPJGtfXo6GMbcpiboQC4uK --- M01_MasterData/M01_MasterData_Store.py | 4 ++-- resources/tester/test_m01_api.py | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/M01_MasterData/M01_MasterData_Store.py b/M01_MasterData/M01_MasterData_Store.py index 8f7b2d789..0e95c8319 100644 --- a/M01_MasterData/M01_MasterData_Store.py +++ b/M01_MasterData/M01_MasterData_Store.py @@ -470,7 +470,7 @@ def _lowest(row: dict) -> object: def pick(kind: str, q: str, limit: int) -> dict: """고르기 창 — `price` 자재품목(관급 줄 포함 · ref = 키) · `job` 값 있는 공표 노임 직종 - (미확보·추정 빼고 모든 구분)(ref = 키) · 이름·규격 낱말이 모두 들어간 줄.""" + (미확보·추정 빼고 모든 구분)(ref = 키) · 낱말마다 이름·규격에 들어 있거나 키와 같은 줄.""" if kind not in _PICK: raise StoreError(404, f"없는 고르기 「{kind}」") words = [_squash(w) for w in q.split()] @@ -481,7 +481,7 @@ def pick(kind: str, q: str, limit: int) -> dict: ): continue text = _squash(f"{row.get('이름')} {row.get('규격')} {' '.join(row.get('옛이름') or [])}") - if all(w in text for w in words): + if all(w in text or w == _squash(row.get("키")) for w in words): hits.append( { "ref": str(row.get("키")), diff --git a/resources/tester/test_m01_api.py b/resources/tester/test_m01_api.py index 094462d2d..de50867eb 100644 --- a/resources/tester/test_m01_api.py +++ b/resources/tester/test_m01_api.py @@ -341,6 +341,13 @@ def test_고르기_자재품목_직종(client: TestClient) -> None: market = _get(client, "/api/m01/pick", kind="price", q="H형강 관급", limit=50) # 조달청 값이 아직 안 이어진 줄도 섞여 있음 — 이어진 줄이 하나라도 있으면 됨 assert any(i["관급"] and i["값"] > 0 for i in market["items"]) + # 키로도 찾음(찾기 칸 글 「이름 · 규격 · 코드」) · 이름 낱말 AND 는 그대로 + cement = _get(client, "/api/m01/pick", kind="price", q="시멘트 전국")["items"] + code = cement[0]["ref"] + by_code = _get(client, "/api/m01/pick", kind="price", q=code.lower())["items"] + assert [i["ref"] for i in by_code] == [code] + assert _get(client, "/api/m01/pick", kind="price", q=f"시멘트 {code}")["total"] == 1 + assert _get(client, "/api/m01/pick", kind="price", q=f"없는낱말 {code}")["total"] == 0 job = _get(client, "/api/m01/pick", kind="job", q="보통인부") assert job["items"][0]["값"] > 0 and job["items"][0]["ref"] == key_of("LB:1002") assert _get(client, "/api/m01/pick", kind="job", q="CAD설계사")["items"][0]["ref"] == key_of(