feat(animal-chat): APC 코드 2024년 체계 지원 및 피부약 2단계 추천

## APC 코드 체계 확장
- 기존: 023%만 검색 (~2023년 제품만)
- 변경: 02% OR 92% + 13자리 검증
  - 02%: 2023년 이전 item_seq (9자리) 기반 APC
  - 92%: 2024년 이후 item_seq (10자리) 기반 APC
- 999% 등 청구프로그램 임의코드는 제외

## 동물약 챗봇 피부약 추천 개선
- 피부약 2단계 추천 구조 추가
  - 1차(치료): 의약품 (개시딘겔, 테르비덤 등)
  - 2차(보조케어): 의약외품 (스킨카솔 - 회복기 피부보호)
- 스킨카솔은 의약외품임을 명시하여 치료제로 오인 방지

## 기타
- RAG 테스트 스크립트 추가
- 수인약품 API 문서화
This commit is contained in:
thug0bin
2026-03-11 14:17:04 +09:00
parent e470deaefc
commit 83ecf88bd4
21 changed files with 724 additions and 76 deletions

View File

@@ -2966,7 +2966,11 @@ ANIMAL_CHAT_SYSTEM_PROMPT = """당신은 약국의 동물약 전문 상담사입
**💊 업셀링 규칙 (중요!):**
- **항생제 질문 시**: "항생제 복용 중에는 장 건강을 위해 정장제(유산균)를 함께 급여하면 좋아요!"라고 안내하고, 제스타제 같은 정장제도 함께 추천
- **구충제 질문 시**: 정기적인 예방 일정 안내
- **피부약 질문 시**: 샴푸/케어 제품 언급 가능
- **피부약 질문 시**: 2단계 추천 구조 적용
- 🔹 **1차 추천(치료)**: 증상에 맞는 의약품 (개시딘겔-세균성피부염, 테르비덤-진균감염 등)
- 🔹 **2차 언급(보조케어)**: "염증이 가라앉은 후 회복기에는 스킨카솔 같은 피부케어 제품(의약외품)도 도움이 됩니다"
- ⚠️ 스킨카솔은 **의약외품**이므로 염증 "치료"용으로 추천하지 말 것! 피부 재생/보호/보습 목적으로만 언급
- 긁힘, 작은 상처, 피부 건조, 털빠짐 예방 → 스킨카솔 단독 추천 가능
**질문 유형별 응답:**
@@ -3062,7 +3066,7 @@ def _get_animal_drugs():
"""보유 중인 동물약 목록 조회 (APC 이미지 포함)
APC 우선순위:
1. CD_ITEM_UNIT_MEMBER에서 023%로 시작하는 APC 코드
1. CD_ITEM_UNIT_MEMBER에서 APC 코드 (0xx: ~2023년, 9xx: 2024년~)
2. 없으면 기존 BARCODE를 PostgreSQL에서 조회 (바코드=APC인 경우)
"""
try:
@@ -3079,7 +3083,8 @@ def _get_animal_drugs():
SELECT TOP 1 U.CD_CD_BARCODE
FROM CD_ITEM_UNIT_MEMBER U
WHERE U.DRUGCODE = G.DrugCode
AND U.CD_CD_BARCODE LIKE '023%'
AND (U.CD_CD_BARCODE LIKE '02%' OR U.CD_CD_BARCODE LIKE '92%')
AND LEN(U.CD_CD_BARCODE) = 13
ORDER BY U.CHANGE_DATE DESC
) AS APC_CODE
FROM CD_GOODS G
@@ -3680,7 +3685,9 @@ def api_products():
apc_result = drug_session.execute(text("""
SELECT TOP 1 CD_CD_BARCODE
FROM CD_ITEM_UNIT_MEMBER
WHERE DRUGCODE = :drug_code AND CD_CD_BARCODE LIKE '023%'
WHERE DRUGCODE = :drug_code
AND (CD_CD_BARCODE LIKE '02%' OR CD_CD_BARCODE LIKE '92%')
AND LEN(CD_CD_BARCODE) = 13
"""), {'drug_code': row.drug_code})
apc_row = apc_result.fetchone()
if apc_row: