From c1eeede5976b5fe3ca9ed35319fdaf7dc867f621 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Thu, 24 Sep 2026 21:12:29 +0900 Subject: [PATCH] =?UTF-8?q?feat(M01):=20=EA=B8=B0=EA=B3=84=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=EC=9D=B4=20EQ=20=ED=82=A4=EB=A1=9C=20=EC=99=80?= =?UTF-8?q?=EB=8F=84=20=EC=9B=90=EB=AC=B8=20=EB=B6=84=EB=A5=98=EB=B2=88?= =?UTF-8?q?=ED=98=B8=EB=A1=9C=20=ED=92=80=EC=96=B4=20=EB=B0=9B=EC=9D=8C=20?= =?UTF-8?q?(PLAN=208-2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 고르기 목록(원문번호)과 같은 꼴로 풀어 계산 · 없는 키는 그대로 막힘 - 시험 1개 더함 Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01JgUhN55Z3BCYhUJTjwTNfj --- resources/master_data/scripts/master_formula.py | 3 ++- resources/master_data/scripts/master_pick.py | 17 +++++++++++++++-- resources/tester/test_m01_pick.py | 15 +++++++++++++++ 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/resources/master_data/scripts/master_formula.py b/resources/master_data/scripts/master_formula.py index 926396b6..8f6ac76e 100644 --- a/resources/master_data/scripts/master_formula.py +++ b/resources/master_data/scripts/master_formula.py @@ -267,7 +267,7 @@ class Master: if number in slot: self.twice.add((key[:2], number)) slot.setdefault(number, row) - mp.EQ.set(self.numbers.get("EQ", {})) # 기계 입력이 목록 밖 원문 분류번호도 받게 + mp.EQ.set(self) # 기계 입력이 목록 밖 원문 분류번호도 받게 def get(self, ref: str) -> dict: tid, _, number = ref.partition(":") @@ -503,6 +503,7 @@ def _inputs(row: dict, given: dict) -> dict: pass if isinstance(value, (int, float)): value = Decimal(str(value)) + value = mp.resolve(spec, value) # 기계 EQ 키 → 원문 분류번호 if "고르기" in spec and value not in spec["고르기"] and not mp.machine(spec, value): raise FormulaError(f"입력 「{name}」={value} 고르기 밖") if "범위" in spec: diff --git a/resources/master_data/scripts/master_pick.py b/resources/master_data/scripts/master_pick.py index f3f28ebf..185943f9 100644 --- a/resources/master_data/scripts/master_pick.py +++ b/resources/master_data/scripts/master_pick.py @@ -27,7 +27,7 @@ REGIONS = ( ).split() CHOSEN: ContextVar[dict | None] = ContextVar("고름", default=None) # {호표 줄 차례(0부터): 자재 키} -EQ: ContextVar[dict | None] = ContextVar("기계번호", default=None) # 기계 마스터 {원문번호: 줄} +EQ: ContextVar = ContextVar("기계번호", default=None) # 지금 쓰는 마스터 — 기계 줄을 찾음 @contextmanager @@ -40,9 +40,22 @@ def choosing(picks: dict | None): CHOSEN.reset(token) +def _numbers() -> dict: + return EQ.get().numbers.get("EQ", {}) if EQ.get() else {} + + +def resolve(spec: dict, value): + """기계 입력이 EQ 키로 오면 원문 분류번호로 풂 — 고르기 목록(원문번호)과 같은 꼴.""" + if not (isinstance(value, str) and value.strip()[:2] == "EQ" and EQ.get()): + return value + row = EQ.get().index.get("EQ", {}).get(value.strip()) + number = str(row.get("원문번호") or "") if row else "" + return number if number and machine(spec, number) else value + + def machine(spec: dict, value) -> bool: """기계 입력 — 고르기 목록 밖 원문 분류번호도 기계 마스터에 있으면 받음.""" - known = EQ.get() or {} + known = _numbers() picks = spec.get("고르기") or [] return bool(picks) and str(value).strip() in known and all(str(o) in known for o in picks) diff --git a/resources/tester/test_m01_pick.py b/resources/tester/test_m01_pick.py index 1e6215da..f911987b 100644 --- a/resources/tester/test_m01_pick.py +++ b/resources/tester/test_m01_pick.py @@ -112,3 +112,18 @@ def test_check_master_검색어_후보0_단위경고(client) -> None: assert "후보 0" in mf.check_pick(whole, "줄", {"검색어": "없는물건zzz"})[0] assert mf.check_unit(whole, "줄", {"검색어": "어닐링철선 서울 4.0mm"}, "kg") == [] assert "성격이 다름" in mf.check_unit(whole, "줄", {"검색어": "어닐링철선 서울 4.0mm"}, "m")[0] + + +def test_기계_입력은_EQ_키도_원문번호로_풀어_받음(client) -> None: + key = "GC000267" + number = "0101-0007" # 고르기 목록 밖 + eq = next(k for k, r in store.loaded()[1].index["EQ"].items() if r.get("원문번호") == number) + base = {**store.auto(key)["값"]} + by_number = client.post( + "/api/m01/calc", json={"key": key, "inputs": {**base, "기계": number}} + ).json() + by_key = client.post("/api/m01/calc", json={"key": key, "inputs": {**base, "기계": eq}}).json() + assert by_key["ok"] is True, by_key + assert by_key["sums"] == by_number["sums"] # EQ 키 = 원문번호와 같은 계산 + bad = client.post("/api/m01/calc", json={"key": key, "inputs": {**base, "기계": "EQ999999"}}) + assert bad.json()["ok"] is False