feat: 실데이터 기반 AI 업셀링 추천 — 약국 보유 제품 목록에서 추천
- generate_upsell_real(): MSSQL 최근 30일 판매 TOP 40 제품 목록을 AI에 제공 - AI가 실제 약국 보유 제품 중에서만 선택하여 추천 - 실데이터 실패 시 기존 자유 생성(generate_upsell) fallback - 기존 generate_upsell은 그대로 보존 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1897,9 +1897,32 @@ def admin():
|
||||
# AI 업셀링 추천
|
||||
# ============================================================================
|
||||
|
||||
def _get_available_products():
|
||||
"""약국 보유 제품 목록 (최근 30일 판매 실적 기준 TOP 40)"""
|
||||
try:
|
||||
mssql_session = db_manager.get_session('PM_PRES')
|
||||
rows = mssql_session.execute(text("""
|
||||
SELECT TOP 40
|
||||
ISNULL(G.GoodsName, '') AS name,
|
||||
COUNT(*) as sales,
|
||||
MAX(G.Saleprice) as price
|
||||
FROM SALE_SUB S
|
||||
LEFT JOIN PM_DRUG.dbo.CD_GOODS G ON S.DrugCode = G.DrugCode
|
||||
WHERE S.SL_DT_appl >= CONVERT(VARCHAR(8), DATEADD(DAY, -30, GETDATE()), 112)
|
||||
AND G.GoodsName IS NOT NULL
|
||||
AND G.GoodsName NOT LIKE N'%(판매중지)%'
|
||||
GROUP BY G.GoodsName
|
||||
ORDER BY COUNT(*) DESC
|
||||
""")).fetchall()
|
||||
return [{'name': r.name, 'price': float(r.price or 0), 'sales': r.sales} for r in rows]
|
||||
except Exception as e:
|
||||
logging.warning(f"[AI추천] 보유 제품 목록 조회 실패: {e}")
|
||||
return []
|
||||
|
||||
|
||||
def _generate_upsell_recommendation(user_id, transaction_id, sale_items, user_name):
|
||||
"""키오스크 적립 후 AI 업셀링 추천 생성 (fire-and-forget)"""
|
||||
from services.clawdbot_client import generate_upsell
|
||||
from services.clawdbot_client import generate_upsell, generate_upsell_real
|
||||
|
||||
if not sale_items:
|
||||
return
|
||||
@@ -1940,9 +1963,18 @@ def _generate_upsell_recommendation(user_id, transaction_id, sale_items, user_na
|
||||
except Exception as e:
|
||||
logging.warning(f"[AI추천] 구매 이력 수집 실패 (현재 품목만 사용): {e}")
|
||||
|
||||
# Claude로 추천 생성
|
||||
logging.info(f"[AI추천] 생성 시작: user={user_name}, items={current_items}")
|
||||
rec = generate_upsell(user_name, current_items, recent_products)
|
||||
# 실데이터 기반 추천 (보유 제품 목록 제공)
|
||||
available = _get_available_products()
|
||||
rec = None
|
||||
|
||||
if available:
|
||||
logging.info(f"[AI추천] 실데이터 생성 시작: user={user_name}, items={current_items}, 보유제품={len(available)}개")
|
||||
rec = generate_upsell_real(user_name, current_items, recent_products, available)
|
||||
|
||||
# 실데이터 실패 시 기존 방식 fallback
|
||||
if not rec:
|
||||
logging.info(f"[AI추천] 자유 생성 fallback: user={user_name}")
|
||||
rec = generate_upsell(user_name, current_items, recent_products)
|
||||
|
||||
if not rec:
|
||||
logging.warning("[AI추천] 생성 실패 (AI 응답 없음)")
|
||||
|
||||
Reference in New Issue
Block a user