From 598adcbeb51e576b67a7b12deb02686af40ec618 Mon Sep 17 00:00:00 2001 From: gahusb Date: Mon, 6 Apr 2026 21:25:27 +0900 Subject: [PATCH] =?UTF-8?q?fix(lotto-lab):=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EC=9D=B4=EC=8A=88=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?=E2=80=94=20update=5Fpurchase=20JSON=20=EC=A7=81=EB=A0=AC?= =?UTF-8?q?=ED=99=94,=20EMA=20=ED=94=BC=EB=93=9C=EB=B0=B1=20=EB=A3=A8?= =?UTF-8?q?=ED=94=84=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - update_purchase에서 numbers/is_real 타입 변환 추가 (런타임 에러 방지) - purchase_manager에서 evolve_after_check 호출하여 EMA 피드백 루프 활성화 - checker.py 중복 recalculate_weights 호출 제거 Co-Authored-By: Claude Opus 4.6 --- backend/app/checker.py | 5 +---- backend/app/db.py | 6 ++++++ backend/app/purchase_manager.py | 9 +++++++++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/backend/app/checker.py b/backend/app/checker.py index 8067b58..9e7b9f7 100644 --- a/backend/app/checker.py +++ b/backend/app/checker.py @@ -66,10 +66,7 @@ def check_results_for_draw(drw_no: int) -> int: # ── 구매 이력 체크 연동 ────────────────────────────────────── try: from .purchase_manager import check_purchases_for_draw as _check_purchases - purchase_count = _check_purchases(drw_no) - if purchase_count > 0: - from .strategy_evolver import recalculate_weights - recalculate_weights() + _check_purchases(drw_no) # 내부에서 evolve_after_check → recalculate_weights 호출 except ImportError: pass # purchase_manager 미설치 시 무시 (하위호환) diff --git a/backend/app/db.py b/backend/app/db.py index 30d3ddb..7d01721 100644 --- a/backend/app/db.py +++ b/backend/app/db.py @@ -880,12 +880,18 @@ def get_purchases(draw_no: int = None, days: int = None, def update_purchase(purchase_id: int, data: Dict[str, Any]) -> Optional[Dict[str, Any]]: + import json as _json allowed = {"draw_no", "amount", "sets", "prize", "note", "numbers", "is_real", "source_strategy"} updates = {k: v for k, v in data.items() if k in allowed} if not updates: with _conn() as conn: row = conn.execute("SELECT * FROM purchase_history WHERE id = ?", (purchase_id,)).fetchone() return _purchase_row_to_dict(row) if row else None + # SQLite에 전달 전 타입 변환 + if "numbers" in updates: + updates["numbers"] = _json.dumps(updates["numbers"], ensure_ascii=False) + if "is_real" in updates: + updates["is_real"] = 1 if updates["is_real"] else 0 set_clause = ", ".join(f"{k} = ?" for k in updates) with _conn() as conn: cur = conn.execute( diff --git a/backend/app/purchase_manager.py b/backend/app/purchase_manager.py index 5db6dce..feec529 100644 --- a/backend/app/purchase_manager.py +++ b/backend/app/purchase_manager.py @@ -63,8 +63,10 @@ def check_purchases_for_draw(drw_no: int) -> int: "max_correct": 0, "prize_total": 0, "scores": [], + "_results": [], } agg = strategy_agg[strat] + agg["_results"].extend(results) for r in results: agg["sets_count"] += 1 agg["total_correct"] += r["correct"] @@ -86,5 +88,12 @@ def check_purchases_for_draw(drw_no: int) -> int: avg_score=round(avg_score, 4), ) + # EMA 피드백 루프: 전략 가중치 진화 + try: + from .strategy_evolver import evolve_after_check + evolve_after_check(strat, drw_no, agg["_results"]) + except Exception: + logger.debug(f"[purchase_manager] evolve_after_check 건너뜀: {strat}") + logger.info(f"[purchase_manager] {drw_no}회차 구매 {count}건 체크 완료") return count